diff --git a/pom.xml b/pom.xml index 7579deb..1e87780 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,11 @@ schafkopf-backend-build - + + + src/main/resources + + maven-checkstyle-plugin @@ -147,6 +151,16 @@ pn532 1.0.2 + + org.openjfx + javafx-controls + 17 + + + org.openjfx + javafx-web + 17 + org.example diff --git a/src/main/java/org/schafkopf/BackendServer.java b/src/main/java/org/schafkopf/BackendServer.java index b1d99c4..a0381cf 100644 --- a/src/main/java/org/schafkopf/BackendServer.java +++ b/src/main/java/org/schafkopf/BackendServer.java @@ -1,15 +1,22 @@ package org.schafkopf; import com.google.gson.JsonObject; +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; import io.github.cdimascio.dotenv.Dotenv; import jakarta.servlet.DispatcherType; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.net.InetSocketAddress; -import java.net.URI; +import java.net.URL; import java.time.Duration; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.concurrent.CountDownLatch; +import javafx.application.Application; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.FilterHolder; @@ -24,13 +31,16 @@ import org.schafkopf.cardreader.UsbCardReader; public class BackendServer { private final Server server; private final ServerConnector connector; - private final Schafkopf schafkopfGame; - private final CardReader nfcLeser; - private final List frontendEndpoints = new ArrayList<>(); private CountDownLatch nfcLatch = new CountDownLatch(1); private Boolean readingMode = false; private String uidString = ""; + /** Important variables. */ + public final Schafkopf schafkopfGame; + + private final CardReader nfcLeser; + private final List frontendEndpoints = new ArrayList<>(); + /** Creates an Instance of the Backend Server. */ public BackendServer() { Dotenv dotenv = Dotenv.configure().directory("./").load(); @@ -42,7 +52,7 @@ public class BackendServer { server.addConnector(connector); schafkopfGame = new Schafkopf(this); - // nfcLeser = new RaspberryKartenLeser(this); + String osName = System.getProperty("os.name").toLowerCase(); if (osName.contains("win")) { // Windows @@ -66,6 +76,16 @@ public class BackendServer { // Configure CORS settings configureCors(context); + URL webContentUrl = getClass().getClassLoader().getResource("web-content"); + if (webContentUrl == null) { + throw new RuntimeException("Unable to find 'web-content' directory"); + } + + String webContentPath = webContentUrl.toExternalForm(); + context.setResourceBase(webContentPath); + + System.out.println("Web Content Path: " + webContentPath); + // Configure specific websocket behavior JettyWebSocketServletContainerInitializer.configure( context, @@ -76,6 +96,70 @@ public class BackendServer { // Add websockets wsContainer.addMapping("/schafkopf-events/*", new FrontendEndpointCreator(this)); }); + + // Integrate simple HTTP server + startHttpServer(); + new Thread(this::launchJavaFx).start(); + } + + private void launchJavaFx() { + Application.launch(JavaFxApp.class); + } + + private void startHttpServer() { + try { + HttpServer httpServer = HttpServer.create(new InetSocketAddress(8081), 0); + httpServer.createContext("/", new MyHandler()); + httpServer.setExecutor(null); + httpServer.start(); + System.out.println("HTTP Server started on port 8081"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + static class MyHandler implements HttpHandler { + @Override + public void handle(HttpExchange t) throws IOException { + String path = t.getRequestURI().getPath(); + if ("/".equals(path)) { + path = "/index.html"; // default to index.html + } + + try { + InputStream fileStream = + getClass().getClassLoader().getResourceAsStream("web-content" + path); + if (fileStream != null) { + byte[] data = fileStream.readAllBytes(); + // Set the appropriate MIME type for JavaScript files + String mimeType = getMimeType(path); + t.getResponseHeaders().set("Content-Type", mimeType); + t.sendResponseHeaders(200, data.length); + + try (OutputStream os = t.getResponseBody()) { + os.write(data); + } + } else { + // File not found + t.sendResponseHeaders(404, -1); + } + } catch (IOException e) { + e.printStackTrace(); + t.sendResponseHeaders(500, -1); + } + } + + private String getMimeType(String path) { + if (path.endsWith(".js")) { + return "application/javascript"; + } else if (path.endsWith(".html")) { + return "text/html"; + } else if (path.endsWith(".css")) { + return "text/css"; + } + // Add more MIME types as needed + return "application/octet-stream"; + } } /** The main entrypoint of the Application. */ @@ -100,23 +184,15 @@ public class BackendServer { context.addFilter(cors, "*", types); } - public void setPort(int port) { + private void setPort(int port) { connector.setPort(port); } - public void start() throws Exception { + private void start() throws Exception { server.start(); } - public URI getUri() { - return server.getURI(); - } - - public void stop() throws Exception { - server.stop(); - } - - public void join() throws InterruptedException { + private void join() throws InterruptedException { server.join(); } @@ -150,24 +226,14 @@ public class BackendServer { } } - public void startSchafkopfGame() { - schafkopfGame.startGame(); - } - - public void stopSchafkopfGame() { - schafkopfGame.stopGame(); - } - - public void showTrumpf() { - schafkopfGame.showTrumpf(); - } - - public void showFarbe() { - schafkopfGame.showFarbe(); - } - - public void setGame(String message) { - schafkopfGame.setGame(message); + /** method to call to wait for NFC input. */ + public String waitForCardScan() throws InterruptedException { + this.readingMode = true; + nfcLatch.await(); + Thread.sleep(20); + this.readingMode = false; + nfcLatch = new CountDownLatch(1); + return this.uidString; } /** @@ -186,14 +252,4 @@ public class BackendServer { this.uidString = uidString; nfcLatch.countDown(); } - - /** method to call to wait for NFC input. */ - public String waitForCardScan() throws InterruptedException { - this.readingMode = true; - nfcLatch.await(); - Thread.sleep(20); - this.readingMode = false; - nfcLatch = new CountDownLatch(1); - return this.uidString; - } } diff --git a/src/main/java/org/schafkopf/FrontendEndpoint.java b/src/main/java/org/schafkopf/FrontendEndpoint.java index 03eaf96..37da97b 100644 --- a/src/main/java/org/schafkopf/FrontendEndpoint.java +++ b/src/main/java/org/schafkopf/FrontendEndpoint.java @@ -30,23 +30,23 @@ public class FrontendEndpoint extends WebSocketAdapter { System.out.println("Received TEXT message:" + message); if (message.contains("startsimulation")) { - backendServer.startSchafkopfGame(); + backendServer.schafkopfGame.startGame(); } if (message.contains("stopsimulation")) { - backendServer.stopSchafkopfGame(); + backendServer.schafkopfGame.stopGame(); } if (message.contains("showtrumpf")) { - backendServer.showTrumpf(); + backendServer.schafkopfGame.showTrumpf(); } if (message.contains("showfarben")) { - backendServer.showFarbe(); + backendServer.schafkopfGame.showFarbe(); } if (message.contains("setgame")) { - backendServer.setGame(message); + backendServer.schafkopfGame.setGame(message); } } diff --git a/src/main/java/org/schafkopf/GameState.java b/src/main/java/org/schafkopf/GameState.java new file mode 100644 index 0000000..d7d9e52 --- /dev/null +++ b/src/main/java/org/schafkopf/GameState.java @@ -0,0 +1,80 @@ +package org.schafkopf; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.schafkopf.karte.Karte; +import org.schafkopf.karte.KartenFarbe; + +/** GameState. */ +public class GameState { + + public GamePhase getGamePhase() { + return this.gamePhase; + } + + /** GamePhase. */ + public enum GamePhase { + CHOOSE_GAME("Spiel muss gewählt werden"), + + GAME_START("Warten auf das Legen einer Karte"), + + TRICK_START("Warten auf das Legen einer Karte"), + WAIT_FOR_CARD("Warten auf das Legen einer Karte"), + PLAYER_CARD("Warten auf das Legen einer Karte"), + PLAYER_TRICK("Spieler sticht"), + GAME_STOP("Spieler sticht"); + // Add more phases as needed + + private final String description; + + GamePhase(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + } + + private GamePhase gamePhase; + private Integer currentPlayer; // Using Integer to allow for null + private Karte card; + private KartenFarbe color; + private boolean trumpf; + + // Constructors, getters, and setters + + public GameState(GamePhase phase) { + this.gamePhase = phase; + } + + public GameState(GamePhase phase, Integer player) { + this.gamePhase = phase; + this.currentPlayer = player; + } + + /** GameState. */ + public GameState(GamePhase phase, Integer player, Karte card, KartenFarbe color, boolean trumpf) { + this.gamePhase = phase; + this.currentPlayer = player; + this.card = card; + this.color = color; + this.trumpf = trumpf; + } + + /** GameState. */ + public GameState(GamePhase phase, Integer player, Karte card) { + this.gamePhase = phase; + this.currentPlayer = player; + this.card = card; + } + + /** GameState. */ + public JsonObject getJson() { + Gson gson = new Gson(); + JsonObject jsonObject = new JsonObject(); + jsonObject.add("gamestate", gson.toJsonTree(this)); + + return jsonObject; + } +} diff --git a/src/main/java/org/schafkopf/JavaFxApp.java b/src/main/java/org/schafkopf/JavaFxApp.java new file mode 100644 index 0000000..ee7f787 --- /dev/null +++ b/src/main/java/org/schafkopf/JavaFxApp.java @@ -0,0 +1,50 @@ +package org.schafkopf; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.input.KeyCode; +import javafx.scene.web.WebView; +import javafx.stage.Stage; + +/** Frontend Window. */ +public class JavaFxApp extends Application { + + private static final String FRONTEND_URL = + "http://localhost:8081"; // Replace with your frontend URL + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) { + // Create a WebView + WebView webView = new WebView(); + + // Load the frontend URL + webView.getEngine().load(FRONTEND_URL); + + // Create a Scene with the WebView + Scene scene = new Scene(webView, 800, 600); + + // Set up the Stage + primaryStage.setTitle("Schafkopfen"); + primaryStage.setScene(scene); + + primaryStage.setFullScreenExitHint(""); + + // Set the stage to fullscreen + primaryStage.setFullScreen(true); + + // Add event handler for the Escape key to toggle fullscreen + scene.setOnKeyPressed( + event -> { + if (event.getCode() == KeyCode.F11) { + primaryStage.setFullScreen(!primaryStage.isFullScreen()); + } + }); + + // Show the Stage + primaryStage.show(); + } +} diff --git a/src/main/java/org/schafkopf/Schafkopf.java b/src/main/java/org/schafkopf/Schafkopf.java index 8026e32..8494250 100644 --- a/src/main/java/org/schafkopf/Schafkopf.java +++ b/src/main/java/org/schafkopf/Schafkopf.java @@ -1,5 +1,6 @@ package org.schafkopf; +import org.schafkopf.GameState.GamePhase; import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; @@ -26,13 +27,9 @@ public class Schafkopf { new BotPlayer(), new LocalPlayer(this), new LocalPlayer(this), new LocalPlayer(this) }; - private boolean gameState = false; + private GameState gameState = new GameState(GamePhase.GAME_STOP); private Thread spielThread; - public Player[] getPlayer() { - return player; - } - /** * Constructor for the Schafkopf class. * @@ -43,6 +40,10 @@ public class Schafkopf { System.out.println("SchaffKopfGame erstellt"); } + public Player[] getPlayer() { + return player; + } + /** Sends all Trumpf Karten of the current GameType to the Frontend. */ public void showTrumpf() { server.sendMessageToAllFrontendEndpoints(spiel.getTrumpfKarten().getJson()); @@ -69,7 +70,6 @@ public class Schafkopf { System.out.println("Ungültige Karte"); return wartetAufKarte(); } - server.sendMessageToAllFrontendEndpoints(karte.getJson()); System.out.println("Karte gescannt: " + karte.getName()); System.out.println("Beende Warten auf Karte"); return karte; @@ -77,22 +77,24 @@ public class Schafkopf { /** Set GameState to "started" and start Game Thread. */ public void startGame() { - if (gameState) { + if (gameState.getGamePhase() != GamePhase.GAME_STOP) { System.out.println("Game already started!"); server.sendMessageToAllFrontendEndpoints("Game already started!"); } else { - gameState = true; + gameState = new GameState(GamePhase.GAME_START); + setAndSendGameState(gameState); System.out.println("Start Game"); // KartenListe botHand = KartenUtil.zieheZufallsHand(8); KartenListe botHand = new KartenListe(); botHand.addKarten(Karte.EICHEL_7); - botHand.addKarten(Karte.EICHEL_8); - botHand.addKarten(Karte.EICHEL_9); - botHand.addKarten(Karte.EICHEL_K); + botHand.addKarten(Karte.SCHELL_7); + botHand.addKarten(Karte.BLATT_7); botHand.addKarten(Karte.EICHEL_X); - botHand.addKarten(Karte.EICHEL_A); + botHand.addKarten(Karte.HERZ_X); + botHand.addKarten(Karte.HERZ_7); + botHand.addKarten(Karte.EICHEL_U); botHand.addKarten(Karte.EICHEL_O); for (Player currentPlayer : player) { @@ -102,13 +104,6 @@ public class Schafkopf { } } - server.sendMessageToAllFrontendEndpoints("Start Game"); - server.sendMessageToAllFrontendEndpoints(botHand.getJson()); - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } spielThread = new Thread(() -> new Spielablauf(this, spiel)); spielThread.start(); @@ -117,13 +112,12 @@ public class Schafkopf { /** Set GameState to "stopped" and interrupt Game Thread. */ public void stopGame() { - if (!gameState) { + if (gameState.getGamePhase() == GamePhase.GAME_STOP) { System.out.println("no active Game!"); server.sendMessageToAllFrontendEndpoints("no active Game!"); } else { - gameState = false; - System.out.println("Stop Game"); - server.sendMessageToAllFrontendEndpoints("Stop Game"); + gameState = new GameState(GamePhase.GAME_STOP); + setAndSendGameState(gameState); } spielThread.interrupt(); @@ -188,7 +182,12 @@ public class Schafkopf { } } - public BackendServer getServer() { - return this.server; + public void setAndSendGameState(GameState gameState) { + this.gameState = gameState; + this.server.sendMessageToAllFrontendEndpoints(this.gameState.getJson()); + } + + public GameState getGameState() { + return this.gameState; } } diff --git a/src/main/java/org/schafkopf/Spielablauf.java b/src/main/java/org/schafkopf/Spielablauf.java index 677c653..97cd13f 100644 --- a/src/main/java/org/schafkopf/Spielablauf.java +++ b/src/main/java/org/schafkopf/Spielablauf.java @@ -1,5 +1,7 @@ package org.schafkopf; +import org.schafkopf.GameState.GamePhase; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenListe; import org.schafkopf.player.Player; import org.schafkopf.spielcontroller.SpielController; @@ -10,7 +12,7 @@ import org.slf4j.LoggerFactory; public class Spielablauf { private static final Logger logger = LoggerFactory.getLogger(Spielablauf.class); - private final KartenListe gespielteKarten; + private final KartenListe gespielteKarten = new KartenListe(); private final KartenListe tischKarten = new KartenListe(); @@ -20,56 +22,65 @@ public class Spielablauf { private final Schafkopf schafkopf; - private int gemachteStiche; - Spielablauf(Schafkopf schafkopf, SpielController spiel) { this.schafkopf = schafkopf; this.spiel = spiel; this.players = schafkopf.getPlayer(); - gespielteKarten = new KartenListe(); - gemachteStiche = 0; - try { - einStich(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + + playRound(); } - /** Method to Handle flow of one Game. */ - public void einStich() throws InterruptedException { + private void playRound() { + int startingPlayer = 0; + logger.info("Starte Stiche"); - int rauskommer = 0; - while (gemachteStiche < 8) { - schafkopf.getServer().sendMessageToAllFrontendEndpoints(gespielteKarten.getJson()); - logger.info("Stich: {}", gemachteStiche); - for (int i = 0; i < 4; i++) { - schafkopf.getServer().sendMessageToAllFrontendEndpoints(tischKarten.getJson()); - int nextPlayer = (i + rauskommer) % 4; - - logger.info("Spieler ist dran: {}", nextPlayer); - - tischKarten.addKarten(players[nextPlayer].play(spiel, tischKarten)); - schafkopf.getServer().sendMessageToAllFrontendEndpoints(tischKarten.getJson()); - } - schafkopf.getServer().sendMessageToAllFrontendEndpoints(tischKarten.getJson()); - int stichSpieler = SpielController.welcheKarteSticht(tischKarten); - - - - Thread.sleep(2000); - logger.info("Stiche ende"); - - rauskommer = (rauskommer + stichSpieler) % 4; - logger.warn("Karte sticht: {}", rauskommer); - //rauskommer = 0; - - gespielteKarten.addKarten(tischKarten); - - tischKarten.clear(); - - gemachteStiche++; + for (int i = 0; i < 8; i++) { + logger.info("Stich: {}", i); + startingPlayer = playTrick(startingPlayer); } - schafkopf.getServer().sendMessageToAllFrontendEndpoints(gespielteKarten.getJson()); schafkopf.stopGame(); } + + private int playTrick(int startingPlayer) { + schafkopf.setAndSendGameState(new GameState(GamePhase.TRICK_START)); + + for (int i = 0; i < 4; i++) { + int currentPlayer = (i + startingPlayer) % 4; + + logger.info("Spieler ist dran: {}", currentPlayer); + schafkopf.setAndSendGameState(new GameState(GamePhase.WAIT_FOR_CARD, currentPlayer)); + + Karte playedCard = players[currentPlayer].play(spiel, tischKarten, gespielteKarten); + tischKarten.addKarten(playedCard); + + schafkopf.setAndSendGameState( + new GameState( + GamePhase.PLAYER_CARD, + currentPlayer, + playedCard, + tischKarten.getByIndex(0).getFarbe(), + spiel.isTrumpf(tischKarten.getByIndex(0)))); + } + int stichSpieler = SpielController.welcheKarteSticht(tischKarten); + + logger.info("Stiche ende"); + + int winningPlayerIndex = (startingPlayer + stichSpieler) % 4; + logger.warn("Karte sticht: {}", winningPlayerIndex); + + schafkopf.setAndSendGameState( + new GameState( + GamePhase.PLAYER_TRICK, winningPlayerIndex, tischKarten.getByIndex(stichSpieler))); + + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + logger.error("error sleep"); + } + + gespielteKarten.addKarten(tischKarten); + tischKarten.clear(); + + return winningPlayerIndex; + } } diff --git a/src/main/java/org/schafkopf/cardreader/UsbCardReader.java b/src/main/java/org/schafkopf/cardreader/UsbCardReader.java index 217a530..b70beee 100644 --- a/src/main/java/org/schafkopf/cardreader/UsbCardReader.java +++ b/src/main/java/org/schafkopf/cardreader/UsbCardReader.java @@ -30,7 +30,7 @@ public class UsbCardReader extends CardReader { SerialPort selectedPort = null; for (SerialPort port : ports) { - if (port.getSystemPortName().equals("COM16")) { + if (port.getSystemPortName().equals("COM13")) { selectedPort = port; break; } diff --git a/src/main/java/org/schafkopf/karte/Karte.java b/src/main/java/org/schafkopf/karte/Karte.java index ef93bdf..c7de614 100644 --- a/src/main/java/org/schafkopf/karte/Karte.java +++ b/src/main/java/org/schafkopf/karte/Karte.java @@ -5,38 +5,40 @@ import com.google.gson.JsonObject; /** enum to represent all cards in the game. */ public enum Karte { - EICHEL_7(KartenFarbe.EICHEL, KartenSymbol.SEVEN), - EICHEL_8(KartenFarbe.EICHEL, KartenSymbol.EIGHT), - EICHEL_9(KartenFarbe.EICHEL, KartenSymbol.NINE), - EICHEL_X(KartenFarbe.EICHEL, KartenSymbol.TEN), - EICHEL_K(KartenFarbe.EICHEL, KartenSymbol.KOENIG), - EICHEL_A(KartenFarbe.EICHEL, KartenSymbol.ASS), - EICHEL_U(KartenFarbe.EICHEL, KartenSymbol.UNTER), - EICHEL_O(KartenFarbe.EICHEL, KartenSymbol.OBER), - BLATT_7(KartenFarbe.BLATT, KartenSymbol.SEVEN), - BLATT_8(KartenFarbe.BLATT, KartenSymbol.EIGHT), - BLATT_9(KartenFarbe.BLATT, KartenSymbol.NINE), - BLATT_X(KartenFarbe.BLATT, KartenSymbol.TEN), - BLATT_K(KartenFarbe.BLATT, KartenSymbol.KOENIG), - BLATT_A(KartenFarbe.BLATT, KartenSymbol.ASS), - BLATT_U(KartenFarbe.BLATT, KartenSymbol.UNTER), - BLATT_O(KartenFarbe.BLATT, KartenSymbol.OBER), SCHELL_7(KartenFarbe.SCHELL, KartenSymbol.SEVEN), SCHELL_8(KartenFarbe.SCHELL, KartenSymbol.EIGHT), SCHELL_9(KartenFarbe.SCHELL, KartenSymbol.NINE), - SCHELL_X(KartenFarbe.SCHELL, KartenSymbol.TEN), - SCHELL_K(KartenFarbe.SCHELL, KartenSymbol.KOENIG), - SCHELL_A(KartenFarbe.SCHELL, KartenSymbol.ASS), SCHELL_U(KartenFarbe.SCHELL, KartenSymbol.UNTER), SCHELL_O(KartenFarbe.SCHELL, KartenSymbol.OBER), + SCHELL_K(KartenFarbe.SCHELL, KartenSymbol.KOENIG), + SCHELL_X(KartenFarbe.SCHELL, KartenSymbol.TEN), + SCHELL_A(KartenFarbe.SCHELL, KartenSymbol.ASS), HERZ_7(KartenFarbe.HERZ, KartenSymbol.SEVEN), HERZ_8(KartenFarbe.HERZ, KartenSymbol.EIGHT), HERZ_9(KartenFarbe.HERZ, KartenSymbol.NINE), - HERZ_X(KartenFarbe.HERZ, KartenSymbol.TEN), - HERZ_K(KartenFarbe.HERZ, KartenSymbol.KOENIG), - HERZ_A(KartenFarbe.HERZ, KartenSymbol.ASS), HERZ_U(KartenFarbe.HERZ, KartenSymbol.UNTER), - HERZ_O(KartenFarbe.HERZ, KartenSymbol.OBER); + HERZ_O(KartenFarbe.HERZ, KartenSymbol.OBER), + HERZ_K(KartenFarbe.HERZ, KartenSymbol.KOENIG), + HERZ_X(KartenFarbe.HERZ, KartenSymbol.TEN), + HERZ_A(KartenFarbe.HERZ, KartenSymbol.ASS), + + BLATT_7(KartenFarbe.BLATT, KartenSymbol.SEVEN), + BLATT_8(KartenFarbe.BLATT, KartenSymbol.EIGHT), + BLATT_9(KartenFarbe.BLATT, KartenSymbol.NINE), + BLATT_U(KartenFarbe.BLATT, KartenSymbol.UNTER), + BLATT_O(KartenFarbe.BLATT, KartenSymbol.OBER), + BLATT_K(KartenFarbe.BLATT, KartenSymbol.KOENIG), + BLATT_X(KartenFarbe.BLATT, KartenSymbol.TEN), + BLATT_A(KartenFarbe.BLATT, KartenSymbol.ASS), + EICHEL_7(KartenFarbe.EICHEL, KartenSymbol.SEVEN), + EICHEL_8(KartenFarbe.EICHEL, KartenSymbol.EIGHT), + EICHEL_9(KartenFarbe.EICHEL, KartenSymbol.NINE), + EICHEL_U(KartenFarbe.EICHEL, KartenSymbol.UNTER), + EICHEL_O(KartenFarbe.EICHEL, KartenSymbol.OBER), + EICHEL_K(KartenFarbe.EICHEL, KartenSymbol.KOENIG), + EICHEL_X(KartenFarbe.EICHEL, KartenSymbol.TEN), + EICHEL_A(KartenFarbe.EICHEL, KartenSymbol.ASS); + private final String id; private final KartenFarbe farbe; diff --git a/src/main/java/org/schafkopf/karte/KartenListe.java b/src/main/java/org/schafkopf/karte/KartenListe.java index ba5008d..2970f21 100644 --- a/src/main/java/org/schafkopf/karte/KartenListe.java +++ b/src/main/java/org/schafkopf/karte/KartenListe.java @@ -121,7 +121,7 @@ public class KartenListe { /** * A Class that represents a list of Cards. */ - private boolean containsKarte(Karte karte) { + public boolean containsKarte(Karte karte) { for (Karte karteInListe : this.kartenListe) { if (karteInListe.getId().equals(karte.getId())) { return true; diff --git a/src/main/java/org/schafkopf/player/BotPlayer.java b/src/main/java/org/schafkopf/player/BotPlayer.java index 72e4b04..fa35c28 100644 --- a/src/main/java/org/schafkopf/player/BotPlayer.java +++ b/src/main/java/org/schafkopf/player/BotPlayer.java @@ -1,16 +1,11 @@ package org.schafkopf.player; import org.schafkopf.karte.Karte; -import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; -import org.schafkopf.karte.KartenSymbol; import org.schafkopf.karte.KartenUtil; -import org.schafkopf.spielcontroller.SauSpielController; import org.schafkopf.spielcontroller.SpielController; -/** - * Player that represents the Bot. - */ +/** Player that represents the Bot. */ public class BotPlayer extends Player { private KartenListe eigeneKarten; @@ -21,22 +16,23 @@ public class BotPlayer extends Player { } @Override - public Karte play(SpielController spiel, KartenListe tischKarten) { + public Karte play(SpielController spiel, KartenListe tischKarten, KartenListe gespielteKarten) { - Karte cardIndex = eigeneKarten.getByIndex(spiel.welcheKarteSpielIch(0, - eigeneKarten, - eigeneKarten, - tischKarten)); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } - eigeneKarten.removeKarten(cardIndex); + Karte card = spiel.welcheKarteSpielIch(true, gespielteKarten, eigeneKarten, tischKarten); + + eigeneKarten.removeKarten(card); System.out.println("Eigene Karte legen"); - return cardIndex; + return card; } - /** - * Set the Cards of the Player. - */ + /** Set the Cards of the Player. */ public void setCards(KartenListe cards) { System.out.println("Eigene Karte setzen"); this.eigeneKarten = cards; diff --git a/src/main/java/org/schafkopf/player/LocalPlayer.java b/src/main/java/org/schafkopf/player/LocalPlayer.java index 446da73..3933ddb 100644 --- a/src/main/java/org/schafkopf/player/LocalPlayer.java +++ b/src/main/java/org/schafkopf/player/LocalPlayer.java @@ -19,7 +19,7 @@ public class LocalPlayer extends Player { } @Override - public Karte play(SpielController spiel, KartenListe tischKarten) { + public Karte play(SpielController spiel, KartenListe tischKarten, KartenListe gespielteKarten) { return schafkopf.wartetAufKarte(); } } diff --git a/src/main/java/org/schafkopf/player/Player.java b/src/main/java/org/schafkopf/player/Player.java index 50f69e7..2d921f0 100644 --- a/src/main/java/org/schafkopf/player/Player.java +++ b/src/main/java/org/schafkopf/player/Player.java @@ -4,9 +4,8 @@ import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenListe; import org.schafkopf.spielcontroller.SpielController; -/** - * Class that represents one Player of the game. - */ +/** Class that represents one Player of the game. */ public abstract class Player { - public abstract Karte play(SpielController spiel, KartenListe tischKarten); + public abstract Karte play( + SpielController spiel, KartenListe tischKarten, KartenListe gespielteKarten); } diff --git a/src/main/java/org/schafkopf/spielcontroller/FarbGeierController.java b/src/main/java/org/schafkopf/spielcontroller/FarbGeierController.java index 2c410a4..0cdb3b5 100644 --- a/src/main/java/org/schafkopf/spielcontroller/FarbGeierController.java +++ b/src/main/java/org/schafkopf/spielcontroller/FarbGeierController.java @@ -1,13 +1,12 @@ package org.schafkopf.spielcontroller; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenSymbol; import org.schafkopf.karte.KartenUtil; -/** - * SpielController that implements Logic of a Farb Geier. - */ +/** SpielController that implements Logic of a Farb Geier. */ public class FarbGeierController extends SoloController { /** * Create instance of SpielController. @@ -27,9 +26,11 @@ public class FarbGeierController extends SoloController { this.farbKarten = new KartenListe(kartenList); } - public int welcheKarteSpielIch(int meinePosition, - KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { - return 0; + public Karte welcheKarteSpielIch( + boolean istSpieler, + KartenListe gespielteKarten, + KartenListe meineHand, + KartenListe tischKarten) { + return null; } - } diff --git a/src/main/java/org/schafkopf/spielcontroller/FarbSoloController.java b/src/main/java/org/schafkopf/spielcontroller/FarbSoloController.java index 690ec62..4eba882 100644 --- a/src/main/java/org/schafkopf/spielcontroller/FarbSoloController.java +++ b/src/main/java/org/schafkopf/spielcontroller/FarbSoloController.java @@ -6,9 +6,7 @@ import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenSymbol; import org.schafkopf.karte.KartenUtil; -/** - * SpielController that implements Logic of a Farb Solo. - */ +/** SpielController that implements Logic of a Farb Solo. */ public class FarbSoloController extends SoloController { /** * Create instance of SpielController. @@ -32,8 +30,11 @@ public class FarbSoloController extends SoloController { this.farbKarten = new KartenListe(kartenList); } - public int welcheKarteSpielIch(int meinePosition, - KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { - return 0; + public Karte welcheKarteSpielIch( + boolean istSpieler, + KartenListe gespielteKarten, + KartenListe meineHand, + KartenListe tischKarten) { + return null; } } diff --git a/src/main/java/org/schafkopf/spielcontroller/FarbWenzController.java b/src/main/java/org/schafkopf/spielcontroller/FarbWenzController.java index 0ff4c8c..50788c5 100644 --- a/src/main/java/org/schafkopf/spielcontroller/FarbWenzController.java +++ b/src/main/java/org/schafkopf/spielcontroller/FarbWenzController.java @@ -6,9 +6,7 @@ import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenSymbol; import org.schafkopf.karte.KartenUtil; -/** - * SpielController that implements Logic of a Farb Wenz. - */ +/** SpielController that implements Logic of a Farb Wenz. */ public class FarbWenzController extends SoloController { /** * Create instance of SpielController. @@ -28,8 +26,11 @@ public class FarbWenzController extends SoloController { this.farbKarten = new KartenListe(kartenList); } - public int welcheKarteSpielIch(int meinePosition, - KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { - return 0; + public Karte welcheKarteSpielIch( + boolean istSpieler, + KartenListe gespielteKarten, + KartenListe meineHand, + KartenListe tischKarten) { + return null; } } diff --git a/src/main/java/org/schafkopf/spielcontroller/GeierWenzController.java b/src/main/java/org/schafkopf/spielcontroller/GeierWenzController.java index 6a4586b..5003859 100644 --- a/src/main/java/org/schafkopf/spielcontroller/GeierWenzController.java +++ b/src/main/java/org/schafkopf/spielcontroller/GeierWenzController.java @@ -1,6 +1,5 @@ package org.schafkopf.spielcontroller; -import java.util.List; import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenListe; @@ -14,8 +13,8 @@ public class GeierWenzController extends SoloController { } @Override - public int welcheKarteSpielIch(int meinePosition, KartenListe gespielteKarten, + public Karte welcheKarteSpielIch(boolean istSpieler, KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { - return 0; + return null; } } diff --git a/src/main/java/org/schafkopf/spielcontroller/SauSpielController.java b/src/main/java/org/schafkopf/spielcontroller/SauSpielController.java index 20eb24e..a402257 100644 --- a/src/main/java/org/schafkopf/spielcontroller/SauSpielController.java +++ b/src/main/java/org/schafkopf/spielcontroller/SauSpielController.java @@ -1,66 +1,58 @@ package org.schafkopf.spielcontroller; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; -/** - * SpielController that implements Logic of a Sau Spiel Game. - */ +/** SpielController that implements Logic of a Sau Spiel Game. */ public class SauSpielController extends StandardController { KartenFarbe suchFarbe; - boolean istSpieler; - /** - * Class that represents one Card of the game. - */ + /** Class that represents one Card of the game. */ public SauSpielController(int activePlayer, KartenFarbe farbe) { super(activePlayer); - this.suchFarbe = suchFarbe; - this.istSpieler = istSpieler; + this.suchFarbe = farbe; } - /** - * choose witch Card should be played with the right Game logic. - */ - public int welcheKarteSpielIch(int meinePosition, - KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { + /** choose witch Card should be played with the right Game logic. */ + public Karte welcheKarteSpielIch( + boolean istSpieler, + KartenListe gespielteKarten, + KartenListe meineHand, + KartenListe tischKarten) { System.out.println("Ich spiele eine Karte Sauspiel"); int spielerNummer = tischKarten.size(); - if (istSpieler && tischKarten.getLast().getFarbe().equals(suchFarbe)) { - return farbeZugeben(meineHand, suchFarbe, 2); - } - switch (spielerNummer) { case 0: if (istSpieler) { - return meineHand.size() - 1; + return meineHand.getLast(); } else { - return 0; + return meineHand.getByIndex(0); } case 1: if (istSpieler) { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 2); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 2); } else { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 0); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 0); } case 2: if (istSpieler) { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 2); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 2); } else { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 0); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 0); } case 3: if (istSpieler) { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 2); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 2); } else { - return farbeZugeben(meineHand, tischKarten.getLast().getFarbe(), 0); + return farbeZugeben(meineHand, tischKarten.getByIndex(0), 0); } default: System.out.println("Ungültige SpielerNummer"); } - return 0; + return null; } } diff --git a/src/main/java/org/schafkopf/spielcontroller/SoloController.java b/src/main/java/org/schafkopf/spielcontroller/SoloController.java index 11ad24d..200d46c 100644 --- a/src/main/java/org/schafkopf/spielcontroller/SoloController.java +++ b/src/main/java/org/schafkopf/spielcontroller/SoloController.java @@ -1,5 +1,6 @@ package org.schafkopf.spielcontroller; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenListe; /** @@ -11,8 +12,8 @@ public abstract class SoloController extends SpielController { super(activePlayer); } - public int welcheKarteSpielIch( + public Karte welcheKarteSpielIch( KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten) { - return 0; + return null; } } diff --git a/src/main/java/org/schafkopf/spielcontroller/SpielController.java b/src/main/java/org/schafkopf/spielcontroller/SpielController.java index 24c6ed1..e43cf1e 100644 --- a/src/main/java/org/schafkopf/spielcontroller/SpielController.java +++ b/src/main/java/org/schafkopf/spielcontroller/SpielController.java @@ -1,5 +1,6 @@ package org.schafkopf.spielcontroller; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenUtil; @@ -19,40 +20,52 @@ public abstract class SpielController { * Create instance of SpielController. * * @param meineHand Cards one Player holds. - * @param farbe color the Player has to play. + * @param ersteKarte color the Player has to play. * @param mode Mode the player chooses a Card if multiple are available. */ - public static int farbeZugeben(KartenListe meineHand, KartenFarbe farbe, int mode) { - KartenListe farbKarten = meineHand.getKarten(farbe); - farbKarten.removeKarten(trumpfKarten); - if (farbKarten.size() == 1) { - return meineHand.indexOf(farbKarten.getByIndex(0)); + public static Karte farbeZugeben(KartenListe meineHand, Karte ersteKarte, int mode) { + KartenListe hand = new KartenListe(meineHand); + sortiereKarten(hand); + + boolean trumpfGespielt = trumpfKarten.containsKarte(ersteKarte); + + KartenListe handTrumpfKarten = hand.removeKarten(trumpfKarten); + KartenListe handfarbKarten; + + if (trumpfGespielt) { + handfarbKarten = handTrumpfKarten; + } else { + handfarbKarten = hand.getKarten(ersteKarte.getFarbe()); } - if (farbKarten.size() > 1) { + + if (handfarbKarten.size() == 1) { + return handfarbKarten.getByIndex(0); + } else if (handfarbKarten.size() > 1) { + return switch (mode) { + case 0 -> // Abspatzen + handfarbKarten.getByIndex(0); + case 1, 2 -> // Stechen // Schmieren + handfarbKarten.getLast(); + default -> null; + }; + } + if (handfarbKarten.isEmpty()) { switch (mode) { - case 0: - return 0; - case 1: - return meineHand.indexOf(farbKarten.getLast()); - case 2: - return meineHand.indexOf(farbKarten.getLast()); + case 0: // Abspatzen + return hand.getByIndex(0); + case 1: // Schmieren + return hand.getLast(); + case 2: // Stechen + if (!handTrumpfKarten.isEmpty()) { + return handTrumpfKarten.getLast(); // trumpf reinspielen + } else { + return hand.getByIndex(0); // wenn kein Trumpf und farblos, abschpatzen + } default: - return 0; + return null; } } - if (farbKarten.isEmpty()) { - switch (mode) { - case 0: - return 0; - case 1: - return 0; - case 2: - return meineHand.size() - 1; - default: - return 0; - } - } - return 0; + return null; } /** @@ -100,8 +113,8 @@ public abstract class SpielController { } } - public abstract int welcheKarteSpielIch( - int meinePosition, + public abstract Karte welcheKarteSpielIch( + boolean istSpieler, KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten); @@ -110,6 +123,10 @@ public abstract class SpielController { return trumpfKarten; } + public boolean isTrumpf(Karte card) { + return trumpfKarten.containsKarte(card); + } + public KartenListe getFarbKarten() { return farbKarten; } diff --git a/src/main/java/org/schafkopf/spielcontroller/StandardController.java b/src/main/java/org/schafkopf/spielcontroller/StandardController.java index 2358008..162c193 100644 --- a/src/main/java/org/schafkopf/spielcontroller/StandardController.java +++ b/src/main/java/org/schafkopf/spielcontroller/StandardController.java @@ -1,13 +1,12 @@ package org.schafkopf.spielcontroller; +import org.schafkopf.karte.Karte; import org.schafkopf.karte.KartenFarbe; import org.schafkopf.karte.KartenListe; import org.schafkopf.karte.KartenSymbol; import org.schafkopf.karte.KartenUtil; -/** - * SpielController that has the standard Card Deck for Sauspiel, Bettel und Co. - */ +/** SpielController that has the standard Card Deck for Sauspiel, Bettel und Co. */ public abstract class StandardController extends SpielController { StandardController(int activePlayer) { @@ -26,6 +25,9 @@ public abstract class StandardController extends SpielController { this.farbKarten = new KartenListe(kartenList); } - public abstract int welcheKarteSpielIch(int meinePosition, - KartenListe gespielteKarten, KartenListe meineHand, KartenListe tischKarten); + public abstract Karte welcheKarteSpielIch( + boolean istSpieler, + KartenListe gespielteKarten, + KartenListe meineHand, + KartenListe tischKarten); } diff --git a/src/main/resources/web-content/assets/blatt_6.png b/src/main/resources/web-content/assets/blatt_6.png new file mode 100644 index 0000000..87dbdfe Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_6.png differ diff --git a/src/main/resources/web-content/assets/blatt_7.png b/src/main/resources/web-content/assets/blatt_7.png new file mode 100644 index 0000000..f6f4b29 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_7.png differ diff --git a/src/main/resources/web-content/assets/blatt_8.png b/src/main/resources/web-content/assets/blatt_8.png new file mode 100644 index 0000000..4d5c938 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_8.png differ diff --git a/src/main/resources/web-content/assets/blatt_9.png b/src/main/resources/web-content/assets/blatt_9.png new file mode 100644 index 0000000..6ed0acf Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_9.png differ diff --git a/src/main/resources/web-content/assets/blatt_a.png b/src/main/resources/web-content/assets/blatt_a.png new file mode 100644 index 0000000..eaed16b Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_a.png differ diff --git a/src/main/resources/web-content/assets/blatt_k.png b/src/main/resources/web-content/assets/blatt_k.png new file mode 100644 index 0000000..23008a3 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_k.png differ diff --git a/src/main/resources/web-content/assets/blatt_o.png b/src/main/resources/web-content/assets/blatt_o.png new file mode 100644 index 0000000..eba2296 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_o.png differ diff --git a/src/main/resources/web-content/assets/blatt_u.png b/src/main/resources/web-content/assets/blatt_u.png new file mode 100644 index 0000000..17b9d91 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_u.png differ diff --git a/src/main/resources/web-content/assets/blatt_x.png b/src/main/resources/web-content/assets/blatt_x.png new file mode 100644 index 0000000..c356615 Binary files /dev/null and b/src/main/resources/web-content/assets/blatt_x.png differ diff --git a/src/main/resources/web-content/assets/card_back.png b/src/main/resources/web-content/assets/card_back.png new file mode 100644 index 0000000..a98948b Binary files /dev/null and b/src/main/resources/web-content/assets/card_back.png differ diff --git a/src/main/resources/web-content/assets/eichel_6.png b/src/main/resources/web-content/assets/eichel_6.png new file mode 100644 index 0000000..01a5ef1 Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_6.png differ diff --git a/src/main/resources/web-content/assets/eichel_7.png b/src/main/resources/web-content/assets/eichel_7.png new file mode 100644 index 0000000..3d9635b Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_7.png differ diff --git a/src/main/resources/web-content/assets/eichel_8.png b/src/main/resources/web-content/assets/eichel_8.png new file mode 100644 index 0000000..4b6ba4f Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_8.png differ diff --git a/src/main/resources/web-content/assets/eichel_9.png b/src/main/resources/web-content/assets/eichel_9.png new file mode 100644 index 0000000..791f03c Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_9.png differ diff --git a/src/main/resources/web-content/assets/eichel_a.png b/src/main/resources/web-content/assets/eichel_a.png new file mode 100644 index 0000000..9045e5b Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_a.png differ diff --git a/src/main/resources/web-content/assets/eichel_k.png b/src/main/resources/web-content/assets/eichel_k.png new file mode 100644 index 0000000..1f1b90c Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_k.png differ diff --git a/src/main/resources/web-content/assets/eichel_o.png b/src/main/resources/web-content/assets/eichel_o.png new file mode 100644 index 0000000..198db82 Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_o.png differ diff --git a/src/main/resources/web-content/assets/eichel_u.png b/src/main/resources/web-content/assets/eichel_u.png new file mode 100644 index 0000000..77a2bb9 Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_u.png differ diff --git a/src/main/resources/web-content/assets/eichel_x.png b/src/main/resources/web-content/assets/eichel_x.png new file mode 100644 index 0000000..8566280 Binary files /dev/null and b/src/main/resources/web-content/assets/eichel_x.png differ diff --git a/src/main/resources/web-content/assets/herz_6.png b/src/main/resources/web-content/assets/herz_6.png new file mode 100644 index 0000000..3e6135a Binary files /dev/null and b/src/main/resources/web-content/assets/herz_6.png differ diff --git a/src/main/resources/web-content/assets/herz_7.png b/src/main/resources/web-content/assets/herz_7.png new file mode 100644 index 0000000..5d6b0bb Binary files /dev/null and b/src/main/resources/web-content/assets/herz_7.png differ diff --git a/src/main/resources/web-content/assets/herz_8.png b/src/main/resources/web-content/assets/herz_8.png new file mode 100644 index 0000000..c564577 Binary files /dev/null and b/src/main/resources/web-content/assets/herz_8.png differ diff --git a/src/main/resources/web-content/assets/herz_9.png b/src/main/resources/web-content/assets/herz_9.png new file mode 100644 index 0000000..35d955a Binary files /dev/null and b/src/main/resources/web-content/assets/herz_9.png differ diff --git a/src/main/resources/web-content/assets/herz_a.png b/src/main/resources/web-content/assets/herz_a.png new file mode 100644 index 0000000..14f50da Binary files /dev/null and b/src/main/resources/web-content/assets/herz_a.png differ diff --git a/src/main/resources/web-content/assets/herz_k.png b/src/main/resources/web-content/assets/herz_k.png new file mode 100644 index 0000000..d0a4191 Binary files /dev/null and b/src/main/resources/web-content/assets/herz_k.png differ diff --git a/src/main/resources/web-content/assets/herz_o.png b/src/main/resources/web-content/assets/herz_o.png new file mode 100644 index 0000000..49e6358 Binary files /dev/null and b/src/main/resources/web-content/assets/herz_o.png differ diff --git a/src/main/resources/web-content/assets/herz_u.png b/src/main/resources/web-content/assets/herz_u.png new file mode 100644 index 0000000..6af0b88 Binary files /dev/null and b/src/main/resources/web-content/assets/herz_u.png differ diff --git a/src/main/resources/web-content/assets/herz_x.png b/src/main/resources/web-content/assets/herz_x.png new file mode 100644 index 0000000..2cce721 Binary files /dev/null and b/src/main/resources/web-content/assets/herz_x.png differ diff --git a/src/main/resources/web-content/assets/index-08f560d4.css b/src/main/resources/web-content/assets/index-08f560d4.css new file mode 100644 index 0000000..aba0a3f --- /dev/null +++ b/src/main/resources/web-content/assets/index-08f560d4.css @@ -0,0 +1 @@ +*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.absolute{position:absolute}.\!left-1\/2{left:50%!important}.\!top-1\/2{top:50%!important}.bottom-0{bottom:0}.left-0{left:0}.top-1\/2{top:50%}.top-52{top:13rem}.top-64{top:16rem}.\!z-10{z-index:10!important}.mx-auto{margin-left:auto;margin-right:auto}.flex{display:flex}.grid{display:grid}.h-\[48rem\]{height:48rem}.h-full{height:100%}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\!scale-105{--tw-scale-x: 1.05 !important;--tw-scale-y: 1.05 !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.place-content-center{place-content:center}.justify-center{justify-content:center}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.overflow-hidden{overflow:hidden}.rounded-2xl,.rounded-\[1rem\]{border-radius:1rem}.rounded-\[2rem\]{border-radius:2rem}.rounded-xl{border-radius:.75rem}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.text-center{text-align:center}.text-6xl{font-size:3.75rem;line-height:1}.font-bold{font-weight:700}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.v-button{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity));padding:.5rem 1rem;font-weight:700;--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.v-button:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity))}.card.xl{height:48rem}.card.xl img{border-radius:2rem}.card.md{height:24rem}.card.md img{border-radius:1rem}.card.sm{height:16rem}.card.sm img{border-radius:.75rem}.card0,.card1{z-index:1;top:50%;left:50%;transform:translate(-50%,-50%)}.card2{z-index:2;top:calc(50% + 2.4rem);left:calc(50% - 7.2rem);transform:rotate(50deg) translate(-50%,-50%)}.card3{z-index:3;top:calc(50% - 3rem);left:calc(50% + 8.4rem);transform:rotate(-30deg) translate(-50%,-50%)}.card4{z-index:4;top:calc(50% - 9.6rem);left:calc(50% + 8.4rem);transform:rotate(-60deg) translate(-50%,-50%)} diff --git a/src/main/resources/web-content/assets/index-6278b98f.js b/src/main/resources/web-content/assets/index-6278b98f.js new file mode 100644 index 0000000..e1861e0 --- /dev/null +++ b/src/main/resources/web-content/assets/index-6278b98f.js @@ -0,0 +1,17 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))s(r);new MutationObserver(r=>{for(const o of r)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&s(l)}).observe(document,{childList:!0,subtree:!0});function n(r){const o={};return r.integrity&&(o.integrity=r.integrity),r.referrerPolicy&&(o.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?o.credentials="include":r.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(r){if(r.ep)return;r.ep=!0;const o=n(r);fetch(r.href,o)}})();/** +* @vue/shared v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Sn(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const W={},Xe=[],le=()=>{},Or=()=>!1,Ut=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),wn=e=>e.startsWith("onUpdate:"),Y=Object.assign,An=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Ir=Object.prototype.hasOwnProperty,M=(e,t)=>Ir.call(e,t),R=Array.isArray,Qe=e=>Dt(e)==="[object Map]",Ls=e=>Dt(e)==="[object Set]",O=e=>typeof e=="function",Z=e=>typeof e=="string",ot=e=>typeof e=="symbol",k=e=>e!==null&&typeof e=="object",Rs=e=>(k(e)||O(e))&&O(e.then)&&O(e.catch),Os=Object.prototype.toString,Dt=e=>Os.call(e),Pr=e=>Dt(e).slice(8,-1),Is=e=>Dt(e)==="[object Object]",Ln=e=>Z(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,at=Sn(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Vt=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Hr=/-(\w)/g,nt=Vt(e=>e.replace(Hr,(t,n)=>n?n.toUpperCase():"")),Mr=/\B([A-Z])/g,lt=Vt(e=>e.replace(Mr,"-$1").toLowerCase()),Ps=Vt(e=>e.charAt(0).toUpperCase()+e.slice(1)),sn=Vt(e=>e?`on${Ps(e)}`:""),He=(e,t)=>!Object.is(e,t),rn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Fr=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Yn;const Hs=()=>Yn||(Yn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Rn(e){if(R(e)){const t={};for(let n=0;n{if(n){const s=n.split(Nr);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Wt(e){let t="";if(Z(e))t=e;else if(R(e))for(let n=0;nZ(e)?e:e==null?"":R(e)||k(e)&&(e.toString===Os||!O(e.toString))?JSON.stringify(e,Fs,2):String(e),Fs=(e,t)=>t&&t.__v_isRef?Fs(e,t.value):Qe(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],o)=>(n[ln(s,o)+" =>"]=r,n),{})}:Ls(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>ln(n))}:ot(t)?ln(t):k(t)&&!R(t)&&!Is(t)?String(t):t,ln=(e,t="")=>{var n;return ot(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let fe;class Dr{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=fe,!t&&fe&&(this.index=(fe.scopes||(fe.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=fe;try{return fe=this,t()}finally{fe=n}}}on(){fe=this}off(){fe=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),ke()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Ie,n=De;try{return Ie=!0,De=this,this._runnings++,Jn(this),this.fn()}finally{Xn(this),this._runnings--,De=n,Ie=t}}stop(){var t;this.active&&(Jn(this),Xn(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function zr(e){return e.value}function Jn(e){e._trackId++,e._depsLength=0}function Xn(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},_n=new WeakMap,Ve=Symbol(""),mn=Symbol("");function se(e,t,n){if(Ie&&De){let s=_n.get(e);s||_n.set(e,s=new Map);let r=s.get(n);r||s.set(n,r=js(()=>s.delete(n))),Bs(De,r)}}function Ce(e,t,n,s,r,o){const l=_n.get(e);if(!l)return;let c=[];if(t==="clear")c=[...l.values()];else if(n==="length"&&R(e)){const u=Number(s);l.forEach((d,h)=>{(h==="length"||!ot(h)&&h>=u)&&c.push(d)})}else switch(n!==void 0&&c.push(l.get(n)),t){case"add":R(e)?Ln(n)&&c.push(l.get("length")):(c.push(l.get(Ve)),Qe(e)&&c.push(l.get(mn)));break;case"delete":R(e)||(c.push(l.get(Ve)),Qe(e)&&c.push(l.get(mn)));break;case"set":Qe(e)&&c.push(l.get(Ve));break}In();for(const u of c)u&&Ks(u,4);Pn()}const kr=Sn("__proto__,__v_isRef,__isVue"),Us=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(ot)),Qn=Zr();function Zr(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=B(this);for(let o=0,l=this.length;o{e[t]=function(...n){ze(),In();const s=B(this)[t].apply(this,n);return Pn(),ke(),s}}),e}function Gr(e){const t=B(this);return se(t,"has",e),t.hasOwnProperty(e)}class Ds{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){const r=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw")return s===(r?o?io:ks:o?zs:Ws).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const l=R(t);if(!r){if(l&&M(Qn,n))return Reflect.get(Qn,n,s);if(n==="hasOwnProperty")return Gr}const c=Reflect.get(t,n,s);return(ot(n)?Us.has(n):kr(n))||(r||se(t,"get",n),o)?c:re(c)?l&&Ln(n)?c:c.value:k(c)?r?Zs(c):Fn(c):c}}class Vs extends Ds{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];if(!this._isShallow){const u=st(o);if(!Nt(s)&&!st(s)&&(o=B(o),s=B(s)),!R(t)&&re(o)&&!re(s))return u?!1:(o.value=s,!0)}const l=R(t)&&Ln(n)?Number(n)e,zt=e=>Reflect.getPrototypeOf(e);function Tt(e,t,n=!1,s=!1){e=e.__v_raw;const r=B(e),o=B(t);n||(He(t,o)&&se(r,"get",t),se(r,"get",o));const{has:l}=zt(r),c=s?Hn:n?Nn:gt;if(l.call(r,t))return c(e.get(t));if(l.call(r,o))return c(e.get(o));e!==r&&e.get(t)}function St(e,t=!1){const n=this.__v_raw,s=B(n),r=B(e);return t||(He(e,r)&&se(s,"has",e),se(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function wt(e,t=!1){return e=e.__v_raw,!t&&se(B(e),"iterate",Ve),Reflect.get(e,"size",e)}function es(e){e=B(e);const t=B(this);return zt(t).has.call(t,e)||(t.add(e),Ce(t,"add",e,e)),this}function ts(e,t){t=B(t);const n=B(this),{has:s,get:r}=zt(n);let o=s.call(n,e);o||(e=B(e),o=s.call(n,e));const l=r.call(n,e);return n.set(e,t),o?He(t,l)&&Ce(n,"set",e,t):Ce(n,"add",e,t),this}function ns(e){const t=B(this),{has:n,get:s}=zt(t);let r=n.call(t,e);r||(e=B(e),r=n.call(t,e)),s&&s.call(t,e);const o=t.delete(e);return r&&Ce(t,"delete",e,void 0),o}function ss(){const e=B(this),t=e.size!==0,n=e.clear();return t&&Ce(e,"clear",void 0,void 0),n}function At(e,t){return function(s,r){const o=this,l=o.__v_raw,c=B(l),u=t?Hn:e?Nn:gt;return!e&&se(c,"iterate",Ve),l.forEach((d,h)=>s.call(r,u(d),u(h),o))}}function Lt(e,t,n){return function(...s){const r=this.__v_raw,o=B(r),l=Qe(o),c=e==="entries"||e===Symbol.iterator&&l,u=e==="keys"&&l,d=r[e](...s),h=n?Hn:t?Nn:gt;return!t&&se(o,"iterate",u?mn:Ve),{next(){const{value:y,done:T}=d.next();return T?{value:y,done:T}:{value:c?[h(y[0]),h(y[1])]:h(y),done:T}},[Symbol.iterator](){return this}}}}function we(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Qr(){const e={get(o){return Tt(this,o)},get size(){return wt(this)},has:St,add:es,set:ts,delete:ns,clear:ss,forEach:At(!1,!1)},t={get(o){return Tt(this,o,!1,!0)},get size(){return wt(this)},has:St,add:es,set:ts,delete:ns,clear:ss,forEach:At(!1,!0)},n={get(o){return Tt(this,o,!0)},get size(){return wt(this,!0)},has(o){return St.call(this,o,!0)},add:we("add"),set:we("set"),delete:we("delete"),clear:we("clear"),forEach:At(!0,!1)},s={get(o){return Tt(this,o,!0,!0)},get size(){return wt(this,!0)},has(o){return St.call(this,o,!0)},add:we("add"),set:we("set"),delete:we("delete"),clear:we("clear"),forEach:At(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Lt(o,!1,!1),n[o]=Lt(o,!0,!1),t[o]=Lt(o,!1,!0),s[o]=Lt(o,!0,!0)}),[e,n,t,s]}const[eo,to,no,so]=Qr();function Mn(e,t){const n=t?e?so:no:e?to:eo;return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(M(n,r)&&r in s?n:s,r,o)}const ro={get:Mn(!1,!1)},oo={get:Mn(!1,!0)},lo={get:Mn(!0,!1)},Ws=new WeakMap,zs=new WeakMap,ks=new WeakMap,io=new WeakMap;function co(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function fo(e){return e.__v_skip||!Object.isExtensible(e)?0:co(Pr(e))}function Fn(e){return st(e)?e:$n(e,!1,Yr,ro,Ws)}function uo(e){return $n(e,!1,Xr,oo,zs)}function Zs(e){return $n(e,!0,Jr,lo,ks)}function $n(e,t,n,s,r){if(!k(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=r.get(e);if(o)return o;const l=fo(e);if(l===0)return e;const c=new Proxy(e,l===2?s:n);return r.set(e,c),c}function et(e){return st(e)?et(e.__v_raw):!!(e&&e.__v_isReactive)}function st(e){return!!(e&&e.__v_isReadonly)}function Nt(e){return!!(e&&e.__v_isShallow)}function Gs(e){return et(e)||st(e)}function B(e){const t=e&&e.__v_raw;return t?B(t):e}function qs(e){return Object.isExtensible(e)&&$t(e,"__v_skip",!0),e}const gt=e=>k(e)?Fn(e):e,Nn=e=>k(e)?Zs(e):e;class Ys{constructor(t,n,s,r){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new On(()=>t(this._value),()=>Ot(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=B(this);return(!t._cacheable||t.effect.dirty)&&He(t._value,t._value=t.effect.run())&&Ot(t,4),Js(t),t.effect._dirtyLevel>=2&&Ot(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function ao(e,t,n=!1){let s,r;const o=O(e);return o?(s=e,r=le):(s=e.get,r=e.set),new Ys(s,r,o||!r,n)}function Js(e){var t;Ie&&De&&(e=B(e),Bs(De,(t=e.dep)!=null?t:e.dep=js(()=>e.dep=void 0,e instanceof Ys?e:void 0)))}function Ot(e,t=4,n){e=B(e);const s=e.dep;s&&Ks(s,t)}function re(e){return!!(e&&e.__v_isRef===!0)}function me(e){return ho(e,!1)}function ho(e,t){return re(e)?e:new po(e,t)}class po{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:B(t),this._value=n?t:gt(t)}get value(){return Js(this),this._value}set value(t){const n=this.__v_isShallow||Nt(t)||st(t);t=n?t:B(t),He(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:gt(t),Ot(this,4))}}function Xs(e){return re(e)?e.value:e}const go={get:(e,t,n)=>Xs(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return re(r)&&!re(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Qs(e){return et(e)?e:new Proxy(e,go)}/** +* @vue/runtime-core v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Pe(e,t,n,s){try{return s?e(...s):e()}catch(r){kt(r,t,n)}}function de(e,t,n,s){if(O(e)){const o=Pe(e,t,n,s);return o&&Rs(o)&&o.catch(l=>{kt(l,t,n)}),o}const r=[];for(let o=0;o>>1,r=J[s],o=mt(r);ove&&J.splice(t,1)}function yo(e){R(e)?tt.push(...e):(!Le||!Le.includes(e,e.allowRecurse?Ue+1:Ue))&&tt.push(e),tr()}function rs(e,t,n=_t?ve+1:0){for(;nmt(n)-mt(s));if(tt.length=0,Le){Le.push(...t);return}for(Le=t,Ue=0;Uee.id==null?1/0:e.id,Eo=(e,t)=>{const n=mt(e)-mt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function sr(e){bn=!1,_t=!0,J.sort(Eo);const t=le;try{for(ve=0;veZ(S)?S.trim():S)),y&&(r=n.map(Fr))}let c,u=s[c=sn(t)]||s[c=sn(nt(t))];!u&&o&&(u=s[c=sn(lt(t))]),u&&de(u,e,6,r);const d=s[c+"Once"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,de(d,e,6,r)}}function rr(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let l={},c=!1;if(!O(e)){const u=d=>{const h=rr(d,t,!0);h&&(c=!0,Y(l,h))};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!o&&!c?(k(e)&&s.set(e,null),null):(R(o)?o.forEach(u=>l[u]=null):Y(l,o),k(e)&&s.set(e,l),l)}function Zt(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),M(e,t[0].toLowerCase()+t.slice(1))||M(e,lt(t))||M(e,t))}let ye=null,or=null;function Bt(e){const t=ye;return ye=e,or=e&&e.type.__scopeId||null,t}function Co(e,t=ye,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&gs(-1);const o=Bt(t);let l;try{l=e(...r)}finally{Bt(o),s._d&&gs(1)}return l};return s._n=!0,s._c=!0,s._d=!0,s}function cn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:o,propsOptions:[l],slots:c,attrs:u,emit:d,render:h,renderCache:y,data:T,setupState:S,ctx:j,inheritAttrs:$}=e;let I,C;const H=Bt(e);try{if(n.shapeFlag&4){const G=r||s,ie=G;I=be(h.call(ie,G,y,o,S,T,j)),C=u}else{const G=t;I=be(G.length>1?G(o,{attrs:u,slots:c,emit:d}):G(o,null)),C=t.props?u:To(u)}}catch(G){pt.length=0,kt(G,e,1),I=Te(We)}let U=I;if(C&&$!==!1){const G=Object.keys(C),{shapeFlag:ie}=U;G.length&&ie&7&&(l&&G.some(wn)&&(C=So(C,l)),U=rt(U,C))}return n.dirs&&(U=rt(U),U.dirs=U.dirs?U.dirs.concat(n.dirs):n.dirs),n.transition&&(U.transition=n.transition),I=U,Bt(H),I}const To=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},So=(e,t)=>{const n={};for(const s in e)(!wn(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function wo(e,t,n){const{props:s,children:r,component:o}=e,{props:l,children:c,patchFlag:u}=t,d=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&u>=0){if(u&1024)return!0;if(u&16)return s?os(s,l,d):!!l;if(u&8){const h=t.dynamicProps;for(let y=0;ye.__isSuspense;function Oo(e,t){t&&t.pendingBranch?R(e)?t.effects.push(...e):t.effects.push(e):yo(e)}const Io=Symbol.for("v-scx"),Po=()=>Ht(Io),Rt={};function It(e,t,n){return lr(e,t,n)}function lr(e,t,{immediate:n,deep:s,flush:r,once:o,onTrack:l,onTrigger:c}=W){if(t&&o){const N=t;t=(...Ee)=>{N(...Ee),ie()}}const u=te,d=N=>s===!0?N:Je(N,s===!1?1:void 0);let h,y=!1,T=!1;if(re(e)?(h=()=>e.value,y=Nt(e)):et(e)?(h=()=>d(e),y=!0):R(e)?(T=!0,y=e.some(N=>et(N)||Nt(N)),h=()=>e.map(N=>{if(re(N))return N.value;if(et(N))return d(N);if(O(N))return Pe(N,u,2)})):O(e)?t?h=()=>Pe(e,u,2):h=()=>(S&&S(),de(e,u,3,[j])):h=le,t&&s){const N=h;h=()=>Je(N())}let S,j=N=>{S=U.onStop=()=>{Pe(N,u,4),S=U.onStop=void 0}},$;if(Jt)if(j=le,t?n&&de(t,u,3,[h(),T?[]:void 0,j]):h(),r==="sync"){const N=Po();$=N.__watcherHandles||(N.__watcherHandles=[])}else return le;let I=T?new Array(e.length).fill(Rt):Rt;const C=()=>{if(!(!U.active||!U.dirty))if(t){const N=U.run();(s||y||(T?N.some((Ee,he)=>He(Ee,I[he])):He(N,I)))&&(S&&S(),de(t,u,3,[N,I===Rt?void 0:T&&I[0]===Rt?[]:I,j]),I=N)}else U.run()};C.allowRecurse=!!t;let H;r==="sync"?H=C:r==="post"?H=()=>ne(C,u&&u.suspense):(C.pre=!0,u&&(C.id=u.uid),H=()=>Kn(C));const U=new On(h,le,H),G=Wr(),ie=()=>{U.stop(),G&&An(G.effects,U)};return t?n?C():I=U.run():r==="post"?ne(U.run.bind(U),u&&u.suspense):U.run(),$&&$.push(ie),ie}function Ho(e,t,n){const s=this.proxy,r=Z(e)?e.includes(".")?ir(s,e):()=>s[e]:e.bind(s,s);let o;O(t)?o=t:(o=t.handler,n=t);const l=vt(this),c=lr(r,o.bind(s),n);return l(),c}function ir(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),re(e))Je(e.value,t,n,s);else if(R(e))for(let r=0;r{Je(r,t,n,s)});else if(Is(e))for(const r in e)Je(e[r],t,n,s);return e}function Ne(e,t,n,s){const r=e.dirs,o=t&&t.dirs;for(let l=0;lY({name:e.name},t,{setup:e}))():e}const Pt=e=>!!e.type.__asyncLoader,fr=e=>e.type.__isKeepAlive;function Mo(e,t){ur(e,"a",t)}function Fo(e,t){ur(e,"da",t)}function ur(e,t,n=te){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Gt(t,s,n),n){let r=n.parent;for(;r&&r.parent;)fr(r.parent.vnode)&&$o(s,t,n,r),r=r.parent}}function $o(e,t,n,s){const r=Gt(t,e,s,!0);hr(()=>{An(s[t],r)},n)}function Gt(e,t,n=te,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...l)=>{if(n.isUnmounted)return;ze();const c=vt(n),u=de(t,n,e,l);return c(),ke(),u});return s?r.unshift(o):r.push(o),o}}const Se=e=>(t,n=te)=>(!Jt||e==="sp")&&Gt(e,(...s)=>t(...s),n),ar=Se("bm"),dr=Se("m"),No=Se("bu"),Bo=Se("u"),Ko=Se("bum"),hr=Se("um"),jo=Se("sp"),Uo=Se("rtg"),Do=Se("rtc");function Vo(e,t=te){Gt("ec",e,t)}function ls(e,t,n,s){let r;const o=n&&n[s];if(R(e)||Z(e)){r=new Array(e.length);for(let l=0,c=e.length;lt(l,c,void 0,o&&o[c]));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;ce?Sr(e)?Vn(e)||e.proxy:vn(e.parent):null,dt=Y(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>vn(e.parent),$root:e=>vn(e.root),$emit:e=>e.emit,$options:e=>jn(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Kn(e.update)}),$nextTick:e=>e.n||(e.n=mo.bind(e.proxy)),$watch:e=>Ho.bind(e)}),fn=(e,t)=>e!==W&&!e.__isScriptSetup&&M(e,t),Wo={get({_:e},t){const{ctx:n,setupState:s,data:r,props:o,accessCache:l,type:c,appContext:u}=e;let d;if(t[0]!=="$"){const S=l[t];if(S!==void 0)switch(S){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(fn(s,t))return l[t]=1,s[t];if(r!==W&&M(r,t))return l[t]=2,r[t];if((d=e.propsOptions[0])&&M(d,t))return l[t]=3,o[t];if(n!==W&&M(n,t))return l[t]=4,n[t];yn&&(l[t]=0)}}const h=dt[t];let y,T;if(h)return t==="$attrs"&&se(e,"get",t),h(e);if((y=c.__cssModules)&&(y=y[t]))return y;if(n!==W&&M(n,t))return l[t]=4,n[t];if(T=u.config.globalProperties,M(T,t))return T[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return fn(r,t)?(r[t]=n,!0):s!==W&&M(s,t)?(s[t]=n,!0):M(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:o}},l){let c;return!!n[l]||e!==W&&M(e,l)||fn(t,l)||(c=o[0])&&M(c,l)||M(s,l)||M(dt,l)||M(r.config.globalProperties,l)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:M(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function is(e){return R(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let yn=!0;function zo(e){const t=jn(e),n=e.proxy,s=e.ctx;yn=!1,t.beforeCreate&&cs(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:l,watch:c,provide:u,inject:d,created:h,beforeMount:y,mounted:T,beforeUpdate:S,updated:j,activated:$,deactivated:I,beforeDestroy:C,beforeUnmount:H,destroyed:U,unmounted:G,render:ie,renderTracked:N,renderTriggered:Ee,errorCaptured:he,serverPrefetch:Xt,expose:Me,inheritAttrs:it,components:yt,directives:Et,filters:Qt}=t;if(d&&ko(d,s,null),l)for(const z in l){const D=l[z];O(D)&&(s[z]=D.bind(n))}if(r){const z=r.call(n,n);k(z)&&(e.data=Fn(z))}if(yn=!0,o)for(const z in o){const D=o[z],Fe=O(D)?D.bind(n,n):O(D.get)?D.get.bind(n,n):le,xt=!O(D)&&O(D.set)?D.set.bind(n):le,$e=Cl({get:Fe,set:xt});Object.defineProperty(s,z,{enumerable:!0,configurable:!0,get:()=>$e.value,set:pe=>$e.value=pe})}if(c)for(const z in c)pr(c[z],s,n,z);if(u){const z=O(u)?u.call(n):u;Reflect.ownKeys(z).forEach(D=>{Xo(D,z[D])})}h&&cs(h,e,"c");function X(z,D){R(D)?D.forEach(Fe=>z(Fe.bind(n))):D&&z(D.bind(n))}if(X(ar,y),X(dr,T),X(No,S),X(Bo,j),X(Mo,$),X(Fo,I),X(Vo,he),X(Do,N),X(Uo,Ee),X(Ko,H),X(hr,G),X(jo,Xt),R(Me))if(Me.length){const z=e.exposed||(e.exposed={});Me.forEach(D=>{Object.defineProperty(z,D,{get:()=>n[D],set:Fe=>n[D]=Fe})})}else e.exposed||(e.exposed={});ie&&e.render===le&&(e.render=ie),it!=null&&(e.inheritAttrs=it),yt&&(e.components=yt),Et&&(e.directives=Et)}function ko(e,t,n=le){R(e)&&(e=En(e));for(const s in e){const r=e[s];let o;k(r)?"default"in r?o=Ht(r.from||s,r.default,!0):o=Ht(r.from||s):o=Ht(r),re(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):t[s]=o}}function cs(e,t,n){de(R(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function pr(e,t,n,s){const r=s.includes(".")?ir(n,s):()=>n[s];if(Z(e)){const o=t[e];O(o)&&It(r,o)}else if(O(e))It(r,e.bind(n));else if(k(e))if(R(e))e.forEach(o=>pr(o,t,n,s));else{const o=O(e.handler)?e.handler.bind(n):t[e.handler];O(o)&&It(r,o,e)}}function jn(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:l}}=e.appContext,c=o.get(t);let u;return c?u=c:!r.length&&!n&&!s?u=t:(u={},r.length&&r.forEach(d=>Kt(u,d,l,!0)),Kt(u,t,l)),k(t)&&o.set(t,u),u}function Kt(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&Kt(e,o,n,!0),r&&r.forEach(l=>Kt(e,l,n,!0));for(const l in t)if(!(s&&l==="expose")){const c=Zo[l]||n&&n[l];e[l]=c?c(e[l],t[l]):t[l]}return e}const Zo={data:fs,props:us,emits:us,methods:ut,computed:ut,beforeCreate:Q,created:Q,beforeMount:Q,mounted:Q,beforeUpdate:Q,updated:Q,beforeDestroy:Q,beforeUnmount:Q,destroyed:Q,unmounted:Q,activated:Q,deactivated:Q,errorCaptured:Q,serverPrefetch:Q,components:ut,directives:ut,watch:qo,provide:fs,inject:Go};function fs(e,t){return t?e?function(){return Y(O(e)?e.call(this,this):e,O(t)?t.call(this,this):t)}:t:e}function Go(e,t){return ut(En(e),En(t))}function En(e){if(R(e)){const t={};for(let n=0;n1)return n&&O(t)?t.call(s&&s.proxy):t}}function Qo(e,t,n,s=!1){const r={},o={};$t(o,Yt,1),e.propsDefaults=Object.create(null),_r(e,t,r,o);for(const l in e.propsOptions[0])l in r||(r[l]=void 0);n?e.props=s?r:uo(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function el(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:l}}=e,c=B(r),[u]=e.propsOptions;let d=!1;if((s||l>0)&&!(l&16)){if(l&8){const h=e.vnode.dynamicProps;for(let y=0;y{u=!0;const[T,S]=mr(y,t,!0);Y(l,T),S&&c.push(...S)};!n&&t.mixins.length&&t.mixins.forEach(h),e.extends&&h(e.extends),e.mixins&&e.mixins.forEach(h)}if(!o&&!u)return k(e)&&s.set(e,Xe),Xe;if(R(o))for(let h=0;h-1,S[1]=$<0||j<$,(j>-1||M(S,"default"))&&c.push(y)}}}const d=[l,c];return k(e)&&s.set(e,d),d}function as(e){return e[0]!=="$"&&!at(e)}function ds(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function hs(e,t){return ds(e)===ds(t)}function ps(e,t){return R(t)?t.findIndex(n=>hs(n,e)):O(t)&&hs(t,e)?0:-1}const br=e=>e[0]==="_"||e==="$stable",Un=e=>R(e)?e.map(be):[be(e)],tl=(e,t,n)=>{if(t._n)return t;const s=Co((...r)=>Un(t(...r)),n);return s._c=!1,s},vr=(e,t,n)=>{const s=e._ctx;for(const r in e){if(br(r))continue;const o=e[r];if(O(o))t[r]=tl(r,o,s);else if(o!=null){const l=Un(o);t[r]=()=>l}}},yr=(e,t)=>{const n=Un(t);e.slots.default=()=>n},nl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=B(t),$t(t,"_",n)):vr(t,e.slots={})}else e.slots={},t&&yr(e,t);$t(e.slots,Yt,1)},sl=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,l=W;if(s.shapeFlag&32){const c=t._;c?n&&c===1?o=!1:(Y(r,t),!n&&c===1&&delete r._):(o=!t.$stable,vr(t,r)),l=t}else t&&(yr(e,t),l={default:1});if(o)for(const c in r)!br(c)&&l[c]==null&&delete r[c]};function Cn(e,t,n,s,r=!1){if(R(e)){e.forEach((T,S)=>Cn(T,t&&(R(t)?t[S]:t),n,s,r));return}if(Pt(s)&&!r)return;const o=s.shapeFlag&4?Vn(s.component)||s.component.proxy:s.el,l=r?null:o,{i:c,r:u}=e,d=t&&t.r,h=c.refs===W?c.refs={}:c.refs,y=c.setupState;if(d!=null&&d!==u&&(Z(d)?(h[d]=null,M(y,d)&&(y[d]=null)):re(d)&&(d.value=null)),O(u))Pe(u,c,12,[l,h]);else{const T=Z(u),S=re(u);if(T||S){const j=()=>{if(e.f){const $=T?M(y,u)?y[u]:h[u]:u.value;r?R($)&&An($,o):R($)?$.includes(o)||$.push(o):T?(h[u]=[o],M(y,u)&&(y[u]=h[u])):(u.value=[o],e.k&&(h[e.k]=u.value))}else T?(h[u]=l,M(y,u)&&(y[u]=l)):S&&(u.value=l,e.k&&(h[e.k]=l))};l?(j.id=-1,ne(j,n)):j()}}}const ne=Oo;function rl(e){return ol(e)}function ol(e,t){const n=Hs();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:l,createText:c,createComment:u,setText:d,setElementText:h,parentNode:y,nextSibling:T,setScopeId:S=le,insertStaticContent:j}=e,$=(i,f,a,p=null,g=null,b=null,E=void 0,m=null,v=!!f.dynamicChildren)=>{if(i===f)return;i&&!ft(i,f)&&(p=Ct(i),pe(i,g,b,!0),i=null),f.patchFlag===-2&&(v=!1,f.dynamicChildren=null);const{type:_,ref:x,shapeFlag:A}=f;switch(_){case qt:I(i,f,a,p);break;case We:C(i,f,a,p);break;case an:i==null&&H(f,a,p,E);break;case ue:yt(i,f,a,p,g,b,E,m,v);break;default:A&1?ie(i,f,a,p,g,b,E,m,v):A&6?Et(i,f,a,p,g,b,E,m,v):(A&64||A&128)&&_.process(i,f,a,p,g,b,E,m,v,Ze)}x!=null&&g&&Cn(x,i&&i.ref,b,f||i,!f)},I=(i,f,a,p)=>{if(i==null)s(f.el=c(f.children),a,p);else{const g=f.el=i.el;f.children!==i.children&&d(g,f.children)}},C=(i,f,a,p)=>{i==null?s(f.el=u(f.children||""),a,p):f.el=i.el},H=(i,f,a,p)=>{[i.el,i.anchor]=j(i.children,f,a,p,i.el,i.anchor)},U=({el:i,anchor:f},a,p)=>{let g;for(;i&&i!==f;)g=T(i),s(i,a,p),i=g;s(f,a,p)},G=({el:i,anchor:f})=>{let a;for(;i&&i!==f;)a=T(i),r(i),i=a;r(f)},ie=(i,f,a,p,g,b,E,m,v)=>{f.type==="svg"?E="svg":f.type==="math"&&(E="mathml"),i==null?N(f,a,p,g,b,E,m,v):Xt(i,f,g,b,E,m,v)},N=(i,f,a,p,g,b,E,m)=>{let v,_;const{props:x,shapeFlag:A,transition:w,dirs:L}=i;if(v=i.el=l(i.type,b,x&&x.is,x),A&8?h(v,i.children):A&16&&he(i.children,v,null,p,g,un(i,b),E,m),L&&Ne(i,null,p,"created"),Ee(v,i,i.scopeId,E,p),x){for(const K in x)K!=="value"&&!at(K)&&o(v,K,null,x[K],b,i.children,p,g,xe);"value"in x&&o(v,"value",null,x.value,b),(_=x.onVnodeBeforeMount)&&_e(_,p,i)}L&&Ne(i,null,p,"beforeMount");const P=ll(g,w);P&&w.beforeEnter(v),s(v,f,a),((_=x&&x.onVnodeMounted)||P||L)&&ne(()=>{_&&_e(_,p,i),P&&w.enter(v),L&&Ne(i,null,p,"mounted")},g)},Ee=(i,f,a,p,g)=>{if(a&&S(i,a),p)for(let b=0;b{for(let _=v;_{const m=f.el=i.el;let{patchFlag:v,dynamicChildren:_,dirs:x}=f;v|=i.patchFlag&16;const A=i.props||W,w=f.props||W;let L;if(a&&Be(a,!1),(L=w.onVnodeBeforeUpdate)&&_e(L,a,f,i),x&&Ne(f,i,a,"beforeUpdate"),a&&Be(a,!0),_?Me(i.dynamicChildren,_,m,a,p,un(f,g),b):E||D(i,f,m,null,a,p,un(f,g),b,!1),v>0){if(v&16)it(m,f,A,w,a,p,g);else if(v&2&&A.class!==w.class&&o(m,"class",null,w.class,g),v&4&&o(m,"style",A.style,w.style,g),v&8){const P=f.dynamicProps;for(let K=0;K{L&&_e(L,a,f,i),x&&Ne(f,i,a,"updated")},p)},Me=(i,f,a,p,g,b,E)=>{for(let m=0;m{if(a!==p){if(a!==W)for(const m in a)!at(m)&&!(m in p)&&o(i,m,a[m],null,E,f.children,g,b,xe);for(const m in p){if(at(m))continue;const v=p[m],_=a[m];v!==_&&m!=="value"&&o(i,m,_,v,E,f.children,g,b,xe)}"value"in p&&o(i,"value",a.value,p.value,E)}},yt=(i,f,a,p,g,b,E,m,v)=>{const _=f.el=i?i.el:c(""),x=f.anchor=i?i.anchor:c("");let{patchFlag:A,dynamicChildren:w,slotScopeIds:L}=f;L&&(m=m?m.concat(L):L),i==null?(s(_,a,p),s(x,a,p),he(f.children||[],a,x,g,b,E,m,v)):A>0&&A&64&&w&&i.dynamicChildren?(Me(i.dynamicChildren,w,a,g,b,E,m),(f.key!=null||g&&f===g.subTree)&&Er(i,f,!0)):D(i,f,a,x,g,b,E,m,v)},Et=(i,f,a,p,g,b,E,m,v)=>{f.slotScopeIds=m,i==null?f.shapeFlag&512?g.ctx.activate(f,a,p,E,v):Qt(f,a,p,g,b,E,v):Wn(i,f,v)},Qt=(i,f,a,p,g,b,E)=>{const m=i.component=ml(i,p,g);if(fr(i)&&(m.ctx.renderer=Ze),bl(m),m.asyncDep){if(g&&g.registerDep(m,X),!i.el){const v=m.subTree=Te(We);C(null,v,f,a)}}else X(m,i,f,a,g,b,E)},Wn=(i,f,a)=>{const p=f.component=i.component;if(wo(i,f,a))if(p.asyncDep&&!p.asyncResolved){z(p,f,a);return}else p.next=f,vo(p.update),p.effect.dirty=!0,p.update();else f.el=i.el,p.vnode=f},X=(i,f,a,p,g,b,E)=>{const m=()=>{if(i.isMounted){let{next:x,bu:A,u:w,parent:L,vnode:P}=i;{const Ge=xr(i);if(Ge){x&&(x.el=P.el,z(i,x,E)),Ge.asyncDep.then(()=>{i.isUnmounted||m()});return}}let K=x,V;Be(i,!1),x?(x.el=P.el,z(i,x,E)):x=P,A&&rn(A),(V=x.props&&x.props.onVnodeBeforeUpdate)&&_e(V,L,x,P),Be(i,!0);const q=cn(i),ce=i.subTree;i.subTree=q,$(ce,q,y(ce.el),Ct(ce),i,g,b),x.el=q.el,K===null&&Ao(i,q.el),w&&ne(w,g),(V=x.props&&x.props.onVnodeUpdated)&&ne(()=>_e(V,L,x,P),g)}else{let x;const{el:A,props:w}=f,{bm:L,m:P,parent:K}=i,V=Pt(f);if(Be(i,!1),L&&rn(L),!V&&(x=w&&w.onVnodeBeforeMount)&&_e(x,K,f),Be(i,!0),A&&nn){const q=()=>{i.subTree=cn(i),nn(A,i.subTree,i,g,null)};V?f.type.__asyncLoader().then(()=>!i.isUnmounted&&q()):q()}else{const q=i.subTree=cn(i);$(null,q,a,p,i,g,b),f.el=q.el}if(P&&ne(P,g),!V&&(x=w&&w.onVnodeMounted)){const q=f;ne(()=>_e(x,K,q),g)}(f.shapeFlag&256||K&&Pt(K.vnode)&&K.vnode.shapeFlag&256)&&i.a&&ne(i.a,g),i.isMounted=!0,f=a=p=null}},v=i.effect=new On(m,le,()=>Kn(_),i.scope),_=i.update=()=>{v.dirty&&v.run()};_.id=i.uid,Be(i,!0),_()},z=(i,f,a)=>{f.component=i;const p=i.vnode.props;i.vnode=f,i.next=null,el(i,f.props,p,a),sl(i,f.children,a),ze(),rs(i),ke()},D=(i,f,a,p,g,b,E,m,v=!1)=>{const _=i&&i.children,x=i?i.shapeFlag:0,A=f.children,{patchFlag:w,shapeFlag:L}=f;if(w>0){if(w&128){xt(_,A,a,p,g,b,E,m,v);return}else if(w&256){Fe(_,A,a,p,g,b,E,m,v);return}}L&8?(x&16&&xe(_,g,b),A!==_&&h(a,A)):x&16?L&16?xt(_,A,a,p,g,b,E,m,v):xe(_,g,b,!0):(x&8&&h(a,""),L&16&&he(A,a,p,g,b,E,m,v))},Fe=(i,f,a,p,g,b,E,m,v)=>{i=i||Xe,f=f||Xe;const _=i.length,x=f.length,A=Math.min(_,x);let w;for(w=0;wx?xe(i,g,b,!0,!1,A):he(f,a,p,g,b,E,m,v,A)},xt=(i,f,a,p,g,b,E,m,v)=>{let _=0;const x=f.length;let A=i.length-1,w=x-1;for(;_<=A&&_<=w;){const L=i[_],P=f[_]=v?Re(f[_]):be(f[_]);if(ft(L,P))$(L,P,a,null,g,b,E,m,v);else break;_++}for(;_<=A&&_<=w;){const L=i[A],P=f[w]=v?Re(f[w]):be(f[w]);if(ft(L,P))$(L,P,a,null,g,b,E,m,v);else break;A--,w--}if(_>A){if(_<=w){const L=w+1,P=Lw)for(;_<=A;)pe(i[_],g,b,!0),_++;else{const L=_,P=_,K=new Map;for(_=P;_<=w;_++){const oe=f[_]=v?Re(f[_]):be(f[_]);oe.key!=null&&K.set(oe.key,_)}let V,q=0;const ce=w-P+1;let Ge=!1,Zn=0;const ct=new Array(ce);for(_=0;_=ce){pe(oe,g,b,!0);continue}let ge;if(oe.key!=null)ge=K.get(oe.key);else for(V=P;V<=w;V++)if(ct[V-P]===0&&ft(oe,f[V])){ge=V;break}ge===void 0?pe(oe,g,b,!0):(ct[ge-P]=_+1,ge>=Zn?Zn=ge:Ge=!0,$(oe,f[ge],a,null,g,b,E,m,v),q++)}const Gn=Ge?il(ct):Xe;for(V=Gn.length-1,_=ce-1;_>=0;_--){const oe=P+_,ge=f[oe],qn=oe+1{const{el:b,type:E,transition:m,children:v,shapeFlag:_}=i;if(_&6){$e(i.component.subTree,f,a,p);return}if(_&128){i.suspense.move(f,a,p);return}if(_&64){E.move(i,f,a,Ze);return}if(E===ue){s(b,f,a);for(let A=0;Am.enter(b),g);else{const{leave:A,delayLeave:w,afterLeave:L}=m,P=()=>s(b,f,a),K=()=>{A(b,()=>{P(),L&&L()})};w?w(b,P,K):K()}else s(b,f,a)},pe=(i,f,a,p=!1,g=!1)=>{const{type:b,props:E,ref:m,children:v,dynamicChildren:_,shapeFlag:x,patchFlag:A,dirs:w}=i;if(m!=null&&Cn(m,null,a,i,!0),x&256){f.ctx.deactivate(i);return}const L=x&1&&w,P=!Pt(i);let K;if(P&&(K=E&&E.onVnodeBeforeUnmount)&&_e(K,f,i),x&6)Rr(i.component,a,p);else{if(x&128){i.suspense.unmount(a,p);return}L&&Ne(i,null,f,"beforeUnmount"),x&64?i.type.remove(i,f,a,g,Ze,p):_&&(b!==ue||A>0&&A&64)?xe(_,f,a,!1,!0):(b===ue&&A&384||!g&&x&16)&&xe(v,f,a),p&&zn(i)}(P&&(K=E&&E.onVnodeUnmounted)||L)&&ne(()=>{K&&_e(K,f,i),L&&Ne(i,null,f,"unmounted")},a)},zn=i=>{const{type:f,el:a,anchor:p,transition:g}=i;if(f===ue){Lr(a,p);return}if(f===an){G(i);return}const b=()=>{r(a),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(i.shapeFlag&1&&g&&!g.persisted){const{leave:E,delayLeave:m}=g,v=()=>E(a,b);m?m(i.el,b,v):v()}else b()},Lr=(i,f)=>{let a;for(;i!==f;)a=T(i),r(i),i=a;r(f)},Rr=(i,f,a)=>{const{bum:p,scope:g,update:b,subTree:E,um:m}=i;p&&rn(p),g.stop(),b&&(b.active=!1,pe(E,i,f,a)),m&&ne(m,f),ne(()=>{i.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&i.asyncDep&&!i.asyncResolved&&i.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},xe=(i,f,a,p=!1,g=!1,b=0)=>{for(let E=b;Ei.shapeFlag&6?Ct(i.component.subTree):i.shapeFlag&128?i.suspense.next():T(i.anchor||i.el);let en=!1;const kn=(i,f,a)=>{i==null?f._vnode&&pe(f._vnode,null,null,!0):$(f._vnode||null,i,f,null,null,null,a),en||(en=!0,rs(),nr(),en=!1),f._vnode=i},Ze={p:$,um:pe,m:$e,r:zn,mt:Qt,mc:he,pc:D,pbc:Me,n:Ct,o:e};let tn,nn;return t&&([tn,nn]=t(Ze)),{render:kn,hydrate:tn,createApp:Jo(kn,tn)}}function un({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Be({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ll(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Er(e,t,n=!1){const s=e.children,r=t.children;if(R(s)&&R(r))for(let o=0;o>1,e[n[c]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,l=n[o-1];o-- >0;)n[o]=l,l=t[l];return n}function xr(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:xr(t)}const cl=e=>e.__isTeleport,ue=Symbol.for("v-fgt"),qt=Symbol.for("v-txt"),We=Symbol.for("v-cmt"),an=Symbol.for("v-stc"),pt=[];let ae=null;function ee(e=!1){pt.push(ae=e?null:[])}function fl(){pt.pop(),ae=pt[pt.length-1]||null}let bt=1;function gs(e){bt+=e}function Cr(e){return e.dynamicChildren=bt>0?ae||Xe:null,fl(),bt>0&&ae&&ae.push(e),e}function Ae(e,t,n,s,r,o){return Cr(F(e,t,n,s,r,o,!0))}function Ke(e,t,n,s,r){return Cr(Te(e,t,n,s,r,!0))}function ul(e){return e?e.__v_isVNode===!0:!1}function ft(e,t){return e.type===t.type&&e.key===t.key}const Yt="__vInternal",Tr=({key:e})=>e??null,Mt=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Z(e)||re(e)||O(e)?{i:ye,r:e,k:t,f:!!n}:e:null);function F(e,t=null,n=null,s=0,r=null,o=e===ue?0:1,l=!1,c=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Tr(t),ref:t&&Mt(t),scopeId:or,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ye};return c?(Dn(u,n),o&128&&e.normalize(u)):n&&(u.shapeFlag|=Z(n)?8:16),bt>0&&!l&&ae&&(u.patchFlag>0||o&6)&&u.patchFlag!==32&&ae.push(u),u}const Te=al;function al(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===Lo)&&(e=We),ul(e)){const c=rt(e,t,!0);return n&&Dn(c,n),bt>0&&!o&&ae&&(c.shapeFlag&6?ae[ae.indexOf(e)]=c:ae.push(c)),c.patchFlag|=-2,c}if(xl(e)&&(e=e.__vccOpts),t){t=dl(t);let{class:c,style:u}=t;c&&!Z(c)&&(t.class=Wt(c)),k(u)&&(Gs(u)&&!R(u)&&(u=Y({},u)),t.style=Rn(u))}const l=Z(e)?1:Ro(e)?128:cl(e)?64:k(e)?4:O(e)?2:0;return F(e,t,n,s,r,l,o,!0)}function dl(e){return e?Gs(e)||Yt in e?Y({},e):e:null}function rt(e,t,n=!1){const{props:s,ref:r,patchFlag:o,children:l}=e,c=t?pl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:c,key:c&&Tr(c),ref:t&&t.ref?n&&r?R(r)?r.concat(Mt(t)):[r,Mt(t)]:Mt(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ue?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&rt(e.ssContent),ssFallback:e.ssFallback&&rt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function hl(e=" ",t=0){return Te(qt,null,e,t)}function qe(e="",t=!1){return t?(ee(),Ke(We,null,e)):Te(We,null,e)}function be(e){return e==null||typeof e=="boolean"?Te(We):R(e)?Te(ue,null,e.slice()):typeof e=="object"?Re(e):Te(qt,null,String(e))}function Re(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:rt(e)}function Dn(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(R(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Dn(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Yt in t)?t._ctx=ye:r===3&&ye&&(ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else O(t)?(t={default:t,_ctx:ye},n=32):(t=String(t),s&64?(n=16,t=[hl(t)]):n=8);e.children=t,e.shapeFlag|=n}function pl(...e){const t={};for(let n=0;n{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),o=>{r.length>1?r.forEach(l=>l(o)):r[0](o)}};jt=t("__VUE_INSTANCE_SETTERS__",n=>te=n),Tn=t("__VUE_SSR_SETTERS__",n=>Jt=n)}const vt=e=>{const t=te;return jt(e),e.scope.on(),()=>{e.scope.off(),jt(t)}},_s=()=>{te&&te.scope.off(),jt(null)};function Sr(e){return e.vnode.shapeFlag&4}let Jt=!1;function bl(e,t=!1){t&&Tn(t);const{props:n,children:s}=e.vnode,r=Sr(e);Qo(e,n,r,t),nl(e,s);const o=r?vl(e,t):void 0;return t&&Tn(!1),o}function vl(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=qs(new Proxy(e.ctx,Wo));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?El(e):null,o=vt(e);ze();const l=Pe(s,e,0,[e.props,r]);if(ke(),o(),Rs(l)){if(l.then(_s,_s),t)return l.then(c=>{ms(e,c,t)}).catch(c=>{kt(c,e,0)});e.asyncDep=l}else ms(e,l,t)}else wr(e,t)}function ms(e,t,n){O(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:k(t)&&(e.setupState=Qs(t)),wr(e,n)}let bs;function wr(e,t,n){const s=e.type;if(!e.render){if(!t&&bs&&!s.render){const r=s.template||jn(e).template;if(r){const{isCustomElement:o,compilerOptions:l}=e.appContext.config,{delimiters:c,compilerOptions:u}=s,d=Y(Y({isCustomElement:o,delimiters:c},l),u);s.render=bs(r,d)}}e.render=s.render||le}{const r=vt(e);ze();try{zo(e)}finally{ke(),r()}}}function yl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return se(e,"get","$attrs"),t[n]}}))}function El(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return yl(e)},slots:e.slots,emit:e.emit,expose:t}}function Vn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Qs(qs(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in dt)return dt[n](e)},has(t,n){return n in t||n in dt}}))}function xl(e){return O(e)&&"__vccOpts"in e}const Cl=(e,t)=>ao(e,t,Jt),Tl="3.4.21";/** +* @vue/runtime-dom v3.4.21 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Sl="http://www.w3.org/2000/svg",wl="http://www.w3.org/1998/Math/MathML",Oe=typeof document<"u"?document:null,vs=Oe&&Oe.createElement("template"),Al={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?Oe.createElementNS(Sl,e):t==="mathml"?Oe.createElementNS(wl,e):Oe.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>Oe.createTextNode(e),createComment:e=>Oe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Oe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const l=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{vs.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const c=vs.content;if(s==="svg"||s==="mathml"){const u=c.firstChild;for(;u.firstChild;)c.appendChild(u.firstChild);c.removeChild(u)}t.insertBefore(c,n)}return[l?l.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ll=Symbol("_vtc");function Rl(e,t,n){const s=e[Ll];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const ys=Symbol("_vod"),Ol=Symbol("_vsh"),Il=Symbol(""),Pl=/(^|;)\s*display\s*:/;function Hl(e,t,n){const s=e.style,r=Z(n);let o=!1;if(n&&!r){if(t)if(Z(t))for(const l of t.split(";")){const c=l.slice(0,l.indexOf(":")).trim();n[c]==null&&Ft(s,c,"")}else for(const l in t)n[l]==null&&Ft(s,l,"");for(const l in n)l==="display"&&(o=!0),Ft(s,l,n[l])}else if(r){if(t!==n){const l=s[Il];l&&(n+=";"+l),s.cssText=n,o=Pl.test(n)}}else t&&e.removeAttribute("style");ys in e&&(e[ys]=o?s.display:"",e[Ol]&&(s.display="none"))}const Es=/\s*!important$/;function Ft(e,t,n){if(R(n))n.forEach(s=>Ft(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Ml(e,t);Es.test(n)?e.setProperty(lt(s),n.replace(Es,""),"important"):e[s]=n}}const xs=["Webkit","Moz","ms"],dn={};function Ml(e,t){const n=dn[t];if(n)return n;let s=nt(t);if(s!=="filter"&&s in e)return dn[t]=s;s=Ps(s);for(let r=0;rhn||(Ul.then(()=>hn=0),hn=Date.now());function Vl(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;de(Wl(s,n.value),t,5,[s])};return n.value=e,n.attached=Dl(),n}function Wl(e,t){if(R(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ws=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,zl=(e,t,n,s,r,o,l,c,u)=>{const d=r==="svg";t==="class"?Rl(e,s,d):t==="style"?Hl(e,n,s):Ut(t)?wn(t)||Kl(e,t,n,s,l):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):kl(e,t,s,d))?$l(e,t,s,o,l,c,u):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Fl(e,t,s,d))};function kl(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ws(t)&&O(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ws(t)&&Z(n)?!1:t in e}const Zl=Y({patchProp:zl},Al);let As;function Gl(){return As||(As=rl(Zl))}const ql=(...e)=>{const t=Gl().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Jl(s);if(!r)return;const o=t._component;!O(o)&&!o.render&&!o.template&&(o.template=r.innerHTML),r.innerHTML="";const l=n(r,!1,Yl(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),l},t};function Yl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Jl(e){return Z(e)?document.querySelector(e):e}const Xl=["src"],Ye=cr({__name:"CardComponent",props:{card:{}},setup(e){const t=e,n=me("/assets/card_back.png"),s=me(!1);return ar(()=>{n.value="/assets/"+t.card.toString().toLowerCase()+".png"}),It(()=>t.card,r=>{n.value=`/assets/${r.toString().toLowerCase()}.png`}),(r,o)=>(ee(),Ae("div",{onClick:o[0]||(o[0]=l=>s.value=!s.value),class:Wt([{"!scale-105 !z-10 !top-1/2 !left-1/2":s.value},"card transition overflow-hidden"])},[F("img",{class:"h-full rounded-[1rem] mx-auto",src:n.value},null,8,Xl)],2))}});var Ar=(e=>(e.EICHEL_7="EICHEL_7",e.EICHEL_8="EICHEL_8",e.EICHEL_9="EICHEL_9",e.EICHEL_X="EICHEL_X",e.EICHEL_K="EICHEL_K",e.EICHEL_A="EICHEL_A",e.BLATT_7="BLATT_7",e.BLATT_8="BLATT_8",e.BLATT_9="BLATT_9",e.BLATT_X="BLATT_X",e.BLATT_K="BLATT_K",e.BLATT_A="BLATT_A",e.SCHELL_7="SCHELL_7",e.SCHELL_8="SCHELL_8",e.SCHELL_9="SCHELL_9",e.SCHELL_X="SCHELL_X",e.SCHELL_K="SCHELL_K",e.SCHELL_A="SCHELL_A",e.HERZ_7="HERZ_7",e.HERZ_8="HERZ_8",e.HERZ_9="HERZ_9",e.HERZ_X="HERZ_X",e.HERZ_K="HERZ_K",e.HERZ_A="HERZ_A",e.SCHELL_U="SCHELL_U",e.HERZ_U="HERZ_U",e.BLATT_U="BLATT_U",e.EICHEL_U="EICHEL_U",e.SCHELL_O="SCHELL_O",e.HERZ_O="HERZ_O",e.BLATT_O="BLATT_O",e.EICHEL_O="EICHEL_O",e.BACK="CARD_BACK",e))(Ar||{}),je=(e=>(e.CHOOSE_GAME="CHOOSE_GAME",e.GAME_START="GAME_START",e.GAME_STOP="GAME_STOP",e.TRICK_START="TRICK_START",e.WAIT_FOR_CARD="WAIT_FOR_CARD",e.PLAYER_CARD="PLAYER_CARD",e.PLAYER_TRICK="PLAYER_TRICK",e))(je||{});const Ql={key:0},ei={class:"flex gap-2 place-content-center"},ti={key:1},ni={class:"top-52 text-white font-bold text-6xl absolute text-center w-full"},si={class:"top-64 text-white font-bold text-6xl absolute text-center w-full"},ri={key:0},oi={class:"absolute left-0 top-1/2 transform -translate-y-1/2"},li={class:"absolute bottom-0 w-full"},ii={class:"flex flex-row gap-3 w-fit mx-auto justify-center"},ci=cr({__name:"App",setup(e){const t=me([]),n=me("Schafkopf"),s=me(""),r=me(),o=me([]),l=me(0),c=me(),u=me(!0);function d(){j("startsimulation")}function h(){j("stopsimulation")}function y(){o.value=[],j("showtrumpf")}function T(){o.value=[],j("showfarben")}function S(I){j(I)}function j(I){r.value&&(r.value.send(I),console.log("Sent message to server:",I))}function $(I){var C;switch(I.gamePhase){case je.GAME_START:n.value="Spiel startet",u.value=!1,l.value=8;break;case je.TRICK_START:n.value="Runde startet",o.value=[],c.value=void 0,s.value="";break;case je.WAIT_FOR_CARD:n.value="Spieler "+I.currentPlayer+" muss eine Karte legen.";break;case je.PLAYER_CARD:n.value="Spieler "+I.currentPlayer+" hat eine Karte gespielt.",I.currentPlayer===0&&l.value--,I.trumpf?s.value="TRUMPF":s.value=((C=I.color)==null?void 0:C.toString())??"ERROR",o.value.push(I.card);break;case je.PLAYER_TRICK:n.value="Spieler "+I.currentPlayer+" sticht.",c.value=I.card;break;case je.GAME_STOP:u.value=!0;break;default:n.value="Fehler"}}return dr(()=>{const I="10.6.9.69";r.value=new WebSocket("ws://"+I+":8080/schafkopf-events/"),r.value.addEventListener("open",C=>{console.log("WebSocket connection opened:",C)}),r.value.addEventListener("message",C=>{const H=JSON.parse(C.data);console.log(H),"gamestate"in H?(console.log(H.gamestate),$(H.gamestate)):console.log("Invalid BackendMessage format: ",C)}),r.value.addEventListener("close",C=>{console.log("WebSocket connection closed:",C)}),r.value.addEventListener("error",C=>{console.error("WebSocket error:",C)})}),(I,C)=>(ee(),Ae("div",null,[(ee(!0),Ae(ue,null,ls(t.value,H=>(ee(),Ae("div",null,on(H),1))),256)),u.value?(ee(),Ae("div",Ql,[F("div",ei,[F("button",{onClick:C[0]||(C[0]=H=>S("setgame:sauspiel"))},"Sauspiel"),F("button",{onClick:C[1]||(C[1]=H=>S("setgame:herzsolo"))},"herzsolo"),F("button",{onClick:C[2]||(C[2]=H=>S("setgame:eichelsolo"))},"eichelsolo"),F("button",{onClick:C[3]||(C[3]=H=>S("setgame:blattsolo"))},"blattsolo"),F("button",{onClick:C[4]||(C[4]=H=>S("setgame:schellsolo"))},"schellsolo"),F("button",{onClick:C[5]||(C[5]=H=>S("setgame:eichelwenz"))},"eichelwenz"),F("button",{onClick:C[6]||(C[6]=H=>S("setgame:blattwenz"))},"blattwenz"),F("button",{onClick:C[7]||(C[7]=H=>S("setgame:herzwenz"))},"herzwenz"),F("button",{onClick:C[8]||(C[8]=H=>S("setgame:schellwenz"))},"schellwenz"),F("button",{onClick:C[9]||(C[9]=H=>S("setgame:eichelgeier"))},"eichelgeier"),F("button",{onClick:C[10]||(C[10]=H=>S("setgame:blattgeier"))},"blattgeier"),F("button",{onClick:C[11]||(C[11]=H=>S("setgame:herzgeier"))},"herzgeier"),F("button",{onClick:C[12]||(C[12]=H=>S("setgame:schellgeier"))},"schellgeier"),F("button",{onClick:C[13]||(C[13]=H=>S("setgame:geier"))},"Geier"),F("button",{onClick:C[14]||(C[14]=H=>S("setgame:wenz"))},"Wenz")]),F("div",{class:"flex gap-2 place-content-center"},[F("button",{onClick:T},"Zeige alle Farben"),F("button",{onClick:y},"Zeige alle Trumpfkarten")]),F("div",{class:"flex gap-2 place-content-center"},[F("button",{class:"v-button",onClick:d},"Starten"),F("button",{class:"v-button",onClick:h},"Stoppen")])])):(ee(),Ae("div",ti,[F("div",{class:"flex gap-2 place-content-center"},[F("button",{class:"v-button",onClick:h},"Stoppen")]),F("h1",ni,on(s.value),1),F("h1",si,on(n.value),1),o.value.length>0?(ee(),Ae("div",ri,[o.value.length>0?(ee(),Ke(Ye,{key:0,card:o.value[0],class:"absolute card1 md"},null,8,["card"])):qe("",!0),o.value.length>1?(ee(),Ke(Ye,{key:1,card:o.value[1],class:"absolute card2 md"},null,8,["card"])):qe("",!0),o.value.length>2?(ee(),Ke(Ye,{key:2,card:o.value[2],class:"absolute card3 md"},null,8,["card"])):qe("",!0),o.value.length>3?(ee(),Ke(Ye,{key:3,card:o.value[3],class:"absolute card4 md"},null,8,["card"])):qe("",!0)])):qe("",!0),F("div",oi,[c.value?(ee(),Ke(Ye,{key:0,card:c.value,class:"xl"},null,8,["card"])):qe("",!0)]),F("div",li,[F("div",ii,[(ee(!0),Ae(ue,null,ls(l.value,H=>(ee(),Ke(Ye,{card:Xs(Ar).BACK,class:"sm"},null,8,["card"]))),256))])])]))]))}});ql(ci).mount("#app"); diff --git a/src/main/resources/web-content/assets/schell_6.png b/src/main/resources/web-content/assets/schell_6.png new file mode 100644 index 0000000..b47d3d7 Binary files /dev/null and b/src/main/resources/web-content/assets/schell_6.png differ diff --git a/src/main/resources/web-content/assets/schell_7.png b/src/main/resources/web-content/assets/schell_7.png new file mode 100644 index 0000000..464ba51 Binary files /dev/null and b/src/main/resources/web-content/assets/schell_7.png differ diff --git a/src/main/resources/web-content/assets/schell_8.png b/src/main/resources/web-content/assets/schell_8.png new file mode 100644 index 0000000..ef2da1a Binary files /dev/null and b/src/main/resources/web-content/assets/schell_8.png differ diff --git a/src/main/resources/web-content/assets/schell_9.png b/src/main/resources/web-content/assets/schell_9.png new file mode 100644 index 0000000..09040e6 Binary files /dev/null and b/src/main/resources/web-content/assets/schell_9.png differ diff --git a/src/main/resources/web-content/assets/schell_a.png b/src/main/resources/web-content/assets/schell_a.png new file mode 100644 index 0000000..af9f7fb Binary files /dev/null and b/src/main/resources/web-content/assets/schell_a.png differ diff --git a/src/main/resources/web-content/assets/schell_k.png b/src/main/resources/web-content/assets/schell_k.png new file mode 100644 index 0000000..e3b65cc Binary files /dev/null and b/src/main/resources/web-content/assets/schell_k.png differ diff --git a/src/main/resources/web-content/assets/schell_o.png b/src/main/resources/web-content/assets/schell_o.png new file mode 100644 index 0000000..b4fdfe3 Binary files /dev/null and b/src/main/resources/web-content/assets/schell_o.png differ diff --git a/src/main/resources/web-content/assets/schell_u.png b/src/main/resources/web-content/assets/schell_u.png new file mode 100644 index 0000000..8471a8b Binary files /dev/null and b/src/main/resources/web-content/assets/schell_u.png differ diff --git a/src/main/resources/web-content/assets/schell_x.png b/src/main/resources/web-content/assets/schell_x.png new file mode 100644 index 0000000..d5d0cc9 Binary files /dev/null and b/src/main/resources/web-content/assets/schell_x.png differ diff --git a/src/main/resources/web-content/assets/vue.svg b/src/main/resources/web-content/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/main/resources/web-content/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/resources/web-content/index.html b/src/main/resources/web-content/index.html new file mode 100644 index 0000000..07c4915 --- /dev/null +++ b/src/main/resources/web-content/index.html @@ -0,0 +1,15 @@ + + + + + + + Vite + Vue + + + + +
+ + +