diff --git a/README.md b/README.md index 3e2c7b9f..8c842078 100755 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ FeedCrawler automatisiert bequem das Hinzufügen von Links für den JDownloader. ### Voraussetzungen * [Python 3.8](https://www.python.org/downloads/) oder neuer (nur - 4 [externe Abhängigkeiten](https://github.com/rix1337/FeedCrawler/blob/main/requirements.txt)!) + 5 [externe Abhängigkeiten](https://github.com/rix1337/FeedCrawler/blob/main/requirements.txt)!) * [JDownloader 2](http://www.jdownloader.org/jdownloader2) mit aktivem [My JDownloader-Konto](https://my.jdownloader.org) * _optional: [FlareSolverr 3](https://github.com/FlareSolverr/FlareSolverr) um Cloudflare-Blockaden zu umgehen_ diff --git a/feedcrawler/external_sites/captcha/__init__.py b/feedcrawler/external_sites/captcha/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/feedcrawler/external_sites/captcha/filecrypt.py b/feedcrawler/external_sites/captcha/filecrypt.py new file mode 100644 index 00000000..a29380da --- /dev/null +++ b/feedcrawler/external_sites/captcha/filecrypt.py @@ -0,0 +1,285 @@ +# -*- coding: utf-8 -*- +# FeedCrawler +# Project by https://github.com/rix1337 + +import base64 +import json +import random +import re +import xml.dom.minidom +from urllib.parse import urlparse + +import dukpy +from Cryptodome.Cipher import AES +from bs4 import BeautifulSoup + +from feedcrawler.providers.http_requests.request_handler import request, Session + + +class CNL: + def __init__(self, crypted_data): + self.crypted_data = crypted_data + + def jk_eval(self, f_def): + js_code = f""" + {f_def} + f(); + """ + + result = dukpy.evaljs(js_code).strip() + + return result + + def aes_decrypt(self, data, key): + try: + encrypted_data = base64.b64decode(data) + except Exception as e: + raise ValueError("Failed to decode base64 data") from e + + try: + key_bytes = bytes.fromhex(key) + except Exception as e: + raise ValueError("Failed to convert key to bytes") from e + + iv = key_bytes + cipher = AES.new(key_bytes, AES.MODE_CBC, iv) + + try: + decrypted_data = cipher.decrypt(encrypted_data) + except ValueError as e: + raise ValueError("Decryption failed") from e + + try: + return decrypted_data.decode('utf-8').replace('\x00', '').replace('\x08', '') + except UnicodeDecodeError as e: + raise ValueError("Failed to decode decrypted data") from e + + def decrypt(self): + crypted = self.crypted_data[2] + jk = "function f(){ return \'" + self.crypted_data[1] + "';}" + key = self.jk_eval(jk) + uncrypted = self.aes_decrypt(crypted, key) + urls = [result for result in uncrypted.split("\r\n") if len(result) > 0] + + return urls + + +class DLC: + def __init__(self, dlc_file): + global user_agent + self.data = dlc_file + self.KEY = b"cb99b5cbc24db398" + self.IV = b"9bc24cb995cb8db3" + self.API_URL = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=" + + def parse_packages(self, start_node): + return [ + ( + base64.b64decode(node.getAttribute("name")).decode("utf-8"), + self.parse_links(node) + ) + for node in start_node.getElementsByTagName("package") + ] + + def parse_links(self, start_node): + return [ + base64.b64decode(node.getElementsByTagName("url")[0].firstChild.data).decode("utf-8") + for node in start_node.getElementsByTagName("file") + ] + + def decrypt(self): + if not isinstance(self.data, bytes): + raise TypeError("data must be bytes.") + + all_urls = [] + + try: + data = self.data.strip() + + data += b"=" * (-len(data) % 4) + + dlc_key = data[-88:].decode("utf-8") + dlc_data = base64.b64decode(data[:-88]) + dlc_content = request(self.API_URL + dlc_key).text + + rc = base64.b64decode(re.search(r"(.+)", dlc_content, re.S).group(1))[:16] + + cipher = AES.new(self.KEY, AES.MODE_CBC, self.IV) + key = iv = cipher.decrypt(rc) + + cipher = AES.new(key, AES.MODE_CBC, iv) + xml_data = base64.b64decode(cipher.decrypt(dlc_data)).decode("utf-8") + + root = xml.dom.minidom.parseString(xml_data).documentElement + content_node = root.getElementsByTagName("content")[0] + + packages = self.parse_packages(content_node) + + for package in packages: + urls = package[1] + all_urls.extend(urls) + + except Exception as e: + print("DLC Error: " + str(e)) + return None + + return all_urls + + +def get_filecrypt_links(shared_state, token, title, url, password=None): + shared_state.logger.debug("Attempting to decrypt Filecrypt link: " + url) + session = Session() + + password_field = None + if password: + try: + output = session.get(url, headers={'User-Agent': shared_state.values["user_agent"]}) + soup = BeautifulSoup(output.text, 'html.parser') + input_element = soup.find('input', placeholder=lambda value: value and 'password' in value.lower()) + password_field = input_element['name'] + shared_state.logger.debug("Password field name identified: " + password_field) + url = output.url + except: + shared_state.logger.debug("No password field found. Skipping password entry!") + + if password and password_field: + shared_state.logger.debug("Using Password: " + password) + output = session.post(url, data=password_field + "=" + password, + headers={'User-Agent': shared_state.values["user_agent"], + 'Content-Type': 'application/x-www-form-urlencoded'}) + else: + output = session.get(url, headers={'User-Agent': shared_state.values["user_agent"]}) + + url = output.url + soup = BeautifulSoup(output.text, 'html.parser') + if bool(soup.findAll("input", {"id": "p4assw0rt"})): + shared_state.logger.debug(f"Password was wrong or missing. Could not get links for {title}") + return False + + no_captcha_present = bool(soup.find("form", {"class": "cnlform"})) + if no_captcha_present: + shared_state.logger.debug("No CAPTCHA present. Skipping token!") + else: + circle_captcha = bool(soup.findAll("div", {"class": "circle_captcha"})) + i = 0 + while circle_captcha and i < 3: + shared_state.logger.debug("Sending Fake solution to skip Circle-CAPTCHA...") + random_x = str(random.randint(100, 200)) + random_y = str(random.randint(100, 200)) + output = session.post(url, data="buttonx.x=" + random_x + "&buttonx.y=" + random_y, + headers={'User-Agent': shared_state.values["user_agent"], + 'Content-Type': 'application/x-www-form-urlencoded'}) + url = output.url + soup = BeautifulSoup(output.text, 'html.parser') + circle_captcha = bool(soup.findAll("div", {"class": "circle_captcha"})) + + output = session.post(url, data="cap_token=" + token, headers={'User-Agent': shared_state.values["user_agent"], + 'Content-Type': 'application/x-www-form-urlencoded'}) + url = output.url + soup = BeautifulSoup(output.text, 'html.parser') + + solved = bool(soup.findAll("div", {"class": "container"})) + if not solved: + shared_state.logger.debug(f"Filecrypt did did not accept the token! Could not get links for {title}") + return False + else: + season_number = "" + episode_number = "" + episode_in_title = re.findall(r'.*\.s(\d{1,3})e(\d{1,3})\..*', title, re.IGNORECASE) + season_in_title = re.findall(r'.*\.s(\d{1,3})\..*', title, re.IGNORECASE) + if episode_in_title: + try: + season_number = str(int(episode_in_title[0][0])) + episode_number = str(int(episode_in_title[0][1])) + except: + pass + elif season_in_title: + try: + season_number = str(int(season_in_title[0])) + except: + pass + + season = "" + episode = "" + tv_show_selector = soup.find("div", {"class": "dlpart"}) + if tv_show_selector: + + season = "season=" + episode = "episode=" + + season_selection = soup.find("div", {"id": "selbox_season"}) + try: + if season_selection: + season += str(season_number) + except: + pass + + episode_selection = soup.find("div", {"id": "selbox_episode"}) + try: + if episode_selection: + episode += str(episode_number) + except: + pass + + links = [] + + mirrors = [] + mirrors_available = soup.select("a[href*=mirror]") + if mirrors_available: + for mirror in mirrors_available: + try: + mirror_query = mirror.get("href").split("?")[1] + base_url = url.split("?")[0] if "mirror" in url else url + mirrors.append(f"{base_url}?{mirror_query}") + except IndexError: + continue + else: + mirrors = [url] + + for mirror in mirrors: + if not len(mirrors) == 1: + output = session.get(mirror, headers={'User-Agent': shared_state.values["user_agent"]}) + url = output.url + soup = BeautifulSoup(output.text, 'html.parser') + + try: + crypted_payload = soup.find("form", {"class": "cnlform"}).get('onsubmit') + crypted_data = re.findall(r"'(.*?)'", crypted_payload) + if not title: + title = crypted_data[3] + crypted_data = [ + crypted_data[0], + crypted_data[1], + crypted_data[2], + title + ] + if episode and season: + domain = urlparse(url).netloc + filtered_cnl_secret = soup.find("input", {"name": "hidden_cnl_id"}).attrs["value"] + filtered_cnl_link = f"https://{domain}/_CNL/{filtered_cnl_secret}.html?{season}&{episode}" + filtered_cnl_result = session.post(filtered_cnl_link, + headers={'User-Agent': shared_state.values["user_agent"]}) + if filtered_cnl_result.status_code == 200: + filtered_cnl_data = json.loads(filtered_cnl_result.text) + if filtered_cnl_data["success"]: + crypted_data = [ + crypted_data[0], + filtered_cnl_data["data"][0], + filtered_cnl_data["data"][1], + title + ] + links.extend(CNL(crypted_data).decrypt()) + except: + shared_state.logger.debug("Click'n'Load not found! Falling back to DLC...") + crypted_payload = soup.find("button", {"class": "dlcdownload"}).get("onclick") + crypted_data = re.findall(r"'(.*?)'", crypted_payload) + dlc_secret = crypted_data[0] + domain = urlparse(url).netloc + if episode and season: + dlc_link = f"https://{domain}/DLC/{dlc_secret}.dlc?{episode}&{season}" + else: + dlc_link = f"https://{domain}/DLC/{dlc_secret}.dlc" + dlc_file = session.get(dlc_link, headers={'User-Agent': shared_state.values["user_agent"]}).content + links.extend(DLC(dlc_file).decrypt()) + + return links diff --git a/feedcrawler/providers/http_requests/request_handler.py b/feedcrawler/providers/http_requests/request_handler.py index 45858757..7ddb944a 100644 --- a/feedcrawler/providers/http_requests/request_handler.py +++ b/feedcrawler/providers/http_requests/request_handler.py @@ -242,3 +242,56 @@ def create_ipv4_socket(address, timeout=None, source_address=None): resp_url = url return Response(req, content, text, json, status_code, resp_url, headers, cookiejar) + + +class Session: + def __init__(self): + # Create a single CookieJar to manage session cookies + self.cookiejar = CookieJar() + # Shared headers for all requests + self.headers = {} + + def request(self, url, method="GET", **kwargs): + """ + Make a request while persisting cookies and printing cookie operations. + """ + # Merge session headers with request-specific headers + kwargs["headers"] = {**self.headers, **kwargs.get("headers", {})} + + # Provide the persistent CookieJar to the request + kwargs["cookiejar"] = self.cookiejar + + # Perform the HTTP request + response = request(url, method=method, **kwargs) + + # Persist cookies from the response into the shared CookieJar + if response.cookiejar: + for cookie in response.cookiejar: + self.cookiejar.set_cookie(cookie) + + return response + + def get(self, url, **kwargs): + """ + Convenience method for GET requests. + """ + return self.request(url, method="GET", **kwargs) + + def post(self, url, **kwargs): + """ + Convenience method for POST requests. + """ + return self.request(url, method="POST", **kwargs) + + def update_headers(self, headers): + """ + Update shared headers for all requests in this session. + """ + self.headers.update(headers) + + def clear_cookies(self): + """ + Clear all cookies stored in the session. + """ + self.cookiejar.clear() + print("All session cookies cleared.") diff --git a/feedcrawler/providers/myjd_connection.py b/feedcrawler/providers/myjd_connection.py index d2485e65..1b2f4204 100644 --- a/feedcrawler/providers/myjd_connection.py +++ b/feedcrawler/providers/myjd_connection.py @@ -931,27 +931,6 @@ def do_package_merge(title, uuids, linkids): return False -def download_decrypted_links_from_cnl(title, password, cnl_packages): - linkids = [] - uuids = [] - urls = "" - for cnl_package in cnl_packages: - for linkid in cnl_package['linkids']: - linkids.append(linkid) - uuids.append(cnl_package['uuid']) - urls = urls + ensure_string(cnl_package['urls']).replace("\n\n", "\n") - - links = ensure_string(urls).replace("\n\n", "\n") - if remove_from_linkgrabber(linkids, uuids): - if download(title, "FeedCrawler", links, password): - episode = re.findall(r'.*\.S\d{1,3}E(\d{1,3})\..*', title) - if episode: - FeedDb('episode_remover').store(title, str(int(episode[0]))) - print("[Click'n'Load-Automatik erfolgreich] - " + title) - return [True, title] - return False - - def add_for_manual_decryption(title, link, password, replace=False): try: if check_is_site(link): diff --git a/feedcrawler/providers/shared_state.py b/feedcrawler/providers/shared_state.py index 8b636784..b7ffbb14 100644 --- a/feedcrawler/providers/shared_state.py +++ b/feedcrawler/providers/shared_state.py @@ -82,7 +82,6 @@ def set_logger(): logger.addHandler(console) if log_level == 10: - print("DEBUG Modus aktiviert. DEBUG-Log wird in 'FeedCrawler_DEBUG.log' gespeichert.") logfile_debug = logging.handlers.RotatingFileHandler(values["log_file_debug"]) logfile_debug.setFormatter(formatter) logfile_debug.setLevel(10) @@ -161,6 +160,27 @@ def get_device(): return values["device"] +def set_device_from_config(): + config = CrawlerConfig('FeedCrawler') + myjd_user = str(config.get('myjd_user')) + myjd_pass = str(config.get('myjd_pass')) + myjd_device = str(config.get('myjd_device')) + + update("device", myjd_device) + + jd = Myjdapi() + jd.set_app_key('FeedCrawler') + + if myjd_user and myjd_pass and myjd_device: + try: + jd.connect(myjd_user, myjd_pass) + jd.update_devices() + return jd.get_device(myjd_device) + except (TokenExpiredException, RequestTimeoutException, MYJDException): + pass + return False + + def set_connection_info(local_address, port, prefix): update("local_address", local_address) update("port", port) diff --git a/feedcrawler/providers/version.py b/feedcrawler/providers/version.py index b41e3aac..eb30f7c8 100644 --- a/feedcrawler/providers/version.py +++ b/feedcrawler/providers/version.py @@ -8,7 +8,7 @@ def get_version(): - return "20.1.9" + return "21.0.0" def create_version_file(): diff --git a/feedcrawler/run.py b/feedcrawler/run.py index b8f76987..dbe84158 100644 --- a/feedcrawler/run.py +++ b/feedcrawler/run.py @@ -104,24 +104,9 @@ def main(): else: myjd_config(port, local_address, shared_state) - shared_state.set_device(device) - connection_established = shared_state.get_device() and shared_state.get_device().name - if not connection_established: - i = 0 - while i < 10: - i += 1 - print(f'Verbindungsversuch {i} mit My JDownloader gescheitert. Gerätename: "{device}"') - time.sleep(60) - set_device_from_config() - connection_established = shared_state.get_device() and shared_state.get_device().name - if connection_established: - break - - if connection_established: - print(f'Erfolgreich mit My JDownloader verbunden. Gerätename: "{shared_state.get_device().name}"') - else: - print('My JDownloader Zugangsversuche nicht erfolgreich! Beende FeedCrawler!') - sys.exit(1) + process_jdownloader = multiprocessing.Process(target=jdownloader_connection, + args=(shared_state_dict, shared_state_lock)) + process_jdownloader.start() feedcrawler = CrawlerConfig('FeedCrawler') if not os.environ.get('DOCKER') and not arguments.port: @@ -160,6 +145,7 @@ def main(): gui.main_gui(window, shared_state_dict, shared_state_lock) sys.stdout = sys.__stdout__ + process_jdownloader.terminate() process_web_server.terminate() process_feed_crawler.terminate() process_watch_packages.terminate() @@ -167,6 +153,7 @@ def main(): else: # regular console def signal_handler(sig, frame): + process_jdownloader.terminate() process_web_server.terminate() process_feed_crawler.terminate() process_watch_packages.terminate() @@ -186,5 +173,28 @@ def signal_handler(sig, frame): sys.exit(0) +def jdownloader_connection(shared_state_dict, shared_state_lock): + shared_state.set_state(shared_state_dict, shared_state_lock) + + shared_state.set_device_from_config() + connection_established = shared_state.get_device() and shared_state.get_device().name + if not connection_established: + i = 0 + while i < 10: + i += 1 + print(f'Verbindungsversuch {i} mit My JDownloader gescheitert. Gerätename: "{device}"') + time.sleep(60) + set_device_from_config() + connection_established = shared_state.get_device() and shared_state.get_device().name + if connection_established: + break + + if connection_established: + print(f'Erfolgreich mit My JDownloader verbunden. Gerätename: "{shared_state.get_device().name}"') + else: + print('My JDownloader Zugangsversuche nicht erfolgreich! Beende FeedCrawler!') + sys.exit(1) + + if __name__ == "__main__": main() diff --git a/feedcrawler/web_interface/serve/api.py b/feedcrawler/web_interface/serve/api.py index 7ad11f42..32ea9fca 100644 --- a/feedcrawler/web_interface/serve/api.py +++ b/feedcrawler/web_interface/serve/api.py @@ -14,6 +14,8 @@ from urllib import parse from xml.etree import ElementTree +from feedcrawler.providers.http_requests.request_handler import request as internal_request + if sys.stdout is None or sys.stderr is None: # required to allow pyinstaller --noconsole to work with bottle from io import StringIO @@ -22,7 +24,7 @@ from Cryptodome.Protocol.KDF import scrypt from Cryptodome.Random import get_random_bytes -from bottle import Bottle, request, HTTPError, static_file, redirect, abort +from bottle import Bottle, request, response, HTTPError, static_file, redirect, abort from bs4 import BeautifulSoup import feedcrawler.external_sites @@ -37,13 +39,12 @@ from feedcrawler.providers.config import CrawlerConfig from feedcrawler.providers.myjd_connection import set_device, get_info, set_device_from_config, get_state, \ set_enabled, move_to_downloads, remove_from_linkgrabber, reset_in_downloads, retry_decrypt, jdownloader_start, \ - jdownloader_pause, jdownloader_stop, jdownloader_update, download_decrypted_links_from_cnl, \ - get_packages_in_linkgrabber, download + jdownloader_pause, jdownloader_stop, jdownloader_update, get_packages_in_linkgrabber, download from feedcrawler.providers.notifications import notify from feedcrawler.providers.sqlite_database import FeedDb, ListDb from feedcrawler.providers.url_functions import get_url_headers, post_url_headers, get_url from feedcrawler.web_interface.serve.server import Server -from feedcrawler.web_interface.serve import tampermonkey_scripts +from feedcrawler.external_sites.captcha.filecrypt import get_filecrypt_links helper_active = False already_added = [] @@ -158,11 +159,11 @@ def redirect_without_trailing_slash(): "/api/myjd_reset/", "/api/myjd_retry/", "/api/myjd_pause/", - "/api/internal_cnl/", "/sponsors_helper/api/to_decrypt/", "/sponsors_helper/api/to_decrypt_disable/", "/sponsors_helper/replace_decrypt/", - "/sponsors_helper/to_download/" + "/sponsors_helper/to_download/", + "/captcha/" ] if not request.path.endswith('/') and not any(s in request.path for s in no_trailing_slash): raise redirect(request.url + '/') @@ -1223,65 +1224,6 @@ def myjd_update(): pass return abort(400, "Failed") - @app.post(prefix + "/api/internal_cnl/&") - @auth_basic(is_authenticated_user) - def internal_cnl(name, password): - try: - packages = get_info() - if packages: - decrypted_packages = packages[4][1] - offline_packages = packages[4][2] - else: - decrypted_packages = False - offline_packages = False - - known_packages = [] - if decrypted_packages: - for dp in decrypted_packages: - known_packages.append(dp['uuid']) - if offline_packages: - for op in offline_packages: - known_packages.append(op['uuid']) - - cnl_packages = [] - grabber_was_collecting = False - i = 12 - while i > 0: - i -= 1 - time.sleep(5) - packages = get_info() - if packages: - grabber_collecting = packages[2] - if grabber_was_collecting or grabber_collecting: - grabber_was_collecting = grabber_collecting - i -= 1 - time.sleep(5) - else: - if not grabber_collecting: - decrypted_packages = packages[4][1] - offline_packages = packages[4][2] - if not grabber_collecting and decrypted_packages: - for dp in decrypted_packages: - if dp['uuid'] not in known_packages: - cnl_packages.append(dp) - i = 0 - if not grabber_collecting and offline_packages: - for op in offline_packages: - if op['uuid'] not in known_packages: - cnl_packages.append(op) - i = 0 - - if not cnl_packages: - return abort(504, "No Package added through Click'n'Load in time!") - - if download_decrypted_links_from_cnl(name, password, cnl_packages): - remove_decrypt(name) - remove_decrypt(name, disabled=True) - return "Success" - except: - pass - return abort(400, "Failed") - @app.get(prefix + "/api/lists/") @auth_basic(is_authenticated_user) def get_lists(): @@ -1353,55 +1295,6 @@ def post_lists(): except: return abort(400, "Failed") - @app.get(prefix + "/tampermonkey/feedcrawler_helper_sj.user.js") - @auth_basic(is_authenticated_user) - def feedcrawler_helper_sj(): - try: - hostnames = CrawlerConfig('Hostnames') - sj = hostnames.get('sj') - dj = hostnames.get('dj') - return tampermonkey_scripts.get_feedcrawler_helper_sj(sj, dj) - except: - return abort(400, "Failed") - - @app.get(prefix + "/tampermonkey/feedcrawler_sponsors_helper_sj.user.js") - @auth_basic(is_authenticated_user) - def feedcrawler_sponsors_helper_sj(): - if not helper_active: - redirect_sponsors() - try: - hostnames = CrawlerConfig('Hostnames') - sj = hostnames.get('sj') - dj = hostnames.get('dj') - return tampermonkey_scripts.get_feedcrawler_sponsors_helper_sj(sj, dj, shared_state.values["local_address"]) - except: - return abort(400, "Failed") - - @app.get(prefix + "/tampermonkey/feedcrawler_sponsors_helper_fc.user.js") - @auth_basic(is_authenticated_user) - def feedcrawler_sponsors_helper_fc(): - if not helper_active: - redirect_sponsors() - try: - hostnames = CrawlerConfig('Hostnames') - fx = hostnames.get('fx') - sf = hostnames.get('sf') - return tampermonkey_scripts.get_feedcrawler_sponsors_helper_fc(fx, sf, shared_state.values["local_address"]) - except: - return abort(400, "Failed") - - @app.get(prefix + "/tampermonkey/feedcrawler_sponsors_helper_nx.user.js") - @auth_basic(is_authenticated_user) - def feedcrawler_sponsors_helper_nx(): - if not helper_active: - redirect_sponsors() - try: - hostnames = CrawlerConfig('Hostnames') - nx = hostnames.get('nx') - return tampermonkey_scripts.get_feedcrawler_sponsors_helper_nx(nx, shared_state.values["local_address"]) - except: - return abort(400, "Failed") - @app.get(prefix + "/sponsors_helper/api/to_decrypt/") def to_decrypt_api(): global helper_active @@ -1734,4 +1627,93 @@ def to_download(): abort(400, f"Download attempt failed for payload: {payload}") return abort(400, "Request failed for unknown reason") + obfuscated_captcha_url = decode_base64('aHR0cHM6Ly92Mi5jdXRjYXB0Y2hhLm5ldA==') + + @app.post(prefix + "/api/captcha_token/") + def captcha_token(): + try: + data = request.body.read().decode("utf-8") + except: + abort(400, "Could not get data from request body") + try: + payload = json.loads(data) + token = payload["token"] + title = payload["title"] + link = clean_links(payload["link"]) + password = payload["password"] + decrypted_links = get_filecrypt_links(shared_state, token, title, link, password) + success = len(decrypted_links) > 0 + if success: + if attempt_download(title, decrypted_links, password, []): + return f"CAPTCHA solved successfully! Decrypted {decrypted_links} links for {title}" + else: + abort(400, f"Starting Download failed for {title} using {decrypted_links} links.") + abort(400, f"CAPTCHA solving failed for {title} using token {token}.") + except: + abort(400, f"CAPTCHA solving failed for payload: {payload}") + + @app.post(prefix + '/captcha/.html') + def proxy(captcha_id): + target_url = f"{obfuscated_captcha_url}/captcha/{captcha_id}.html" + + headers = {key: value for key, value in request.headers.items() if key != 'Host'} + data = request.body.read() + resp = internal_request(target_url, method='POST', headers=headers, data=data.decode("utf-8")) + + content = resp.text + content = re.sub(r'', + f'', content) + response.content_type = 'text/html' + return content + + @app.post(prefix + '/captcha/.json') + def specific_proxy(captcha_id): + target_url = f"{obfuscated_captcha_url}/captcha/{captcha_id}.json" + + headers = {key: value for key, value in request.headers.items() if key != 'Host'} + data = request.body.read() + resp = internal_request(target_url, method='POST', headers=headers, data=data.decode("utf-8")) + + response.content_type = "application/json; charset=utf-8" + return resp.content + + @app.get(prefix + '/captcha///') + def captcha_proxy(captcha_id, uuid, filename): + new_url = f"{obfuscated_captcha_url}/captcha/{captcha_id}/{uuid}/{filename}" + + try: + external_response = internal_request(new_url, method="GET") + + if external_response.status_code >= 400: + raise Exception( + f"Request failed with status code {external_response.status_code}: {external_response.text}") + + response.content_type = 'image/png' + response.headers['Content-Disposition'] = f'inline; filename="{filename}"' + + def generate_chunks(chunk_size=8192): + content = external_response.content + for i in range(0, len(content), chunk_size): + yield content[i:i + chunk_size] + + return generate_chunks() + + except Exception as e: + response.status = 502 + return f"Error fetching resource: {e}" + + @app.post(prefix + '/captcha//check') + def captcha_check_proxy(captcha_id): + new_url = f"{obfuscated_captcha_url}/captcha/{captcha_id}/check" + headers = {key: value for key, value in request.headers.items()} + + data = request.body.read() + resp = internal_request(new_url, method='POST', headers=headers, data=data.decode("utf-8")) + + response.status = resp.status_code + for header in resp.headers: + if header.lower() not in ['content-encoding', 'transfer-encoding', 'content-length', 'connection']: + response.set_header(header, resp.headers[header]) + return resp.text + Server(app, listen='0.0.0.0', port=shared_state.values["port"]).serve_forever() diff --git a/feedcrawler/web_interface/serve/tampermonkey_scripts.py b/feedcrawler/web_interface/serve/tampermonkey_scripts.py deleted file mode 100644 index 1c92c8f1..00000000 --- a/feedcrawler/web_interface/serve/tampermonkey_scripts.py +++ /dev/null @@ -1,309 +0,0 @@ -# -*- coding: utf-8 -*- -# FeedCrawler -# Projekt von https://github.com/rix1337 -# Dieses Modul stellt Tampermonkey-Scripte für die API des FeedCrawlers bereit. - -def get_feedcrawler_helper_sj(sj, dj): - return f"""// ==UserScript== - // @name FeedCrawler Helper (SJ/DJ) - // @author rix1337 - // @description Forwards decrypted SJ/DJ Download links to FeedCrawler - // @version 0.3.0 - // @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js - // @match https://{sj}/* - // @match https://{dj}/* - // @exclude https://{sj}/serie/search?q=* - // @exclude https://{dj}/serie/search?q=* - // ==/UserScript== - - document.body.addEventListener('mousedown', function (e) {{ - if (e.target.tagName != "A") return; - var anchor = e.target; - if (anchor.href.search(new RegExp('{sj}/serie//i')) != -1) {{ - anchor.href = anchor.href + '#' + anchor.text; - }} else if (anchor.href.search(new RegExp('{dj}/serie//i')) != -1) {{ - anchor.href = anchor.href + '#' + anchor.text; - }} - }}); - - var tag = window.location.hash.replace("#", "").split('|'); - var title = tag[0]; - var password = tag[1]; - if (title) {{ - $('.wrapper').prepend('

[FeedCrawler Helper] ' + title + '

'); - $(".container").hide(); - var checkExist = setInterval(async function () {{ - if ($("tr:contains('" + title + "')").length) {{ - $(".container").show(); - $("tr:contains('" + title + "')")[0].lastChild.firstChild.click(); - clearInterval(checkExist); - }} - }}, 100); - }}""" - - -def get_feedcrawler_sponsors_helper_sj(sj, dj, local_address): - return f"""// ==UserScript== - // @name FeedCrawler Sponsors Helper (SJ/DJ) - // @version 0.5.2 - // @description Clicks the correct download button on SJ/DJ sub pages to speed up Click'n'Load - // @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js - // @match https://{sj}/* - // @match https://{dj}/* - // @exclude https://{sj}/serie/search?q=* - // @exclude https://{dj}/serie/search?q=* - // @grant window.close - // ==/UserScript== - - // Hier muss die von außen erreichbare Adresse des FeedCrawlers stehen (nicht bspw. die Docker-interne): - const sponsorsURL = '{local_address}'; - // Hier kann ein Wunschhoster eingetragen werden (ohne www. und .tld): - const sponsorsHoster = ''; - - $.extend($.expr[':'], {{ - 'containsi': function(elem, i, match, array) {{ - return (elem.textContent || elem.innerText || '').toLowerCase() - .indexOf((match[3] || "").toLowerCase()) >= 0; - }} - }}); - - document.body.addEventListener('mousedown', function (e) {{ - if (e.target.tagName != "A") return; - var anchor = e.target; - if (anchor.href.search(new RegExp('{sj}/serie//i')) != -1) {{ - anchor.href = anchor.href + '#' + anchor.text; - }} else if (anchor.href.search(new RegExp('{dj}/serie//i')) != -1) {{ - anchor.href = anchor.href + '#' + anchor.text; - }} - }}); - - const tag = window.location.hash.replace("#", "").split('|'); - const title = tag[0]; - const password = tag[1]; - if (title && title !== "login") {{ - $('.wrapper').prepend('

[FeedCrawler Sponsors Helper] ' + title + '

'); - $(".container").hide(); - let i = 0; - const checkExist = setInterval(function () {{ - i++; - if ($("tr:contains('" + title + "')").length) {{ - $(".container").show(); - $("tr:contains('" + title + "')")[0].lastChild.firstChild.click(); - if (i > 24) {{ - const requiresLogin = $(".alert-warning").length; - if (requiresLogin) {{ - console.log("[FeedCrawler Sponsors Helper] Login required for: " + title); - clearInterval(checkExist); - window.open("https://" + $(location).attr('hostname') + "#login|" + btoa(window.location)); - window.close(); - }} - clearInterval(checkExist); - }} else {{ - console.log("miss") - }} - }} - }}, 100); - - let j = 0; - let dl = false; - const dlExists = setInterval(function () {{ - j++; - if ($("tr:contains('Download Part')").length) {{ - const items = $("tr:contains('Download Part')").find("a"); - const links = []; - items.each(function (index) {{ - links.push(items[index].href); - }}); - console.log("[FeedCrawler Sponsors Helper] found download links: " + links); - clearInterval(dlExists); - window.open(sponsorsURL + '/sponsors_helper/to_download/' + btoa(links + '|' + title + '|' + password)); - window.close(); - }} else if (j > 24 && !dl) {{ - if (sponsorsHoster && $("button:containsi('" + sponsorsHoster + "')").length) {{ - $("button:containsi('" + sponsorsHoster + "')").click(); - }} else if ($("button:containsi('1fichier')").length) {{ - $("button:containsi('1fichier')").click(); - }} else if ($("button:containsi('ddownload')").length) {{ - $("button:containsi('ddownload')").click(); - }} else if ($("button:containsi('turbo')").length) {{ - $("button:containsi('turbo')").click(); - }} else if ($("button:containsi('filer')").length) {{ - $("button:containsi('filer')").click(); - }} else {{ - $("div.modal-body").find("button.btn.btn-secondary.btn-block").click(); - }} - console.log("[FeedCrawler Sponsors Helper] Clicked Download button to trigger reCAPTCHA"); - dl = true; - }} - }}, 100); - }}""" - - -def get_feedcrawler_sponsors_helper_fc(fx, sf, local_address): - return f"""// ==UserScript== - // @name FeedCrawler Sponsors Helper (FC) - // @author rix1337 - // @description Forwards Click'n'Load to FeedCrawler - // @version 0.7.4 - // @match *.filecrypt.cc/* - // @match *.filecrypt.co/* - // @match *.filecrypt.to/* - // @exclude http://filecrypt.cc/helper.html* - // @exclude http://filecrypt.co/helper.html* - // @exclude http://filecrypt.to/helper.html* - // @grant window.close - // ==/UserScript== - - // Hier muss die von außen erreichbare Adresse des FeedCrawlers stehen (nicht bspw. die Docker-interne): - const sponsorsURL = '{local_address}'; - // Hier kann ein Wunschhoster eingetragen werden (ohne www. und .tld): - const sponsorsHoster = ''; - - const tag = window.location.hash.replace("#", "").split('|'); - const title = tag[0]; - const password = tag[1]; - const ids = tag[2]; - const urlParams = new URLSearchParams(window.location.search); - - function Sleep(milliseconds) {{ - return new Promise(resolve => setTimeout(resolve, milliseconds)); - }} - - let pw = ""; - - let fx = false; - try {{ - fx = (document.getElementById("customlogo").getAttribute('src') === '/css/custom/f38ed.png') - }} catch {{}} - - const checkPass = setInterval(function () {{ - if (document.getElementById("p4assw0rt")) {{ - if (password) {{ - pw = password; - }} else if (fx) {{ - pw = '{fx.split('.')[0]}'; - }} else {{ - pw = '{sf}'; - }} - }} else {{ - pw = ""; - }} - clearInterval(checkPass); - }}, 100); - - const enterPass = setInterval(function () {{ - if (pw) {{ - console.log("[FeedCrawler Sponsors Helper] entering Password: " + pw); - try {{ - document.getElementById("p4assw0rt").value = pw; - document.getElementById("p4assw0rt").parentNode.nextElementSibling.click(); - }} catch (e) {{ - console.log("[FeedCrawler Sponsors Helper] Password set Error: " + e); - }} - clearInterval(enterPass); - }} - }}, 100); - - const checkAd = setInterval(function () {{ - if (document.querySelector('#cform > div > div > div > div > ul > li:nth-child(2)') !== null) {{ - document.querySelector('#cform > div > div > div > div > ul > li:nth-child(2)').style.display = 'none'; - clearInterval(checkAd); - }} - }}, 100); - - let mirrorsAvailable = false; - try {{ - mirrorsAvailable = document.querySelector('.mirror').querySelectorAll("a"); - }} catch {{}} - let cnlAllowed = false; - - if (mirrorsAvailable && sponsorsHoster) {{ - const currentURL = window.location.href; - let desiredMirror = ""; - let i; - for (i = 0; i < mirrorsAvailable.length; i++) {{ - if (mirrorsAvailable[i].text.includes(sponsorsHoster)) {{ - let ep = ""; - const cur_ep = urlParams.get('episode'); - if (cur_ep) {{ - ep = "&episode=" + cur_ep; - }} - desiredMirror = mirrorsAvailable[i].href + ep + window.location.hash; - }} - }} - - if (desiredMirror) {{ - if (!currentURL.toLowerCase().includes(desiredMirror.toLowerCase())) {{ - console.log("[FeedCrawler Sponsors Helper] switching to desired Mirror: " + sponsorsHoster); - window.location = desiredMirror; - }} else {{ - console.log("[FeedCrawler Sponsors Helper] already at the desired Mirror: " + sponsorsHoster); - cnlAllowed = true; - }} - }} else {{ - console.log("[FeedCrawler Sponsors Helper] desired Mirror not available: " + sponsorsHoster); - cnlAllowed = true; - }} - }} else {{ - cnlAllowed = true; - }} - - const cnlExists = setInterval(async function () {{ - if (cnlAllowed && document.getElementsByClassName("cnlform").length) {{ - clearInterval(cnlExists); - document.getElementById("cnl_btn").click(); - console.log("[FeedCrawler Sponsors Helper] attempting Click'n'Load"); - await Sleep(10000); - window.close(); - }} - }}, 100);""" - - -def get_feedcrawler_sponsors_helper_nx(nx, local_address): - return f"""// ==UserScript== - // @name FeedCrawler Sponsors Helper (NX) - // @author rix1337 - // @description Forwards decrypted links to FeedCrawler - // @version 0.1.1 - // @require https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js - // @match https://{nx}/release/* - // @grant window.close - // ==/UserScript== - // Hier muss die von außen erreichbare Adresse des FeedCrawlers stehen (nicht bspw. die Docker-interne): - const sponsorsURL = '{local_address}'; - - function Sleep(milliseconds) {{ - return new Promise(resolve => setTimeout(resolve, milliseconds)); - }} - - var tag = window.location.hash.replace("#", "").split('|'); - var title = tag[0]; - var password = '{nx}'; - - if (title) {{ - await Sleep(3000); - $('h2').prepend('

[FeedCrawler Sponsors Helper] ' + title + '

'); - var dl = false; - var dlExists = setInterval(function() {{ - console.log($("tr:contains("+ title +")").find("a[href*=filer]").length) - if ($("tr:contains("+ title +")").find("a[href*=filer]").length) {{ - var link = $("tr:contains("+ title +")").find("a[href*=filer]")[0]["href"].replace("https://referer.to/?", ""); - var links = [link]; - console.log("[FeedCrawler Sponsors Helper] found download links: " + links); - clearInterval(dlExists); - window.open(sponsorsURL + '/sponsors_helper/to_download/' + btoa(links + '|' + title + '|' + password)); - window.close(); - }} - }}, 1000); - var tolinkExists = setInterval(function() {{ - console.log($("tr:contains("+ title +")").find("a[href*=tolink]").length) - if ($("tr:contains("+ title +")").find("a[href*=tolink]").length) {{ - var link = $("tr:contains("+ title +")").find("a[href*=tolink]")[0]["href"].replace("https://referer.to/?", ""); - var links = [link]; - console.log("[FeedCrawler Sponsors Helper] found encrypted download links: " + links); - clearInterval(tolinkExists); - window.open(sponsorsURL + '/sponsors_helper/replace_decrypt/' + btoa(links + '|' + title + '|' + password)); - window.close(); - }} - }}, 1000); - }}""" diff --git a/feedcrawler/web_interface/vuejs_frontend/package-lock.json b/feedcrawler/web_interface/vuejs_frontend/package-lock.json index 4d90573b..0115f614 100644 --- a/feedcrawler/web_interface/vuejs_frontend/package-lock.json +++ b/feedcrawler/web_interface/vuejs_frontend/package-lock.json @@ -1,52 +1,52 @@ { "name": "feedcrawler-web", - "version": "20.1.9", + "version": "21.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "feedcrawler-web", - "version": "20.1.9", + "version": "21.0.0", "dependencies": { - "@formkit/i18n": "^1.6.7", - "@formkit/vue": "^1.6.7", + "@formkit/i18n": "^1.6.9", + "@formkit/vue": "^1.6.9", "@meforma/vue-toaster": "^1.3.0", - "axios": "^1.7.7", + "axios": "^1.7.9", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", - "pinia": "^2.2.2", - "sass": "^1.79.4", - "vue": "^3.5.10", - "vue-tippy": "^6.4.4", + "pinia": "^2.3.0", + "sass": "^1.83.0", + "vue": "^3.5.13", + "vue-tippy": "^6.5.0", "vuejs-paginate-next": "^1.0.2" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.1.4", - "vite": "^5.4.8" + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.5" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -56,22 +56,21 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ "ppc64" ], @@ -81,13 +80,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", "cpu": [ "arm" ], @@ -97,13 +96,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", "cpu": [ "arm64" ], @@ -113,13 +112,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", "cpu": [ "x64" ], @@ -129,13 +128,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", "cpu": [ "arm64" ], @@ -145,13 +144,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", "cpu": [ "x64" ], @@ -161,13 +160,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", "cpu": [ "arm64" ], @@ -177,13 +176,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", "cpu": [ "x64" ], @@ -193,13 +192,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", "cpu": [ "arm" ], @@ -209,13 +208,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", "cpu": [ "arm64" ], @@ -225,13 +224,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", "cpu": [ "ia32" ], @@ -241,13 +240,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", "cpu": [ "loong64" ], @@ -257,13 +256,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", "cpu": [ "mips64el" ], @@ -273,13 +272,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", "cpu": [ "ppc64" ], @@ -289,13 +288,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", "cpu": [ "riscv64" ], @@ -305,13 +304,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", "cpu": [ "s390x" ], @@ -321,13 +320,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", "cpu": [ "x64" ], @@ -337,13 +336,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", "cpu": [ "x64" ], @@ -353,13 +352,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", "cpu": [ "x64" ], @@ -369,13 +384,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", "cpu": [ "x64" ], @@ -385,13 +400,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", "cpu": [ "arm64" ], @@ -401,13 +416,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", "cpu": [ "ia32" ], @@ -417,13 +432,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", "cpu": [ "x64" ], @@ -433,70 +448,70 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@formkit/core": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/core/-/core-1.6.7.tgz", - "integrity": "sha512-wEoWK7crcCPRV5KJfEGLjjIS+qwbuD8I5Ur0zTtKRQrdO4oRL6kVoubxQOpgnq1l8sWfcRY8Wpf22Wna2LD20Q==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/core/-/core-1.6.9.tgz", + "integrity": "sha512-Zb5OkYKMf7Rp1pd4iUMv0TJQvfgl1PdKtRRQoGiTA0XIFLB/7tcRMr1wc5isA2JS+hllfxMTh3RWF8N+64fTMg==", "dependencies": { - "@formkit/utils": "1.6.7" + "@formkit/utils": "1.6.9" } }, "node_modules/@formkit/dev": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/dev/-/dev-1.6.7.tgz", - "integrity": "sha512-mMtkfvfkl1P1v0haizUE4DadalbG9/3m0ZymmMKKb0F3pojQJFtdfohy67ZQKtmzy4bamowHyEUr+XzLbKY2EA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/dev/-/dev-1.6.9.tgz", + "integrity": "sha512-4ueBpZAOiKr8/LZnq3mNePCX4ZB1j1JuJscBEwugWMnDeDwCNo5XWBrng1ER/LlitTRQ3mtEBNy2Qpm0yAHlwA==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/utils": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/utils": "1.6.9" } }, "node_modules/@formkit/i18n": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/i18n/-/i18n-1.6.7.tgz", - "integrity": "sha512-i9Mnc2XHCm2c10fppEIxdGv+jqOaixO22iFXX3xF+AkJnxtOzV5hP4f3/TeG+BNahGUq8vj+e1y+VMnjS6duxA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/i18n/-/i18n-1.6.9.tgz", + "integrity": "sha512-8NA5bALlspCBEwInuZVgBqgQr0lDfproZdmbs2LciQpGi2B15u74JCjAkEwaKlMs+qgf/ds3QcIgUv2ztyyVEA==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/utils": "1.6.7", - "@formkit/validation": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/utils": "1.6.9", + "@formkit/validation": "1.6.9" } }, "node_modules/@formkit/inputs": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/inputs/-/inputs-1.6.7.tgz", - "integrity": "sha512-VLxoAJn5VGOEXkGI499lju5Irnu12cu+spI1HL//46nlVkqnb1XcV0k0MK9K+hogz4fGmyZUvHf0lxU6dh7ZZQ==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/inputs/-/inputs-1.6.9.tgz", + "integrity": "sha512-k9gjV1e5F87NxSnu13JtKb30XYt6ndx2KGHZG8Xz0etoP75yJlMaeROHHPvlxdy2gZM6qH7Ex4it51W74Wh2Eg==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/utils": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/utils": "1.6.9" } }, "node_modules/@formkit/observer": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/observer/-/observer-1.6.7.tgz", - "integrity": "sha512-ei5z5ernNMKKiBuoRcFgEthhP1i+KKb02hsPsikLA3XehuoJdWIejn9AAq6jOEGbUMZ5XAAgFJcxzO5tnKuPnw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/observer/-/observer-1.6.9.tgz", + "integrity": "sha512-p3MCmzp6jwzXIuV3gI9uTJTJl+sN5689C7qf7gdrS8jb1fbX1snKiTyWA8FXOrBXu+ne5z/sA/yBWqYFTSLy8A==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/utils": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/utils": "1.6.9" } }, "node_modules/@formkit/rules": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/rules/-/rules-1.6.7.tgz", - "integrity": "sha512-adzOuTvf6ghZbV0g0ZH9+MU9jfoF4DojBztAbqzFP/fT4d+WxhSHHlkWq6PU66fHPy3OH4DkWdx9trL1wGHuzQ==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/rules/-/rules-1.6.9.tgz", + "integrity": "sha512-5Vu3JACKyws1kw02qF+024WkS7L9kYZ0lmdSpsaTqg5Wf7+InsxWXFYaG6vCzqIh4Lk9NeffIzq/xyGpGxf5uQ==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/utils": "1.6.7", - "@formkit/validation": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/utils": "1.6.9", + "@formkit/validation": "1.6.9" } }, "node_modules/@formkit/themes": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/themes/-/themes-1.6.7.tgz", - "integrity": "sha512-TIiWr4TMAFUg1pQz2E4GErfAhBv2Q2VbWlk6pqXPWI8UyPTjmcinEnCSIWDCX6FPPqiYShBnh8123nTO7pyvjA==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/themes/-/themes-1.6.9.tgz", + "integrity": "sha512-/UD+MehQEdcCEadt73eIBGGAMEK8ODN0yq9r9299WvQxIELCOP2MbcxuWCV/g2Vd15Xhl8YFdn4KCzQi4X7QXA==", "dependencies": { - "@formkit/core": "1.6.7" + "@formkit/core": "1.6.9" }, "peerDependencies": { "tailwindcss": "^3.2.0", @@ -516,34 +531,34 @@ } }, "node_modules/@formkit/utils": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/utils/-/utils-1.6.7.tgz", - "integrity": "sha512-aU3CDLzCkC5Dnx6iS3swbsIbys7E+2VOaLWFRnS7wk7kFa8EnENi67qc2E2KFE05RT4UCEAIYMAQY6wvek29gA==" + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/utils/-/utils-1.6.9.tgz", + "integrity": "sha512-vSFhB/Sm/A+SdwKdBi4WhJcdbePqSYRaB878Ol9HL8roTmmmgQpThvkv6EjLM6aRRP27Il5rS8XtIAIeh8vdTA==" }, "node_modules/@formkit/validation": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/validation/-/validation-1.6.7.tgz", - "integrity": "sha512-4wUUG+Pz3hPeiLccYiXAzsrF7SXk28PYAeHJeBngIv9K82ieljBJpvvuCJDyA6SeSMOvmbI92TG4wx4u5cDLOw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/validation/-/validation-1.6.9.tgz", + "integrity": "sha512-9PGwN0ZDJt3hsrMyaL8KTG3diSQDik1OGogVG6/nFcZhWUycpeamFfXZSQ5pfzmwnvrTHsvyT0FtKitUnWWuPA==", "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/observer": "1.6.7", - "@formkit/utils": "1.6.7" + "@formkit/core": "1.6.9", + "@formkit/observer": "1.6.9", + "@formkit/utils": "1.6.9" } }, "node_modules/@formkit/vue": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@formkit/vue/-/vue-1.6.7.tgz", - "integrity": "sha512-w3kjQD0lvtImyyTiy+fLaIZM/4r6sLDbpBIwke8ZA/d5orzNE96JPaloVKbH+HwCo6+z/1mclh1pW1S+7RgMcw==", - "dependencies": { - "@formkit/core": "1.6.7", - "@formkit/dev": "1.6.7", - "@formkit/i18n": "1.6.7", - "@formkit/inputs": "1.6.7", - "@formkit/observer": "1.6.7", - "@formkit/rules": "1.6.7", - "@formkit/themes": "1.6.7", - "@formkit/utils": "1.6.7", - "@formkit/validation": "1.6.7" + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/@formkit/vue/-/vue-1.6.9.tgz", + "integrity": "sha512-WrjAtEsKnFJzxQuATWsWKMpTAyJE15PUmRh9hwEAqgTDy2yMog1gxqxfZv3rEAdIdgXNp08tWmRVnQgDIF3vAQ==", + "dependencies": { + "@formkit/core": "1.6.9", + "@formkit/dev": "1.6.9", + "@formkit/i18n": "1.6.9", + "@formkit/inputs": "1.6.9", + "@formkit/observer": "1.6.9", + "@formkit/rules": "1.6.9", + "@formkit/themes": "1.6.9", + "@formkit/utils": "1.6.9", + "@formkit/validation": "1.6.9" }, "peerDependencies": { "vue": "^3.4.0" @@ -584,6 +599,288 @@ "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==" }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -603,9 +900,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", + "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", "cpu": [ "arm" ], @@ -616,9 +913,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", + "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", "cpu": [ "arm64" ], @@ -629,9 +926,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", + "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", "cpu": [ "arm64" ], @@ -642,9 +939,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", + "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", "cpu": [ "x64" ], @@ -654,10 +951,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", + "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", + "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", + "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", "cpu": [ "arm" ], @@ -668,9 +991,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", + "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", "cpu": [ "arm" ], @@ -681,9 +1004,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", + "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", "cpu": [ "arm64" ], @@ -694,9 +1017,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", + "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", "cpu": [ "arm64" ], @@ -706,10 +1029,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", + "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", + "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", "cpu": [ "ppc64" ], @@ -720,9 +1056,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", + "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", "cpu": [ "riscv64" ], @@ -733,9 +1069,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", + "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", "cpu": [ "s390x" ], @@ -746,9 +1082,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", + "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", "cpu": [ "x64" ], @@ -759,9 +1095,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", + "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", "cpu": [ "x64" ], @@ -772,9 +1108,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", + "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", "cpu": [ "arm64" ], @@ -785,9 +1121,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", + "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", "cpu": [ "ia32" ], @@ -798,9 +1134,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", + "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", "cpu": [ "x64" ], @@ -811,68 +1147,68 @@ ] }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "node_modules/@vitejs/plugin-vue": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.4.tgz", - "integrity": "sha512-N2XSI2n3sQqp5w7Y/AN/L2XDjBIRGqXko+eDp42sydYSBeJuSm5a1sLf8zakmo8u7tA8NmBgoDLA1HeOESjp9A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^5.0.0", + "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "node_modules/@vue/compiler-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz", - "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.10", + "@vue/shared": "3.5.13", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz", - "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", "dependencies": { - "@vue/compiler-core": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz", - "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", "dependencies": { "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.10", - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", "estree-walker": "^2.0.2", "magic-string": "^0.30.11", - "postcss": "^8.4.47", + "postcss": "^8.4.48", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz", - "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/devtools-api": { @@ -881,49 +1217,49 @@ "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==" }, "node_modules/@vue/reactivity": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz", - "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", "dependencies": { - "@vue/shared": "3.5.10" + "@vue/shared": "3.5.13" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz", - "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz", - "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", "dependencies": { - "@vue/reactivity": "3.5.10", - "@vue/runtime-core": "3.5.10", - "@vue/shared": "3.5.10", + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz", - "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", "dependencies": { - "@vue/compiler-ssr": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" }, "peerDependencies": { - "vue": "3.5.10" + "vue": "3.5.13" } }, "node_modules/@vue/shared": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz", - "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==" + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" }, "node_modules/@vue/test-utils": { "version": "2.4.6", @@ -981,9 +1317,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", - "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -1045,6 +1381,18 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "optional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chokidar": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", @@ -1109,9 +1457,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1177,6 +1525,18 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1257,41 +1617,42 @@ } }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/estree-walker": { @@ -1299,6 +1660,18 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -1386,9 +1759,9 @@ } }, "node_modules/immutable": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==" }, "node_modules/inflight": { "version": "1.0.6", @@ -1410,6 +1783,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1418,6 +1800,27 @@ "node": ">=8" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1550,13 +1953,26 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "optional": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1620,9 +2036,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -1636,6 +2052,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "optional": true + }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", @@ -1695,14 +2117,26 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/pinia": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.2.2.tgz", - "integrity": "sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.0.tgz", + "integrity": "sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==", "dependencies": { "@vue/devtools-api": "^6.6.3", "vue-demi": "^0.14.10" @@ -1711,14 +2145,10 @@ "url": "https://github.com/sponsors/posva" }, "peerDependencies": { - "@vue/composition-api": "^1.4.0", "typescript": ">=4.4.4", - "vue": "^2.6.14 || ^3.3.0" + "vue": "^2.7.0 || ^3.5.11" }, "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, "typescript": { "optional": true } @@ -1750,9 +2180,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -1769,7 +2199,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -1805,12 +2235,12 @@ "deprecated": "https://github.com/lydell/resolve-url#deprecated" }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.29.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", + "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -1820,22 +2250,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.29.1", + "@rollup/rollup-android-arm64": "4.29.1", + "@rollup/rollup-darwin-arm64": "4.29.1", + "@rollup/rollup-darwin-x64": "4.29.1", + "@rollup/rollup-freebsd-arm64": "4.29.1", + "@rollup/rollup-freebsd-x64": "4.29.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", + "@rollup/rollup-linux-arm-musleabihf": "4.29.1", + "@rollup/rollup-linux-arm64-gnu": "4.29.1", + "@rollup/rollup-linux-arm64-musl": "4.29.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", + "@rollup/rollup-linux-riscv64-gnu": "4.29.1", + "@rollup/rollup-linux-s390x-gnu": "4.29.1", + "@rollup/rollup-linux-x64-gnu": "4.29.1", + "@rollup/rollup-linux-x64-musl": "4.29.1", + "@rollup/rollup-win32-arm64-msvc": "4.29.1", + "@rollup/rollup-win32-ia32-msvc": "4.29.1", + "@rollup/rollup-win32-x64-msvc": "4.29.1", "fsevents": "~2.3.2" } }, @@ -1845,12 +2278,12 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", "dependencies": { "chokidar": "^4.0.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -1858,6 +2291,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sax": { @@ -2068,12 +2504,16 @@ "@popperjs/core": "^2.9.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8.0" } }, "node_modules/urix": { @@ -2083,20 +2523,20 @@ "deprecated": "Please see https://github.com/lydell/urix#deprecated" }, "node_modules/vite": { - "version": "5.4.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz", - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.5.tgz", + "integrity": "sha512-akD5IAH/ID5imgue2DYhzsEwCi0/4VKY31uhMLEYJwPP4TiUp8pL5PIK+Wo7H8qT8JY9i+pVfPydcFPYD1EL7g==", "dev": true, "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "0.24.0", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -2105,19 +2545,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -2138,19 +2584,25 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vue": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz", - "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", "dependencies": { - "@vue/compiler-dom": "3.5.10", - "@vue/compiler-sfc": "3.5.10", - "@vue/runtime-dom": "3.5.10", - "@vue/server-renderer": "3.5.10", - "@vue/shared": "3.5.10" + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" }, "peerDependencies": { "typescript": "*" @@ -2167,9 +2619,9 @@ "integrity": "sha512-sO9qQ8oC520SW6kqlls0iqDak53gsTVSrYylajgjmkt1c0vcgjsGSy1KzlDrbEx8pm02IEYhlUkU5hCYf8rwtg==" }, "node_modules/vue-tippy": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/vue-tippy/-/vue-tippy-6.4.4.tgz", - "integrity": "sha512-0C5TSU482FvjhEeKrPkz08tzyC/KJC0CiEbm3yW9oS+n3fa03ajEzU2QcxI9oR6Hwlg8NOP0U6T4EsGuccq6YQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/vue-tippy/-/vue-tippy-6.5.0.tgz", + "integrity": "sha512-U44UDETTLuZWZGosagslEwgimWQdt1JVSxfWStVPnVdeqo2jo9X5zW3SB04k7JaTFosdgrDhFsUDrd6n42Nh7Q==", "dependencies": { "tippy.js": "^6.3.7" }, diff --git a/feedcrawler/web_interface/vuejs_frontend/package.json b/feedcrawler/web_interface/vuejs_frontend/package.json index 4813b09e..1d84c8e1 100644 --- a/feedcrawler/web_interface/vuejs_frontend/package.json +++ b/feedcrawler/web_interface/vuejs_frontend/package.json @@ -1,6 +1,6 @@ { "name": "feedcrawler-web", - "version": "20.1.9", + "version": "21.0.0", "type": "module", "scripts": { "dev": "vite", @@ -8,20 +8,20 @@ "preview": "vite preview --port 5050" }, "dependencies": { - "@formkit/i18n": "^1.6.7", - "@formkit/vue": "^1.6.7", + "@formkit/i18n": "^1.6.9", + "@formkit/vue": "^1.6.9", "@meforma/vue-toaster": "^1.3.0", - "axios": "^1.7.7", + "axios": "^1.7.9", "bootstrap": "^5.3.3", "bootstrap-icons": "^1.11.3", - "pinia": "^2.2.2", - "sass": "^1.79.4", - "vue": "^3.5.10", - "vue-tippy": "^6.4.4", + "pinia": "^2.3.0", + "sass": "^1.83.0", + "vue": "^3.5.13", + "vue-tippy": "^6.5.0", "vuejs-paginate-next": "^1.0.2" }, "devDependencies": { - "@vitejs/plugin-vue": "^5.1.4", - "vite": "^5.4.8" + "@vitejs/plugin-vue": "^5.2.1", + "vite": "^6.0.5" } } diff --git a/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/app.scss b/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/app.scss index 79d0c121..dcd52468 100644 --- a/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/app.scss +++ b/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/app.scss @@ -46,3 +46,12 @@ input { margin-right: auto; text-align: center; } + +/* CAPTCHA centered */ +#captcha { + display: flex; + justify-content: center; + align-items: center; + width: max-content; + margin: auto; +} diff --git a/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/variables.scss b/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/variables.scss index 3683c384..2100c2c5 100644 --- a/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/variables.scss +++ b/feedcrawler/web_interface/vuejs_frontend/src/assets/scss/variables.scss @@ -1,110 +1,109 @@ // Import Bootstrap SCSS -@import "../node_modules/bootstrap/scss/functions"; -@import "../node_modules/bootstrap/scss/variables"; +@use 'bootstrap/scss/bootstrap' as bs; // Toast styles .c-toast-container .c-toast--success { - background-color: $success; - font-family: $font-family-sans-serif; + background-color: bs.$success; + font-family: bs.$font-family-sans-serif; } .c-toast-container .c-toast--info { - background-color: $primary; - font-family: $font-family-sans-serif; + background-color: bs.$primary; + font-family: bs.$font-family-sans-serif; } .c-toast-container .c-toast--warning { - background-color: $warning; - font-family: $font-family-sans-serif; + background-color: bs.$warning; + font-family: bs.$font-family-sans-serif; } .c-toast-container .c-toast--error { - background-color: $danger; - font-family: $font-family-sans-serif; + background-color: bs.$danger; + font-family: bs.$font-family-sans-serif; } .c-toast-container .c-toast--default { - background-color: $secondary; - font-family: $font-family-sans-serif; + background-color: bs.$secondary; + font-family: bs.$font-family-sans-serif; } // Formkit Validation styles [data-invalid] .formkit-inner { - border-color: $danger !important; + border-color: bs.$danger !important; border-radius: .25rem; - box-shadow: 0 0 0 0.25rem $danger !important; + box-shadow: 0 0 0 0.25rem bs.$danger !important; } .dark { .card, .offcanvas, .modal-content { - background-color: $dark; - color: $white; - border-color: $secondary; + background-color: bs.$dark; + color: bs.$white; + border-color: bs.$secondary; } .card-header { - border-bottom-color: $secondary; + border-bottom-color: bs.$secondary; } .border-top { - border-top-color: $secondary !important; + border-top-color: bs.$secondary !important; } .modal-header { - border-bottom-color: $secondary; + border-bottom-color: bs.$secondary; } .modal-footer { - border-top-color: $secondary; + border-top-color: bs.$secondary; } .table > :not(caption) > * > * { - background-color: $dark; - color: $white; + background-color: bs.$dark; + color: bs.$white; } tbody, td, tfoot, th, thead, tr { - border-color: $secondary; + border-color: bs.$secondary; } .table-hover tbody tr:hover td, .table-hover tbody tr:hover th { - background-color: $warning; + background-color: bs.$warning; } .list-group-item { - background-color: $dark; - color: $white; + background-color: bs.$dark; + color: bs.$white; } .accordion-item { - color: $white; + color: bs.$white; } .accordion { background-color: black !important; - color: $white !important; - border-color: $secondary !important; - --bs-accordion-bg: $dark !important; + color: bs.$white !important; + border-color: bs.$secondary !important; + --bs-accordion-bg: bs.$dark !important; } .accordion-button { - background-color: $gray-800 !important; - color: $warning !important; + background-color: bs.$gray-800 !important; + color: bs.$warning !important; } .form-control { - border-color: $secondary; + border-color: bs.$secondary; } .form-control.bg-light { - background-color: $dark !important; - color: $white; + background-color: bs.$dark !important; + color: bs.$white; } ul.pagination li { - --bs-pagination-bg: $dark !important; - --bs-pagination-disabled-bg: $white !important; + --bs-pagination-bg: bs.$dark !important; + --bs-pagination-disabled-bg: bs.$white !important; } svg { @@ -113,16 +112,16 @@ } mark { - background-color: $secondary; - color: $white; + background-color: bs.$secondary; + color: bs.$white; } mark a { - color: $warning; + color: bs.$warning; } mark a { - color: $warning !important; + color: bs.$warning !important; } .percentage { diff --git a/feedcrawler/web_interface/vuejs_frontend/src/components/Captcha.vue b/feedcrawler/web_interface/vuejs_frontend/src/components/Captcha.vue new file mode 100644 index 00000000..555e63d6 --- /dev/null +++ b/feedcrawler/web_interface/vuejs_frontend/src/components/Captcha.vue @@ -0,0 +1,58 @@ + + + diff --git a/feedcrawler/web_interface/vuejs_frontend/src/components/Head.vue b/feedcrawler/web_interface/vuejs_frontend/src/components/Head.vue index 3be301e9..6a334714 100644 --- a/feedcrawler/web_interface/vuejs_frontend/src/components/Head.vue +++ b/feedcrawler/web_interface/vuejs_frontend/src/components/Head.vue @@ -32,18 +32,7 @@ function getVersion() { console.info("%c ❤ Projekt unterstützen %c ".concat("https://github.com/sponsors/rix1337 ❤", " "), "color: white; background: #dc3545; font-weight: 700;", "color: #dc3545; background: white; font-weight: 700;") update.value = res.data.version.update_ready store.setDocker(res.data.version.docker) - let helper_active = res.data.version.helper_active - if (helper_active) { - store.setHelperActive(true) - axios.get("http://127.0.0.1:9666/") - .then(function (res) { - let jd_cnl_available = (res.data === 'JDownloader') - if (jd_cnl_available) { - store.setHelperAvailable(true) - console.log("Click'n'Load des FeedCrawler Sponsors Helper ist verfügbar!") - } - }) - } + store.setHelperActive(res.data.version.helper_active) if (update.value) { scrollingTitle("FeedCrawler - Update verfügbar! - ") console.log('Update steht bereit! Weitere Informationen unter https://github.com/rix1337/FeedCrawler/releases/latest') @@ -125,6 +114,8 @@ function showSiteStatusHelp() { toggle: true }) } + +import Captcha from './Captcha.vue' diff --git a/feedcrawler/web_interface/vuejs_frontend/src/components/Log.vue b/feedcrawler/web_interface/vuejs_frontend/src/components/Log.vue index 3dc48a93..81023498 100644 --- a/feedcrawler/web_interface/vuejs_frontend/src/components/Log.vue +++ b/feedcrawler/web_interface/vuejs_frontend/src/components/Log.vue @@ -23,7 +23,6 @@ function getLog() { getLogPages() }, function () { console.log('Konnte Log nicht abrufen!') - toast.error('Konnte Log nicht abrufen!') }) } diff --git a/feedcrawler/web_interface/vuejs_frontend/src/components/MyJD.vue b/feedcrawler/web_interface/vuejs_frontend/src/components/MyJD.vue index b762211c..fde2a6e8 100644 --- a/feedcrawler/web_interface/vuejs_frontend/src/components/MyJD.vue +++ b/feedcrawler/web_interface/vuejs_frontend/src/components/MyJD.vue @@ -4,6 +4,7 @@ import {computed, inject, onMounted, ref} from 'vue' import {Collapse, Offcanvas} from 'bootstrap' import axios from 'axios' import Paginate from "vuejs-paginate-next" +import Captcha from "@/components/Captcha.vue"; const store = useStore() const toast = inject('toast') @@ -130,7 +131,6 @@ function getMyJD() { myjd_failed.value = null store.setMyJDConnectionError(true) console.log('Konnte JDownloader nicht erreichen!') - toast.error('Konnte JDownloader nicht erreichen!') }) } @@ -428,55 +428,23 @@ function myJDretry(linkids, uuid, links, name) { }) } -const cnl_active = ref(false) -const time = ref(0) - -function internalCnl(name, password) { - toast.warning("Warte auf Click'n'Load für " + name, { - duration: 60000, - dismissible: false - }) - cnl_active.value = true - time.value = 60 - countDown() - axios.post('api/internal_cnl/' + name + "&" + password) - .then(function () { - toast.success("Click'n'Load für " + name + " erfolgreich!") - if (to_decrypt.value) { - for (let failed_package of to_decrypt.value) { - let existing_name = failed_package['name'] - if (name === existing_name) { - let index = to_decrypt.value.indexOf(failed_package) - to_decrypt.value.splice(index, 1) - } - } - } - getMyJD() - cnl_active.value = false - time.value = 0 - }).catch(function () { - console.log("Click'n'Load für " + name + " icht durchgeführt!") - toast.error("Click'n'Load für " + name + " icht durchgeführt!") - cnl_active.value = false - time.value = 0 - }) -} - -function countDown() { - if (time.value > 0) { - setTimeout(() => { - time.value -= 1 - countDown() - }, 1000) - } -} - function showSponsorsHelp() { new Offcanvas(document.getElementById("offcanvasBottomHelp"), {backdrop: false}).show() new Collapse(document.getElementById('collapseSponsorsHelper'), { toggle: true }) } + +const activeCaptchaIndex = ref(null); // Null = no active Captcha + +function openCaptcha(index) { + if (activeCaptchaIndex.value === index) { + activeCaptchaIndex.value = null; // Reset to ensure it can re-trigger + } + setTimeout(() => { + activeCaptchaIndex.value = index; // Set the new index + }, 0); // Allow the DOM to notice the change +} @@ -513,7 +481,7 @@ function showSponsorsHelp() { data-bs-parent="#accordionMyJD">
-
+
)
    -
  • - - Warte auf hinzugefügte Links! -
  • ( {{ host }} )
  • -
  • +
  • - - Download fehlgeschlagen! - + + Download fehlgeschlagen! +
  • - - @@ -670,62 +633,18 @@ function showSponsorsHelp() {
  • -