From d654c0c78472b35ae20e8f45170e56498f049ee3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 16:09:52 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Web=200.13.3:=20Struktogramm=20und=20Elemen?= =?UTF-8?q?te=20in=20den=20Farben=20der=20Codebl=C3=B6cke?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Anweisungen gelb wie die Methode, Schleifen rosa, Verzweigung/Fallauswahl blau; Inneres erbt die Farbe des Blocks. Schalter heißt jetzt „Blöcke farbig“ und gilt für Code, Struktogramm und Elemente. Exporte bleiben weiß, Farben aus der Datei haben Vorrang. Lektion 1 nutzt dieselben Farben. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Ugz28U8wYCXi1s1XAhMW6n --- CHANGELOG.md | 1 + web/lessons/de/01-was-ist-ein-struktogramm.md | 4 +- .../diagramme/en/l1-grundbausteine.visustruct | 14 +- .../diagramme/en/l1-sequenz.visustruct | 8 +- .../diagramme/en/l1-verzweigung.visustruct | 8 +- .../diagramme/en/l1-wiederholung.visustruct | 6 +- .../diagramme/l1-grundbausteine.visustruct | 14 +- web/lessons/diagramme/l1-sequenz.visustruct | 8 +- .../diagramme/l1-verzweigung.visustruct | 8 +- .../diagramme/l1-wiederholung.visustruct | 6 +- .../diagramme/pt/l1-grundbausteine.visustruct | 14 +- .../diagramme/pt/l1-sequenz.visustruct | 8 +- .../diagramme/pt/l1-verzweigung.visustruct | 8 +- .../diagramme/pt/l1-wiederholung.visustruct | 6 +- web/lessons/en/01-was-ist-ein-struktogramm.md | 4 +- web/lessons/pt/01-was-ist-ein-struktogramm.md | 4 +- web/package-lock.json | 4 +- web/package.json | 2 +- web/src/i18n/de.strings | 4 +- web/src/i18n/en.strings | 4 +- web/src/i18n/pt-PT.strings | 4 +- web/src/learn/markdown.ts | 2 +- web/src/ui/app.ts | 4 +- web/src/ui/javaEditor.ts | 2 +- web/src/ui/renderer.ts | 35 +- web/src/ui/styles.css | 33 +- .../assets/{de-BJBTN1GU.js => de-aPa6h38I.js} | 4 +- .../assets/{en-CHM6FOYw.js => en-CZyy4vg0.js} | 4 +- .../{index-CfA1lalH.js => index-B8RBcspd.js} | 2848 ++++++++--------- website/app/assets/index-Bd1TBhw7.css | 1 - website/app/assets/index-Bv5oUBU1.css | 1 + ...tApp-BRLr8JxR.js => objectApp-70d7xQix.js} | 8 +- ...Zip-CPnVPuE_.js => projectZip-BmUSPT6C.js} | 2 +- .../{pt-PT-BLPvUgTR.js => pt-PT-BcL3wukx.js} | 4 +- ...obot3d-AYD_3VhA.js => robot3d-DrGbnn-t.js} | 2 +- website/app/index.html | 4 +- 36 files changed, 1575 insertions(+), 1518 deletions(-) rename website/app/assets/{de-BJBTN1GU.js => de-aPa6h38I.js} (99%) rename website/app/assets/{en-CHM6FOYw.js => en-CZyy4vg0.js} (99%) rename website/app/assets/{index-CfA1lalH.js => index-B8RBcspd.js} (88%) delete mode 100644 website/app/assets/index-Bd1TBhw7.css create mode 100644 website/app/assets/index-Bv5oUBU1.css rename website/app/assets/{objectApp-BRLr8JxR.js => objectApp-70d7xQix.js} (99%) rename website/app/assets/{projectZip-CPnVPuE_.js => projectZip-BmUSPT6C.js} (99%) rename website/app/assets/{pt-PT-BLPvUgTR.js => pt-PT-BcL3wukx.js} (99%) rename website/app/assets/{robot3d-AYD_3VhA.js => robot3d-DrGbnn-t.js} (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a3627fd..443aa18e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is loosely inspired by Keep a Changelog. ### Added +- **Web 0.13.3, Struktogramm and Elemente in the code block colours:** the Struktogramm uses the same soft colours as the blocks in Programmieren: statements yellow like the method, loops (for, while, do-until, endless) pink, Verzweigung and Fallauswahl blue; elements inside a loop or branch take its colour, so code and diagram side by side show the matching blocks at a glance. The boxes in „Elemente“ get the same colours. The setting is now called „Blöcke farbig“ and switches code, diagram and Elemente together; a colour stored in the file still wins, and exports stay white. Lesson 1 uses the same colours (sequence yellow, branch blue, loop pink). - **Web 0.13.1, divider between Struktogramm and Programmieren always draggable:** with four open columns (lessons, Struktogramm, Programmieren, „mBot2 live“) the diagram sat at its minimum width and the divider barely moved. Dragging it now first uses the space of the two columns next to it, then takes width from „mBot2 live“, then from the lessons and files columns (down to their minimum widths). Works in both orders after ⇄; all widths are remembered. - **Web 0.13.0, VisuBot simulation in the „mBot2 live“ window:** in the VisuBot world „Simulation starten“ no longer shows a second 3D world in the simulation column; the mBot2 of the simulation drives in the „mBot2 live“ window instead (title „🤖 Simulation“, world buttons and distance/line values there, its own ▶ rests until the simulation ends). The window opens by itself for the simulation and closes again afterwards if it was closed before; if it is closed during the simulation, the 3D world goes back to the simulation column. Controls, variables, console, sensor sliders and the real mBot2 stay in the simulation column. - **Web 0.12.12, misspelled data types:** a misspelled basic type at the start of a declaration (`booelan`, `Int`, `string`, `dobule`) is marked red in Programmieren with „Meintest du boolean?“ and ▶ does not start (like javac); the VisuObject debugger reports it with file and line. Valid types (`Boolean`, `Integer`) and own classes stay untouched. The simulation now runs declarations without a start value (`boolean fertig;`, `int a, b;`) and prints conditions like `System.out.println(b == true)` or `x > 3` as true/false (#195). diff --git a/web/lessons/de/01-was-ist-ein-struktogramm.md b/web/lessons/de/01-was-ist-ein-struktogramm.md index a81c00f7..519f53d7 100644 --- a/web/lessons/de/01-was-ist-ein-struktogramm.md +++ b/web/lessons/de/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der S ## Baustein 1: Die Sequenz -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.blau}, [**Verzweigung**]{.orange} und [**Wiederholung**]{.gruen}. Die Farben helfen dir am Anfang beim Zuordnen, in deinen eigenen Diagrammen sind die Kästen weiß. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. +Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.gelb}, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. @@ -90,7 +90,7 @@ Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Tel ## Alle drei zusammen -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.blau} von oben nach unten, eine [Verzweigung]{.orange} und eine [Schleife]{.gruen}. Blau sind die einfachen Anweisungen. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. +Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.gelb} von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen Anweisungen. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. ::: diagramm l1-grundbausteine.visustruct Die Verzweigung erkennst du am Dreieck, die Schleife an der Klammer links. Alles zusammen steht in einer Sequenz. diff --git a/web/lessons/diagramme/en/l1-grundbausteine.visustruct b/web/lessons/diagramme/en/l1-grundbausteine.visustruct index 9ddae2f6..1fa51809 100644 --- a/web/lessons/diagramme/en/l1-grundbausteine.visustruct +++ b/web/lessons/diagramme/en/l1-grundbausteine.visustruct @@ -1,30 +1,30 @@ - + 80;117;116;32;97;32;99;117;112;32;111;110;32;116;104;101;32;116;97;98;108;101; - + 83;117;103;97;114;32;119;97;110;116;101;100;63; - + 65;100;100;32;115;117;103;97;114; - + 248; - + 84;101;97;32;115;116;105;108;108;32;116;111;111;32;104;111;116; - + 87;97;105;116;32;49;32;109;105;110;117;116;101; - + 68;114;105;110;107;32;116;104;101;32;116;101;97; diff --git a/web/lessons/diagramme/en/l1-sequenz.visustruct b/web/lessons/diagramme/en/l1-sequenz.visustruct index 8aae60a5..cbd0c58e 100644 --- a/web/lessons/diagramme/en/l1-sequenz.visustruct +++ b/web/lessons/diagramme/en/l1-sequenz.visustruct @@ -1,15 +1,15 @@ - + 71;101;116;32;117;112; - + 66;114;117;115;104;32;116;101;101;116;104; - + 71;101;116;32;100;114;101;115;115;101;100; - + 72;97;118;101;32;98;114;101;97;107;102;97;115;116; diff --git a/web/lessons/diagramme/en/l1-verzweigung.visustruct b/web/lessons/diagramme/en/l1-verzweigung.visustruct index c3cb1577..78e94d6e 100644 --- a/web/lessons/diagramme/en/l1-verzweigung.visustruct +++ b/web/lessons/diagramme/en/l1-verzweigung.visustruct @@ -1,19 +1,19 @@ - + 73;115;32;105;116;32;114;97;105;110;105;110;103;63; - + 80;97;99;107;32;97;110;32;117;109;98;114;101;108;108;97; - + 80;97;99;107;32;115;117;110;103;108;97;115;115;101;115; - + 76;101;97;118;101; diff --git a/web/lessons/diagramme/en/l1-wiederholung.visustruct b/web/lessons/diagramme/en/l1-wiederholung.visustruct index 120c8a66..079c4a98 100644 --- a/web/lessons/diagramme/en/l1-wiederholung.visustruct +++ b/web/lessons/diagramme/en/l1-wiederholung.visustruct @@ -1,14 +1,14 @@ - + 80;108;97;116;101;32;110;111;116;32;101;109;112;116;121; - + 84;97;107;101;32;97;32;98;105;116;101; - + 67;108;101;97;114;32;116;104;101;32;112;108;97;116;101; diff --git a/web/lessons/diagramme/l1-grundbausteine.visustruct b/web/lessons/diagramme/l1-grundbausteine.visustruct index 6f239461..a601c4d8 100644 --- a/web/lessons/diagramme/l1-grundbausteine.visustruct +++ b/web/lessons/diagramme/l1-grundbausteine.visustruct @@ -1,30 +1,30 @@ - + 84;97;115;115;101;32;97;117;102;32;100;101;110;32;84;105;115;99;104;32;115;116;101;108;108;101;110; - + 90;117;99;107;101;114;32;103;101;119;252;110;115;99;104;116;63; - + 90;117;99;107;101;114;32;104;105;110;101;105;110;103;101;98;101;110; - + 248; - + 84;101;101;32;110;111;99;104;32;122;117;32;104;101;105;223; - + 49;32;77;105;110;117;116;101;32;119;97;114;116;101;110; - + 84;101;101;32;116;114;105;110;107;101;110; diff --git a/web/lessons/diagramme/l1-sequenz.visustruct b/web/lessons/diagramme/l1-sequenz.visustruct index 9d0348cf..9f84605a 100644 --- a/web/lessons/diagramme/l1-sequenz.visustruct +++ b/web/lessons/diagramme/l1-sequenz.visustruct @@ -1,15 +1,15 @@ - + 65;117;102;115;116;101;104;101;110; - + 90;228;104;110;101;32;112;117;116;122;101;110; - + 65;110;122;105;101;104;101;110; - + 70;114;252;104;115;116;252;99;107;101;110; diff --git a/web/lessons/diagramme/l1-verzweigung.visustruct b/web/lessons/diagramme/l1-verzweigung.visustruct index a190813d..673cb6a6 100644 --- a/web/lessons/diagramme/l1-verzweigung.visustruct +++ b/web/lessons/diagramme/l1-verzweigung.visustruct @@ -1,19 +1,19 @@ - + 82;101;103;110;101;116;32;101;115;63; - + 82;101;103;101;110;115;99;104;105;114;109;32;101;105;110;112;97;99;107;101;110; - + 83;111;110;110;101;110;98;114;105;108;108;101;32;101;105;110;112;97;99;107;101;110; - + 76;111;115;103;101;104;101;110; diff --git a/web/lessons/diagramme/l1-wiederholung.visustruct b/web/lessons/diagramme/l1-wiederholung.visustruct index c2e2c3f9..8b31a819 100644 --- a/web/lessons/diagramme/l1-wiederholung.visustruct +++ b/web/lessons/diagramme/l1-wiederholung.visustruct @@ -1,14 +1,14 @@ - + 84;101;108;108;101;114;32;110;105;99;104;116;32;108;101;101;114; - + 69;105;110;101;110;32;66;105;115;115;101;110;32;101;115;115;101;110; - + 84;101;108;108;101;114;32;97;98;114;228;117;109;101;110; diff --git a/web/lessons/diagramme/pt/l1-grundbausteine.visustruct b/web/lessons/diagramme/pt/l1-grundbausteine.visustruct index a8dce86f..c16a085e 100644 --- a/web/lessons/diagramme/pt/l1-grundbausteine.visustruct +++ b/web/lessons/diagramme/pt/l1-grundbausteine.visustruct @@ -1,30 +1,30 @@ - + 80;244;114;32;117;109;97;32;99;104;225;118;101;110;97;32;110;97;32;109;101;115;97; - + 81;117;101;114;32;97;231;250;99;97;114;63; - + 74;117;110;116;97;114;32;97;231;250;99;97;114; - + 248; - + 67;104;225;32;97;105;110;100;97;32;100;101;109;97;115;105;97;100;111;32;113;117;101;110;116;101; - + 69;115;112;101;114;97;114;32;49;32;109;105;110;117;116;111; - + 66;101;98;101;114;32;111;32;99;104;225; diff --git a/web/lessons/diagramme/pt/l1-sequenz.visustruct b/web/lessons/diagramme/pt/l1-sequenz.visustruct index e94cec4f..efca5ad9 100644 --- a/web/lessons/diagramme/pt/l1-sequenz.visustruct +++ b/web/lessons/diagramme/pt/l1-sequenz.visustruct @@ -1,15 +1,15 @@ - + 76;101;118;97;110;116;97;114; - + 76;97;118;97;114;32;111;115;32;100;101;110;116;101;115; - + 86;101;115;116;105;114; - + 84;111;109;97;114;32;111;32;112;101;113;117;101;110;111;45;97;108;109;111;231;111; diff --git a/web/lessons/diagramme/pt/l1-verzweigung.visustruct b/web/lessons/diagramme/pt/l1-verzweigung.visustruct index 88838e42..576887bc 100644 --- a/web/lessons/diagramme/pt/l1-verzweigung.visustruct +++ b/web/lessons/diagramme/pt/l1-verzweigung.visustruct @@ -1,19 +1,19 @@ - + 69;115;116;225;32;97;32;99;104;111;118;101;114;63; - + 76;101;118;97;114;32;103;117;97;114;100;97;45;99;104;117;118;97; - + 76;101;118;97;114;32;243;99;117;108;111;115;32;100;101;32;115;111;108; - + 83;97;105;114; diff --git a/web/lessons/diagramme/pt/l1-wiederholung.visustruct b/web/lessons/diagramme/pt/l1-wiederholung.visustruct index b02b52f8..16ef1eb1 100644 --- a/web/lessons/diagramme/pt/l1-wiederholung.visustruct +++ b/web/lessons/diagramme/pt/l1-wiederholung.visustruct @@ -1,14 +1,14 @@ - + 80;114;97;116;111;32;110;227;111;32;118;97;122;105;111; - + 68;97;114;32;117;109;97;32;103;97;114;102;97;100;97; - + 76;101;118;97;110;116;97;114;32;111;32;112;114;97;116;111; diff --git a/web/lessons/en/01-was-ist-ein-struktogramm.md b/web/lessons/en/01-was-ist-ein-struktogramm.md index d01f16ff..01c39d09 100644 --- a/web/lessons/en/01-was-ist-ein-struktogramm.md +++ b/web/lessons/en/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony ## Building block 1: the sequence -Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.blau}, [**branch**]{.orange} and [**loop**]{.gruen}. The colours help you match them at the start; in your own diagrams the boxes are white. In this step and the next two you get to know them one by one. +Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.gelb}, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. @@ -90,7 +90,7 @@ As long as the plate is not empty, you take a bite. After that, the plate is cle ## All three together -The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.blau} from top to bottom, a [branch]{.orange} and a [loop]{.gruen}. The blue boxes are simple statements. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. +The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.gelb} from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple statements. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. ::: diagramm l1-grundbausteine.visustruct You recognise the branch by its triangle and the loop by the bracket on the left. Everything together sits in a sequence. diff --git a/web/lessons/pt/01-was-ist-ein-struktogramm.md b/web/lessons/pt/01-was-ist-ein-struktogramm.md index c7d2fb82..b7abff45 100644 --- a/web/lessons/pt/01-was-ist-ein-struktogramm.md +++ b/web/lessons/pt/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Univ ## Bloco básico 1: a sequência -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.blau}, [**decisão**]{.orange} e [**ciclo**]{.gruen}. As cores ajudam-te a associá-los no início; nos teus próprios diagramas, as caixas são brancas. Neste passo e nos dois seguintes vais conhecê-los um a um. +Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.gelb}, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. @@ -90,7 +90,7 @@ Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levant ## Os três juntos -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.blau} de cima para baixo, uma [decisão]{.orange} e um [ciclo]{.gruen}. As caixas azuis são instruções simples. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. +Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.gelb} de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são instruções simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. ::: diagramm l1-grundbausteine.visustruct Reconheces a decisão pelo triângulo e o ciclo pelo parêntese à esquerda. Tudo junto forma uma sequência. diff --git a/web/package-lock.json b/web/package-lock.json index 3348bf8c..9035f0a5 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "visustruct-web", - "version": "0.13.1", + "version": "0.13.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "visustruct-web", - "version": "0.13.1", + "version": "0.13.3", "dependencies": { "@codemirror/autocomplete": "^6.20.4", "@codemirror/commands": "^6.11.1", diff --git a/web/package.json b/web/package.json index 0e12cd79..6b1838af 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "visustruct-web", "private": true, - "version": "0.13.1", + "version": "0.13.3", "type": "module", "scripts": { "dev": "vite", diff --git a/web/src/i18n/de.strings b/web/src/i18n/de.strings index 83204426..481f339e 100644 --- a/web/src/i18n/de.strings +++ b/web/src/i18n/de.strings @@ -663,5 +663,5 @@ "web_visuobject_save_tip" = "Projekt als .zip speichern: Projektname/src/package/Klasse.java"; "web_visuobject_open_tip" = "Projekt öffnen (.zip wie aus Eclipse oder BlueJ) oder .java-Dateien ins Projekt holen"; "web_visuobject_method_ph" = "+ bellen(): void"; -"web_code_scopes" = "Codeblöcke farbig"; -"web_code_scopes_hint" = "Klasse, Methode, Schleife, Verzweigung in eigenen Kästen"; +"web_code_scopes" = "Blöcke farbig"; +"web_code_scopes_hint" = "Code und Struktogramm: Schleife rosa, Verzweigung blau, Methode gelb, Klasse grün"; diff --git a/web/src/i18n/en.strings b/web/src/i18n/en.strings index e37c5a68..29b8c3d8 100644 --- a/web/src/i18n/en.strings +++ b/web/src/i18n/en.strings @@ -663,5 +663,5 @@ "web_visuobject_save_tip" = "Save the project as .zip: ProjectName/src/package/Class.java"; "web_visuobject_open_tip" = "Open a project (.zip as from Eclipse or BlueJ) or add .java files to the project"; "web_visuobject_method_ph" = "+ bark(): void"; -"web_code_scopes" = "Colored code blocks"; -"web_code_scopes_hint" = "Class, method, loop, branch in their own boxes"; +"web_code_scopes" = "Colored blocks"; +"web_code_scopes_hint" = "Code and structogram: loop pink, branch blue, method yellow, class green"; diff --git a/web/src/i18n/pt-PT.strings b/web/src/i18n/pt-PT.strings index 4be5904b..bc294088 100644 --- a/web/src/i18n/pt-PT.strings +++ b/web/src/i18n/pt-PT.strings @@ -661,5 +661,5 @@ "web_visuobject_save_tip" = "Guardar o projeto como .zip: NomeDoProjeto/src/package/Classe.java"; "web_visuobject_open_tip" = "Abrir um projeto (.zip como do Eclipse ou BlueJ) ou juntar ficheiros .java ao projeto"; "web_visuobject_method_ph" = "+ ladrar(): void"; -"web_code_scopes" = "Blocos de código coloridos"; -"web_code_scopes_hint" = "Classe, método, ciclo, decisão em caixas próprias"; +"web_code_scopes" = "Blocos coloridos"; +"web_code_scopes_hint" = "Código e diagrama: ciclo rosa, decisão azul, método amarelo, classe verde"; diff --git a/web/src/learn/markdown.ts b/web/src/learn/markdown.ts index f5d224a9..bc8c89cf 100644 --- a/web/src/learn/markdown.ts +++ b/web/src/learn/markdown.ts @@ -17,7 +17,7 @@ export function inline(text: string): string { const external = /^https?:/.test(safe) ? ' target="_blank" rel="noopener noreferrer"' : '' return `${label}` }) - .replace(/\[([^\]]+)\]\{\.(blau|orange|gruen)\}/g, '$1') + .replace(/\[([^\]]+)\]\{\.(blau|orange|gruen|gelb|rosa)\}/g, '$1') // VisuBot: [Ultraschallsensor]{teil=ultrasonic} leuchtet im 3D-Modell auf, wenn man darauf zeigt. .replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g, '$1') return s.replace(/\u0000(\d+)\u0000/g, (_, i: string) => `${codes[Number(i)]}`) diff --git a/web/src/ui/app.ts b/web/src/ui/app.ts index ab4e3374..4949f7e0 100644 --- a/web/src/ui/app.ts +++ b/web/src/ui/app.ts @@ -27,7 +27,7 @@ import { ElementType, type VSDocument, type VSElement } from '../core/model' import { paletteElement, paletteItems, type PaletteItem } from '../core/palette' import { createCanvasMeasure } from '../core/textMeasurement' import { decodeDocument, encodeDocument } from '../core/xmlCodec' -import { DiagramRenderer, displayElement, el, flattenNodes, samePath } from './renderer' +import { DiagramRenderer, displayElement, el, flattenNodes, samePath, scopeKind } from './renderer' import { CodePanel } from './codePanel' import { icons } from './icons' import { FilesPanel, type WorkspaceFile } from './filesPanel' @@ -701,6 +701,8 @@ export class App { const li = document.createElement('li') li.className = 'palette-item' li.dataset.item = data + // Gleiche Farbe wie der Kasten im Struktogramm und der Block im Code (Einstellung „Blöcke farbig“) + li.dataset.scope = scopeKind(make().type) ?? 'method' li.append(this.paletteIcon(icon), document.createTextNode(label)) li.addEventListener('pointerdown', (e) => this.beginDrag(e, { kind: 'palette', make, label })) // Tastatur/Klick ohne Ziehen: hinter der Auswahl einfügen (bzw. Platzhalter ersetzen). diff --git a/web/src/ui/javaEditor.ts b/web/src/ui/javaEditor.ts index 2e9e4a4d..566b0a94 100644 --- a/web/src/ui/javaEditor.ts +++ b/web/src/ui/javaEditor.ts @@ -170,7 +170,7 @@ function scopeMarkers(view: EditorView): RectangleMarker[] { const codeScopesKey = 'visustruct.code.scopes' -/** Einstellung „Codeblöcke farbig“: ohne Speicher eingeschaltet. */ +/** Einstellung „Blöcke farbig“: ohne Speicher eingeschaltet. */ export function codeScopes(): boolean { try { return localStorage.getItem(codeScopesKey) !== '0' diff --git a/web/src/ui/renderer.ts b/web/src/ui/renderer.ts index 135f674d..b714f34f 100644 --- a/web/src/ui/renderer.ts +++ b/web/src/ui/renderer.ts @@ -25,6 +25,22 @@ const Ink = { type Omission = { top?: boolean; left?: boolean; bottom?: boolean; right?: boolean } +/** Farbe wie bei den Codeblöcken (`cm-scope-…`): Schleife rosa, Verzweigung blau, alles andere erbt die Farbe des Blocks, in dem es steht; ganz außen gelb wie die Methode `main` im Code. */ +export function scopeKind(type: ElementType): string | undefined { + switch (type) { + case ElementType.forSchleife: + case ElementType.whileSchleife: + case ElementType.doUntilSchleife: + case ElementType.endlosschleife: + return 'loop' + case ElementType.verzweigung: + case ElementType.fallauswahl: + return 'if' + default: + return undefined + } +} + export function el( tag: K, attrs: Record = {}, @@ -81,7 +97,7 @@ export class DiagramRenderer { }), ) const g = el('g') - for (const n of layout.elements) this.drawNode(n, g, selectedPath, {}, undefined) + for (const n of layout.elements) this.drawNode(n, g, selectedPath, {}, undefined, 'method') svg.append(g) return svg } @@ -173,7 +189,14 @@ export class DiagramRenderer { return { apex, maxTextBottom: apex.y - apexPadding, roofBottom } } - private drawNode(node: LayoutNode, g: SVGElement, selectedPath: number[] | undefined, omission: Omission, parentType?: ElementType) { + private drawNode( + node: LayoutNode, + g: SVGElement, + selectedPath: number[] | undefined, + omission: Omission, + parentType?: ElementType, + parentScope?: string, + ) { const r = node.frame const e = node.element const maxX = r.x + r.width @@ -190,7 +213,11 @@ export class DiagramRenderer { const bg = e.backgroundColor const own = bg && bg.a > 0 ? `rgba(${bg.r}, ${bg.g}, ${bg.b}, ${bg.a / 255})` : 'white' const fill = isSelected && (sim || this.fillsSelection) ? 'rgba(199, 230, 255, 0.55)' : own - cell.append(el('rect', { x: r.x, y: r.y, width: r.width, height: r.height, fill })) + const scope = scopeKind(e.type) ?? parentScope + // Fläche in der Farbe des Blocks per CSS (Einstellung „Blöcke farbig“); im Export bleibt sie weiß. + const area = el('rect', { x: r.x, y: r.y, width: r.width, height: r.height, fill }) + if (fill === 'white' && scope) area.setAttribute('class', `ns-scope ns-scope-${scope}`) + cell.append(area) this.strokeCellBorder(cell, r, omission) const bar = Ink.callSideBarInset @@ -253,7 +280,7 @@ export class DiagramRenderer { node.children.forEach((c, idx) => { const childOmission: Omission = e.type === ElementType.doUntilSchleife && idx === 0 ? { top: true, left: true } : {} - this.drawNode(c, g, selectedPath, childOmission, e.type) + this.drawNode(c, g, selectedPath, childOmission, e.type, scope) }) // Ab hier über den Kindern zeichnen. diff --git a/web/src/ui/styles.css b/web/src/ui/styles.css index af77cb24..2331cca2 100644 --- a/web/src/ui/styles.css +++ b/web/src/ui/styles.css @@ -2417,10 +2417,31 @@ button.danger-text:not(:disabled) { .livecode-editor .cm-scopeLayer .cm-scope-try { --scope: #9a7cf0; } -/* Einstellung „Codeblöcke farbig“ ausgeschaltet: nur der Rahmen der Auswahl bleibt */ +/* Einstellung „Blöcke farbig“ ausgeschaltet: nur der Rahmen der Auswahl bleibt */ :root.no-code-scopes .livecode-editor .cm-scopeLayer .cm-scope:not(.cm-scope-sel) { display: none; } +/* Struktogramm in denselben Farben: Anweisungen gelb wie die Methode, Schleife rosa, Verzweigung/Fallauswahl blau. + Etwas kräftiger als im Code, weil der farbige Streifen links fehlt. */ +:root:not(.no-code-scopes) .ns-scope-method { + fill: color-mix(in srgb, #f2b100 14%, #fff); +} +:root:not(.no-code-scopes) .ns-scope-loop { + fill: color-mix(in srgb, #ec5fa6 14%, #fff); +} +:root:not(.no-code-scopes) .ns-scope-if { + fill: color-mix(in srgb, #3b9cf0 14%, #fff); +} +/* Elemente-Spalte in denselben Farben */ +:root:not(.no-code-scopes) .palette-item[data-scope='method'] { + background: color-mix(in srgb, #f2b100 14%, #fff); +} +:root:not(.no-code-scopes) .palette-item[data-scope='loop'] { + background: color-mix(in srgb, #ec5fa6 14%, #fff); +} +:root:not(.no-code-scopes) .palette-item[data-scope='if'] { + background: color-mix(in srgb, #3b9cf0 14%, #fff); +} /* Ausgewähltes Element: Rahmen in der Akzentfarbe über den Blöcken */ .livecode-editor .cm-scopeLayer .cm-scope-sel { background: transparent; @@ -3317,14 +3338,14 @@ button.danger-text:not(:disabled) { .learn-cloze-status.wrong { background: #fee2e2; } -/* Farbige Markierung im Text, passend zu farbigen Kästen in Lektion 1 */ +/* Farbige Markierung im Text, passend zu farbigen Kästen in Lektion 1 (gelb, blau, rosa wie „Blöcke farbig“) */ .learn-mark { color: inherit; padding: 0 3px; border-radius: 3px; } .learn-mark.blau { - background: #dbeafe; + background: #e4f1fd; } .learn-mark.orange { background: #ffedd5; @@ -3332,6 +3353,12 @@ button.danger-text:not(:disabled) { .learn-mark.gruen { background: #dcfce7; } +.learn-mark.gelb { + background: #fdf4db; +} +.learn-mark.rosa { + background: #fce9f2; +} /* Hinweis statt leerer Seite, wenn die App nicht starten konnte (main.ts) */ .startup-error { diff --git a/website/app/assets/de-BJBTN1GU.js b/website/app/assets/de-aPa6h38I.js similarity index 99% rename from website/app/assets/de-BJBTN1GU.js rename to website/app/assets/de-aPa6h38I.js index d5681d47..48d82a72 100644 --- a/website/app/assets/de-BJBTN1GU.js +++ b/website/app/assets/de-aPa6h38I.js @@ -663,6 +663,6 @@ const e=`/* Texte, die es nur in der Web-Version gibt. Alle anderen kommen aus d "web_visuobject_save_tip" = "Projekt als .zip speichern: Projektname/src/package/Klasse.java"; "web_visuobject_open_tip" = "Projekt öffnen (.zip wie aus Eclipse oder BlueJ) oder .java-Dateien ins Projekt holen"; "web_visuobject_method_ph" = "+ bellen(): void"; -"web_code_scopes" = "Codeblöcke farbig"; -"web_code_scopes_hint" = "Klasse, Methode, Schleife, Verzweigung in eigenen Kästen"; +"web_code_scopes" = "Blöcke farbig"; +"web_code_scopes_hint" = "Code und Struktogramm: Schleife rosa, Verzweigung blau, Methode gelb, Klasse grün"; `;export{e as default}; diff --git a/website/app/assets/en-CHM6FOYw.js b/website/app/assets/en-CZyy4vg0.js similarity index 99% rename from website/app/assets/en-CHM6FOYw.js rename to website/app/assets/en-CZyy4vg0.js index 5affc629..5ee471ac 100644 --- a/website/app/assets/en-CHM6FOYw.js +++ b/website/app/assets/en-CZyy4vg0.js @@ -663,6 +663,6 @@ const e=`/* Texts that exist only in the web version. Everything else comes from "web_visuobject_save_tip" = "Save the project as .zip: ProjectName/src/package/Class.java"; "web_visuobject_open_tip" = "Open a project (.zip as from Eclipse or BlueJ) or add .java files to the project"; "web_visuobject_method_ph" = "+ bark(): void"; -"web_code_scopes" = "Colored code blocks"; -"web_code_scopes_hint" = "Class, method, loop, branch in their own boxes"; +"web_code_scopes" = "Colored blocks"; +"web_code_scopes_hint" = "Code and structogram: loop pink, branch blue, method yellow, class green"; `;export{e as default}; diff --git a/website/app/assets/index-CfA1lalH.js b/website/app/assets/index-B8RBcspd.js similarity index 88% rename from website/app/assets/index-CfA1lalH.js rename to website/app/assets/index-B8RBcspd.js index 013dd73b..85c3b0e4 100644 --- a/website/app/assets/index-CfA1lalH.js +++ b/website/app/assets/index-B8RBcspd.js @@ -1,25 +1,25 @@ -var Qf=Object.defineProperty;var qf=(i,e,t)=>e in i?Qf(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var v=(i,e,t)=>qf(i,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const r of s.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function t(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(a){if(a.ep)return;a.ep=!0;const s=t(a);fetch(a.href,s)}})();const Uf="modulepreload",$f=function(i,e){return new URL(i,e).href},J0={},Q=function(e,t,n){let a=Promise.resolve();if(t&&t.length>0){let r=function(m){return Promise.all(m.map(c=>Promise.resolve(c).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};const o=document.getElementsByTagName("link"),l=document.querySelector("meta[property=csp-nonce]"),u=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));a=r(t.map(m=>{if(m=$f(m,n),m in J0)return;J0[m]=!0;const c=m.endsWith(".css"),d=c?'[rel="stylesheet"]':"";if(!!n)for(let f=o.length-1;f>=0;f--){const x=o[f];if(x.href===m&&(!c||x.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${m}"]${d}`))return;const g=document.createElement("link");if(g.rel=c?"stylesheet":Uf,c||(g.as="script"),g.crossOrigin="",g.href=m,u&&g.setAttribute("nonce",u),document.head.appendChild(g),c)return new Promise((f,x)=>{g.addEventListener("load",f),g.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${m}`)))})}))}function s(r){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=r,window.dispatchEvent(o),!o.defaultPrevented)throw r}return a.then(r=>{for(const o of r||[])o.status==="rejected"&&s(o.reason);return e().catch(s)})};var I=(i=>(i[i.anweisung=0]="anweisung",i[i.verzweigung=1]="verzweigung",i[i.fallauswahl=2]="fallauswahl",i[i.forSchleife=3]="forSchleife",i[i.whileSchleife=4]="whileSchleife",i[i.doUntilSchleife=5]="doUntilSchleife",i[i.endlosschleife=6]="endlosschleife",i[i.aussprung=7]="aussprung",i[i.aufruf=8]="aufruf",i[i.leerElement=9]="leerElement",i))(I||{});function Yf(i){return i===3||i===4||i===5||i===6}function Xf(i){return i===1||i===2}function we(i,e={}){return{type:i,zoomX:0,zoomY:0,textLines:[""],...e}}function Kf(i){const e=i.textLines;if(!e.every(t=>t.trim()===""))switch(i.type){case I.forSchleife:return e.length<=1?e:[t2(e)];case I.verzweigung:return Vi("if",e);case I.whileSchleife:return Vi("while",e);case I.doUntilSchleife:return Vi("while",e2(e));case I.fallauswahl:return Vi("switch",e);default:return e}}function e2(i){if(i.length===0)return i;const e=i[0].trim(),t=e.toLowerCase(),n=[...i];if(t==="until")n[0]="";else if(t.startsWith("until "))n[0]=e.slice(6).trim();else if(t.startsWith("until("))n[0]=e.slice(5);else return i;return n}function R0(i){const e=new Set(["if","for","while","until","switch"]),t=["input:","output:","print:"],n=i.trim(),a=n.toLowerCase();for(const o of t){if(a===o)return{keyword:n,rest:""};if(a.startsWith(o+" "))return{keyword:n.slice(0,o.length),rest:n.slice(o.length).trim()}}const s=n.indexOf(" ");if(s<0)return;const r=n.slice(0,s);if(e.has(r.toLowerCase()))return{keyword:r,rest:n.slice(s+1).trim()}}function Vi(i,e){if(e.length===0)return e;const t=e[0].trim(),n=t.toLowerCase();if(n===i||n.startsWith(i+" "))return e;const a=[...e];return a[0]=i+" "+t,a}function t2(i){let e=[...i];for(;e.length<3;)e.push("");e=e.slice(0,3);const t=a=>{let s=a.trim();for(;s.endsWith(";");)s=s.slice(0,-1).trim();return s},n=e.map(t).join("; ").trim();return n===""?"for":"for "+n}const Td={[I.anweisung]:"Anweisung",[I.verzweigung]:"Bedingung",[I.fallauswahl]:"Fallauswahl",[I.forSchleife]:"for 0 < i < anzahl",[I.whileSchleife]:"while …",[I.doUntilSchleife]:"while …",[I.endlosschleife]:"endless",[I.aussprung]:"break",[I.aufruf]:"Aufruf()",[I.leerElement]:"ø"};function n2(i){Object.assign(Td,i)}function Ol(i){return Kf(i)??[Td[i.type]]}class Pe extends Error{}const hn=i=>structuredClone(i);function en(){return we(I.anweisung,{textLines:["ø"]})}function i2(){return{caption:"",elements:[en()]}}function Al(i){if(i.type===I.leerElement)return!0;if(i.type===I.anweisung){const e=i.textLines;return e.length===0||e.length===1&&e[0]==="ø"}return!1}function wn(i,e){const t=Nt(i,e);return t!==void 0&&Al(t)}function Zi(i,e){if(e.length===0)throw new Pe("Invalid element path.");const[t,...n]=e;if(t<0||t>=i.length)throw new Pe("Invalid element path.");if(n.length===0)return{list:i,index:t};const[a,...s]=n;if(s.length===0)throw new Pe("Invalid element path.");return Zi(Od(i[t],a),s)}function Od(i,e){if(Yf(i.type)){if(e!==0||!i.loopBody)throw new Pe("Invalid element path.");return i.loopBody}if(Xf(i.type)){if(!i.cases||e<0||e>=i.cases.length)throw new Pe("Invalid element path.");return i.cases[e].elements}throw new Pe("Invalid element path.")}function At(i,e){const{list:t,index:n}=Zi(i.elements,e);return t[n]}function Nt(i,e){try{return At(i,e)}catch{return}}function Pn(i,e,t){const n=hn(i),{list:a,index:s}=Zi(n.elements,e);return a[s]=hn(t),n}function Qi(i,e,t){const n=hn(At(i,e));return n.textLines=t.length===0?[""]:t,Pn(i,e,n)}function rr(i,e){return e.length===0?!1:e.length===1&&i.elements.length===1?!wn(i,e):Nt(i,e)!==void 0}function fi(i,e){const t=hn(i),{list:n,index:a}=Zi(t.elements,e);if(e.length===1&&n.length===1){if(Al(n[0]))throw new Pe("The last root element cannot be deleted.");return n[0]=en(),t}return n.splice(a,1),e.length>1&&n.length===0&&n.push(en()),t}function ti(i,e,t,n){const a=hn(i);let s;if(e.length===0)s=a.elements;else{const r=e.slice(0,-1),o=e[e.length-1],{list:l,index:u}=Zi(a.elements,r);s=Od(l[u],o)}return s.splice(Math.min(Math.max(0,t),s.length),0,hn(n)),a}function Ad(i,e,t){if(t.length===0)throw new Pe("Invalid element path.");return ti(i,t.slice(0,-1),t[t.length-1],e)}function io(i,e,t){if(t.length===0)throw new Pe("Invalid element path.");return ti(i,t.slice(0,-1),t[t.length-1]+1,e)}function Pl(i,e){return i.lengthe[n]===t)}function jl(i,e){if(e.length===0)return i;const t=e[e.length-1],n=e.slice(0,-1);if(i.length<=n.length||!n.every((r,o)=>i[o]===r))return i;const a=n.length;if(i[a]<=t)return i;const s=[...i];return s[a]-=1,s}const Cl=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function a2(i,e,t){if(Cl(e,t))return i;if(Pl(e,t))throw new Pe("Invalid element path.");const n=At(i,e),a=fi(i,e);return Ad(a,n,jl(t,e))}function s2(i,e,t){if(Cl(e,t))return i;if(Pl(e,t))throw new Pe("Invalid element path.");const n=At(i,e),a=fi(i,e);return io(a,n,jl(t,e))}function r2(i,e,t){if(!wn(i,t))throw new Pe("Invalid element path.");if(Cl(e,t))return i;if(Pl(e,t))throw new Pe("Invalid element path.");const n=At(i,e),a=fi(i,e);return Pn(a,jl(t,e),n)}function o2(i,e){const t=hn(At(i,e)),n=t.cases;if(t.type!==I.fallauswahl||!n||n.length===0)throw new Pe("Invalid element path.");const a=n[n.length-1].name.toLowerCase()==="default",s=a?n.length-1:n.length,r=String(a?n.length:n.length+1);return n.splice(s,0,{name:r,elements:[en()]}),{doc:Pn(i,e,t),path:[...e,s,0]}}function l2(i,e,t){const n=hn(At(i,e)),a=n.cases;if(n.type!==I.fallauswahl||!a)throw new Pe("Invalid element path.");if(a.length<=2)throw new Pe("A switch needs at least two cases.");if(t<0||t>=a.length)throw new Pe("Invalid element path.");a.splice(t,1);const s=Math.min(t,a.length-1);return{doc:Pn(i,e,n),path:[...e,s,0]}}function u2(i,e,t,n){const a=hn(At(i,e)),s=a.cases;if(a.type!==I.fallauswahl||!s)throw new Pe("Invalid element path.");if(t<0||t>=s.length)throw new Pe("Invalid element path.");const r=n.trim();if(r==="")throw new Pe("Invalid element path.");return s[t].name=r,Pn(i,e,a)}function m2(i,e){var t;if(!(!i||i.length===0))for(let n=i.length;n>=1;n--){const a=i.slice(0,n);if(((t=Nt(e,a))==null?void 0:t.type)===I.fallauswahl)return a}}function c2(i,e){if(!(!i||i.length<=e.length))return i[e.length]}function or(i,e){if(e.elements.length!==0)return!i||!Nt(e,i)?[0]:i}const Pd=i=>i!==void 0&&/\s/.test(i);function Qa(i){const e=i.trim().toLowerCase();return e.startsWith("input:")?"input":e.startsWith("output:")||e.startsWith("print:")?"output":"statement"}function d2(i){const e=i.trim(),t=e.toLowerCase();return t.startsWith("input:")?e.slice(6).trim():t.startsWith("output:")?e.slice(7).trim():t.startsWith("print:")?e.slice(6).trim():i}function G0(i,e){const t=e.trim();return t===""?`${i} `:`${i} ${t}`}function h2(i,e){const t=d2(e);switch(i){case"statement":return t;case"input":return G0("input:",t);case"output":return G0("output:",t)}}const ja=i=>Pd(i[0])?i.slice(1):i;function g2(i){const e=i.replace(/^\s+/,""),t=e.toLowerCase();return t.startsWith("input:")?ja(e.slice(6)):t.startsWith("output:")?ja(e.slice(7)):t.startsWith("print:")?ja(e.slice(6)):i}function H0(i,e){const t=e.replace(/^\s+/,"");if(!t.toLowerCase().startsWith(i.toLowerCase()))return e;const n=t.slice(i.length);if(!(n===""||Pd(n[0])||n[0]==="("))return e;const a=ja(n);return a.startsWith("(")&&a.endsWith(")")&&a.length>=2?a.slice(1,-1):a}function V0(i,e){if(i==="input:"||i==="output:")return g2(e);const t=H0(i,e);if(i==="while"&&t===e){const n=H0("until",e);if(n!==e)return n}return t}function p2(i,e){return e===""?`${i} `:`${i} ${e}`}function jd(i){return i.replace(/[“”„«»]/g,'"').replace(/[’‘‚´]/g,"'")}function Q0(i){const e=i.length===0?[""]:i.slice(0,3);for(;e.length<3;)e.push("");return e}function f2(i){let e=jd(i);for(;;){const t=e.trim();if(!t.endsWith(";"))return e;e=t.slice(0,-1).trim()}}const Ls='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif';function x2(i,e){return`${e==="bold"?700:500} ${i}px ${Ls}`}const Cd=(i,e,t)=>[...i].length*e*(t==="bold"?.68:.62);function b2(){if(typeof document>"u"||!document.body)return;const i="http://www.w3.org/2000/svg",e=document.createElementNS(i,"svg");e.setAttribute("aria-hidden","true"),e.setAttribute("width","0"),e.setAttribute("height","0"),e.style.cssText="position:absolute;left:-9999px;top:0;visibility:hidden;overflow:hidden";const t=document.createElementNS(i,"text");if(t.setAttribute("font-family",Ls),t.style.whiteSpace="pre",e.append(t),document.body.append(e),typeof t.getComputedTextLength!="function"||typeof t.getBBox!="function"){e.remove();return}if(t.textContent="Mg",t.setAttribute("font-size","20"),!(t.getComputedTextLength()>0)){e.remove();return}return t}let lr;function Bd(){return lr===void 0&&(lr=b2()??null),lr??void 0}function Dd(i,e,t){i.setAttribute("font-size",String(e)),i.setAttribute("font-weight",t==="bold"?"700":"500")}function q0(i,e){const t=`${i}|${e}`;let n=U0.get(t);if(!n){const a=Bd();if(n={ascent:i*.95,descent:i*.24},a){Dd(a,i,e),a.setAttribute("y","0"),a.textContent="Mg";const s=a.getBBox();s.height>0&&(n={ascent:-s.y,descent:s.height+s.y})}U0.set(t,n)}return n}const U0=new Map;function y2(){const i=Bd();if(i){const n=new Map;return(a,s,r)=>{const o=`${s}|${r}|${a}`;let l=n.get(o);return l===void 0&&(Dd(i,s,r),i.textContent=a,l=a===""?0:i.getComputedTextLength(),n.size>2e3&&n.clear(),n.set(o,l)),l}}const e=typeof document<"u"?document.createElement("canvas").getContext("2d"):null;if(!e)return Cd;const t=new Map;return(n,a,s)=>{const r=`${a}|${s}|${n}`;let o=t.get(r);return o===void 0&&(e.font=x2(a,s),o=e.measureText(n).width,t.size>2e3&&t.clear(),t.set(r,o)),o}}const Zd={fontSize:15,lineHeight:20,charWidth:7,baseHeaderExtra:20,minSidePadding:42,cellTextInsetY:15,doUntilDoLabelTopInset:2,doUntilFooterTopInset:6,doUntilFooterBottomInset:8};function v2(i){return{...Zd,fontSize:14,lineHeight:21,charWidth:5.5*(14/12),baseHeaderExtra:21,minSidePadding:40}}const qi=i=>i===I.forSchleife||i===I.whileSchleife||i===I.doUntilSchleife||i===I.endlosschleife,Ui=i=>i===I.fallauswahl||i===I.verzweigung;function $i(i,e,t,n=0){return{idPath:i,element:e,frame:t,headerBandHeight:n,topBandHeight:0,loopBodyLeadingInset:0,caseColumnFrames:[],children:[]}}function $e(i){return{...i,frame:{...i.frame}}}class Md{constructor(e=Zd,t=Cd){this.metrics=e,this.measure=t}layout(e,t={left:28,top:28}){const a=this.layoutList(e.elements,t.left,t.top,[]).map(l=>this.stretchLoopBodiesVertically(l));let s=0,r=0;const o=l=>{s=Math.max(s,l.frame.x+l.frame.width),r=Math.max(r,l.frame.y+l.frame.height),l.children.forEach(o)};return a.forEach(o),{canvasSize:{width:s+t.left,height:r+t.top},elements:a}}lineWidth(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"medium"))}lineWidthBold(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"bold"))}layoutList(e,t,n,a){let s=[],r=n;e.forEach((l,u)=>{const m=this.layoutElement(l,t,r,[...a,u]);s.push(m),r+=m.frame.height});const o=Math.max(0,...s.map(l=>l.frame.width));return o>0&&(s=s.map(l=>this.stretchNodeTreeToWidth(l,o))),s}stretchMultiwayNodeToWidth(e,t){const n=$e(e),a=n.frame.width;if(!(a>0)||n.caseColumnFrames.length===0)return n;const s=t/a;n.frame.width=t;let r=n.frame.x;const o=n.caseColumnFrames.map(l=>{const u=l.width*s,m={x:r,y:l.y,width:u,height:l.height};return r+=u,m});return n.caseColumnFrames=o,n.dividerX=o.length>0?o[o.length-1].x:n.frame.x+t,n.columns&&n.columns.length===o.length&&(n.columns=n.columns.map((l,u)=>{const m=o[u];return l.map(c=>{const d=$e(c);return d.frame.x=m.x,d.frame.width=m.width,this.stretchDescendantsWidths(d,m.width)})}),n.children=n.columns.flat()),n}stretchLoopChildren(e,t){const n=this.effectiveLoopBodyLeading(e),a=Math.max(0,t-n);e.children=e.children.map(s=>{const r=$e(s);return r.frame.x=e.frame.x+n,r.frame.width=a,this.stretchDescendantsWidths(r,a)})}stretchNodeTreeToWidth(e,t){const n=$e(e);return n.frame.width>0?Ui(n.element.type)&&n.caseColumnFrames.length>0?this.stretchMultiwayNodeToWidth(n,t):(n.frame.width=t,qi(n.element.type)?this.stretchLoopChildren(n,t):n.children=n.children.map(s=>this.stretchDescendantsWidths(s,t)),n):n}stretchDescendantsWidths(e,t){let n=$e(e);return Ui(n.element.type)?n=this.stretchNodeTreeToWidth(n,t):qi(n.element.type)?(n.frame.width=t,this.stretchLoopChildren(n,t)):(n.frame.width=t,n.children=n.children.map(a=>this.stretchDescendantsWidths(a,t))),n}stretchLoopBodiesVertically(e){const t=$e(e);if(t.columns&&t.columns.length>0)return t.columns=t.columns.map(s=>s.map(r=>this.stretchLoopBodiesVertically(r))),t.children=t.columns.flat(),t;t.children=t.children.map(s=>this.stretchLoopBodiesVertically(s));const n=s=>s===I.anweisung||s===I.leerElement||s===I.aufruf||s===I.aussprung||qi(s);let a;switch(t.element.type){case I.forSchleife:case I.whileSchleife:case I.endlosschleife:{const s=t.element.type===I.endlosschleife?40:0;a=t.frame.y+t.frame.height-s;break}case I.doUntilSchleife:a=t.frame.y+t.frame.height-t.headerBandHeight;break}if(a!==void 0&&t.children.length>0){const s=t.children.length-1;let r=$e(t.children[s]);const o=a-(r.frame.y+r.frame.height);o>.5&&n(r.element.type)&&(r.frame.height+=o,r=this.stretchLoopBodiesVertically(r),t.children=[...t.children.slice(0,s),r])}return t}headerHeight(e){const t=this.metrics,n=Math.max(1,e.textLines.length);if(e.type===I.doUntilSchleife)return t.doUntilFooterTopInset+n*t.lineHeight+t.doUntilFooterBottomInset+e.zoomY;let a;switch(e.type){case I.fallauswahl:a=40;break;case I.verzweigung:a=20;break;case I.forSchleife:case I.whileSchleife:case I.endlosschleife:a=t.baseHeaderExtra+4;break;default:a=14}return a+n*t.lineHeight+e.zoomY}doUntilBodyLeadingInset(){return Math.max(20,this.lineWidthBold("do")+12)}effectiveLoopBodyLeading(e){return e.element.type===I.doUntilSchleife?e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:this.doUntilBodyLeadingInset():20}horizontalPaddingInsideCell(e){return Ui(e)?Math.max(100,this.metrics.minSidePadding*2.45):this.metrics.minSidePadding}minWidth(e){const t=e.textLines.length===0?0:Math.max(...e.textLines.map(s=>this.lineWidth(s)));let n=t+e.zoomX+this.horizontalPaddingInsideCell(e.type);if(e.type===I.aufruf){const s=Math.max(68,this.metrics.minSidePadding*1.7),r=Math.max(8,this.metrics.minSidePadding*.2);n=Math.max(n,t+e.zoomX+s+r)}const a=e.type===I.leerElement?76:e.type===I.aufruf?104:72;return Math.max(a,n)}layoutElement(e,t,n,a){if(Ui(e.type))return this.layoutMultiway(e,t,n,a);if(qi(e.type))return this.layoutLoop(e,t,n,a);const s=this.headerHeight(e);return $i(a,e,{x:t,y:n,width:this.minWidth(e),height:s},s)}layoutLoop(e,t,n,a){const s=x=>x.reduce((b,y)=>b+y.frame.height,0),r=x=>Math.max(0,...x.map(b=>b.frame.width)),o=e.loopBody??[];if(e.type===I.doUntilSchleife){const x=this.doUntilBodyLeadingInset(),b=e.zoomY,y=this.headerHeight(e),w=this.layoutList(o,t+x,n+b,[...a,0]),_=Math.max(this.minWidth(e),r(w)+x),z=s(w)+y+b,S=Math.max(0,_-x),k=$i(a,e,{x:t,y:n,width:_,height:z},y);return k.topBandHeight=b,k.loopBodyLeadingInset=x,k.children=w.map(T=>{const j=$e(T);return j.frame.x=t+x,j.frame.width=S,this.stretchDescendantsWidths(j,S)}),k}const l=20,u=this.headerHeight(e),m=e.type===I.endlosschleife?40:0,c=this.layoutList(o,t+l,n+u,[...a,0]),d=Math.max(this.minWidth(e),r(c)+l),h=u+m+s(c),g=Math.max(0,d-l),f=$i(a,e,{x:t,y:n,width:d,height:h},u);return f.children=c.map(x=>{const b=$e(x);return b.frame.x=t+l,b.frame.width=g,this.stretchDescendantsWidths(b,g)}),f}layoutMultiway(e,t,n,a){const s=this.headerHeight(e),r=e.cases??[],o=Math.max(1,r.length),l=Math.max(this.minWidth(e)/o,132);let u=[],m=[],c=0,d=0;if(r.forEach((x,b)=>{const y=t+c,w=this.layoutList(x.elements,y,n+s,[...a,b]),_=Math.max(0,...w.map(k=>k.frame.width));let z;e.type===I.verzweigung&&o===2?z=Math.max(_,(b===0?"true":"false").length*this.metrics.charWidth+24):z=Math.max(l,_);const S=w.reduce((k,T)=>k+T.frame.height,0);d=Math.max(d,S),u.push({x:y,y:n+s,width:z,height:S}),m.push(w.map(k=>{const T=$e(k);return T.frame.x=y,T.frame.width=z,this.stretchDescendantsWidths(T,z)})),c+=z}),e.type===I.verzweigung&&o===2&&u.length===2){const x=Math.max(u[0].width,u[1].width),b=t,y=t+x,w=y-u[1].x;u[0]={...u[0],x:b,width:x},u[1]={...u[1],x:y,width:x},c=x*2,m[0]=m[0].map(_=>{const z=$e(_);return z.frame.x=b,z.frame.width=x,this.stretchDescendantsWidths(z,x)}),m[1]=m[1].map(_=>{const z=ao(_,w);return z.frame.width=x,this.stretchDescendantsWidths(z,x)})}if(m.length>0){const x=w2(m,n+s);m=x.columns.map(b=>b.map(y=>this.stretchLoopBodiesVertically(y)));for(let b=0;b0?Math.max(...x.columnHeights):d}let h=Math.max(c,this.minWidth(e));if(c>.5&&h>c+.5){const x=h/c;let b=t;const y=[],w=[];u.forEach((_,z)=>{const S=_.width*x;w.push(m[z].map(k=>{const T=$e(k);return T.frame.x=b,T.frame.width=S,this.stretchDescendantsWidths(T,S)})),y.push({x:b,y:_.y,width:S,height:_.height}),b+=S}),u=y,m=w,c=b-t,h=c}const g=u.length>0?u[u.length-1].width:c/o,f=$i(a,e,{x:t,y:n,width:h,height:s+d},s);return f.caseColumnFrames=u,f.dividerX=u.length>0?u[u.length-1].x:t+c-g,f.dividerYInset=e.type===I.fallauswahl?-20:0,f.columns=m,f.children=m.flat(),f}}function Ld(i,e){if(Math.abs(e)<=1e-4)return i;const t=$e(i),n=a=>{const s=$e(a);return s.frame.y+=e,Ld(s,e)};return t.columns?(t.columns=t.columns.map(a=>a.map(n)),t.children=t.columns.flat()):t.children=t.children.map(n),t}function ao(i,e){if(Math.abs(e)<=1e-4)return i;const t=$e(i);return t.frame.x+=e,t.columns?(t.columns=t.columns.map(n=>n.map(a=>ao(a,e))),t.children=t.columns.flat()):t.children=t.children.map(n=>ao(n,e)),t}function w2(i,e){if(i.length<2)return{columns:i,columnHeights:i.map(u=>u.reduce((m,c)=>m+c.frame.height,0))};const t=.5,n=[e];for(const u of i)for(const m of u)n.push(m.frame.y+m.frame.height);const a=Math.max(...n);n.push(a),n.sort((u,m)=>u-m);let s=[];for(const u of n)s.length>0&&Math.abs(u-s[s.length-1])<=t||s.push(u);(s.length===0||Math.abs(s[0]-e)>t)&&s.unshift(e),s.length===0?s=[e,a]:s[s.length-1]{let c=Math.max(0,m);for(;c{let g=$e(d);const f=s[c],x=d.frame.y+d.frame.height,b=h===u.length-1?s.length-1:r(x,c+1),y=s[b],w=f-g.frame.y;g.frame.y=f,g.frame.height=Math.max(0,y-f),g=Ld(g,w),m.push(g),c=b}),o.push(m),l.push(s[s.length-1]-e)}return{columns:o,columnHeights:l}}const z2=[{item:"anweisung",label:"Anweisung"},{item:"verzweigung",label:"Verzweigung"},{item:"fallauswahl",label:"Fallauswahl"},{item:"forZaehlSchleife",label:"For-Schleife"},{item:"whileSchleife",label:"While-Schleife"},{item:"doUntilSchleife",label:"Do-while-Schleife"},{item:"endlosschleife",label:"Endlosschleife"},{item:"aufruf",label:"Aufruf"},{item:"aussprung",label:"Aussprung"}];function $0(i){const e=en;switch(i){case"anweisung":return we(I.anweisung);case"verzweigung":return we(I.verzweigung,{cases:[{name:"true",elements:[e()]},{name:"false",elements:[e()]}]});case"fallauswahl":return we(I.fallauswahl,{cases:[{name:"1",elements:[e()]},{name:"2",elements:[e()]},{name:"default",elements:[e()]}]});case"forZaehlSchleife":return we(I.forSchleife,{textLines:["","",""],loopBody:[e()]});case"whileSchleife":return we(I.whileSchleife,{loopBody:[e()]});case"doUntilSchleife":return we(I.doUntilSchleife,{loopBody:[e()]});case"endlosschleife":return we(I.endlosschleife,{loopBody:[e()]});case"aussprung":return we(I.aussprung);case"aufruf":return we(I.aufruf)}}function qa(i){if(i==="")return"-1;";let e="";for(const t of i)e+=t.codePointAt(0)+";";return e}function so(i){const e=i.split(";").filter(n=>n!=="");if(e.length===1&&e[0]==="-1")return"";let t="";for(const n of e){if(!/^[+-]?\d+$/.test(n))continue;const a=Number(n);a!==-1&&(a<0||a>1114111||a>=55296&&a<=57343||(t+=String.fromCodePoint(a)))}return t}class Y0 extends Error{}function Bl(i){const e=new DOMParser().parseFromString(i,"application/xml");if(e.getElementsByTagName("parsererror").length>0)throw new Y0("Could not read XML.");const t=e.documentElement;if(!t||t.tagName!=="struktogramm")throw new Y0("Invalid XML: root element is not .");const n={caption:K0(t,"caption")??"",elements:oo(t)},a=K0(t,"fontfamily");a!==void 0&&(n.fontFamily=a);const s=ni(t,"fontsize");s!==void 0&&(n.fontSize=s);const r=ni(t,"fontstyle");return r!==void 0&&(n.fontStyle=r),t.getAttribute("pseudocode")==="true"&&(n.pseudocode=!0),n}function o1(i){const e=(n,a)=>a===void 0?"":` ${n}="${Wd(a)}"`;let t=` +var qf=Object.defineProperty;var Uf=(i,e,t)=>e in i?qf(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var v=(i,e,t)=>Uf(i,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))n(a);new MutationObserver(a=>{for(const s of a)if(s.type==="childList")for(const r of s.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&n(r)}).observe(document,{childList:!0,subtree:!0});function t(a){const s={};return a.integrity&&(s.integrity=a.integrity),a.referrerPolicy&&(s.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?s.credentials="include":a.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function n(a){if(a.ep)return;a.ep=!0;const s=t(a);fetch(a.href,s)}})();const $f="modulepreload",Yf=function(i,e){return new URL(i,e).href},J0={},q=function(e,t,n){let a=Promise.resolve();if(t&&t.length>0){let r=function(m){return Promise.all(m.map(c=>Promise.resolve(c).then(d=>({status:"fulfilled",value:d}),d=>({status:"rejected",reason:d}))))};const o=document.getElementsByTagName("link"),l=document.querySelector("meta[property=csp-nonce]"),u=(l==null?void 0:l.nonce)||(l==null?void 0:l.getAttribute("nonce"));a=r(t.map(m=>{if(m=Yf(m,n),m in J0)return;J0[m]=!0;const c=m.endsWith(".css"),d=c?'[rel="stylesheet"]':"";if(!!n)for(let f=o.length-1;f>=0;f--){const x=o[f];if(x.href===m&&(!c||x.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${m}"]${d}`))return;const g=document.createElement("link");if(g.rel=c?"stylesheet":$f,c||(g.as="script"),g.crossOrigin="",g.href=m,u&&g.setAttribute("nonce",u),document.head.appendChild(g),c)return new Promise((f,x)=>{g.addEventListener("load",f),g.addEventListener("error",()=>x(new Error(`Unable to preload CSS for ${m}`)))})}))}function s(r){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=r,window.dispatchEvent(o),!o.defaultPrevented)throw r}return a.then(r=>{for(const o of r||[])o.status==="rejected"&&s(o.reason);return e().catch(s)})};var I=(i=>(i[i.anweisung=0]="anweisung",i[i.verzweigung=1]="verzweigung",i[i.fallauswahl=2]="fallauswahl",i[i.forSchleife=3]="forSchleife",i[i.whileSchleife=4]="whileSchleife",i[i.doUntilSchleife=5]="doUntilSchleife",i[i.endlosschleife=6]="endlosschleife",i[i.aussprung=7]="aussprung",i[i.aufruf=8]="aufruf",i[i.leerElement=9]="leerElement",i))(I||{});function Xf(i){return i===3||i===4||i===5||i===6}function Kf(i){return i===1||i===2}function ze(i,e={}){return{type:i,zoomX:0,zoomY:0,textLines:[""],...e}}function e2(i){const e=i.textLines;if(!e.every(t=>t.trim()===""))switch(i.type){case I.forSchleife:return e.length<=1?e:[n2(e)];case I.verzweigung:return Vi("if",e);case I.whileSchleife:return Vi("while",e);case I.doUntilSchleife:return Vi("while",t2(e));case I.fallauswahl:return Vi("switch",e);default:return e}}function t2(i){if(i.length===0)return i;const e=i[0].trim(),t=e.toLowerCase(),n=[...i];if(t==="until")n[0]="";else if(t.startsWith("until "))n[0]=e.slice(6).trim();else if(t.startsWith("until("))n[0]=e.slice(5);else return i;return n}function R0(i){const e=new Set(["if","for","while","until","switch"]),t=["input:","output:","print:"],n=i.trim(),a=n.toLowerCase();for(const o of t){if(a===o)return{keyword:n,rest:""};if(a.startsWith(o+" "))return{keyword:n.slice(0,o.length),rest:n.slice(o.length).trim()}}const s=n.indexOf(" ");if(s<0)return;const r=n.slice(0,s);if(e.has(r.toLowerCase()))return{keyword:r,rest:n.slice(s+1).trim()}}function Vi(i,e){if(e.length===0)return e;const t=e[0].trim(),n=t.toLowerCase();if(n===i||n.startsWith(i+" "))return e;const a=[...e];return a[0]=i+" "+t,a}function n2(i){let e=[...i];for(;e.length<3;)e.push("");e=e.slice(0,3);const t=a=>{let s=a.trim();for(;s.endsWith(";");)s=s.slice(0,-1).trim();return s},n=e.map(t).join("; ").trim();return n===""?"for":"for "+n}const Td={[I.anweisung]:"Anweisung",[I.verzweigung]:"Bedingung",[I.fallauswahl]:"Fallauswahl",[I.forSchleife]:"for 0 < i < anzahl",[I.whileSchleife]:"while …",[I.doUntilSchleife]:"while …",[I.endlosschleife]:"endless",[I.aussprung]:"break",[I.aufruf]:"Aufruf()",[I.leerElement]:"ø"};function i2(i){Object.assign(Td,i)}function Ol(i){return e2(i)??[Td[i.type]]}class Ce extends Error{}const hn=i=>structuredClone(i);function en(){return ze(I.anweisung,{textLines:["ø"]})}function a2(){return{caption:"",elements:[en()]}}function Al(i){if(i.type===I.leerElement)return!0;if(i.type===I.anweisung){const e=i.textLines;return e.length===0||e.length===1&&e[0]==="ø"}return!1}function wn(i,e){const t=Nt(i,e);return t!==void 0&&Al(t)}function Zi(i,e){if(e.length===0)throw new Ce("Invalid element path.");const[t,...n]=e;if(t<0||t>=i.length)throw new Ce("Invalid element path.");if(n.length===0)return{list:i,index:t};const[a,...s]=n;if(s.length===0)throw new Ce("Invalid element path.");return Zi(Od(i[t],a),s)}function Od(i,e){if(Xf(i.type)){if(e!==0||!i.loopBody)throw new Ce("Invalid element path.");return i.loopBody}if(Kf(i.type)){if(!i.cases||e<0||e>=i.cases.length)throw new Ce("Invalid element path.");return i.cases[e].elements}throw new Ce("Invalid element path.")}function At(i,e){const{list:t,index:n}=Zi(i.elements,e);return t[n]}function Nt(i,e){try{return At(i,e)}catch{return}}function Pn(i,e,t){const n=hn(i),{list:a,index:s}=Zi(n.elements,e);return a[s]=hn(t),n}function Qi(i,e,t){const n=hn(At(i,e));return n.textLines=t.length===0?[""]:t,Pn(i,e,n)}function rr(i,e){return e.length===0?!1:e.length===1&&i.elements.length===1?!wn(i,e):Nt(i,e)!==void 0}function fi(i,e){const t=hn(i),{list:n,index:a}=Zi(t.elements,e);if(e.length===1&&n.length===1){if(Al(n[0]))throw new Ce("The last root element cannot be deleted.");return n[0]=en(),t}return n.splice(a,1),e.length>1&&n.length===0&&n.push(en()),t}function ti(i,e,t,n){const a=hn(i);let s;if(e.length===0)s=a.elements;else{const r=e.slice(0,-1),o=e[e.length-1],{list:l,index:u}=Zi(a.elements,r);s=Od(l[u],o)}return s.splice(Math.min(Math.max(0,t),s.length),0,hn(n)),a}function Ad(i,e,t){if(t.length===0)throw new Ce("Invalid element path.");return ti(i,t.slice(0,-1),t[t.length-1],e)}function io(i,e,t){if(t.length===0)throw new Ce("Invalid element path.");return ti(i,t.slice(0,-1),t[t.length-1]+1,e)}function Pl(i,e){return i.lengthe[n]===t)}function jl(i,e){if(e.length===0)return i;const t=e[e.length-1],n=e.slice(0,-1);if(i.length<=n.length||!n.every((r,o)=>i[o]===r))return i;const a=n.length;if(i[a]<=t)return i;const s=[...i];return s[a]-=1,s}const Cl=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function s2(i,e,t){if(Cl(e,t))return i;if(Pl(e,t))throw new Ce("Invalid element path.");const n=At(i,e),a=fi(i,e);return Ad(a,n,jl(t,e))}function r2(i,e,t){if(Cl(e,t))return i;if(Pl(e,t))throw new Ce("Invalid element path.");const n=At(i,e),a=fi(i,e);return io(a,n,jl(t,e))}function o2(i,e,t){if(!wn(i,t))throw new Ce("Invalid element path.");if(Cl(e,t))return i;if(Pl(e,t))throw new Ce("Invalid element path.");const n=At(i,e),a=fi(i,e);return Pn(a,jl(t,e),n)}function l2(i,e){const t=hn(At(i,e)),n=t.cases;if(t.type!==I.fallauswahl||!n||n.length===0)throw new Ce("Invalid element path.");const a=n[n.length-1].name.toLowerCase()==="default",s=a?n.length-1:n.length,r=String(a?n.length:n.length+1);return n.splice(s,0,{name:r,elements:[en()]}),{doc:Pn(i,e,t),path:[...e,s,0]}}function u2(i,e,t){const n=hn(At(i,e)),a=n.cases;if(n.type!==I.fallauswahl||!a)throw new Ce("Invalid element path.");if(a.length<=2)throw new Ce("A switch needs at least two cases.");if(t<0||t>=a.length)throw new Ce("Invalid element path.");a.splice(t,1);const s=Math.min(t,a.length-1);return{doc:Pn(i,e,n),path:[...e,s,0]}}function m2(i,e,t,n){const a=hn(At(i,e)),s=a.cases;if(a.type!==I.fallauswahl||!s)throw new Ce("Invalid element path.");if(t<0||t>=s.length)throw new Ce("Invalid element path.");const r=n.trim();if(r==="")throw new Ce("Invalid element path.");return s[t].name=r,Pn(i,e,a)}function c2(i,e){var t;if(!(!i||i.length===0))for(let n=i.length;n>=1;n--){const a=i.slice(0,n);if(((t=Nt(e,a))==null?void 0:t.type)===I.fallauswahl)return a}}function d2(i,e){if(!(!i||i.length<=e.length))return i[e.length]}function or(i,e){if(e.elements.length!==0)return!i||!Nt(e,i)?[0]:i}const Pd=i=>i!==void 0&&/\s/.test(i);function Qa(i){const e=i.trim().toLowerCase();return e.startsWith("input:")?"input":e.startsWith("output:")||e.startsWith("print:")?"output":"statement"}function h2(i){const e=i.trim(),t=e.toLowerCase();return t.startsWith("input:")?e.slice(6).trim():t.startsWith("output:")?e.slice(7).trim():t.startsWith("print:")?e.slice(6).trim():i}function G0(i,e){const t=e.trim();return t===""?`${i} `:`${i} ${t}`}function g2(i,e){const t=h2(e);switch(i){case"statement":return t;case"input":return G0("input:",t);case"output":return G0("output:",t)}}const ja=i=>Pd(i[0])?i.slice(1):i;function p2(i){const e=i.replace(/^\s+/,""),t=e.toLowerCase();return t.startsWith("input:")?ja(e.slice(6)):t.startsWith("output:")?ja(e.slice(7)):t.startsWith("print:")?ja(e.slice(6)):i}function H0(i,e){const t=e.replace(/^\s+/,"");if(!t.toLowerCase().startsWith(i.toLowerCase()))return e;const n=t.slice(i.length);if(!(n===""||Pd(n[0])||n[0]==="("))return e;const a=ja(n);return a.startsWith("(")&&a.endsWith(")")&&a.length>=2?a.slice(1,-1):a}function V0(i,e){if(i==="input:"||i==="output:")return p2(e);const t=H0(i,e);if(i==="while"&&t===e){const n=H0("until",e);if(n!==e)return n}return t}function f2(i,e){return e===""?`${i} `:`${i} ${e}`}function jd(i){return i.replace(/[“”„«»]/g,'"').replace(/[’‘‚´]/g,"'")}function Q0(i){const e=i.length===0?[""]:i.slice(0,3);for(;e.length<3;)e.push("");return e}function x2(i){let e=jd(i);for(;;){const t=e.trim();if(!t.endsWith(";"))return e;e=t.slice(0,-1).trim()}}const Ls='system-ui, -apple-system, "Segoe UI", Roboto, sans-serif';function b2(i,e){return`${e==="bold"?700:500} ${i}px ${Ls}`}const Cd=(i,e,t)=>[...i].length*e*(t==="bold"?.68:.62);function y2(){if(typeof document>"u"||!document.body)return;const i="http://www.w3.org/2000/svg",e=document.createElementNS(i,"svg");e.setAttribute("aria-hidden","true"),e.setAttribute("width","0"),e.setAttribute("height","0"),e.style.cssText="position:absolute;left:-9999px;top:0;visibility:hidden;overflow:hidden";const t=document.createElementNS(i,"text");if(t.setAttribute("font-family",Ls),t.style.whiteSpace="pre",e.append(t),document.body.append(e),typeof t.getComputedTextLength!="function"||typeof t.getBBox!="function"){e.remove();return}if(t.textContent="Mg",t.setAttribute("font-size","20"),!(t.getComputedTextLength()>0)){e.remove();return}return t}let lr;function Bd(){return lr===void 0&&(lr=y2()??null),lr??void 0}function Dd(i,e,t){i.setAttribute("font-size",String(e)),i.setAttribute("font-weight",t==="bold"?"700":"500")}function q0(i,e){const t=`${i}|${e}`;let n=U0.get(t);if(!n){const a=Bd();if(n={ascent:i*.95,descent:i*.24},a){Dd(a,i,e),a.setAttribute("y","0"),a.textContent="Mg";const s=a.getBBox();s.height>0&&(n={ascent:-s.y,descent:s.height+s.y})}U0.set(t,n)}return n}const U0=new Map;function v2(){const i=Bd();if(i){const n=new Map;return(a,s,r)=>{const o=`${s}|${r}|${a}`;let l=n.get(o);return l===void 0&&(Dd(i,s,r),i.textContent=a,l=a===""?0:i.getComputedTextLength(),n.size>2e3&&n.clear(),n.set(o,l)),l}}const e=typeof document<"u"?document.createElement("canvas").getContext("2d"):null;if(!e)return Cd;const t=new Map;return(n,a,s)=>{const r=`${a}|${s}|${n}`;let o=t.get(r);return o===void 0&&(e.font=b2(a,s),o=e.measureText(n).width,t.size>2e3&&t.clear(),t.set(r,o)),o}}const Zd={fontSize:15,lineHeight:20,charWidth:7,baseHeaderExtra:20,minSidePadding:42,cellTextInsetY:15,doUntilDoLabelTopInset:2,doUntilFooterTopInset:6,doUntilFooterBottomInset:8};function w2(i){return{...Zd,fontSize:14,lineHeight:21,charWidth:5.5*(14/12),baseHeaderExtra:21,minSidePadding:40}}const qi=i=>i===I.forSchleife||i===I.whileSchleife||i===I.doUntilSchleife||i===I.endlosschleife,Ui=i=>i===I.fallauswahl||i===I.verzweigung;function $i(i,e,t,n=0){return{idPath:i,element:e,frame:t,headerBandHeight:n,topBandHeight:0,loopBodyLeadingInset:0,caseColumnFrames:[],children:[]}}function $e(i){return{...i,frame:{...i.frame}}}class Md{constructor(e=Zd,t=Cd){this.metrics=e,this.measure=t}layout(e,t={left:28,top:28}){const a=this.layoutList(e.elements,t.left,t.top,[]).map(l=>this.stretchLoopBodiesVertically(l));let s=0,r=0;const o=l=>{s=Math.max(s,l.frame.x+l.frame.width),r=Math.max(r,l.frame.y+l.frame.height),l.children.forEach(o)};return a.forEach(o),{canvasSize:{width:s+t.left,height:r+t.top},elements:a}}lineWidth(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"medium"))}lineWidthBold(e){return Math.ceil(this.measure(e,this.metrics.fontSize,"bold"))}layoutList(e,t,n,a){let s=[],r=n;e.forEach((l,u)=>{const m=this.layoutElement(l,t,r,[...a,u]);s.push(m),r+=m.frame.height});const o=Math.max(0,...s.map(l=>l.frame.width));return o>0&&(s=s.map(l=>this.stretchNodeTreeToWidth(l,o))),s}stretchMultiwayNodeToWidth(e,t){const n=$e(e),a=n.frame.width;if(!(a>0)||n.caseColumnFrames.length===0)return n;const s=t/a;n.frame.width=t;let r=n.frame.x;const o=n.caseColumnFrames.map(l=>{const u=l.width*s,m={x:r,y:l.y,width:u,height:l.height};return r+=u,m});return n.caseColumnFrames=o,n.dividerX=o.length>0?o[o.length-1].x:n.frame.x+t,n.columns&&n.columns.length===o.length&&(n.columns=n.columns.map((l,u)=>{const m=o[u];return l.map(c=>{const d=$e(c);return d.frame.x=m.x,d.frame.width=m.width,this.stretchDescendantsWidths(d,m.width)})}),n.children=n.columns.flat()),n}stretchLoopChildren(e,t){const n=this.effectiveLoopBodyLeading(e),a=Math.max(0,t-n);e.children=e.children.map(s=>{const r=$e(s);return r.frame.x=e.frame.x+n,r.frame.width=a,this.stretchDescendantsWidths(r,a)})}stretchNodeTreeToWidth(e,t){const n=$e(e);return n.frame.width>0?Ui(n.element.type)&&n.caseColumnFrames.length>0?this.stretchMultiwayNodeToWidth(n,t):(n.frame.width=t,qi(n.element.type)?this.stretchLoopChildren(n,t):n.children=n.children.map(s=>this.stretchDescendantsWidths(s,t)),n):n}stretchDescendantsWidths(e,t){let n=$e(e);return Ui(n.element.type)?n=this.stretchNodeTreeToWidth(n,t):qi(n.element.type)?(n.frame.width=t,this.stretchLoopChildren(n,t)):(n.frame.width=t,n.children=n.children.map(a=>this.stretchDescendantsWidths(a,t))),n}stretchLoopBodiesVertically(e){const t=$e(e);if(t.columns&&t.columns.length>0)return t.columns=t.columns.map(s=>s.map(r=>this.stretchLoopBodiesVertically(r))),t.children=t.columns.flat(),t;t.children=t.children.map(s=>this.stretchLoopBodiesVertically(s));const n=s=>s===I.anweisung||s===I.leerElement||s===I.aufruf||s===I.aussprung||qi(s);let a;switch(t.element.type){case I.forSchleife:case I.whileSchleife:case I.endlosschleife:{const s=t.element.type===I.endlosschleife?40:0;a=t.frame.y+t.frame.height-s;break}case I.doUntilSchleife:a=t.frame.y+t.frame.height-t.headerBandHeight;break}if(a!==void 0&&t.children.length>0){const s=t.children.length-1;let r=$e(t.children[s]);const o=a-(r.frame.y+r.frame.height);o>.5&&n(r.element.type)&&(r.frame.height+=o,r=this.stretchLoopBodiesVertically(r),t.children=[...t.children.slice(0,s),r])}return t}headerHeight(e){const t=this.metrics,n=Math.max(1,e.textLines.length);if(e.type===I.doUntilSchleife)return t.doUntilFooterTopInset+n*t.lineHeight+t.doUntilFooterBottomInset+e.zoomY;let a;switch(e.type){case I.fallauswahl:a=40;break;case I.verzweigung:a=20;break;case I.forSchleife:case I.whileSchleife:case I.endlosschleife:a=t.baseHeaderExtra+4;break;default:a=14}return a+n*t.lineHeight+e.zoomY}doUntilBodyLeadingInset(){return Math.max(20,this.lineWidthBold("do")+12)}effectiveLoopBodyLeading(e){return e.element.type===I.doUntilSchleife?e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:this.doUntilBodyLeadingInset():20}horizontalPaddingInsideCell(e){return Ui(e)?Math.max(100,this.metrics.minSidePadding*2.45):this.metrics.minSidePadding}minWidth(e){const t=e.textLines.length===0?0:Math.max(...e.textLines.map(s=>this.lineWidth(s)));let n=t+e.zoomX+this.horizontalPaddingInsideCell(e.type);if(e.type===I.aufruf){const s=Math.max(68,this.metrics.minSidePadding*1.7),r=Math.max(8,this.metrics.minSidePadding*.2);n=Math.max(n,t+e.zoomX+s+r)}const a=e.type===I.leerElement?76:e.type===I.aufruf?104:72;return Math.max(a,n)}layoutElement(e,t,n,a){if(Ui(e.type))return this.layoutMultiway(e,t,n,a);if(qi(e.type))return this.layoutLoop(e,t,n,a);const s=this.headerHeight(e);return $i(a,e,{x:t,y:n,width:this.minWidth(e),height:s},s)}layoutLoop(e,t,n,a){const s=x=>x.reduce((b,y)=>b+y.frame.height,0),r=x=>Math.max(0,...x.map(b=>b.frame.width)),o=e.loopBody??[];if(e.type===I.doUntilSchleife){const x=this.doUntilBodyLeadingInset(),b=e.zoomY,y=this.headerHeight(e),w=this.layoutList(o,t+x,n+b,[...a,0]),S=Math.max(this.minWidth(e),r(w)+x),z=s(w)+y+b,k=Math.max(0,S-x),_=$i(a,e,{x:t,y:n,width:S,height:z},y);return _.topBandHeight=b,_.loopBodyLeadingInset=x,_.children=w.map(T=>{const j=$e(T);return j.frame.x=t+x,j.frame.width=k,this.stretchDescendantsWidths(j,k)}),_}const l=20,u=this.headerHeight(e),m=e.type===I.endlosschleife?40:0,c=this.layoutList(o,t+l,n+u,[...a,0]),d=Math.max(this.minWidth(e),r(c)+l),h=u+m+s(c),g=Math.max(0,d-l),f=$i(a,e,{x:t,y:n,width:d,height:h},u);return f.children=c.map(x=>{const b=$e(x);return b.frame.x=t+l,b.frame.width=g,this.stretchDescendantsWidths(b,g)}),f}layoutMultiway(e,t,n,a){const s=this.headerHeight(e),r=e.cases??[],o=Math.max(1,r.length),l=Math.max(this.minWidth(e)/o,132);let u=[],m=[],c=0,d=0;if(r.forEach((x,b)=>{const y=t+c,w=this.layoutList(x.elements,y,n+s,[...a,b]),S=Math.max(0,...w.map(_=>_.frame.width));let z;e.type===I.verzweigung&&o===2?z=Math.max(S,(b===0?"true":"false").length*this.metrics.charWidth+24):z=Math.max(l,S);const k=w.reduce((_,T)=>_+T.frame.height,0);d=Math.max(d,k),u.push({x:y,y:n+s,width:z,height:k}),m.push(w.map(_=>{const T=$e(_);return T.frame.x=y,T.frame.width=z,this.stretchDescendantsWidths(T,z)})),c+=z}),e.type===I.verzweigung&&o===2&&u.length===2){const x=Math.max(u[0].width,u[1].width),b=t,y=t+x,w=y-u[1].x;u[0]={...u[0],x:b,width:x},u[1]={...u[1],x:y,width:x},c=x*2,m[0]=m[0].map(S=>{const z=$e(S);return z.frame.x=b,z.frame.width=x,this.stretchDescendantsWidths(z,x)}),m[1]=m[1].map(S=>{const z=ao(S,w);return z.frame.width=x,this.stretchDescendantsWidths(z,x)})}if(m.length>0){const x=z2(m,n+s);m=x.columns.map(b=>b.map(y=>this.stretchLoopBodiesVertically(y)));for(let b=0;b0?Math.max(...x.columnHeights):d}let h=Math.max(c,this.minWidth(e));if(c>.5&&h>c+.5){const x=h/c;let b=t;const y=[],w=[];u.forEach((S,z)=>{const k=S.width*x;w.push(m[z].map(_=>{const T=$e(_);return T.frame.x=b,T.frame.width=k,this.stretchDescendantsWidths(T,k)})),y.push({x:b,y:S.y,width:k,height:S.height}),b+=k}),u=y,m=w,c=b-t,h=c}const g=u.length>0?u[u.length-1].width:c/o,f=$i(a,e,{x:t,y:n,width:h,height:s+d},s);return f.caseColumnFrames=u,f.dividerX=u.length>0?u[u.length-1].x:t+c-g,f.dividerYInset=e.type===I.fallauswahl?-20:0,f.columns=m,f.children=m.flat(),f}}function Ld(i,e){if(Math.abs(e)<=1e-4)return i;const t=$e(i),n=a=>{const s=$e(a);return s.frame.y+=e,Ld(s,e)};return t.columns?(t.columns=t.columns.map(a=>a.map(n)),t.children=t.columns.flat()):t.children=t.children.map(n),t}function ao(i,e){if(Math.abs(e)<=1e-4)return i;const t=$e(i);return t.frame.x+=e,t.columns?(t.columns=t.columns.map(n=>n.map(a=>ao(a,e))),t.children=t.columns.flat()):t.children=t.children.map(n=>ao(n,e)),t}function z2(i,e){if(i.length<2)return{columns:i,columnHeights:i.map(u=>u.reduce((m,c)=>m+c.frame.height,0))};const t=.5,n=[e];for(const u of i)for(const m of u)n.push(m.frame.y+m.frame.height);const a=Math.max(...n);n.push(a),n.sort((u,m)=>u-m);let s=[];for(const u of n)s.length>0&&Math.abs(u-s[s.length-1])<=t||s.push(u);(s.length===0||Math.abs(s[0]-e)>t)&&s.unshift(e),s.length===0?s=[e,a]:s[s.length-1]{let c=Math.max(0,m);for(;c{let g=$e(d);const f=s[c],x=d.frame.y+d.frame.height,b=h===u.length-1?s.length-1:r(x,c+1),y=s[b],w=f-g.frame.y;g.frame.y=f,g.frame.height=Math.max(0,y-f),g=Ld(g,w),m.push(g),c=b}),o.push(m),l.push(s[s.length-1]-e)}return{columns:o,columnHeights:l}}const I2=[{item:"anweisung",label:"Anweisung"},{item:"verzweigung",label:"Verzweigung"},{item:"fallauswahl",label:"Fallauswahl"},{item:"forZaehlSchleife",label:"For-Schleife"},{item:"whileSchleife",label:"While-Schleife"},{item:"doUntilSchleife",label:"Do-while-Schleife"},{item:"endlosschleife",label:"Endlosschleife"},{item:"aufruf",label:"Aufruf"},{item:"aussprung",label:"Aussprung"}];function $0(i){const e=en;switch(i){case"anweisung":return ze(I.anweisung);case"verzweigung":return ze(I.verzweigung,{cases:[{name:"true",elements:[e()]},{name:"false",elements:[e()]}]});case"fallauswahl":return ze(I.fallauswahl,{cases:[{name:"1",elements:[e()]},{name:"2",elements:[e()]},{name:"default",elements:[e()]}]});case"forZaehlSchleife":return ze(I.forSchleife,{textLines:["","",""],loopBody:[e()]});case"whileSchleife":return ze(I.whileSchleife,{loopBody:[e()]});case"doUntilSchleife":return ze(I.doUntilSchleife,{loopBody:[e()]});case"endlosschleife":return ze(I.endlosschleife,{loopBody:[e()]});case"aussprung":return ze(I.aussprung);case"aufruf":return ze(I.aufruf)}}function qa(i){if(i==="")return"-1;";let e="";for(const t of i)e+=t.codePointAt(0)+";";return e}function so(i){const e=i.split(";").filter(n=>n!=="");if(e.length===1&&e[0]==="-1")return"";let t="";for(const n of e){if(!/^[+-]?\d+$/.test(n))continue;const a=Number(n);a!==-1&&(a<0||a>1114111||a>=55296&&a<=57343||(t+=String.fromCodePoint(a)))}return t}class Y0 extends Error{}function Bl(i){const e=new DOMParser().parseFromString(i,"application/xml");if(e.getElementsByTagName("parsererror").length>0)throw new Y0("Could not read XML.");const t=e.documentElement;if(!t||t.tagName!=="struktogramm")throw new Y0("Invalid XML: root element is not .");const n={caption:K0(t,"caption")??"",elements:oo(t)},a=K0(t,"fontfamily");a!==void 0&&(n.fontFamily=a);const s=ni(t,"fontsize");s!==void 0&&(n.fontSize=s);const r=ni(t,"fontstyle");return r!==void 0&&(n.fontStyle=r),t.getAttribute("pseudocode")==="true"&&(n.pseudocode=!0),n}function o1(i){const e=(n,a)=>a===void 0?"":` ${n}="${Wd(a)}"`;let t=` `;t+=" `;for(const n of i.elements)t+=ro(n," ");return t+=` `,t}function ro(i,e){let t=`${e} -`;for(const n of i.textLines)t+=`${e} ${I2(qa(n))} +`;for(const n of i.textLines)t+=`${e} ${k2(qa(n))} `;if(i.loopBody){t+=`${e} `;for(const n of i.loopBody)t+=ro(n,e+" ");t+=`${e} `}if(i.cases)for(const n of i.cases){t+=`${e} `;for(const a of n.elements)t+=ro(a,e+" ");t+=`${e} `}return t+=`${e} -`,t}function Wd(i){return i.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function I2(i){return i.replace(/&/g,"&").replace(//g,">")}function X0(i){return String(i.a<<24|i.r<<16|i.g<<8|i.b|0)}function Ca(i,e){return Array.from(i.children).filter(t=>t.tagName===e)}function oo(i){const e=[];for(const t of Ca(i,"strelem")){const n=k2(t);n&&e.push(n)}return e}function k2(i){const e=ni(i,"typ");if(e===void 0||I[e]===void 0)return;const t={type:e,zoomX:ni(i,"zx")??0,zoomY:ni(i,"zy")??0,textLines:Ca(i,"text").map(o=>so((o.textContent??"").trim()))},n=eu(i.getAttribute("textcolor"));n&&(t.textColor=n);const a=eu(i.getAttribute("bgcolor"));a&&(t.backgroundColor=a),t.textLines.length===0&&(t.textLines=[""]);const s=Ca(i,"schleifeninhalt")[0];if(s){const o=oo(s);o.length>0&&(t.loopBody=o)}const r=Ca(i,"fall").map(o=>({name:so(o.getAttribute("fallname")??""),elements:oo(o)}));return r.length>0&&(t.cases=r),t}function K0(i,e){const t=i.getAttribute(e);return t===null?void 0:so(t)}function ni(i,e){const t=i.getAttribute(e);if(!(t===null||!/^[+-]?\d+$/.test(t)))return Number(t)}function eu(i){if(i===null||!/^[+-]?\d+$/.test(i))return;const e=Number(i);if(e<-2147483648||e>2147483647)return;const t=e>>>0;return{a:t>>>24&255,r:t>>>16&255,g:t>>>8&255,b:t&255}}const S2="http://www.w3.org/2000/svg",Ce={diagramLineWidth:2,outerFrameLineWidth:2,selectionLineWidth:3.5,canvasOuterMargin:16,cellTextInsetX:18,cellTextInsetY:15,multiHeaderFirstLineY:14,branchLabelInsetX:10,fallauswahlCaseLabelBand:26,callSideBarInset:14,callTextInsetFromSideBar:20,loopBodyLeadingInset:20};function xe(i,e={}){const t=document.createElementNS(S2,i);for(const[n,a]of Object.entries(e))t.setAttribute(n,String(a));return t}class Ed{constructor(e,t){v(this,"usesSimulationHighlight",!1);v(this,"fillsSelection",!1);this.metrics=e,this.measure=t}get lineHeight(){return this.metrics.lineHeight}get fontSize(){return this.metrics.fontSize}render(e,t,n,a=Ce.canvasOuterMargin){const s=xe("svg",{width:t.width,height:t.height,viewBox:`0 0 ${t.width} ${t.height}`,"font-family":Ls,"font-size":this.fontSize,class:"diagram"});s.append(xe("rect",{x:0,y:0,width:t.width,height:t.height,fill:"#fafafa"}));const r=a;s.append(xe("rect",{x:r,y:r,width:e.canvasSize.width-2*r-1,height:e.canvasSize.height-2*r-1,fill:"none",stroke:"black","stroke-width":Ce.outerFrameLineWidth}));const o=xe("g");for(const l of e.elements)this.drawNode(l,o,n,{},void 0);return s.append(o),s}line(e,t){e.append(xe("polyline",{points:t.map(n=>n.join(",")).join(" "),fill:"none",stroke:"black","stroke-width":Ce.diagramLineWidth,"stroke-linejoin":"miter"}))}strokeCellBorder(e,t,n){const a=t.x,s=t.y,r=t.x+t.width,o=t.y+t.height;if(!n.top&&!n.left&&!n.bottom&&!n.right){e.append(xe("rect",{x:a,y:s,width:t.width,height:t.height,fill:"none",stroke:"black","stroke-width":Ce.diagramLineWidth}));return}n.top||this.line(e,[[a,s],[r,s]]),n.right||this.line(e,[[r,s],[r,o]]),n.bottom||this.line(e,[[r,o],[a,o]]),n.left||this.line(e,[[a,o],[a,s]])}textWidth(e){const t=R0(e);return t?this.measure(t.keyword,this.fontSize,"bold")+(t.rest===""?0:this.measure(" "+t.rest,this.fontSize,"medium")):this.measure(e,this.fontSize,"medium")}drawKeywordLine(e,t,n,a){const s=xe("text",{x:n,y:a+q0(this.fontSize,"medium").ascent,"font-weight":500});s.style.whiteSpace="pre";const r=R0(t);if(r){const o=xe("tspan",{"font-weight":700});if(o.textContent=r.keyword,s.append(o),r.rest!==""){const l=xe("tspan",{});l.textContent=" "+r.rest,s.append(l)}}else s.textContent=t;e.append(s)}drawLabel(e,t,n,a,s,r){const o=q0(this.fontSize,s?"bold":"medium"),l=xe("text",{x:n,y:r==="top"?a+o.ascent:a-o.descent,"font-weight":s?700:500});l.style.whiteSpace="pre",l.textContent=t,e.append(l)}roofMetrics(e,t,n,a){const s=t.y+n,r=e.dividerYInset??0,o=12,l=Math.max(e.element.textLines.length,1)*this.lineHeight,u=t.y+Ce.multiHeaderFirstLineY;if(e.element.type===I.fallauswahl){const c=Math.max(Ce.fallauswahlCaseLabelBand,this.lineHeight+10),d=s-c,h=Math.min(s+r,d-8),g=Math.max(h,u+l+6);return{apex:{x:a,y:g},maxTextBottom:d-o,roofBottom:s}}const m={x:a,y:s+r};return{apex:m,maxTextBottom:m.y-o,roofBottom:s}}drawNode(e,t,n,a,s){var z;const r=e.frame,o=e.element,l=r.x+r.width,u=r.y+r.height,m=o.type===I.verzweigung||o.type===I.fallauswahl,c=m?e.headerBandHeight:0,d=n!==void 0&&lo(e.idPath,n),h=Ol(o),g=xe("g",{"data-path":e.idPath.join(",")});t.append(g);const f=this.usesSimulationHighlight,x=o.backgroundColor,b=x&&x.a>0?`rgba(${x.r}, ${x.g}, ${x.b}, ${x.a/255})`:"white",y=d&&(f||this.fillsSelection)?"rgba(199, 230, 255, 0.55)":b;g.append(xe("rect",{x:r.x,y:r.y,width:r.width,height:r.height,fill:y})),this.strokeCellBorder(g,r,a);const w=Ce.callSideBarInset;if(o.type===I.aufruf?(this.line(g,[[r.x+w,r.y],[r.x+w,u]]),this.line(g,[[l-w,r.y],[l-w,u]])):o.type===I.aussprung&&this.line(g,[[r.x+w,r.y],[r.x,r.y+r.height/2],[r.x+w,u]]),m&&e.dividerX!==void 0){const S=e.dividerX,k=this.roofMetrics(e,r,c,S),T=Math.max(h.length,1)*this.lineHeight,j=r.y+Ce.multiHeaderFirstLineY;this.line(g,[[r.x,r.y],[k.apex.x,k.apex.y],[l,r.y]]),o.type===I.fallauswahl&&this.line(g,[[r.x,k.roofBottom],[l,k.roofBottom]]);let B;j+T<=k.maxTextBottom?B=j:B=Math.max(r.y+2,k.maxTextBottom-(Math.max(h.length,1)-1)*this.lineHeight-this.lineHeight),h.forEach((P,A)=>{const W=this.textWidth(P);let J;if(o.type===I.verzweigung){const U=r.x+Ce.cellTextInsetX,ie=l-W-Ce.cellTextInsetX;J=Math.min(Math.max(S-W/2,U),ie)}else J=r.x+r.width/2-W/2;this.drawKeywordLine(g,P,J,B+A*this.lineHeight)})}else if(o.type!==I.doUntilSchleife)if(o.type===I.anweisung||o.type===I.aufruf||o.type===I.aussprung){const S=Ce.cellTextInsetX;let k=r.x+S,T=l-S;o.type===I.aufruf?(k=r.x+w+Ce.callTextInsetFromSideBar,T=l-w-Ce.callTextInsetFromSideBar):o.type===I.aussprung&&(k=r.x+w+S);const j=Math.max(0,T-k);let B=r.y+r.height/2-Math.max(1,h.length)*this.lineHeight/2;for(const P of h)this.drawKeywordLine(g,P,k+(j-this.textWidth(P))/2,B),B+=this.lineHeight}else{const S=Math.max(1,h.length)*this.lineHeight;let k=s===I.doUntilSchleife?r.y+r.height/2-S/2:r.y+Ce.cellTextInsetY;for(const T of h)this.drawKeywordLine(g,T,r.x+Ce.cellTextInsetX,k),k+=this.lineHeight}e.children.forEach((S,k)=>{const T=o.type===I.doUntilSchleife&&k===0?{top:!0,left:!0}:{};this.drawNode(S,t,n,T,o.type)});const _=xe("g");if(t.append(_),o.type===I.doUntilSchleife){const S=((z=e.children[0])==null?void 0:z.frame.x)??r.x+(e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:Ce.loopBodyLeadingInset);this.drawLabel(_,"do",r.x+4,r.y+this.metrics.doUntilDoLabelTopInset,!0,"top");const k=u-e.headerBandHeight;this.line(_,[[S,k],[l,k]]),this.line(_,[[S,r.y],[S,k]]);let T=k+this.metrics.doUntilFooterTopInset;for(const j of h)this.drawKeywordLine(_,j,r.x+Ce.cellTextInsetX,T),T+=this.lineHeight}if(m&&e.dividerX!==void 0&&e.caseColumnFrames.length>1){const S=this.roofMetrics(e,r,c,e.dividerX),k=S.apex;e.caseColumnFrames.forEach((j,B)=>{if(B>=e.caseColumnFrames.length-1)return;const P=j.x+j.width,A=_2(P,r,k),W=Number.isFinite(A)?Math.min(Math.max(A,r.y),u):r.y;this.line(_,[[P,u],[P,W]])});const T=o.cases;if(T&&T.length===e.caseColumnFrames.length){const j=o.type===I.fallauswahl?S.roofBottom-6:r.y+c-8,B=Ce.branchLabelInsetX;if(o.type===I.verzweigung&&T.length===2){this.drawLabel(_,"true",r.x+B,j,!0,"bottom");const P=e.caseColumnFrames[1],A=this.measure("false",this.fontSize,"bold");this.drawLabel(_,"false",P.x+P.width-B-A,j,!0,"bottom")}else T.forEach((P,A)=>{const W=e.caseColumnFrames[A],J=["default","true","false"].includes(P.name.toLowerCase()),U=this.measure(P.name,this.fontSize,J?"bold":"medium");this.drawLabel(_,P.name,W.x+W.width/2-U/2,j,J,"bottom")})}}d&&_.append(xe("rect",{x:r.x,y:r.y,width:r.width,height:r.height,class:"selection-frame",fill:"none",stroke:f?"rgba(66, 140, 242, 0.78)":"rgba(0, 122, 255, 0.9)","stroke-width":Ce.selectionLineWidth}))}}function _2(i,e,t){const n=e.y;if(i<=t.x){const s=t.x-e.x;return Math.abs(s)<.5?t.y:n+(t.y-n)/s*(i-e.x)}const a=e.x+e.width-t.x;return Math.abs(a)<.5?t.y:t.y+(n-t.y)/a*(i-t.x)}function lo(i,e){return i.length===e.length&&i.every((t,n)=>t===e[n])}function T2(i){const e=[],t=n=>{e.push(n),n.children.forEach(t)};return i.forEach(t),e}function Ua(i){var e,t;return{...i,textLines:Ol(i),loopBody:(e=i.loopBody)==null?void 0:e.map(Ua),cases:(t=i.cases)==null?void 0:t.map(n=>({name:n.name,elements:n.elements.map(Ua)}))}}const O2=[{code:"de",name:"Deutsch"},{code:"en",name:"English"},{code:"es",name:"Español"},{code:"fr",name:"Français"},{code:"it",name:"Italiano"},{code:"pl",name:"Polski"},{code:"tr",name:"Türkçe"},{code:"ko",name:"한국어"},{code:"ja",name:"日本語"},{code:"el",name:"Ελληνικά"},{code:"uk",name:"Українська"},{code:"ar",name:"العربية"},{code:"ru",name:"Русский"},{code:"he",name:"עברית"},{code:"nl",name:"Nederlands"},{code:"sv",name:"Svenska"},{code:"da",name:"Dansk"},{code:"nb",name:"Norsk bokmål"},{code:"zh-Hans",name:"中文(简体)"},{code:"zh-Hant",name:"中文(繁體)"},{code:"pt-PT",name:"Português"},{code:"java",name:"Java (Keywords)"}],Nd=["de","en","pt-PT"],Fd=O2.filter(i=>Nd.includes(i.code)),tu=i=>Nd.includes(i),A2=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-CxCno28C.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-BAutdlBb.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-Dk8F86qS.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-rqA-20hM.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-DBLIUcBd.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-LSTVB2Q5.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-ByPZS4RL.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-R-16GCrk.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-DXAPah1g.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-CkJEmEEP.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-BudCXCER.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-DSvkBkp-.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-BJ55WGVD.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-BYJK0mdR.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-CHv0OL9S.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-1QZ0wfvJ.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-M33nNbEe.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-BM86Igqt.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-UGog_aku.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-CaVEL1es.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings":()=>Q(()=>import("./Localizable-DqIDp_hh.js"),[],import.meta.url).then(i=>i.default)}),Jd=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Java.strings":()=>Q(()=>import("./Java-Bpx1Vwvg.js"),[],import.meta.url).then(i=>i.default)}),P2=Object.assign({"../i18n/ar.strings":()=>Q(()=>import("./ar-Ce_JBvN0.js"),[],import.meta.url).then(i=>i.default),"../i18n/da.strings":()=>Q(()=>import("./da-DECOxrcR.js"),[],import.meta.url).then(i=>i.default),"../i18n/de.strings":()=>Q(()=>import("./de-BJBTN1GU.js"),[],import.meta.url).then(i=>i.default),"../i18n/el.strings":()=>Q(()=>import("./el-yeMMlSVC.js"),[],import.meta.url).then(i=>i.default),"../i18n/en.strings":()=>Q(()=>import("./en-CHM6FOYw.js"),[],import.meta.url).then(i=>i.default),"../i18n/es.strings":()=>Q(()=>import("./es-ha3UN8DQ.js"),[],import.meta.url).then(i=>i.default),"../i18n/fr.strings":()=>Q(()=>import("./fr-UiUxTyGK.js"),[],import.meta.url).then(i=>i.default),"../i18n/he.strings":()=>Q(()=>import("./he-D_LHtXfc.js"),[],import.meta.url).then(i=>i.default),"../i18n/it.strings":()=>Q(()=>import("./it-Bxp07svi.js"),[],import.meta.url).then(i=>i.default),"../i18n/ja.strings":()=>Q(()=>import("./ja-9S_323Dj.js"),[],import.meta.url).then(i=>i.default),"../i18n/ko.strings":()=>Q(()=>import("./ko-DHMRauQa.js"),[],import.meta.url).then(i=>i.default),"../i18n/nb.strings":()=>Q(()=>import("./nb-Cr772wdv.js"),[],import.meta.url).then(i=>i.default),"../i18n/nl.strings":()=>Q(()=>import("./nl-CiVlWKIy.js"),[],import.meta.url).then(i=>i.default),"../i18n/pl.strings":()=>Q(()=>import("./pl-B4o_YjNG.js"),[],import.meta.url).then(i=>i.default),"../i18n/pt-PT.strings":()=>Q(()=>import("./pt-PT-BLPvUgTR.js"),[],import.meta.url).then(i=>i.default),"../i18n/ru.strings":()=>Q(()=>import("./ru-DLZRltoa.js"),[],import.meta.url).then(i=>i.default),"../i18n/sv.strings":()=>Q(()=>import("./sv-IXV83uxu.js"),[],import.meta.url).then(i=>i.default),"../i18n/tr.strings":()=>Q(()=>import("./tr-DZP25RUK.js"),[],import.meta.url).then(i=>i.default),"../i18n/uk.strings":()=>Q(()=>import("./uk-F1BqsLKX.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hans.strings":()=>Q(()=>import("./zh-Hans-p7zVv8W8.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hant.strings":()=>Q(()=>import("./zh-Hant-Dxf58hMr.js"),[],import.meta.url).then(i=>i.default)});function Ba(i,e){var t;return(t=Object.entries(i).find(([n])=>n.endsWith(e)))==null?void 0:t[1]}function Rd(i){const e=new Map,t=i.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*\/\/.*$/gm,""),n=/"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;/g,a=s=>s.replace(/\\(u[0-9a-fA-F]{4}|.)/g,(r,o)=>o==="n"?` -`:o==="t"?" ":o.startsWith("u")&&o.length===5?String.fromCharCode(parseInt(o.slice(1),16)):o);for(const s of t.matchAll(n))e.set(a(s[1]),a(s[2]));return e}async function uo(i){const e=i==="java"?Ba(Jd,"/Java.strings"):Ba(A2,`/${i}.lproj/Localizable.strings`),t=Ba(P2,`/${i}.strings`),n=new Map;for(const a of[e,t])if(a)for(const[s,r]of Rd(await a()))n.set(s,r);return n}let Gd="en",Hd=new Map,$n=new Map;const $a="appLanguageCode",Dl="visustruct.keywords";let mo=new Map,Zl=!1;const j2=i=>i.startsWith("element_")||i.startsWith("canvas_stub_");function C2(){try{const i=new URLSearchParams(location.search).get("lang")==="java"||localStorage.getItem($a)==="java";return i&&(localStorage.setItem($a,"en"),localStorage.setItem(Dl,"1")),i}catch{return!1}}function B2(){try{return localStorage.getItem(Dl)==="1"}catch{return!1}}async function Vd(i,e=!0){if(i&&mo.size===0){$n.size===0&&($n=await uo("en"));const t=Ba(Jd,"/Java.strings");if(t)for(const[n,a]of Rd(await t()))j2(n)&&a!==$n.get(n)&&mo.set(n,a)}if(Zl=i,e)try{localStorage.setItem(Dl,i?"1":"0")}catch{}}function D2(){return Zl}function Z2(){if(C2())return"en";const i=new URLSearchParams(location.search).get("lang");if(i&&tu(i))return i;try{const e=localStorage.getItem($a);if(e&&tu(e))return e}catch{}for(const e of navigator.languages??[navigator.language]){const t=e.toLowerCase();if(t.startsWith("pt"))return"pt-PT";const n=Fd.find(a=>a.code===t.split("-")[0]);if(n)return n.code}return"en"}async function Qd(i,e=!0){if($n.size===0&&($n=await uo("en")),Hd=i==="en"?$n:await uo(i),Gd=i,e)try{localStorage.setItem($a,i)}catch{}const t=document.documentElement;t.lang=i==="java"?"en":i,t.dir=i==="ar"||i==="he"?"rtl":"ltr"}function i1(){return Gd}function p(i,...e){const t=(Zl?mo.get(i):void 0)??Hd.get(i)??$n.get(i)??i;if(e.length===0)return t;let n=0;return t.replace(/%(?:(\d+)\$)?[@d]/g,(a,s)=>String(e[s?Number(s)-1:n++]??""))}const Ya=243,M2=244,qd=40,ur=4,L2=1;function Ml(i){const e=i.length,t=Ya+(e&255)+(e>>8)&255,n=i.reduce((a,s)=>a+s,0)&255;return Uint8Array.from([Ya,t,e&255,e>>8,...i,n,M2])}function W2(i,e,t){const n=Array.from(new TextEncoder().encode(i));return Ml([qd,e,t&255,t>>8&255,n.length&255,n.length>>8,...n])}function E2(i){if(i[0]!==qd||i.length<6)return;const e=new TextDecoder().decode(Uint8Array.from(i.slice(6))),t=/"ret"\s*:\s*([^}]*)\}/.exec(e);return t?{idx:i[2]|i[3]<<8,value:F2(t[1].trim())}:void 0}function N2(i){const e=[];for(;;){const t=i.indexOf(Ya);if(t<0){i.length=0;break}if(i.splice(0,t),i.length<4)break;const n=i[2]|i[3]<<8;if(i[1]!==(Ya+i[2]+i[3]&255)||n>4096){i.splice(0,1);continue}if(i.length/g,">")}function k2(i){return i.replace(/&/g,"&").replace(//g,">")}function X0(i){return String(i.a<<24|i.r<<16|i.g<<8|i.b|0)}function Ca(i,e){return Array.from(i.children).filter(t=>t.tagName===e)}function oo(i){const e=[];for(const t of Ca(i,"strelem")){const n=S2(t);n&&e.push(n)}return e}function S2(i){const e=ni(i,"typ");if(e===void 0||I[e]===void 0)return;const t={type:e,zoomX:ni(i,"zx")??0,zoomY:ni(i,"zy")??0,textLines:Ca(i,"text").map(o=>so((o.textContent??"").trim()))},n=eu(i.getAttribute("textcolor"));n&&(t.textColor=n);const a=eu(i.getAttribute("bgcolor"));a&&(t.backgroundColor=a),t.textLines.length===0&&(t.textLines=[""]);const s=Ca(i,"schleifeninhalt")[0];if(s){const o=oo(s);o.length>0&&(t.loopBody=o)}const r=Ca(i,"fall").map(o=>({name:so(o.getAttribute("fallname")??""),elements:oo(o)}));return r.length>0&&(t.cases=r),t}function K0(i,e){const t=i.getAttribute(e);return t===null?void 0:so(t)}function ni(i,e){const t=i.getAttribute(e);if(!(t===null||!/^[+-]?\d+$/.test(t)))return Number(t)}function eu(i){if(i===null||!/^[+-]?\d+$/.test(i))return;const e=Number(i);if(e<-2147483648||e>2147483647)return;const t=e>>>0;return{a:t>>>24&255,r:t>>>16&255,g:t>>>8&255,b:t&255}}const _2="http://www.w3.org/2000/svg",Be={diagramLineWidth:2,outerFrameLineWidth:2,selectionLineWidth:3.5,canvasOuterMargin:16,cellTextInsetX:18,cellTextInsetY:15,multiHeaderFirstLineY:14,branchLabelInsetX:10,fallauswahlCaseLabelBand:26,callSideBarInset:14,callTextInsetFromSideBar:20,loopBodyLeadingInset:20};function Ed(i){switch(i){case I.forSchleife:case I.whileSchleife:case I.doUntilSchleife:case I.endlosschleife:return"loop";case I.verzweigung:case I.fallauswahl:return"if";default:return}}function ye(i,e={}){const t=document.createElementNS(_2,i);for(const[n,a]of Object.entries(e))t.setAttribute(n,String(a));return t}class Nd{constructor(e,t){v(this,"usesSimulationHighlight",!1);v(this,"fillsSelection",!1);this.metrics=e,this.measure=t}get lineHeight(){return this.metrics.lineHeight}get fontSize(){return this.metrics.fontSize}render(e,t,n,a=Be.canvasOuterMargin){const s=ye("svg",{width:t.width,height:t.height,viewBox:`0 0 ${t.width} ${t.height}`,"font-family":Ls,"font-size":this.fontSize,class:"diagram"});s.append(ye("rect",{x:0,y:0,width:t.width,height:t.height,fill:"#fafafa"}));const r=a;s.append(ye("rect",{x:r,y:r,width:e.canvasSize.width-2*r-1,height:e.canvasSize.height-2*r-1,fill:"none",stroke:"black","stroke-width":Be.outerFrameLineWidth}));const o=ye("g");for(const l of e.elements)this.drawNode(l,o,n,{},void 0,"method");return s.append(o),s}line(e,t){e.append(ye("polyline",{points:t.map(n=>n.join(",")).join(" "),fill:"none",stroke:"black","stroke-width":Be.diagramLineWidth,"stroke-linejoin":"miter"}))}strokeCellBorder(e,t,n){const a=t.x,s=t.y,r=t.x+t.width,o=t.y+t.height;if(!n.top&&!n.left&&!n.bottom&&!n.right){e.append(ye("rect",{x:a,y:s,width:t.width,height:t.height,fill:"none",stroke:"black","stroke-width":Be.diagramLineWidth}));return}n.top||this.line(e,[[a,s],[r,s]]),n.right||this.line(e,[[r,s],[r,o]]),n.bottom||this.line(e,[[r,o],[a,o]]),n.left||this.line(e,[[a,o],[a,s]])}textWidth(e){const t=R0(e);return t?this.measure(t.keyword,this.fontSize,"bold")+(t.rest===""?0:this.measure(" "+t.rest,this.fontSize,"medium")):this.measure(e,this.fontSize,"medium")}drawKeywordLine(e,t,n,a){const s=ye("text",{x:n,y:a+q0(this.fontSize,"medium").ascent,"font-weight":500});s.style.whiteSpace="pre";const r=R0(t);if(r){const o=ye("tspan",{"font-weight":700});if(o.textContent=r.keyword,s.append(o),r.rest!==""){const l=ye("tspan",{});l.textContent=" "+r.rest,s.append(l)}}else s.textContent=t;e.append(s)}drawLabel(e,t,n,a,s,r){const o=q0(this.fontSize,s?"bold":"medium"),l=ye("text",{x:n,y:r==="top"?a+o.ascent:a-o.descent,"font-weight":s?700:500});l.style.whiteSpace="pre",l.textContent=t,e.append(l)}roofMetrics(e,t,n,a){const s=t.y+n,r=e.dividerYInset??0,o=12,l=Math.max(e.element.textLines.length,1)*this.lineHeight,u=t.y+Be.multiHeaderFirstLineY;if(e.element.type===I.fallauswahl){const c=Math.max(Be.fallauswahlCaseLabelBand,this.lineHeight+10),d=s-c,h=Math.min(s+r,d-8),g=Math.max(h,u+l+6);return{apex:{x:a,y:g},maxTextBottom:d-o,roofBottom:s}}const m={x:a,y:s+r};return{apex:m,maxTextBottom:m.y-o,roofBottom:s}}drawNode(e,t,n,a,s,r){var T;const o=e.frame,l=e.element,u=o.x+o.width,m=o.y+o.height,c=l.type===I.verzweigung||l.type===I.fallauswahl,d=c?e.headerBandHeight:0,h=n!==void 0&&lo(e.idPath,n),g=Ol(l),f=ye("g",{"data-path":e.idPath.join(",")});t.append(f);const x=this.usesSimulationHighlight,b=l.backgroundColor,y=b&&b.a>0?`rgba(${b.r}, ${b.g}, ${b.b}, ${b.a/255})`:"white",w=h&&(x||this.fillsSelection)?"rgba(199, 230, 255, 0.55)":y,S=Ed(l.type)??r,z=ye("rect",{x:o.x,y:o.y,width:o.width,height:o.height,fill:w});w==="white"&&S&&z.setAttribute("class",`ns-scope ns-scope-${S}`),f.append(z),this.strokeCellBorder(f,o,a);const k=Be.callSideBarInset;if(l.type===I.aufruf?(this.line(f,[[o.x+k,o.y],[o.x+k,m]]),this.line(f,[[u-k,o.y],[u-k,m]])):l.type===I.aussprung&&this.line(f,[[o.x+k,o.y],[o.x,o.y+o.height/2],[o.x+k,m]]),c&&e.dividerX!==void 0){const j=e.dividerX,C=this.roofMetrics(e,o,d,j),P=Math.max(g.length,1)*this.lineHeight,O=o.y+Be.multiHeaderFirstLineY;this.line(f,[[o.x,o.y],[C.apex.x,C.apex.y],[u,o.y]]),l.type===I.fallauswahl&&this.line(f,[[o.x,C.roofBottom],[u,C.roofBottom]]);let L;O+P<=C.maxTextBottom?L=O:L=Math.max(o.y+2,C.maxTextBottom-(Math.max(g.length,1)-1)*this.lineHeight-this.lineHeight),g.forEach((E,Q)=>{const $=this.textWidth(E);let he;if(l.type===I.verzweigung){const Te=o.x+Be.cellTextInsetX,xe=u-$-Be.cellTextInsetX;he=Math.min(Math.max(j-$/2,Te),xe)}else he=o.x+o.width/2-$/2;this.drawKeywordLine(f,E,he,L+Q*this.lineHeight)})}else if(l.type!==I.doUntilSchleife)if(l.type===I.anweisung||l.type===I.aufruf||l.type===I.aussprung){const j=Be.cellTextInsetX;let C=o.x+j,P=u-j;l.type===I.aufruf?(C=o.x+k+Be.callTextInsetFromSideBar,P=u-k-Be.callTextInsetFromSideBar):l.type===I.aussprung&&(C=o.x+k+j);const O=Math.max(0,P-C);let L=o.y+o.height/2-Math.max(1,g.length)*this.lineHeight/2;for(const E of g)this.drawKeywordLine(f,E,C+(O-this.textWidth(E))/2,L),L+=this.lineHeight}else{const j=Math.max(1,g.length)*this.lineHeight;let C=s===I.doUntilSchleife?o.y+o.height/2-j/2:o.y+Be.cellTextInsetY;for(const P of g)this.drawKeywordLine(f,P,o.x+Be.cellTextInsetX,C),C+=this.lineHeight}e.children.forEach((j,C)=>{const P=l.type===I.doUntilSchleife&&C===0?{top:!0,left:!0}:{};this.drawNode(j,t,n,P,l.type,S)});const _=ye("g");if(t.append(_),l.type===I.doUntilSchleife){const j=((T=e.children[0])==null?void 0:T.frame.x)??o.x+(e.loopBodyLeadingInset>0?e.loopBodyLeadingInset:Be.loopBodyLeadingInset);this.drawLabel(_,"do",o.x+4,o.y+this.metrics.doUntilDoLabelTopInset,!0,"top");const C=m-e.headerBandHeight;this.line(_,[[j,C],[u,C]]),this.line(_,[[j,o.y],[j,C]]);let P=C+this.metrics.doUntilFooterTopInset;for(const O of g)this.drawKeywordLine(_,O,o.x+Be.cellTextInsetX,P),P+=this.lineHeight}if(c&&e.dividerX!==void 0&&e.caseColumnFrames.length>1){const j=this.roofMetrics(e,o,d,e.dividerX),C=j.apex;e.caseColumnFrames.forEach((O,L)=>{if(L>=e.caseColumnFrames.length-1)return;const E=O.x+O.width,Q=T2(E,o,C),$=Number.isFinite(Q)?Math.min(Math.max(Q,o.y),m):o.y;this.line(_,[[E,m],[E,$]])});const P=l.cases;if(P&&P.length===e.caseColumnFrames.length){const O=l.type===I.fallauswahl?j.roofBottom-6:o.y+d-8,L=Be.branchLabelInsetX;if(l.type===I.verzweigung&&P.length===2){this.drawLabel(_,"true",o.x+L,O,!0,"bottom");const E=e.caseColumnFrames[1],Q=this.measure("false",this.fontSize,"bold");this.drawLabel(_,"false",E.x+E.width-L-Q,O,!0,"bottom")}else P.forEach((E,Q)=>{const $=e.caseColumnFrames[Q],he=["default","true","false"].includes(E.name.toLowerCase()),Te=this.measure(E.name,this.fontSize,he?"bold":"medium");this.drawLabel(_,E.name,$.x+$.width/2-Te/2,O,he,"bottom")})}}h&&_.append(ye("rect",{x:o.x,y:o.y,width:o.width,height:o.height,class:"selection-frame",fill:"none",stroke:x?"rgba(66, 140, 242, 0.78)":"rgba(0, 122, 255, 0.9)","stroke-width":Be.selectionLineWidth}))}}function T2(i,e,t){const n=e.y;if(i<=t.x){const s=t.x-e.x;return Math.abs(s)<.5?t.y:n+(t.y-n)/s*(i-e.x)}const a=e.x+e.width-t.x;return Math.abs(a)<.5?t.y:t.y+(n-t.y)/a*(i-t.x)}function lo(i,e){return i.length===e.length&&i.every((t,n)=>t===e[n])}function O2(i){const e=[],t=n=>{e.push(n),n.children.forEach(t)};return i.forEach(t),e}function Ua(i){var e,t;return{...i,textLines:Ol(i),loopBody:(e=i.loopBody)==null?void 0:e.map(Ua),cases:(t=i.cases)==null?void 0:t.map(n=>({name:n.name,elements:n.elements.map(Ua)}))}}const A2=[{code:"de",name:"Deutsch"},{code:"en",name:"English"},{code:"es",name:"Español"},{code:"fr",name:"Français"},{code:"it",name:"Italiano"},{code:"pl",name:"Polski"},{code:"tr",name:"Türkçe"},{code:"ko",name:"한국어"},{code:"ja",name:"日本語"},{code:"el",name:"Ελληνικά"},{code:"uk",name:"Українська"},{code:"ar",name:"العربية"},{code:"ru",name:"Русский"},{code:"he",name:"עברית"},{code:"nl",name:"Nederlands"},{code:"sv",name:"Svenska"},{code:"da",name:"Dansk"},{code:"nb",name:"Norsk bokmål"},{code:"zh-Hans",name:"中文(简体)"},{code:"zh-Hant",name:"中文(繁體)"},{code:"pt-PT",name:"Português"},{code:"java",name:"Java (Keywords)"}],Fd=["de","en","pt-PT"],Jd=A2.filter(i=>Fd.includes(i.code)),tu=i=>Fd.includes(i),P2=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ar.lproj/Localizable.strings":()=>q(()=>import("./Localizable-CxCno28C.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/da.lproj/Localizable.strings":()=>q(()=>import("./Localizable-BAutdlBb.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/de.lproj/Localizable.strings":()=>q(()=>import("./Localizable-Dk8F86qS.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/el.lproj/Localizable.strings":()=>q(()=>import("./Localizable-rqA-20hM.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/en.lproj/Localizable.strings":()=>q(()=>import("./Localizable-DBLIUcBd.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/es.lproj/Localizable.strings":()=>q(()=>import("./Localizable-LSTVB2Q5.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/fr.lproj/Localizable.strings":()=>q(()=>import("./Localizable-ByPZS4RL.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/he.lproj/Localizable.strings":()=>q(()=>import("./Localizable-R-16GCrk.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/it.lproj/Localizable.strings":()=>q(()=>import("./Localizable-DXAPah1g.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ja.lproj/Localizable.strings":()=>q(()=>import("./Localizable-CkJEmEEP.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ko.lproj/Localizable.strings":()=>q(()=>import("./Localizable-BudCXCER.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nb.lproj/Localizable.strings":()=>q(()=>import("./Localizable-DSvkBkp-.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/nl.lproj/Localizable.strings":()=>q(()=>import("./Localizable-BJ55WGVD.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pl.lproj/Localizable.strings":()=>q(()=>import("./Localizable-BYJK0mdR.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/pt-PT.lproj/Localizable.strings":()=>q(()=>import("./Localizable-CHv0OL9S.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/ru.lproj/Localizable.strings":()=>q(()=>import("./Localizable-1QZ0wfvJ.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/sv.lproj/Localizable.strings":()=>q(()=>import("./Localizable-M33nNbEe.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/tr.lproj/Localizable.strings":()=>q(()=>import("./Localizable-BM86Igqt.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/uk.lproj/Localizable.strings":()=>q(()=>import("./Localizable-UGog_aku.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hans.lproj/Localizable.strings":()=>q(()=>import("./Localizable-CaVEL1es.js"),[],import.meta.url).then(i=>i.default),"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/zh-Hant.lproj/Localizable.strings":()=>q(()=>import("./Localizable-DqIDp_hh.js"),[],import.meta.url).then(i=>i.default)}),Rd=Object.assign({"../../../VisuStruct-iOS/VisuStructXcodeOpen/VisuStruct/Java.strings":()=>q(()=>import("./Java-Bpx1Vwvg.js"),[],import.meta.url).then(i=>i.default)}),j2=Object.assign({"../i18n/ar.strings":()=>q(()=>import("./ar-Ce_JBvN0.js"),[],import.meta.url).then(i=>i.default),"../i18n/da.strings":()=>q(()=>import("./da-DECOxrcR.js"),[],import.meta.url).then(i=>i.default),"../i18n/de.strings":()=>q(()=>import("./de-aPa6h38I.js"),[],import.meta.url).then(i=>i.default),"../i18n/el.strings":()=>q(()=>import("./el-yeMMlSVC.js"),[],import.meta.url).then(i=>i.default),"../i18n/en.strings":()=>q(()=>import("./en-CZyy4vg0.js"),[],import.meta.url).then(i=>i.default),"../i18n/es.strings":()=>q(()=>import("./es-ha3UN8DQ.js"),[],import.meta.url).then(i=>i.default),"../i18n/fr.strings":()=>q(()=>import("./fr-UiUxTyGK.js"),[],import.meta.url).then(i=>i.default),"../i18n/he.strings":()=>q(()=>import("./he-D_LHtXfc.js"),[],import.meta.url).then(i=>i.default),"../i18n/it.strings":()=>q(()=>import("./it-Bxp07svi.js"),[],import.meta.url).then(i=>i.default),"../i18n/ja.strings":()=>q(()=>import("./ja-9S_323Dj.js"),[],import.meta.url).then(i=>i.default),"../i18n/ko.strings":()=>q(()=>import("./ko-DHMRauQa.js"),[],import.meta.url).then(i=>i.default),"../i18n/nb.strings":()=>q(()=>import("./nb-Cr772wdv.js"),[],import.meta.url).then(i=>i.default),"../i18n/nl.strings":()=>q(()=>import("./nl-CiVlWKIy.js"),[],import.meta.url).then(i=>i.default),"../i18n/pl.strings":()=>q(()=>import("./pl-B4o_YjNG.js"),[],import.meta.url).then(i=>i.default),"../i18n/pt-PT.strings":()=>q(()=>import("./pt-PT-BcL3wukx.js"),[],import.meta.url).then(i=>i.default),"../i18n/ru.strings":()=>q(()=>import("./ru-DLZRltoa.js"),[],import.meta.url).then(i=>i.default),"../i18n/sv.strings":()=>q(()=>import("./sv-IXV83uxu.js"),[],import.meta.url).then(i=>i.default),"../i18n/tr.strings":()=>q(()=>import("./tr-DZP25RUK.js"),[],import.meta.url).then(i=>i.default),"../i18n/uk.strings":()=>q(()=>import("./uk-F1BqsLKX.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hans.strings":()=>q(()=>import("./zh-Hans-p7zVv8W8.js"),[],import.meta.url).then(i=>i.default),"../i18n/zh-Hant.strings":()=>q(()=>import("./zh-Hant-Dxf58hMr.js"),[],import.meta.url).then(i=>i.default)});function Ba(i,e){var t;return(t=Object.entries(i).find(([n])=>n.endsWith(e)))==null?void 0:t[1]}function Gd(i){const e=new Map,t=i.replace(/\/\*[\s\S]*?\*\//g,"").replace(/^\s*\/\/.*$/gm,""),n=/"((?:[^"\\]|\\.)*)"\s*=\s*"((?:[^"\\]|\\.)*)"\s*;/g,a=s=>s.replace(/\\(u[0-9a-fA-F]{4}|.)/g,(r,o)=>o==="n"?` +`:o==="t"?" ":o.startsWith("u")&&o.length===5?String.fromCharCode(parseInt(o.slice(1),16)):o);for(const s of t.matchAll(n))e.set(a(s[1]),a(s[2]));return e}async function uo(i){const e=i==="java"?Ba(Rd,"/Java.strings"):Ba(P2,`/${i}.lproj/Localizable.strings`),t=Ba(j2,`/${i}.strings`),n=new Map;for(const a of[e,t])if(a)for(const[s,r]of Gd(await a()))n.set(s,r);return n}let Hd="en",Vd=new Map,$n=new Map;const $a="appLanguageCode",Dl="visustruct.keywords";let mo=new Map,Zl=!1;const C2=i=>i.startsWith("element_")||i.startsWith("canvas_stub_");function B2(){try{const i=new URLSearchParams(location.search).get("lang")==="java"||localStorage.getItem($a)==="java";return i&&(localStorage.setItem($a,"en"),localStorage.setItem(Dl,"1")),i}catch{return!1}}function D2(){try{return localStorage.getItem(Dl)==="1"}catch{return!1}}async function Qd(i,e=!0){if(i&&mo.size===0){$n.size===0&&($n=await uo("en"));const t=Ba(Rd,"/Java.strings");if(t)for(const[n,a]of Gd(await t()))C2(n)&&a!==$n.get(n)&&mo.set(n,a)}if(Zl=i,e)try{localStorage.setItem(Dl,i?"1":"0")}catch{}}function Z2(){return Zl}function M2(){if(B2())return"en";const i=new URLSearchParams(location.search).get("lang");if(i&&tu(i))return i;try{const e=localStorage.getItem($a);if(e&&tu(e))return e}catch{}for(const e of navigator.languages??[navigator.language]){const t=e.toLowerCase();if(t.startsWith("pt"))return"pt-PT";const n=Jd.find(a=>a.code===t.split("-")[0]);if(n)return n.code}return"en"}async function qd(i,e=!0){if($n.size===0&&($n=await uo("en")),Vd=i==="en"?$n:await uo(i),Hd=i,e)try{localStorage.setItem($a,i)}catch{}const t=document.documentElement;t.lang=i==="java"?"en":i,t.dir=i==="ar"||i==="he"?"rtl":"ltr"}function i1(){return Hd}function p(i,...e){const t=(Zl?mo.get(i):void 0)??Vd.get(i)??$n.get(i)??i;if(e.length===0)return t;let n=0;return t.replace(/%(?:(\d+)\$)?[@d]/g,(a,s)=>String(e[s?Number(s)-1:n++]??""))}const Ya=243,L2=244,Ud=40,ur=4,W2=1;function Ml(i){const e=i.length,t=Ya+(e&255)+(e>>8)&255,n=i.reduce((a,s)=>a+s,0)&255;return Uint8Array.from([Ya,t,e&255,e>>8,...i,n,L2])}function E2(i,e,t){const n=Array.from(new TextEncoder().encode(i));return Ml([Ud,e,t&255,t>>8&255,n.length&255,n.length>>8,...n])}function N2(i){if(i[0]!==Ud||i.length<6)return;const e=new TextDecoder().decode(Uint8Array.from(i.slice(6))),t=/"ret"\s*:\s*([^}]*)\}/.exec(e);return t?{idx:i[2]|i[3]<<8,value:J2(t[1].trim())}:void 0}function F2(i){const e=[];for(;;){const t=i.indexOf(Ya);if(t<0){i.length=0;break}if(i.splice(0,t),i.length<4)break;const n=i[2]|i[3]<<8;if(i[1]!==(Ya+i[2]+i[3]&255)||n>4096){i.splice(0,1);continue}if(i.lengthArray.from({length:e},(t,n)=>i>>>8*n&255);function H2(i){let e=0;for(let t=0;t>>0;return ii(e,4)}const mr=(i,e)=>Ml([1,0,Ud,i,...ii(e.length,2),...e]);function V2(i,e=J2){const t=new TextEncoder().encode(i),n=(4-t.length%W1+W1)%W1,a=new Uint8Array(t.length+n).fill(10);a.set(t);const s=[mr(1,[0,...ii(a.length,4),...H2(a),...Array.from(new TextEncoder().encode(e))])],r=a.length-4;for(let o=0;oi.length===3&&i[0]===13,q2=i=>i.length===7||i.some((e,t)=>e===Ud&&i[t+1]===240),$d=()=>typeof navigator>"u"?void 0:navigator.serial,cr=()=>$d()!==void 0,U2=(...i)=>`exec(${JSON.stringify(i.join("; "))})`,Ws=(i,e=24)=>U2("cyberpi.display.clear()",`cyberpi.display.show_label(${JSON.stringify(i)}, ${e}, 'center')`),Yd=Ws("VisuBot",32);class $2{constructor(){v(this,"port");v(this,"writer");v(this,"reader");v(this,"loop");v(this,"rx",[]);v(this,"idx",1);v(this,"frameWaiters",[]);v(this,"waiting",new Map);v(this,"queue",Promise.resolve());v(this,"listeners",new Set);v(this,"error");v(this,"connecting",!1)}listen(e){return this.listeners.add(e),()=>this.listeners.delete(e)}changed(){for(const e of this.listeners)e()}get connected(){return this.writer!==void 0&&!this.connecting}async connect(){const e=$d();if(!e)throw new Error("Web Serial");const t=await e.requestPort();await t.open({baudRate:115200}),this.port=t,this.writer=t.writable.getWriter(),this.error=void 0,this.connecting=!0,this.changed(),this.loop=this.readLoop(),window.addEventListener("pagehide",()=>void this.disconnect(),{once:!0}),await new Promise(n=>setTimeout(n,3e3)),this.writer&&(this.rx.length=0,this.connecting=!1,this.changed(),await this.run(Yd))}async disconnect(e){if(!this.port)return this.error=e,this.changed();if(!e&&this.writer&&!this.connecting)for(const r of["mbot2.EM_stop('ALL')","cyberpi.led.off()",Ws("Bis bald!")])await this.send(r,ur,2e3).catch(()=>{});const t=this.port,n=this.writer,a=this.reader,s=this.loop;this.port=this.writer=this.reader=this.loop=void 0,this.error=e,this.connecting=!1;for(const r of this.waiting.values())r.reject(new Error(e??"getrennt"));this.waiting.clear();try{await(a==null?void 0:a.cancel()),await s,await(n==null?void 0:n.close())}catch{}try{n==null||n.releaseLock(),await t.close()}catch(r){console.warn("[mBot2] Schließen",r.message)}this.changed()}run(e){return this.send(e,ur,3e4).then(()=>{})}ask(e){return this.send(e,L2,3e3)}async upload(e,t=()=>{}){if(this.port||await this.connect(),!this.writer)throw new Error(this.error??"nicht verbunden");const n=V2(e),a=6+n.length+3;let s=0;const r=()=>t(++s,a),o=async()=>{await this.sendFrame(Ml(R2),Q2),r();for(const l of G2)await this.send(l,ur,3e3),r()};await o(),await o();for(const l of n)await this.sendFrame(l,q2),r();s=a-3,await o(),await this.restart()}sendFrame(e,t){const n=this.queue.then(async()=>{for(let a=0;a<3;a++){if(!this.writer)throw new Error("nicht verbunden");let s=()=>{};const r=new Promise(u=>s=u),o={match:t,resolve:s};this.frameWaiters.push(o),await this.writer.write(e);const l=await Promise.race([r.then(()=>!0),new Promise(u=>setTimeout(()=>u(!1),3e3))]);if(this.frameWaiters=this.frameWaiters.filter(u=>u!==o),l)return}throw new Error("keine Antwort")});return this.queue=n.catch(()=>{}),n}async restart(){const e=this.port;await this.disconnect("restart"),this.error=void 0,await new Promise(t=>setTimeout(t,300)),await e.open({baudRate:115200}),await new Promise(t=>setTimeout(t,500)),await e.close(),this.changed()}send(e,t,n){const a=this.queue.then(()=>new Promise((s,r)=>{if(!this.writer)return r(new Error("nicht verbunden"));const o=this.idx;this.idx=this.idx%65535+1;const l=setTimeout(()=>{this.waiting.delete(o),r(new Error("keine Antwort"))},n);this.waiting.set(o,{resolve:u=>(clearTimeout(l),s(u)),reject:u=>(clearTimeout(l),r(u))}),this.writer.write(W2(e,t,o)).catch(u=>{this.waiting.delete(o),r(u)})}));return this.queue=a.catch(()=>{}),a}async readLoop(){var e;for(;(e=this.port)!=null&&e.readable;){const t=this.port.readable.getReader();this.reader=t;try{for(;;){const{value:n,done:a}=await t.read();if(a)break;this.rx.push(...n);for(const s of N2(this.rx)){const r=this.frameWaiters.findIndex(u=>u.match(s));r>=0&&this.frameWaiters.splice(r,1)[0].resolve();const o=E2(s);if(!o)continue;const l=this.waiting.get(o.idx);this.waiting.delete(o.idx),l==null||l.resolve(o.value)}}}catch(n){const a=["BufferOverrunError","FramingError","BreakError","ParityError"].includes(n.name);console.warn("[mBot2] Lesefehler",n.name,n.message),!a&&this.port&&this.disconnect(n.message)}finally{t.releaseLock()}if(!this.writer)break}}}const le=new $2,Xd=5,Y2=i=>Number.isInteger(i)&&i>=0&&iString(Math.round(i*100)/100),xi={forward:{args:1,defaults:[nu],python:([i])=>`mbot2.straight(${fe(i)})`,label:([i])=>`${fe(i)} cm vorwärts`},backward:{args:1,defaults:[nu],python:([i])=>`mbot2.straight(${fe(-i)})`,label:([i])=>`${fe(i)} cm rückwärts`},turnLeft:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${fe(-i)})`,label:([i])=>`${fe(i)}° nach links drehen`},turnRight:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${fe(i)})`,label:([i])=>`${fe(i)}° nach rechts drehen`},stop:{args:0,python:()=>'mbot2.EM_stop("ALL")',label:()=>"anhalten"},drive:{args:2,python:([i,e])=>`mbot2.drive_power(${fe(i)}, ${fe(-e)})`,label:([i,e])=>`Räder links ${fe(i)} %, rechts ${fe(e)} %`},setLed:{args:3,python:([i,e,t])=>`cyberpi.led.on(${fe(i)}, ${fe(e)}, ${fe(t)})`,label:([i,e,t])=>`LEDs (${fe(i)}, ${fe(e)}, ${fe(t)})`},ledOff:{args:0,python:()=>"cyberpi.led.off()",label:()=>"LEDs aus"},ledColor:{args:1,text:!0,choices:Object.keys(Xa),valid:([i])=>Y2(i),python:([i],e)=>`cyberpi.led.on(${Xa[e].join(", ")}, id=${i+1})`,label:([i],e)=>`LED ${i}: ${e}`},playTone:{args:2,python:([i,e])=>`cyberpi.audio.play_tone(${fe(i)}, ${fe(e/1e3)})`,label:([i,e])=>`Ton ${fe(i)} Hz, ${fe(e)} ms`},pause:{args:1,label:([i])=>`${fe(i)} ms warten`},resetTimer:{args:0,python:()=>"cyberpi.timer.reset()",label:()=>"Stoppuhr auf 0"},emotion:{args:0,text:!0,choices:X2,python:(i,e)=>`cyberpi.emotion.${e}()`,label:(i,e)=>`Gefühl: ${e}`},showText:{args:0,text:!0,python:(i,e)=>Ws(e),label:(i,e)=>`Bildschirm: ${e}`}},iu={red:{de:"rot",en:"red"},green:{de:"grün",en:"green"},blue:{de:"blau",en:"blue"},yellow:{de:"gelb",en:"yellow"},cyan:{de:"türkis",en:"cyan"},purple:{de:"lila",en:"purple"},white:{de:"weiß",en:"white"},black:{de:"schwarz",en:"black"}};let Ll="en";function K2(i){Ll=i==="de"?"de":"en"}const e3=()=>Ll;function Kd(i){const e=i.trim().toLowerCase(),t=iu[e]??Object.values(iu).find(n=>n.de===e);return t?t[Ll]:e}const l1=i=>({python:`cyberpi.controller.is_press('${i}')`,simulated:!1}),St={getDistance:{python:"mbuild.ultrasonic2.get(1)",simulated:100},getLine:{python:"mbuild.quad_rgb_sensor.get_line_sta('all', 1)",simulated:0},isLineLeft:{python:"mbuild.quad_rgb_sensor.is_line('L1', 1)",simulated:!1},isLineRight:{python:"mbuild.quad_rgb_sensor.is_line('R1', 1)",simulated:!1},getColor:{python:"mbuild.quad_rgb_sensor.get_color_sta('L1', 1)",simulated:"white"},isButtonA:l1("a"),isButtonB:l1("b"),isJoystickUp:l1("up"),isJoystickDown:l1("down"),isJoystickLeft:l1("left"),isJoystickRight:l1("right"),getBrightness:{python:"cyberpi.get_bri()",simulated:50},getLoudness:{python:"cyberpi.get_loudness('maximum')",simulated:0},getPitch:{python:"cyberpi.get_pitch()",simulated:0},getRoll:{python:"cyberpi.get_roll()",simulated:0},isShaken:{python:"cyberpi.is_shake()",simulated:!1},getBattery:{python:"cyberpi.get_battery()",simulated:100},getTimer:{python:"cyberpi.timer.get()",simulated:0}};function t3(i){const e=new Set;for(const t of i.matchAll(/\bmbot\s*\.\s*([A-Za-z_]\w*)\s*\(\s*\)/gu))t[1]in St&&e.add(t[1]);return[...e]}function n3(i){const e=/^mbot\s*\.\s*led\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)\s*\.\s*setColor\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(e)return{method:"ledColor",args:[e[1].trim(),e[2].trim()]};const t=/^mbot\s*\.\s*([A-Za-z_]\w*)\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(!t)return;const n=t[2].trim();return{method:t[1],args:n===""?[]:s3(n)}}function Ka(i,e){const t=xi[i];if(!t)return;const n=e.length===0&&t.defaults?t.defaults:e;if(n.length===t.args)return!t.valid||t.valid(n)?n:void 0}function au(i,e,t=""){var a;const n=xi[i];return{method:i,args:e,python:(a=n.python)==null?void 0:a.call(n,e,t),waitMs:i==="pause"?Math.max(0,e[0]):void 0,label:n.label(e,t),...n.text?{text:t}:{}}}function eh(i){return i.map(e=>[e.method,...e.args.map(fe),...e.text!==void 0?[JSON.stringify(e.text)]:[]].join(" "))}function i3(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const c=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let d=0;d{if(!(n in St))return t;const a=e(n);return typeof a=="string"?JSON.stringify(n==="getColor"?Kd(a):a):String(a)}):i}function s3(i){const e=[];let t=0,n=!1,a=0;for(let s=0;s{const a=t==="turn"?((n+180)%360+360)%360-180:n;if(Math.abs(a)<1e-6)return[];const s=Math.round(Math.abs(a)*100)/100;return t==="drive"?[`${a>0?"forward":"backward"} ${s}`]:[a===-180?"turnRight 180":`${a>0?"turnRight":"turnLeft"} ${s}`]})}function th(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const u=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let m=0;ma===i[s%t])){const a=U1(i.slice(0,t));return`${n} x ${t===1?a:`(${a})`}`}}return i.join(", ")}const nh=["cyberpi","screen","joystick","buttons","leds","lightSensor","microphone","shield","powerSwitch","motors","wheels","ultrasonic","lineSensor","caster","chassis"],r3=i=>nh.includes(i),o3=100;function ih(i){switch(i.kind){case"finished":return"Simulation finished.";case"infiniteLoopWithoutBody":return"Infinite loop has no body.";case"unsupportedStatement":return`Unsupported statement: ${i.text}`;case"invalidExpression":return`Invalid expression: ${i.text}`;case"unknownVariable":return`Unknown variable: ${i.text}`;case"divisionByZero":return"Division by zero.";case"wholeNumberExpected":return"Please enter a whole number.";case"numberExpected":return"Please enter a number.";case"booleanExpected":return"Please enter true or false.";case"subprogramNotFound":return`No open diagram is called ${i.text}. The call was skipped.`;case"callTooDeep":return"Too many nested calls. Does a subprogram call itself?";case"callArguments":return`The call does not match the header of ${i.text}. Check the values in the parentheses.`;case"missingReturn":return`${i.text} ended without returning a value with return.`;case"fileNotFound":return`There is no file called ${i.text}.`;case"endOfFile":return`The file ${i.text} has no more lines.`;case"nullValue":return`${i.text} is null.`;case"other":return i.text}}class De extends Error{constructor(e){super(ih(e)),this.notice=e}}const Qe=i=>new De({kind:"unsupportedStatement",text:i}),N=i=>new De({kind:"invalidExpression",text:i}),$1=i=>new De({kind:"unknownVariable",text:i}),l3=()=>new De({kind:"divisionByZero"}),ts=new Map;function u3(i,e){ts.set(i,e)}const ah=()=>[...ts];function su(i){return i instanceof De?i.notice:{kind:"other",text:i instanceof Error?i.message:String(i)}}function m3(i){if(i===0)return"0";if(!Number.isFinite(i))return Number.isNaN(i)?"nan":i>0?"inf":"-inf";const e=Math.floor(Math.log10(Math.abs(Number(i.toPrecision(12)))));if(e<-4||e>=12){const[n,a]=i.toExponential(11).split("e"),s=n.includes(".")?n.replace(/0+$/,"").replace(/\.$/,""):n,r=Number(a);return`${s}e${r<0?"-":"+"}${String(Math.abs(r)).padStart(2,"0")}`}const t=i.toFixed(Math.max(0,11-e));return t.includes(".")?t.replace(/0+$/,"").replace(/\.$/,""):t}function ru(i){return Number.isFinite(i)&&Math.round(i)===i?i.toFixed(1):m3(i)}function ve(i){switch(i.kind){case"int":return String(i.value);case"double":return ru(i.value);case"string":return i.value;case"boolean":return String(i.value);case"intArray":return"["+i.value.map(String).join(", ")+"]";case"doubleArray":return"["+i.value.map(ru).join(", ")+"]";case"stringArray":return"["+i.value.join(", ")+"]";case"booleanArray":return"["+i.value.map(String).join(", ")+"]";case"grid":return"["+c3(i).join(", ")+"]";case"reader":return`${i.className}(${i.file})`;case"writer":return`PrintWriter(${i.file})`;case"null":return"null"}}function c3(i){return i.value.map(e=>"["+e.map(t=>ve(co(i.elementType,t))).join(", ")+"]")}function co(i,e){switch(i){case"int":return{kind:"int",value:e};case"double":return{kind:"double",value:e};case"string":return{kind:"string",value:e};case"boolean":return{kind:"boolean",value:e}}}function ou(i){return i==="string"?"":i==="boolean"?!1:0}function ho(i){return i.kind==="intArray"||i.kind==="doubleArray"||i.kind==="stringArray"||i.kind==="booleanArray"||i.kind==="grid"}function d3(i){return i.kind==="int"||i.kind==="double"?i.value:NaN}const vt=i=>({kind:"int",value:i}),wt=i=>({kind:"double",value:i}),Wl=i=>i!==void 0&&/\s/u.test(i),ns=i=>new RegExp("\\p{L}","u").test(i),Y1=i=>new RegExp("\\p{N}","u").test(i);function ai(i){const e=Array.from(i);return e.length===0||!(ns(e[0])||e[0]==="_")?!1:e.every(t=>ns(t)||Y1(t)||t==="_")}function Kt(i){switch(i.toLowerCase()){case"int":return"int";case"double":return"double";case"string":return"string";case"char":return"string";case"boolean":case"bool":return"boolean";default:return}}function lu(i){return i.kind==="int"?"int":i.kind==="double"?"double":i.kind==="boolean"?"boolean":"string"}function at(i){const e=Array.from(i);if(e.length===3&&e[0]==="'"&&e[2]==="'")return e[1];if(e.length<2||e[0]!=='"'||e[e.length-1]!=='"')return;const t=e.slice(1,-1).join("");if(/^(?:[^"\\]|\\.)*$/u.test(t))return t.replaceAll('\\"','"').replaceAll("\\n",` -`)}function uu(i){return i.replaceAll("(int)","").replaceAll("(double)","").trim()}function El(i){const e=new Array(i.length).fill(!1);let t=0,n=!1,a=!1;return i.forEach((s,r)=>{if(n){a?a=!1:s==="\\"?a=!0:s==='"'&&(n=!1);return}switch(s){case'"':n=!0;break;case"(":case"[":t+=1;break;case")":case"]":t-=1;break;default:e[r]=t===0}}),e}function is(i,e){const t=Array.from(i),n=Array.from(e),a=El(t),s=[];let r=[],o=0;for(;ot[o+m]===u)&&a.slice(o,l).every(Boolean)){s.push(r.join("").trim()),r=[],o=l;continue}r.push(t[o]),o+=1}return s.push(r.join("").trim()),s}function h3(i){const e=Array.from(i),t=El(e);for(let n=0;n=","<=","==","!="].includes(o)&&(a=o)}if(a===void 0&&(e[n]==="<"||e[n]===">")&&(a=e[n]),a===void 0)continue;const s=e.slice(0,n).join("").trim(),r=e.slice(n+a.length).join("").trim();return{lhs:s,op:a,rhs:r}}}function Es(i,e){let t=0,n=!1,a=!1;for(let s=e;se.length||!t.every((r,o)=>e[a+o]===r))continue;const s=a+t.length-1;if(Es(e,s)===e.length-1)return{lhs:e.slice(0,a).join("").trim(),rhs:e.slice(s+1,-1).join("").trim()}}}function Yi(i){const e=i.trim();for(const t of["if","while","until","switch"]){if(!e.startsWith(t))continue;const n=e.slice(t.length);if(!(n===""||Wl(n[0])||n[0]==="("))continue;let a=n.trim();const s=sh(a);return s!==void 0&&(a=s),a===""?"true":a}return e===""?"true":e}function d1(i){const e=i.trim(),t=e.indexOf("[");if(!e.endsWith("]")||t<0)return;const n=e.slice(0,t).trim();if(!ai(n))return;const a=[];let s=t;for(;s2))return{arrayName:n,indexExpressions:a}}function p3(i){const e=i.trim();if(!e.endsWith(")"))return;const t=/^([A-Za-z_]\w*(?:\s*\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*([A-Za-z_]\w*)\s*\(/u.exec(e);if(!t)return;const n=Array.from(e),a=Array.from(t[0]).length-1;if(Es(n,a)!==n.length-1)return;const s=n.slice(a+1,-1).join("").trim();return{target:t[1],method:t[2],args:s===""?[]:is(s,",")}}function mu(i){return ai(i)||d1(i)!==void 0}function dr(i){const e=[];let t="",n=!1,a=!1,s=0;for(const r of i){if(a){t+=r,a=!1;continue}if(r==="\\"){t+=r,a=!0;continue}if(r==='"'){n=!n,t+=r;continue}if(!n&&r==="("&&(s+=1),!n&&r===")"&&(s-=1),r==="+"&&!n&&s===0){e.push(t),t="";continue}t+=r}if(n)throw N(i);return e.push(t),e}function f3(i){const e=[];let t=0,n="";for(const a of i){if(a==="{"&&(t+=1),a==="}"&&(t-=1),a===","&&t===0){e.push(n),n="";continue}n+=a}return n.trim()!==""&&e.push(n),e}function cu(i){const e=Array.from(i),t=[];let n=0;for(;n1)throw N(i)}else if(!Y1(e[n]))break;n+=1}const o=e.slice(s,n).join("");if(o==="."||!/^[0-9]*\.?[0-9]*$/.test(o))throw N(i);t.push({t:"number",literal:o,value:Number(o)});continue}if(ns(a)||a==="_"){const s=n;for(;n=0&&s=0&&o=0&&s|&&|\|\||^\s*!/u.test(e)}function Yn(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function hu(i){const e=i.slice(0,3);for(;e.length<3;)e.push("");return e}function po(i){const e=i.map(t=>Yn(t).trim());return e.length===1&&e[0].includes(";")?hu(e[0].split(";").map(t=>t.trim())):hu(e)}const lt=i=>i.frame?{frame:i.frame,callPath:i.callPath}:{};function qt(i,e=[],t={}){const n=[],a=s=>n.push(t.frame?{...s,...t}:s);return i.forEach((s,r)=>{const o=[...e,r],l=s.textLines.join(" ").trim();switch(s.type){case I.anweisung:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"statement"});break;case I.verzweigung:a({path:o,text:l||"true",kind:"branch",cases:s.cases});break;case I.fallauswahl:a({path:o,text:l||"0",kind:"switchSelection",cases:s.cases});break;case I.forSchleife:a({path:o,text:l,kind:"forLoopStart",loopBody:s.loopBody,forParts:po(s.textLines)});break;case I.whileSchleife:a({path:o,text:l||"true",kind:"whileLoop",loopBody:s.loopBody});break;case I.doUntilSchleife:a({path:o,text:l||"true",kind:"doUntilLoop",loopBody:s.loopBody});break;case I.endlosschleife:a({path:o,text:l||"true",kind:"infiniteLoop",loopBody:s.loopBody});break;case I.aussprung:a({path:o,text:l,kind:"jump"});break;case I.aufruf:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"call"});break}}),n}function b3(i,e){const t=i.trim().replaceAll(",",".");switch(e){case"int":if(!/^[+-]?[0-9]+$/.test(t))throw new De({kind:"wholeNumberExpected"});return vt(Number(t));case"double":if(!/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?$/.test(t))throw new De({kind:"numberExpected"});return wt(Number(t));case"string":return{kind:"string",value:i};case"boolean":switch(t.toLowerCase()){case"true":case"wahr":return{kind:"boolean",value:!0};case"false":case"falsch":return{kind:"boolean",value:!1};default:throw new De({kind:"booleanExpected"})}}}function gu(){return{stepIndex:0,variables:new Map,outputLines:[],isHalted:!1,files:new Map,robotActions:[]}}function y3(i,e){for(let t=0;tt===e.path[n])}function yt(i){const e=/^(void|int|double|String|boolean)\s+([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(Yn(i));if(!e)return;const t=[];if(e[3].trim()!=="")for(const n of e[3].split(",")){const a=/^(int|double|String|boolean|char)\s*((?:\[\s*\]){0,2})\s+([A-Za-z_]\w*)$/u.exec(n.trim());if(!a)return;const s=(a[2].match(/\[/gu)??[]).length;t.push({type:Kt(a[1]),name:a[3],...s>0?{dims:s}:{}})}return{returnType:Kt(e[1]),name:e[2],params:t}}function rh(i){const e=/^(?:(?:(int|double|String|boolean)\s+)?([A-Za-z_]\w*)\s*=\s*)?([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(Yn(i));if(e)return{targetType:e[1]?Kt(e[1]):void 0,target:e[2],name:e[3],args:e[4].trim()===""?[]:is(e[4],",")}}function as(i){var t,n;const e=Yn(i);return((t=yt(e))==null?void 0:t.name)??((n=rh(e))==null?void 0:n.name)??e.replace(/\(\s*\)$/u,"").trim()}class bi{constructor(e,t=()=>{}){v(this,"steps");v(this,"state",gu());v(this,"nextFrame",1);v(this,"callDepth",0);v(this,"frames",new Map);v(this,"peeking",!1);v(this,"robotSensors",{});v(this,"afterOutput",!1);this.resolveSubprogram=t,this.steps=qt(e.elements)}get currentStepPath(){const e=this.steps[this.state.stepIndex];return(e==null?void 0:e.callPath)??(e==null?void 0:e.path)}get canStep(){return!this.state.isHalted&&!this.state.inputRequest&&this.state.stepIndex ${ve(n)}`}catch(n){this.state.inputErrorNotice=su(n);return}this.state.inputRequest=void 0,this.state.inputErrorNotice=void 0,this.state.stepIndex+=1,this.state.notice=this.finishedIfAtEnd()}}finishedIfAtEnd(){return this.state.stepIndex>=this.steps.length?{kind:"finished"}:void 0}splice(e){this.steps.splice(this.state.stepIndex,1,...e)}noticeAfterEntering(e){return e.length>0?void 0:this.finishedIfAtEnd()}executeBranch(e){const t=e.cases;if(!t||t.length<2)throw Qe(e.text);const n=Yi(e.text),a=this.evaluateBool(n),s=a?0:1,r=qt(t[s].elements,[...e.path,s],lt(e));this.splice(r),this.state.lastTrace=`${n} -> ${a}`,this.state.notice=this.noticeAfterEntering(r)}executeSwitchSelection(e){const t=e.cases;if(!t||t.length===0)throw Qe(e.text);const n=Yi(e.text),a=this.evaluateSwitchSelector(n),s=y3(a,t)??t.length-1,r=qt(t[s].elements,[...e.path,s],lt(e));this.splice(r),this.state.lastTrace=`${n} -> ${t[s].name}`,this.state.notice=this.noticeAfterEntering(r)}executeForLoopStart(e){const t=po(e.forParts??[e.text]);t[0]!==""&&this.executeStatement(t[0]),this.splice([{...lt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}executeForLoopCondition(e){const t=po(e.forParts??[e.text]),n=t[1]===""?"true":t[1],a=this.evaluateBool(n);if(this.state.lastTrace=`${n} -> ${a}`,a){const s=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...s,{...lt(e),path:e.path,text:t[2],kind:"forLoopIncrement",loopBody:e.loopBody,forParts:t},{...lt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}executeForLoopIncrement(e){const t=e.text.trim();t!==""&&this.executeIncrement(t),this.splice([])}executeWhileLoop(e){const t=Yi(e.text),n=this.evaluateBool(t);if(this.state.lastTrace=`${t} -> ${n}`,n){const a=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...a,{...lt(e),path:e.path,text:e.text,kind:"whileLoop",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(a)}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterDoUntilLoop(e){const t=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...t,{...lt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(t)}executeDoUntilCondition(e){const t=Yi(e.text),n=this.evaluateBool(t);if(this.state.lastTrace=`${t} -> ${n}`,n){const a=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...a,{...lt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterInfiniteLoop(e){const t=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...t,{...lt(e),path:e.path,text:e.text,kind:"infiniteLoop",loopBody:e.loopBody}]),this.state.lastTrace="true -> true",this.state.notice=t.length>0?void 0:{kind:"infiniteLoopWithoutBody"}}executeJump(e){const t=e.frame??0,n=o=>o.lengthl===e.path[u]);let a=this.steps.length,s="end";for(let o=this.state.stepIndex+1;o ${s}`,s==="return"&&this.finishFrame(r),this.state.notice=this.finishedIfAtEnd()}executeCall(e){const t=e.text,n=this.resolveSubprogram(as(t));if(!n){this.splice([]),this.state.lastTrace=`${t} -> ?`,this.state.notice={kind:"subprogramNotFound",text:t},this.state.stepIndex>=this.steps.length&&(this.state.notice={kind:"finished"});return}const a=rh(t),s=yt(n.caption);if(s?((a==null?void 0:a.args.length)??0)!==s.params.length||(a==null?void 0:a.target)!==void 0&&!s.returnType:a!==void 0&&(a.args.length>0||a.target!==void 0))throw new De({kind:"callArguments",text:(s==null?void 0:s.name)??as(t)});if(this.callDepth>=o3)throw new De({kind:"callTooDeep"});const o=new Map,l=[];s==null||s.params.forEach((d,h)=>{const g=a.args[h].trim();if(!d.dims){o.set(d.name,this.evaluateExpression(g,d.type));return}const f=this.state.variables.get(g);if(!f)throw/^[A-Za-z_]\w*$/u.test(g)?new De({kind:"unknownVariable",text:g}):N(g);if(!(d.dims===1?f.kind===`${d.type}Array`:f.kind==="grid"&&f.elementType===d.type))throw N(g);o.set(d.name,f),l.push({param:d.name,callerName:g})}),this.callDepth+=1;const u={frame:this.nextFrame++,callPath:e.callPath??e.path};s&&(this.frames.set(u.frame,{saved:this.state.variables,header:s,call:a,references:l}),this.state.variables=o);const m=qt(n.elements,[],u);this.splice([...m,{...u,path:e.path,text:t,kind:"callEnd"}]);const c=s==null?void 0:s.params.map((d,h)=>`${d.name} = ${d.dims?a.args[h].trim():ve(o.get(d.name))}`).join(", ");this.state.lastTrace=c?`${t} -> ${c}`:`${t} -> call`}executeCallEnd(e){this.callDepth-=1,this.splice([]),this.state.lastTrace=`${e.text} -> return`,this.finishFrame(e),this.state.notice=this.finishedIfAtEnd()}executeReturn(e){const t=e.frame??0,n=Yn(e.text).slice(6).trim(),a=this.frames.get(t);if(a&&n!==""){if(!a.header.returnType)throw N(e.text);a.returnValue=this.evaluateExpression(n,a.header.returnType)}const s=a!=null&&a.returnValue?`${e.text} -> ${ve(a.returnValue)}`:`${e.text} -> return`;if(t===0){this.steps.splice(this.state.stepIndex),this.state.lastTrace=s,this.state.notice={kind:"finished"};return}let r=this.state.stepIndex+1;for(;r0?new Map(t.saved):t.saved;for(const m of t.references){const c=this.state.variables.get(m.param);c&&n.set(m.callerName,c)}this.state.variables=n;const a=t.returnValue;if(t.header.returnType&&!a)throw new De({kind:"missingReturn",text:t.header.name});const s=(l=t.call)==null?void 0:l.target;if(!s||!a)return;let r=(u=t.call)==null?void 0:u.targetType;if(!r)try{r=this.inferTargetValueType(s)}catch{r=t.header.returnType}const o=r==="double"&&a.kind==="int"?wt(a.value):r==="string"?{kind:"string",value:ve(a)}:a;if(lu(o)!==r)throw N(e.text);this.assignValue(o,s),this.state.lastTrace=`${s} = ${e.text.slice(e.text.indexOf("=")+1).trim()} -> ${ve(o)}`}executeStatement(e){const t=this.state,n=e.trim(),a=n.toLowerCase(),s=this.afterOutput;if(this.afterOutput=!1,a.startsWith("input:")){t.inputRequest=this.parseInputRequest(n,s),t.outputLineOpen=!1,t.inputErrorNotice=void 0;return}const r=/^System\s*\.\s*out\s*\.\s*(println|print)\s*\(([\s\S]*)\)\s*;?$/u.exec(n);if(a.startsWith("output:")||a.startsWith("print:")||r){const y=r?r[2]:n.slice(a.startsWith("output:")?7:6),w=this.peek(()=>this.renderOutputExpression(y)),_=y.trim()===""?"":this.evaluateOutputExpression(y);t.outputLineOpen&&t.outputLines.length?t.outputLines[t.outputLines.length-1]+=_:t.outputLines.push(_),t.outputLineOpen=(r==null?void 0:r[1])==="print",this.afterOutput=!0,t.lastTrace=`${w} -> ${_}`;return}const o=n3(n);if(o){this.executeMBotCommand(o.method,o.args,n);return}if(this.executeFileStatement(n))return;if(n.endsWith("++")||n.endsWith("--")||n.includes("+=")||n.includes("-=")){this.executeIncrement(n);return}const l=/^(?:final\s+)?([A-Za-z]+)\s+([A-Za-z_]\w*(?:\s*,\s*[A-Za-z_]\w*)*)$/u.exec(Yn(n).trim()),u=l?Kt(l[1]):void 0;if(l&&u){const y=l[2].split(",").map(w=>w.trim());for(const w of y)t.variables.set(w,co(u,ou(u)));t.lastTrace=y.map(w=>`${w} = ${ve(t.variables.get(w))}`).join(", ");return}const m=n.indexOf("=");if(m<0)throw Qe(n);const c=n.slice(0,m).trim(),d=n.slice(m+1),h=this.parseArrayDeclaration(c,d);if(h){t.variables.set(h.name,h.value),t.lastTrace=`${h.name} = new ${h.typeName}[${h.count}]`;return}const g=this.parseAssignmentTarget(c);let f;try{f=this.peek(()=>this.renderNumericExpression(d))}catch{f=d.trim()}let x=g.valueType;if(!x)try{x=this.inferTargetValueType(g.variableName)}catch{x="int"}const b=this.evaluateExpression(d,x);this.assignValue(b,g.variableName),t.lastTrace=`${g.variableName} = ${f} -> ${ve(b)}`}executeMBotCommand(e,t,n){var r;if((r=xi[e])!=null&&r.text){const o=xi[e];if(t.length!==o.args+1)throw N(n);const l=Ka(e,t.slice(0,-1).map(c=>this.evaluateDouble(c)));if(!l)throw N(n);const u=au(e,l,this.evaluateOutputExpression(t[t.length-1])),m=o.choices;if(m&&!m.includes(u.text??""))throw N(`${n} (${m.join(", ")})`);this.state.robotActions.push(u),this.state.lastTrace=`${n} -> ${u.label}`;return}const a=Ka(e,t.map(o=>this.evaluateDouble(o)));if(!a)throw N(n);const s=au(e,a);this.state.robotActions.push(s),this.state.lastTrace=`${n} -> ${s.label}`}executeFileStatement(e){const t=this.state,n=Yn(e).trim(),a=/^(?:(Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*new\s+(Scanner|BufferedReader|PrintWriter)\s*\(([\s\S]*)\)$/u.exec(n);if(a){const[,m,c,d,h]=a;if(m&&m!==d)throw N(n);const g=d==="Scanner"?/^new\s+File\s*\(([\s\S]+)\)$/u.exec(h.trim()):d==="BufferedReader"?/^new\s+FileReader\s*\(([\s\S]+)\)$/u.exec(h.trim()):/^(?:new\s+(?:File|FileWriter)\s*\(([\s\S]+)\)|([\s\S]+))$/u.exec(h.trim());if(!g)throw Qe(n);const f=this.fileNameValue(g[1]??g[2]);if(d==="PrintWriter")t.variables.set(c,{kind:"writer",file:f,text:""});else{const b=this.fileContent(f).split(/\r?\n/u);b[b.length-1]===""&&b.pop(),t.variables.set(c,{kind:"reader",className:d,file:f,lines:b,next:0})}return t.lastTrace=`${c} = new ${d}(${f})`,!0}const s=/^Files\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(([^()]+)\)\s*,([\s\S]+)\)$/u.exec(n);if(s){const m=this.fileNameValue(s[1]),c=this.evaluateOutputExpression(s[2]);return t.files.set(m,c),t.lastTrace=`${m} ← ${JSON.stringify(c)}`,!0}const r=/^([A-Za-z_]\w*)\s*\.\s*(println|print|close)\s*\(([\s\S]*)\)$/u.exec(n),o=r&&t.variables.get(r[1]);if(!r||!o)return!1;if(o.kind==="null")throw new De({kind:"nullValue",text:r[1]});if(o.kind==="reader"&&r[2]==="close")return t.lastTrace=`${r[1]}.close()`,!0;if(o.kind!=="writer")return!1;if(r[2]==="close")return t.files.set(o.file,o.text),t.lastTrace=`${o.file} ← ${JSON.stringify(o.text)}`,!0;const l=r[3].trim()===""?"":this.evaluateOutputExpression(r[3]),u=r[2]==="println"?l+` -`:l;return t.variables.set(r[1],{...o,text:o.text+u}),t.lastTrace=`${r[1]}.${r[2]}(${JSON.stringify(l)})`,!0}fileNameValue(e){const t=e.trim(),n=at(t);if(n!==void 0)return n;const a=this.evaluateReference(t);if((a==null?void 0:a.kind)==="string")return a.value;throw N(t)}fileContent(e){const t=this.state.files.get(e)??ts.get(e);if(t===void 0)throw new De({kind:"fileNotFound",text:e});return t}readerMethod(e,t,n,a){if(n.args.length)throw N(a);const s=t.next0?"+":"-";if(r.kind==="int"){t.set(s,vt(r.value+a)),this.state.lastTrace=`${s} = ${r.value} ${o} 1 -> ${r.value+a}`;return}if(r.kind==="double"){const l=r.value+a;t.set(s,wt(l)),this.state.lastTrace=`${s} = ${ve(r)} ${o} 1 -> ${ve(wt(l))}`;return}throw Qe(e)}for(const[n,a]of[["+=",1],["-=",-1]]){const s=e.indexOf(n);if(s<0)continue;const r=e.slice(0,s).trim(),o=e.slice(s+2),l=t.get(r);if(!ai(r)||!l)throw Qe(e);const u=a>0?"+":"-";if(l.kind==="int"){const m=this.evaluateInt(o),c=l.value+a*m;t.set(r,vt(c)),this.state.lastTrace=`${r} = ${l.value} ${u} ${m} -> ${c}`;return}if(l.kind==="double"){const m=this.evaluateDouble(o),c=l.value+a*m;t.set(r,wt(c)),this.state.lastTrace=`${r} = ${ve(l)} ${u} ${ve(wt(m))} -> ${ve(wt(c))}`;return}throw Qe(e)}this.executeStatement(e)}parseAssignmentTarget(e){if(d1(e))return{variableName:e.trim()};const t=e.split(/\s+/u).filter(Boolean);let n,a;if(t.length===1)n=t[0];else if(t.length===2&&Kt(t[0]))n=t[1],a=Kt(t[0]);else if(t.length===3&&t[0]==="const"&&Kt(t[1]))n=t[2],a=Kt(t[1]);else throw Qe(e);if(!mu(n))throw Qe(e);return{variableName:n,valueType:a}}parseInputRequest(e,t=!1){const n=e.slice(6).trim(),a=/^(\S+)(?:\s+(\S+))?(?:\s+([\s\S]*))?$/u.exec(n);if(!a)throw Qe(e);const s=[a[1],a[2],a[3]].filter(c=>c!==void 0);let r,o,l;const u=Kt(s[0]);if(s.length>=2&&u?(r=s[1],o=u,l=(s[2]??"").trim()):(r=s[0],o=this.inferTargetValueType(r),l=(s[1]??"").trim()),!mu(r))throw Qe(e);const m=at(l)??l;return m===""&&t?this.state.outputLineOpen?{variableName:r,valueType:o,prompt:"",continuesLine:!0}:{variableName:r,valueType:o,prompt:""}:{variableName:r,valueType:o,prompt:m===""?`${r}:`:m}}parseArrayDeclaration(e,t){const n=e.split(/\s+/u).filter(Boolean);if(n.length!==2||!n[0].endsWith("[]"))return;const a=n[0].endsWith("[][]"),s=n[0].slice(0,a?-4:-2),r=Kt(s),o=n[1];if(!r||!ai(o))throw Qe(e);if(a)return this.parseGridDeclaration(o,s,r,t);const l=t.trim();if(l.startsWith("{")&&l.endsWith("}")){const h=l.slice(1,-1).split(",").map(f=>f.trim());let g;switch(r){case"int":g={kind:"intArray",value:h.map(f=>this.evaluateInt(f))};break;case"double":g={kind:"doubleArray",value:h.map(f=>this.evaluateDouble(f))};break;case"string":g={kind:"stringArray",value:h.map(f=>at(f)??this.evaluateOutputExpression(f))};break;case"boolean":g={kind:"booleanArray",value:h.map(f=>this.evaluateBool(f))};break}return{name:o,typeName:s,count:h.length,value:g}}const u=`new ${s}[`;if(!l.startsWith(u)){const h=this.evaluateStringMethod(l);if((h==null?void 0:h.kind)==="stringArray"&&r==="string")return{name:o,typeName:s,count:h.value.length,value:h}}if(!l.startsWith(u)||!l.endsWith("]"))throw Qe(t);const m=l.slice(u.length,-1),c=this.evaluateInt(m);if(c<0)throw N(m);const d=r==="int"?{kind:"intArray",value:new Array(c).fill(0)}:r==="double"?{kind:"doubleArray",value:new Array(c).fill(0)}:r==="boolean"?{kind:"booleanArray",value:new Array(c).fill(!1)}:{kind:"stringArray",value:new Array(c).fill("")};return{name:o,typeName:s,count:c,value:d}}parseGridDeclaration(e,t,n,a){var c;const s=a.trim(),r=d=>{switch(n){case"int":return this.evaluateInt(d);case"double":return this.evaluateDouble(d);case"boolean":return this.evaluateBool(d);case"string":return at(d.trim())??this.evaluateOutputExpression(d)}};if(s.startsWith("{")&&s.endsWith("}")){const d=f3(s.slice(1,-1)).map(h=>{const g=h.trim();if(!g.startsWith("{")||!g.endsWith("}"))throw N(g);return g.slice(1,-1).trim()===""?[]:g.slice(1,-1).split(",").map(f=>r(f.trim()))});return{name:e,typeName:t,count:`${d.length}][${((c=d[0])==null?void 0:c.length)??0}`,value:{kind:"grid",elementType:n,value:d}}}const o=new RegExp(String.raw`^new\s+${t}\s*\[(.+)\]\s*\[(.+)\]$`,"u").exec(s);if(!o)throw Qe(a);const l=this.evaluateInt(o[1]),u=this.evaluateInt(o[2]);if(l<0)throw N(o[1]);if(u<0)throw N(o[2]);const m={kind:"grid",elementType:n,value:Array.from({length:l},()=>new Array(u).fill(ou(n)))};return{name:e,typeName:t,count:`${l}][${u}`,value:m}}arrayIndex(e){const t=this.evaluateInt(e);if(t<0)throw N(e);return t}evaluateReference(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n;const a=this.evaluateStringMethod(t);if(a)return a;const s=/^\(\s*char\s*\)\s*(.+)$/su.exec(t);if(s){const o=this.evaluateInt(s[1]);if(!(o>=0&&o<=1114111))throw N(t);return{kind:"string",value:String.fromCodePoint(o)}}const r=d1(t);if(r)return this.valueInArray(r.arrayName,r.indexExpressions.map(o=>this.arrayIndex(o)))}evaluateStringMethod(e){const t=p3(e);if(!t)return;const n=this.evaluateStaticCall(e,t);if(n)return n;const a=this.state.variables.get(t.target.trim());if((a==null?void 0:a.kind)==="reader")return this.readerMethod(t.target.trim(),a,t,e);if((a==null?void 0:a.kind)==="null")throw new De({kind:"nullValue",text:t.target.trim()});const s=at(t.target)??this.stringValueOf(t.target);if(s===void 0)return;const r=t.args,o=d=>{const h=r[d];if(h===void 0)throw N(e);const g=at(h.trim());if(g!==void 0)return g;const f=this.evaluateReference(h);if((f==null?void 0:f.kind)==="string")return f.value;throw N(h)},l=d=>{if(r[d]===void 0)throw N(e);return this.evaluateInt(r[d])},u=d=>{if(r.length!==d)throw N(e)},m=Array.from(s),c=(d,h)=>{if(d<0||d>h)throw N(e);return d};switch(t.method){case"length":return u(0),vt(m.length);case"charAt":return u(1),{kind:"string",value:m[c(l(0),m.length-1)]};case"substring":{if(r.length!==1&&r.length!==2)throw N(e);const d=c(l(0),m.length),h=r.length===2?c(l(1),m.length):m.length;if(h0&&h[h.length-1]==="";)h.pop();return{kind:"stringArray",value:h}}default:return}}evaluateStaticCall(e,t){const n=()=>{if(t.args.length!==1)throw N(e);return t.args[0]},a=s=>{const r=at(s.trim());if(r!==void 0)return r;const o=this.evaluateReference(s);if((o==null?void 0:o.kind)==="string")return o.value;throw N(s)};switch(`${t.target}.${t.method}`){case"Integer.parseInt":{const s=a(n()).trim();if(!/^[+-]?\d+$/u.test(s))throw new De({kind:"wholeNumberExpected"});return vt(Number(s))}case"Double.parseDouble":{const s=Number(a(n()).trim());if(!Number.isFinite(s))throw new De({kind:"numberExpected"});return wt(s)}case"String.valueOf":return{kind:"string",value:this.evaluateOutputExpression(n())};case"Files.readString":{const s=/^(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)$/u.exec(n().trim());if(!s)throw N(e);const r=at(s[1]),o=ts.get(r);if(o===void 0)throw new De({kind:"fileNotFound",text:r});return{kind:"string",value:o}}default:return}}stringValueOf(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n.kind==="string"?n.value:void 0;const a=d1(t);if(!a)return;const s=this.valueInArray(a.arrayName,a.indexExpressions.map(r=>this.arrayIndex(r)));return s.kind==="string"?s.value:void 0}substituteStringCalls(e){if(!e.includes("("))return e;let t="",n=e;const a=/([A-Za-z_]\w*(?:\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*(length|indexOf|lastIndexOf|compareTo|charAt|parseInt|parseDouble)\s*\(/u;for(let s=a.exec(n);s;s=a.exec(n)){const r=s.index+s[0].length-1,o=Es(Array.from(n),Array.from(n.slice(0,r)).length);if(o===void 0)break;const l=Array.from(n),u=l.slice(Array.from(n.slice(0,s.index)).length,o+1).join(""),m=this.evaluateStringMethod(u),c=l.slice(0,Array.from(n.slice(0,s.index)).length).join(""),d=(m==null?void 0:m.kind)==="string"?go(m.value):void 0;(m==null?void 0:m.kind)==="int"?t+=c+String(m.value):(m==null?void 0:m.kind)==="double"?t+=c+(Number.isInteger(m.value)?m.value.toFixed(1):String(m.value)):d!==void 0?t+=c+String(d):t+=c+u,n=l.slice(o+1).join("")}return t+n}valueInArray(e,t){const n=this.state.variables.get(e);if(!n)throw $1(e);const a=`${e}[${t.join("][")}]`;if(n.kind==="grid"){if(t.length!==2)throw N(a);const r=n.value[t[0]];if(!r||t[1]>=r.length)throw N(a);return co(n.elementType,r[t[1]])}if(t.length!==1)throw N(a);const s=t[0];if(!ho(n))throw N(e);if(s>=n.value.length)throw N(a);switch(n.kind){case"intArray":return vt(n.value[s]);case"doubleArray":return wt(n.value[s]);case"stringArray":return{kind:"string",value:n.value[s]};case"booleanArray":return{kind:"boolean",value:n.value[s]};default:throw N(e)}}inferTargetValueType(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return lu(n);const a=d1(t);if(a){const s=this.state.variables.get(a.arrayName);if(!s)throw $1(a.arrayName);if(s.kind==="intArray")return"int";if(s.kind==="doubleArray")return"double";if(s.kind==="stringArray")return"string";if(s.kind==="booleanArray")return"boolean";if(s.kind==="grid")return s.elementType;throw N(a.arrayName)}throw Qe(e)}assignValue(e,t){const n=t.trim(),a=d1(n);if(!a){this.state.variables.set(n,e);return}const s=a.indexExpressions.map(u=>this.arrayIndex(u)),r=this.state.variables.get(a.arrayName);if(!r)throw $1(a.arrayName);if(r.kind==="grid"){if(s.length!==2||s[0]>=r.value.length||s[1]>=r.value[s[0]].length)throw N(n);const u=r.elementType==="double"&&e.kind==="int"||e.kind===r.elementType?e.value:void 0;if(u===void 0||ho(e))throw N(n);const m=r.value.map(c=>[...c]);m[s[0]][s[1]]=u,this.state.variables.set(a.arrayName,{...r,value:m});return}if(s.length!==1)throw N(n);const o=s[0];let l;if(r.kind==="intArray"&&e.kind==="int")l={kind:"intArray",value:[...r.value]};else if(r.kind==="doubleArray"&&(e.kind==="double"||e.kind==="int"))l={kind:"doubleArray",value:[...r.value]};else if(r.kind==="stringArray"&&e.kind==="string")l={kind:"stringArray",value:[...r.value]};else if(r.kind==="booleanArray"&&e.kind==="boolean")l={kind:"booleanArray",value:[...r.value]};else throw N(n);if(o>=l.value.length)throw N(n);l.value[o]=e.value,this.state.variables.set(a.arrayName,l)}evaluateOutputExpression(e){const t=this.withSensors(e).trim();if(du(t)&&dr(t).every(s=>at(s.trim())===void 0)&&!this.evaluateReference(t))return String(this.evaluateBool(t));let n,a;for(const s of dr(this.withSensors(e))){const r=s.trim(),o=at(r),l=o!==void 0?{kind:"string",value:o}:this.evaluateReference(r)??(du(r)?{kind:"boolean",value:this.evaluateBool(r)}:this.evaluateNumeric(r)),u=l.kind==="int"||l.kind==="double";if(a===void 0&&u){n?n=n.kind==="int"&&l.kind==="int"?vt(n.value+l.value):wt(n.value+l.value):n=l;continue}a=(a??(n?ve(n):""))+ve(l),n=void 0}return a??(n?ve(n):"")}renderOutputExpression(e){return dr(e).map(t=>{const n=t.trim();if(at(n)!==void 0)return n;const a=this.evaluateReference(n);if(a)return ve(a);try{return this.renderNumericExpression(n)}catch{return n}}).join(" + ")}evaluateExpression(e,t){switch(t){case"int":return vt(this.evaluateInt(e));case"double":return wt(this.evaluateDouble(e));case"string":{const n=e.trim(),a=at(n);if(a!==void 0)return{kind:"string",value:a};if(n==="null")return{kind:"null"};const s=this.evaluateReference(n);return(s==null?void 0:s.kind)==="null"?s:s?{kind:"string",value:ve(s)}:{kind:"string",value:this.evaluateOutputExpression(e)}}case"boolean":return{kind:"boolean",value:this.evaluateBool(e)}}}evaluateNumeric(e){const{v:t,int:n}=this.parser(e).parseNumber();return n||Number.isFinite(t)&&Math.round(t)===t?vt(t):wt(t)}parser(e){const t=this.withSensors(e);return new x3(cu(uu(this.substituteStringCalls(t))),this.state.variables)}withSensors(e){return a3(e,t=>this.robotSensors[t]??St[t].simulated)}evaluateInt(e){return this.parser(e).parseInt()}evaluateDouble(e){return this.parser(e).parseDouble()}evaluateBool(e){const t=this.withSensors(e).trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);if((n==null?void 0:n.kind)==="boolean")return n.value;const a=is(t,"||");if(a.length>1)return a.some(u=>this.evaluateBool(u));const s=is(t,"&&");if(s.length>1)return s.every(u=>this.evaluateBool(u));if(t.startsWith("!")&&!t.startsWith("!="))return!this.evaluateBool(t.slice(1));const r=sh(t);if(r!==void 0)return this.evaluateBool(r);const o=g3(t);if(o)return this.evaluateComparison(o.lhs,"==",o.rhs);const l=h3(t);if(l)return this.evaluateComparison(l.lhs,l.op,l.rhs);if(this.stringOperand(t)!==void 0)throw N(t);return this.evaluateDouble(t)!==0}evaluateComparison(e,t,n){if((e.trim()==="null"||n.trim()==="null")&&(t==="=="||t==="!=")){const m=d=>{var h;return d.trim()==="null"||((h=this.evaluateReference(d))==null?void 0:h.kind)==="null"},c=m(e)===m(n);return t==="=="?c:!c}const a=this.booleanOperand(e),s=this.booleanOperand(n);if((a!==void 0||s!==void 0)&&(t==="=="||t==="!=")){const m=a??this.evaluateBool(e),c=s??this.evaluateBool(n);return t==="=="?m===c:m!==c}const r=this.stringOperand(e),o=this.stringOperand(n);let l,u;if(r!==void 0||o!==void 0){if(r===void 0||o===void 0)throw N(`${e} ${t} ${n}`);l=r,u=o}else l=this.evaluateDouble(e),u=this.evaluateDouble(n);switch(t){case"==":return l===u;case"!=":return l!==u;case"<":return l":return l>u;case">=":return l>=u;default:throw N(`${e} ${t} ${n}`)}}booleanOperand(e){const t=e.trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);return(n==null?void 0:n.kind)==="boolean"?n.value:void 0}stringOperand(e){const t=e.trim(),n=at(t);if(n!==void 0)return n;const a=this.evaluateReference(t);return(a==null?void 0:a.kind)==="string"?a.value:void 0}evaluateSwitchSelector(e){const t=this.withSensors(e).trim(),n=at(t);if(n!==void 0)return{kind:"text",value:n};const a=this.state.variables.get(t);if(a)switch(a.kind){case"int":return{kind:"int",value:a.value};case"double":return{kind:"int",value:Math.trunc(a.value)};case"string":return{kind:"text",value:a.value};default:throw N(t)}return/^[+-]?[0-9]+$/.test(t)?{kind:"int",value:Number(t)}:{kind:"int",value:this.evaluateInt(t)}}renderNumericExpression(e){return cu(uu(e)).map(t=>{if(t.t==="number")return t.literal;if(t.t==="identifier"){const n=this.state.variables.get(t.name);if(!n)throw $1(t.name);return ve(n)}return t.t}).join(" ").replaceAll("( ","(").replaceAll(" )",")").replaceAll(" . ",".").replaceAll("[ ","[").replaceAll(" ]","]")}}const oh={baseIndent:0,indentPerLevel:4,includeDiagramTextAsComments:!1,includeEmptyElseBranch:!0,pseudocodeNote:"Pseudocode – not a runnable program"};function ss(i,e,t={},n=[]){const a=Nl(i,e,t);let s="";e==="javascript"&&(s+=`"use strict"; + pass`],ii=(i,e)=>Array.from({length:e},(t,n)=>i>>>8*n&255);function V2(i){let e=0;for(let t=0;t>>0;return ii(e,4)}const mr=(i,e)=>Ml([1,0,$d,i,...ii(e.length,2),...e]);function Q2(i,e=R2){const t=new TextEncoder().encode(i),n=(4-t.length%W1+W1)%W1,a=new Uint8Array(t.length+n).fill(10);a.set(t);const s=[mr(1,[0,...ii(a.length,4),...V2(a),...Array.from(new TextEncoder().encode(e))])],r=a.length-4;for(let o=0;oi.length===3&&i[0]===13,U2=i=>i.length===7||i.some((e,t)=>e===$d&&i[t+1]===240),Yd=()=>typeof navigator>"u"?void 0:navigator.serial,cr=()=>Yd()!==void 0,$2=(...i)=>`exec(${JSON.stringify(i.join("; "))})`,Ws=(i,e=24)=>$2("cyberpi.display.clear()",`cyberpi.display.show_label(${JSON.stringify(i)}, ${e}, 'center')`),Xd=Ws("VisuBot",32);class Y2{constructor(){v(this,"port");v(this,"writer");v(this,"reader");v(this,"loop");v(this,"rx",[]);v(this,"idx",1);v(this,"frameWaiters",[]);v(this,"waiting",new Map);v(this,"queue",Promise.resolve());v(this,"listeners",new Set);v(this,"error");v(this,"connecting",!1)}listen(e){return this.listeners.add(e),()=>this.listeners.delete(e)}changed(){for(const e of this.listeners)e()}get connected(){return this.writer!==void 0&&!this.connecting}async connect(){const e=Yd();if(!e)throw new Error("Web Serial");const t=await e.requestPort();await t.open({baudRate:115200}),this.port=t,this.writer=t.writable.getWriter(),this.error=void 0,this.connecting=!0,this.changed(),this.loop=this.readLoop(),window.addEventListener("pagehide",()=>void this.disconnect(),{once:!0}),await new Promise(n=>setTimeout(n,3e3)),this.writer&&(this.rx.length=0,this.connecting=!1,this.changed(),await this.run(Xd))}async disconnect(e){if(!this.port)return this.error=e,this.changed();if(!e&&this.writer&&!this.connecting)for(const r of["mbot2.EM_stop('ALL')","cyberpi.led.off()",Ws("Bis bald!")])await this.send(r,ur,2e3).catch(()=>{});const t=this.port,n=this.writer,a=this.reader,s=this.loop;this.port=this.writer=this.reader=this.loop=void 0,this.error=e,this.connecting=!1;for(const r of this.waiting.values())r.reject(new Error(e??"getrennt"));this.waiting.clear();try{await(a==null?void 0:a.cancel()),await s,await(n==null?void 0:n.close())}catch{}try{n==null||n.releaseLock(),await t.close()}catch(r){console.warn("[mBot2] Schließen",r.message)}this.changed()}run(e){return this.send(e,ur,3e4).then(()=>{})}ask(e){return this.send(e,W2,3e3)}async upload(e,t=()=>{}){if(this.port||await this.connect(),!this.writer)throw new Error(this.error??"nicht verbunden");const n=Q2(e),a=6+n.length+3;let s=0;const r=()=>t(++s,a),o=async()=>{await this.sendFrame(Ml(G2),q2),r();for(const l of H2)await this.send(l,ur,3e3),r()};await o(),await o();for(const l of n)await this.sendFrame(l,U2),r();s=a-3,await o(),await this.restart()}sendFrame(e,t){const n=this.queue.then(async()=>{for(let a=0;a<3;a++){if(!this.writer)throw new Error("nicht verbunden");let s=()=>{};const r=new Promise(u=>s=u),o={match:t,resolve:s};this.frameWaiters.push(o),await this.writer.write(e);const l=await Promise.race([r.then(()=>!0),new Promise(u=>setTimeout(()=>u(!1),3e3))]);if(this.frameWaiters=this.frameWaiters.filter(u=>u!==o),l)return}throw new Error("keine Antwort")});return this.queue=n.catch(()=>{}),n}async restart(){const e=this.port;await this.disconnect("restart"),this.error=void 0,await new Promise(t=>setTimeout(t,300)),await e.open({baudRate:115200}),await new Promise(t=>setTimeout(t,500)),await e.close(),this.changed()}send(e,t,n){const a=this.queue.then(()=>new Promise((s,r)=>{if(!this.writer)return r(new Error("nicht verbunden"));const o=this.idx;this.idx=this.idx%65535+1;const l=setTimeout(()=>{this.waiting.delete(o),r(new Error("keine Antwort"))},n);this.waiting.set(o,{resolve:u=>(clearTimeout(l),s(u)),reject:u=>(clearTimeout(l),r(u))}),this.writer.write(E2(e,t,o)).catch(u=>{this.waiting.delete(o),r(u)})}));return this.queue=a.catch(()=>{}),a}async readLoop(){var e;for(;(e=this.port)!=null&&e.readable;){const t=this.port.readable.getReader();this.reader=t;try{for(;;){const{value:n,done:a}=await t.read();if(a)break;this.rx.push(...n);for(const s of F2(this.rx)){const r=this.frameWaiters.findIndex(u=>u.match(s));r>=0&&this.frameWaiters.splice(r,1)[0].resolve();const o=N2(s);if(!o)continue;const l=this.waiting.get(o.idx);this.waiting.delete(o.idx),l==null||l.resolve(o.value)}}}catch(n){const a=["BufferOverrunError","FramingError","BreakError","ParityError"].includes(n.name);console.warn("[mBot2] Lesefehler",n.name,n.message),!a&&this.port&&this.disconnect(n.message)}finally{t.releaseLock()}if(!this.writer)break}}}const le=new Y2,Kd=5,X2=i=>Number.isInteger(i)&&i>=0&&iString(Math.round(i*100)/100),xi={forward:{args:1,defaults:[nu],python:([i])=>`mbot2.straight(${be(i)})`,label:([i])=>`${be(i)} cm vorwärts`},backward:{args:1,defaults:[nu],python:([i])=>`mbot2.straight(${be(-i)})`,label:([i])=>`${be(i)} cm rückwärts`},turnLeft:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${be(-i)})`,label:([i])=>`${be(i)}° nach links drehen`},turnRight:{args:1,defaults:[90],python:([i])=>`mbot2.turn(${be(i)})`,label:([i])=>`${be(i)}° nach rechts drehen`},stop:{args:0,python:()=>'mbot2.EM_stop("ALL")',label:()=>"anhalten"},drive:{args:2,python:([i,e])=>`mbot2.drive_power(${be(i)}, ${be(-e)})`,label:([i,e])=>`Räder links ${be(i)} %, rechts ${be(e)} %`},setLed:{args:3,python:([i,e,t])=>`cyberpi.led.on(${be(i)}, ${be(e)}, ${be(t)})`,label:([i,e,t])=>`LEDs (${be(i)}, ${be(e)}, ${be(t)})`},ledOff:{args:0,python:()=>"cyberpi.led.off()",label:()=>"LEDs aus"},ledColor:{args:1,text:!0,choices:Object.keys(Xa),valid:([i])=>X2(i),python:([i],e)=>`cyberpi.led.on(${Xa[e].join(", ")}, id=${i+1})`,label:([i],e)=>`LED ${i}: ${e}`},playTone:{args:2,python:([i,e])=>`cyberpi.audio.play_tone(${be(i)}, ${be(e/1e3)})`,label:([i,e])=>`Ton ${be(i)} Hz, ${be(e)} ms`},pause:{args:1,label:([i])=>`${be(i)} ms warten`},resetTimer:{args:0,python:()=>"cyberpi.timer.reset()",label:()=>"Stoppuhr auf 0"},emotion:{args:0,text:!0,choices:K2,python:(i,e)=>`cyberpi.emotion.${e}()`,label:(i,e)=>`Gefühl: ${e}`},showText:{args:0,text:!0,python:(i,e)=>Ws(e),label:(i,e)=>`Bildschirm: ${e}`}},iu={red:{de:"rot",en:"red"},green:{de:"grün",en:"green"},blue:{de:"blau",en:"blue"},yellow:{de:"gelb",en:"yellow"},cyan:{de:"türkis",en:"cyan"},purple:{de:"lila",en:"purple"},white:{de:"weiß",en:"white"},black:{de:"schwarz",en:"black"}};let Ll="en";function e3(i){Ll=i==="de"?"de":"en"}const t3=()=>Ll;function eh(i){const e=i.trim().toLowerCase(),t=iu[e]??Object.values(iu).find(n=>n.de===e);return t?t[Ll]:e}const l1=i=>({python:`cyberpi.controller.is_press('${i}')`,simulated:!1}),St={getDistance:{python:"mbuild.ultrasonic2.get(1)",simulated:100},getLine:{python:"mbuild.quad_rgb_sensor.get_line_sta('all', 1)",simulated:0},isLineLeft:{python:"mbuild.quad_rgb_sensor.is_line('L1', 1)",simulated:!1},isLineRight:{python:"mbuild.quad_rgb_sensor.is_line('R1', 1)",simulated:!1},getColor:{python:"mbuild.quad_rgb_sensor.get_color_sta('L1', 1)",simulated:"white"},isButtonA:l1("a"),isButtonB:l1("b"),isJoystickUp:l1("up"),isJoystickDown:l1("down"),isJoystickLeft:l1("left"),isJoystickRight:l1("right"),getBrightness:{python:"cyberpi.get_bri()",simulated:50},getLoudness:{python:"cyberpi.get_loudness('maximum')",simulated:0},getPitch:{python:"cyberpi.get_pitch()",simulated:0},getRoll:{python:"cyberpi.get_roll()",simulated:0},isShaken:{python:"cyberpi.is_shake()",simulated:!1},getBattery:{python:"cyberpi.get_battery()",simulated:100},getTimer:{python:"cyberpi.timer.get()",simulated:0}};function n3(i){const e=new Set;for(const t of i.matchAll(/\bmbot\s*\.\s*([A-Za-z_]\w*)\s*\(\s*\)/gu))t[1]in St&&e.add(t[1]);return[...e]}function i3(i){const e=/^mbot\s*\.\s*led\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)\s*\.\s*setColor\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(e)return{method:"ledColor",args:[e[1].trim(),e[2].trim()]};const t=/^mbot\s*\.\s*([A-Za-z_]\w*)\s*\(([\s\S]*)\)\s*;?$/u.exec(i.trim());if(!t)return;const n=t[2].trim();return{method:t[1],args:n===""?[]:r3(n)}}function Ka(i,e){const t=xi[i];if(!t)return;const n=e.length===0&&t.defaults?t.defaults:e;if(n.length===t.args)return!t.valid||t.valid(n)?n:void 0}function au(i,e,t=""){var a;const n=xi[i];return{method:i,args:e,python:(a=n.python)==null?void 0:a.call(n,e,t),waitMs:i==="pause"?Math.max(0,e[0]):void 0,label:n.label(e,t),...n.text?{text:t}:{}}}function th(i){return i.map(e=>[e.method,...e.args.map(be),...e.text!==void 0?[JSON.stringify(e.text)]:[]].join(" "))}function a3(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const c=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let d=0;d{if(!(n in St))return t;const a=e(n);return typeof a=="string"?JSON.stringify(n==="getColor"?eh(a):a):String(a)}):i}function r3(i){const e=[];let t=0,n=!1,a=0;for(let s=0;s{const a=t==="turn"?((n+180)%360+360)%360-180:n;if(Math.abs(a)<1e-6)return[];const s=Math.round(Math.abs(a)*100)/100;return t==="drive"?[`${a>0?"forward":"backward"} ${s}`]:[a===-180?"turnRight 180":`${a>0?"turnRight":"turnLeft"} ${s}`]})}function nh(i){let e=0;const t=i.trim(),n=()=>{const s=[];for(;;){for(;t[e]===" "||t[e]===",";)e++;if(e>=t.length||t[e]===")")return s;const r=/^(\d+)\s*[x×]\s*\(/u.exec(t.slice(e));if(r){e+=r[0].length;const u=n();if(t[e]!==")")throw new Error(`„)“ fehlt in „${i}“`);e++;for(let m=0;ma===i[s%t])){const a=U1(i.slice(0,t));return`${n} x ${t===1?a:`(${a})`}`}}return i.join(", ")}const ih=["cyberpi","screen","joystick","buttons","leds","lightSensor","microphone","shield","powerSwitch","motors","wheels","ultrasonic","lineSensor","caster","chassis"],o3=i=>ih.includes(i),l3=100;function ah(i){switch(i.kind){case"finished":return"Simulation finished.";case"infiniteLoopWithoutBody":return"Infinite loop has no body.";case"unsupportedStatement":return`Unsupported statement: ${i.text}`;case"invalidExpression":return`Invalid expression: ${i.text}`;case"unknownVariable":return`Unknown variable: ${i.text}`;case"divisionByZero":return"Division by zero.";case"wholeNumberExpected":return"Please enter a whole number.";case"numberExpected":return"Please enter a number.";case"booleanExpected":return"Please enter true or false.";case"subprogramNotFound":return`No open diagram is called ${i.text}. The call was skipped.`;case"callTooDeep":return"Too many nested calls. Does a subprogram call itself?";case"callArguments":return`The call does not match the header of ${i.text}. Check the values in the parentheses.`;case"missingReturn":return`${i.text} ended without returning a value with return.`;case"fileNotFound":return`There is no file called ${i.text}.`;case"endOfFile":return`The file ${i.text} has no more lines.`;case"nullValue":return`${i.text} is null.`;case"other":return i.text}}class Ze extends Error{constructor(e){super(ah(e)),this.notice=e}}const Qe=i=>new Ze({kind:"unsupportedStatement",text:i}),F=i=>new Ze({kind:"invalidExpression",text:i}),$1=i=>new Ze({kind:"unknownVariable",text:i}),u3=()=>new Ze({kind:"divisionByZero"}),ts=new Map;function m3(i,e){ts.set(i,e)}const sh=()=>[...ts];function su(i){return i instanceof Ze?i.notice:{kind:"other",text:i instanceof Error?i.message:String(i)}}function c3(i){if(i===0)return"0";if(!Number.isFinite(i))return Number.isNaN(i)?"nan":i>0?"inf":"-inf";const e=Math.floor(Math.log10(Math.abs(Number(i.toPrecision(12)))));if(e<-4||e>=12){const[n,a]=i.toExponential(11).split("e"),s=n.includes(".")?n.replace(/0+$/,"").replace(/\.$/,""):n,r=Number(a);return`${s}e${r<0?"-":"+"}${String(Math.abs(r)).padStart(2,"0")}`}const t=i.toFixed(Math.max(0,11-e));return t.includes(".")?t.replace(/0+$/,"").replace(/\.$/,""):t}function ru(i){return Number.isFinite(i)&&Math.round(i)===i?i.toFixed(1):c3(i)}function we(i){switch(i.kind){case"int":return String(i.value);case"double":return ru(i.value);case"string":return i.value;case"boolean":return String(i.value);case"intArray":return"["+i.value.map(String).join(", ")+"]";case"doubleArray":return"["+i.value.map(ru).join(", ")+"]";case"stringArray":return"["+i.value.join(", ")+"]";case"booleanArray":return"["+i.value.map(String).join(", ")+"]";case"grid":return"["+d3(i).join(", ")+"]";case"reader":return`${i.className}(${i.file})`;case"writer":return`PrintWriter(${i.file})`;case"null":return"null"}}function d3(i){return i.value.map(e=>"["+e.map(t=>we(co(i.elementType,t))).join(", ")+"]")}function co(i,e){switch(i){case"int":return{kind:"int",value:e};case"double":return{kind:"double",value:e};case"string":return{kind:"string",value:e};case"boolean":return{kind:"boolean",value:e}}}function ou(i){return i==="string"?"":i==="boolean"?!1:0}function ho(i){return i.kind==="intArray"||i.kind==="doubleArray"||i.kind==="stringArray"||i.kind==="booleanArray"||i.kind==="grid"}function h3(i){return i.kind==="int"||i.kind==="double"?i.value:NaN}const vt=i=>({kind:"int",value:i}),wt=i=>({kind:"double",value:i}),Wl=i=>i!==void 0&&/\s/u.test(i),ns=i=>new RegExp("\\p{L}","u").test(i),Y1=i=>new RegExp("\\p{N}","u").test(i);function ai(i){const e=Array.from(i);return e.length===0||!(ns(e[0])||e[0]==="_")?!1:e.every(t=>ns(t)||Y1(t)||t==="_")}function Kt(i){switch(i.toLowerCase()){case"int":return"int";case"double":return"double";case"string":return"string";case"char":return"string";case"boolean":case"bool":return"boolean";default:return}}function lu(i){return i.kind==="int"?"int":i.kind==="double"?"double":i.kind==="boolean"?"boolean":"string"}function at(i){const e=Array.from(i);if(e.length===3&&e[0]==="'"&&e[2]==="'")return e[1];if(e.length<2||e[0]!=='"'||e[e.length-1]!=='"')return;const t=e.slice(1,-1).join("");if(/^(?:[^"\\]|\\.)*$/u.test(t))return t.replaceAll('\\"','"').replaceAll("\\n",` +`)}function uu(i){return i.replaceAll("(int)","").replaceAll("(double)","").trim()}function El(i){const e=new Array(i.length).fill(!1);let t=0,n=!1,a=!1;return i.forEach((s,r)=>{if(n){a?a=!1:s==="\\"?a=!0:s==='"'&&(n=!1);return}switch(s){case'"':n=!0;break;case"(":case"[":t+=1;break;case")":case"]":t-=1;break;default:e[r]=t===0}}),e}function is(i,e){const t=Array.from(i),n=Array.from(e),a=El(t),s=[];let r=[],o=0;for(;ot[o+m]===u)&&a.slice(o,l).every(Boolean)){s.push(r.join("").trim()),r=[],o=l;continue}r.push(t[o]),o+=1}return s.push(r.join("").trim()),s}function g3(i){const e=Array.from(i),t=El(e);for(let n=0;n=","<=","==","!="].includes(o)&&(a=o)}if(a===void 0&&(e[n]==="<"||e[n]===">")&&(a=e[n]),a===void 0)continue;const s=e.slice(0,n).join("").trim(),r=e.slice(n+a.length).join("").trim();return{lhs:s,op:a,rhs:r}}}function Es(i,e){let t=0,n=!1,a=!1;for(let s=e;se.length||!t.every((r,o)=>e[a+o]===r))continue;const s=a+t.length-1;if(Es(e,s)===e.length-1)return{lhs:e.slice(0,a).join("").trim(),rhs:e.slice(s+1,-1).join("").trim()}}}function Yi(i){const e=i.trim();for(const t of["if","while","until","switch"]){if(!e.startsWith(t))continue;const n=e.slice(t.length);if(!(n===""||Wl(n[0])||n[0]==="("))continue;let a=n.trim();const s=rh(a);return s!==void 0&&(a=s),a===""?"true":a}return e===""?"true":e}function d1(i){const e=i.trim(),t=e.indexOf("[");if(!e.endsWith("]")||t<0)return;const n=e.slice(0,t).trim();if(!ai(n))return;const a=[];let s=t;for(;s2))return{arrayName:n,indexExpressions:a}}function f3(i){const e=i.trim();if(!e.endsWith(")"))return;const t=/^([A-Za-z_]\w*(?:\s*\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*([A-Za-z_]\w*)\s*\(/u.exec(e);if(!t)return;const n=Array.from(e),a=Array.from(t[0]).length-1;if(Es(n,a)!==n.length-1)return;const s=n.slice(a+1,-1).join("").trim();return{target:t[1],method:t[2],args:s===""?[]:is(s,",")}}function mu(i){return ai(i)||d1(i)!==void 0}function dr(i){const e=[];let t="",n=!1,a=!1,s=0;for(const r of i){if(a){t+=r,a=!1;continue}if(r==="\\"){t+=r,a=!0;continue}if(r==='"'){n=!n,t+=r;continue}if(!n&&r==="("&&(s+=1),!n&&r===")"&&(s-=1),r==="+"&&!n&&s===0){e.push(t),t="";continue}t+=r}if(n)throw F(i);return e.push(t),e}function x3(i){const e=[];let t=0,n="";for(const a of i){if(a==="{"&&(t+=1),a==="}"&&(t-=1),a===","&&t===0){e.push(n),n="";continue}n+=a}return n.trim()!==""&&e.push(n),e}function cu(i){const e=Array.from(i),t=[];let n=0;for(;n1)throw F(i)}else if(!Y1(e[n]))break;n+=1}const o=e.slice(s,n).join("");if(o==="."||!/^[0-9]*\.?[0-9]*$/.test(o))throw F(i);t.push({t:"number",literal:o,value:Number(o)});continue}if(ns(a)||a==="_"){const s=n;for(;n=0&&s=0&&o=0&&s|&&|\|\||^\s*!/u.test(e)}function Yn(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function hu(i){const e=i.slice(0,3);for(;e.length<3;)e.push("");return e}function po(i){const e=i.map(t=>Yn(t).trim());return e.length===1&&e[0].includes(";")?hu(e[0].split(";").map(t=>t.trim())):hu(e)}const lt=i=>i.frame?{frame:i.frame,callPath:i.callPath}:{};function qt(i,e=[],t={}){const n=[],a=s=>n.push(t.frame?{...s,...t}:s);return i.forEach((s,r)=>{const o=[...e,r],l=s.textLines.join(" ").trim();switch(s.type){case I.anweisung:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"statement"});break;case I.verzweigung:a({path:o,text:l||"true",kind:"branch",cases:s.cases});break;case I.fallauswahl:a({path:o,text:l||"0",kind:"switchSelection",cases:s.cases});break;case I.forSchleife:a({path:o,text:l,kind:"forLoopStart",loopBody:s.loopBody,forParts:po(s.textLines)});break;case I.whileSchleife:a({path:o,text:l||"true",kind:"whileLoop",loopBody:s.loopBody});break;case I.doUntilSchleife:a({path:o,text:l||"true",kind:"doUntilLoop",loopBody:s.loopBody});break;case I.endlosschleife:a({path:o,text:l||"true",kind:"infiniteLoop",loopBody:s.loopBody});break;case I.aussprung:a({path:o,text:l,kind:"jump"});break;case I.aufruf:l!==""&&l!=="ø"&&a({path:o,text:l,kind:"call"});break}}),n}function y3(i,e){const t=i.trim().replaceAll(",",".");switch(e){case"int":if(!/^[+-]?[0-9]+$/.test(t))throw new Ze({kind:"wholeNumberExpected"});return vt(Number(t));case"double":if(!/^[+-]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?$/.test(t))throw new Ze({kind:"numberExpected"});return wt(Number(t));case"string":return{kind:"string",value:i};case"boolean":switch(t.toLowerCase()){case"true":case"wahr":return{kind:"boolean",value:!0};case"false":case"falsch":return{kind:"boolean",value:!1};default:throw new Ze({kind:"booleanExpected"})}}}function gu(){return{stepIndex:0,variables:new Map,outputLines:[],isHalted:!1,files:new Map,robotActions:[]}}function v3(i,e){for(let t=0;tt===e.path[n])}function yt(i){const e=/^(void|int|double|String|boolean)\s+([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(Yn(i));if(!e)return;const t=[];if(e[3].trim()!=="")for(const n of e[3].split(",")){const a=/^(int|double|String|boolean|char)\s*((?:\[\s*\]){0,2})\s+([A-Za-z_]\w*)$/u.exec(n.trim());if(!a)return;const s=(a[2].match(/\[/gu)??[]).length;t.push({type:Kt(a[1]),name:a[3],...s>0?{dims:s}:{}})}return{returnType:Kt(e[1]),name:e[2],params:t}}function oh(i){const e=/^(?:(?:(int|double|String|boolean)\s+)?([A-Za-z_]\w*)\s*=\s*)?([A-Za-z_]\w*)\s*\((.*)\)$/u.exec(Yn(i));if(e)return{targetType:e[1]?Kt(e[1]):void 0,target:e[2],name:e[3],args:e[4].trim()===""?[]:is(e[4],",")}}function as(i){var t,n;const e=Yn(i);return((t=yt(e))==null?void 0:t.name)??((n=oh(e))==null?void 0:n.name)??e.replace(/\(\s*\)$/u,"").trim()}class bi{constructor(e,t=()=>{}){v(this,"steps");v(this,"state",gu());v(this,"nextFrame",1);v(this,"callDepth",0);v(this,"frames",new Map);v(this,"peeking",!1);v(this,"robotSensors",{});v(this,"afterOutput",!1);this.resolveSubprogram=t,this.steps=qt(e.elements)}get currentStepPath(){const e=this.steps[this.state.stepIndex];return(e==null?void 0:e.callPath)??(e==null?void 0:e.path)}get canStep(){return!this.state.isHalted&&!this.state.inputRequest&&this.state.stepIndex ${we(n)}`}catch(n){this.state.inputErrorNotice=su(n);return}this.state.inputRequest=void 0,this.state.inputErrorNotice=void 0,this.state.stepIndex+=1,this.state.notice=this.finishedIfAtEnd()}}finishedIfAtEnd(){return this.state.stepIndex>=this.steps.length?{kind:"finished"}:void 0}splice(e){this.steps.splice(this.state.stepIndex,1,...e)}noticeAfterEntering(e){return e.length>0?void 0:this.finishedIfAtEnd()}executeBranch(e){const t=e.cases;if(!t||t.length<2)throw Qe(e.text);const n=Yi(e.text),a=this.evaluateBool(n),s=a?0:1,r=qt(t[s].elements,[...e.path,s],lt(e));this.splice(r),this.state.lastTrace=`${n} -> ${a}`,this.state.notice=this.noticeAfterEntering(r)}executeSwitchSelection(e){const t=e.cases;if(!t||t.length===0)throw Qe(e.text);const n=Yi(e.text),a=this.evaluateSwitchSelector(n),s=v3(a,t)??t.length-1,r=qt(t[s].elements,[...e.path,s],lt(e));this.splice(r),this.state.lastTrace=`${n} -> ${t[s].name}`,this.state.notice=this.noticeAfterEntering(r)}executeForLoopStart(e){const t=po(e.forParts??[e.text]);t[0]!==""&&this.executeStatement(t[0]),this.splice([{...lt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}executeForLoopCondition(e){const t=po(e.forParts??[e.text]),n=t[1]===""?"true":t[1],a=this.evaluateBool(n);if(this.state.lastTrace=`${n} -> ${a}`,a){const s=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...s,{...lt(e),path:e.path,text:t[2],kind:"forLoopIncrement",loopBody:e.loopBody,forParts:t},{...lt(e),path:e.path,text:t[1],kind:"forLoopCondition",loopBody:e.loopBody,forParts:t}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}executeForLoopIncrement(e){const t=e.text.trim();t!==""&&this.executeIncrement(t),this.splice([])}executeWhileLoop(e){const t=Yi(e.text),n=this.evaluateBool(t);if(this.state.lastTrace=`${t} -> ${n}`,n){const a=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...a,{...lt(e),path:e.path,text:e.text,kind:"whileLoop",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(a)}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterDoUntilLoop(e){const t=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...t,{...lt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}]),this.state.notice=this.noticeAfterEntering(t)}executeDoUntilCondition(e){const t=Yi(e.text),n=this.evaluateBool(t);if(this.state.lastTrace=`${t} -> ${n}`,n){const a=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...a,{...lt(e),path:e.path,text:e.text,kind:"doUntilCondition",loopBody:e.loopBody}])}else this.splice([]),this.state.notice=this.finishedIfAtEnd()}enterInfiniteLoop(e){const t=qt(e.loopBody??[],[...e.path,0],lt(e));this.splice([...t,{...lt(e),path:e.path,text:e.text,kind:"infiniteLoop",loopBody:e.loopBody}]),this.state.lastTrace="true -> true",this.state.notice=t.length>0?void 0:{kind:"infiniteLoopWithoutBody"}}executeJump(e){const t=e.frame??0,n=o=>o.lengthl===e.path[u]);let a=this.steps.length,s="end";for(let o=this.state.stepIndex+1;o ${s}`,s==="return"&&this.finishFrame(r),this.state.notice=this.finishedIfAtEnd()}executeCall(e){const t=e.text,n=this.resolveSubprogram(as(t));if(!n){this.splice([]),this.state.lastTrace=`${t} -> ?`,this.state.notice={kind:"subprogramNotFound",text:t},this.state.stepIndex>=this.steps.length&&(this.state.notice={kind:"finished"});return}const a=oh(t),s=yt(n.caption);if(s?((a==null?void 0:a.args.length)??0)!==s.params.length||(a==null?void 0:a.target)!==void 0&&!s.returnType:a!==void 0&&(a.args.length>0||a.target!==void 0))throw new Ze({kind:"callArguments",text:(s==null?void 0:s.name)??as(t)});if(this.callDepth>=l3)throw new Ze({kind:"callTooDeep"});const o=new Map,l=[];s==null||s.params.forEach((d,h)=>{const g=a.args[h].trim();if(!d.dims){o.set(d.name,this.evaluateExpression(g,d.type));return}const f=this.state.variables.get(g);if(!f)throw/^[A-Za-z_]\w*$/u.test(g)?new Ze({kind:"unknownVariable",text:g}):F(g);if(!(d.dims===1?f.kind===`${d.type}Array`:f.kind==="grid"&&f.elementType===d.type))throw F(g);o.set(d.name,f),l.push({param:d.name,callerName:g})}),this.callDepth+=1;const u={frame:this.nextFrame++,callPath:e.callPath??e.path};s&&(this.frames.set(u.frame,{saved:this.state.variables,header:s,call:a,references:l}),this.state.variables=o);const m=qt(n.elements,[],u);this.splice([...m,{...u,path:e.path,text:t,kind:"callEnd"}]);const c=s==null?void 0:s.params.map((d,h)=>`${d.name} = ${d.dims?a.args[h].trim():we(o.get(d.name))}`).join(", ");this.state.lastTrace=c?`${t} -> ${c}`:`${t} -> call`}executeCallEnd(e){this.callDepth-=1,this.splice([]),this.state.lastTrace=`${e.text} -> return`,this.finishFrame(e),this.state.notice=this.finishedIfAtEnd()}executeReturn(e){const t=e.frame??0,n=Yn(e.text).slice(6).trim(),a=this.frames.get(t);if(a&&n!==""){if(!a.header.returnType)throw F(e.text);a.returnValue=this.evaluateExpression(n,a.header.returnType)}const s=a!=null&&a.returnValue?`${e.text} -> ${we(a.returnValue)}`:`${e.text} -> return`;if(t===0){this.steps.splice(this.state.stepIndex),this.state.lastTrace=s,this.state.notice={kind:"finished"};return}let r=this.state.stepIndex+1;for(;r0?new Map(t.saved):t.saved;for(const m of t.references){const c=this.state.variables.get(m.param);c&&n.set(m.callerName,c)}this.state.variables=n;const a=t.returnValue;if(t.header.returnType&&!a)throw new Ze({kind:"missingReturn",text:t.header.name});const s=(l=t.call)==null?void 0:l.target;if(!s||!a)return;let r=(u=t.call)==null?void 0:u.targetType;if(!r)try{r=this.inferTargetValueType(s)}catch{r=t.header.returnType}const o=r==="double"&&a.kind==="int"?wt(a.value):r==="string"?{kind:"string",value:we(a)}:a;if(lu(o)!==r)throw F(e.text);this.assignValue(o,s),this.state.lastTrace=`${s} = ${e.text.slice(e.text.indexOf("=")+1).trim()} -> ${we(o)}`}executeStatement(e){const t=this.state,n=e.trim(),a=n.toLowerCase(),s=this.afterOutput;if(this.afterOutput=!1,a.startsWith("input:")){t.inputRequest=this.parseInputRequest(n,s),t.outputLineOpen=!1,t.inputErrorNotice=void 0;return}const r=/^System\s*\.\s*out\s*\.\s*(println|print)\s*\(([\s\S]*)\)\s*;?$/u.exec(n);if(a.startsWith("output:")||a.startsWith("print:")||r){const y=r?r[2]:n.slice(a.startsWith("output:")?7:6),w=this.peek(()=>this.renderOutputExpression(y)),S=y.trim()===""?"":this.evaluateOutputExpression(y);t.outputLineOpen&&t.outputLines.length?t.outputLines[t.outputLines.length-1]+=S:t.outputLines.push(S),t.outputLineOpen=(r==null?void 0:r[1])==="print",this.afterOutput=!0,t.lastTrace=`${w} -> ${S}`;return}const o=i3(n);if(o){this.executeMBotCommand(o.method,o.args,n);return}if(this.executeFileStatement(n))return;if(n.endsWith("++")||n.endsWith("--")||n.includes("+=")||n.includes("-=")){this.executeIncrement(n);return}const l=/^(?:final\s+)?([A-Za-z]+)\s+([A-Za-z_]\w*(?:\s*,\s*[A-Za-z_]\w*)*)$/u.exec(Yn(n).trim()),u=l?Kt(l[1]):void 0;if(l&&u){const y=l[2].split(",").map(w=>w.trim());for(const w of y)t.variables.set(w,co(u,ou(u)));t.lastTrace=y.map(w=>`${w} = ${we(t.variables.get(w))}`).join(", ");return}const m=n.indexOf("=");if(m<0)throw Qe(n);const c=n.slice(0,m).trim(),d=n.slice(m+1),h=this.parseArrayDeclaration(c,d);if(h){t.variables.set(h.name,h.value),t.lastTrace=`${h.name} = new ${h.typeName}[${h.count}]`;return}const g=this.parseAssignmentTarget(c);let f;try{f=this.peek(()=>this.renderNumericExpression(d))}catch{f=d.trim()}let x=g.valueType;if(!x)try{x=this.inferTargetValueType(g.variableName)}catch{x="int"}const b=this.evaluateExpression(d,x);this.assignValue(b,g.variableName),t.lastTrace=`${g.variableName} = ${f} -> ${we(b)}`}executeMBotCommand(e,t,n){var r;if((r=xi[e])!=null&&r.text){const o=xi[e];if(t.length!==o.args+1)throw F(n);const l=Ka(e,t.slice(0,-1).map(c=>this.evaluateDouble(c)));if(!l)throw F(n);const u=au(e,l,this.evaluateOutputExpression(t[t.length-1])),m=o.choices;if(m&&!m.includes(u.text??""))throw F(`${n} (${m.join(", ")})`);this.state.robotActions.push(u),this.state.lastTrace=`${n} -> ${u.label}`;return}const a=Ka(e,t.map(o=>this.evaluateDouble(o)));if(!a)throw F(n);const s=au(e,a);this.state.robotActions.push(s),this.state.lastTrace=`${n} -> ${s.label}`}executeFileStatement(e){const t=this.state,n=Yn(e).trim(),a=/^(?:(Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*new\s+(Scanner|BufferedReader|PrintWriter)\s*\(([\s\S]*)\)$/u.exec(n);if(a){const[,m,c,d,h]=a;if(m&&m!==d)throw F(n);const g=d==="Scanner"?/^new\s+File\s*\(([\s\S]+)\)$/u.exec(h.trim()):d==="BufferedReader"?/^new\s+FileReader\s*\(([\s\S]+)\)$/u.exec(h.trim()):/^(?:new\s+(?:File|FileWriter)\s*\(([\s\S]+)\)|([\s\S]+))$/u.exec(h.trim());if(!g)throw Qe(n);const f=this.fileNameValue(g[1]??g[2]);if(d==="PrintWriter")t.variables.set(c,{kind:"writer",file:f,text:""});else{const b=this.fileContent(f).split(/\r?\n/u);b[b.length-1]===""&&b.pop(),t.variables.set(c,{kind:"reader",className:d,file:f,lines:b,next:0})}return t.lastTrace=`${c} = new ${d}(${f})`,!0}const s=/^Files\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(([^()]+)\)\s*,([\s\S]+)\)$/u.exec(n);if(s){const m=this.fileNameValue(s[1]),c=this.evaluateOutputExpression(s[2]);return t.files.set(m,c),t.lastTrace=`${m} ← ${JSON.stringify(c)}`,!0}const r=/^([A-Za-z_]\w*)\s*\.\s*(println|print|close)\s*\(([\s\S]*)\)$/u.exec(n),o=r&&t.variables.get(r[1]);if(!r||!o)return!1;if(o.kind==="null")throw new Ze({kind:"nullValue",text:r[1]});if(o.kind==="reader"&&r[2]==="close")return t.lastTrace=`${r[1]}.close()`,!0;if(o.kind!=="writer")return!1;if(r[2]==="close")return t.files.set(o.file,o.text),t.lastTrace=`${o.file} ← ${JSON.stringify(o.text)}`,!0;const l=r[3].trim()===""?"":this.evaluateOutputExpression(r[3]),u=r[2]==="println"?l+` +`:l;return t.variables.set(r[1],{...o,text:o.text+u}),t.lastTrace=`${r[1]}.${r[2]}(${JSON.stringify(l)})`,!0}fileNameValue(e){const t=e.trim(),n=at(t);if(n!==void 0)return n;const a=this.evaluateReference(t);if((a==null?void 0:a.kind)==="string")return a.value;throw F(t)}fileContent(e){const t=this.state.files.get(e)??ts.get(e);if(t===void 0)throw new Ze({kind:"fileNotFound",text:e});return t}readerMethod(e,t,n,a){if(n.args.length)throw F(a);const s=t.next0?"+":"-";if(r.kind==="int"){t.set(s,vt(r.value+a)),this.state.lastTrace=`${s} = ${r.value} ${o} 1 -> ${r.value+a}`;return}if(r.kind==="double"){const l=r.value+a;t.set(s,wt(l)),this.state.lastTrace=`${s} = ${we(r)} ${o} 1 -> ${we(wt(l))}`;return}throw Qe(e)}for(const[n,a]of[["+=",1],["-=",-1]]){const s=e.indexOf(n);if(s<0)continue;const r=e.slice(0,s).trim(),o=e.slice(s+2),l=t.get(r);if(!ai(r)||!l)throw Qe(e);const u=a>0?"+":"-";if(l.kind==="int"){const m=this.evaluateInt(o),c=l.value+a*m;t.set(r,vt(c)),this.state.lastTrace=`${r} = ${l.value} ${u} ${m} -> ${c}`;return}if(l.kind==="double"){const m=this.evaluateDouble(o),c=l.value+a*m;t.set(r,wt(c)),this.state.lastTrace=`${r} = ${we(l)} ${u} ${we(wt(m))} -> ${we(wt(c))}`;return}throw Qe(e)}this.executeStatement(e)}parseAssignmentTarget(e){if(d1(e))return{variableName:e.trim()};const t=e.split(/\s+/u).filter(Boolean);let n,a;if(t.length===1)n=t[0];else if(t.length===2&&Kt(t[0]))n=t[1],a=Kt(t[0]);else if(t.length===3&&t[0]==="const"&&Kt(t[1]))n=t[2],a=Kt(t[1]);else throw Qe(e);if(!mu(n))throw Qe(e);return{variableName:n,valueType:a}}parseInputRequest(e,t=!1){const n=e.slice(6).trim(),a=/^(\S+)(?:\s+(\S+))?(?:\s+([\s\S]*))?$/u.exec(n);if(!a)throw Qe(e);const s=[a[1],a[2],a[3]].filter(c=>c!==void 0);let r,o,l;const u=Kt(s[0]);if(s.length>=2&&u?(r=s[1],o=u,l=(s[2]??"").trim()):(r=s[0],o=this.inferTargetValueType(r),l=(s[1]??"").trim()),!mu(r))throw Qe(e);const m=at(l)??l;return m===""&&t?this.state.outputLineOpen?{variableName:r,valueType:o,prompt:"",continuesLine:!0}:{variableName:r,valueType:o,prompt:""}:{variableName:r,valueType:o,prompt:m===""?`${r}:`:m}}parseArrayDeclaration(e,t){const n=e.split(/\s+/u).filter(Boolean);if(n.length!==2||!n[0].endsWith("[]"))return;const a=n[0].endsWith("[][]"),s=n[0].slice(0,a?-4:-2),r=Kt(s),o=n[1];if(!r||!ai(o))throw Qe(e);if(a)return this.parseGridDeclaration(o,s,r,t);const l=t.trim();if(l.startsWith("{")&&l.endsWith("}")){const h=l.slice(1,-1).split(",").map(f=>f.trim());let g;switch(r){case"int":g={kind:"intArray",value:h.map(f=>this.evaluateInt(f))};break;case"double":g={kind:"doubleArray",value:h.map(f=>this.evaluateDouble(f))};break;case"string":g={kind:"stringArray",value:h.map(f=>at(f)??this.evaluateOutputExpression(f))};break;case"boolean":g={kind:"booleanArray",value:h.map(f=>this.evaluateBool(f))};break}return{name:o,typeName:s,count:h.length,value:g}}const u=`new ${s}[`;if(!l.startsWith(u)){const h=this.evaluateStringMethod(l);if((h==null?void 0:h.kind)==="stringArray"&&r==="string")return{name:o,typeName:s,count:h.value.length,value:h}}if(!l.startsWith(u)||!l.endsWith("]"))throw Qe(t);const m=l.slice(u.length,-1),c=this.evaluateInt(m);if(c<0)throw F(m);const d=r==="int"?{kind:"intArray",value:new Array(c).fill(0)}:r==="double"?{kind:"doubleArray",value:new Array(c).fill(0)}:r==="boolean"?{kind:"booleanArray",value:new Array(c).fill(!1)}:{kind:"stringArray",value:new Array(c).fill("")};return{name:o,typeName:s,count:c,value:d}}parseGridDeclaration(e,t,n,a){var c;const s=a.trim(),r=d=>{switch(n){case"int":return this.evaluateInt(d);case"double":return this.evaluateDouble(d);case"boolean":return this.evaluateBool(d);case"string":return at(d.trim())??this.evaluateOutputExpression(d)}};if(s.startsWith("{")&&s.endsWith("}")){const d=x3(s.slice(1,-1)).map(h=>{const g=h.trim();if(!g.startsWith("{")||!g.endsWith("}"))throw F(g);return g.slice(1,-1).trim()===""?[]:g.slice(1,-1).split(",").map(f=>r(f.trim()))});return{name:e,typeName:t,count:`${d.length}][${((c=d[0])==null?void 0:c.length)??0}`,value:{kind:"grid",elementType:n,value:d}}}const o=new RegExp(String.raw`^new\s+${t}\s*\[(.+)\]\s*\[(.+)\]$`,"u").exec(s);if(!o)throw Qe(a);const l=this.evaluateInt(o[1]),u=this.evaluateInt(o[2]);if(l<0)throw F(o[1]);if(u<0)throw F(o[2]);const m={kind:"grid",elementType:n,value:Array.from({length:l},()=>new Array(u).fill(ou(n)))};return{name:e,typeName:t,count:`${l}][${u}`,value:m}}arrayIndex(e){const t=this.evaluateInt(e);if(t<0)throw F(e);return t}evaluateReference(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n;const a=this.evaluateStringMethod(t);if(a)return a;const s=/^\(\s*char\s*\)\s*(.+)$/su.exec(t);if(s){const o=this.evaluateInt(s[1]);if(!(o>=0&&o<=1114111))throw F(t);return{kind:"string",value:String.fromCodePoint(o)}}const r=d1(t);if(r)return this.valueInArray(r.arrayName,r.indexExpressions.map(o=>this.arrayIndex(o)))}evaluateStringMethod(e){const t=f3(e);if(!t)return;const n=this.evaluateStaticCall(e,t);if(n)return n;const a=this.state.variables.get(t.target.trim());if((a==null?void 0:a.kind)==="reader")return this.readerMethod(t.target.trim(),a,t,e);if((a==null?void 0:a.kind)==="null")throw new Ze({kind:"nullValue",text:t.target.trim()});const s=at(t.target)??this.stringValueOf(t.target);if(s===void 0)return;const r=t.args,o=d=>{const h=r[d];if(h===void 0)throw F(e);const g=at(h.trim());if(g!==void 0)return g;const f=this.evaluateReference(h);if((f==null?void 0:f.kind)==="string")return f.value;throw F(h)},l=d=>{if(r[d]===void 0)throw F(e);return this.evaluateInt(r[d])},u=d=>{if(r.length!==d)throw F(e)},m=Array.from(s),c=(d,h)=>{if(d<0||d>h)throw F(e);return d};switch(t.method){case"length":return u(0),vt(m.length);case"charAt":return u(1),{kind:"string",value:m[c(l(0),m.length-1)]};case"substring":{if(r.length!==1&&r.length!==2)throw F(e);const d=c(l(0),m.length),h=r.length===2?c(l(1),m.length):m.length;if(h0&&h[h.length-1]==="";)h.pop();return{kind:"stringArray",value:h}}default:return}}evaluateStaticCall(e,t){const n=()=>{if(t.args.length!==1)throw F(e);return t.args[0]},a=s=>{const r=at(s.trim());if(r!==void 0)return r;const o=this.evaluateReference(s);if((o==null?void 0:o.kind)==="string")return o.value;throw F(s)};switch(`${t.target}.${t.method}`){case"Integer.parseInt":{const s=a(n()).trim();if(!/^[+-]?\d+$/u.test(s))throw new Ze({kind:"wholeNumberExpected"});return vt(Number(s))}case"Double.parseDouble":{const s=Number(a(n()).trim());if(!Number.isFinite(s))throw new Ze({kind:"numberExpected"});return wt(s)}case"String.valueOf":return{kind:"string",value:this.evaluateOutputExpression(n())};case"Files.readString":{const s=/^(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)$/u.exec(n().trim());if(!s)throw F(e);const r=at(s[1]),o=ts.get(r);if(o===void 0)throw new Ze({kind:"fileNotFound",text:r});return{kind:"string",value:o}}default:return}}stringValueOf(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return n.kind==="string"?n.value:void 0;const a=d1(t);if(!a)return;const s=this.valueInArray(a.arrayName,a.indexExpressions.map(r=>this.arrayIndex(r)));return s.kind==="string"?s.value:void 0}substituteStringCalls(e){if(!e.includes("("))return e;let t="",n=e;const a=/([A-Za-z_]\w*(?:\[[^\[\]]*\])*|"(?:[^"\\]|\\.)*")\s*\.\s*(length|indexOf|lastIndexOf|compareTo|charAt|parseInt|parseDouble)\s*\(/u;for(let s=a.exec(n);s;s=a.exec(n)){const r=s.index+s[0].length-1,o=Es(Array.from(n),Array.from(n.slice(0,r)).length);if(o===void 0)break;const l=Array.from(n),u=l.slice(Array.from(n.slice(0,s.index)).length,o+1).join(""),m=this.evaluateStringMethod(u),c=l.slice(0,Array.from(n.slice(0,s.index)).length).join(""),d=(m==null?void 0:m.kind)==="string"?go(m.value):void 0;(m==null?void 0:m.kind)==="int"?t+=c+String(m.value):(m==null?void 0:m.kind)==="double"?t+=c+(Number.isInteger(m.value)?m.value.toFixed(1):String(m.value)):d!==void 0?t+=c+String(d):t+=c+u,n=l.slice(o+1).join("")}return t+n}valueInArray(e,t){const n=this.state.variables.get(e);if(!n)throw $1(e);const a=`${e}[${t.join("][")}]`;if(n.kind==="grid"){if(t.length!==2)throw F(a);const r=n.value[t[0]];if(!r||t[1]>=r.length)throw F(a);return co(n.elementType,r[t[1]])}if(t.length!==1)throw F(a);const s=t[0];if(!ho(n))throw F(e);if(s>=n.value.length)throw F(a);switch(n.kind){case"intArray":return vt(n.value[s]);case"doubleArray":return wt(n.value[s]);case"stringArray":return{kind:"string",value:n.value[s]};case"booleanArray":return{kind:"boolean",value:n.value[s]};default:throw F(e)}}inferTargetValueType(e){const t=e.trim(),n=this.state.variables.get(t);if(n)return lu(n);const a=d1(t);if(a){const s=this.state.variables.get(a.arrayName);if(!s)throw $1(a.arrayName);if(s.kind==="intArray")return"int";if(s.kind==="doubleArray")return"double";if(s.kind==="stringArray")return"string";if(s.kind==="booleanArray")return"boolean";if(s.kind==="grid")return s.elementType;throw F(a.arrayName)}throw Qe(e)}assignValue(e,t){const n=t.trim(),a=d1(n);if(!a){this.state.variables.set(n,e);return}const s=a.indexExpressions.map(u=>this.arrayIndex(u)),r=this.state.variables.get(a.arrayName);if(!r)throw $1(a.arrayName);if(r.kind==="grid"){if(s.length!==2||s[0]>=r.value.length||s[1]>=r.value[s[0]].length)throw F(n);const u=r.elementType==="double"&&e.kind==="int"||e.kind===r.elementType?e.value:void 0;if(u===void 0||ho(e))throw F(n);const m=r.value.map(c=>[...c]);m[s[0]][s[1]]=u,this.state.variables.set(a.arrayName,{...r,value:m});return}if(s.length!==1)throw F(n);const o=s[0];let l;if(r.kind==="intArray"&&e.kind==="int")l={kind:"intArray",value:[...r.value]};else if(r.kind==="doubleArray"&&(e.kind==="double"||e.kind==="int"))l={kind:"doubleArray",value:[...r.value]};else if(r.kind==="stringArray"&&e.kind==="string")l={kind:"stringArray",value:[...r.value]};else if(r.kind==="booleanArray"&&e.kind==="boolean")l={kind:"booleanArray",value:[...r.value]};else throw F(n);if(o>=l.value.length)throw F(n);l.value[o]=e.value,this.state.variables.set(a.arrayName,l)}evaluateOutputExpression(e){const t=this.withSensors(e).trim();if(du(t)&&dr(t).every(s=>at(s.trim())===void 0)&&!this.evaluateReference(t))return String(this.evaluateBool(t));let n,a;for(const s of dr(this.withSensors(e))){const r=s.trim(),o=at(r),l=o!==void 0?{kind:"string",value:o}:this.evaluateReference(r)??(du(r)?{kind:"boolean",value:this.evaluateBool(r)}:this.evaluateNumeric(r)),u=l.kind==="int"||l.kind==="double";if(a===void 0&&u){n?n=n.kind==="int"&&l.kind==="int"?vt(n.value+l.value):wt(n.value+l.value):n=l;continue}a=(a??(n?we(n):""))+we(l),n=void 0}return a??(n?we(n):"")}renderOutputExpression(e){return dr(e).map(t=>{const n=t.trim();if(at(n)!==void 0)return n;const a=this.evaluateReference(n);if(a)return we(a);try{return this.renderNumericExpression(n)}catch{return n}}).join(" + ")}evaluateExpression(e,t){switch(t){case"int":return vt(this.evaluateInt(e));case"double":return wt(this.evaluateDouble(e));case"string":{const n=e.trim(),a=at(n);if(a!==void 0)return{kind:"string",value:a};if(n==="null")return{kind:"null"};const s=this.evaluateReference(n);return(s==null?void 0:s.kind)==="null"?s:s?{kind:"string",value:we(s)}:{kind:"string",value:this.evaluateOutputExpression(e)}}case"boolean":return{kind:"boolean",value:this.evaluateBool(e)}}}evaluateNumeric(e){const{v:t,int:n}=this.parser(e).parseNumber();return n||Number.isFinite(t)&&Math.round(t)===t?vt(t):wt(t)}parser(e){const t=this.withSensors(e);return new b3(cu(uu(this.substituteStringCalls(t))),this.state.variables)}withSensors(e){return s3(e,t=>this.robotSensors[t]??St[t].simulated)}evaluateInt(e){return this.parser(e).parseInt()}evaluateDouble(e){return this.parser(e).parseDouble()}evaluateBool(e){const t=this.withSensors(e).trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);if((n==null?void 0:n.kind)==="boolean")return n.value;const a=is(t,"||");if(a.length>1)return a.some(u=>this.evaluateBool(u));const s=is(t,"&&");if(s.length>1)return s.every(u=>this.evaluateBool(u));if(t.startsWith("!")&&!t.startsWith("!="))return!this.evaluateBool(t.slice(1));const r=rh(t);if(r!==void 0)return this.evaluateBool(r);const o=p3(t);if(o)return this.evaluateComparison(o.lhs,"==",o.rhs);const l=g3(t);if(l)return this.evaluateComparison(l.lhs,l.op,l.rhs);if(this.stringOperand(t)!==void 0)throw F(t);return this.evaluateDouble(t)!==0}evaluateComparison(e,t,n){if((e.trim()==="null"||n.trim()==="null")&&(t==="=="||t==="!=")){const m=d=>{var h;return d.trim()==="null"||((h=this.evaluateReference(d))==null?void 0:h.kind)==="null"},c=m(e)===m(n);return t==="=="?c:!c}const a=this.booleanOperand(e),s=this.booleanOperand(n);if((a!==void 0||s!==void 0)&&(t==="=="||t==="!=")){const m=a??this.evaluateBool(e),c=s??this.evaluateBool(n);return t==="=="?m===c:m!==c}const r=this.stringOperand(e),o=this.stringOperand(n);let l,u;if(r!==void 0||o!==void 0){if(r===void 0||o===void 0)throw F(`${e} ${t} ${n}`);l=r,u=o}else l=this.evaluateDouble(e),u=this.evaluateDouble(n);switch(t){case"==":return l===u;case"!=":return l!==u;case"<":return l":return l>u;case">=":return l>=u;default:throw F(`${e} ${t} ${n}`)}}booleanOperand(e){const t=e.trim();if(t==="true")return!0;if(t==="false")return!1;const n=this.evaluateReference(t);return(n==null?void 0:n.kind)==="boolean"?n.value:void 0}stringOperand(e){const t=e.trim(),n=at(t);if(n!==void 0)return n;const a=this.evaluateReference(t);return(a==null?void 0:a.kind)==="string"?a.value:void 0}evaluateSwitchSelector(e){const t=this.withSensors(e).trim(),n=at(t);if(n!==void 0)return{kind:"text",value:n};const a=this.state.variables.get(t);if(a)switch(a.kind){case"int":return{kind:"int",value:a.value};case"double":return{kind:"int",value:Math.trunc(a.value)};case"string":return{kind:"text",value:a.value};default:throw F(t)}return/^[+-]?[0-9]+$/.test(t)?{kind:"int",value:Number(t)}:{kind:"int",value:this.evaluateInt(t)}}renderNumericExpression(e){return cu(uu(e)).map(t=>{if(t.t==="number")return t.literal;if(t.t==="identifier"){const n=this.state.variables.get(t.name);if(!n)throw $1(t.name);return we(n)}return t.t}).join(" ").replaceAll("( ","(").replaceAll(" )",")").replaceAll(" . ",".").replaceAll("[ ","[").replaceAll(" ]","]")}}const lh={baseIndent:0,indentPerLevel:4,includeDiagramTextAsComments:!1,includeEmptyElseBranch:!0,pseudocodeNote:"Pseudocode – not a runnable program"};function ss(i,e,t={},n=[]){const a=Nl(i,e,t);let s="";e==="javascript"&&(s+=`"use strict"; -`);const r=[i,...e==="java"?[]:n];if(e==="python"&&r.some(zh)&&(s+=`import random +`);const r=[i,...e==="java"?[]:n];if(e==="python"&&r.some(Ih)&&(s+=`import random `),e!=="java"&&(s+=bo(r,e)),e==="java"&&ls(i)&&(s+=`// import java.util.Scanner; `,s+=`Scanner scanner = new Scanner(System.in); @@ -27,49 +27,49 @@ except: `),i.pseudocode&&(s+=(e==="python"?"# ":"// ")+a.pseudocodeNote+` `),e!=="java")for(const u of n){if(u===i)continue;const m=yt(u.caption);m&&(s+=fo(u,m,e,t,0)+` -`)}const o=yt(i.caption),l={out:""};if(o)l.out=fo(i,o,e,t,a.baseIndent);else for(const u of i.elements)Rs(u,e,a,a.baseIndent,l);if(s+=l.out,s.trim()===""){const u=z3(e);return e==="javascript"?`"use strict"; +`)}const o=yt(i.caption),l={out:""};if(o)l.out=fo(i,o,e,t,a.baseIndent);else for(const u of i.elements)Rs(u,e,a,a.baseIndent,l);if(s+=l.out,s.trim()===""){const u=I3(e);return e==="javascript"?`"use strict"; -`+u:u}return _h(s.replace(/^[\n\r]+|[\n\r]+$/g,""),e)}function Nl(i,e,t){const n={...oh,...t,jsIntVariables:new Set,arrayElementTypes:j3(i),stringVariables:P3(i)};return e!=="java"&&(n.jsIntVariables=X3(i)),n}const pu=i=>i==="string"?"String":i===void 0?"void":i;function lh(i){const e=i.params.map(t=>`${pu(t.type)}${"[]".repeat(t.dims??0)} ${t.name}`).join(", ");return`public static ${pu(i.returnType)} ${i.name}(${e}) {`}function fo(i,e,t,n,a){const s=Nl(i,t,n);for(const l of e.params)l.dims||(l.type==="int"&&s.jsIntVariables.add(l.name),l.type==="string"&&s.stringVariables.add(l.name));const r=e.params.map(l=>l.name).join(", "),o={out:""};for(const l of i.elements)Rs(l,t,s,a+s.indentPerLevel,o);switch(o.out.trim()===""&&(o.out=Z(a+s.indentPerLevel)+(t==="python"?`pass +`+u:u}return Th(s.replace(/^[\n\r]+|[\n\r]+$/g,""),e)}function Nl(i,e,t){const n={...lh,...t,jsIntVariables:new Set,arrayElementTypes:C3(i),stringVariables:j3(i)};return e!=="java"&&(n.jsIntVariables=K3(i)),n}const pu=i=>i==="string"?"String":i===void 0?"void":i;function uh(i){const e=i.params.map(t=>`${pu(t.type)}${"[]".repeat(t.dims??0)} ${t.name}`).join(", ");return`public static ${pu(i.returnType)} ${i.name}(${e}) {`}function fo(i,e,t,n,a){const s=Nl(i,t,n);for(const l of e.params)l.dims||(l.type==="int"&&s.jsIntVariables.add(l.name),l.type==="string"&&s.stringVariables.add(l.name));const r=e.params.map(l=>l.name).join(", "),o={out:""};for(const l of i.elements)Rs(l,t,s,a+s.indentPerLevel,o);switch(o.out.trim()===""&&(o.out=Z(a+s.indentPerLevel)+(t==="python"?`pass `:` -`)),t){case"java":return`${Z(a)}${lh(e)} +`)),t){case"java":return`${Z(a)}${uh(e)} ${o.out}${Z(a)}} `;case"python":return`${Z(a)}def ${e.name}(${r}): ${o.out}`;case"javascript":return`${Z(a)}function ${e.name}(${r}) { ${o.out}${Z(a)}} -`}}const Z=i=>i>0?" ".repeat(i):"";function ce(i,e){const t=i.exec(e);return t?Array.from(t,n=>n??""):void 0}function z3(i,e){return i==="python"?"# empty element":"// empty element"}const xo=i=>i.trim()==="ø";function uh(i,e){return Z(i)+(e==="python"?`# empty element +`}}const Z=i=>i>0?" ".repeat(i):"";function ce(i,e){const t=i.exec(e);return t?Array.from(t,n=>n??""):void 0}function I3(i,e){return i==="python"?"# empty element":"// empty element"}const xo=i=>i.trim()==="ø";function mh(i,e){return Z(i)+(e==="python"?`# empty element `:`// empty element -`)}function I3(i){switch(i.type){case I.leerElement:return!0;case I.anweisung:case I.aufruf:return i.textLines.map(e=>e.trim()).every(e=>e===""||xo(e));default:return!1}}function k3(i){return i.every(I3)}function Fl(i,e,t){const n=i.map(a=>a.replace(/^[ \t]+|[ \t]+$/g,"")).filter(a=>a!=="");return n.length===0?"":e==="python"?Z(t)+`""" +`)}function k3(i){switch(i.type){case I.leerElement:return!0;case I.anweisung:case I.aufruf:return i.textLines.map(e=>e.trim()).every(e=>e===""||xo(e));default:return!1}}function S3(i){return i.every(k3)}function Fl(i,e,t){const n=i.map(a=>a.replace(/^[ \t]+|[ \t]+$/g,"")).filter(a=>a!=="");return n.length===0?"":e==="python"?Z(t)+`""" `+n.map(a=>Z(t)+a+` `).join("")+Z(t)+`""" `:n.length===1?Z(t)+"/* "+n[0]+` */ `:Z(t)+`/* `+n.map(a=>Z(t)+" * "+a+` `).join("")+Z(t)+` */ -`}const S3=i=>i==="java"||i==="javascript";function rs(i){const e=i.trim();if(e==="")return"";if(e.startsWith("//")||e.startsWith("/*")||e.startsWith("*")||e.startsWith("#")||e.startsWith("{")||e.startsWith("}")||e.endsWith("{")||e.endsWith(";"))return e;const t=e.toLowerCase();for(const n of["if ","else","for ","while ","do ","switch ","case ","default"])if(t.startsWith(n))return e;return e+";"}function Da(i){const e=i.map(t=>t.trim()).filter(t=>t!=="");return _3(e.length===0?"true":e.join(" "))}function _3(i){const e=i.trim();for(const t of["if","while","until","switch"]){const n=mh(t,e);if(n!==void 0)return n===""?"true":n}return e}function mh(i,e){if(!e.toLowerCase().startsWith(i))return;const t=e.slice(i.length);if(!(t===""||/^\s/.test(t)||t[0]==="("))return;let n=t.trim();return n.startsWith("(")&&n.endsWith(")")&&n.length>=2&&(n=n.slice(1,-1).trim()),n}function Ht(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function T3(i){const e=i.trim(),t=e.toLowerCase();let n;if(t.startsWith("output:"))n=e.slice(7).trim();else if(t.startsWith("print:"))n=e.slice(6).trim();else return;return n===""?void 0:n}const Ns=i=>i.name.includes("[")&&i.name.includes("]");function Jl(i){const e=i.trim();if(e==="")return;const t=ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)(?:\s+"([^"]*)")?\s*$/i,e);if(t){const s=t[2].replaceAll(" ","");if(s==="")return;const r=(t[3]??"").trim();return{type:os(t[1]),name:s,customPrompt:r===""?void 0:r}}const n=ce(/^\s*([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)\s+"([^"]*)"\s*$/i,e);if(n){const s=n[1].replaceAll(" ","");return["int","integer","long","float","double","string","boolean","char","bool","void"].includes(s.toLowerCase())?void 0:{type:s.includes("[")?"String":"int",name:s,customPrompt:n[2].trim()}}const a=O3(e);if(a)return{type:os(a[0]),name:a[1]}}function os(i){switch(i.trim().toLowerCase()){case"integer":case"int":return"int";case"long":return"long";case"float":return"float";case"double":return"double";case"string":return"String";case"boolean":case"bool":return"boolean";case"char":return"char";default:return i}}function O3(i){const e=i.split(/[ \t]+/).filter(Boolean);if(e.length===0)return;if(e.length>=2)return[e[0],e[1]];if(!["int","double","string","boolean","char","long","float","short","byte","void","bool","integer"].includes(e[0].toLowerCase()))return["int",e[0]]}function A3(i,e,t,n,a){const s=Ht(i).trim();if(s.startsWith('"'))switch(e){case"java":return Z(t)+"System.out.println("+s+`); +`}const _3=i=>i==="java"||i==="javascript";function rs(i){const e=i.trim();if(e==="")return"";if(e.startsWith("//")||e.startsWith("/*")||e.startsWith("*")||e.startsWith("#")||e.startsWith("{")||e.startsWith("}")||e.endsWith("{")||e.endsWith(";"))return e;const t=e.toLowerCase();for(const n of["if ","else","for ","while ","do ","switch ","case ","default"])if(t.startsWith(n))return e;return e+";"}function Da(i){const e=i.map(t=>t.trim()).filter(t=>t!=="");return T3(e.length===0?"true":e.join(" "))}function T3(i){const e=i.trim();for(const t of["if","while","until","switch"]){const n=ch(t,e);if(n!==void 0)return n===""?"true":n}return e}function ch(i,e){if(!e.toLowerCase().startsWith(i))return;const t=e.slice(i.length);if(!(t===""||/^\s/.test(t)||t[0]==="("))return;let n=t.trim();return n.startsWith("(")&&n.endsWith(")")&&n.length>=2&&(n=n.slice(1,-1).trim()),n}function Ht(i){let e=i.trim();for(;e.endsWith(";");)e=e.slice(0,-1).trim();return e}function O3(i){const e=i.trim(),t=e.toLowerCase();let n;if(t.startsWith("output:"))n=e.slice(7).trim();else if(t.startsWith("print:"))n=e.slice(6).trim();else return;return n===""?void 0:n}const Ns=i=>i.name.includes("[")&&i.name.includes("]");function Jl(i){const e=i.trim();if(e==="")return;const t=ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)(?:\s+"([^"]*)")?\s*$/i,e);if(t){const s=t[2].replaceAll(" ","");if(s==="")return;const r=(t[3]??"").trim();return{type:os(t[1]),name:s,customPrompt:r===""?void 0:r}}const n=ce(/^\s*([a-zA-Z_]\w*(?:\s*\[[^\]]+\])?)\s+"([^"]*)"\s*$/i,e);if(n){const s=n[1].replaceAll(" ","");return["int","integer","long","float","double","string","boolean","char","bool","void"].includes(s.toLowerCase())?void 0:{type:s.includes("[")?"String":"int",name:s,customPrompt:n[2].trim()}}const a=A3(e);if(a)return{type:os(a[0]),name:a[1]}}function os(i){switch(i.trim().toLowerCase()){case"integer":case"int":return"int";case"long":return"long";case"float":return"float";case"double":return"double";case"string":return"String";case"boolean":case"bool":return"boolean";case"char":return"char";default:return i}}function A3(i){const e=i.split(/[ \t]+/).filter(Boolean);if(e.length===0)return;if(e.length>=2)return[e[0],e[1]];if(!["int","double","string","boolean","char","long","float","short","byte","void","bool","integer"].includes(e[0].toLowerCase()))return["int",e[0]]}function P3(i,e,t,n,a){const s=Ht(i).trim();if(s.startsWith('"'))switch(e){case"java":return Z(t)+"System.out.println("+s+`); `;case"javascript":return Z(t)+"console.log("+s+`); `;case"python":return Z(t)+"print("+jn(s,n,a)+`) `}}function yi(i){return i.replaceAll("\\","\\\\").replaceAll('"','\\"').replaceAll(` -`,"\\n").replaceAll("\r","\\r")}function Rl(i,e){const t=i.trim();if(!t.toLowerCase().startsWith("input:"))return;const n=t.slice(6).trim();if(n==="")return;const a=Jl(n);if(a&&Ns(a)&&!/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s/i.test(n)){const s=e.get(a.name.slice(0,a.name.indexOf("[")).trim());if(s)return{...a,type:s}}return a}function P3(i){const e=new Set;return gn(i.elements,t=>{for(const n of t.textLines){const a=n.trim();if(a.toLowerCase().startsWith("input:")){const o=Jl(a.slice(6).trim());(o==null?void 0:o.type)==="String"&&!Ns(o)&&e.add(o.name);continue}const s=ce(/^\s*(?:const\s+)?string\s+([a-zA-Z_]\w*)\s*=/i,a);s&&e.add(s[1]);const r=ce(/^\s*string\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=/i,a);r&&e.add(r[1]+"[]")}}),e}function j3(i){const e=new Map;return gn(i.elements,t=>{for(const n of t.textLines){const a=ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s*\[\s*\]\s*([a-zA-Z_]\w*)/i,n)??ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*)\s*\[\s*\]/i,n);a&&e.set(a[2],os(a[1]))}}),e}function C3(i,e,t){const n=Rl(i,t);if(!n)return;const a=n.customPrompt?n.customPrompt:n.name+": ",s=Z(e)+'System.out.println("'+yi(a)+`"); +`,"\\n").replaceAll("\r","\\r")}function Rl(i,e){const t=i.trim();if(!t.toLowerCase().startsWith("input:"))return;const n=t.slice(6).trim();if(n==="")return;const a=Jl(n);if(a&&Ns(a)&&!/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s/i.test(n)){const s=e.get(a.name.slice(0,a.name.indexOf("[")).trim());if(s)return{...a,type:s}}return a}function j3(i){const e=new Set;return gn(i.elements,t=>{for(const n of t.textLines){const a=n.trim();if(a.toLowerCase().startsWith("input:")){const o=Jl(a.slice(6).trim());(o==null?void 0:o.type)==="String"&&!Ns(o)&&e.add(o.name);continue}const s=ce(/^\s*(?:const\s+)?string\s+([a-zA-Z_]\w*)\s*=/i,a);s&&e.add(s[1]);const r=ce(/^\s*string\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=/i,a);r&&e.add(r[1]+"[]")}}),e}function C3(i){const e=new Map;return gn(i.elements,t=>{for(const n of t.textLines){const a=ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s*\[\s*\]\s*([a-zA-Z_]\w*)/i,n)??ce(/^\s*(integer|int|long|float|double|string|boolean|char|bool)\s+([a-zA-Z_]\w*)\s*\[\s*\]/i,n);a&&e.set(a[2],os(a[1]))}}),e}function B3(i,e,t){const n=Rl(i,t);if(!n)return;const a=n.customPrompt?n.customPrompt:n.name+": ",s=Z(e)+'System.out.println("'+yi(a)+`"); `,r=o=>Ns(n)?n.name:`${o} ${n.name}`;switch(n.type){case"int":return s+Z(e)+`${r("int")} = scanner.nextInt(); `;case"double":return s+Z(e)+`${r("double")} = scanner.nextDouble(); `;case"String":return s+Z(e)+`${r("String")} = scanner.next(); `;case"boolean":return s+Z(e)+`${r("boolean")} = scanner.nextBoolean(); -`;default:return}}function B3(i,e,t){const n=Rl(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":Z(e)+'console.log("'+yi(n.name+": ")+`"); +`;default:return}}function D3(i,e,t){const n=Rl(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":Z(e)+'console.log("'+yi(n.name+": ")+`"); `,r=l=>{const u=a?n.customPrompt:n.name+": ";return`(prompt("${yi(u)}") ?? "${l}")`},o=Ns(n)?n.name:`let ${n.name}`;switch(n.type){case"int":return s+Z(e)+`${o} = parseInt(${r("0")}, 10); `;case"double":return s+Z(e)+`${o} = Number(${r("0")}); `;case"String":return s+Z(e)+`${o} = ${r("")}; `;case"boolean":return s+Z(e)+`${o} = ${r("")}.trim().toLowerCase() === "true"; -`;default:return}}function D3(i,e,t){const n=Rl(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":Z(e)+'print("'+yi(n.name+": ")+`") +`;default:return}}function Z3(i,e,t){const n=Rl(i,t);if(!n)return;const a=!!n.customPrompt,s=a?"":Z(e)+'print("'+yi(n.name+": ")+`") `,r=`input("${yi(a?n.customPrompt:n.name+": ")}")`;switch(n.type){case"int":return s+Z(e)+`${n.name} = int(${r}) `;case"double":return s+Z(e)+`${n.name} = float(${r}) `;case"String":return s+Z(e)+`${n.name} = ${r} `;case"boolean":return s+Z(e)+`${n.name} = ${r}.strip().lower() in ("true", "wahr") -`;default:return}}const hr=String.raw`("(?:[^"\\]|\\.)*"|[A-Za-z_]\w*)`,Z3=[[new RegExp(String.raw`^new\s+Scanner\s*\(\s*new\s+File\s*\(\s*${hr}\s*\)\s*\)$`),"Scanner"],[new RegExp(String.raw`^new\s+BufferedReader\s*\(\s*new\s+FileReader\s*\(\s*${hr}\s*\)\s*\)$`),"BufferedReader"],[new RegExp(String.raw`^new\s+PrintWriter\s*\(\s*(?:new\s+(?:File|FileWriter)\s*\(\s*)?${hr}\s*\)?\s*\)$`),"PrintWriter"]];function ch(i){const e=i.trim();for(const[t,n]of Z3){const a=t.exec(e);if(a)return{kind:n,name:a[1]}}}function M3(i,e,t,n,a){if(e==="java")return;const s=Ht(i).trim(),r=/^(?:(?:Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*(new\s[\s\S]+)$/.exec(s),o=r&&ch(r[2]);if(r&&o){const m=/^(?:Scanner|BufferedReader|PrintWriter)\s/.test(s);return e==="python"?Z(t)+`${r[1]} = ${o.kind}(${o.name}) +`;default:return}}const hr=String.raw`("(?:[^"\\]|\\.)*"|[A-Za-z_]\w*)`,M3=[[new RegExp(String.raw`^new\s+Scanner\s*\(\s*new\s+File\s*\(\s*${hr}\s*\)\s*\)$`),"Scanner"],[new RegExp(String.raw`^new\s+BufferedReader\s*\(\s*new\s+FileReader\s*\(\s*${hr}\s*\)\s*\)$`),"BufferedReader"],[new RegExp(String.raw`^new\s+PrintWriter\s*\(\s*(?:new\s+(?:File|FileWriter)\s*\(\s*)?${hr}\s*\)?\s*\)$`),"PrintWriter"]];function dh(i){const e=i.trim();for(const[t,n]of M3){const a=t.exec(e);if(a)return{kind:n,name:a[1]}}}function L3(i,e,t,n,a){if(e==="java")return;const s=Ht(i).trim(),r=/^(?:(?:Scanner|BufferedReader|PrintWriter)\s+)?([A-Za-z_]\w*)\s*=\s*(new\s[\s\S]+)$/.exec(s),o=r&&dh(r[2]);if(r&&o){const m=/^(?:Scanner|BufferedReader|PrintWriter)\s/.test(s);return e==="python"?Z(t)+`${r[1]} = ${o.kind}(${o.name}) `:Z(t)+`${m?"let ":""}${r[1]} = new ${o.kind}(${o.name}); `}const l=/^([A-Za-z_]\w*)\.(println|print)\s*\(([\s\S]*)\)$/.exec(s);if(l&&l[1]!=="System"){const m=l[3].trim(),c=e==="python"&&m!==""?jn(m,n,a):m;return Z(t)+`${l[1]}.${l[2]}(${c})${e==="javascript"?";":""} `}const u=/^Files\.writeString\s*\(\s*(?:Path\.of|Paths\.get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,\s*([\s\S]+)\)$/.exec(s);if(u){const m=u[2].trim();return e==="python"?Z(t)+`open(${u[1]}, "w", encoding="utf-8").write(${jn(m,n,a)}) `:Z(t)+`require("fs").writeFileSync(${u[1]}, ${m}); -`}}function L3(i){const e=new Set;for(const t of i)gn(t.elements,n=>{for(const a of n.textLines){const s=/=\s*(new\s.+?);?\s*$/.exec(a),r=s&&ch(s[1]);r&&e.add(r.kind)}});return e}const W3={Scanner:`class Scanner: +`}}function W3(i){const e=new Set;for(const t of i)gn(t.elements,n=>{for(const a of n.textLines){const s=/=\s*(new\s.+?);?\s*$/.exec(a),r=s&&dh(s[1]);r&&e.add(r.kind)}});return e}const E3={Scanner:`class Scanner: def __init__(self, name): self.lines = open(name, encoding="utf-8").read().splitlines() def hasNextLine(self): @@ -94,7 +94,7 @@ ${o.out}${Z(a)}} self.file.write(str(text)) def close(self): self.file.close() -`},E3={Scanner:`class Scanner { +`},N3={Scanner:`class Scanner { constructor(name) { this.lines = require("fs").readFileSync(name, "utf8").split(/\\r?\\n/); if (this.lines.at(-1) === "") this.lines.pop(); } hasNextLine() { return this.lines.length > 0; } nextLine() { return this.lines.shift(); } @@ -111,34 +111,34 @@ ${o.out}${Z(a)}} print(text) { this.text += text; } close() { require("fs").writeFileSync(this.name, this.text); } } -`};function bo(i,e){const t=L3(i);if(t.size===0)return"";const n=e==="python"?W3:E3;return[...t].map(a=>n[a]).join(` +`};function bo(i,e){const t=W3(i);if(t.size===0)return"";const n=e==="python"?E3:N3;return[...t].map(a=>n[a]).join(` `)+` -`}function N3(i,e,t,n,a){const s=/^System\s*\.\s*out\s*\.\s*print\s*\(([\s\S]*)\)$/.exec(Ht(i).trim());if(s){const o=s[1].trim();switch(e){case"java":return Z(t)+"System.out.print("+o+`); +`}function F3(i,e,t,n,a){const s=/^System\s*\.\s*out\s*\.\s*print\s*\(([\s\S]*)\)$/.exec(Ht(i).trim());if(s){const o=s[1].trim();switch(e){case"java":return Z(t)+"System.out.print("+o+`); `;case"javascript":return Z(t)+"process.stdout.write(String("+o+`)); `;case"python":return Z(t)+"print("+(o===""?"":jn(o,n,a)+", ")+`end="") -`}}const r=T3(i);if(r===void 0)return/^\s*(?:output|print):\s*$/i.test(i)?Z(t)+{java:"System.out.println();",javascript:"console.log();",python:"print()"}[e]+` +`}}const r=O3(i);if(r===void 0)return/^\s*(?:output|print):\s*$/i.test(i)?Z(t)+{java:"System.out.println();",javascript:"console.log();",python:"print()"}[e]+` `:void 0;switch(e){case"java":return Z(t)+"System.out.println("+r+`); `;case"javascript":return Z(t)+"console.log("+r+`); `;case"python":return Z(t)+"print("+jn(r,n,a)+`) -`}}function Gl(i){const e=i.map(Ht).filter(t=>t!=="");return e.length===0?";;":e.join("; ")}function F3(i){const t=Gl(i).split(";"),n=dh(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function dh(i){const e=ce(/^(\s*)(?:integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?\s*$/i,i);if(!e)return;const t=e[2].trim();if(t==="")return;const n=(e[3]??"").trim();return i.includes("=")&&n!==""?e[1]+`let ${t} = ${n}`:e[1]+`let ${t}`}function J3(i){const e=i.map(n=>Ht(n).trim()).filter(n=>n!=="");let t=e;if(e.length===1){let n=e[0];const a=mh("for",n);a!==void 0&&(n=a),t=n.split(";").map(s=>s.trim())}if(!(t.length!==3||t.some(n=>n==="")))return[t[0],t[1],t[2]]}function hh(i,e){let t=ce(/^\s*(\w+)\s*(\+\+|--)\s*$/,i)??ce(/^\s*(\+\+|--)\s*(\w+)\s*$/,i);if(t){const[n,a]=t[1]==="++"||t[1]==="--"?[t[2],t[1]]:[t[1],t[2]];return n===e?a==="++"?1:-1:void 0}if(t=ce(/^\s*(\w+)\s*(\+|-)=\s*(\d+)\s*$/,i),t)return t[1]===e?(t[2]==="+"?1:-1)*Number(t[3]):void 0;if(t=ce(/^\s*(\w+)\s*=\s*(\w+)\s*(\+|-)\s*(\d+)\s*$/,i),t)return t[1]===e&&t[2]===e?(t[3]==="+"?1:-1)*Number(t[4]):void 0}function yo(i,e){if(/^-?\d+$/.test(i))return String(Number(i)+e);const t=/^[\w.()[\]]+$/.test(i)?i:`(${i})`;return e>0?`${t} + ${e}`:`${t} - ${-e}`}function R3(i,e){const t=J3(i);if(!t)return;const[n,a,s]=t,r=ce(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n);if(!r)return;const o=r[1],l={variable:o,init:`${o} = ${Oe(r[2],e)}`,condition:a,increment:s},u=ce(/^\s*(\w+)\s*(<=|<|>=|>)\s*(.+)$/,a),m=hh(s,o);if(!u||u[1]!==o||m===void 0||m===0)return l;const c=Oe(r[2],e);let d=Oe(u[3],e);const h=u[2];if(m>0&&h==="<=")d=yo(d,1);else if(m<0&&h===">=")d=yo(d,-1);else if(!(m>0&&h==="<")&&!(m<0&&h===">"))return l;const g=m===1?c==="0"?[d]:[c,d]:[c,d,String(m)];return l.rangeLine=`for ${o} in range(${g.join(", ")}):`,l}function gh(i){const e=Ht(i).trim();if(e==="")return;const t=ce(/^\s*const\s+(integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?$/i,e);if(!t)return;const n=t[2].trim();if(n==="")return;if(!e.includes("="))return{rawType:t[1].trim(),name:n};const a=(t[3]??"").trim();if(a!=="")return{rawType:t[1].trim(),name:n,rhs:a}}function G3(i,e,t,n){var o;const a=gh(i);if(!a)return;const s=os(a.rawType),r=(o=a.rhs)==null?void 0:o.trim();switch(e){case"java":return Z(t)+rs(r?`final ${s} ${a.name} = ${r}`:`final ${s} ${a.name}`)+` +`}}function Gl(i){const e=i.map(Ht).filter(t=>t!=="");return e.length===0?";;":e.join("; ")}function J3(i){const t=Gl(i).split(";"),n=hh(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function hh(i){const e=ce(/^(\s*)(?:integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?\s*$/i,i);if(!e)return;const t=e[2].trim();if(t==="")return;const n=(e[3]??"").trim();return i.includes("=")&&n!==""?e[1]+`let ${t} = ${n}`:e[1]+`let ${t}`}function R3(i){const e=i.map(n=>Ht(n).trim()).filter(n=>n!=="");let t=e;if(e.length===1){let n=e[0];const a=ch("for",n);a!==void 0&&(n=a),t=n.split(";").map(s=>s.trim())}if(!(t.length!==3||t.some(n=>n==="")))return[t[0],t[1],t[2]]}function gh(i,e){let t=ce(/^\s*(\w+)\s*(\+\+|--)\s*$/,i)??ce(/^\s*(\+\+|--)\s*(\w+)\s*$/,i);if(t){const[n,a]=t[1]==="++"||t[1]==="--"?[t[2],t[1]]:[t[1],t[2]];return n===e?a==="++"?1:-1:void 0}if(t=ce(/^\s*(\w+)\s*(\+|-)=\s*(\d+)\s*$/,i),t)return t[1]===e?(t[2]==="+"?1:-1)*Number(t[3]):void 0;if(t=ce(/^\s*(\w+)\s*=\s*(\w+)\s*(\+|-)\s*(\d+)\s*$/,i),t)return t[1]===e&&t[2]===e?(t[3]==="+"?1:-1)*Number(t[4]):void 0}function yo(i,e){if(/^-?\d+$/.test(i))return String(Number(i)+e);const t=/^[\w.()[\]]+$/.test(i)?i:`(${i})`;return e>0?`${t} + ${e}`:`${t} - ${-e}`}function G3(i,e){const t=R3(i);if(!t)return;const[n,a,s]=t,r=ce(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n);if(!r)return;const o=r[1],l={variable:o,init:`${o} = ${Pe(r[2],e)}`,condition:a,increment:s},u=ce(/^\s*(\w+)\s*(<=|<|>=|>)\s*(.+)$/,a),m=gh(s,o);if(!u||u[1]!==o||m===void 0||m===0)return l;const c=Pe(r[2],e);let d=Pe(u[3],e);const h=u[2];if(m>0&&h==="<=")d=yo(d,1);else if(m<0&&h===">=")d=yo(d,-1);else if(!(m>0&&h==="<")&&!(m<0&&h===">"))return l;const g=m===1?c==="0"?[d]:[c,d]:[c,d,String(m)];return l.rangeLine=`for ${o} in range(${g.join(", ")}):`,l}function ph(i){const e=Ht(i).trim();if(e==="")return;const t=ce(/^\s*const\s+(integer|int|long|float|double|string|boolean|char|bool)\s+(\w+)(?:\s*=\s*(.*))?$/i,e);if(!t)return;const n=t[2].trim();if(n==="")return;if(!e.includes("="))return{rawType:t[1].trim(),name:n};const a=(t[3]??"").trim();if(a!=="")return{rawType:t[1].trim(),name:n,rhs:a}}function H3(i,e,t,n){var o;const a=ph(i);if(!a)return;const s=os(a.rawType),r=(o=a.rhs)==null?void 0:o.trim();switch(e){case"java":return Z(t)+rs(r?`final ${s} ${a.name} = ${r}`:`final ${s} ${a.name}`)+` `;case"javascript":return r?Z(t)+rs(`const ${a.name} = ${r}`)+` `:Z(t)+`let ${a.name}; // from diagram: const ${s} ${a.name} `;case"python":return r?Z(t)+`${a.name} = ${Js(r,n)} # const ${s} `:Z(t)+`${a.name} = None # const ${s}, uninitialized -`}}function H3(i){const e=Ht(i).trim();if(e===""||vh(e))return;const t=ce(/^\s*(?:integer|int|long|float|double|string|boolean|char|bool)(?:\s*\[\s*\]\s+(\w+)|\s+(\w+)(\s*\[\s*\])?)\s*=\s*(.*)$/i,e);if(!t)return;const n=t[1]===""?t[2]:t[1],a=t[4].trim();if(a!=="")return{name:n,rhs:a,isArray:t[1]!==""||t[3]!==""}}function Fs(i){const e=ce(/^\s*\(\s*int(?:eger)?\s*\)\s*(.+?)\s*$/i,i),t=e==null?void 0:e[1].trim();if(!(!t||ph(t)))return t.startsWith("(")&&vo(t,0)===t.length-1?t.slice(1,-1).trim():t}function vo(i,e){let t=0;for(let n=e;n/^'.'$/u.test(i)||/\.charAt\(.*\)$/.test(i);function V3(i,e){if(i[e]==="("){const a=vo(i,e);return a<0?-1:a+1}if(i[e]==="'")return i[e+2]==="'"?e+3:-1;const t=/^(?:[A-Za-z_]\w*|\d+)/.exec(i.slice(e));if(!t)return-1;let n=e+t[0].length;for(;;){const a=/^\.[A-Za-z_]\w*/.exec(i.slice(n));if(a)n+=a[0].length;else if(i[n]==="("||i[n]==="["){const s=vo(i,n);if(s<0)return-1;n=s+1}else return n}}function wo(i,e){return Hl(i,t=>{const n=/\(\s*(int|char)\s*\)\s*/g;let a="",s=0;for(let r=n.exec(t);r;r=n.exec(t)){const o=r.index+r[0].length,l=V3(t,o);if(l<0)continue;const u=t.slice(o,l);if(r[1]==="int"&&!ph(u))continue;const m=wo(u.startsWith("(")?u.slice(1,-1).trim():u,e),c=r[1]==="int"?e==="python"?`ord(${m})`:`${m}.charCodeAt(0)`:e==="python"?`chr(${m})`:`String.fromCharCode(${m})`;a+=t.slice(s,r.index)+c,s=l,n.lastIndex=l}return a+t.slice(s)})}function Js(i,e=new Set){const t=i.trim();if(t==="null")return"None";const n=Fs(t);return n!==void 0?`int(${Js(n,e)})`:Oe(t,e)}function Hl(i,e){let t="",n="",a=0;for(;a/^\d+$/.test(a)||e.has(a);return Hl(t,a=>a.replace(/\bMath\.random\s*\(\s*\)/gi,"random.random()").replace(/===/g,"==").replace(/!==/g,"!=").replace(/\s*&&\s*/g," and ").replace(/\s*\|\|\s*/g," or ").replace(/!(?!=)\s*/g,"not ").replace(/\btrue\b/g,"True").replace(/\bfalse\b/g,"False").replace(/\bnull\b/g,"None").replace(new RegExp("(?n(r)&&n(o)?`${r} // ${o}`:s))}function fh(i){const e=[];let t=0,n="",a=!1;for(let s=0;s/^"(?:[^"\\]|\\.)*"$/.test(i);function jn(i,e,t){const n=fh(i),a=s=>Vl(s)||t.has(s)||t.has(s.replace(/^([A-Za-z_]\w*)\[[^[\]]*\]$/u,"$1[]"));return n.length<2||!n.some(a)||n.some(s=>s==="")?Oe(i,e):n.map(s=>a(s)?s:`str(${Oe(s,e)})`).join(" + ")}function xh(i,e,t=new Set){const n=Ht(i).trim(),a=ce(/^(\w+(?:\[[^\]]*\])?)\s*(\+\+|--)$/,n)??ce(/^(\+\+|--)\s*(\w+(?:\[[^\]]*\])?)$/,n);if(a){const[o,l]=a[1]==="++"||a[1]==="--"?[a[2],a[1]]:[a[1],a[2]];return`${Oe(o,e)} ${l==="++"?"+=":"-="} 1`}const s=ce(/^(\w+)\s*\/=\s*(.+)$/,n);if(s&&e.has(s[1]))return`${s[1]} //= ${Oe(s[2],e)}`;const r=ce(/^([\w[\]. ]+?)\s*(=|\+=|-=|\*=|\/=|%=)\s*(.+)$/,n);if(r&&!r[3].startsWith("=")){const[,o,l,u]=r;let m;if(l==="+="&&t.has(o.trim())){const c=fh(u);m=jn(`"" + ${u}`,e,t).replace(/^"" \+ /,""),c.length===1&&!Vl(u.trim())&&!t.has(u.trim())&&(m=`str(${Oe(u,e)})`)}else l==="="&&Fs(u)===void 0&&u.trim()!=="null"?m=jn(u,e,t):m=l==="="?Js(u,e):Oe(u,e);return`${o} ${l} ${m}`}return Oe(n,e)}const Q3=i=>i.replace(/\bMath\.random\b(?!\s*\()/gi,"Math.random()");function bh(i){const e=i.trim();return e.startsWith("{")&&e.endsWith("}")?"["+e.slice(1,-1)+"]":i}function yh(i){const e=ce(/^\s*new\s+(?:byte|short|int|long|float|double|boolean|char|string)\s*\[\s*(.+)\s*\]\s*$/i,i),t=e==null?void 0:e[1].trim();return t||void 0}function vh(i){const e=ce(/^\s*(int|double|string|boolean)\s*\[\s*\]\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,Ht(i).trim());return e?{elementType:e[1].toLowerCase(),name:e[2],rhs:e[3].trim()}:void 0}function q3(i){const e=ce(/^\s*new\s+(?:int|double|string|boolean)\s*\[\s*(.+?)\s*\]\s*\[\s*(.+?)\s*\]\s*$/i,i);return e?[e[1],e[2]]:void 0}const fu=i=>i.replaceAll("{","[").replaceAll("}","]");function xu(i,e){return i==="boolean"?e==="python"?"False":"false":i==="string"?'""':i==="double"?"0.0":"0"}function U3(i,e,t){const n=q3(i.rhs);return e==="javascript"?n?`Array.from({ length: ${n[0]} }, () => new Array(${n[1]}).fill(${xu(i.elementType,e)}))`:fu(i.rhs):n?`[[${xu(i.elementType,e)}] * ${Oe(n[1],t)} for _ in range(${Oe(n[0],t)})]`:Oe(fu(i.rhs),t)}function wh(i,e){const t=i.trim();if(e){const a=yh(t);return a!==void 0?`new Array(${a})`:bh(t)}const n=Fs(t);return n!==void 0?`Math.floor(${wh(n,!1)})`:Q3(t)}function $3(i,e,t){const n=i.trim();if(e){const a=yh(n);return a!==void 0?`[None] * ${a}`:Oe(bh(n),t)}return Js(n,t)}function Y3(i,e,t,n,a){if(e==="java")return;const s=vh(i);if(s){const u=U3(s,e,n);return e==="javascript"?Z(t)+`let ${s.name} = ${u}; +`}}function V3(i){const e=Ht(i).trim();if(e===""||wh(e))return;const t=ce(/^\s*(?:integer|int|long|float|double|string|boolean|char|bool)(?:\s*\[\s*\]\s+(\w+)|\s+(\w+)(\s*\[\s*\])?)\s*=\s*(.*)$/i,e);if(!t)return;const n=t[1]===""?t[2]:t[1],a=t[4].trim();if(a!=="")return{name:n,rhs:a,isArray:t[1]!==""||t[3]!==""}}function Fs(i){const e=ce(/^\s*\(\s*int(?:eger)?\s*\)\s*(.+?)\s*$/i,i),t=e==null?void 0:e[1].trim();if(!(!t||fh(t)))return t.startsWith("(")&&vo(t,0)===t.length-1?t.slice(1,-1).trim():t}function vo(i,e){let t=0;for(let n=e;n/^'.'$/u.test(i)||/\.charAt\(.*\)$/.test(i);function Q3(i,e){if(i[e]==="("){const a=vo(i,e);return a<0?-1:a+1}if(i[e]==="'")return i[e+2]==="'"?e+3:-1;const t=/^(?:[A-Za-z_]\w*|\d+)/.exec(i.slice(e));if(!t)return-1;let n=e+t[0].length;for(;;){const a=/^\.[A-Za-z_]\w*/.exec(i.slice(n));if(a)n+=a[0].length;else if(i[n]==="("||i[n]==="["){const s=vo(i,n);if(s<0)return-1;n=s+1}else return n}}function wo(i,e){return Hl(i,t=>{const n=/\(\s*(int|char)\s*\)\s*/g;let a="",s=0;for(let r=n.exec(t);r;r=n.exec(t)){const o=r.index+r[0].length,l=Q3(t,o);if(l<0)continue;const u=t.slice(o,l);if(r[1]==="int"&&!fh(u))continue;const m=wo(u.startsWith("(")?u.slice(1,-1).trim():u,e),c=r[1]==="int"?e==="python"?`ord(${m})`:`${m}.charCodeAt(0)`:e==="python"?`chr(${m})`:`String.fromCharCode(${m})`;a+=t.slice(s,r.index)+c,s=l,n.lastIndex=l}return a+t.slice(s)})}function Js(i,e=new Set){const t=i.trim();if(t==="null")return"None";const n=Fs(t);return n!==void 0?`int(${Js(n,e)})`:Pe(t,e)}function Hl(i,e){let t="",n="",a=0;for(;a/^\d+$/.test(a)||e.has(a);return Hl(t,a=>a.replace(/\bMath\.random\s*\(\s*\)/gi,"random.random()").replace(/===/g,"==").replace(/!==/g,"!=").replace(/\s*&&\s*/g," and ").replace(/\s*\|\|\s*/g," or ").replace(/!(?!=)\s*/g,"not ").replace(/\btrue\b/g,"True").replace(/\bfalse\b/g,"False").replace(/\bnull\b/g,"None").replace(new RegExp("(?n(r)&&n(o)?`${r} // ${o}`:s))}function xh(i){const e=[];let t=0,n="",a=!1;for(let s=0;s/^"(?:[^"\\]|\\.)*"$/.test(i);function jn(i,e,t){const n=xh(i),a=s=>Vl(s)||t.has(s)||t.has(s.replace(/^([A-Za-z_]\w*)\[[^[\]]*\]$/u,"$1[]"));return n.length<2||!n.some(a)||n.some(s=>s==="")?Pe(i,e):n.map(s=>a(s)?s:`str(${Pe(s,e)})`).join(" + ")}function bh(i,e,t=new Set){const n=Ht(i).trim(),a=ce(/^(\w+(?:\[[^\]]*\])?)\s*(\+\+|--)$/,n)??ce(/^(\+\+|--)\s*(\w+(?:\[[^\]]*\])?)$/,n);if(a){const[o,l]=a[1]==="++"||a[1]==="--"?[a[2],a[1]]:[a[1],a[2]];return`${Pe(o,e)} ${l==="++"?"+=":"-="} 1`}const s=ce(/^(\w+)\s*\/=\s*(.+)$/,n);if(s&&e.has(s[1]))return`${s[1]} //= ${Pe(s[2],e)}`;const r=ce(/^([\w[\]. ]+?)\s*(=|\+=|-=|\*=|\/=|%=)\s*(.+)$/,n);if(r&&!r[3].startsWith("=")){const[,o,l,u]=r;let m;if(l==="+="&&t.has(o.trim())){const c=xh(u);m=jn(`"" + ${u}`,e,t).replace(/^"" \+ /,""),c.length===1&&!Vl(u.trim())&&!t.has(u.trim())&&(m=`str(${Pe(u,e)})`)}else l==="="&&Fs(u)===void 0&&u.trim()!=="null"?m=jn(u,e,t):m=l==="="?Js(u,e):Pe(u,e);return`${o} ${l} ${m}`}return Pe(n,e)}const q3=i=>i.replace(/\bMath\.random\b(?!\s*\()/gi,"Math.random()");function yh(i){const e=i.trim();return e.startsWith("{")&&e.endsWith("}")?"["+e.slice(1,-1)+"]":i}function vh(i){const e=ce(/^\s*new\s+(?:byte|short|int|long|float|double|boolean|char|string)\s*\[\s*(.+)\s*\]\s*$/i,i),t=e==null?void 0:e[1].trim();return t||void 0}function wh(i){const e=ce(/^\s*(int|double|string|boolean)\s*\[\s*\]\s*\[\s*\]\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,Ht(i).trim());return e?{elementType:e[1].toLowerCase(),name:e[2],rhs:e[3].trim()}:void 0}function U3(i){const e=ce(/^\s*new\s+(?:int|double|string|boolean)\s*\[\s*(.+?)\s*\]\s*\[\s*(.+?)\s*\]\s*$/i,i);return e?[e[1],e[2]]:void 0}const fu=i=>i.replaceAll("{","[").replaceAll("}","]");function xu(i,e){return i==="boolean"?e==="python"?"False":"false":i==="string"?'""':i==="double"?"0.0":"0"}function $3(i,e,t){const n=U3(i.rhs);return e==="javascript"?n?`Array.from({ length: ${n[0]} }, () => new Array(${n[1]}).fill(${xu(i.elementType,e)}))`:fu(i.rhs):n?`[[${xu(i.elementType,e)}] * ${Pe(n[1],t)} for _ in range(${Pe(n[0],t)})]`:Pe(fu(i.rhs),t)}function zh(i,e){const t=i.trim();if(e){const a=vh(t);return a!==void 0?`new Array(${a})`:yh(t)}const n=Fs(t);return n!==void 0?`Math.floor(${zh(n,!1)})`:q3(t)}function Y3(i,e,t){const n=i.trim();if(e){const a=vh(n);return a!==void 0?`[None] * ${a}`:Pe(yh(n),t)}return Js(n,t)}function X3(i,e,t,n,a){if(e==="java")return;const s=wh(i);if(s){const u=$3(s,e,n);return e==="javascript"?Z(t)+`let ${s.name} = ${u}; `:Z(t)+`${s.name} = ${u} -`}const r=H3(i);if(!r)return;if(e==="javascript")return Z(t)+rs(`let ${r.name} = ${wh(r.rhs,r.isArray)}`)+` -`;const l=!r.isArray&&Fs(r.rhs)===void 0&&r.rhs.trim()!=="null"?jn(r.rhs,n,a):$3(r.rhs,r.isArray,n);return Z(t)+`${r.name} = ${l} -`}function gn(i,e){for(const t of i){e(t),t.loopBody&&gn(t.loopBody,e);for(const n of t.cases??[])gn(n.elements,e)}}function X3(i){const e=n=>["int","integer","long","short","byte"].includes(n.trim().toLowerCase()),t=new Set;return gn(i.elements,n=>{for(const a of n.textLines){const s=a.trim();if(s==="")continue;if(s.toLowerCase().startsWith("input:")){const l=Jl(s.slice(6).trim());l&&e(l.type)&&!l.name.includes("[")&&t.add(l.name);continue}const r=gh(s);if(r&&e(r.rawType)){t.add(r.name);continue}const o=ce(/^\s*(integer|int|long|short|byte)\s+([a-zA-Z_]\w*)\s*=/i,s);o&&t.add(o[2].trim())}}),t}function zo(i,e){const t=r=>/^\d+$/.test(r)||e.has(r),n=String.raw`(?:[a-zA-Z_]\w*|\d+(?:\.\d+)?)`,a=new RegExp(String.raw`(?{const o=r.split(/\s*([*/%])\s*/);if(!o.some(m=>m==="/"))return r;let l=o[0],u=t(o[0]);for(let m=1;mr.replace(a,s).replace(new RegExp("(?t(l)&&t(u)?`${l} = Math.trunc(${l} / ${u})`:o))}function ls(i){let e=!1;return gn(i.elements,t=>{t.type===I.anweisung&&t.textLines.some(n=>n.trim().toLowerCase().startsWith("input:"))&&(e=!0)}),e}function Ql(i){let e=!1,t=!1,n=!1;return gn(i.elements,a=>{for(const s of a.textLines)/\bFiles\s*\./.test(s)&&(e=!0),/\bnew\s+(?:File|PrintWriter|FileReader|FileWriter|BufferedReader)\s*\(/.test(s)&&(t=!0),/\bnew\s+Scanner\s*\(\s*new\s+File\b/.test(s)&&(n=!0)}),[...t?["import java.io.*;"]:[],...e?["import java.nio.file.*;"]:[],...n?["import java.util.Scanner;"]:[]]}function K3(i){return Ql(i).length>0}function zh(i){let e=!1;return gn(i.elements,t=>{t.textLines.some(n=>/\bMath\.random\s*\(/i.test(n))&&(e=!0)}),e}function Xi(i,e){const t=i.trim();return t===""?e==="python"?'""':"0":e==="java"||new RegExp("^\\p{N}+$","u").test(t)||Vl(t)?t:'"'+t.replaceAll('"','\\"')+'"'}function E1(i,e){const t=i.trim();if(t==="")return"";switch(e){case"java":return"/* "+t+" */";case"python":return" # "+t;case"javascript":return" /* "+t+" */"}}function ex(i,e,t,n,a){const s=i.map(r=>r.trim());if(s.every(r=>r==="")){t.live&&(a.out+=Z(n)+(e==="python"?"pass":";")+` -`);return}if(t.includeDiagramTextAsComments){const r=s.filter(o=>o!==""&&!xo(o));r.length>0&&(a.out+=Fl(r,e,n))}for(const r of s){if(r==="")continue;if(xo(r)){a.out+=t.live?Ul(n,t.live):uh(n,e);continue}const o=t.jsIntVariables??new Set,l=t.arrayElementTypes??new Map,u=t.stringVariables??new Set,m=(e==="java"?C3(r,n,l):void 0)??(e==="javascript"?B3(r,n,l):void 0)??(e==="python"?D3(r,n,l):void 0)??M3(r,e,n,o,u)??N3(r,e,n,o,u)??G3(r,e,n,o)??Y3(r,e,n,o,u)??A3(r,e,n,o,u);if(m!==void 0){a.out+=e==="javascript"?zo(m,o):m;continue}let c=r;S3(e)?c=rs(e==="javascript"?zo(r,o):r):e==="python"&&(c=xh(r,o,u)),c!==""&&(a.out+=Z(n)+c+` -`)}}function si(i,e,t,n,a,s,r,o=(l=>(l=a.live)==null?void 0:l.labels.condition)()){if(a.includeDiagramTextAsComments&&(r.out+=Fl(t,n,s)),o!==void 0&&$l(t)){r.out+=Z(s)+i+Xn(o)+e;return}const u=Da(t),m=a.jsIntVariables??new Set,c=n==="python"?Oe(u,m):n==="javascript"?zo(u,m):u;r.out+=Z(s)+i+c+e}function p1(i,e,t,n,a){const s=a.out.length;for(const o of i)Rs(o,e,t,n,a);if(t.live&&a.out.length===s&&(a.out+=Ul(n,t.live)),e!=="python")return;a.out.slice(s).split(` +`}const r=V3(i);if(!r)return;if(e==="javascript")return Z(t)+rs(`let ${r.name} = ${zh(r.rhs,r.isArray)}`)+` +`;const l=!r.isArray&&Fs(r.rhs)===void 0&&r.rhs.trim()!=="null"?jn(r.rhs,n,a):Y3(r.rhs,r.isArray,n);return Z(t)+`${r.name} = ${l} +`}function gn(i,e){for(const t of i){e(t),t.loopBody&&gn(t.loopBody,e);for(const n of t.cases??[])gn(n.elements,e)}}function K3(i){const e=n=>["int","integer","long","short","byte"].includes(n.trim().toLowerCase()),t=new Set;return gn(i.elements,n=>{for(const a of n.textLines){const s=a.trim();if(s==="")continue;if(s.toLowerCase().startsWith("input:")){const l=Jl(s.slice(6).trim());l&&e(l.type)&&!l.name.includes("[")&&t.add(l.name);continue}const r=ph(s);if(r&&e(r.rawType)){t.add(r.name);continue}const o=ce(/^\s*(integer|int|long|short|byte)\s+([a-zA-Z_]\w*)\s*=/i,s);o&&t.add(o[2].trim())}}),t}function zo(i,e){const t=r=>/^\d+$/.test(r)||e.has(r),n=String.raw`(?:[a-zA-Z_]\w*|\d+(?:\.\d+)?)`,a=new RegExp(String.raw`(?{const o=r.split(/\s*([*/%])\s*/);if(!o.some(m=>m==="/"))return r;let l=o[0],u=t(o[0]);for(let m=1;mr.replace(a,s).replace(new RegExp("(?t(l)&&t(u)?`${l} = Math.trunc(${l} / ${u})`:o))}function ls(i){let e=!1;return gn(i.elements,t=>{t.type===I.anweisung&&t.textLines.some(n=>n.trim().toLowerCase().startsWith("input:"))&&(e=!0)}),e}function Ql(i){let e=!1,t=!1,n=!1;return gn(i.elements,a=>{for(const s of a.textLines)/\bFiles\s*\./.test(s)&&(e=!0),/\bnew\s+(?:File|PrintWriter|FileReader|FileWriter|BufferedReader)\s*\(/.test(s)&&(t=!0),/\bnew\s+Scanner\s*\(\s*new\s+File\b/.test(s)&&(n=!0)}),[...t?["import java.io.*;"]:[],...e?["import java.nio.file.*;"]:[],...n?["import java.util.Scanner;"]:[]]}function ex(i){return Ql(i).length>0}function Ih(i){let e=!1;return gn(i.elements,t=>{t.textLines.some(n=>/\bMath\.random\s*\(/i.test(n))&&(e=!0)}),e}function Xi(i,e){const t=i.trim();return t===""?e==="python"?'""':"0":e==="java"||new RegExp("^\\p{N}+$","u").test(t)||Vl(t)?t:'"'+t.replaceAll('"','\\"')+'"'}function E1(i,e){const t=i.trim();if(t==="")return"";switch(e){case"java":return"/* "+t+" */";case"python":return" # "+t;case"javascript":return" /* "+t+" */"}}function tx(i,e,t,n,a){const s=i.map(r=>r.trim());if(s.every(r=>r==="")){t.live&&(a.out+=Z(n)+(e==="python"?"pass":";")+` +`);return}if(t.includeDiagramTextAsComments){const r=s.filter(o=>o!==""&&!xo(o));r.length>0&&(a.out+=Fl(r,e,n))}for(const r of s){if(r==="")continue;if(xo(r)){a.out+=t.live?Ul(n,t.live):mh(n,e);continue}const o=t.jsIntVariables??new Set,l=t.arrayElementTypes??new Map,u=t.stringVariables??new Set,m=(e==="java"?B3(r,n,l):void 0)??(e==="javascript"?D3(r,n,l):void 0)??(e==="python"?Z3(r,n,l):void 0)??L3(r,e,n,o,u)??F3(r,e,n,o,u)??H3(r,e,n,o)??X3(r,e,n,o,u)??P3(r,e,n,o,u);if(m!==void 0){a.out+=e==="javascript"?zo(m,o):m;continue}let c=r;_3(e)?c=rs(e==="javascript"?zo(r,o):r):e==="python"&&(c=bh(r,o,u)),c!==""&&(a.out+=Z(n)+c+` +`)}}function si(i,e,t,n,a,s,r,o=(l=>(l=a.live)==null?void 0:l.labels.condition)()){if(a.includeDiagramTextAsComments&&(r.out+=Fl(t,n,s)),o!==void 0&&$l(t)){r.out+=Z(s)+i+Xn(o)+e;return}const u=Da(t),m=a.jsIntVariables??new Set,c=n==="python"?Pe(u,m):n==="javascript"?zo(u,m):u;r.out+=Z(s)+i+c+e}function p1(i,e,t,n,a){const s=a.out.length;for(const o of i)Rs(o,e,t,n,a);if(t.live&&a.out.length===s&&(a.out+=Ul(n,t.live)),e!=="python")return;a.out.slice(s).split(` `).map(o=>o.trim()).every(o=>o===""||o.startsWith("#"))&&(a.out+=Z(n)+`pass -`)}function tx(i,e){var n;if(e.includeDiagramTextAsComments||i.length!==1)return;const t=i[0];return t.type===I.verzweigung&&(((n=t.cases)==null?void 0:n.length)??0)>=2?t:void 0}function Io(i,e,t,n,a,s){const r=i.cases;if(!r||r.length<2)return;const o=e==="python",l=n+t.indentPerLevel,u=!t.includeEmptyElseBranch&&k3(r[1].elements),m=u?void 0:tx(r[1].elements,t);if(o){si(s?"elif ":"if ",`: +`)}function nx(i,e){var n;if(e.includeDiagramTextAsComments||i.length!==1)return;const t=i[0];return t.type===I.verzweigung&&(((n=t.cases)==null?void 0:n.length)??0)>=2?t:void 0}function Io(i,e,t,n,a,s){const r=i.cases;if(!r||r.length<2)return;const o=e==="python",l=n+t.indentPerLevel,u=!t.includeEmptyElseBranch&&S3(r[1].elements),m=u?void 0:nx(r[1].elements,t);if(o){si(s?"elif ":"if ",`: `,i.textLines,e,t,n,a),p1(r[0].elements,e,t,l,a),m?Io(m,e,t,n,a,!0):u||(a.out+=Z(n)+`else: `,p1(r[1].elements,e,t,l,a));return}if(si(s?"} else if (":"if (",`) { -`,i.textLines,e,t,n,a),p1(r[0].elements,e,t,l,a),m){const c=a.out.length;Io(m,e,t,n,a,!0),kh(t,m,a,c)}else u||(a.out+=Z(n)+`} else { +`,i.textLines,e,t,n,a),p1(r[0].elements,e,t,l,a),m){const c=a.out.length;Io(m,e,t,n,a,!0),Sh(t,m,a,c)}else u||(a.out+=Z(n)+`} else { `,p1(r[1].elements,e,t,l,a)),a.out+=Z(n)+`} -`}function Rs(i,e,t,n,a){const s=a.out.length;nx(i,e,t,n,a),kh(t,i,a,s)}function nx(i,e,t,n,a){var m;const s=t.indentPerLevel,r=e==="python",o=(c,d)=>p1(c,e,t,d,a),l=(c,d)=>si(c,d,i.textLines,e,t,n,a),u=(c=n)=>{t.includeDiagramTextAsComments&&(a.out+=Fl(i.textLines,e,c))};switch(i.type){case I.leerElement:a.out+=t.live?Ul(n,t.live):uh(n,e);return;case I.anweisung:case I.aufruf:ex(i.textLines,e,t,n,a);return;case I.aussprung:{const c=Da(i.textLines);i.textLines.some(d=>d.trim()!=="")&&u(),r?a.out+=Z(n)+(c===""?`break +`}function Rs(i,e,t,n,a){const s=a.out.length;ix(i,e,t,n,a),Sh(t,i,a,s)}function ix(i,e,t,n,a){var m;const s=t.indentPerLevel,r=e==="python",o=(c,d)=>p1(c,e,t,d,a),l=(c,d)=>si(c,d,i.textLines,e,t,n,a),u=(c=n)=>{t.includeDiagramTextAsComments&&(a.out+=Fl(i.textLines,e,c))};switch(i.type){case I.leerElement:a.out+=t.live?Ul(n,t.live):mh(n,e);return;case I.anweisung:case I.aufruf:tx(i.textLines,e,t,n,a);return;case I.aussprung:{const c=Da(i.textLines);i.textLines.some(d=>d.trim()!=="")&&u(),r?a.out+=Z(n)+(c===""?`break `:`break # ${c} `):a.out+=Z(n)+(c===""?`break; `:`break; // ${c} @@ -155,20 +155,20 @@ ${o.out}${Z(a)}} `,o(d.elements,n+s*2)}else{const f=g?"default:"+E1(d.name,e):"case "+Xi(d.name,e)+":";a.out+=Z(n+s)+f+` `,o(d.elements,n+s*2),a.out+=Z(n+s*2)+`break; `}}),r||(a.out+=Z(n)+`} -`);return}case I.forSchleife:if(e==="java"){u();const c=t.live?Ih(i.textLines,t.live.labels):Gl(i.textLines);a.out+=Z(n)+"for ("+c+`) { -`}else if(r){const c=t.jsIntVariables??new Set,d=R3(i.textLines,c);if((d==null?void 0:d.rangeLine)!==void 0)u(),a.out+=Z(n)+d.rangeLine+` +`);return}case I.forSchleife:if(e==="java"){u();const c=t.live?kh(i.textLines,t.live.labels):Gl(i.textLines);a.out+=Z(n)+"for ("+c+`) { +`}else if(r){const c=t.jsIntVariables??new Set,d=G3(i.textLines,c);if((d==null?void 0:d.rangeLine)!==void 0)u(),a.out+=Z(n)+d.rangeLine+` `;else if(d){u(),a.out+=Z(n)+d.init+` -`,a.out+=Z(n)+"while "+Oe(d.condition,c)+`: -`;for(const h of i.loopBody??[])Rs(h,e,t,n+s,a);a.out+=Z(n+s)+xh(d.increment,c)+` -`;return}else t.live?a.out+=Z(n)+ax(i.textLines,t.live.labels,c)+` +`,a.out+=Z(n)+"while "+Pe(d.condition,c)+`: +`;for(const h of i.loopBody??[])Rs(h,e,t,n+s,a);a.out+=Z(n+s)+bh(d.increment,c)+` +`;return}else t.live?a.out+=Z(n)+sx(i.textLines,t.live.labels,c)+` `:l("for ",`: -`)}else{u();const c=t.live?ix(i.textLines,t.live.labels):F3(i.textLines);a.out+=Z(n)+"for ("+c+`) { +`)}else{u();const c=t.live?ax(i.textLines,t.live.labels):J3(i.textLines);a.out+=Z(n)+"for ("+c+`) { `}o(i.loopBody??[],n+s),r||(a.out+=Z(n)+`} `);return;case I.whileSchleife:l(r?"while ":"while (",r?`: `:`) { `),o(i.loopBody??[],n+s),r||(a.out+=Z(n)+`} `);return;case I.doUntilSchleife:{const c=t.live&&$l(i.textLines)?Xn(t.live.labels.condition):Da(i.textLines);if(r){a.out+=Z(n)+`while True: -`;const d=n+s;o(i.loopBody??[],d),u(d);const h=c.includes(Mi)?c:Oe(c,t.jsIntVariables??new Set);a.out+=Z(d)+"if not ("+h+`): +`;const d=n+s;o(i.loopBody??[],d),u(d);const h=c.includes(Mi)?c:Pe(c,t.jsIntVariables??new Set);a.out+=Z(d)+"if not ("+h+`): `,a.out+=Z(d+s)+`break `}else a.out+=Z(n)+`do { `,o(i.loopBody??[],n+s),u(),a.out+=Z(n)+"} while ("+c+`); @@ -178,24 +178,24 @@ ${o.out}${Z(a)}} `:`while (true) /* ${c} */ { `),o(i.loopBody??[],n+s),r||(a.out+=Z(n)+`} `);return}}}const Mi="",ql="",Xn=i=>Mi+i+ql,Ul=(i,e)=>Z(i)+Xn(e.target==="python"?`pass # ${e.labels.code}`:`// ${e.labels.code}`)+` -`,$l=i=>i.every(e=>e.trim()==="");function Ih(i,e){return $l(i)||i.length===3?[e.start,e.condition,e.step].map((n,a)=>{const s=Ht(i[a]??"");return s===""?Xn(n):s}).join("; "):Gl(i)}function ix(i,e){const t=Ih(i,e).split(";"),n=t[0].includes(Mi)?void 0:dh(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function ax(i,e,t){var h;const[n="",a="",s=""]=i.length===3?i.map(g=>Ht(g)):[],r=ce(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n),o=(r==null?void 0:r[1])??((h=ce(/^\s*([a-zA-Z_]\w*)\s*(?:<=|<|>=|>)/,a))==null?void 0:h[1]),l=r?Oe(r[2],t):Xn(e.start),u=ce(/^\s*(\w+)\s*(<=|<)\s*(.+)$/,a);let m=Xn(e.end);u&&(o===void 0||u[1]===o)&&(m=Oe(u[3],t),u[2]==="<="&&(m=yo(m,1)));const c=o===void 0?void 0:hh(s,o),d=[l,m,...c!==void 0&&c!==1?[String(c)]:[]];return`for ${o??Xn(e.selector)} in range(${d.join(", ")}):`}function ko(i,e=[],t=new Map){return i.forEach((n,a)=>{var r;const s=[...e,a];t.has(n)||t.set(n,s),n.loopBody&&ko(n.loopBody,[...s,0],t),(r=n.cases)==null||r.forEach((o,l)=>ko(o.elements,[...s,l],t))}),t}function kh(i,e,t,n){const a=i.live,s=a==null?void 0:a.paths.get(e);if(!a||!s||t.out.length===n)return;const r=o=>t.out.slice(0,o).split(` -`).length-1;a.spans.push({path:s,from:r(n),to:r(t.out.length-1)})}function Sh(i,e,t){const n={target:e,labels:t,paths:ko(i.elements),spans:[]},a=Nl(i,e,{includeEmptyElseBranch:!0,live:n}),s=yt(i.caption);let r="";if(e==="java"){const u=Ql(i);for(const m of u)r+=m+` +`,$l=i=>i.every(e=>e.trim()==="");function kh(i,e){return $l(i)||i.length===3?[e.start,e.condition,e.step].map((n,a)=>{const s=Ht(i[a]??"");return s===""?Xn(n):s}).join("; "):Gl(i)}function ax(i,e){const t=kh(i,e).split(";"),n=t[0].includes(Mi)?void 0:hh(t[0]);return n!==void 0&&(t[0]=n),t.join(";")}function sx(i,e,t){var h;const[n="",a="",s=""]=i.length===3?i.map(g=>Ht(g)):[],r=ce(/^\s*(?:integer|int|long|short|byte|double|float)?\s*([a-zA-Z_]\w*)\s*=\s*(.+)$/i,n),o=(r==null?void 0:r[1])??((h=ce(/^\s*([a-zA-Z_]\w*)\s*(?:<=|<|>=|>)/,a))==null?void 0:h[1]),l=r?Pe(r[2],t):Xn(e.start),u=ce(/^\s*(\w+)\s*(<=|<)\s*(.+)$/,a);let m=Xn(e.end);u&&(o===void 0||u[1]===o)&&(m=Pe(u[3],t),u[2]==="<="&&(m=yo(m,1)));const c=o===void 0?void 0:gh(s,o),d=[l,m,...c!==void 0&&c!==1?[String(c)]:[]];return`for ${o??Xn(e.selector)} in range(${d.join(", ")}):`}function ko(i,e=[],t=new Map){return i.forEach((n,a)=>{var r;const s=[...e,a];t.has(n)||t.set(n,s),n.loopBody&&ko(n.loopBody,[...s,0],t),(r=n.cases)==null||r.forEach((o,l)=>ko(o.elements,[...s,l],t))}),t}function Sh(i,e,t,n){const a=i.live,s=a==null?void 0:a.paths.get(e);if(!a||!s||t.out.length===n)return;const r=o=>t.out.slice(0,o).split(` +`).length-1;a.spans.push({path:s,from:r(n),to:r(t.out.length-1)})}function _h(i,e,t){const n={target:e,labels:t,paths:ko(i.elements),spans:[]},a=Nl(i,e,{includeEmptyElseBranch:!0,live:n}),s=yt(i.caption);let r="";if(e==="java"){const u=Ql(i);for(const m of u)r+=m+` `;ls(i)?(u.includes("import java.util.Scanner;")||(r+=`import java.util.Scanner; `),r+=`Scanner scanner = new Scanner(System.in); `):u.length&&(r+=` -`),s&&(r+=lh(s)+` +`),s&&(r+=uh(s)+` `)}else{if(s)for(const m of s.params)m.dims||(m.type==="int"&&a.jsIntVariables.add(m.name),m.type==="string"&&a.stringVariables.add(m.name));const u=s==null?void 0:s.params.map(m=>m.name).join(", ");e==="javascript"?(r+=`"use strict"; `,r+=bo([i],"javascript"),s&&(r+=`function ${s.name}(${u}) { -`)):(zh(i)&&(r+=`import random +`)):(Ih(i)&&(r+=`import random `),r+=bo([i],"python"),s&&(r+=`def ${s.name}(${u}): `))}const o={out:""};p1(i.elements,e,a,s?a.indentPerLevel:0,o),s&&e!=="python"&&(o.out+=`} `);const l=r.split(` -`).length-1;return{text:_h((r+o.out).replace(/\n+$/,""),e),spans:n.spans.map(u=>({...u,from:u.from+l,to:u.to+l}))}}function _h(i,e){switch(e){case"javascript":return ox(wo(i,"javascript")).replace(/\.length\(\)/g,".length").replace(/\.contains\(/g,".includes(");case"python":return sx(wo(i,"python")).replace(/\b([a-zA-Z_]\w*(?:\[[^[\]]*\])?)\.length(?:\(\)|\b)/g,"len($1)");case"java":return mx(i)}}function sx(i){for(let e=0;e<5;e++){const t=Th(rx(i),"python");if(t===i)break;i=t}return i}const bu={indexOf:"find",lastIndexOf:"rfind",toUpperCase:"upper",toLowerCase:"lower",trim:"strip",startsWith:"startswith",endsWith:"endswith"};function rx(i){return Yl(i,["charAt","substring","contains","isEmpty","equalsIgnoreCase","compareTo","repeat","concat",...Object.keys(bu)],(e,t,n)=>{switch(t){case"charAt":return`${e}[${n}]`;case"substring":{const a=lx(n);return a.length===2?`${e}[${a[0].trim()}:${a[1].trim()}]`:`${e}[${n.trim()}:]`}case"contains":return`(${n.trim()} in ${e})`;case"isEmpty":return`(len(${e}) == 0)`;case"equalsIgnoreCase":return`(${e}.lower() == ${n.trim()}.lower())`;case"compareTo":return`((${e} > ${n.trim()}) - (${e} < ${n.trim()}))`;case"repeat":return`(${e} * ${n.trim()})`;case"concat":return`(${e} + ${n.trim()})`;default:return`${e}.${bu[t]}(${n})`}})}function ox(i){for(let e=0;e<5;e++){const t=Th(Yl(i,["isEmpty","equalsIgnoreCase","compareTo","replace"],(n,a,s)=>{switch(a){case"isEmpty":return`(${n}.length === 0)`;case"equalsIgnoreCase":return`(${n}.toLowerCase() === ${s.trim()}.toLowerCase())`;case"compareTo":return`${n}.localeCompare(${s.trim()})`;default:return`${n}.replaceAll(${s})`}}),"javascript");if(t===i)break;i=t}return i}function Th(i,e){const t=/\bFiles\.readString\(\s*(?:Path\.of|Paths\.get)\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g;return e==="python"?i.replace(t,'open($1, encoding="utf-8").read()').replace(/\bInteger\.parseInt\(/g,"int(").replace(/\bDouble\.parseDouble\(/g,"float(").replace(/\bString\.valueOf\(/g,"str("):i.replace(t,'require("fs").readFileSync($1, "utf8")').replace(/\bInteger\.parseInt\(/g,"parseInt(").replace(/\bDouble\.parseDouble\(/g,"parseFloat(").replace(/\bString\.valueOf\(/g,"String(")}function lx(i){let e=0;const t=[...i].findIndex(n=>n==="("?(e+=1,!1):n===")"?(e-=1,!1):n===","&&e===0);return t<0?[i]:[i.slice(0,t),i.slice(t+1)]}function Yl(i,e,t){const n=new RegExp(`([A-Za-z_]\\w*(?:\\[[^[\\]]*\\]|\\.\\w+\\(\\))*|"(?:[^"\\\\]|\\\\.)*")\\.(${e.join("|")})\\(`,"g");let a="",s=0;for(let r=n.exec(i);r;r=n.exec(i)){const o=r.index+r[0].length-1;let l=0,u=-1;for(let c=o;ce.has(n.toLowerCase())?t:`${n}.length()`)}const cx=new Set("abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while true false null var record sealed permits yield module open opens requires exports to uses provides with transitive".split(" "));function Gs(i){const e=i.trim();if(e==="")return"Main";let t="";return Array.from(e).forEach((n,a)=>{a===0?new RegExp("\\p{L}","u").test(n)||n==="_"||n==="$"?t+=n:new RegExp("\\p{Nd}","u").test(n)?t+="_"+n:t+="_":/[\p{L}\p{M}\p{N}]/u.test(n)||n==="_"||n==="$"?t+=n:t+="_"}),t=t.replace(/_{2,}/g,"_").replace(/^_+|_+$/g,""),t===""?"Main":(new RegExp("^\\p{Nd}","u").test(t)&&(t="_"+t),cx.has(t.toLowerCase())&&(t="_"+t),t)}function yu(i,e,t={},n=[]){const a={...oh,...t},s=Gs(e),r=[i,...n].filter((_,z,S)=>S.indexOf(_)===z).map(_=>({d:_,header:yt(_.caption)})).filter(_=>_.header!==void 0),o=r.map(_=>fo(_.d,_.header,"java",t,a.indentPerLevel)),l=yt(i.caption),u=r.some(_=>ls(_.d)),m=ss(i,"java",a),c=a.indentPerLevel*2,d=ls(i),h=d?dx(m):m,g=Z(c),f=h.trim()===""?"":h.split(` -`).map(_=>_.trim()===""?g:g+_).join(` -`);let x="";const b=o.length>0&&(d||u),y=[...new Set([i,...r.map(_=>_.d)].flatMap(Ql))],w=y.length>0;(d||u)&&!y.includes("import java.util.Scanner;")&&y.push("import java.util.Scanner;");for(const _ of y)x+=_+` +`).length-1;return{text:Th((r+o.out).replace(/\n+$/,""),e),spans:n.spans.map(u=>({...u,from:u.from+l,to:u.to+l}))}}function Th(i,e){switch(e){case"javascript":return lx(wo(i,"javascript")).replace(/\.length\(\)/g,".length").replace(/\.contains\(/g,".includes(");case"python":return rx(wo(i,"python")).replace(/\b([a-zA-Z_]\w*(?:\[[^[\]]*\])?)\.length(?:\(\)|\b)/g,"len($1)");case"java":return cx(i)}}function rx(i){for(let e=0;e<5;e++){const t=Oh(ox(i),"python");if(t===i)break;i=t}return i}const bu={indexOf:"find",lastIndexOf:"rfind",toUpperCase:"upper",toLowerCase:"lower",trim:"strip",startsWith:"startswith",endsWith:"endswith"};function ox(i){return Yl(i,["charAt","substring","contains","isEmpty","equalsIgnoreCase","compareTo","repeat","concat",...Object.keys(bu)],(e,t,n)=>{switch(t){case"charAt":return`${e}[${n}]`;case"substring":{const a=ux(n);return a.length===2?`${e}[${a[0].trim()}:${a[1].trim()}]`:`${e}[${n.trim()}:]`}case"contains":return`(${n.trim()} in ${e})`;case"isEmpty":return`(len(${e}) == 0)`;case"equalsIgnoreCase":return`(${e}.lower() == ${n.trim()}.lower())`;case"compareTo":return`((${e} > ${n.trim()}) - (${e} < ${n.trim()}))`;case"repeat":return`(${e} * ${n.trim()})`;case"concat":return`(${e} + ${n.trim()})`;default:return`${e}.${bu[t]}(${n})`}})}function lx(i){for(let e=0;e<5;e++){const t=Oh(Yl(i,["isEmpty","equalsIgnoreCase","compareTo","replace"],(n,a,s)=>{switch(a){case"isEmpty":return`(${n}.length === 0)`;case"equalsIgnoreCase":return`(${n}.toLowerCase() === ${s.trim()}.toLowerCase())`;case"compareTo":return`${n}.localeCompare(${s.trim()})`;default:return`${n}.replaceAll(${s})`}}),"javascript");if(t===i)break;i=t}return i}function Oh(i,e){const t=/\bFiles\.readString\(\s*(?:Path\.of|Paths\.get)\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g;return e==="python"?i.replace(t,'open($1, encoding="utf-8").read()').replace(/\bInteger\.parseInt\(/g,"int(").replace(/\bDouble\.parseDouble\(/g,"float(").replace(/\bString\.valueOf\(/g,"str("):i.replace(t,'require("fs").readFileSync($1, "utf8")').replace(/\bInteger\.parseInt\(/g,"parseInt(").replace(/\bDouble\.parseDouble\(/g,"parseFloat(").replace(/\bString\.valueOf\(/g,"String(")}function ux(i){let e=0;const t=[...i].findIndex(n=>n==="("?(e+=1,!1):n===")"?(e-=1,!1):n===","&&e===0);return t<0?[i]:[i.slice(0,t),i.slice(t+1)]}function Yl(i,e,t){const n=new RegExp(`([A-Za-z_]\\w*(?:\\[[^[\\]]*\\]|\\.\\w+\\(\\))*|"(?:[^"\\\\]|\\\\.)*")\\.(${e.join("|")})\\(`,"g");let a="",s=0;for(let r=n.exec(i);r;r=n.exec(i)){const o=r.index+r[0].length-1;let l=0,u=-1;for(let c=o;ce.has(n.toLowerCase())?t:`${n}.length()`)}const dx=new Set("abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while true false null var record sealed permits yield module open opens requires exports to uses provides with transitive".split(" "));function Gs(i){const e=i.trim();if(e==="")return"Main";let t="";return Array.from(e).forEach((n,a)=>{a===0?new RegExp("\\p{L}","u").test(n)||n==="_"||n==="$"?t+=n:new RegExp("\\p{Nd}","u").test(n)?t+="_"+n:t+="_":/[\p{L}\p{M}\p{N}]/u.test(n)||n==="_"||n==="$"?t+=n:t+="_"}),t=t.replace(/_{2,}/g,"_").replace(/^_+|_+$/g,""),t===""?"Main":(new RegExp("^\\p{Nd}","u").test(t)&&(t="_"+t),dx.has(t.toLowerCase())&&(t="_"+t),t)}function yu(i,e,t={},n=[]){const a={...lh,...t},s=Gs(e),r=[i,...n].filter((S,z,k)=>k.indexOf(S)===z).map(S=>({d:S,header:yt(S.caption)})).filter(S=>S.header!==void 0),o=r.map(S=>fo(S.d,S.header,"java",t,a.indentPerLevel)),l=yt(i.caption),u=r.some(S=>ls(S.d)),m=ss(i,"java",a),c=a.indentPerLevel*2,d=ls(i),h=d?hx(m):m,g=Z(c),f=h.trim()===""?"":h.split(` +`).map(S=>S.trim()===""?g:g+S).join(` +`);let x="";const b=o.length>0&&(d||u),y=[...new Set([i,...r.map(S=>S.d)].flatMap(Ql))],w=y.length>0;(d||u)&&!y.includes("import java.util.Scanner;")&&y.push("import java.util.Scanner;");for(const S of y)x+=S+` `;y.length&&(x+=` `),x+=`public class ${s} { `,b&&(x+=Z(a.indentPerLevel)+`static Scanner scanner = new Scanner(System.in); @@ -206,11 +206,11 @@ ${o.out}${Z(a)}} `)),x+=f,f!==""&&!f.endsWith(` `)&&(x+=` `),x+=Z(a.indentPerLevel)+`} -`);for(const[_,z]of o.entries())x+=(_>0||!l?` +`);for(const[S,z]of o.entries())x+=(S>0||!l?` `:"")+z;return x+=`} -`,x}function dx(i){const e=i.split(` +`,x}function hx(i){const e=i.split(` `);let t=0;for(e[t]==="// import java.util.Scanner;"&&t++;t=e.length?"":e.slice(t).join(` -`)}const xn={target:"visustruct.codegen.target",javaMode:"visustruct.codegen.javaOutputMode",comments:"visustruct.codegen.includeDiagramComments",emptyElse:"visustruct.codegen.includeEmptyElse"};function Ki(i){try{return localStorage.getItem(i)}catch{return null}}function ea(i,e){try{localStorage.setItem(i,e)}catch{}}const hx=()=>p("web_run_stopped_loop"),Oh=()=>p("web_run_cancelled"),Be=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function gx(i){let e=0;return i.replace(/^(\s*)while\s*\(\s*true\s*\)(?:\s*\/\*.*?\*\/)?\s*\{/gm,(t,n)=>{const a=`__visuStructLoopGuard${e++}`;return`${n}for (let ${a} = 0; ${a} < 100000 || (() => { throw new Error(${JSON.stringify(hx())}); })(); ${a}++) {`})}function px(i){return gx(i).replace(/\bprompt\s*\(/g,"await __visuStructPrompt(")}const fx=` +`)}const xn={target:"visustruct.codegen.target",javaMode:"visustruct.codegen.javaOutputMode",comments:"visustruct.codegen.includeDiagramComments",emptyElse:"visustruct.codegen.includeEmptyElse"};function Ki(i){try{return localStorage.getItem(i)}catch{return null}}function ea(i,e){try{localStorage.setItem(i,e)}catch{}}const gx=()=>p("web_run_stopped_loop"),Ah=()=>p("web_run_cancelled"),De=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function px(i){let e=0;return i.replace(/^(\s*)while\s*\(\s*true\s*\)(?:\s*\/\*.*?\*\/)?\s*\{/gm,(t,n)=>{const a=`__visuStructLoopGuard${e++}`;return`${n}for (let ${a} = 0; ${a} < 100000 || (() => { throw new Error(${JSON.stringify(gx())}); })(); ${a}++) {`})}function fx(i){return px(i).replace(/\bprompt\s*\(/g,"await __visuStructPrompt(")}const xx=` let answer let lines = [] // Text von \`process.stdout.write\` ohne neue Zeile (wie \`System.out.print\`). @@ -242,7 +242,7 @@ const process = { stdout: { write: (text) => { } } } setInterval(flush, 50) const __visuStructPrompt = (label) => new Promise((resolve, reject) => { - answer = (value) => (value === null ? reject(new Error(${JSON.stringify(Oh())})) : resolve(value)) + answer = (value) => (value === null ? reject(new Error(${JSON.stringify(Ah())})) : resolve(value)) send('prompt', String(label ?? '')) }) onmessage = async (e) => { @@ -255,42 +255,42 @@ onmessage = async (e) => { send('error', String(err)) } } -`,gr=2e3;class xx{constructor(e,t,n,a,s=()=>[]){v(this,"element");v(this,"target");v(this,"javaMode");v(this,"comments");v(this,"emptyElse");v(this,"code","");v(this,"codeView");v(this,"javaModeRow");v(this,"runButton");v(this,"saveButton");v(this,"copyButton");v(this,"runner");v(this,"runOutput");v(this,"runInput");v(this,"pseudocodeBox");v(this,"pseudocodeHint");v(this,"worker");v(this,"outputLines",[]);v(this,"droppedLines",0);v(this,"outputFrame");v(this,"pendingAnswer");this.currentDocument=e,this.saveFile=t,this.onClose=n,this.setPseudocode=a,this.subprograms=s;const r=Ki(xn.target);this.target=r==="python"||r==="javascript"?r:"java",this.javaMode=Ki(xn.javaMode)==="class"?"class":"snippet",this.comments=Ki(xn.comments)==="true",this.emptyElse=Ki(xn.emptyElse)!=="false",this.element=document.createElement("aside"),this.element.className="codepanel",this.build()}refresh(){const e=this.currentDocument(),t=this.options();this.code=this.target==="java"&&this.javaMode==="class"?yu(e,this.classStem(),t,this.subprograms()):ss(e,this.target,t,this.subprograms()),this.codeView.textContent=this.code,this.javaModeRow.hidden=this.target!=="java",this.saveButton.hidden=this.target!=="java",this.runButton.hidden=this.target!=="javascript"||!!e.pseudocode,this.runButton.hidden&&this.stopRun(!0),this.pseudocodeBox.checked=!!e.pseudocode,this.pseudocodeHint.hidden=!e.pseudocode;for(const n of this.element.querySelectorAll("[data-target]"))n.setAttribute("aria-pressed",String(n.dataset.target===this.target));for(const n of this.element.querySelectorAll("[data-java-mode]"))n.setAttribute("aria-pressed",String(n.dataset.javaMode===this.javaMode))}close(){this.stopRun(!0)}options(){return{includeDiagramTextAsComments:this.comments,includeEmptyElseBranch:this.emptyElse,pseudocodeNote:p("codegen_pseudocode_note")}}classStem(){return as(this.currentDocument().caption)||"Main"}build(){this.element.innerHTML=` +`,gr=2e3;class bx{constructor(e,t,n,a,s=()=>[]){v(this,"element");v(this,"target");v(this,"javaMode");v(this,"comments");v(this,"emptyElse");v(this,"code","");v(this,"codeView");v(this,"javaModeRow");v(this,"runButton");v(this,"saveButton");v(this,"copyButton");v(this,"runner");v(this,"runOutput");v(this,"runInput");v(this,"pseudocodeBox");v(this,"pseudocodeHint");v(this,"worker");v(this,"outputLines",[]);v(this,"droppedLines",0);v(this,"outputFrame");v(this,"pendingAnswer");this.currentDocument=e,this.saveFile=t,this.onClose=n,this.setPseudocode=a,this.subprograms=s;const r=Ki(xn.target);this.target=r==="python"||r==="javascript"?r:"java",this.javaMode=Ki(xn.javaMode)==="class"?"class":"snippet",this.comments=Ki(xn.comments)==="true",this.emptyElse=Ki(xn.emptyElse)!=="false",this.element=document.createElement("aside"),this.element.className="codepanel",this.build()}refresh(){const e=this.currentDocument(),t=this.options();this.code=this.target==="java"&&this.javaMode==="class"?yu(e,this.classStem(),t,this.subprograms()):ss(e,this.target,t,this.subprograms()),this.codeView.textContent=this.code,this.javaModeRow.hidden=this.target!=="java",this.saveButton.hidden=this.target!=="java",this.runButton.hidden=this.target!=="javascript"||!!e.pseudocode,this.runButton.hidden&&this.stopRun(!0),this.pseudocodeBox.checked=!!e.pseudocode,this.pseudocodeHint.hidden=!e.pseudocode;for(const n of this.element.querySelectorAll("[data-target]"))n.setAttribute("aria-pressed",String(n.dataset.target===this.target));for(const n of this.element.querySelectorAll("[data-java-mode]"))n.setAttribute("aria-pressed",String(n.dataset.javaMode===this.javaMode))}close(){this.stopRun(!0)}options(){return{includeDiagramTextAsComments:this.comments,includeEmptyElseBranch:this.emptyElse,pseudocodeNote:p("codegen_pseudocode_note")}}classStem(){return as(this.currentDocument().caption)||"Main"}build(){this.element.innerHTML=`
-

${Be(p("codegen_placeholder_title"))}

- +

${De(p("codegen_placeholder_title"))}

+
-
+
-
- +
+
- - - - + + + +
- - - + + +

       
-      

${Be(p("codegen_generated_hint"))}

- `;const e=a=>this.element.querySelector(a);this.codeView=e(".code-view"),this.javaModeRow=e(".java-mode"),this.runButton=e("[data-act=run]"),this.saveButton=e("[data-act=save]"),this.copyButton=e("[data-act=copy]"),this.runner=e(".runner"),this.runOutput=e(".runner-out"),this.runInput=e(".runner-input"),this.pseudocodeBox=e("[data-opt=pseudocode]"),this.pseudocodeHint=e(".pseudocode-hint"),this.pseudocodeBox.addEventListener("change",()=>this.setPseudocode(this.pseudocodeBox.checked)),e(".code-close").addEventListener("click",()=>this.onClose());for(const a of this.element.querySelectorAll("[data-target]"))a.addEventListener("click",()=>{this.target=a.dataset.target,ea(xn.target,this.target),this.refresh()});for(const a of this.element.querySelectorAll("[data-java-mode]"))a.addEventListener("click",()=>{this.javaMode=a.dataset.javaMode,ea(xn.javaMode,this.javaMode),this.refresh()});const t=e("[data-opt=comments]");t.checked=this.comments,t.addEventListener("change",()=>{this.comments=t.checked,ea(xn.comments,String(this.comments)),this.refresh()});const n=e("[data-opt=emptyElse]");n.checked=this.emptyElse,n.addEventListener("change",()=>{this.emptyElse=n.checked,ea(xn.emptyElse,String(this.emptyElse)),this.refresh()}),this.copyButton.addEventListener("click",()=>this.copy()),this.saveButton.addEventListener("click",()=>{const a=Gs(this.classStem()),s=yu(this.currentDocument(),this.classStem(),this.options());this.saveFile(`${a}.java`,s)}),this.runButton.addEventListener("click",()=>this.run()),e("[data-act=stop]").addEventListener("click",()=>this.stopRun(!1)),e("[data-act=cancel]").addEventListener("click",()=>this.answer(null)),this.runInput.addEventListener("submit",a=>{a.preventDefault(),this.answer(this.runInput.querySelector("input").value)})}async copy(){var t;let e=!1;try{await navigator.clipboard.writeText(this.code),e=!0}catch{const n=document.createRange();n.selectNodeContents(this.codeView);const a=getSelection();a==null||a.removeAllRanges(),a==null||a.addRange(n),e=((t=document.execCommand)==null?void 0:t.call(document,"copy"))??!1}this.copyButton.textContent=p(e?"web_copied_check":"web_copy_manual"),setTimeout(()=>this.copyButton.textContent=p("codegen_copy"),2e3)}run(){this.stopRun(!0),this.runner.hidden=!1,this.runOutput.textContent="",this.outputLines=[],this.droppedLines=0,this.runOutput.classList.remove("error");const e=px(this.code),t=n=>this.onRunnerMessage(n);try{const n=URL.createObjectURL(new Blob([fx],{type:"text/javascript"})),a=new Worker(n);URL.revokeObjectURL(n),a.onmessage=s=>t(s.data),a.onerror=s=>{s.preventDefault(),t({type:"error",text:s.message||p("web_run_error")})},a.postMessage({type:"run",code:e}),this.worker=a}catch{this.runInPage(e,t)}this.setRunning(!0)}runInPage(e,t){const n={log:(...r)=>t({type:"log",lines:[r.map(o=>typeof o=="string"?o:JSON.stringify(o)).join(" ")]})},a=r=>new Promise((o,l)=>{this.pendingAnswer=u=>u===null?l(new Error(Oh())):o(u),t({type:"prompt",text:r})}),s=(async()=>{}).constructor;new s("__visuStructPrompt","console",e)(a,n).then(()=>t({type:"done"})).catch(r=>t({type:"error",text:String(r)}))}onRunnerMessage(e){switch(e.type){case"log":this.appendOutput(e.lines??[]);break;case"prompt":{this.runInput.hidden=!1,this.runInput.querySelector("label").textContent=e.text??"";const t=this.runInput.querySelector("input");t.value="",t.focus();break}case"error":this.appendOutput([e.text??""]),this.runOutput.classList.add("error"),this.stopRun(!1);break;case"done":this.stopRun(!1);break}}appendOutput(e){this.outputLines.push(...e),this.outputLines.length>gr&&(this.droppedLines+=this.outputLines.length-gr,this.outputLines.splice(0,this.outputLines.length-gr)),this.outputFrame===void 0&&(this.outputFrame=requestAnimationFrame(()=>{this.outputFrame=void 0;const t=this.droppedLines>0?p("web_run_dropped_fmt",this.droppedLines)+` +

${De(p("codegen_generated_hint"))}

+ `;const e=a=>this.element.querySelector(a);this.codeView=e(".code-view"),this.javaModeRow=e(".java-mode"),this.runButton=e("[data-act=run]"),this.saveButton=e("[data-act=save]"),this.copyButton=e("[data-act=copy]"),this.runner=e(".runner"),this.runOutput=e(".runner-out"),this.runInput=e(".runner-input"),this.pseudocodeBox=e("[data-opt=pseudocode]"),this.pseudocodeHint=e(".pseudocode-hint"),this.pseudocodeBox.addEventListener("change",()=>this.setPseudocode(this.pseudocodeBox.checked)),e(".code-close").addEventListener("click",()=>this.onClose());for(const a of this.element.querySelectorAll("[data-target]"))a.addEventListener("click",()=>{this.target=a.dataset.target,ea(xn.target,this.target),this.refresh()});for(const a of this.element.querySelectorAll("[data-java-mode]"))a.addEventListener("click",()=>{this.javaMode=a.dataset.javaMode,ea(xn.javaMode,this.javaMode),this.refresh()});const t=e("[data-opt=comments]");t.checked=this.comments,t.addEventListener("change",()=>{this.comments=t.checked,ea(xn.comments,String(this.comments)),this.refresh()});const n=e("[data-opt=emptyElse]");n.checked=this.emptyElse,n.addEventListener("change",()=>{this.emptyElse=n.checked,ea(xn.emptyElse,String(this.emptyElse)),this.refresh()}),this.copyButton.addEventListener("click",()=>this.copy()),this.saveButton.addEventListener("click",()=>{const a=Gs(this.classStem()),s=yu(this.currentDocument(),this.classStem(),this.options());this.saveFile(`${a}.java`,s)}),this.runButton.addEventListener("click",()=>this.run()),e("[data-act=stop]").addEventListener("click",()=>this.stopRun(!1)),e("[data-act=cancel]").addEventListener("click",()=>this.answer(null)),this.runInput.addEventListener("submit",a=>{a.preventDefault(),this.answer(this.runInput.querySelector("input").value)})}async copy(){var t;let e=!1;try{await navigator.clipboard.writeText(this.code),e=!0}catch{const n=document.createRange();n.selectNodeContents(this.codeView);const a=getSelection();a==null||a.removeAllRanges(),a==null||a.addRange(n),e=((t=document.execCommand)==null?void 0:t.call(document,"copy"))??!1}this.copyButton.textContent=p(e?"web_copied_check":"web_copy_manual"),setTimeout(()=>this.copyButton.textContent=p("codegen_copy"),2e3)}run(){this.stopRun(!0),this.runner.hidden=!1,this.runOutput.textContent="",this.outputLines=[],this.droppedLines=0,this.runOutput.classList.remove("error");const e=fx(this.code),t=n=>this.onRunnerMessage(n);try{const n=URL.createObjectURL(new Blob([xx],{type:"text/javascript"})),a=new Worker(n);URL.revokeObjectURL(n),a.onmessage=s=>t(s.data),a.onerror=s=>{s.preventDefault(),t({type:"error",text:s.message||p("web_run_error")})},a.postMessage({type:"run",code:e}),this.worker=a}catch{this.runInPage(e,t)}this.setRunning(!0)}runInPage(e,t){const n={log:(...r)=>t({type:"log",lines:[r.map(o=>typeof o=="string"?o:JSON.stringify(o)).join(" ")]})},a=r=>new Promise((o,l)=>{this.pendingAnswer=u=>u===null?l(new Error(Ah())):o(u),t({type:"prompt",text:r})}),s=(async()=>{}).constructor;new s("__visuStructPrompt","console",e)(a,n).then(()=>t({type:"done"})).catch(r=>t({type:"error",text:String(r)}))}onRunnerMessage(e){switch(e.type){case"log":this.appendOutput(e.lines??[]);break;case"prompt":{this.runInput.hidden=!1,this.runInput.querySelector("label").textContent=e.text??"";const t=this.runInput.querySelector("input");t.value="",t.focus();break}case"error":this.appendOutput([e.text??""]),this.runOutput.classList.add("error"),this.stopRun(!1);break;case"done":this.stopRun(!1);break}}appendOutput(e){this.outputLines.push(...e),this.outputLines.length>gr&&(this.droppedLines+=this.outputLines.length-gr,this.outputLines.splice(0,this.outputLines.length-gr)),this.outputFrame===void 0&&(this.outputFrame=requestAnimationFrame(()=>{this.outputFrame=void 0;const t=this.droppedLines>0?p("web_run_dropped_fmt",this.droppedLines)+` `:"";this.runOutput.textContent=t+this.outputLines.join(` `)+(this.outputLines.length?` -`:""),this.runOutput.scrollTop=this.runOutput.scrollHeight}))}answer(e){var t;this.runInput.hidden=!0,this.worker?this.worker.postMessage({type:"answer",value:e}):(t=this.pendingAnswer)==null||t.call(this,e),this.pendingAnswer=void 0}stopRun(e){var t;(t=this.worker)==null||t.terminate(),this.worker=void 0,this.pendingAnswer=void 0,this.runInput&&(this.runInput.hidden=!0),e&&this.runner&&(this.runner.hidden=!0),this.setRunning(!1)}setRunning(e){const t=this.element.querySelector("[data-act=stop]");t&&(t.disabled=!e)}}const _e=(i,e=!1)=>``,te={newFile:_e(''),open:_e(''),save:_e(''),undo:_e(''),redo:_e(''),cut:_e(''),copy:_e(''),paste:_e(''),trash:_e(''),share:_e(''),book:_e(''),code:_e(''),play:_e('',!0),step:_e(''),indent:_e(''),stop:_e('',!0),folder:_e(''),newFolder:_e(''),diagram:_e(''),fileText:_e('')},bx="visustruct.learn.progress",pr={"04-sequenz":"05-sequenz","05-variablen-und-datentypen":"04-variablen-und-datentypen","07-verzweigung":"08-verzweigung","08-bedingungen-verknuepfen":"09-bedingungen-verknuepfen","09-fallauswahl":"10-fallauswahl","10-while-schleife":"11-while-schleife","11-do-while-schleife":"12-do-while-schleife","12-for-schleife":"13-for-schleife","13-verschachteln":"14-verschachteln","14-arrays":"15-arrays","15-aufruf-und-aussprung":"18-aufruf-und-aussprung","16-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-suchen-und-sortieren":"19-suchen-und-sortieren","18-suchen-und-sortieren":"19-suchen-und-sortieren","16-simulation-und-schreibtischtest":"07-simulation-und-schreibtischtest","17-java":"20-java","18-java":"20-java","19-java":"20-java","18-python-und-javascript":"21-python-und-javascript","19-python-und-javascript":"21-python-und-javascript","20-python-und-javascript":"21-python-und-javascript","22-erstes-fenster":"28-erstes-fenster","23-knopf-im-fenster":"29-knopf-im-fenster","24-der-knopf-reagiert":"30-der-knopf-reagiert","23-erstes-fenster":"28-erstes-fenster","24-knopf-im-fenster":"29-knopf-im-fenster","25-der-knopf-reagiert":"30-der-knopf-reagiert","26-zahl-verdoppeln":"31-zahl-verdoppeln","27-klickzaehler":"32-klickzaehler","28-ampel":"33-ampel","29-notenrechner":"34-notenrechner","30-taschenrechner":"35-taschenrechner","31-zahlenraten":"36-zahlenraten","13-lautsprecher":"16-lautsprecher","14-bildschirm":"18-bildschirm","15-motoren":"20-motoren","16-stoppuhr-akku":"21-stoppuhr-akku","03-sensoren":"04-sensoren","04-bis-zur-wand":"05-bis-zur-wand","05-abstand":"06-abstand","06-linie":"07-linie","07-farben":"08-farben","08-tasten-joystick":"10-tasten-joystick","09-licht":"11-licht","10-lautstaerke":"12-lautstaerke","11-neigung":"13-neigung","12-leds":"14-leds","13-einzelne-leds":"15-einzelne-leds","14-lautsprecher":"16-lautsprecher","15-bildschirm":"18-bildschirm","16-motoren":"20-motoren","17-stoppuhr-akku":"21-stoppuhr-akku"};function yx(i){var n;const e={...i.lessons};for(const[a,s]of Object.entries(pr))i.lessons[a]&&!i.lessons[s]&&(e[s]=i.lessons[a]),i.lessons[a]&&delete e[a];const t=(n=i.view)!=null&&n.lesson&&pr[i.view.lesson]?{...i.view,lesson:pr[i.view.lesson]}:i.view;return{...i,lessons:e,view:t}}function vx(){try{localStorage.removeItem(bx)}catch{}}const Ah=()=>({lessons:{},exercises:{}});vx();let qe=Ah();const So=new Set;function ta(){for(const i of So)i()}const vu="visustruct-lernstand";function Ph(i,e){return i||e||void 0}function wx(i,e){if(!i)return e;const t={...e.checks};for(const[n,a]of Object.entries(i.checks??{}))t[n]=a||!!t[n];return{step:Math.max(i.step??0,e.step??0),done:Ph(i.done,e.done),checks:Object.keys(t).length?t:void 0,quiz:i.quiz||e.quiz?{...e.quiz,...i.quiz}:void 0}}function zx(i,e){const t={...i.lessons};for(const[a,s]of Object.entries(e.lessons))t[a]=wx(i.lessons[a],s);const n={...i.exercises};for(const[a,s]of Object.entries(e.exercises)){const r=i.exercises[a];n[a]=r?{done:Ph(r.done,s.done),xml:r.xml??s.xml}:s}return{lessons:t,exercises:n}}const he={lesson(i){return qe.lessons[i]??{step:0}},updateLesson(i,e){qe.lessons[i]={...he.lesson(i),...e},ta()},exercise(i){return qe.exercises[i]??{}},updateExercise(i,e){qe.exercises[i]={...he.exercise(i),...e},ta()},resetExercise(i){delete qe.exercises[i],ta()},view(){return qe.view},hasContent(){return Object.values(qe.lessons).some(i=>i.step>0||i.done||i.checks||i.quiz)||Object.keys(qe.exercises).length>0},setView(i){qe.view=i,ta()},onChange(i){return So.add(i),()=>So.delete(i)},toFile(){return JSON.stringify({format:vu,version:1,saved:new Date().toISOString(),lessons:qe.lessons,exercises:qe.exercises,view:qe.view},null,2)},loadFile(i,e=!1){let t;try{t=JSON.parse(i)}catch{return!1}if((t==null?void 0:t.format)!==vu)return!1;const n=yx({lessons:t.lessons??{},exercises:t.exercises??{},view:t.view});return qe=e?{...zx(qe,n),view:n.view??qe.view}:n,!0},clear(){qe=Ah()}};function wu(i=new Date){const e=t=>String(t).padStart(2,"0");return`${i.getFullYear()}-${e(i.getMonth()+1)}-${e(i.getDate())}`}const zu=i=>/^\d{4}-\d{2}-\d{2}$/.test(i);function Ix(i,e){return i.kind!==e.kind?i.kind==="directory"?-1:1:zu(i.name)&&zu(e.name)?e.name.localeCompare(i.name):i.name.localeCompare(e.name,void 0,{numeric:!0,sensitivity:"base"})}function kx(i,e){return i.replace(/\.(visustruct|strk|java)$/i,"").replace(/[\\/:*?"<>|\u0000-\u001f]/g,"-").replace(/\s+/g," ").trim().replace(/^\.+/,"")||e}function Sx(i,e){const t=new Set([...e].map(a=>a.toLowerCase())),n=a=>!t.has(`${a}.visustruct`.toLowerCase())&&!t.has(`${a}.java`.toLowerCase());if(n(i))return i;for(let a=2;;a++)if(n(`${i} ${a}`))return`${i} ${a}`}function _x(i){const e=i.replace(/[\\/:*?"<>|\u0000-\u001f]/g,"").trim();return e&&e!=="."&&e!==".."?e:void 0}const Vn=10;function Tx(i){let e=i.replace(/\r/g,"").split(` -`).filter(m=>!m.startsWith("//"));const t=e.filter(m=>/^linie:/.test(m)).map(m=>m.slice(6).trim());e=e.filter(m=>!/^linie:/.test(m));const n=e.findIndex(m=>/^raster:\s*\d+\s*$/.test(m));if(n>=0){const m=Number(e[n].split(":")[1]);e.splice(n,1),e=e.flatMap(c=>Array.from({length:m},(d,h)=>Array.from(c).map(g=>Array.from({length:m},(f,x)=>"^>v<".includes(g)?h===m>>1&&x===m>>1?g:".":g).join("")).join("")))}for(;e.length&&e[e.length-1].trim()==="";)e.pop();for(;e.length&&e[0].trim()==="";)e.shift();const s=Math.max(...e.map(m=>m.length))*Vn,r=e.length*Vn,o=(m,c)=>({x:-s/2+(m+.5)*Vn,y:r/2-(c+.5)*Vn}),l={width:s,depth:r,start:{x:0,y:0,heading:0},walls:[],lines:[],blocks:[],marks:[],goals:[],targets:[],colors:[]};let u=0;e.forEach((m,c)=>{Array.from(m).forEach((d,h)=>{const g=o(h,c);d==="#"?l.blocks.push(g):d==="="?l.marks.push(g):d==="Z"?l.goals.push(g):d==="o"?l.targets.push(g):d in Iu?l.colors.push({at:g,color:Iu[d]}):"^>v<".includes(d)&&(u++,l.start={...g,heading:{"^":0,">":90,v:180,"<":270}[d]})})});for(const m of t)l.lines.push(m.split(/\s+/).map(c=>{const[d,h]=c.split(",").map(Number);if(!Number.isFinite(d)||!Number.isFinite(h))throw new Error(`Linie: „${c}“ ist kein Feld (Spalte,Zeile).`);return o(d,h)}));if(u!==1)throw new Error(`Die Weltkarte braucht genau einen Start (^ > v <), gefunden: ${u}`);return l}const Iu={r:"red",g:"green",b:"blue",y:"yellow"},N1=(i,e)=>Math.abs(i.x-e.x)<=Vn/2&&Math.abs(i.y-e.y)<=Vn/2,ku=10,Su=9,Ox=300,u1=8,Ax=[-3.6,-1.2,1.2,3.6],Px=2.5,jx=20,Cx=12,Xl=100,vi={width:200,depth:200,start:{x:0,y:0,heading:0},walls:[],lines:[]},_u=i=>i*Math.PI/180,m1=i=>({x:Math.sin(_u(i)),y:Math.cos(_u(i))}),na=()=>Array.from({length:Xd},()=>{}),Tu=([i,e,t])=>i>0||e>0||t>0?[i,e,t]:void 0;class us{constructor(e=vi){v(this,"pose");v(this,"trail");v(this,"bumps",0);v(this,"leds",na());v(this,"screen");v(this,"wheels",[0,0]);v(this,"time",0);v(this,"timerStart",0);v(this,"blocked",!1);v(this,"blockWallCache");this.setup=e,this.pose={...e.start},this.trail=[{x:e.start.x,y:e.start.y}]}reset(){this.pose={...this.setup.start},this.trail=[{x:this.pose.x,y:this.pose.y}],this.bumps=0,this.leds=na(),this.screen=void 0,this.wheels=[0,0],this.time=0,this.timerStart=0,this.blocked=!1}get allWalls(){const e=this.setup.width/2,t=this.setup.depth/2,n=[{x:-e,y:-t},{x:e,y:-t},{x:e,y:t},{x:-e,y:t}];return[...this.setup.walls,...n.map((a,s)=>({from:a,to:n[(s+1)%4]})),...this.blockWalls]}get blockWalls(){return this.blockWallCache??(this.blockWallCache=(this.setup.blocks??[]).flatMap(e=>{const t=Vn/2,n=[{x:e.x-t,y:e.y-t},{x:e.x+t,y:e.y-t},{x:e.x+t,y:e.y+t},{x:e.x-t,y:e.y+t}];return n.map((a,s)=>({from:a,to:n[(s+1)%4]}))})),this.blockWallCache}atGoal(){const e=m1(this.pose.heading),t={x:this.pose.x+e.x*u1,y:this.pose.y+e.y*u1};return(this.setup.goals??[]).some(n=>N1(this.pose,n)||N1(t,n))||(this.setup.targets??[]).some(n=>N1(this.pose,n))}apply(e){switch(e.method){case"forward":return this.wheels=[0,0],this.drive(e.args[0]);case"backward":return this.wheels=[0,0],this.drive(-e.args[0]);case"turnRight":return this.wheels=[0,0],this.turn(e.args[0]);case"turnLeft":return this.wheels=[0,0],this.turn(-e.args[0]);case"stop":this.wheels=[0,0];return;case"drive":this.wheels=[Ou(e.args[0]),Ou(e.args[1])];return;case"pause":return this.tick(e.args[0]);case"resetTimer":this.timerStart=this.time;return;case"setLed":this.leds=na().map(()=>Tu(e.args));return;case"ledOff":this.leds=na();return;case"ledColor":this.leds[e.args[0]]=Tu(Xa[e.text??""]??[0,0,0]);return;case"showText":this.screen=e.text;return}}tick(e){if(e<=0)return;this.time+=e;const[t,n]=this.wheels.map(o=>o/100*jx);if(t===0&&n===0)return;const a=Math.ceil(e/10),s=e/1e3/a;let r=!1;for(let o=0;o{const r={x:this.pose.x+e.x*u1+t.x*a,y:this.pose.y+e.y*u1+t.y*a};([...this.setup.marks??[],...this.setup.goals??[]].some(l=>N1(r,l))||this.setup.lines.some(l=>Dx(r,l)<=Px/2))&&(n|=1<<3-s)}),n}colorUnder(){var n;const e=m1(this.pose.heading),t={x:this.pose.x+e.x*u1,y:this.pose.y+e.y*u1};return(n=(this.setup.colors??[]).find(a=>N1(t,a.at)))==null?void 0:n.color}sensors(){const e=this.lineState();return{getDistance:this.distance(),getLine:e,getColor:this.colorUnder()??(e&6?"black":"white"),isLineLeft:(e&4)!==0,isLineRight:(e&2)!==0,getTimer:this.timer}}freeDistance(e,t){let n=1/0;for(const a of this.allWalls){const s=Bx(e,t,a.from,a.to);s!==void 0&&sMath.max(-100,Math.min(100,i));function Au(i){const e=(i%360+360)%360;return Math.abs(e-360)<1e-9?0:e}function Bx(i,e,t,n){const a={x:n.x-t.x,y:n.y-t.y},s=e.x*a.y-e.y*a.x;if(Math.abs(s)<1e-12)return;const r={x:t.x-i.x,y:t.y-i.y},o=(r.x*a.y-r.y*a.x)/s,l=(r.x*e.y-r.y*e.x)/s;return o>=0&&l>=0&&l<=1?o:void 0}function Dx(i,e){let t=1/0;for(let n=0;n+10&&o.tick(Xl),s.robotSensors={...o.sensors(),...Nx(a,u)};const c=()=>({outputs:[...m.outputLines],files:new Map(m.files),drive:m.robotActions.length?es(m.robotActions):void 0,...n?{atGoal:o.atGoal(),bumps:o.bumps}:{},led:o.leds.some(d=>d!==void 0),tone:m.robotActions.some(d=>d.method==="playTone"),screen:o.screen,actions:eh(m.robotActions.filter(d=>!Wx.has(d.method)))});if(m.inputRequest){const d=r.shift();if(d===void 0)return{...c(),missingInput:!0};if(s.provideInput(d),m.inputErrorNotice)return{...c(),error:m.inputErrorNotice};continue}if(m.isHalted)return{...c(),error:m.notice};if(!s.canStep)return{...c(),unusedInputs:r.length||void 0};s.step()}return{outputs:[...s.state.outputLines],files:new Map(s.state.files),drive:es(s.state.robotActions),tooManySteps:!0}}function Nx(i,e){const t=Math.floor(e/Mx);return Object.fromEntries(Object.entries(i??{}).map(([n,a])=>[n,a[Math.min(t,a.length-1)]]))}function jh(i){return i===void 0||i===""?[]:i.replace(/\n$/,"").split(` -`)}function ia(i,e){return i.length!==e.length?!1:i.every((t,n)=>Pu(t)===Pu(e[n]))}function Pu(i){const e=i.trim().replace(/\s+/g," ");return/^-?\d+\.0+$/.test(e)?e.replace(/\.0+$/,""):e}function Fx(i,e,t,n){return e.map(a=>{var d,h,g;const s=a.world?n==null?void 0:n(a.world):void 0;if(a.world&&!s)throw new Error(`Weltkarte „${a.world}“ fehlt.`);const r=Ex(i,a.inputs,t,s,a.sensors),o=(a.files??[]).every(f=>{var x;return ia(jh((x=r.files)==null?void 0:x.get(f.name)),f.lines)}),l=!a.drive||ia(r.drive??[],a.drive),u=!a.world||r.bumps===0&&(!((d=s==null?void 0:s.goals)!=null&&d.length||(h=s==null?void 0:s.targets)!=null&&h.length)||r.atGoal===!0),m=(a.led===void 0||r.led===a.led)&&(a.tone===void 0||r.tone===a.tone)&&(a.screen===void 0||r.screen===a.screen)&&(a.drives===void 0||(((g=r.drive)==null?void 0:g.length)??0)>0===a.drives)&&(!a.actions||ia(r.actions??[],a.actions)),c=!r.error&&!r.missingInput&&!r.tooManySteps&&ia(r.outputs,a.expected)&&o&&l&&u&&m;return{test:a,result:r,passed:c}})}function Jx(i){const e=new Set,t=n=>{for(const a of n){e.add(a.type),a.loopBody&&t(a.loopBody);for(const s of a.cases??[])t(s.elements)}};return t(i.elements),e}function _o(i){const e=[I.forSchleife,I.whileSchleife,I.doUntilSchleife,I.endlosschleife];let t=0;for(const n of i){const a=Math.max(_o(n.loopBody??[]),...(n.cases??[]).map(s=>_o(s.elements)));t=Math.max(t,a+(e.includes(n.type)?1:0))}return t}class wi extends Error{}function Rx(i,e){const t=[],n=[];for(const a of i){const s=a.trim();if(!s)continue;if(s.startsWith("?")){const o=s.slice(1).trim();ms(o,Gx(t)),n.push(o);continue}const r=/^([A-Za-z_]\w*)\s*:\s*(?:(-?\d+)\s*\.\.\s*(-?\d+)|(boolean))$/.exec(s);if(!r)throw new wi(`${e}: Unbekannte Zeile im Spiel: „${s}“`);t.push(r[4]?{name:r[1],kind:"boolean"}:{name:r[1],kind:"int",min:Number(r[2]),max:Number(r[3])})}if(!n.length)throw new wi(`${e}: Das Spiel braucht mindestens eine Zeile „? bedingung“.`);return{vars:t,conditions:n}}function Gx(i){return Object.fromEntries(i.map(e=>[e.name,e.kind==="boolean"?!0:e.min]))}function Hx(i){const e=[],t=/\s*(?:(\d+)|(true|false)\b|([A-Za-z_]\w*)|(&&|\|\||==|!=|<=|>=|<|>|!|\(|\)))/y;let n=0;for(;nt[n],s=d=>{var h;return((h=a())==null?void 0:h.kind)==="op"&&a().value===d},r=()=>{throw new wi(`Bedingung nicht lesbar: „${i}“`)},o=()=>{const d=t[n++]??r();if(d.kind==="num"||d.kind==="bool")return d.value;if(d.kind==="name"){if(!(d.value in e))throw new wi(`Unbekannte Variable „${d.value}“ in „${i}“`);return e[d.value]}if(d.value==="("){const h=m();return s(")")||r(),n++,h}if(d.value==="!"){const h=o();return typeof h!="boolean"&&r(),!h}return r()},l=()=>{const d=o(),h=a();if((h==null?void 0:h.kind)==="op"&&["==","!=","<","<=",">",">="].includes(h.value)){n++;const g=o();switch(h.value){case"==":return d===g;case"!=":return d!==g}(typeof d!="number"||typeof g!="number")&&r();const[f,x]=[d,g];return h.value==="<"?f"?f>x:f>=x}return d},u=()=>{let d=l();for(;s("&&");){n++;const h=l();d=d&&h}return d},m=()=>{let d=u();for(;s("||");){n++;const h=u();d=d||h}return d},c=m();return n!==t.length||typeof c!="boolean"?r():c}function Vx(i,e){const t=[i],n=i.replace(/\b[A-Za-z_]\w*\b/g,r=>r in e?String(e[r]):r);n!==i&&t.push(n);const a=n.replace(/(-?\d+|true|false)\s*(==|!=|<=|>=|<|>)\s*(-?\d+|true|false)/g,r=>String(ms(r,{})));a!==t[t.length-1]&&t.push(a);const s=String(ms(i,e));return s!==t[t.length-1]&&t.push(s),t}function Qx(i,e){const t=[],n=new RegExp(`\\b${e}\\s*(?:==|!=|<=|>=|<|>)\\s*(-?\\d+)|(-?\\d+)\\s*(?:==|!=|<=|>=|<|>)\\s*${e}\\b`,"g");for(const a of i.matchAll(n)){const s=Number(a[1]??a[2]);t.push(s-1,s,s+1)}return t}function qx(i,e,t,n=Math.random){const a=i.conditions.length,s=Math.floor(e*a/t),r=Math.min(a-1,s+(n()<.5?0:1)),o=i.conditions[r],l={};for(const u of i.vars){if(u.kind==="boolean"){l[u.name]=n()<.5;continue}const m=Qx(o,u.name).filter(c=>c>=u.min&&c<=u.max);l[u.name]=m.length&&n()<.6?m[Math.floor(n()*m.length)]:u.min+Math.floor(n()*(u.max-u.min+1))}return{condition:o,values:l,answer:ms(o,l)}}function Ux(i){return Object.entries(i.values).filter(([e])=>new RegExp(`\\b${e}\\b`).test(i.condition))}const $x=`--- +`:""),this.runOutput.scrollTop=this.runOutput.scrollHeight}))}answer(e){var t;this.runInput.hidden=!0,this.worker?this.worker.postMessage({type:"answer",value:e}):(t=this.pendingAnswer)==null||t.call(this,e),this.pendingAnswer=void 0}stopRun(e){var t;(t=this.worker)==null||t.terminate(),this.worker=void 0,this.pendingAnswer=void 0,this.runInput&&(this.runInput.hidden=!0),e&&this.runner&&(this.runner.hidden=!0),this.setRunning(!1)}setRunning(e){const t=this.element.querySelector("[data-act=stop]");t&&(t.disabled=!e)}}const Oe=(i,e=!1)=>``,ne={newFile:Oe(''),open:Oe(''),save:Oe(''),undo:Oe(''),redo:Oe(''),cut:Oe(''),copy:Oe(''),paste:Oe(''),trash:Oe(''),share:Oe(''),book:Oe(''),code:Oe(''),play:Oe('',!0),step:Oe(''),indent:Oe(''),stop:Oe('',!0),folder:Oe(''),newFolder:Oe(''),diagram:Oe(''),fileText:Oe('')},yx="visustruct.learn.progress",pr={"04-sequenz":"05-sequenz","05-variablen-und-datentypen":"04-variablen-und-datentypen","07-verzweigung":"08-verzweigung","08-bedingungen-verknuepfen":"09-bedingungen-verknuepfen","09-fallauswahl":"10-fallauswahl","10-while-schleife":"11-while-schleife","11-do-while-schleife":"12-do-while-schleife","12-for-schleife":"13-for-schleife","13-verschachteln":"14-verschachteln","14-arrays":"15-arrays","15-aufruf-und-aussprung":"18-aufruf-und-aussprung","16-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-aufruf-und-aussprung":"18-aufruf-und-aussprung","17-suchen-und-sortieren":"19-suchen-und-sortieren","18-suchen-und-sortieren":"19-suchen-und-sortieren","16-simulation-und-schreibtischtest":"07-simulation-und-schreibtischtest","17-java":"20-java","18-java":"20-java","19-java":"20-java","18-python-und-javascript":"21-python-und-javascript","19-python-und-javascript":"21-python-und-javascript","20-python-und-javascript":"21-python-und-javascript","22-erstes-fenster":"28-erstes-fenster","23-knopf-im-fenster":"29-knopf-im-fenster","24-der-knopf-reagiert":"30-der-knopf-reagiert","23-erstes-fenster":"28-erstes-fenster","24-knopf-im-fenster":"29-knopf-im-fenster","25-der-knopf-reagiert":"30-der-knopf-reagiert","26-zahl-verdoppeln":"31-zahl-verdoppeln","27-klickzaehler":"32-klickzaehler","28-ampel":"33-ampel","29-notenrechner":"34-notenrechner","30-taschenrechner":"35-taschenrechner","31-zahlenraten":"36-zahlenraten","13-lautsprecher":"16-lautsprecher","14-bildschirm":"18-bildschirm","15-motoren":"20-motoren","16-stoppuhr-akku":"21-stoppuhr-akku","03-sensoren":"04-sensoren","04-bis-zur-wand":"05-bis-zur-wand","05-abstand":"06-abstand","06-linie":"07-linie","07-farben":"08-farben","08-tasten-joystick":"10-tasten-joystick","09-licht":"11-licht","10-lautstaerke":"12-lautstaerke","11-neigung":"13-neigung","12-leds":"14-leds","13-einzelne-leds":"15-einzelne-leds","14-lautsprecher":"16-lautsprecher","15-bildschirm":"18-bildschirm","16-motoren":"20-motoren","17-stoppuhr-akku":"21-stoppuhr-akku"};function vx(i){var n;const e={...i.lessons};for(const[a,s]of Object.entries(pr))i.lessons[a]&&!i.lessons[s]&&(e[s]=i.lessons[a]),i.lessons[a]&&delete e[a];const t=(n=i.view)!=null&&n.lesson&&pr[i.view.lesson]?{...i.view,lesson:pr[i.view.lesson]}:i.view;return{...i,lessons:e,view:t}}function wx(){try{localStorage.removeItem(yx)}catch{}}const Ph=()=>({lessons:{},exercises:{}});wx();let qe=Ph();const So=new Set;function ta(){for(const i of So)i()}const vu="visustruct-lernstand";function jh(i,e){return i||e||void 0}function zx(i,e){if(!i)return e;const t={...e.checks};for(const[n,a]of Object.entries(i.checks??{}))t[n]=a||!!t[n];return{step:Math.max(i.step??0,e.step??0),done:jh(i.done,e.done),checks:Object.keys(t).length?t:void 0,quiz:i.quiz||e.quiz?{...e.quiz,...i.quiz}:void 0}}function Ix(i,e){const t={...i.lessons};for(const[a,s]of Object.entries(e.lessons))t[a]=zx(i.lessons[a],s);const n={...i.exercises};for(const[a,s]of Object.entries(e.exercises)){const r=i.exercises[a];n[a]=r?{done:jh(r.done,s.done),xml:r.xml??s.xml}:s}return{lessons:t,exercises:n}}const ge={lesson(i){return qe.lessons[i]??{step:0}},updateLesson(i,e){qe.lessons[i]={...ge.lesson(i),...e},ta()},exercise(i){return qe.exercises[i]??{}},updateExercise(i,e){qe.exercises[i]={...ge.exercise(i),...e},ta()},resetExercise(i){delete qe.exercises[i],ta()},view(){return qe.view},hasContent(){return Object.values(qe.lessons).some(i=>i.step>0||i.done||i.checks||i.quiz)||Object.keys(qe.exercises).length>0},setView(i){qe.view=i,ta()},onChange(i){return So.add(i),()=>So.delete(i)},toFile(){return JSON.stringify({format:vu,version:1,saved:new Date().toISOString(),lessons:qe.lessons,exercises:qe.exercises,view:qe.view},null,2)},loadFile(i,e=!1){let t;try{t=JSON.parse(i)}catch{return!1}if((t==null?void 0:t.format)!==vu)return!1;const n=vx({lessons:t.lessons??{},exercises:t.exercises??{},view:t.view});return qe=e?{...Ix(qe,n),view:n.view??qe.view}:n,!0},clear(){qe=Ph()}};function wu(i=new Date){const e=t=>String(t).padStart(2,"0");return`${i.getFullYear()}-${e(i.getMonth()+1)}-${e(i.getDate())}`}const zu=i=>/^\d{4}-\d{2}-\d{2}$/.test(i);function kx(i,e){return i.kind!==e.kind?i.kind==="directory"?-1:1:zu(i.name)&&zu(e.name)?e.name.localeCompare(i.name):i.name.localeCompare(e.name,void 0,{numeric:!0,sensitivity:"base"})}function Sx(i,e){return i.replace(/\.(visustruct|strk|java)$/i,"").replace(/[\\/:*?"<>|\u0000-\u001f]/g,"-").replace(/\s+/g," ").trim().replace(/^\.+/,"")||e}function _x(i,e){const t=new Set([...e].map(a=>a.toLowerCase())),n=a=>!t.has(`${a}.visustruct`.toLowerCase())&&!t.has(`${a}.java`.toLowerCase());if(n(i))return i;for(let a=2;;a++)if(n(`${i} ${a}`))return`${i} ${a}`}function Tx(i){const e=i.replace(/[\\/:*?"<>|\u0000-\u001f]/g,"").trim();return e&&e!=="."&&e!==".."?e:void 0}const Vn=10;function Ox(i){let e=i.replace(/\r/g,"").split(` +`).filter(m=>!m.startsWith("//"));const t=e.filter(m=>/^linie:/.test(m)).map(m=>m.slice(6).trim());e=e.filter(m=>!/^linie:/.test(m));const n=e.findIndex(m=>/^raster:\s*\d+\s*$/.test(m));if(n>=0){const m=Number(e[n].split(":")[1]);e.splice(n,1),e=e.flatMap(c=>Array.from({length:m},(d,h)=>Array.from(c).map(g=>Array.from({length:m},(f,x)=>"^>v<".includes(g)?h===m>>1&&x===m>>1?g:".":g).join("")).join("")))}for(;e.length&&e[e.length-1].trim()==="";)e.pop();for(;e.length&&e[0].trim()==="";)e.shift();const s=Math.max(...e.map(m=>m.length))*Vn,r=e.length*Vn,o=(m,c)=>({x:-s/2+(m+.5)*Vn,y:r/2-(c+.5)*Vn}),l={width:s,depth:r,start:{x:0,y:0,heading:0},walls:[],lines:[],blocks:[],marks:[],goals:[],targets:[],colors:[]};let u=0;e.forEach((m,c)=>{Array.from(m).forEach((d,h)=>{const g=o(h,c);d==="#"?l.blocks.push(g):d==="="?l.marks.push(g):d==="Z"?l.goals.push(g):d==="o"?l.targets.push(g):d in Iu?l.colors.push({at:g,color:Iu[d]}):"^>v<".includes(d)&&(u++,l.start={...g,heading:{"^":0,">":90,v:180,"<":270}[d]})})});for(const m of t)l.lines.push(m.split(/\s+/).map(c=>{const[d,h]=c.split(",").map(Number);if(!Number.isFinite(d)||!Number.isFinite(h))throw new Error(`Linie: „${c}“ ist kein Feld (Spalte,Zeile).`);return o(d,h)}));if(u!==1)throw new Error(`Die Weltkarte braucht genau einen Start (^ > v <), gefunden: ${u}`);return l}const Iu={r:"red",g:"green",b:"blue",y:"yellow"},N1=(i,e)=>Math.abs(i.x-e.x)<=Vn/2&&Math.abs(i.y-e.y)<=Vn/2,ku=10,Su=9,Ax=300,u1=8,Px=[-3.6,-1.2,1.2,3.6],jx=2.5,Cx=20,Bx=12,Xl=100,vi={width:200,depth:200,start:{x:0,y:0,heading:0},walls:[],lines:[]},_u=i=>i*Math.PI/180,m1=i=>({x:Math.sin(_u(i)),y:Math.cos(_u(i))}),na=()=>Array.from({length:Kd},()=>{}),Tu=([i,e,t])=>i>0||e>0||t>0?[i,e,t]:void 0;class us{constructor(e=vi){v(this,"pose");v(this,"trail");v(this,"bumps",0);v(this,"leds",na());v(this,"screen");v(this,"wheels",[0,0]);v(this,"time",0);v(this,"timerStart",0);v(this,"blocked",!1);v(this,"blockWallCache");this.setup=e,this.pose={...e.start},this.trail=[{x:e.start.x,y:e.start.y}]}reset(){this.pose={...this.setup.start},this.trail=[{x:this.pose.x,y:this.pose.y}],this.bumps=0,this.leds=na(),this.screen=void 0,this.wheels=[0,0],this.time=0,this.timerStart=0,this.blocked=!1}get allWalls(){const e=this.setup.width/2,t=this.setup.depth/2,n=[{x:-e,y:-t},{x:e,y:-t},{x:e,y:t},{x:-e,y:t}];return[...this.setup.walls,...n.map((a,s)=>({from:a,to:n[(s+1)%4]})),...this.blockWalls]}get blockWalls(){return this.blockWallCache??(this.blockWallCache=(this.setup.blocks??[]).flatMap(e=>{const t=Vn/2,n=[{x:e.x-t,y:e.y-t},{x:e.x+t,y:e.y-t},{x:e.x+t,y:e.y+t},{x:e.x-t,y:e.y+t}];return n.map((a,s)=>({from:a,to:n[(s+1)%4]}))})),this.blockWallCache}atGoal(){const e=m1(this.pose.heading),t={x:this.pose.x+e.x*u1,y:this.pose.y+e.y*u1};return(this.setup.goals??[]).some(n=>N1(this.pose,n)||N1(t,n))||(this.setup.targets??[]).some(n=>N1(this.pose,n))}apply(e){switch(e.method){case"forward":return this.wheels=[0,0],this.drive(e.args[0]);case"backward":return this.wheels=[0,0],this.drive(-e.args[0]);case"turnRight":return this.wheels=[0,0],this.turn(e.args[0]);case"turnLeft":return this.wheels=[0,0],this.turn(-e.args[0]);case"stop":this.wheels=[0,0];return;case"drive":this.wheels=[Ou(e.args[0]),Ou(e.args[1])];return;case"pause":return this.tick(e.args[0]);case"resetTimer":this.timerStart=this.time;return;case"setLed":this.leds=na().map(()=>Tu(e.args));return;case"ledOff":this.leds=na();return;case"ledColor":this.leds[e.args[0]]=Tu(Xa[e.text??""]??[0,0,0]);return;case"showText":this.screen=e.text;return}}tick(e){if(e<=0)return;this.time+=e;const[t,n]=this.wheels.map(o=>o/100*Cx);if(t===0&&n===0)return;const a=Math.ceil(e/10),s=e/1e3/a;let r=!1;for(let o=0;o{const r={x:this.pose.x+e.x*u1+t.x*a,y:this.pose.y+e.y*u1+t.y*a};([...this.setup.marks??[],...this.setup.goals??[]].some(l=>N1(r,l))||this.setup.lines.some(l=>Zx(r,l)<=jx/2))&&(n|=1<<3-s)}),n}colorUnder(){var n;const e=m1(this.pose.heading),t={x:this.pose.x+e.x*u1,y:this.pose.y+e.y*u1};return(n=(this.setup.colors??[]).find(a=>N1(t,a.at)))==null?void 0:n.color}sensors(){const e=this.lineState();return{getDistance:this.distance(),getLine:e,getColor:this.colorUnder()??(e&6?"black":"white"),isLineLeft:(e&4)!==0,isLineRight:(e&2)!==0,getTimer:this.timer}}freeDistance(e,t){let n=1/0;for(const a of this.allWalls){const s=Dx(e,t,a.from,a.to);s!==void 0&&sMath.max(-100,Math.min(100,i));function Au(i){const e=(i%360+360)%360;return Math.abs(e-360)<1e-9?0:e}function Dx(i,e,t,n){const a={x:n.x-t.x,y:n.y-t.y},s=e.x*a.y-e.y*a.x;if(Math.abs(s)<1e-12)return;const r={x:t.x-i.x,y:t.y-i.y},o=(r.x*a.y-r.y*a.x)/s,l=(r.x*e.y-r.y*e.x)/s;return o>=0&&l>=0&&l<=1?o:void 0}function Zx(i,e){let t=1/0;for(let n=0;n+10&&o.tick(Xl),s.robotSensors={...o.sensors(),...Fx(a,u)};const c=()=>({outputs:[...m.outputLines],files:new Map(m.files),drive:m.robotActions.length?es(m.robotActions):void 0,...n?{atGoal:o.atGoal(),bumps:o.bumps}:{},led:o.leds.some(d=>d!==void 0),tone:m.robotActions.some(d=>d.method==="playTone"),screen:o.screen,actions:th(m.robotActions.filter(d=>!Ex.has(d.method)))});if(m.inputRequest){const d=r.shift();if(d===void 0)return{...c(),missingInput:!0};if(s.provideInput(d),m.inputErrorNotice)return{...c(),error:m.inputErrorNotice};continue}if(m.isHalted)return{...c(),error:m.notice};if(!s.canStep)return{...c(),unusedInputs:r.length||void 0};s.step()}return{outputs:[...s.state.outputLines],files:new Map(s.state.files),drive:es(s.state.robotActions),tooManySteps:!0}}function Fx(i,e){const t=Math.floor(e/Lx);return Object.fromEntries(Object.entries(i??{}).map(([n,a])=>[n,a[Math.min(t,a.length-1)]]))}function Ch(i){return i===void 0||i===""?[]:i.replace(/\n$/,"").split(` +`)}function ia(i,e){return i.length!==e.length?!1:i.every((t,n)=>Pu(t)===Pu(e[n]))}function Pu(i){const e=i.trim().replace(/\s+/g," ");return/^-?\d+\.0+$/.test(e)?e.replace(/\.0+$/,""):e}function Jx(i,e,t,n){return e.map(a=>{var d,h,g;const s=a.world?n==null?void 0:n(a.world):void 0;if(a.world&&!s)throw new Error(`Weltkarte „${a.world}“ fehlt.`);const r=Nx(i,a.inputs,t,s,a.sensors),o=(a.files??[]).every(f=>{var x;return ia(Ch((x=r.files)==null?void 0:x.get(f.name)),f.lines)}),l=!a.drive||ia(r.drive??[],a.drive),u=!a.world||r.bumps===0&&(!((d=s==null?void 0:s.goals)!=null&&d.length||(h=s==null?void 0:s.targets)!=null&&h.length)||r.atGoal===!0),m=(a.led===void 0||r.led===a.led)&&(a.tone===void 0||r.tone===a.tone)&&(a.screen===void 0||r.screen===a.screen)&&(a.drives===void 0||(((g=r.drive)==null?void 0:g.length)??0)>0===a.drives)&&(!a.actions||ia(r.actions??[],a.actions)),c=!r.error&&!r.missingInput&&!r.tooManySteps&&ia(r.outputs,a.expected)&&o&&l&&u&&m;return{test:a,result:r,passed:c}})}function Rx(i){const e=new Set,t=n=>{for(const a of n){e.add(a.type),a.loopBody&&t(a.loopBody);for(const s of a.cases??[])t(s.elements)}};return t(i.elements),e}function _o(i){const e=[I.forSchleife,I.whileSchleife,I.doUntilSchleife,I.endlosschleife];let t=0;for(const n of i){const a=Math.max(_o(n.loopBody??[]),...(n.cases??[]).map(s=>_o(s.elements)));t=Math.max(t,a+(e.includes(n.type)?1:0))}return t}class wi extends Error{}function Gx(i,e){const t=[],n=[];for(const a of i){const s=a.trim();if(!s)continue;if(s.startsWith("?")){const o=s.slice(1).trim();ms(o,Hx(t)),n.push(o);continue}const r=/^([A-Za-z_]\w*)\s*:\s*(?:(-?\d+)\s*\.\.\s*(-?\d+)|(boolean))$/.exec(s);if(!r)throw new wi(`${e}: Unbekannte Zeile im Spiel: „${s}“`);t.push(r[4]?{name:r[1],kind:"boolean"}:{name:r[1],kind:"int",min:Number(r[2]),max:Number(r[3])})}if(!n.length)throw new wi(`${e}: Das Spiel braucht mindestens eine Zeile „? bedingung“.`);return{vars:t,conditions:n}}function Hx(i){return Object.fromEntries(i.map(e=>[e.name,e.kind==="boolean"?!0:e.min]))}function Vx(i){const e=[],t=/\s*(?:(\d+)|(true|false)\b|([A-Za-z_]\w*)|(&&|\|\||==|!=|<=|>=|<|>|!|\(|\)))/y;let n=0;for(;nt[n],s=d=>{var h;return((h=a())==null?void 0:h.kind)==="op"&&a().value===d},r=()=>{throw new wi(`Bedingung nicht lesbar: „${i}“`)},o=()=>{const d=t[n++]??r();if(d.kind==="num"||d.kind==="bool")return d.value;if(d.kind==="name"){if(!(d.value in e))throw new wi(`Unbekannte Variable „${d.value}“ in „${i}“`);return e[d.value]}if(d.value==="("){const h=m();return s(")")||r(),n++,h}if(d.value==="!"){const h=o();return typeof h!="boolean"&&r(),!h}return r()},l=()=>{const d=o(),h=a();if((h==null?void 0:h.kind)==="op"&&["==","!=","<","<=",">",">="].includes(h.value)){n++;const g=o();switch(h.value){case"==":return d===g;case"!=":return d!==g}(typeof d!="number"||typeof g!="number")&&r();const[f,x]=[d,g];return h.value==="<"?f"?f>x:f>=x}return d},u=()=>{let d=l();for(;s("&&");){n++;const h=l();d=d&&h}return d},m=()=>{let d=u();for(;s("||");){n++;const h=u();d=d||h}return d},c=m();return n!==t.length||typeof c!="boolean"?r():c}function Qx(i,e){const t=[i],n=i.replace(/\b[A-Za-z_]\w*\b/g,r=>r in e?String(e[r]):r);n!==i&&t.push(n);const a=n.replace(/(-?\d+|true|false)\s*(==|!=|<=|>=|<|>)\s*(-?\d+|true|false)/g,r=>String(ms(r,{})));a!==t[t.length-1]&&t.push(a);const s=String(ms(i,e));return s!==t[t.length-1]&&t.push(s),t}function qx(i,e){const t=[],n=new RegExp(`\\b${e}\\s*(?:==|!=|<=|>=|<|>)\\s*(-?\\d+)|(-?\\d+)\\s*(?:==|!=|<=|>=|<|>)\\s*${e}\\b`,"g");for(const a of i.matchAll(n)){const s=Number(a[1]??a[2]);t.push(s-1,s,s+1)}return t}function Ux(i,e,t,n=Math.random){const a=i.conditions.length,s=Math.floor(e*a/t),r=Math.min(a-1,s+(n()<.5?0:1)),o=i.conditions[r],l={};for(const u of i.vars){if(u.kind==="boolean"){l[u.name]=n()<.5;continue}const m=qx(o,u.name).filter(c=>c>=u.min&&c<=u.max);l[u.name]=m.length&&n()<.6?m[Math.floor(n()*m.length)]:u.min+Math.floor(n()*(u.max-u.min+1))}return{condition:o,values:l,answer:ms(o,l)}}function $x(i){return Object.entries(i.values).filter(([e])=>new RegExp(`\\b${e}\\b`).test(i.condition))}const Yx=`--- titel: Was ist ein Struktogramm? bereich: Erste Schritte kurz: Algorithmen als Folge klarer Schritte darstellen und lesen. @@ -324,7 +324,7 @@ Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der S ## Baustein 1: Die Sequenz -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.blau}, [**Verzweigung**]{.orange} und [**Wiederholung**]{.gruen}. Die Farben helfen dir am Anfang beim Zuordnen, in deinen eigenen Diagrammen sind die Kästen weiß. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. +Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.gelb}, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. @@ -382,7 +382,7 @@ Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Tel ## Alle drei zusammen -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.blau} von oben nach unten, eine [Verzweigung]{.orange} und eine [Schleife]{.gruen}. Blau sind die einfachen Anweisungen. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. +Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.gelb} von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen Anweisungen. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. ::: diagramm l1-grundbausteine.visustruct Die Verzweigung erkennst du am Dreieck, die Schleife an der Klammer links. Alles zusammen steht in einer Sequenz. @@ -563,7 +563,7 @@ richtig: Verzweigung - [ ] Ein Pfeil > Alles zwischen SOLANGE und ENDE SOLANGE ist eingerückt und wird wiederholt. ::: -`,Yx=`--- +`,Xx=`--- titel: Der Editor bereich: Erste Schritte kurz: Elemente einfügen, Text eingeben, verschieben und löschen. @@ -736,7 +736,7 @@ frage: Du klickst im Bereich Elemente auf ein Element, ohne zu ziehen. Wo landet - [ ] input: "Guten Tag" > Ohne Anführungszeichen wird Guten Tag als Name einer Variablen verstanden. ::: -`,Xx=`--- +`,Kx=`--- titel: Speichern, Öffnen, Exportieren bereich: Erste Schritte kurz: Dateien sichern, deinen Workspace nutzen, mehrere Diagramme öffnen und als Bild oder PDF weitergeben. @@ -870,7 +870,7 @@ richtig: PNG - [ ] Direkt im Workspace ohne Unterordner > VisuStruct legt für jeden Tag automatisch einen Datumsordner an. So bleiben die Programme nach Stunden sortiert. ::: -`,Kx=`--- +`,eb=`--- titel: Variablen und Datentypen bereich: Grundlagen kurz: Werte speichern, die Datentypen int, double, String und boolean kennen und rechnen. @@ -1189,7 +1189,7 @@ richtig: String - [ ] Double preis = 2.5 > Kommazahlen schreibst du mit Punkt, und am Ende steht ein Semikolon. ::: -`,eb=`--- +`,tb=`--- titel: Sequenz bereich: Grundlagen kurz: Schritte nacheinander ausführen, auf die Reihenfolge achten und Werte tauschen. @@ -1406,7 +1406,7 @@ frage: Ludwig kocht Tee. - [ ] Mit einem Doppelpunkt : > Fehlt das Semikolon, zeigt VisuStruct unter dem Code einen Hinweis. ::: -`,tb=`--- +`,nb=`--- titel: Eingabe und Ausgabe bereich: Grundlagen kurz: Werte abfragen, Ergebnisse anzeigen und das EVA-Prinzip anwenden. @@ -1718,7 +1718,7 @@ frage: Zu welchem Teil von EVA gehört dieser Kasten? - [ ] Einen ganzen Satz > Für Kommazahlen gibt es \`scanner.nextDouble()\`, für ein Wort \`scanner.next()\`. ::: -`,nb=`--- +`,ib=`--- titel: Simulation und Schreibtischtest bereich: Grundlagen kurz: Ein Struktogramm Schritt für Schritt ausführen, von Hand nachrechnen und Fehler finden. @@ -1995,7 +1995,7 @@ besser: preis = preis + preis * 0.1; - [ ] Die Zeile wird übersprungen. > Das ist ein Haltepunkt. Mit ▶︎ oder dem Einzelschritt geht es weiter. ::: -`,ib=`--- +`,ab=`--- titel: Verzweigung bereich: Grundlagen kurz: Mit einer Bedingung entscheiden, welcher von zwei Wegen ausgeführt wird. @@ -2312,7 +2312,7 @@ frage: Was wird ausgegeben? - [ ] Hinter einem Semikolon > \`if (alter >= 18) { … }\`: Die runden Klammern gehören zur Bedingung, die geschweiften zum Zweig. ::: -`,ab=`--- +`,sb=`--- titel: Bedingungen verknüpfen bereich: Grundlagen kurz: Mehrere Bedingungen mit und, oder und nicht verbinden und Wertebereiche prüfen. @@ -2604,7 +2604,7 @@ lösung: l09-java-fehler-loesung.visustruct - [ ] if (alter >= 12 || alter < 18) > Jeder Vergleich steht für sich, verbunden mit \`&&\`. ::: -`,sb=`--- +`,rb=`--- titel: Fallauswahl bereich: Grundlagen kurz: Je nach Wert einer Variablen einen von vielen Fällen ausführen. @@ -2901,7 +2901,7 @@ frage: Ein Würfel zeigt 1 bis 6, und für jede Zahl soll ein anderes Wort ersch - [x] default - [ ] case 0 ::: -`,rb=`--- +`,ob=`--- titel: While-Schleife bereich: Grundlagen kurz: Schritte wiederholen, solange eine Bedingung wahr ist. @@ -3227,7 +3227,7 @@ frage: Wie oft läuft der Rumpf? - [ ] while (zahl > 0); > Die Bedingung steht in runden Klammern, danach öffnet \`{\` den Rumpf. ::: -`,ob=`--- +`,lb=`--- titel: Do-while-Schleife bereich: Grundlagen kurz: Erst ausführen, dann prüfen: Schleifen mit mindestens einem Durchlauf. @@ -3474,7 +3474,7 @@ frage: Wofür nimmt man typischerweise eine Do-while-Schleife? - [ ] } until (bedingung); > Nach der Bedingung kommt ein Semikolon. ::: -`,lb=`--- +`,ub=`--- titel: For-Schleife bereich: Grundlagen kurz: Mit Start, Bedingung und Schritt eine feste Anzahl von Durchläufen zählen. @@ -3770,7 +3770,7 @@ besser: for (int i = 2; i <= 10; i = i + 2) { - [ ] i wird ausgegeben. > \`i++\` ist die Kurzform von \`i = i + 1\`. ::: -`,ub=`--- +`,mb=`--- titel: Verschachteln bereich: Grundlagen kurz: Verzweigungen in Schleifen und Schleifen in Schleifen kombinieren. @@ -4036,7 +4036,7 @@ frage: Was passiert? - [x] An den geschweiften Klammern und der Einrückung - [ ] An den Semikolons ::: -`,mb=`--- +`,cb=`--- titel: Arrays bereich: Grundlagen kurz: Viele Werte unter einem Namen speichern, mit dem Index darauf zugreifen und sie mit einer Schleife durchlaufen. @@ -4346,7 +4346,7 @@ besser: for (int i = zahlen.length - 1; i >= 0; i--) { - [ ] int zahlen = [1, 2, 3]; - [ ] array zahlen = (1, 2, 3); ::: -`,cb=`--- +`,db=`--- titel: Zweidimensionale Arrays bereich: Grundlagen kurz: Werte in Zeilen und Spalten speichern, wie die Sitze in einem Kinosaal, und mit zwei verschachtelten Schleifen durchlaufen. @@ -4631,7 +4631,7 @@ frage: Zwei Schleifen gehen den Saal \`new boolean[3][5]\` durch. Welches Fach k - [ ] 5, die Zahl der Plätze - [ ] 15, alle Plätze zusammen ::: -`,db=`--- +`,hb=`--- titel: Zeichenketten bereich: Grundlagen kurz: Mit Texten arbeiten, also einzelne Zeichen lesen, Teile herausschneiden, suchen, vergleichen und zerlegen. @@ -5082,7 +5082,7 @@ ende: Zora ist frei, und der Fuchs ist schnell davongelaufen. Das geheime Wort w - [ ] eine Fehlermeldung > parseInt macht aus dem Text eine Zahl. Danach rechnet Java ganz normal. ::: -`,hb=`--- +`,gb=`--- titel: Aufruf und Aussprung bereich: Grundlagen kurz: Große Aufgaben in Unterprogramme zerlegen und Schleifen vorzeitig verlassen. @@ -5539,7 +5539,7 @@ frage: Was wird ausgegeben? - [ ] return > void heißt „leer“: Die Methode macht etwas, gibt aber keinen Wert zurück. ::: -`,gb=`--- +`,pb=`--- titel: Suchen und Sortieren bereich: Grundlagen kurz: Mit Spielkarten verstehen, wie lineare und binäre Suche und Bubblesort arbeiten und warum manche Verfahren viel schneller sind. @@ -5855,7 +5855,7 @@ frage: Bubblesort tauscht \`karten[i]\` und \`karten[i + 1]\`. Was braucht es da - [ ] Eine While-Schleife kann keine Arrays durchlaufen. > Die Karte kann mehrmals vorkommen. Darum gehst du alle Karten bis zum Ende durch. ::: -`,pb=`--- +`,fb=`--- titel: Struktogramm und Code bereich: Vom Struktogramm zum Code kurz: Alle Elemente in Java auf einen Blick, Code erzeugen, im Bereich Programmieren Java schreiben, ausführen und Fehler suchen. @@ -6205,7 +6205,7 @@ frage: Im Debugger ist eine Zeile gelb. Was bedeutet das? - [ ] Die Zeile enthält einen Fehler. > Das ist ein Haltepunkt. Danach geht es mit ▶︎ oder dem Einzelschritt weiter. ::: -`,fb=`--- +`,xb=`--- titel: Python und JavaScript bereich: Vom Struktogramm zum Code kurz: Python- und JavaScript-Code aus dem Struktogramm erzeugen und JavaScript direkt im Browser ausführen. @@ -6428,7 +6428,7 @@ richtig: JavaScript - [ ] Es wird Summe: ausgegeben. > Mit str(summe) wird aus der Zahl ein Text. ::: -`,xb=`--- +`,bb=`--- titel: Wenn das Programm abstürzt: try und catch bereich: Fehler abfangen kurz: Mit echtem Java Fehlermeldungen lesen und Abstürze mit try und catch abfangen. @@ -6695,7 +6695,7 @@ Die Exception heißt \`ArithmeticException\`. Schreib in den \`try\`-Block nur d = ArithmeticException -> Teilen durch 0 = NumberFormatException -> Text ist keine Zahl ::: -`,bb=`--- +`,yb=`--- titel: Text einlesen und speichern bereich: Dateien kurz: Mit Scanner eine Textdatei Zeile für Zeile lesen und mit PrintWriter eine Datei speichern. @@ -6933,7 +6933,7 @@ runde: = println(text) -> schreibt eine Zeile = close() -> schließt die Datei ::: -`,yb=`--- +`,vb=`--- titel: Zeile für Zeile mit BufferedReader bereich: Dateien kurz: Mit BufferedReader und readLine lesen, bis null kommt, und mit Files eine ganze Datei auf einmal lesen. @@ -7173,7 +7173,7 @@ runde: = Files.readString -> kleine Dateien auf einmal = Scanner -> Zahlen und Wörter lesen ::: -`,vb=`--- +`,wb=`--- titel: Tabellen als CSV bereich: Dateien kurz: Eine Tabelle als CSV-Datei lesen, jede Zeile mit split zerlegen und mit den Zahlen rechnen. @@ -7380,7 +7380,7 @@ besser: Ludwig;2;3;1 = Datensatz -> eine Zeile mit Werten = Trennzeichen -> trennt die Spalten, meist ; ::: -`,wb=`--- +`,zb=`--- titel: Daten als JSON bereich: Dateien kurz: JSON-Dateien verstehen, Werte mit indexOf und substring herausholen und selbst JSON schreiben. @@ -7588,7 +7588,7 @@ frage: Welcher Schlüssel hat einen Wahrheitswert? = [ ] -> eine Liste = : -> trennt Schlüssel und Wert ::: -`,zb=`--- +`,Ib=`--- titel: Formate im Vergleich bereich: Dateien kurz: Dieselben Daten als txt, CSV und JSON vergleichen, das passende Format wählen und eine Datei in ein anderes Format umwandeln. @@ -7748,7 +7748,7 @@ richtig: txt = die Notenliste der Klasse -> CSV = ein Spielstand mit Listen -> JSON ::: -`,Ib=`--- +`,kb=`--- titel: Dein erstes Fenster bereich: Fenster mit Swing kurz: Mit Java und Swing ein eigenes Fenster öffnen, Zeile für Zeile erklärt. @@ -7955,7 +7955,7 @@ Du willst nicht so viel tippen? Mit „Echtes Java“ darfst du im Bereich Progr - [ ] Sie stehen in geschweiften Klammern. - [ ] Sie enden mit Window. ::: -`,kb=`--- +`,Sb=`--- titel: Ein Knopf im Fenster bereich: Fenster mit Swing kurz: Einen Knopf ins Fenster legen und mit einem Layout ordentlich anordnen. @@ -8156,7 +8156,7 @@ Jeder Knopf braucht eine eigene Variable, zum Beispiel \`knopf\` und \`knopf2\`, - [ ] Auf dem Knopf steht „Ich wurde geklickt“. > Was beim Klick passieren soll, lernst du in der nächsten Lektion. ::: -`,Sb=`--- +`,_b=`--- titel: Der Knopf reagiert bereich: Fenster mit Swing kurz: Mit einem ActionListener festlegen, was beim Klick passiert. @@ -8483,7 +8483,7 @@ Jeder Knopf bekommt seinen eigenen Zuhörer mit eigenem \`addActionListener\`. D = setText -> Beschriftung ändern = setVisible(true) -> Fenster zeigen ::: -`,_b=`--- +`,Tb=`--- titel: Zahl verdoppeln im Fenster bereich: Fenster mit Swing kurz: Beschriftung, Textfeld und Knopf mit einem GridLayout anordnen und mit dem Text im Textfeld rechnen. @@ -8748,7 +8748,7 @@ Der Knopf „Halbieren“ kommt als vierte Zeile ins GridLayout und bekommt sein = JButton -> Knopf = GridLayout -> Anordnung im Gitter ::: -`,Tb=`--- +`,Ob=`--- titel: Klickzähler mit Reset bereich: Fenster mit Swing kurz: Zwei Knöpfe ändern dieselbe Zahl: eine Variable für die ganze Klasse anlegen. @@ -8966,7 +8966,7 @@ Für „nie unter 0“ brauchst du im Zuhörer von −1 ein \`if\`: Nur wenn \`a - [ ] Es setzt das Fenster in die Mitte des Bildschirms. - [ ] Es macht die Schrift größer. ::: -`,Ob=`--- +`,Ab=`--- titel: Eine Ampel mit Farben bereich: Fenster mit Swing kurz: Hintergrundfarben setzen und mit einer Zustandsvariable eine Ampel weiterschalten. @@ -9227,7 +9227,7 @@ Mit vier Phasen kommt nach 3 wieder 0. Pass also die Zahl in \`if (phase > 2)\` - [ ] 3 > Nach phase++ ist sie 3, das ist größer als 2, also wird sie 0. ::: -`,Ab=`--- +`,Pb=`--- titel: Notenrechner im Fenster bereich: Fenster mit Swing kurz: Punkte eingeben, mit else if die Note bestimmen und falsche Eingaben abfangen. @@ -9489,7 +9489,7 @@ Teste immer die Grenzen: 92 muss eine 1 sein, 91 eine 2. An den Grenzen stecken - [ ] punkte >= 0 || punkte <= 100 > Eine Zahl kann nicht gleichzeitig kleiner als 0 und größer als 100 sein, deshalb braucht es oder. ::: -`,Pb=`--- +`,jb=`--- titel: Ein Taschenrechner bereich: Fenster mit Swing kurz: Zwei Spalten mit GridLayout, vier Rechenknöpfe und die Division durch 0 abfangen. @@ -9746,7 +9746,7 @@ Für „abc“ brauchst du in jedem Zuhörer ein try/catch mit \`NumberFormatExc - [ ] Spalte für Spalte, erst ganz links von oben nach unten - [ ] Zufällig ::: -`,jb=`--- +`,Cb=`--- titel: Zahlenraten bereich: Fenster mit Swing kurz: Ein Spiel mit Zufallszahl, Versuchszähler und einem Knopf, der sich am Ende abschaltet. @@ -9888,7 +9888,7 @@ Für „zählt nicht als Versuch“ muss \`versuche++\` **hinter** \`Integer.par - [x] 7 > Jeder Tipp halbiert den Bereich, und 2 hoch 7 = 128 ist größer als 100. ::: -`,Cb=`--- +`,Bb=`--- titel: Viele Knöpfe, ein Zuhörer bereich: Fenster mit Swing kurz: Ein Zuhörer für viele Knöpfe, mit getActionCommand und getSource herausfinden, welcher Knopf geklickt wurde. @@ -10178,7 +10178,7 @@ Auch beim Taschenrechner aus Lektion 35 reicht ein Zuhörer für +, -, \\* und / = ActionEvent -> das Ereignis e mit den Infos zum Klick = JPanel -> eine Fläche mit eigenem Layout ::: -`,Bb=`--- +`,Db=`--- titel: Innere Klassen bereich: Fenster mit Swing kurz: Einen Zuhörer als benannte innere Klasse, als anonyme Klasse und als Lambda schreiben und wissen, wer was sehen darf. @@ -10394,7 +10394,7 @@ Probiere aus, ob alle drei Knöpfe wie erwartet zählen. Lass dann bei der Klass = new ActionListener() { … } -> anonyme Klasse = der Pfeil hinter e -> Lambda ::: -`,Db=`--- +`,Zb=`--- titel: Zwei Reiter bereich: Fenster mit Swing kurz: Ein Fenster mit zwei Reitern bauen, Daten von einem Reiter zum anderen bringen und die Liste als Textdatei speichern. @@ -10659,7 +10659,7 @@ Dann mach es besser: = JPanel -> die Fläche eines Reiters = JTextArea -> ein Textbereich mit mehreren Zeilen ::: -`,Zb=`--- +`,Mb=`--- titel: Model View Controller bereich: Fenster mit Swing kurz: Den Klickzähler in Model, View und Controller zerlegen und verstehen, wer mit wem redet. @@ -11056,7 +11056,7 @@ Dann mach es besser: = ZahlAnzeige mit aktualisieren(int wert) -> View = der Zuhörer am Knopf -> Controller ::: -`,Mb=`Fachbegriffe für den Lernbereich. Kommt ein Begriff in einem Schritt vor, wird er dort einmal markiert und zeigt beim +`,Lb=`Fachbegriffe für den Lernbereich. Kommt ein Begriff in einem Schritt vor, wird er dort einmal markiert und zeigt beim Hovern oder Antippen seine Erklärung. Steht er im Schritt fett, wird er gerade erklärt und deshalb nicht markiert. \`auch:\` nennt weitere Formen, die ebenfalls erkannt werden. Groß- und Kleinschreibung zählt. @@ -11246,7 +11246,7 @@ Ein fertiger Baustein von Java, der Eingaben über die Tastatur liest, z. B. mit ### import Eine Zeile ganz oben im Java-Code, die einen fertigen Baustein aus einem Paket holt, z. B. \`import java.util.Scanner;\`. Ohne sie kennt Java den Namen nicht. -`,Lb=`## Grundbausteine +`,Wb=`## Grundbausteine ### Anweisung @@ -11372,7 +11372,7 @@ boolean[][] sitze = new boolean[3][5] sitze[1][4] = true output: sitze.length + " Reihen, " + sitze[0].length + " Plätze" \`\`\` -`,Wb=`--- +`,Eb=`--- titel: What is a structure chart? bereich: First steps kurz: Show and read algorithms as a series of clear steps. @@ -11406,7 +11406,7 @@ Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony ## Building block 1: the sequence -Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.blau}, [**branch**]{.orange} and [**loop**]{.gruen}. The colours help you match them at the start; in your own diagrams the boxes are white. In this step and the next two you get to know them one by one. +Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.gelb}, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. @@ -11464,7 +11464,7 @@ As long as the plate is not empty, you take a bite. After that, the plate is cle ## All three together -The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.blau} from top to bottom, a [branch]{.orange} and a [loop]{.gruen}. The blue boxes are simple statements. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. +The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.gelb} from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple statements. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. ::: diagramm l1-grundbausteine.visustruct You recognise the branch by its triangle and the loop by the bracket on the left. Everything together sits in a sequence. @@ -11645,7 +11645,7 @@ richtig: branch - [ ] An arrow > Everything between WHILE and END WHILE is indented and is repeated. ::: -`,Eb=`--- +`,Nb=`--- titel: The editor bereich: First steps kurz: Insert elements, type text, move and delete. @@ -11818,7 +11818,7 @@ frage: You click an element in the Elements area without dragging. Where does it - [ ] input: "Good morning" > Without quotation marks, Good morning is understood as the name of a variable. ::: -`,Nb=`--- +`,Fb=`--- titel: Save, open, export bereich: First steps kurz: Keep your files safe, use your workspace, open several diagrams and share them as an image or PDF. @@ -11952,7 +11952,7 @@ Open one of your exercises from lesson 2 and try the following: - [ ] Directly in the workspace without a subfolder > VisuStruct automatically creates a date folder for each day. That keeps the programs sorted by lesson. ::: -`,Fb=`--- +`,Jb=`--- titel: Variables and data types bereich: Basics kurz: Store values, get to know the data types int, double, String and boolean, and calculate. @@ -12271,7 +12271,7 @@ richtig: String - [ ] Double price = 2.5 > Decimal numbers use a point, and the line ends with a semicolon. ::: -`,Jb=`--- +`,Rb=`--- titel: Sequence bereich: Basics kurz: Run steps one after another, watch the order and swap values. @@ -12488,7 +12488,7 @@ frage: Ludwig makes tea. - [ ] With a colon : > If the semicolon is missing, VisuStruct shows a hint below the code. ::: -`,Rb=`--- +`,Gb=`--- titel: Input and output bereich: Basics kurz: Ask for values, show results and use the IPO model. @@ -12800,7 +12800,7 @@ frage: Which part of IPO does this box belong to? - [ ] A whole sentence > For decimal numbers there is \`scanner.nextDouble()\`, for a word \`scanner.next()\`. ::: -`,Gb=`--- +`,Hb=`--- titel: Simulation and desk check bereich: Basics kurz: Run a structure chart step by step, work it out by hand and find mistakes. @@ -13077,7 +13077,7 @@ besser: price = price + price * 0.1; - [ ] The line is skipped. > That is a breakpoint. ▶︎ or Step carries on. ::: -`,Hb=`--- +`,Vb=`--- titel: Branch bereich: Basics kurz: Use a condition to decide which of two paths runs. @@ -13394,7 +13394,7 @@ frage: What is output? - [ ] After a semicolon > \`if (age >= 18) { … }\`: the round brackets belong to the condition, the curly ones to the branch. ::: -`,Vb=`--- +`,Qb=`--- titel: Combining conditions bereich: Basics kurz: Join several conditions with and, or and not, and check ranges of values. @@ -13686,7 +13686,7 @@ lösung: l09-java-fehler-loesung.visustruct - [ ] if (age >= 12 || age < 18) > Each comparison stands on its own, joined with \`&&\`. ::: -`,Qb=`--- +`,qb=`--- titel: Switch bereich: Basics kurz: Run one of many cases, depending on the value of a variable. @@ -13983,7 +13983,7 @@ frage: A dice shows 1 to 6, and for every number a different word should appear. - [x] default - [ ] case 0 ::: -`,qb=`--- +`,Ub=`--- titel: While loop bereich: Basics kurz: Repeat steps as long as a condition is true. @@ -14309,7 +14309,7 @@ frage: How often does the body run? - [ ] while (number > 0); > The condition is in round brackets, then \`{\` opens the body. ::: -`,Ub=`--- +`,$b=`--- titel: Do-while loop bereich: Basics kurz: Run first, check afterwards: loops with at least one pass. @@ -14556,7 +14556,7 @@ frage: What is a do-while loop typically used for? - [ ] } until (condition); > A semicolon follows the condition. ::: -`,$b=`--- +`,Yb=`--- titel: For loop bereich: Basics kurz: Count a fixed number of passes with Init, Condition and Step. @@ -14852,7 +14852,7 @@ besser: for (int i = 2; i <= 10; i = i + 2) { - [ ] i is output. > \`i++\` is short for \`i = i + 1\`. ::: -`,Yb=`--- +`,Xb=`--- titel: Nesting bereich: Basics kurz: Combine branches inside loops and loops inside loops. @@ -15118,7 +15118,7 @@ frage: What happens? - [x] By the curly brackets and the indentation - [ ] By the semicolons ::: -`,Xb=`--- +`,Kb=`--- titel: Arrays bereich: Basics kurz: Store many values under one name, reach them with the index and go through them with a loop. @@ -15428,7 +15428,7 @@ besser: for (int i = numbers.length - 1; i >= 0; i--) { - [ ] int numbers = [1, 2, 3]; - [ ] array numbers = (1, 2, 3); ::: -`,Kb=`--- +`,e4=`--- titel: Two-dimensional arrays bereich: Basics kurz: Store values in rows and columns, like the seats in a cinema, and go through them with two nested loops. @@ -15713,7 +15713,7 @@ frage: Two loops go through the cinema \`new boolean[3][5]\`. Which slot comes r - [ ] 5, the number of seats - [ ] 15, all seats together ::: -`,e4=`--- +`,t4=`--- titel: Strings bereich: Basics kurz: Work with text: read single characters, cut out parts, search, compare and split. @@ -16162,7 +16162,7 @@ ende: Zora is free, and the fox has run off. The secret word was \`BREAK\`: with - [ ] an error message > parseInt turns the text into a number. After that Java calculates as usual. ::: -`,t4=`--- +`,n4=`--- titel: Call and break bereich: Basics kurz: Split big tasks into subprograms and leave loops early. @@ -16618,7 +16618,7 @@ frage: What is output? - [ ] return > void means “empty”: the method does something but returns no value. ::: -`,n4=`--- +`,i4=`--- titel: Searching and sorting bereich: Basics kurz: Use playing cards to understand how linear search, binary search and bubble sort work, and why some methods are much faster. @@ -16934,7 +16934,7 @@ frage: Bubble sort swaps \`cards[i]\` and \`cards[i + 1]\`. What does it need fo - [ ] A while loop cannot go through arrays. > The card can appear several times. That is why you go through all cards to the end. ::: -`,i4=`--- +`,a4=`--- titel: Structure chart and code bereich: From structure chart to code kurz: All elements in Java at a glance, generate code, write Java in the Programming area, run it and find mistakes. @@ -17284,7 +17284,7 @@ frage: In the debugger, a line is yellow. What does that mean? - [ ] The line contains a mistake. > That is a breakpoint. Continue with ▶︎ or Step. ::: -`,a4=`--- +`,s4=`--- titel: Python and JavaScript bereich: From structure chart to code kurz: Generate Python and JavaScript code from the structure chart and run JavaScript straight in the browser. @@ -17507,7 +17507,7 @@ richtig: JavaScript - [ ] Sum: is output. > str(sum) turns the number into text. ::: -`,s4=`--- +`,r4=`--- titel: When the program crashes: try and catch bereich: Catching errors kurz: Use real Java to read error messages and catch crashes with try and catch. @@ -17774,7 +17774,7 @@ The exception is called \`ArithmeticException\`. Only put the line that can cras = ArithmeticException -> dividing by 0 = NumberFormatException -> text is not a number ::: -`,r4=`--- +`,o4=`--- titel: Reading and saving text bereich: Files kurz: Read a text file line by line with Scanner and save a file with PrintWriter. @@ -18012,7 +18012,7 @@ runde: = println(text) -> writes a line = close() -> closes the file ::: -`,o4=`--- +`,l4=`--- titel: Line by line with BufferedReader bereich: Files kurz: Read with BufferedReader and readLine until null comes, and read a whole file at once with Files. @@ -18252,7 +18252,7 @@ runde: = Files.readString -> small files all at once = Scanner -> reading numbers and words ::: -`,l4=`--- +`,u4=`--- titel: Tables as CSV bereich: Files kurz: Read a table as a CSV file, split each line with split and calculate with the numbers. @@ -18459,7 +18459,7 @@ besser: Ludwig;2;3;1 = record -> a line with values = separator -> separates the columns, often ; ::: -`,u4=`--- +`,m4=`--- titel: Data as JSON bereich: Files kurz: Understand JSON files, get values out with indexOf and substring, and write JSON yourself. @@ -18667,7 +18667,7 @@ frage: Which key has a truth value? = [ ] -> a list = : -> separates key and value ::: -`,m4=`--- +`,c4=`--- titel: Comparing formats bereich: Files kurz: Compare the same data as txt, CSV and JSON, choose the right format and convert a file into another format. @@ -18827,7 +18827,7 @@ richtig: txt = the class grade list -> CSV = a game save with lists -> JSON ::: -`,c4=`--- +`,d4=`--- titel: Your first window bereich: Windows with Swing kurz: Open your own window with Java and Swing, explained line by line. @@ -19034,7 +19034,7 @@ Don't feel like typing so much? With “Real Java” you may type just the four - [ ] They are in curly brackets. - [ ] They end in Window. ::: -`,d4=`--- +`,h4=`--- titel: A button in the window bereich: Windows with Swing kurz: Put a button into the window and arrange it neatly with a layout. @@ -19235,7 +19235,7 @@ Every button needs its own variable, for example \`button\` and \`button2\`, and - [ ] The button says “I was clicked”. > What should happen on a click is what you learn in the next lesson. ::: -`,h4=`--- +`,g4=`--- titel: The button reacts bereich: Windows with Swing kurz: Use an ActionListener to decide what happens on a click. @@ -19562,7 +19562,7 @@ Every button gets its own listener with its own \`addActionListener\`. You chang = setText -> change the label = setVisible(true) -> show the window ::: -`,g4=`--- +`,p4=`--- titel: Doubling a number in a window bereich: Windows with Swing kurz: Arrange a label, a text field and a button with a GridLayout and calculate with the text in the text field. @@ -19827,7 +19827,7 @@ The “Halve” button goes into the GridLayout as the fourth row and gets its o = JButton -> button = GridLayout -> arrangement in a grid ::: -`,p4=`--- +`,f4=`--- titel: Click counter with reset bereich: Windows with Swing kurz: Two buttons change the same number: create a variable for the whole class. @@ -20045,7 +20045,7 @@ For “never below 0” the listener of −1 needs an \`if\`: only if \`count > - [ ] It puts the window in the middle of the screen. - [ ] It makes the font bigger. ::: -`,f4=`--- +`,x4=`--- titel: A traffic light with colours bereich: Windows with Swing kurz: Set background colours and switch a traffic light on with a state variable. @@ -20306,7 +20306,7 @@ With four phases, 0 comes after 3. So change the number in \`if (phase > 2)\`. - [ ] 3 > After phase++ it is 3, which is greater than 2, so it becomes 0. ::: -`,x4=`--- +`,b4=`--- titel: Grade calculator in a window bereich: Windows with Swing kurz: Enter points, work out the grade with else if and catch wrong input. @@ -20563,7 +20563,7 @@ Always test the limits: 90 must be an A, 89 a B. Most mistakes hide at the limit - [ ] points >= 0 || points <= 100 > A number can't be smaller than 0 and bigger than 100 at the same time, so you need or. ::: -`,b4=`--- +`,y4=`--- titel: A calculator bereich: Windows with Swing kurz: Two columns with GridLayout, four arithmetic buttons and catching division by 0. @@ -20820,7 +20820,7 @@ For “abc” every listener needs a try/catch with \`NumberFormatException\`. A - [ ] Column by column, starting top to bottom on the far left - [ ] Randomly ::: -`,y4=`--- +`,v4=`--- titel: Guess the number bereich: Windows with Swing kurz: A game with a random number, a counter for the guesses and a button that switches itself off at the end. @@ -20962,7 +20962,7 @@ For “doesn't count as a guess”, \`guesses++\` must come **after** \`Integer. - [x] 7 > Each guess halves the range, and 2 to the power of 7 = 128 is bigger than 100. ::: -`,v4=`--- +`,w4=`--- titel: Many buttons, one listener bereich: Windows with Swing kurz: One listener for many buttons, and finding out with getActionCommand and getSource which button was clicked. @@ -21251,7 +21251,7 @@ For the calculator from lesson 35, one listener is enough for +, -, \\* and / to = ActionEvent -> the event e with the information about the click = JPanel -> an area with its own layout ::: -`,w4=`--- +`,z4=`--- titel: Inner classes bereich: Windows with Swing kurz: Write a listener as a named inner class, as an anonymous class and as a lambda, and know who can see what. @@ -21467,7 +21467,7 @@ Check that all three buttons count as expected. Then remove the \`static\` from = new ActionListener() { … } -> anonymous class = the arrow after e -> lambda ::: -`,z4=`--- +`,I4=`--- titel: Two tabs bereich: Windows with Swing kurz: Build a window with two tabs, bring data from one tab to the other and save the list as a text file. @@ -21732,7 +21732,7 @@ Then make it better: = JPanel -> the area of a tab = JTextArea -> a text area with several lines ::: -`,I4=`--- +`,k4=`--- titel: Model View Controller bereich: Windows with Swing kurz: Split the click counter into model, view and controller and understand who talks to whom. @@ -22129,7 +22129,7 @@ Then make it better: = NumberView with update(int value) -> view = the listener at the button -> controller ::: -`,k4=`Technical terms for the learning area. When a term appears in a step, it is marked there once and shows its explanation +`,S4=`Technical terms for the learning area. When a term appears in a step, it is marked there once and shows its explanation on hover or tap. If it is in bold in that step, it is being explained right there and is not marked. \`also:\` lists other forms that are recognised too. Upper and lower case matter. @@ -22324,7 +22324,7 @@ A ready-made Java building block that reads input from the keyboard, for example ### import A line at the very top of Java code that fetches a ready-made building block from a package, for example \`import java.util.Scanner;\`. Without it, Java doesn't know the name. -`,S4=`## Basics +`,_4=`## Basics ### Statement @@ -22450,7 +22450,7 @@ boolean[][] seats = new boolean[3][5] seats[1][4] = true output: seats.length + " rows, " + seats[0].length + " seats" \`\`\` -`,_4=`--- +`,T4=`--- titel: O que é um estrutograma? bereich: Primeiros passos kurz: Mostrar e ler algoritmos como uma série de passos claros. @@ -22484,7 +22484,7 @@ Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Univ ## Bloco básico 1: a sequência -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.blau}, [**decisão**]{.orange} e [**ciclo**]{.gruen}. As cores ajudam-te a associá-los no início; nos teus próprios diagramas, as caixas são brancas. Neste passo e nos dois seguintes vais conhecê-los um a um. +Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.gelb}, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. @@ -22542,7 +22542,7 @@ Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levant ## Os três juntos -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.blau} de cima para baixo, uma [decisão]{.orange} e um [ciclo]{.gruen}. As caixas azuis são instruções simples. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. +Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.gelb} de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são instruções simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. ::: diagramm l1-grundbausteine.visustruct Reconheces a decisão pelo triângulo e o ciclo pelo parêntese à esquerda. Tudo junto forma uma sequência. @@ -22723,7 +22723,7 @@ richtig: decisão - [ ] Uma seta > Tudo o que está entre ENQUANTO e FIM ENQUANTO está recuado e é repetido. ::: -`,T4=`--- +`,O4=`--- titel: O editor bereich: Primeiros passos kurz: Inserir elementos, escrever texto, mover e eliminar. @@ -22896,7 +22896,7 @@ frage: Clicas num elemento da área Elementos, sem arrastar. Onde fica? - [ ] input: "Bom dia" > Sem aspas, Bom dia é entendido como o nome de uma variável. ::: -`,O4=`--- +`,A4=`--- titel: Guardar, abrir, exportar bereich: Primeiros passos kurz: Guardar os teus ficheiros em segurança, usar o teu espaço de trabalho, abrir vários diagramas e partilhá-los como imagem ou PDF. @@ -23030,7 +23030,7 @@ Abre um dos teus exercícios da lição 2 e experimenta o seguinte: - [ ] Diretamente no espaço de trabalho, sem subpasta > O VisuStruct cria automaticamente uma pasta com a data de cada dia. Assim os programas ficam ordenados por aula. ::: -`,A4=`--- +`,P4=`--- titel: Variáveis e tipos de dados bereich: Fundamentos kurz: Guardar valores, conhecer os tipos de dados int, double, String e boolean, e fazer contas. @@ -23349,7 +23349,7 @@ richtig: String - [ ] Double preco = 2.5 > Os números decimais escrevem-se com ponto, e no fim há um ponto e vírgula. ::: -`,P4=`--- +`,j4=`--- titel: Sequência bereich: Fundamentos kurz: Executar passos um a seguir ao outro, prestar atenção à ordem e trocar valores. @@ -23566,7 +23566,7 @@ frage: O Ludwig faz chá. - [ ] Com dois pontos : > Se faltar o ponto e vírgula, o VisuStruct mostra uma indicação por baixo do código. ::: -`,j4=`--- +`,C4=`--- titel: Entrada e saída bereich: Fundamentos kurz: Pedir valores, mostrar resultados e usar o modelo EPS. @@ -23878,7 +23878,7 @@ frage: A que parte do modelo EPS pertence este bloco? - [ ] Uma frase inteira > Para números decimais há \`scanner.nextDouble()\`, para uma palavra \`scanner.next()\`. ::: -`,C4=`--- +`,B4=`--- titel: Simulação e teste de secretária bereich: Fundamentos kurz: Executar um estrutograma passo a passo, segui-lo à mão e encontrar erros. @@ -24155,7 +24155,7 @@ besser: preco = preco + preco * 0.1; - [ ] A linha é saltada. > É um ponto de paragem. Continuas com ▶︎ ou com Passo a passo. ::: -`,B4=`--- +`,D4=`--- titel: Decisão bereich: Fundamentos kurz: Usar uma condição para decidir qual de dois ramos é executado. @@ -24472,7 +24472,7 @@ frage: O que aparece? - [ ] Depois de um ponto e vírgula > \`if (idade >= 18) { … }\`: os parênteses curvos pertencem à condição, as chavetas ao ramo. ::: -`,D4=`--- +`,Z4=`--- titel: Combinar condições bereich: Fundamentos kurz: Juntar várias condições com e, ou e não, e verificar intervalos de valores. @@ -24764,7 +24764,7 @@ lösung: l09-java-fehler-loesung.visustruct - [ ] if (idade >= 12 || idade < 18) > Cada comparação fica sozinha, ligada com \`&&\`. ::: -`,Z4=`--- +`,M4=`--- titel: Seleção bereich: Fundamentos kurz: Executar um de vários casos, consoante o valor de uma variável. @@ -25061,7 +25061,7 @@ frage: Um dado mostra de 1 a 6, e para cada número deve aparecer uma palavra di - [x] default - [ ] case 0 ::: -`,M4=`--- +`,L4=`--- titel: Ciclo while bereich: Fundamentos kurz: Repetir passos enquanto uma condição for verdadeira. @@ -25387,7 +25387,7 @@ frage: Quantas vezes corre o corpo? - [ ] while (numero > 0); > A condição fica entre parênteses curvos, depois \`{\` abre o corpo. ::: -`,L4=`--- +`,W4=`--- titel: Ciclo do-while bereich: Fundamentos kurz: Primeiro executar, depois verificar: ciclos com pelo menos uma iteração. @@ -25634,7 +25634,7 @@ frage: Para que se usa tipicamente um ciclo do-while? - [ ] } until (condicao); > Depois da condição vem um ponto e vírgula. ::: -`,W4=`--- +`,E4=`--- titel: Ciclo for bereich: Fundamentos kurz: Contar um número fixo de iterações com Início, Condição e Passo. @@ -25930,7 +25930,7 @@ besser: for (int i = 2; i <= 10; i = i + 2) { - [ ] i é mostrado. > \`i++\` é a forma curta de \`i = i + 1\`. ::: -`,E4=`--- +`,N4=`--- titel: Encaixar bereich: Fundamentos kurz: Combinar decisões dentro de ciclos e ciclos dentro de ciclos. @@ -26196,7 +26196,7 @@ frage: O que acontece? - [x] Pelas chavetas e pela indentação - [ ] Pelos pontos e vírgulas ::: -`,N4=`--- +`,F4=`--- titel: Arrays bereich: Fundamentos kurz: Guardar muitos valores com um só nome, chegar a eles com o índice e percorrê-los com um ciclo. @@ -26506,7 +26506,7 @@ besser: for (int i = numeros.length - 1; i >= 0; i--) { - [ ] int numeros = [1, 2, 3]; - [ ] array numeros = (1, 2, 3); ::: -`,F4=`--- +`,J4=`--- titel: Arrays bidimensionais bereich: Fundamentos kurz: Guardar valores em linhas e colunas, como os lugares de um cinema, e percorrê-los com dois ciclos encaixados. @@ -26791,7 +26791,7 @@ frage: Dois ciclos percorrem a sala \`new boolean[3][5]\`. Que posição vem log - [ ] 5, o número de lugares - [ ] 15, todos os lugares juntos ::: -`,J4=`--- +`,R4=`--- titel: Strings bereich: Fundamentos kurz: Trabalhar com texto: ler caracteres, recortar partes, pesquisar, comparar e dividir. @@ -27242,7 +27242,7 @@ ende: A Zora está livre, e a raposa fugiu a correr. A palavra secreta era \`BRE - [ ] uma mensagem de erro > parseInt transforma o texto num número. Depois o Java faz a conta normalmente. ::: -`,R4=`--- +`,G4=`--- titel: Chamada e interrupção bereich: Fundamentos kurz: Dividir tarefas grandes em subprogramas e sair mais cedo dos ciclos. @@ -27698,7 +27698,7 @@ frage: O que aparece? - [ ] return > void significa “vazio”: o método faz alguma coisa, mas não devolve nenhum valor. ::: -`,G4=`--- +`,H4=`--- titel: Pesquisar e ordenar bereich: Fundamentos kurz: Perceber com cartas de jogar como funcionam a pesquisa linear, a pesquisa binária e o bubble sort, e porque é que alguns métodos são muito mais rápidos. @@ -28014,7 +28014,7 @@ frage: O bubble sort troca \`cartas[i]\` e \`cartas[i + 1]\`. De que precisa par - [ ] Um ciclo while não consegue percorrer arrays. > A carta pode aparecer várias vezes. Por isso percorres todas as cartas até ao fim. ::: -`,H4=`--- +`,V4=`--- titel: Estrutograma e código bereich: Do estrutograma ao código kurz: Todos os elementos em Java num relance, gerar código, escrever Java na área Programação, executá-lo e procurar erros. @@ -28364,7 +28364,7 @@ frage: No depurador, uma linha está amarela. O que quer dizer? - [ ] A linha tem um erro. > É um ponto de paragem. Continua-se com ▶︎ ou com Passo a passo. ::: -`,V4=`--- +`,Q4=`--- titel: Python e JavaScript bereich: Do estrutograma ao código kurz: Gerar código Python e JavaScript a partir do estrutograma e executar JavaScript diretamente no navegador. @@ -28587,7 +28587,7 @@ richtig: JavaScript - [ ] É mostrado Soma:. > str(soma) transforma o número em texto. ::: -`,Q4=`--- +`,q4=`--- titel: Quando o programa falha: try e catch bereich: Apanhar erros kurz: Ler mensagens de erro com Java verdadeiro e apanhar falhas com try e catch. @@ -28854,7 +28854,7 @@ A exceção chama-se \`ArithmeticException\`. Põe no bloco \`try\` só a linha = ArithmeticException -> divisão por 0 = NumberFormatException -> o texto não é um número ::: -`,q4=`--- +`,U4=`--- titel: Ler e guardar texto bereich: Ficheiros kurz: Ler um ficheiro de texto linha a linha com Scanner e guardar um ficheiro com PrintWriter. @@ -29092,7 +29092,7 @@ runde: = println(texto) -> escreve uma linha = close() -> fecha o ficheiro ::: -`,U4=`--- +`,$4=`--- titel: Linha a linha com BufferedReader bereich: Ficheiros kurz: Ler com BufferedReader e readLine até chegar null, e ler um ficheiro inteiro de uma vez com Files. @@ -29332,7 +29332,7 @@ runde: = Files.readString -> ficheiros pequenos de uma vez = Scanner -> ler números e palavras ::: -`,$4=`--- +`,Y4=`--- titel: Tabelas em CSV bereich: Ficheiros kurz: Ler uma tabela num ficheiro CSV, dividir cada linha com split e fazer contas com os números. @@ -29539,7 +29539,7 @@ besser: Ludwig;2;3;1 = registo -> uma linha com valores = separador -> separa as colunas, muitas vezes ; ::: -`,Y4=`--- +`,X4=`--- titel: Dados em JSON bereich: Ficheiros kurz: Perceber ficheiros JSON, tirar valores com indexOf e substring e escrever JSON tu mesmo. @@ -29747,7 +29747,7 @@ frage: Que chave tem um valor lógico? = [ ] -> uma lista = : -> separa a chave do valor ::: -`,X4=`--- +`,K4=`--- titel: Comparar formatos bereich: Ficheiros kurz: Comparar os mesmos dados em txt, CSV e JSON, escolher o formato certo e converter um ficheiro noutro formato. @@ -29907,7 +29907,7 @@ richtig: txt = a pauta de notas da turma -> CSV = um jogo guardado com listas -> JSON ::: -`,K4=`--- +`,ey=`--- titel: A tua primeira janela bereich: Janelas com Swing kurz: Abrir uma janela tua com Java e Swing, explicado linha a linha. @@ -30114,7 +30114,7 @@ Não te apetece escrever tanto? Com o “Java verdadeiro” podes escrever na á - [ ] Estão entre chavetas. - [ ] Terminam em Window. ::: -`,ey=`--- +`,ty=`--- titel: Um botão na janela bereich: Janelas com Swing kurz: Pôr um botão na janela e arrumá-lo bem com um layout. @@ -30315,7 +30315,7 @@ Cada botão precisa da sua própria variável, por exemplo \`botao\` e \`botao2\ - [ ] No botão aparece “Fui clicado”. > O que deve acontecer com um clique aprendes na próxima lição. ::: -`,ty=`--- +`,ny=`--- titel: O botão reage bereich: Janelas com Swing kurz: Com um ActionListener decides o que acontece com um clique. @@ -30642,7 +30642,7 @@ Cada botão recebe o seu próprio ouvinte, com o seu próprio \`addActionListene = setText -> mudar o texto = setVisible(true) -> mostrar a janela ::: -`,ny=`--- +`,iy=`--- titel: Duplicar um número na janela bereich: Janelas com Swing kurz: Arrumar uma etiqueta, um campo de texto e um botão com um GridLayout e calcular com o texto do campo de texto. @@ -30907,7 +30907,7 @@ O botão “Dividir por 2” entra no GridLayout como quarta linha e recebe o se = JButton -> botão = GridLayout -> arrumação em grelha ::: -`,iy=`--- +`,ay=`--- titel: Contador de cliques com reset bereich: Janelas com Swing kurz: Dois botões alteram o mesmo número: criar uma variável para a classe toda. @@ -31125,7 +31125,7 @@ Para “nunca abaixo de 0”, o ouvinte do −1 precisa de um \`if\`: só se \`c - [ ] Põe a janela no meio do ecrã. - [ ] Aumenta a letra. ::: -`,ay=`--- +`,sy=`--- titel: Um semáforo com cores bereich: Janelas com Swing kurz: Definir cores de fundo e mudar um semáforo com uma variável de estado. @@ -31386,7 +31386,7 @@ Com quatro fases, depois do 3 vem o 0. Ajusta por isso o número em \`if (fase > - [ ] 3 > Depois de fase++ é 3, que é maior do que 2, por isso passa a 0. ::: -`,sy=`--- +`,ry=`--- titel: Calculadora de notas na janela bereich: Janelas com Swing kurz: Escrever a percentagem, determinar o nível com else if e apanhar entradas erradas. @@ -31643,7 +31643,7 @@ Testa sempre os limites: 90 tem de dar 5, 89 tem de dar 4. É nos limites que se - [ ] percentagem >= 0 || percentagem <= 100 > Um número não pode ser ao mesmo tempo menor do que 0 e maior do que 100, por isso é preciso o ou. ::: -`,ry=`--- +`,oy=`--- titel: Uma calculadora bereich: Janelas com Swing kurz: Duas colunas com GridLayout, quatro botões de cálculo e apanhar a divisão por 0. @@ -31900,7 +31900,7 @@ Para o “abc” cada ouvinte precisa de um try/catch com \`NumberFormatExceptio - [ ] Coluna a coluna, começando de cima para baixo na coluna da esquerda - [ ] Ao acaso ::: -`,oy=`--- +`,ly=`--- titel: Adivinha o número bereich: Janelas com Swing kurz: Um jogo com número aleatório, contagem de tentativas e um botão que se desliga no fim. @@ -32042,7 +32042,7 @@ Para “não conta como tentativa”, o \`tentativas++\` tem de vir **depois** d - [x] 7 > Cada palpite corta o intervalo a meio, e 2 elevado a 7 = 128 é maior do que 100. ::: -`,ly=`--- +`,uy=`--- titel: Muitos botões, um ouvinte bereich: Janelas com Swing kurz: Um ouvinte para muitos botões e descobrir com getActionCommand e getSource qual foi o botão clicado. @@ -32331,7 +32331,7 @@ Também na calculadora da lição 35 chega um ouvinte para +, -, \\* e /. Verifi = ActionEvent -> o evento e com a informação sobre o clique = JPanel -> uma área com o seu próprio layout ::: -`,uy=`--- +`,my=`--- titel: Classes internas bereich: Janelas com Swing kurz: Escrever um ouvinte como classe interna com nome, como classe anónima e como lambda, e saber quem vê o quê. @@ -32547,7 +32547,7 @@ Experimenta se os três botões contam como esperado. Depois tira o \`static\` d = new ActionListener() { … } -> classe anónima = a seta depois de e -> lambda ::: -`,my=`--- +`,cy=`--- titel: Dois separadores bereich: Janelas com Swing kurz: Construir uma janela com dois separadores, levar dados de um separador para o outro e guardar a lista num ficheiro de texto. @@ -32812,7 +32812,7 @@ Depois melhora-o: = JPanel -> a área de um separador = JTextArea -> uma área de texto com várias linhas ::: -`,cy=`--- +`,dy=`--- titel: Model View Controller bereich: Janelas com Swing kurz: Dividir o contador de cliques em model, view e controller e perceber quem fala com quem. @@ -33209,7 +33209,7 @@ Depois melhora-o: = VistaNumero com atualizar(int valor) -> view = o ouvinte do botão -> controller ::: -`,dy=`Termos técnicos da área de aprendizagem. Quando um termo aparece num passo, fica marcado uma vez e mostra a sua +`,hy=`Termos técnicos da área de aprendizagem. Quando um termo aparece num passo, fica marcado uma vez e mostra a sua explicação ao passar o rato ou ao tocar. Se estiver a negrito nesse passo, é explicado ali mesmo e não é marcado. \`auch:\` indica outras formas que também são reconhecidas. Maiúsculas e minúsculas contam. @@ -33408,7 +33408,7 @@ Um bloco pronto do Java que lê entradas do teclado, por exemplo um número com ### import Uma linha mesmo no início do código Java que vai buscar um bloco pronto a um pacote, por exemplo \`import java.util.Scanner;\`. Sem ela, o Java não conhece o nome. -`,hy=`## Elementos básicos +`,gy=`## Elementos básicos ### Instrução @@ -33534,7 +33534,7 @@ boolean[][] lugares = new boolean[3][5] lugares[1][4] = true output: lugares.length + " filas, " + lugares[0].length + " lugares" \`\`\` -`,gy=`--- +`,py=`--- titel: Alter im Unterprogramm nach: 18 stufe: 2 @@ -33555,7 +33555,7 @@ tipp: Öffne die Übung im Editor und baue dort das Hauptprogramm mit dem Aufruf lösung: aufgabe-alter-haupt-loesung.visustruct unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct ::: -`,py=`--- +`,fy=`--- titel: Ballwurf auswerten nach: 25 stufe: 2 @@ -33584,7 +33584,7 @@ tipp: Du brauchst vier Variablen vor der Schleife: die Anzahl, die Summe als \`d tipp: In der Schleife: \`String[] teile = zeile.split(";");\` und \`int weite = Integer.parseInt(teile[1]);\`. Ist \`weite > besteWeite\`, merkst du dir Weite und Namen. Zum Speichern: \`PrintWriter aus = new PrintWriter("sieger.txt");\`, \`aus.println(…)\` und \`aus.close();\`. lösung: aufgabe-ballwurf-loesung.visustruct ::: -`,fy=`--- +`,xy=`--- titel: Bestenliste nach: 19 stufe: 2 @@ -33618,7 +33618,7 @@ tipp: Lies jede Zahl erst in eine Variable ein und schreibe sie dann ins Array: tipp: Der Tausch braucht auch in Java eine Hilfsvariable: \`int hilf = punkte[i]; punkte[i] = punkte[i + 1]; punkte[i + 1] = hilf;\`. lösung: aufgabe-bestenliste-loesung.visustruct ::: -`,xy=`--- +`,by=`--- titel: Binärzahl nach: 11 stufe: 3 @@ -33660,7 +33660,7 @@ tipp: Fang mit \`String binaer = "";\` an. Die Schleife läuft mit \`while (zahl tipp: Im Rumpf: \`int rest = zahl % 2;\`, dann \`binaer = rest + binaer;\` und \`zahl = zahl / 2;\`. Weil \`binaer\` ein String ist, hängt \`+\` den Rest vorne an. lösung: aufgabe-binaer-loesung.visustruct ::: -`,by=`--- +`,yy=`--- titel: Caesar-Verschlüsselung nach: 17 stufe: 3 @@ -33794,7 +33794,7 @@ lösung: aufgabe-caesar-entschluesseln-loesung.visustruct ::: angeberwissen Sicher ist Caesar leider nicht. Es gibt nur 25 Schlüssel, die kann man in ein paar Minuten alle ausprobieren. Noch schneller geht es mit einem Trick: Im Deutschen ist E der häufigste Buchstabe. Kommt im Geheimtext H am häufigsten vor, war der Schlüssel wohl 3. Im Internet gibt es übrigens ROT13, das ist Caesar mit dem Schlüssel 13. Zweimal ROT13 ergibt wieder den Klartext, weil 13 + 13 = 26. ::: -`,yy=`--- +`,vy=`--- titel: Collatz-Folge nach: 11 stufe: 2 @@ -33838,7 +33838,7 @@ lösung: aufgabe-collatz-loesung.visustruct ::: angeberwissen Mit dieser Aufgabe kann man reich werden! Der Mathematiker Paul Erdős setzte für einen Beweis 500 Dollar aus. 2021 legte die japanische Firma Bakuage noch einiges drauf: 120 Millionen Yen, damals umgerechnet rund eine Million Dollar, für einen Beweis oder ein Gegenbeispiel. Abgeholt hat das Geld bis heute niemand. Erfunden hat das Rätsel übrigens der deutsche Mathematiker Lothar Collatz im Jahr 1937. Ich rechne gleich mal los, für so viel Geld gibt es eine Menge Heu. ::: -`,vy=`--- +`,wy=`--- titel: Einheitenrechner nach: 35 stufe: 2 @@ -33887,7 +33887,7 @@ Zusatz: Ein vierter Knopf **in Fuß** rechnet in die englische Einheit um. Ein F ::: ludwig Tick im [Zahnrad](#zeige-einstellungen) **Echtes Java (mit Swing)** an. Für „abc“ im Feld brauchst du in jedem Zuhörer ein try/catch mit \`NumberFormatException\`, wie beim Taschenrechner. ::: -`,wy=`--- +`,zy=`--- titel: Fibonacci-Zahlen nach: 13 stufe: 2 @@ -33941,7 +33941,7 @@ lösung: aufgabe-fibonacci-loesung.visustruct - [ ] Die Reihenfolge ist egal > Andersherum hätten zahl1 und zahl2 danach denselben Wert. Wie beim Tauschen gilt: Erst retten, dann überschreiben. ::: -`,zy=`--- +`,Iy=`--- titel: Gerade oder ungerade nach: 8 stufe: 1 @@ -33977,7 +33977,7 @@ tipp: Eine Zahl liest du mit \`int zahl = scanner.nextInt();\` ein. Vorher frags tipp: \`if (zahl % 2 == 0) { … } else { … }\`. Die Ausgabe ist \`System.out.println(zahl + " ist gerade");\`. lösung: aufgabe-gerade-loesung.visustruct ::: -`,Iy=`--- +`,ky=`--- titel: Mehrwertsteuer nach: 6 stufe: 1 @@ -34018,7 +34018,7 @@ lösung: aufgabe-mehrwertsteuer-loesung.visustruct - [ ] Weil man Kommazahlen nur als Konstante speichern kann > Eine Konstante behält ihren Wert. Ändert sich der Steuersatz einmal, passt du nur die eine Zeile mit \`const\` an. ::: -`,ky=`--- +`,Sy=`--- titel: Notendurchschnitt nach: 13 stufe: 2 @@ -34053,7 +34053,7 @@ tipp: \`for (int i = 0; i < anzahl; i++)\` liest genau so viele Noten ein, wie v tipp: Teile mit \`double schnitt = summe * 1.0 / anzahl;\`. Ohne \`* 1.0\` teilt Java zwei \`int\` ganzzahlig, und aus 1.5 wird 1. lösung: aufgabe-durchschnitt-loesung.visustruct ::: -`,Sy=`--- +`,_y=`--- titel: PIN prüfen nach: 12 stufe: 2 @@ -34093,7 +34093,7 @@ tipp: \`do { … } while (…);\` fragt mindestens einmal. Hinter \`while (…)\ tipp: Lege vorher \`int pin = 0;\` und \`int versuche = 0;\` an. In der Schleife: \`int eingabe = scanner.nextInt();\`, \`pin = eingabe;\` und \`versuche++;\`. Die Bedingung ist \`pin != 1234 && versuche < 3\`. lösung: aufgabe-pin-java-loesung.visustruct ::: -`,_y=`--- +`,Ty=`--- titel: Schiffe versenken nach: 16 stufe: 2 @@ -34130,7 +34130,7 @@ tipp: Zwei \`for\`-Schleifen ineinander: außen die Reihe, innen die Spalte, bei tipp: \`if (meer[reihe][spalte]) { System.out.println(spalten[spalte] + (reihe + 1)); }\`. Die Klammer um \`reihe + 1\` sorgt dafür, dass Java erst rechnet. lösung: aufgabe-schiffe-loesung.visustruct ::: -`,Ty=`--- +`,Oy=`--- titel: Speisekarte nach: 10 stufe: 1 @@ -34166,7 +34166,7 @@ tipp: In Java ist das eine Fallauswahl mit \`switch (nummer) { … }\`. tipp: Jeder Fall sieht so aus: \`case 1 -> { System.out.println("…"); }\`. Für alle anderen Nummern gibt es \`default -> { … }\`. lösung: aufgabe-speisekarte-loesung.visustruct ::: -`,Oy=`--- +`,Ay=`--- titel: Summe bilden nach: 2 stufe: 1 @@ -34182,7 +34182,7 @@ tipp: Du brauchst drei Variablen: zwei für die Zahlen und eine für das Ergebni tipp: Eine Variable legst du mit einer Anweisung wie \`int zahl1 = 4\` fest. Für die Ausgabe schreibst du den Namen der Variablen ohne Anführungszeichen. lösung: aufgabe-summe-loesung.visustruct ::: -`,Ay=`--- +`,Py=`--- titel: Tafeldienst auslosen nach: 15 stufe: 2 @@ -34219,7 +34219,7 @@ lösung: aufgabe-tafeldienst-loesung.visustruct ::: > Mit \`int nummer = (int) (Math.random() * 5) + 1\` kannst du die Losnummer auch vom Zufall ziehen lassen. Für die automatische Prüfung brauchen wir aber eine feste Eingabe. -`,Py=`--- +`,jy=`--- titel: Taschenrechner nach: 10 stufe: 2 @@ -34255,7 +34255,7 @@ tipp: Das Rechenzeichen ist ein Text. Du liest es mit \`String zeichen = scanner tipp: \`switch (zeichen) { case "+" -> { … } … default -> { … } }\`. Bei Texten stehen die Fälle in Anführungszeichen. lösung: aufgabe-rechner-loesung.visustruct ::: -`,jy=`--- +`,Cy=`--- titel: Verleih-Menü nach: 18 stufe: 2 @@ -34290,7 +34290,7 @@ tipp: \`while (true) { … }\` läuft endlos, bis ein \`break;\` kommt. tipp: Nimm in Java hier \`if\`/\`else if\` statt \`switch\`: Ein \`break;\` in einem \`switch\` verlässt nur den \`switch\`, nicht die Schleife. \`if (wahl == 0) { System.out.println("Tschüss"); break; } else if (wahl == 1) { … }\`. lösung: aufgabe-verleih-java-loesung.visustruct ::: -`,Cy=`--- +`,By=`--- titel: Vokabeltrainer nach: 27 stufe: 3 @@ -34325,7 +34325,7 @@ tipp: Überspringe die Kopfzeile. In der Schleife zerlegst du jede Zeile mit \`s tipp: Texte vergleichst du mit \`antwort.equals(teile[1])\`, nicht mit \`==\`. Zähle vor der Schleife mit \`int richtig = 0;\` und \`int anzahl = 0;\` mit. lösung: aufgabe-vokabeln-loesung.visustruct ::: -`,By=`--- +`,Dy=`--- titel: Volljährig? nach: 8 stufe: 1 @@ -34361,7 +34361,7 @@ tipp: Lies das Alter mit \`int alter = scanner.nextInt();\` ein. tipp: \`if (alter >= 18) { … } else { … }\`, in jedem Zweig ein \`System.out.println(…)\`. lösung: aufgabe-volljaehrig-loesung.visustruct ::: -`,Dy=`--- +`,Zy=`--- titel: Würfeln mit MVC nach: 40 stufe: 3 @@ -34399,7 +34399,7 @@ Zusatz: Ein Knopf **Neues Spiel** setzt alles auf Anfang. Die Methode dafür geh ::: ludwig Denk an die Regel aus Lektion 40: Im Model steht kein einziges \`JLabel\`. Wenn du beim Würfeln die Schriftgröße änderst, gehört das in die View. ::: -`,Zy=`--- +`,My=`--- titel: Zahl verdoppeln nach: 2 stufe: 1 @@ -34415,7 +34415,7 @@ tipp: Verdoppeln heißt: mal 2. Das Ergebnis speicherst du wieder in derselben V tipp: \`zahl = zahl * 2\` rechnet mit dem alten Wert und speichert das Ergebnis wieder in \`zahl\`. Text und Variable verbindest du mit \`+\`. lösung: aufgabe-verdoppeln-loesung.visustruct ::: -`,My=`--- +`,Ly=`--- titel: Age in a subprogram nach: 18 stufe: 2 @@ -34436,7 +34436,7 @@ tipp: Open the exercise in the editor and build the main program there with the lösung: aufgabe-alter-haupt-loesung.visustruct unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct ::: -`,Ly=`--- +`,Wy=`--- titel: Ball throw results nach: 25 stufe: 2 @@ -34465,7 +34465,7 @@ tipp: You need four variables before the loop: the count, the sum as a \`double\ tipp: In the loop: \`String[] parts = line.split(";");\` and \`int distance = Integer.parseInt(parts[1]);\`. If \`distance > bestDistance\`, remember the distance and the name. To save: \`PrintWriter out = new PrintWriter("winner.txt");\`, \`out.println(…)\` and \`out.close();\`. lösung: aufgabe-ballwurf-loesung.visustruct ::: -`,Wy=`--- +`,Ey=`--- titel: Leaderboard nach: 19 stufe: 2 @@ -34499,7 +34499,7 @@ tipp: Read each number into a variable first and then put it into the array: \`i tipp: The swap needs a temporary variable in Java too: \`int temp = points[i]; points[i] = points[i + 1]; points[i + 1] = temp;\`. lösung: aufgabe-bestenliste-loesung.visustruct ::: -`,Ey=`--- +`,Ny=`--- titel: Binary number nach: 11 stufe: 3 @@ -34541,7 +34541,7 @@ tipp: Start with \`String binary = "";\`. The loop runs with \`while (number > 0 tipp: In the body: \`int remainder = number % 2;\`, then \`binary = remainder + binary;\` and \`number = number / 2;\`. Because \`binary\` is a String, \`+\` puts the remainder at the front. lösung: aufgabe-binaer-loesung.visustruct ::: -`,Ny=`--- +`,Fy=`--- titel: Caesar cipher nach: 17 stufe: 3 @@ -34675,7 +34675,7 @@ lösung: aufgabe-caesar-entschluesseln-loesung.visustruct ::: angeberwissen Unfortunately, Caesar is not secure. There are only 25 keys, and you can try them all in a few minutes. It is even quicker with a trick: in English, E is the most common letter. If H is the most common letter in the secret text, the key was probably 3. On the internet there is also ROT13, which is Caesar with the key 13. Applying ROT13 twice gives you the plain text again, because 13 + 13 = 26. ::: -`,Fy=`--- +`,Jy=`--- titel: Collatz sequence nach: 11 stufe: 2 @@ -34719,7 +34719,7 @@ lösung: aufgabe-collatz-loesung.visustruct ::: angeberwissen This task could make you rich! The mathematician Paul Erdős offered 500 dollars for a proof. In 2021 the Japanese company Bakuage added quite a bit more: 120 million yen, about a million dollars at the time, for a proof or a counterexample. Nobody has collected the money yet. By the way, the puzzle was invented by the German mathematician Lothar Collatz in 1937. I am going to start calculating right now; that much money buys a lot of hay. ::: -`,Jy=`--- +`,Ry=`--- titel: Unit converter nach: 35 stufe: 2 @@ -34768,7 +34768,7 @@ Extra: a fourth button **in feet** converts to the imperial unit. One foot is 0. ::: ludwig Tick **Real Java (with Swing)** in the [gear](#zeige-einstellungen). For "abc" in the field, every listener needs a try/catch with \`NumberFormatException\`, just like the calculator. ::: -`,Ry=`--- +`,Gy=`--- titel: Fibonacci numbers nach: 13 stufe: 2 @@ -34822,7 +34822,7 @@ lösung: aufgabe-fibonacci-loesung.visustruct - [ ] The order does not matter > The other way round, number1 and number2 would have the same value afterwards. Just like swapping: first save, then overwrite. ::: -`,Gy=`--- +`,Hy=`--- titel: Even or odd nach: 8 stufe: 1 @@ -34858,7 +34858,7 @@ tipp: Read a number with \`int number = scanner.nextInt();\`. Ask with \`System. tipp: \`if (number % 2 == 0) { … } else { … }\`. The output is \`System.out.println(number + " is even");\`. lösung: aufgabe-gerade-loesung.visustruct ::: -`,Hy=`--- +`,Vy=`--- titel: Sales tax nach: 6 stufe: 1 @@ -34899,7 +34899,7 @@ lösung: aufgabe-mehrwertsteuer-loesung.visustruct - [ ] Because decimal numbers can only be stored as constants > A constant keeps its value. If the tax rate ever changes, you only change the one line with \`const\`. ::: -`,Vy=`--- +`,Qy=`--- titel: Grade average nach: 13 stufe: 2 @@ -34934,7 +34934,7 @@ tipp: \`for (int i = 0; i < count; i++)\` reads exactly as many grades as were g tipp: Divide with \`double average = sum * 1.0 / count;\`. Without \`* 1.0\`, Java divides two \`int\` values as whole numbers, and 1.5 becomes 1. lösung: aufgabe-durchschnitt-loesung.visustruct ::: -`,Qy=`--- +`,qy=`--- titel: Check the PIN nach: 12 stufe: 2 @@ -34974,7 +34974,7 @@ tipp: \`do { … } while (…);\` asks at least once. There is a semicolon after tipp: Create \`int pin = 0;\` and \`int attempts = 0;\` first. In the loop: \`int entered = scanner.nextInt();\`, \`pin = entered;\` and \`attempts++;\`. The condition is \`pin != 1234 && attempts < 3\`. lösung: aufgabe-pin-java-loesung.visustruct ::: -`,qy=`--- +`,Uy=`--- titel: Battleship nach: 16 stufe: 2 @@ -35011,7 +35011,7 @@ tipp: Two \`for\` loops inside each other: the row outside, the column inside, b tipp: \`if (sea[row][column]) { System.out.println(columns[column] + (row + 1)); }\`. The brackets around \`row + 1\` make Java calculate first. lösung: aufgabe-schiffe-loesung.visustruct ::: -`,Uy=`--- +`,$y=`--- titel: Menu nach: 10 stufe: 1 @@ -35047,7 +35047,7 @@ tipp: In Java this is a switch: \`switch (pick) { … }\`. tipp: Every case looks like this: \`case 1 -> { System.out.println("…"); }\`. All other numbers go to \`default -> { … }\`. lösung: aufgabe-speisekarte-loesung.visustruct ::: -`,$y=`--- +`,Yy=`--- titel: Add up nach: 2 stufe: 1 @@ -35063,7 +35063,7 @@ tipp: You need three variables: two for the numbers and one for the result. tipp: You set a variable with a statement such as \`int number1 = 4\`. For the output you write the name of the variable without quotation marks. lösung: aufgabe-summe-loesung.visustruct ::: -`,Yy=`--- +`,Xy=`--- titel: Draw for board duty nach: 15 stufe: 2 @@ -35100,7 +35100,7 @@ lösung: aufgabe-tafeldienst-loesung.visustruct ::: > With \`int pick = (int) (Math.random() * 5) + 1\` you can also let chance draw the number. But for the automatic check we need a fixed input. -`,Xy=`--- +`,Ky=`--- titel: Calculator nach: 10 stufe: 2 @@ -35136,7 +35136,7 @@ tipp: The operator is a text. Read it with \`String operator = scanner.next();\` tipp: \`switch (operator) { case "+" -> { … } … default -> { … } }\`. With texts, the cases are in quotation marks. lösung: aufgabe-rechner-loesung.visustruct ::: -`,Ky=`--- +`,ev=`--- titel: Rental menu nach: 18 stufe: 2 @@ -35171,7 +35171,7 @@ tipp: \`while (true) { … }\` runs forever until a \`break;\` comes. tipp: In Java, use \`if\`/\`else if\` here instead of \`switch\`: a \`break;\` inside a \`switch\` only leaves the \`switch\`, not the loop. \`if (choice == 0) { System.out.println("Bye"); break; } else if (choice == 1) { … }\`. lösung: aufgabe-verleih-java-loesung.visustruct ::: -`,ev=`--- +`,tv=`--- titel: Vocabulary trainer nach: 27 stufe: 3 @@ -35206,7 +35206,7 @@ tipp: Skip the header line. In the loop, split every line with \`split(";")\`: \ tipp: Compare texts with \`answer.equals(parts[1])\`, not with \`==\`. Count along with \`int right = 0;\` and \`int count = 0;\` before the loop. lösung: aufgabe-vokabeln-loesung.visustruct ::: -`,tv=`--- +`,nv=`--- titel: Adult? nach: 8 stufe: 1 @@ -35242,7 +35242,7 @@ tipp: Read the age with \`int age = scanner.nextInt();\`. tipp: \`if (age >= 18) { … } else { … }\`, with a \`System.out.println(…)\` in each branch. lösung: aufgabe-volljaehrig-loesung.visustruct ::: -`,nv=`--- +`,iv=`--- titel: Rolling dice with MVC nach: 40 stufe: 3 @@ -35280,7 +35280,7 @@ Extra: a button **New game** resets everything. The method for that belongs in t ::: ludwig Remember the rule from lesson 40: there isn't a single \`JLabel\` in the model. If you change the font size when rolling, that belongs in the view. ::: -`,iv=`--- +`,av=`--- titel: Double a number nach: 2 stufe: 1 @@ -35296,7 +35296,7 @@ tipp: Doubling means: times 2. You store the result in the same variable again. tipp: \`number = number * 2\` calculates with the old value and stores the result in \`number\` again. You join text and a variable with \`+\`. lösung: aufgabe-verdoppeln-loesung.visustruct ::: -`,av=`--- +`,sv=`--- titel: Idade num subprograma nach: 18 stufe: 2 @@ -35317,7 +35317,7 @@ tipp: Abre o exercício no editor e constrói lá o programa principal com a cha lösung: aufgabe-alter-haupt-loesung.visustruct unterprogramm: aufgabe-alter-unterprogramm-loesung.visustruct ::: -`,sv=`--- +`,rv=`--- titel: Avaliar o lançamento da bola nach: 25 stufe: 2 @@ -35346,7 +35346,7 @@ tipp: Precisas de quatro variáveis antes do ciclo: a contagem, a soma como \`do tipp: No ciclo: \`String[] partes = linha.split(";");\` e \`int distancia = Integer.parseInt(partes[1]);\`. Se \`distancia > melhorDistancia\`, guarda a distância e o nome. Para guardar: \`PrintWriter saida = new PrintWriter("vencedor.txt");\`, \`saida.println(…)\` e \`saida.close();\`. lösung: aufgabe-ballwurf-loesung.visustruct ::: -`,rv=`--- +`,ov=`--- titel: Classificação nach: 19 stufe: 2 @@ -35380,7 +35380,7 @@ tipp: Lê cada número primeiro para uma variável e depois põe-no no array: \` tipp: A troca também precisa de uma variável auxiliar em Java: \`int aux = pontos[i]; pontos[i] = pontos[i + 1]; pontos[i + 1] = aux;\`. lösung: aufgabe-bestenliste-loesung.visustruct ::: -`,ov=`--- +`,lv=`--- titel: Número binário nach: 11 stufe: 3 @@ -35422,7 +35422,7 @@ tipp: Começa com \`String binario = "";\`. O ciclo corre com \`while (numero > tipp: No corpo: \`int resto = numero % 2;\`, depois \`binario = resto + binario;\` e \`numero = numero / 2;\`. Como \`binario\` é uma String, o \`+\` põe o resto à frente. lösung: aufgabe-binaer-loesung.visustruct ::: -`,lv=`--- +`,uv=`--- titel: Cifra de César nach: 17 stufe: 3 @@ -35556,7 +35556,7 @@ lösung: aufgabe-caesar-entschluesseln-loesung.visustruct ::: angeberwissen Infelizmente, a cifra de César não é segura. Há apenas 25 chaves, e é possível experimentá-las todas em poucos minutos. Com um truque é ainda mais rápido: em português, as letras mais frequentes são o A e o E. Se no texto cifrado o H aparecer muitas vezes, a chave foi provavelmente 3. Na internet existe ainda o ROT13, que é a cifra de César com a chave 13. Aplicar ROT13 duas vezes devolve o texto simples, porque 13 + 13 = 26. ::: -`,uv=`--- +`,mv=`--- titel: Sequência de Collatz nach: 11 stufe: 2 @@ -35600,7 +35600,7 @@ lösung: aufgabe-collatz-loesung.visustruct ::: angeberwissen Esta tarefa pode tornar-te rico! O matemático Paul Erdős ofereceu 500 dólares por uma demonstração. Em 2021, a empresa japonesa Bakuage juntou bastante mais: 120 milhões de ienes, na altura cerca de um milhão de dólares, por uma demonstração ou um contraexemplo. Ainda ninguém foi buscar o dinheiro. Já agora, o enigma foi inventado pelo matemático alemão Lothar Collatz em 1937. Vou já começar a fazer contas; com tanto dinheiro compra-se muito feno. ::: -`,mv=`--- +`,cv=`--- titel: Conversor de unidades nach: 35 stufe: 2 @@ -35649,7 +35649,7 @@ Extra: um quarto botão **em pés** converte para a unidade inglesa. Um pé são ::: ludwig Marca **Java verdadeiro (com Swing)** na [roda dentada](#zeige-einstellungen). Para "abc" no campo, cada ouvinte precisa de um try/catch com \`NumberFormatException\`, tal como na calculadora. ::: -`,cv=`--- +`,dv=`--- titel: Números de Fibonacci nach: 13 stufe: 2 @@ -35703,7 +35703,7 @@ lösung: aufgabe-fibonacci-loesung.visustruct - [ ] A ordem não importa > Ao contrário, numero1 e numero2 ficariam depois com o mesmo valor. Tal como na troca: primeiro guardar, depois substituir. ::: -`,dv=`--- +`,hv=`--- titel: Par ou ímpar nach: 8 stufe: 1 @@ -35739,7 +35739,7 @@ tipp: Lês um número com \`int numero = scanner.nextInt();\`. Antes disso pergu tipp: \`if (numero % 2 == 0) { … } else { … }\`. A saída é \`System.out.println(numero + " é par");\`. lösung: aufgabe-gerade-loesung.visustruct ::: -`,hv=`--- +`,gv=`--- titel: IVA nach: 6 stufe: 1 @@ -35780,7 +35780,7 @@ lösung: aufgabe-mehrwertsteuer-loesung.visustruct - [ ] Porque os números decimais só podem ser guardados como constantes > Uma constante mantém o seu valor. Se a taxa alguma vez mudar, só alteras a linha com \`const\`. ::: -`,gv=`--- +`,pv=`--- titel: Média das notas nach: 13 stufe: 2 @@ -35815,7 +35815,7 @@ tipp: \`for (int i = 0; i < quantidade; i++)\` lê exatamente as notas que foram tipp: Divide com \`double media = soma * 1.0 / quantidade;\`. Sem \`* 1.0\`, o Java divide dois \`int\` como inteiros, e 1.5 passa a 1. lösung: aufgabe-durchschnitt-loesung.visustruct ::: -`,pv=`--- +`,fv=`--- titel: Verificar o PIN nach: 12 stufe: 2 @@ -35855,7 +35855,7 @@ tipp: \`do { … } while (…);\` pergunta pelo menos uma vez. Depois do \`while tipp: Cria antes \`int pin = 0;\` e \`int tentativas = 0;\`. No ciclo: \`int entrada = scanner.nextInt();\`, \`pin = entrada;\` e \`tentativas++;\`. A condição é \`pin != 1234 && tentativas < 3\`. lösung: aufgabe-pin-java-loesung.visustruct ::: -`,fv=`--- +`,xv=`--- titel: Batalha naval nach: 16 stufe: 2 @@ -35892,7 +35892,7 @@ tipp: Dois ciclos \`for\` um dentro do outro: fora a fila, dentro a coluna, ambo tipp: \`if (mar[fila][coluna]) { System.out.println(colunas[coluna] + (fila + 1)); }\`. Os parênteses à volta de \`fila + 1\` fazem o Java calcular primeiro. lösung: aufgabe-schiffe-loesung.visustruct ::: -`,xv=`--- +`,bv=`--- titel: Ementa nach: 10 stufe: 1 @@ -35928,7 +35928,7 @@ tipp: Em Java isto é uma seleção com \`switch (prato) { … }\`. tipp: Cada caso é assim: \`case 1 -> { System.out.println("…"); }\`. Para todos os outros números há \`default -> { … }\`. lösung: aufgabe-speisekarte-loesung.visustruct ::: -`,bv=`--- +`,yv=`--- titel: Somar nach: 2 stufe: 1 @@ -35944,7 +35944,7 @@ tipp: Precisas de três variáveis: duas para os números e uma para o resultado tipp: Defines uma variável com uma instrução como \`int numero1 = 4\`. Na saída escreves o nome da variável sem aspas. lösung: aufgabe-summe-loesung.visustruct ::: -`,yv=`--- +`,vv=`--- titel: Sortear quem limpa o quadro nach: 15 stufe: 2 @@ -35981,7 +35981,7 @@ lösung: aufgabe-tafeldienst-loesung.visustruct ::: > Com \`int sorteado = (int) (Math.random() * 5) + 1\` também podes deixar o acaso sortear o número. Mas para a verificação automática precisamos de uma entrada fixa. -`,vv=`--- +`,wv=`--- titel: Calculadora nach: 10 stufe: 2 @@ -36017,7 +36017,7 @@ tipp: O operador é um texto. Lês com \`String operador = scanner.next();\`. tipp: \`switch (operador) { case "+" -> { … } … default -> { … } }\`. Com textos, os casos ficam entre aspas. lösung: aufgabe-rechner-loesung.visustruct ::: -`,wv=`--- +`,zv=`--- titel: Menu de aluguer nach: 18 stufe: 2 @@ -36052,7 +36052,7 @@ tipp: \`while (true) { … }\` corre sem fim até aparecer um \`break;\`. tipp: Em Java usa aqui \`if\`/\`else if\` em vez de \`switch\`: um \`break;\` dentro de um \`switch\` só sai do \`switch\`, não do ciclo. \`if (escolha == 0) { System.out.println("Adeus"); break; } else if (escolha == 1) { … }\`. lösung: aufgabe-verleih-java-loesung.visustruct ::: -`,zv=`--- +`,Iv=`--- titel: Treino de vocabulário nach: 27 stufe: 3 @@ -36087,7 +36087,7 @@ tipp: Salta a linha de cabeçalho. No ciclo, divide cada linha com \`split(";")\ tipp: Os textos comparam-se com \`resposta.equals(partes[1])\`, não com \`==\`. Conta com \`int certas = 0;\` e \`int contagem = 0;\` antes do ciclo. lösung: aufgabe-vokabeln-loesung.visustruct ::: -`,Iv=`--- +`,kv=`--- titel: Maior de idade? nach: 8 stufe: 1 @@ -36123,7 +36123,7 @@ tipp: Lê a idade com \`int idade = scanner.nextInt();\`. tipp: \`if (idade >= 18) { … } else { … }\`, com um \`System.out.println(…)\` em cada ramo. lösung: aufgabe-volljaehrig-loesung.visustruct ::: -`,kv=`--- +`,Sv=`--- titel: Lançar o dado com MVC nach: 40 stufe: 3 @@ -36161,7 +36161,7 @@ Extra: um botão **Novo jogo** põe tudo no início. O método para isso pertenc ::: ludwig Lembra-te da regra da lição 40: no model não há um único \`JLabel\`. Se mudares o tamanho da letra ao lançar, isso pertence à view. ::: -`,Sv=`--- +`,_v=`--- titel: Duplicar um número nach: 2 stufe: 1 @@ -36177,7 +36177,7 @@ tipp: Duplicar quer dizer: vezes 2. Guardas o resultado outra vez na mesma vari tipp: \`numero = numero * 2\` calcula com o valor antigo e volta a guardar o resultado em \`numero\`. Juntas texto e uma variável com \`+\`. lösung: aufgabe-verdoppeln-loesung.visustruct ::: -`,_v=`--- +`,Tv=`--- titel: Der mBot2 bereich: VisuBot kurz: Lerne den Roboter kennen, den du gleich programmierst. @@ -36492,7 +36492,7 @@ Ist der mBot2 verbunden, erscheint unter der Welt **🔧 mBot2 testen**. Klapp e - Ich kann den echten mBot2 per USB-C verbinden und wieder trennen. → Den echten mBot2 verbinden - Ich kann prüfen, ob alle Sensoren und Aktoren funktionieren. → Den mBot2 testen ::: -`,Tv=`--- +`,Ov=`--- titel: Das Quadrat bereich: VisuBot kurz: Vom langen Struktogramm zur dreifach verschachtelten Schleife. @@ -36616,7 +36616,7 @@ Das Programm bleibt gespeichert, auch wenn du den mBot2 aus- und wieder einschal - Ich kann drei Schleifen ineinander schachteln. → Vier Quadrate - Ich kann mein Programm auf den mBot2 übertragen und ohne Kabel mit Taste A starten. → Ohne Kabel fahren ::: -`,Ov='---\ntitel: Variablen und Ausgabe\nbereich: VisuBot\nkurz: Werte in Variablen speichern, den mBot2 damit fahren lassen und Ergebnisse ausgeben.\n---\n\n## Eine Variable für die Seite\n\nMit `mbot.forward(30)` fährt der mBot2 30 cm am Stück. Fährst du damit ein Quadrat ohne Schleife, steht die 30 aber viermal im Programm. Soll das Quadrat größer werden, musst du sie an vier Stellen ändern. Besser ist es, die Seitenlänge **einmal** zu speichern und dann überall zu benutzen.\n\nDafür gibt es **Variablen**. Eine Variable ist ein Kästchen mit einem Namen, in dem ein Wert liegt:\n\n```java\nint seite = 30;\nmbot.forward(seite);\n```\n\n- `int` ist der **Datentyp**: eine ganze Zahl.\n- `seite` ist der **Name**. Du darfst ihn selbst wählen.\n- `30` ist der **Wert**. Das `=` legt ihn in das Kästchen.\n\nWo danach `seite` steht, setzt der Computer den Wert ein. `mbot.forward(seite)` fährt also 30 cm.\n\n::: übung vb-variable-seite\ntitel: Quadrat mit Variable\nauftrag: Lege in einer Anweisung die Variable `int seite = 30` an. Danach fährt der mBot2 ein Quadrat: viermal `seite` Zentimeter vor und nach rechts drehen.\nfahrt: 4 x (forward 30, turnRight)\nbraucht: forSchleife\ntipp: Die erste Anweisung ist `int seite = 30`. Darunter kommt eine For-Schleife, die viermal läuft.\ntipp: In der Schleife stehen `mbot.forward(seite)` und `mbot.turnRight()`.\nlösung: vb-variable-seite-loesung.visustruct\n:::\n\n> Ändere jetzt nur die 30 in eine 60 und starte die Simulation. Das ganze Quadrat wird doppelt so groß.\n\n## Welche Datentypen gibt es?\n\nJede Variable hat einen Datentyp. Er legt fest, welche Werte hineinpassen:\n\n| Datentyp | Was passt hinein? | Beispiel |\n|---|---|---|\n| `int` | ganze Zahlen | `int seite = 30;` |\n| `double` | Kommazahlen, mit Punkt geschrieben | `double tempo = 1.5;` |\n| `String` | Text in Anführungszeichen | `String name = "Visu";` |\n| `boolean` | wahr oder falsch | `boolean fertig = false;` |\n\nMit Variablen kannst du auch rechnen: `int strecke = 4 * seite;` rechnet die ganze Strecke des Quadrats aus.\n\n## Jetzt in Java: Rechteck\n\nEin Rechteck hat zwei verschiedene Seiten. Also brauchst du zwei Variablen.\n\n::: übung vb-java-rechteck\ntitel: Rechteck mit Variablen\ncode: java\nauftrag: Schreibe in Java: Lege `int laenge = 60` und `int breite = 30` an. Der mBot2 fährt ein Rechteck: Länge, rechts drehen, Breite, rechts drehen, und das zweimal.\nfahrt: 2 x (forward 60, turnRight, forward 30, turnRight)\nbraucht: forSchleife\ntipp: Zwei Variablen oben: `int laenge = 60;` und `int breite = 30;`. Darunter eine For-Schleife, die zweimal läuft.\ntipp: In der Schleife: `mbot.forward(laenge);`, `mbot.turnRight();`, `mbot.forward(breite);`, `mbot.turnRight();`\nlösung: vb-java-rechteck-loesung.visustruct\n:::\n\n## Jetzt ohne Roboter: Ausgabe\n\nNicht jedes Ergebnis muss der Roboter fahren. Mit `System.out.println(…)` gibt ein Java-Programm Text in der [Konsole](#zeige-konsole) aus. Mit `+` hängst du Text und Werte aneinander:\n\n```java\nint seite = 30;\nint strecke = 4 * seite;\nSystem.out.println("Strecke: " + strecke + " cm");\n```\n\nDie Konsole zeigt dann **Strecke: 120 cm**.\n\n::: übung vb-ohne-strecke\ntitel: Wie weit fährt er?\ncode: java\nauftrag: Ein Rechteck ist 60 cm lang und 30 cm breit. Lege `laenge` und `breite` als Variablen an. Berechne in einer Variablen `strecke`, wie weit der mBot2 einmal ganz herum fährt, und gib **Strecke: 180 cm** aus. Ganz ohne `mbot`!\ntest: - -> Strecke: 180 cm\nbraucht: anweisung\ntipp: Einmal herum sind zweimal die Länge und zweimal die Breite.\ntipp: `int strecke = 2 * laenge + 2 * breite;` und dann `System.out.println("Strecke: " + strecke + " cm");`\nlösung: vb-ohne-strecke-loesung.visustruct\n:::\n\n::: quiz\n? Was fährt `mbot.forward(seite)`, wenn vorher `int seite = 40;` steht?\n- [ ] 4 cm\n- [x] 40 cm\n- [ ] gar nichts, `seite` ist kein Befehl\n> Wo `seite` steht, setzt Java den Wert 40 ein.\n? Welcher Datentyp passt zu `"Visu"`?\n- [ ] `int`\n- [ ] `double`\n- [x] `String`\n> Text in Anführungszeichen ist ein `String`.\n? Was gibt `System.out.println("Seite: " + 30);` aus?\n- [x] Seite: 30\n- [ ] "Seite: " + 30\n- [ ] 30\n> Das `+` hängt den Text und die Zahl aneinander.\n:::\n\n::: checkliste\n- Ich kann eine Variable anlegen und benutzen. → Eine Variable für die Seite\n- Ich kenne die Datentypen `int`, `double`, `String` und `boolean`. → Welche Datentypen gibt es?\n- Ich kann mit zwei Variablen ein Rechteck in Java fahren. → Jetzt in Java: Rechteck\n- Ich kann mit `System.out.println` etwas ausgeben. → Jetzt ohne Roboter: Ausgabe\n:::\n',Av=`--- +`,Av='---\ntitel: Variablen und Ausgabe\nbereich: VisuBot\nkurz: Werte in Variablen speichern, den mBot2 damit fahren lassen und Ergebnisse ausgeben.\n---\n\n## Eine Variable für die Seite\n\nMit `mbot.forward(30)` fährt der mBot2 30 cm am Stück. Fährst du damit ein Quadrat ohne Schleife, steht die 30 aber viermal im Programm. Soll das Quadrat größer werden, musst du sie an vier Stellen ändern. Besser ist es, die Seitenlänge **einmal** zu speichern und dann überall zu benutzen.\n\nDafür gibt es **Variablen**. Eine Variable ist ein Kästchen mit einem Namen, in dem ein Wert liegt:\n\n```java\nint seite = 30;\nmbot.forward(seite);\n```\n\n- `int` ist der **Datentyp**: eine ganze Zahl.\n- `seite` ist der **Name**. Du darfst ihn selbst wählen.\n- `30` ist der **Wert**. Das `=` legt ihn in das Kästchen.\n\nWo danach `seite` steht, setzt der Computer den Wert ein. `mbot.forward(seite)` fährt also 30 cm.\n\n::: übung vb-variable-seite\ntitel: Quadrat mit Variable\nauftrag: Lege in einer Anweisung die Variable `int seite = 30` an. Danach fährt der mBot2 ein Quadrat: viermal `seite` Zentimeter vor und nach rechts drehen.\nfahrt: 4 x (forward 30, turnRight)\nbraucht: forSchleife\ntipp: Die erste Anweisung ist `int seite = 30`. Darunter kommt eine For-Schleife, die viermal läuft.\ntipp: In der Schleife stehen `mbot.forward(seite)` und `mbot.turnRight()`.\nlösung: vb-variable-seite-loesung.visustruct\n:::\n\n> Ändere jetzt nur die 30 in eine 60 und starte die Simulation. Das ganze Quadrat wird doppelt so groß.\n\n## Welche Datentypen gibt es?\n\nJede Variable hat einen Datentyp. Er legt fest, welche Werte hineinpassen:\n\n| Datentyp | Was passt hinein? | Beispiel |\n|---|---|---|\n| `int` | ganze Zahlen | `int seite = 30;` |\n| `double` | Kommazahlen, mit Punkt geschrieben | `double tempo = 1.5;` |\n| `String` | Text in Anführungszeichen | `String name = "Visu";` |\n| `boolean` | wahr oder falsch | `boolean fertig = false;` |\n\nMit Variablen kannst du auch rechnen: `int strecke = 4 * seite;` rechnet die ganze Strecke des Quadrats aus.\n\n## Jetzt in Java: Rechteck\n\nEin Rechteck hat zwei verschiedene Seiten. Also brauchst du zwei Variablen.\n\n::: übung vb-java-rechteck\ntitel: Rechteck mit Variablen\ncode: java\nauftrag: Schreibe in Java: Lege `int laenge = 60` und `int breite = 30` an. Der mBot2 fährt ein Rechteck: Länge, rechts drehen, Breite, rechts drehen, und das zweimal.\nfahrt: 2 x (forward 60, turnRight, forward 30, turnRight)\nbraucht: forSchleife\ntipp: Zwei Variablen oben: `int laenge = 60;` und `int breite = 30;`. Darunter eine For-Schleife, die zweimal läuft.\ntipp: In der Schleife: `mbot.forward(laenge);`, `mbot.turnRight();`, `mbot.forward(breite);`, `mbot.turnRight();`\nlösung: vb-java-rechteck-loesung.visustruct\n:::\n\n## Jetzt ohne Roboter: Ausgabe\n\nNicht jedes Ergebnis muss der Roboter fahren. Mit `System.out.println(…)` gibt ein Java-Programm Text in der [Konsole](#zeige-konsole) aus. Mit `+` hängst du Text und Werte aneinander:\n\n```java\nint seite = 30;\nint strecke = 4 * seite;\nSystem.out.println("Strecke: " + strecke + " cm");\n```\n\nDie Konsole zeigt dann **Strecke: 120 cm**.\n\n::: übung vb-ohne-strecke\ntitel: Wie weit fährt er?\ncode: java\nauftrag: Ein Rechteck ist 60 cm lang und 30 cm breit. Lege `laenge` und `breite` als Variablen an. Berechne in einer Variablen `strecke`, wie weit der mBot2 einmal ganz herum fährt, und gib **Strecke: 180 cm** aus. Ganz ohne `mbot`!\ntest: - -> Strecke: 180 cm\nbraucht: anweisung\ntipp: Einmal herum sind zweimal die Länge und zweimal die Breite.\ntipp: `int strecke = 2 * laenge + 2 * breite;` und dann `System.out.println("Strecke: " + strecke + " cm");`\nlösung: vb-ohne-strecke-loesung.visustruct\n:::\n\n::: quiz\n? Was fährt `mbot.forward(seite)`, wenn vorher `int seite = 40;` steht?\n- [ ] 4 cm\n- [x] 40 cm\n- [ ] gar nichts, `seite` ist kein Befehl\n> Wo `seite` steht, setzt Java den Wert 40 ein.\n? Welcher Datentyp passt zu `"Visu"`?\n- [ ] `int`\n- [ ] `double`\n- [x] `String`\n> Text in Anführungszeichen ist ein `String`.\n? Was gibt `System.out.println("Seite: " + 30);` aus?\n- [x] Seite: 30\n- [ ] "Seite: " + 30\n- [ ] 30\n> Das `+` hängt den Text und die Zahl aneinander.\n:::\n\n::: checkliste\n- Ich kann eine Variable anlegen und benutzen. → Eine Variable für die Seite\n- Ich kenne die Datentypen `int`, `double`, `String` und `boolean`. → Welche Datentypen gibt es?\n- Ich kann mit zwei Variablen ein Rechteck in Java fahren. → Jetzt in Java: Rechteck\n- Ich kann mit `System.out.println` etwas ausgeben. → Jetzt ohne Roboter: Ausgabe\n:::\n',Pv=`--- titel: Sensoren abfragen bereich: VisuBot kurz: Der mBot2 misst etwas, und dein Programm entscheidet. @@ -36685,7 +36685,7 @@ lösung: vb-wand-vorn-loesung.visustruct - Ich kenne den Unterschied zwischen Befehl und Sensor. → Befehle und Sensoren - Ich kann einen Sensor in eine Bedingung einbauen. → Wand vorn? ::: -`,Pv=`--- +`,jv=`--- titel: Bis zur Wand bereich: VisuBot kurz: Der mBot2 misst den Abstand und hält rechtzeitig an. @@ -36760,7 +36760,7 @@ lösung: vb-bis-ziel-loesung.visustruct - Ich weiß, wann ich eine While-Schleife statt einer For-Schleife nehme. → Drei Welten, ein Programm - Ich kann mit dem Liniensensor ein Ziel finden. → Bis zum Ziel ::: -`,jv=`--- +`,Cv=`--- titel: Der Ultraschallsensor bereich: VisuBot kurz: Abstand messen, Abstand halten und das Ganze in Java. @@ -36846,7 +36846,7 @@ lösung: vb-java-wand-piep-loesung.visustruct - Ich kann zwei Verzweigungen ineinander bauen. → Abstand halten im Struktogramm - Ich kann eine While-Schleife mit dem Abstand in Java schreiben. → Jetzt in Java ::: -`,Cv=`--- +`,Bv=`--- titel: Der Liniensensor bereich: VisuBot kurz: Dunkle Linien auf dem Boden erkennen und nicht vom Tisch fallen. @@ -36928,7 +36928,7 @@ lösung: vb-java-rand-loesung.visustruct - Ich kann bis zu einer Linie fahren. → Am Rand umkehren im Struktogramm - Ich kann in Java mit einer Variable Schritte zählen. → Jetzt in Java: hin und zurück ::: -`,Bv=`--- +`,Dv=`--- titel: Farben erkennen bereich: VisuBot kurz: Der Quad-RGB-Sensor sagt, auf welcher Farbe der mBot2 steht. @@ -37006,7 +37006,7 @@ lösung: vb-java-blau-gruen-loesung.visustruct - Ich kann mit \`!\` eine Bedingung umdrehen. → Fahre bis Rot im Struktogramm - Ich kann eine Verzweigung in eine Schleife schreiben. → Jetzt in Java: bei Grün piepen ::: -`,Dv=`--- +`,Zv=`--- titel: Fallauswahl mit Farben bereich: VisuBot kurz: Je nach Farbe oder Linie etwas anderes tun, mit einer Fallauswahl statt vieler Verzweigungen. @@ -37116,7 +37116,7 @@ lösung: vb-ohne-noten-loesung.visustruct - Ich kann eine Fallauswahl mit Zahlen in Java schreiben. → Jetzt in Java: Linienmuster - Ich kann eine Zahl einlesen und je nach Wert etwas ausgeben. → Jetzt ohne Roboter: Noten in Worten ::: -`,Zv=`--- +`,Mv=`--- titel: Tasten und Joystick bereich: VisuBot kurz: Der mBot2 wartet auf dich und lässt sich fernsteuern. @@ -37193,7 +37193,7 @@ lösung: vb-java-joystick-loesung.visustruct - Ich kann auf eine Taste warten. → Warten auf Taste A im Struktogramm - Ich kann den mBot2 mit dem Joystick steuern. → Jetzt in Java: Fernsteuerung ::: -`,Mv=`--- +`,Lv=`--- titel: Der Lichtsensor bereich: VisuBot kurz: Hell oder dunkel? Der mBot2 wird zum Nachtlicht. @@ -37261,7 +37261,7 @@ lösung: vb-java-nachtlicht-ton-loesung.visustruct - Ich kann mit einer Verzweigung die LEDs schalten. → Nachtlicht im Struktogramm - Ich kann mehrere Befehle in einen Zweig schreiben. → Jetzt in Java: Nachtlicht mit Ton ::: -`,Lv=`--- +`,Wv=`--- titel: Das Mikrofon bereich: VisuBot kurz: Klatschen zum Losfahren und eine Lärmampel für das Klassenzimmer. @@ -37327,7 +37327,7 @@ Lautstärke misst man eigentlich in **Dezibel** (dB). Flüstern hat etwa 30 dB, - Ich kann warten, bis etwas passiert. → Klatschen zum Losfahren im Struktogramm - Ich kann eine Lärmampel in Java schreiben. → Jetzt in Java: Lärmampel ::: -`,Wv=`--- +`,Ev=`--- titel: Der Lagesensor bereich: VisuBot kurz: Neigung messen und Schütteln erkennen. @@ -37401,7 +37401,7 @@ lösung: vb-java-wasserwaage-loesung.visustruct - Ich kann zwei Bedingungen mit „oder“ verbinden. → Schräglage-Warnung im Struktogramm - Ich kann mehrere Bedingungen mit „und“ verbinden. → Jetzt in Java: Wasserwaage ::: -`,Ev=`--- +`,Nv=`--- titel: Die LEDs bereich: VisuBot kurz: Farben mischen, eine Ampel bauen und blinken lassen. @@ -37476,7 +37476,7 @@ lösung: vb-java-blinken-loesung.visustruct - Ich kann Farben mit Pausen nacheinander zeigen. → Ampel im Struktogramm - Ich kann die LEDs in Java blinken lassen. → Jetzt in Java: Blaulicht ::: -`,Nv=`--- +`,Fv=`--- titel: Einzelne LEDs bereich: VisuBot kurz: Jede der fünf LEDs bekommt ihre eigene Farbe, bis zum Lauflicht. @@ -37551,7 +37551,7 @@ lösung: vb-java-lauflicht-loesung.visustruct - Ich kann einzelne LEDs in verschiedenen Farben leuchten lassen. → Drei Lichter im Struktogramm - Ich kann mit einer Schleife ein Lauflicht bauen. → Jetzt in Java: Lauflicht ::: -`,Fv=`--- +`,Jv=`--- titel: Der Lautsprecher bereich: VisuBot kurz: Töne, eine Tonleiter und eine Sirene. @@ -37642,7 +37642,7 @@ Der mBot2 kann auch fröhlich, traurig oder müde sein. Mit **Gefühl zeigen** ( - Ich kann in Java mit der Zählvariable rechnen. → Jetzt in Java: immer höher - Ich kann den mBot2 ein Gefühl zeigen lassen. → Gefühle zeigen ::: -`,Jv='---\ntitel: Arrays und Melodien\nbereich: VisuBot\nkurz: Viele Werte in einem Array speichern und mit einer Schleife abarbeiten.\n---\n\n## Eine Melodie als Array\n\nEine Melodie ist eine Reihe von Tönen. Statt fünf Variablen `ton1`, `ton2`, … nimmst du ein **Array**. Ein Array ist eine Reihe von Fächern unter **einem** Namen:\n\n```java\nint[] toene = {262, 294, 330, 349, 392};\n```\n\n- `int[]` heißt: ein Array aus ganzen Zahlen.\n- Die Fächer sind von **0** an nummeriert. `toene[0]` ist 262, `toene[4]` ist 392.\n- `toene.length` sagt, wie viele Fächer es gibt, hier 5.\n\nEine For-Schleife mit `i` von 0 bis `toene.length - 1` kommt so an jedes Fach.\n\n::: übung vb-melodie\ntitel: Melodie\nauftrag: Lege ein Array `toene` mit den Tonhöhen 262, 294, 330, 349 und 392 an. Eine For-Schleife spielt sie nacheinander, jeden 300 Millisekunden lang.\nbefehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300\nbraucht: forSchleife\ntipp: `int[] toene = {262, 294, 330, 349, 392}` legt das Array an.\ntipp: Die Schleife läuft von `i = 0` bis `i < toene.length`. Darin steht `mbot.playTone(toene[i], 300)`.\nlösung: vb-melodie-loesung.visustruct\n:::\n\n> Willst du eine andere Melodie, änderst du nur das Array. Die Schleife bleibt gleich.\n\n## Jetzt in Java: Regenbogen\n\nDie fünf LEDs haben die Nummern 0 bis 4, genau wie die Fächer eines Arrays mit fünf Werten. Ein Array kann auch Texte enthalten: `String[] farben = {"rot", "gelb"};`. LED `i` bekommt dann die Farbe aus Fach `i`: `mbot.led(i).setColor(farben[i])`.\n\n::: übung vb-farben\ntitel: Regenbogen\ncode: java\nauftrag: Schreibe in Java: Lege ein Array `farben` mit den Texten `"rot"`, `"gelb"`, `"grün"`, `"blau"` und `"lila"` an. Eine For-Schleife gibt jeder LED `i` die Farbe aus `farben[i]`.\nbefehle: ledColor 0 "rot", ledColor 1 "gelb", ledColor 2 "grün", ledColor 3 "blau", ledColor 4 "lila"\nbraucht: forSchleife\ntipp: `String[] farben = {"rot", "gelb", "grün", "blau", "lila"};` legt das Array an.\ntipp: `for (int i = 0; i < farben.length; i++) { mbot.led(i).setColor(farben[i]); }`\nlösung: vb-farben-loesung.visustruct\n:::\n\n## Jetzt ohne Roboter: Summe der Noten\n\nMit einer Schleife kannst du auch alle Werte eines Arrays zusammenzählen. Dafür brauchst du eine Variable, die mit 0 anfängt und in jedem Durchgang wächst:\n\n```java\nint summe = 0;\nfor (int i = 0; i < noten.length; i++) {\n summe = summe + noten[i];\n}\n```\n\n::: übung vb-ohne-summe\ntitel: Summe der Noten\ncode: java\nauftrag: Lege `int[] noten = {2, 1, 3, 2}` an. Zähle in einer Schleife alle Noten zusammen und gib danach **Summe: 8** und in einer zweiten Zeile **Anzahl: 4** aus. Die Anzahl liefert `noten.length`. Ganz ohne `mbot`!\ntest: - -> Summe: 8 | Anzahl: 4\nbraucht: forSchleife\ntipp: Vor der Schleife `int summe = 0;`, in der Schleife `summe = summe + noten[i];`.\ntipp: Nach der Schleife `System.out.println("Summe: " + summe);` und `System.out.println("Anzahl: " + noten.length);`.\nlösung: vb-ohne-summe-loesung.visustruct\n:::\n\n::: quiz\n? Was ist `toene[1]`, wenn `int[] toene = {262, 294, 330};`?\n- [ ] 262\n- [x] 294\n- [ ] 1\n> Die Fächer zählen ab 0. Fach 1 ist also das zweite.\n? Wie viele Fächer hat `{262, 294, 330}`, also was ist `toene.length`?\n- [ ] 2\n- [x] 3\n- [ ] 330\n> `length` zählt die Fächer, hier drei. Das letzte Fach hat deshalb die Nummer 2.\n:::\n\n::: checkliste\n- Ich kann ein Array anlegen und mit einer Schleife abspielen. → Eine Melodie als Array\n- Ich kann ein Array mit Texten in Java benutzen. → Jetzt in Java: Regenbogen\n- Ich kann alle Werte eines Arrays zusammenzählen. → Jetzt ohne Roboter: Summe der Noten\n:::\n',Rv=`--- +`,Rv='---\ntitel: Arrays und Melodien\nbereich: VisuBot\nkurz: Viele Werte in einem Array speichern und mit einer Schleife abarbeiten.\n---\n\n## Eine Melodie als Array\n\nEine Melodie ist eine Reihe von Tönen. Statt fünf Variablen `ton1`, `ton2`, … nimmst du ein **Array**. Ein Array ist eine Reihe von Fächern unter **einem** Namen:\n\n```java\nint[] toene = {262, 294, 330, 349, 392};\n```\n\n- `int[]` heißt: ein Array aus ganzen Zahlen.\n- Die Fächer sind von **0** an nummeriert. `toene[0]` ist 262, `toene[4]` ist 392.\n- `toene.length` sagt, wie viele Fächer es gibt, hier 5.\n\nEine For-Schleife mit `i` von 0 bis `toene.length - 1` kommt so an jedes Fach.\n\n::: übung vb-melodie\ntitel: Melodie\nauftrag: Lege ein Array `toene` mit den Tonhöhen 262, 294, 330, 349 und 392 an. Eine For-Schleife spielt sie nacheinander, jeden 300 Millisekunden lang.\nbefehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300\nbraucht: forSchleife\ntipp: `int[] toene = {262, 294, 330, 349, 392}` legt das Array an.\ntipp: Die Schleife läuft von `i = 0` bis `i < toene.length`. Darin steht `mbot.playTone(toene[i], 300)`.\nlösung: vb-melodie-loesung.visustruct\n:::\n\n> Willst du eine andere Melodie, änderst du nur das Array. Die Schleife bleibt gleich.\n\n## Jetzt in Java: Regenbogen\n\nDie fünf LEDs haben die Nummern 0 bis 4, genau wie die Fächer eines Arrays mit fünf Werten. Ein Array kann auch Texte enthalten: `String[] farben = {"rot", "gelb"};`. LED `i` bekommt dann die Farbe aus Fach `i`: `mbot.led(i).setColor(farben[i])`.\n\n::: übung vb-farben\ntitel: Regenbogen\ncode: java\nauftrag: Schreibe in Java: Lege ein Array `farben` mit den Texten `"rot"`, `"gelb"`, `"grün"`, `"blau"` und `"lila"` an. Eine For-Schleife gibt jeder LED `i` die Farbe aus `farben[i]`.\nbefehle: ledColor 0 "rot", ledColor 1 "gelb", ledColor 2 "grün", ledColor 3 "blau", ledColor 4 "lila"\nbraucht: forSchleife\ntipp: `String[] farben = {"rot", "gelb", "grün", "blau", "lila"};` legt das Array an.\ntipp: `for (int i = 0; i < farben.length; i++) { mbot.led(i).setColor(farben[i]); }`\nlösung: vb-farben-loesung.visustruct\n:::\n\n## Jetzt ohne Roboter: Summe der Noten\n\nMit einer Schleife kannst du auch alle Werte eines Arrays zusammenzählen. Dafür brauchst du eine Variable, die mit 0 anfängt und in jedem Durchgang wächst:\n\n```java\nint summe = 0;\nfor (int i = 0; i < noten.length; i++) {\n summe = summe + noten[i];\n}\n```\n\n::: übung vb-ohne-summe\ntitel: Summe der Noten\ncode: java\nauftrag: Lege `int[] noten = {2, 1, 3, 2}` an. Zähle in einer Schleife alle Noten zusammen und gib danach **Summe: 8** und in einer zweiten Zeile **Anzahl: 4** aus. Die Anzahl liefert `noten.length`. Ganz ohne `mbot`!\ntest: - -> Summe: 8 | Anzahl: 4\nbraucht: forSchleife\ntipp: Vor der Schleife `int summe = 0;`, in der Schleife `summe = summe + noten[i];`.\ntipp: Nach der Schleife `System.out.println("Summe: " + summe);` und `System.out.println("Anzahl: " + noten.length);`.\nlösung: vb-ohne-summe-loesung.visustruct\n:::\n\n::: quiz\n? Was ist `toene[1]`, wenn `int[] toene = {262, 294, 330};`?\n- [ ] 262\n- [x] 294\n- [ ] 1\n> Die Fächer zählen ab 0. Fach 1 ist also das zweite.\n? Wie viele Fächer hat `{262, 294, 330}`, also was ist `toene.length`?\n- [ ] 2\n- [x] 3\n- [ ] 330\n> `length` zählt die Fächer, hier drei. Das letzte Fach hat deshalb die Nummer 2.\n:::\n\n::: checkliste\n- Ich kann ein Array anlegen und mit einer Schleife abspielen. → Eine Melodie als Array\n- Ich kann ein Array mit Texten in Java benutzen. → Jetzt in Java: Regenbogen\n- Ich kann alle Werte eines Arrays zusammenzählen. → Jetzt ohne Roboter: Summe der Noten\n:::\n',Gv=`--- titel: Der Bildschirm bereich: VisuBot kurz: Text, Zahlen und Messwerte auf dem CyberPi anzeigen. @@ -37717,7 +37717,7 @@ lösung: vb-java-countdown-loesung.visustruct - Ich kann Zahlen und Messwerte anzeigen. → Zahlen und Messwerte - Ich kann einen Countdown in Java schreiben. → Jetzt in Java: Countdown ::: -`,Gv=`--- +`,Hv=`--- titel: Zeichenketten bereich: VisuBot kurz: Mit Texten rechnen, Buchstaben herausholen und auf dem Bildschirm zeigen. @@ -37799,7 +37799,7 @@ lösung: vb-ohne-rueckwaerts-loesung.visustruct - Ich kann Texte und Zahlen mit \`+\` verbinden. → Jetzt in Java: Text und Länge - Ich kann mit \`charAt(…)\` einzelne Zeichen holen. → Jetzt ohne Roboter: rückwärts lesen ::: -`,Hv=`--- +`,Vv=`--- titel: Motoren und Geschwindigkeit bereich: VisuBot kurz: Gas geben, lenken und einer Linie folgen. @@ -37889,7 +37889,7 @@ lösung: vb-java-linienfolger-loesung.visustruct - Ich kann fahren, bis ein Sensor etwas meldet. → Gas geben bis zur Wand im Struktogramm - Ich kann einen Linienfolger in Java schreiben. → Jetzt in Java: Linienfolger ::: -`,Vv=`--- +`,Qv=`--- titel: Stoppuhr und Akku bereich: VisuBot kurz: Zeit messen und den Akku im Blick behalten. @@ -37968,7 +37968,7 @@ lösung: vb-java-akku-loesung.visustruct - Ich kann eine bestimmte Zeit lang fahren. → Zwei Sekunden fahren im Struktogramm - Ich kann den Akkustand anzeigen. → Jetzt in Java: Akku-Anzeige ::: -`,Qv=`--- +`,qv=`--- titel: Eigene Methoden bereich: VisuBot kurz: Eigene Befehle mit Parametern und Rückgabewert schreiben und aufrufen. @@ -38058,7 +38058,7 @@ unterprogramm: vb-ohne-quadratzahl-unterprogramm-loesung.visustruct - Ich weiß, wie Methoden in Java aussehen. → Methoden in Java - Ich kann eine Methode mit Rückgabewert schreiben. → Jetzt ohne Roboter: Methode mit Rückgabe ::: -`,qv=`## 🤖 mBot2-Befehle +`,Uv=`## 🤖 mBot2-Befehle Ein Befehl sagt dem mBot2, was er **tun** soll. Jeder Befehl beginnt mit \`mbot.\` und endet mit Klammern. In die Klammern schreibst du oft eine Zahl. @@ -38210,7 +38210,7 @@ Mit **🔌 mBot2** neben „Simulation starten“ verbindest du den echten Robot ### Ohne Kabel fahren Mit **⬆ Übertragen** speicherst du dein Programm fest auf dem mBot2. Danach Kabel ab, mBot2 an den Start und **Taste A** drücken: Er fährt dein Programm allein. Es bleibt gespeichert, bis du ein neues überträgst. Eingaben mit der Tastatur gehen am mBot2 nicht. -`,Uv=`--- +`,$v=`--- titel: The mBot2 bereich: VisuBot kurz: Get to know the robot you are about to program. @@ -38525,7 +38525,7 @@ If a value does not change although you do something, something is wrong. Then t - I can connect the real mBot2 with USB-C and disconnect it again. → Connecting the real mBot2 - I can check that all sensors and actuators work. → Testing the mBot2 ::: -`,$v=`--- +`,Yv=`--- titel: The square bereich: VisuBot kurz: From a long structure chart to a triple nested loop. @@ -38649,7 +38649,7 @@ The program stays saved, even when you switch the mBot2 off and on again. Only t - I can nest three loops. → Four squares - I can upload my program to the mBot2 and start it with button A without a cable. → Driving without a cable ::: -`,Yv='---\ntitel: Variables and output\nbereich: VisuBot\nkurz: Store values in variables, drive the mBot2 with them and print results.\n---\n\n## A variable for the side\n\nWith `mbot.forward(30)` the mBot2 drives 30 cm in one go. If you drive a square with it and no loop, the 30 appears four times in your program. To make the square bigger, you have to change it in four places. It is better to store the side length **once** and then use it everywhere.\n\nThat is what **variables** are for. A variable is a box with a name that holds a value:\n\n```java\nint side = 30;\nmbot.forward(side);\n```\n\n- `int` is the **data type**: a whole number.\n- `side` is the **name**. You may choose it yourself.\n- `30` is the **value**. The `=` puts it into the box.\n\nWherever `side` appears afterwards, the computer uses its value. So `mbot.forward(side)` drives 30 cm.\n\n::: übung vb-variable-seite\ntitel: Square with a variable\nauftrag: In one statement, create the variable `int side = 30`. After that the mBot2 drives a square: four times `side` centimetres forward and turn right.\nfahrt: 4 x (forward 30, turnRight)\nbraucht: forSchleife\ntipp: The first statement is `int side = 30`. Below it comes a for loop that runs four times.\ntipp: Inside the loop are `mbot.forward(side)` and `mbot.turnRight()`.\nlösung: vb-variable-seite-loesung.visustruct\n:::\n\n> Now change only the 30 to 60 and start the simulation. The whole square becomes twice as big.\n\n## Which data types are there?\n\nEvery variable has a data type. It decides which values fit inside:\n\n| Data type | What fits inside? | Example |\n|---|---|---|\n| `int` | whole numbers | `int side = 30;` |\n| `double` | decimal numbers, written with a point | `double speed = 1.5;` |\n| `String` | text in quotation marks | `String name = "Visu";` |\n| `boolean` | true or false | `boolean done = false;` |\n\nYou can also calculate with variables: `int distance = 4 * side;` works out the whole distance around the square.\n\n## Now in Java: rectangle\n\nA rectangle has two different sides. So you need two variables.\n\n::: übung vb-java-rechteck\ntitel: Rectangle with variables\ncode: java\nauftrag: Write in Java: create `int length = 60` and `int width = 30`. The mBot2 drives a rectangle: length, turn right, width, turn right, and all that twice.\nfahrt: 2 x (forward 60, turnRight, forward 30, turnRight)\nbraucht: forSchleife\ntipp: Two variables at the top: `int length = 60;` and `int width = 30;`. Below them a for loop that runs twice.\ntipp: Inside the loop: `mbot.forward(length);`, `mbot.turnRight();`, `mbot.forward(width);`, `mbot.turnRight();`\nlösung: vb-java-rechteck-loesung.visustruct\n:::\n\n## Now without the robot: output\n\nNot every result has to be driven by the robot. With `System.out.println(…)` a Java program prints text in the [console](#zeige-konsole). With `+` you join text and values:\n\n```java\nint side = 30;\nint distance = 4 * side;\nSystem.out.println("Distance: " + distance + " cm");\n```\n\nThe console then shows **Distance: 120 cm**.\n\n::: übung vb-ohne-strecke\ntitel: How far does it drive?\ncode: java\nauftrag: A rectangle is 60 cm long and 30 cm wide. Create `length` and `width` as variables. Calculate in a variable `distance` how far the mBot2 drives once all the way round, and print **Distance: 180 cm**. No `mbot` at all!\ntest: - -> Distance: 180 cm\nbraucht: anweisung\ntipp: Once round is twice the length plus twice the width.\ntipp: `int distance = 2 * length + 2 * width;` and then `System.out.println("Distance: " + distance + " cm");`\nlösung: vb-ohne-strecke-loesung.visustruct\n:::\n\n::: quiz\n? What does `mbot.forward(side)` drive if `int side = 40;` comes first?\n- [ ] 4 cm\n- [x] 40 cm\n- [ ] nothing, `side` is not a command\n> Wherever `side` appears, Java uses the value 40.\n? Which data type fits `"Visu"`?\n- [ ] `int`\n- [ ] `double`\n- [x] `String`\n> Text in quotation marks is a `String`.\n? What does `System.out.println("Side: " + 30);` print?\n- [x] Side: 30\n- [ ] "Side: " + 30\n- [ ] 30\n> The `+` joins the text and the number.\n:::\n\n::: checkliste\n- I can create and use a variable. → A variable for the side\n- I know the data types `int`, `double`, `String` and `boolean`. → Which data types are there?\n- I can drive a rectangle in Java with two variables. → Now in Java: rectangle\n- I can print something with `System.out.println`. → Now without the robot: output\n:::\n',Xv=`--- +`,Xv='---\ntitel: Variables and output\nbereich: VisuBot\nkurz: Store values in variables, drive the mBot2 with them and print results.\n---\n\n## A variable for the side\n\nWith `mbot.forward(30)` the mBot2 drives 30 cm in one go. If you drive a square with it and no loop, the 30 appears four times in your program. To make the square bigger, you have to change it in four places. It is better to store the side length **once** and then use it everywhere.\n\nThat is what **variables** are for. A variable is a box with a name that holds a value:\n\n```java\nint side = 30;\nmbot.forward(side);\n```\n\n- `int` is the **data type**: a whole number.\n- `side` is the **name**. You may choose it yourself.\n- `30` is the **value**. The `=` puts it into the box.\n\nWherever `side` appears afterwards, the computer uses its value. So `mbot.forward(side)` drives 30 cm.\n\n::: übung vb-variable-seite\ntitel: Square with a variable\nauftrag: In one statement, create the variable `int side = 30`. After that the mBot2 drives a square: four times `side` centimetres forward and turn right.\nfahrt: 4 x (forward 30, turnRight)\nbraucht: forSchleife\ntipp: The first statement is `int side = 30`. Below it comes a for loop that runs four times.\ntipp: Inside the loop are `mbot.forward(side)` and `mbot.turnRight()`.\nlösung: vb-variable-seite-loesung.visustruct\n:::\n\n> Now change only the 30 to 60 and start the simulation. The whole square becomes twice as big.\n\n## Which data types are there?\n\nEvery variable has a data type. It decides which values fit inside:\n\n| Data type | What fits inside? | Example |\n|---|---|---|\n| `int` | whole numbers | `int side = 30;` |\n| `double` | decimal numbers, written with a point | `double speed = 1.5;` |\n| `String` | text in quotation marks | `String name = "Visu";` |\n| `boolean` | true or false | `boolean done = false;` |\n\nYou can also calculate with variables: `int distance = 4 * side;` works out the whole distance around the square.\n\n## Now in Java: rectangle\n\nA rectangle has two different sides. So you need two variables.\n\n::: übung vb-java-rechteck\ntitel: Rectangle with variables\ncode: java\nauftrag: Write in Java: create `int length = 60` and `int width = 30`. The mBot2 drives a rectangle: length, turn right, width, turn right, and all that twice.\nfahrt: 2 x (forward 60, turnRight, forward 30, turnRight)\nbraucht: forSchleife\ntipp: Two variables at the top: `int length = 60;` and `int width = 30;`. Below them a for loop that runs twice.\ntipp: Inside the loop: `mbot.forward(length);`, `mbot.turnRight();`, `mbot.forward(width);`, `mbot.turnRight();`\nlösung: vb-java-rechteck-loesung.visustruct\n:::\n\n## Now without the robot: output\n\nNot every result has to be driven by the robot. With `System.out.println(…)` a Java program prints text in the [console](#zeige-konsole). With `+` you join text and values:\n\n```java\nint side = 30;\nint distance = 4 * side;\nSystem.out.println("Distance: " + distance + " cm");\n```\n\nThe console then shows **Distance: 120 cm**.\n\n::: übung vb-ohne-strecke\ntitel: How far does it drive?\ncode: java\nauftrag: A rectangle is 60 cm long and 30 cm wide. Create `length` and `width` as variables. Calculate in a variable `distance` how far the mBot2 drives once all the way round, and print **Distance: 180 cm**. No `mbot` at all!\ntest: - -> Distance: 180 cm\nbraucht: anweisung\ntipp: Once round is twice the length plus twice the width.\ntipp: `int distance = 2 * length + 2 * width;` and then `System.out.println("Distance: " + distance + " cm");`\nlösung: vb-ohne-strecke-loesung.visustruct\n:::\n\n::: quiz\n? What does `mbot.forward(side)` drive if `int side = 40;` comes first?\n- [ ] 4 cm\n- [x] 40 cm\n- [ ] nothing, `side` is not a command\n> Wherever `side` appears, Java uses the value 40.\n? Which data type fits `"Visu"`?\n- [ ] `int`\n- [ ] `double`\n- [x] `String`\n> Text in quotation marks is a `String`.\n? What does `System.out.println("Side: " + 30);` print?\n- [x] Side: 30\n- [ ] "Side: " + 30\n- [ ] 30\n> The `+` joins the text and the number.\n:::\n\n::: checkliste\n- I can create and use a variable. → A variable for the side\n- I know the data types `int`, `double`, `String` and `boolean`. → Which data types are there?\n- I can drive a rectangle in Java with two variables. → Now in Java: rectangle\n- I can print something with `System.out.println`. → Now without the robot: output\n:::\n',Kv=`--- titel: Reading sensors bereich: VisuBot kurz: The mBot2 measures something, and your program decides. @@ -38718,7 +38718,7 @@ lösung: vb-wand-vorn-loesung.visustruct - I know the difference between a command and a sensor. → Commands and sensors - I can build a sensor into a condition. → Wall ahead? ::: -`,Kv=`--- +`,e9=`--- titel: Up to the wall bereich: VisuBot kurz: The mBot2 measures the distance and stops in time. @@ -38793,7 +38793,7 @@ lösung: vb-bis-ziel-loesung.visustruct - I know when to use a while loop instead of a for loop. → Three worlds, one program - I can find a goal with the line sensor. → To the goal ::: -`,e9=`--- +`,t9=`--- titel: The ultrasonic sensor bereich: VisuBot kurz: Measure the distance, keep your distance, and do it all in Java. @@ -38879,7 +38879,7 @@ lösung: vb-java-wand-piep-loesung.visustruct - I can put one branch inside another. → Keep your distance in the structure chart - I can write a while loop with the distance in Java. → Now in Java ::: -`,t9=`--- +`,n9=`--- titel: The line sensor bereich: VisuBot kurz: Detect dark lines on the floor and don't fall off the table. @@ -38961,7 +38961,7 @@ lösung: vb-java-rand-loesung.visustruct - I can drive up to a line. → Turn round at the edge in the structure chart - I can count steps with a variable in Java. → Now in Java: there and back ::: -`,n9=`--- +`,i9=`--- titel: Recognising colours bereich: VisuBot kurz: The quad RGB sensor tells you which colour the mBot2 is standing on. @@ -39039,7 +39039,7 @@ lösung: vb-java-blau-gruen-loesung.visustruct - I can turn a condition round with \`!\`. → Drive to red in the structure chart - I can put a branch inside a loop. → Now in Java: beep on green ::: -`,i9=`--- +`,a9=`--- titel: Case selection with colours bereich: VisuBot kurz: Do something different for each colour or line, with one case selection instead of many branches. @@ -39149,7 +39149,7 @@ lösung: vb-ohne-noten-loesung.visustruct - I can write a case selection with numbers in Java. → Now in Java: line patterns - I can read a number and print something depending on its value. → Now without the robot: grades in words ::: -`,a9=`--- +`,s9=`--- titel: Buttons and joystick bereich: VisuBot kurz: The mBot2 waits for you and can be remote controlled. @@ -39226,7 +39226,7 @@ lösung: vb-java-joystick-loesung.visustruct - I can wait for a button. → Waiting for button A in the structure chart - I can steer the mBot2 with the joystick. → Now in Java: remote control ::: -`,s9=`--- +`,r9=`--- titel: The light sensor bereich: VisuBot kurz: Bright or dark? The mBot2 becomes a night light. @@ -39294,7 +39294,7 @@ lösung: vb-java-nachtlicht-ton-loesung.visustruct - I can switch the LEDs with a branch. → Night light in the structure chart - I can write several commands in one branch. → Now in Java: night light with sound ::: -`,r9=`--- +`,o9=`--- titel: The microphone bereich: VisuBot kurz: Clap to start, and a noise light for the classroom. @@ -39360,7 +39360,7 @@ Loudness is really measured in **decibels** (dB). Whispering is about 30 dB, a c - I can wait until something happens. → Clap to start in the structure chart - I can write a noise light in Java. → Now in Java: noise light ::: -`,o9=`--- +`,l9=`--- titel: The motion sensor bereich: VisuBot kurz: Measure tilt and detect shaking. @@ -39434,7 +39434,7 @@ lösung: vb-java-wasserwaage-loesung.visustruct - I can join two conditions with “or”. → Tilt warning in the structure chart - I can join several conditions with “and”. → Now in Java: spirit level ::: -`,l9=`--- +`,u9=`--- titel: The LEDs bereich: VisuBot kurz: Mix colours, build a traffic light and make it blink. @@ -39509,7 +39509,7 @@ lösung: vb-java-blinken-loesung.visustruct - I can show colours one after the other with pauses. → Traffic light in the structure chart - I can make the LEDs blink in Java. → Now in Java: blue light ::: -`,u9=`--- +`,m9=`--- titel: Single LEDs bereich: VisuBot kurz: Each of the five LEDs gets its own colour, all the way to a running light. @@ -39584,7 +39584,7 @@ lösung: vb-java-lauflicht-loesung.visustruct - I can make single LEDs light up in different colours. → Three lights in the structogram - I can build a running light with a loop. → Now in Java: running light ::: -`,m9=`--- +`,c9=`--- titel: The speaker bereich: VisuBot kurz: Tones, a scale and a siren. @@ -39675,7 +39675,7 @@ The mBot2 can also be happy, sad or sleepy. With **show a feeling** (\`mbot.emot - I can calculate with the counting variable in Java. → Now in Java: higher and higher - I can make the mBot2 show a feeling. → Showing feelings ::: -`,c9='---\ntitel: Arrays and melodies\nbereich: VisuBot\nkurz: Store many values in one array and work through them with a loop.\n---\n\n## A melody as an array\n\nA melody is a row of tones. Instead of five variables `tone1`, `tone2`, … you use an **array**. An array is a row of slots under **one** name:\n\n```java\nint[] tones = {262, 294, 330, 349, 392};\n```\n\n- `int[]` means: an array of whole numbers.\n- The slots are numbered from **0**. `tones[0]` is 262, `tones[4]` is 392.\n- `tones.length` tells you how many slots there are, here 5.\n\nA for loop with `i` from 0 to `tones.length - 1` reaches every slot.\n\n::: übung vb-melodie\ntitel: Melody\nauftrag: Create an array `tones` with the pitches 262, 294, 330, 349 and 392. A for loop plays them one after the other, each for 300 milliseconds.\nbefehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300\nbraucht: forSchleife\ntipp: `int[] tones = {262, 294, 330, 349, 392}` creates the array.\ntipp: The loop runs from `i = 0` while `i < tones.length`. Inside is `mbot.playTone(tones[i], 300)`.\nlösung: vb-melodie-loesung.visustruct\n:::\n\n> If you want a different melody, you only change the array. The loop stays the same.\n\n## Now in Java: rainbow\n\nThe five LEDs have the numbers 0 to 4, just like the slots of an array with five values. An array can hold texts too: `String[] colours = {"red", "yellow"};`. LED `i` then gets the colour from slot `i`: `mbot.led(i).setColor(colours[i])`.\n\n::: übung vb-farben\ntitel: Rainbow\ncode: java\nauftrag: Write in Java: create an array `colours` with the texts `"red"`, `"yellow"`, `"green"`, `"blue"` and `"purple"`. A for loop gives every LED `i` the colour from `colours[i]`.\nbefehle: ledColor 0 "red", ledColor 1 "yellow", ledColor 2 "green", ledColor 3 "blue", ledColor 4 "purple"\nbraucht: forSchleife\ntipp: `String[] colours = {"red", "yellow", "green", "blue", "purple"};` creates the array.\ntipp: `for (int i = 0; i < colours.length; i++) { mbot.led(i).setColor(colours[i]); }`\nlösung: vb-farben-loesung.visustruct\n:::\n\n## Now without the robot: sum of the grades\n\nWith a loop you can also add up all the values of an array. You need a variable that starts at 0 and grows in every round:\n\n```java\nint sum = 0;\nfor (int i = 0; i < grades.length; i++) {\n sum = sum + grades[i];\n}\n```\n\n::: übung vb-ohne-summe\ntitel: Sum of the grades\ncode: java\nauftrag: Create `int[] grades = {2, 1, 3, 2}`. Add up all grades in a loop and then print **Sum: 8** and on a second line **Count: 4**. The count comes from `grades.length`. No `mbot` at all!\ntest: - -> Sum: 8 | Count: 4\nbraucht: forSchleife\ntipp: Before the loop `int sum = 0;`, inside the loop `sum = sum + grades[i];`.\ntipp: After the loop `System.out.println("Sum: " + sum);` and `System.out.println("Count: " + grades.length);`.\nlösung: vb-ohne-summe-loesung.visustruct\n:::\n\n::: quiz\n? What is `tones[1]` if `int[] tones = {262, 294, 330};`?\n- [ ] 262\n- [x] 294\n- [ ] 1\n> The slots count from 0. So slot 1 is the second one.\n? How many slots does `{262, 294, 330}` have, so what is `tones.length`?\n- [ ] 2\n- [x] 3\n- [ ] 330\n> `length` counts the slots, here three. That is why the last slot has the number 2.\n:::\n\n::: checkliste\n- I can create an array and play it with a loop. → A melody as an array\n- I can use an array of texts in Java. → Now in Java: rainbow\n- I can add up all values of an array. → Now without the robot: sum of the grades\n:::\n',d9=`--- +`,d9='---\ntitel: Arrays and melodies\nbereich: VisuBot\nkurz: Store many values in one array and work through them with a loop.\n---\n\n## A melody as an array\n\nA melody is a row of tones. Instead of five variables `tone1`, `tone2`, … you use an **array**. An array is a row of slots under **one** name:\n\n```java\nint[] tones = {262, 294, 330, 349, 392};\n```\n\n- `int[]` means: an array of whole numbers.\n- The slots are numbered from **0**. `tones[0]` is 262, `tones[4]` is 392.\n- `tones.length` tells you how many slots there are, here 5.\n\nA for loop with `i` from 0 to `tones.length - 1` reaches every slot.\n\n::: übung vb-melodie\ntitel: Melody\nauftrag: Create an array `tones` with the pitches 262, 294, 330, 349 and 392. A for loop plays them one after the other, each for 300 milliseconds.\nbefehle: playTone 262 300, playTone 294 300, playTone 330 300, playTone 349 300, playTone 392 300\nbraucht: forSchleife\ntipp: `int[] tones = {262, 294, 330, 349, 392}` creates the array.\ntipp: The loop runs from `i = 0` while `i < tones.length`. Inside is `mbot.playTone(tones[i], 300)`.\nlösung: vb-melodie-loesung.visustruct\n:::\n\n> If you want a different melody, you only change the array. The loop stays the same.\n\n## Now in Java: rainbow\n\nThe five LEDs have the numbers 0 to 4, just like the slots of an array with five values. An array can hold texts too: `String[] colours = {"red", "yellow"};`. LED `i` then gets the colour from slot `i`: `mbot.led(i).setColor(colours[i])`.\n\n::: übung vb-farben\ntitel: Rainbow\ncode: java\nauftrag: Write in Java: create an array `colours` with the texts `"red"`, `"yellow"`, `"green"`, `"blue"` and `"purple"`. A for loop gives every LED `i` the colour from `colours[i]`.\nbefehle: ledColor 0 "red", ledColor 1 "yellow", ledColor 2 "green", ledColor 3 "blue", ledColor 4 "purple"\nbraucht: forSchleife\ntipp: `String[] colours = {"red", "yellow", "green", "blue", "purple"};` creates the array.\ntipp: `for (int i = 0; i < colours.length; i++) { mbot.led(i).setColor(colours[i]); }`\nlösung: vb-farben-loesung.visustruct\n:::\n\n## Now without the robot: sum of the grades\n\nWith a loop you can also add up all the values of an array. You need a variable that starts at 0 and grows in every round:\n\n```java\nint sum = 0;\nfor (int i = 0; i < grades.length; i++) {\n sum = sum + grades[i];\n}\n```\n\n::: übung vb-ohne-summe\ntitel: Sum of the grades\ncode: java\nauftrag: Create `int[] grades = {2, 1, 3, 2}`. Add up all grades in a loop and then print **Sum: 8** and on a second line **Count: 4**. The count comes from `grades.length`. No `mbot` at all!\ntest: - -> Sum: 8 | Count: 4\nbraucht: forSchleife\ntipp: Before the loop `int sum = 0;`, inside the loop `sum = sum + grades[i];`.\ntipp: After the loop `System.out.println("Sum: " + sum);` and `System.out.println("Count: " + grades.length);`.\nlösung: vb-ohne-summe-loesung.visustruct\n:::\n\n::: quiz\n? What is `tones[1]` if `int[] tones = {262, 294, 330};`?\n- [ ] 262\n- [x] 294\n- [ ] 1\n> The slots count from 0. So slot 1 is the second one.\n? How many slots does `{262, 294, 330}` have, so what is `tones.length`?\n- [ ] 2\n- [x] 3\n- [ ] 330\n> `length` counts the slots, here three. That is why the last slot has the number 2.\n:::\n\n::: checkliste\n- I can create an array and play it with a loop. → A melody as an array\n- I can use an array of texts in Java. → Now in Java: rainbow\n- I can add up all values of an array. → Now without the robot: sum of the grades\n:::\n',h9=`--- titel: The screen bereich: VisuBot kurz: Show text, numbers and sensor values on the CyberPi. @@ -39750,7 +39750,7 @@ lösung: vb-java-countdown-loesung.visustruct - I can show numbers and sensor values. → Numbers and sensor values - I can write a countdown in Java. → Now in Java: countdown ::: -`,h9=`--- +`,g9=`--- titel: Strings bereich: VisuBot kurz: Work with texts, pick out letters and show them on the screen. @@ -39832,7 +39832,7 @@ lösung: vb-ohne-rueckwaerts-loesung.visustruct - I can join texts and numbers with \`+\`. → Now in Java: text and length - I can get single characters with \`charAt(…)\`. → Now without the robot: read it backwards ::: -`,g9=`--- +`,p9=`--- titel: Motors and speed bereich: VisuBot kurz: Step on the gas, steer and follow a line. @@ -39922,7 +39922,7 @@ lösung: vb-java-linienfolger-loesung.visustruct - I can drive until a sensor reports something. → Full speed to the wall in the structure chart - I can write a line follower in Java. → Now in Java: line follower ::: -`,p9=`--- +`,f9=`--- titel: Stopwatch and battery bereich: VisuBot kurz: Measure time and keep an eye on the battery. @@ -40001,7 +40001,7 @@ lösung: vb-java-akku-loesung.visustruct - I can drive for a certain time. → Driving two seconds in the structure chart - I can show the battery level. → Now in Java: battery display ::: -`,f9=`--- +`,x9=`--- titel: Your own methods bereich: VisuBot kurz: Write and call your own commands with parameters and return values. @@ -40091,7 +40091,7 @@ unterprogramm: vb-ohne-quadratzahl-unterprogramm-loesung.visustruct - I know what methods look like in Java. → Methods in Java - I can write a method with a return value. → Now without the robot: a method with a return value ::: -`,x9=`## 🤖 mBot2 commands +`,b9=`## 🤖 mBot2 commands A command tells the mBot2 what to **do**. Every command starts with \`mbot.\` and ends with brackets. Often you write a number in the brackets. @@ -40243,7 +40243,7 @@ With **🔌 mBot2** next to "Start simulation" you connect the real robot with t ### Driving without a cable With **⬆ Upload** you save your program on the mBot2. Then unplug the cable, put the mBot2 at the start and press **button A**: it drives your program on its own. It stays saved until you upload a new one. Keyboard inputs do not work on the mBot2. -`,b9=`--- +`,y9=`--- titel: Die Alarmanlage nach: 16 stufe: 2 @@ -40262,7 +40262,7 @@ tipp: Außen steht eine While-Schleife mit \`!mbot.isButtonB()\`. Darin eine Ver tipp: Die Bedingung der Verzweigung: \`mbot.getDistance() < 20 || mbot.getLoudness() > 60\`. Im Ja-Zweig \`mbot.setLed(255, 0, 0)\` und \`mbot.playTone(880, 200)\`, im Nein-Zweig \`mbot.ledOff()\`. lösung: vb-alarmanlage-loesung.visustruct ::: -`,y9=`--- +`,v9=`--- titel: Labyrinth mit Ausgängen nach: 5 stufe: 3 @@ -40281,7 +40281,7 @@ tipp: In jedem Durchlauf dreht sich der mBot2 zuerst nach links und misst. Ist o tipp: Durch die Lücke sind es zwei Felder bis in den nächsten Gang. Danach soll er wieder nach rechts schauen. Ist oben eine Wand, dreht er sich zurück und fährt ein Feld weiter. lösung: vb-ausgang-loesung.visustruct ::: -`,v9=`--- +`,w9=`--- titel: Binär zählen nach: 15 stufe: 3 @@ -40306,7 +40306,7 @@ tipp: Ob LED 0 an ist, verrät der Rest beim Teilen durch 2: \`zahl % 2 == 1\`. tipp: In der Schleife stehen drei Verzweigungen und danach **kurz warten**. Im Ja-Zweig zum Beispiel \`mbot.led(0).setColor("grün")\`, im Nein-Zweig \`mbot.led(0).setColor("aus")\`. lösung: vb-binaer-zaehlen-loesung.visustruct ::: -`,w9=`--- +`,z9=`--- titel: Das Dreieck nach: 2 stufe: 1 @@ -40329,7 +40329,7 @@ lösung: vb-dreieck-loesung.visustruct ::: angeberwissen Die Idee, mit einem fahrenden Roboter Figuren zu zeichnen, ist über 50 Jahre alt: Ende der 1960er-Jahre entstand die Sprache **Logo**. Kinder steuerten damit eine „Schildkröte“, die mit einem Stift über das Papier fuhr. ::: -`,z9=`--- +`,I9=`--- titel: Rückwärts einparken nach: 16 stufe: 2 @@ -40349,7 +40349,7 @@ tipp: Zwei While-Schleifen hintereinander: erst \`!mbot.getColor().equals("blau" tipp: Am Ende: \`mbot.setLed(0, 255, 0)\` und \`mbot.showText("Geparkt!")\`. lösung: vb-einparken-loesung.visustruct ::: -`,I9='---\ntitel: Hindernis ausweichen\nnach: 16\nstufe: 2\n---\n\nAuf dem Weg zum roten Feld stehen Klötze im Weg. Der mBot2 fährt in 10-cm-Schritten vor. Taucht ein Klotz auf (näher als 20 cm), warnt er mit Licht und Ton und fährt außen herum: nach rechts drehen, 30 cm vor, nach links drehen. Dann geht es weiter geradeaus.\n\n::: übung vb-hindernis\ntitel: Hindernis ausweichen\nauftrag: Der mBot2 fährt, solange er nicht auf Rot steht. Ist ein Klotz näher als 20 cm, leuchten die LEDs orange (`mbot.setLed(255, 128, 0)`), er piept und weicht aus. Danach gehen die LEDs aus. Sonst fährt er 10 cm vor. Es gibt zwei Welten.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, darin eine Verzweigung mit `mbot.getDistance() < 20`.\ntipp: Im Ja-Zweig: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. Im Nein-Zweig: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',k9=`--- +`,k9='---\ntitel: Hindernis ausweichen\nnach: 16\nstufe: 2\n---\n\nAuf dem Weg zum roten Feld stehen Klötze im Weg. Der mBot2 fährt in 10-cm-Schritten vor. Taucht ein Klotz auf (näher als 20 cm), warnt er mit Licht und Ton und fährt außen herum: nach rechts drehen, 30 cm vor, nach links drehen. Dann geht es weiter geradeaus.\n\n::: übung vb-hindernis\ntitel: Hindernis ausweichen\nauftrag: Der mBot2 fährt, solange er nicht auf Rot steht. Ist ein Klotz näher als 20 cm, leuchten die LEDs orange (`mbot.setLed(255, 128, 0)`), er piept und weicht aus. Danach gehen die LEDs aus. Sonst fährt er 10 cm vor. Es gibt zwei Welten.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, darin eine Verzweigung mit `mbot.getDistance() < 20`.\ntipp: Im Ja-Zweig: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. Im Nein-Zweig: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',S9=`--- titel: Knight Rider nach: 15 stufe: 2 @@ -40366,7 +40366,7 @@ tipp: Die erste Schleife zählt \`i\` von 0 bis 4 hoch. Die zweite startet bei 3 tipp: In beiden Schleifen: \`mbot.led(i).setColor("rot")\`, \`mbot.pause(100)\`, \`mbot.led(i).setColor("aus")\`. lösung: vb-knight-rider-loesung.visustruct ::: -`,S9=`--- +`,_9=`--- titel: Das Labyrinth nach: 5 stufe: 2 @@ -40391,7 +40391,7 @@ lösung: vb-labyrinth-loesung.visustruct ::: angeberwissen Mit der Regel „Hand immer an der Wand“ findet man aus jedem Labyrinth, dessen Wände alle zusammenhängen. Schon die Griechen erzählten von Theseus, der sich im Labyrinth des Minotaurus mit einem Wollfaden half. ::: -`,_9='---\ntitel: Linienfolger mit Stopp\nnach: 20\nstufe: 3\n---\n\nDer mBot2 folgt einer schwarzen Linie und hält am roten Feld an ihrem Ende an.\n\nDafür gibt er mit **Räder einzeln** Gas: `mbot.drive(40, 40)` lässt beide Räder gleich schnell drehen, er fährt geradeaus weiter, bis ein anderer Fahrbefehl kommt. `mbot.drive(10, 40)` macht eine Linkskurve, `mbot.drive(40, 10)` eine Rechtskurve. `mbot.stop()` hält ihn an.\n\nDie beiden mittleren Fühler des Liniensensors fragst du mit `mbot.isLineLeft()` und `mbot.isLineRight()` ab. Sehen beide die Linie, fährt er geradeaus. Sieht nur der linke sie, lenkt er nach links, sieht nur der rechte sie, nach rechts.\n\n::: übung vb-linienfolger-stopp\ntitel: Linienfolger mit Stopp\nauftrag: Solange der mBot2 nicht auf Rot steht, folgt er der Linie. Danach hält er an. In der zweiten Welt schlängelt sich die Linie.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, danach **anhalten**.\ntipp: In der Schleife: Sind `mbot.isLineLeft() && mbot.isLineRight()`, dann `mbot.drive(40, 40)`. Sonst, wenn `mbot.isLineLeft()`, dann `mbot.drive(10, 40)`. Sonst, wenn `mbot.isLineRight()`, dann `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',T9=`--- +`,T9='---\ntitel: Linienfolger mit Stopp\nnach: 20\nstufe: 3\n---\n\nDer mBot2 folgt einer schwarzen Linie und hält am roten Feld an ihrem Ende an.\n\nDafür gibt er mit **Räder einzeln** Gas: `mbot.drive(40, 40)` lässt beide Räder gleich schnell drehen, er fährt geradeaus weiter, bis ein anderer Fahrbefehl kommt. `mbot.drive(10, 40)` macht eine Linkskurve, `mbot.drive(40, 10)` eine Rechtskurve. `mbot.stop()` hält ihn an.\n\nDie beiden mittleren Fühler des Liniensensors fragst du mit `mbot.isLineLeft()` und `mbot.isLineRight()` ab. Sehen beide die Linie, fährt er geradeaus. Sieht nur der linke sie, lenkt er nach links, sieht nur der rechte sie, nach rechts.\n\n::: übung vb-linienfolger-stopp\ntitel: Linienfolger mit Stopp\nauftrag: Solange der mBot2 nicht auf Rot steht, folgt er der Linie. Danach hält er an. In der zweiten Welt schlängelt sich die Linie.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: Außen eine While-Schleife mit `!mbot.getColor().equals("rot")`, danach **anhalten**.\ntipp: In der Schleife: Sind `mbot.isLineLeft() && mbot.isLineRight()`, dann `mbot.drive(40, 40)`. Sonst, wenn `mbot.isLineLeft()`, dann `mbot.drive(10, 40)`. Sonst, wenn `mbot.isLineRight()`, dann `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',O9=`--- titel: Morsen nach: 15 stufe: 2 @@ -40408,7 +40408,7 @@ tipp: Drei For-Schleifen hintereinander, jede läuft dreimal. Dazwischen steht j tipp: In der ersten und dritten Schleife: \`mbot.led(2).setColor("weiß")\`, \`mbot.pause(200)\`, \`mbot.led(2).setColor("aus")\`, \`mbot.pause(200)\`. In der mittleren wartet er nach dem Einschalten 600. lösung: vb-morsen-loesung.visustruct ::: -`,O9=`--- +`,A9=`--- titel: Der Nachtwächter nach: 18 stufe: 1 @@ -40426,7 +40426,7 @@ tipp: Eine While-Schleife mit \`mbot.getBrightness() < 20\`. Darin \`mbot.forwar tipp: Nach der Schleife steht \`mbot.showText("Zzz")\`. lösung: vb-nachtwaechter-loesung.visustruct ::: -`,A9=`--- +`,P9=`--- titel: Slalom nach: 2 stufe: 2 @@ -40445,7 +40445,7 @@ tipp: Überlege zuerst, wie der mBot2 oben um einen einzigen Pylon herumfährt: tipp: Unten herum geht genauso, nur mit links und rechts vertauscht. „Oben herum, dann unten herum“ wiederholt sich zweimal. lösung: vb-slalom-loesung.visustruct ::: -`,P9=`--- +`,j9=`--- titel: Die Spirale nach: 2 stufe: 2 @@ -40464,7 +40464,7 @@ tipp: Lass die Zählvariable von 1 bis 8 laufen. Wie lang ist dann die Seite in tipp: In der Klammer von **fahre vor** steht eine Rechnung mit der Zählvariable. lösung: vb-spirale-loesung.visustruct ::: -`,j9=`--- +`,C9=`--- titel: Die Treppe nach: 2 stufe: 1 @@ -40481,7 +40481,7 @@ tipp: Schreib zuerst eine Stufe auf. Dann packst du sie in eine For-Schleife, di tipp: In der Schleife: \`mbot.forward(20)\`, \`mbot.turnLeft()\`, \`mbot.forward(20)\`, \`mbot.turnRight()\`. lösung: vb-treppe-loesung.visustruct ::: -`,C9=`--- +`,B9=`--- titel: Der Tunnelsucher nach: 5 stufe: 3 @@ -40502,7 +40502,7 @@ tipp: In jedem Durchlauf fährt der mBot2 ein Feld vor und schaut sich dann nach tipp: Hier passt eine Schleife, die erst fährt und danach prüft. Sie läuft weiter, solange links **oder** rechts mindestens 20 cm frei ist: \`links >= 20 || rechts >= 20\`. lösung: vb-tunnel-loesung.visustruct ::: -`,B9=`--- +`,D9=`--- titel: Kleeblatt im Wald nach: 5 stufe: 2 @@ -40521,7 +40521,7 @@ tipp: Wie bei „Fahre bis zum Ziel“ läuft außen eine Schleife, bis der Lini tipp: Um einen Baum herum: nach links drehen, ein Feld vor, nach rechts drehen, zwei Felder vor, nach rechts drehen, ein Feld vor, nach links drehen. lösung: vb-wald-loesung.visustruct ::: -`,D9=`--- +`,Z9=`--- titel: The alarm system nach: 16 stufe: 2 @@ -40540,7 +40540,7 @@ tipp: On the outside is a while loop with \`!mbot.isButtonB()\`. Inside a branch tipp: The condition of the branch: \`mbot.getDistance() < 20 || mbot.getLoudness() > 60\`. In the yes branch \`mbot.setLed(255, 0, 0)\` and \`mbot.playTone(880, 200)\`, in the no branch \`mbot.ledOff()\`. lösung: vb-alarmanlage-loesung.visustruct ::: -`,Z9=`--- +`,M9=`--- titel: Maze with exits nach: 5 stufe: 3 @@ -40559,7 +40559,7 @@ tipp: In each pass the mBot2 first turns left and measures. If the way up is fre tipp: Through the gap it is two squares into the next corridor. Afterwards it should face right again. If there is a wall above, it turns back and drives one square further. lösung: vb-ausgang-loesung.visustruct ::: -`,M9=`--- +`,L9=`--- titel: Counting in binary nach: 15 stufe: 3 @@ -40584,7 +40584,7 @@ tipp: Whether LED 0 is on is given by the remainder when dividing by 2: \`number tipp: The loop contains three branches and then **wait a moment**. In the yes branch, for example, \`mbot.led(0).setColor("green")\`, in the no branch \`mbot.led(0).setColor("off")\`. lösung: vb-binaer-zaehlen-loesung.visustruct ::: -`,L9=`--- +`,W9=`--- titel: The triangle nach: 2 stufe: 1 @@ -40607,7 +40607,7 @@ lösung: vb-dreieck-loesung.visustruct ::: angeberwissen The idea of drawing shapes with a driving robot is more than 50 years old: the language **Logo** was created in the late 1960s. Children used it to steer a "turtle" that rolled across paper with a pen. ::: -`,W9=`--- +`,E9=`--- titel: Reverse parking nach: 16 stufe: 2 @@ -40627,7 +40627,7 @@ tipp: Two while loops one after the other: first \`!mbot.getColor().equals("blue tipp: At the end: \`mbot.setLed(0, 255, 0)\` and \`mbot.showText("Parked!")\`. lösung: vb-einparken-loesung.visustruct ::: -`,E9='---\ntitel: Avoid obstacles\nnach: 16\nstufe: 2\n---\n\nOn the way to the red field there are blocks in the way. The mBot2 drives forward in steps of 10 cm. If a block shows up (closer than 20 cm), it warns with light and sound and drives around it: turn right, 30 cm forward, turn left. Then it carries on straight ahead.\n\n::: übung vb-hindernis\ntitel: Avoid obstacles\nauftrag: The mBot2 drives as long as it is not on red. If a block is closer than 20 cm, the LEDs light up orange (`mbot.setLed(255, 128, 0)`), it beeps and drives around it. Then the LEDs go off. Otherwise it drives forward 10 cm. There are two worlds.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, inside a branch with `mbot.getDistance() < 20`.\ntipp: In the yes branch: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. In the no branch: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',N9=`--- +`,N9='---\ntitel: Avoid obstacles\nnach: 16\nstufe: 2\n---\n\nOn the way to the red field there are blocks in the way. The mBot2 drives forward in steps of 10 cm. If a block shows up (closer than 20 cm), it warns with light and sound and drives around it: turn right, 30 cm forward, turn left. Then it carries on straight ahead.\n\n::: übung vb-hindernis\ntitel: Avoid obstacles\nauftrag: The mBot2 drives as long as it is not on red. If a block is closer than 20 cm, the LEDs light up orange (`mbot.setLed(255, 128, 0)`), it beeps and drives around it. Then the LEDs go off. Otherwise it drives forward 10 cm. There are two worlds.\nwelt: hindernis-1 -> tone\nwelt: hindernis-2 -> tone\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, inside a branch with `mbot.getDistance() < 20`.\ntipp: In the yes branch: `mbot.setLed(255, 128, 0)`, `mbot.playTone(880, 200)`, `mbot.turnRight()`, `mbot.forward(30)`, `mbot.turnLeft()`, `mbot.ledOff()`. In the no branch: `mbot.forward()`.\nlösung: vb-hindernis-loesung.visustruct\n:::\n',F9=`--- titel: Knight Rider nach: 15 stufe: 2 @@ -40644,7 +40644,7 @@ tipp: The first loop counts \`i\` up from 0 to 4. The second starts at 3 and cou tipp: In both loops: \`mbot.led(i).setColor("red")\`, \`mbot.pause(100)\`, \`mbot.led(i).setColor("off")\`. lösung: vb-knight-rider-loesung.visustruct ::: -`,F9=`--- +`,J9=`--- titel: The maze nach: 5 stufe: 2 @@ -40669,7 +40669,7 @@ lösung: vb-labyrinth-loesung.visustruct ::: angeberwissen With the rule "always keep one hand on the wall" you get out of any maze whose walls are all connected. The ancient Greeks already told of Theseus, who found his way through the Minotaur's labyrinth with a ball of thread. ::: -`,J9='---\ntitel: Line follower with stop\nnach: 20\nstufe: 3\n---\n\nThe mBot2 follows a black line and stops at the red field at its end.\n\nFor this it steps on the gas with **wheels separately**: `mbot.drive(40, 40)` turns both wheels equally fast, it keeps driving straight ahead until another driving command comes. `mbot.drive(10, 40)` makes a left curve, `mbot.drive(40, 10)` a right curve. `mbot.stop()` stops it.\n\nYou ask the two middle probes of the line sensor with `mbot.isLineLeft()` and `mbot.isLineRight()`. If both see the line, it drives straight ahead. If only the left one sees it, it steers left, if only the right one sees it, right.\n\n::: übung vb-linienfolger-stopp\ntitel: Line follower with stop\nauftrag: As long as the mBot2 is not on red, it follows the line. Then it stops. In the second world the line winds about.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, after it **stop**.\ntipp: Inside the loop: if `mbot.isLineLeft() && mbot.isLineRight()`, then `mbot.drive(40, 40)`. Otherwise, if `mbot.isLineLeft()`, then `mbot.drive(10, 40)`. Otherwise, if `mbot.isLineRight()`, then `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',R9=`--- +`,R9='---\ntitel: Line follower with stop\nnach: 20\nstufe: 3\n---\n\nThe mBot2 follows a black line and stops at the red field at its end.\n\nFor this it steps on the gas with **wheels separately**: `mbot.drive(40, 40)` turns both wheels equally fast, it keeps driving straight ahead until another driving command comes. `mbot.drive(10, 40)` makes a left curve, `mbot.drive(40, 10)` a right curve. `mbot.stop()` stops it.\n\nYou ask the two middle probes of the line sensor with `mbot.isLineLeft()` and `mbot.isLineRight()`. If both see the line, it drives straight ahead. If only the left one sees it, it steers left, if only the right one sees it, right.\n\n::: übung vb-linienfolger-stopp\ntitel: Line follower with stop\nauftrag: As long as the mBot2 is not on red, it follows the line. Then it stops. In the second world the line winds about.\nwelt: linie-rot-1, linie-rot-2\nbraucht: whileSchleife, verzweigung\ntipp: On the outside a while loop with `!mbot.getColor().equals("red")`, after it **stop**.\ntipp: Inside the loop: if `mbot.isLineLeft() && mbot.isLineRight()`, then `mbot.drive(40, 40)`. Otherwise, if `mbot.isLineLeft()`, then `mbot.drive(10, 40)`. Otherwise, if `mbot.isLineRight()`, then `mbot.drive(40, 10)`.\nlösung: vb-linienfolger-stopp-loesung.visustruct\n:::\n',G9=`--- titel: Morse code nach: 15 stufe: 2 @@ -40686,7 +40686,7 @@ tipp: Three for loops one after the other, each runs three times. Between them t tipp: In the first and third loop: \`mbot.led(2).setColor("white")\`, \`mbot.pause(200)\`, \`mbot.led(2).setColor("off")\`, \`mbot.pause(200)\`. In the middle one it waits 600 after switching on. lösung: vb-morsen-loesung.visustruct ::: -`,G9=`--- +`,H9=`--- titel: The night watchman nach: 18 stufe: 1 @@ -40704,7 +40704,7 @@ tipp: A while loop with \`mbot.getBrightness() < 20\`. Inside \`mbot.forward(30) tipp: After the loop is \`mbot.showText("Zzz")\`. lösung: vb-nachtwaechter-loesung.visustruct ::: -`,H9=`--- +`,V9=`--- titel: Slalom nach: 2 stufe: 2 @@ -40723,7 +40723,7 @@ tipp: First think about how the mBot2 drives around a single cone on the top sid tipp: Around the bottom works the same way, only with left and right swapped. "Top, then bottom" repeats twice. lösung: vb-slalom-loesung.visustruct ::: -`,V9=`--- +`,Q9=`--- titel: The spiral nach: 2 stufe: 2 @@ -40742,7 +40742,7 @@ tipp: Let the counter variable run from 1 to 8. How long is the side in each pas tipp: The brackets of **drive forward** contain a calculation with the counter variable. lösung: vb-spirale-loesung.visustruct ::: -`,Q9=`--- +`,q9=`--- titel: The staircase nach: 2 stufe: 1 @@ -40759,7 +40759,7 @@ tipp: Write down one step first. Then put it into a for loop that runs three tim tipp: Inside the loop: \`mbot.forward(20)\`, \`mbot.turnLeft()\`, \`mbot.forward(20)\`, \`mbot.turnRight()\`. lösung: vb-treppe-loesung.visustruct ::: -`,q9=`--- +`,U9=`--- titel: The tunnel finder nach: 5 stufe: 3 @@ -40780,7 +40780,7 @@ tipp: In each pass the mBot2 drives one square forward and then looks left and r tipp: A loop that drives first and checks afterwards fits here. It keeps going as long as at least 20 cm are free on the left **or** on the right: \`left >= 20 || right >= 20\`. lösung: vb-tunnel-loesung.visustruct ::: -`,U9=`--- +`,$9=`--- titel: Clover in the forest nach: 5 stufe: 2 @@ -40799,7 +40799,7 @@ tipp: As in "Drive to the goal", a loop on the outside runs until the line senso tipp: Around a tree: turn left, one square forward, turn right, two squares forward, turn right, one square forward, turn left. lösung: vb-wald-loesung.visustruct ::: -`,$9=` +`,Y9=` 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;34; @@ -40811,7 +40811,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;117;102;32;87;105;101;100;101;114;115;101;104;101;110;34; -`,Y9=` +`,X9=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -40830,7 +40830,7 @@ lösung: vb-wald-loesung.visustruct -`,X9=` +`,K9=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; @@ -40911,7 +40911,7 @@ lösung: vb-wald-loesung.visustruct 97;117;115;46;99;108;111;115;101;40;41; -`,K9=` +`,ew=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;98;97;108;108;119;117;114;102;46;99;115;118;34;41;41; @@ -40920,7 +40920,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,ew=` +`,tw=` 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -40985,7 +40985,7 @@ lösung: vb-wald-loesung.visustruct -`,tw=` +`,nw=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;71;97;110;122;101;32;90;97;104;108;32;101;105;110;103;101;98;101;110;34; @@ -41011,7 +41011,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;105;110;97;101;114; -`,nw=` +`,iw=` 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; @@ -41065,13 +41065,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;103;101;104;101;105;109; -`,iw=` +`,aw=` 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; -`,aw=` +`,sw=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;101;108;99;104;101;115;32;87;111;114;116;32;40;110;117;114;32;71;114;111;223;98;117;99;104;115;116;97;98;101;110;41;63;34; @@ -41102,7 +41102,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;103;101;104;101;105;109; -`,sw=` +`,rw=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;103;101;104;101;105;109;32;34;87;101;108;99;104;101;114;32;71;101;104;101;105;109;116;101;120;116;63;34; @@ -41133,7 +41133,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;107;108;97;114;116;101;120;116; -`,rw=` +`,ow=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;32;101;105;110;103;101;98;101;110;34; @@ -41169,7 +41169,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;99;104;114;105;116;116;101;58;32;34;32;43;32;115;99;104;114;105;116;116;101; -`,ow=` +`,lw=` 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;78;111;116;101;110;63;34; @@ -41197,7 +41197,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;99;104;110;105;116;116; -`,lw=` +`,uw=` 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;90;97;104;108;101;110;63;34; @@ -41234,7 +41234,7 @@ lösung: vb-wald-loesung.visustruct -`,uw=` +`,mw=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; @@ -41253,7 +41253,7 @@ lösung: vb-wald-loesung.visustruct -`,mw=` +`,cw=` 99;111;110;115;116;32;100;111;117;98;108;101;32;77;87;83;84;32;61;32;48;46;49;57; @@ -41274,7 +41274,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;114;117;116;116;111;112;114;101;105;115; -`,cw=` +`,dw=` 105;110;116;32;112;105;110;32;61;32;48; @@ -41310,7 +41310,7 @@ lösung: vb-wald-loesung.visustruct -`,dw=` +`,hw=` 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; @@ -41346,7 +41346,7 @@ lösung: vb-wald-loesung.visustruct -`,hw=` +`,gw=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;49;32;34;69;114;115;116;101;32;90;97;104;108;34; @@ -41390,7 +41390,7 @@ lösung: vb-wald-loesung.visustruct -`,gw=` +`,pw=` 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -41444,7 +41444,7 @@ lösung: vb-wald-loesung.visustruct -`,pw=` +`,fw=` 98;111;111;108;101;97;110;91;93;91;93;32;109;101;101;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -41471,7 +41471,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;115;112;97;108;116;101;110;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; -`,fw=` +`,xw=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;109;101;114;32;34;87;101;108;99;104;101;115;32;71;101;114;105;99;104;116;63;32;40;49;44;32;50;32;111;100;101;114;32;51;41;34; @@ -41500,7 +41500,7 @@ lösung: vb-wald-loesung.visustruct -`,xw=` +`,bw=` 105;110;116;32;122;97;104;108;49;32;61;32;52; @@ -41515,7 +41515,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,bw=` +`,yw=` 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; @@ -41537,7 +41537,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;97;102;101;108;100;105;101;110;115;116;58;32;34;32;43;32;110;97;109;101;110;91;110;117;109;109;101;114;32;45;32;49;93; -`,yw=` +`,vw=` 105;110;116;32;122;97;104;108;32;61;32;52; @@ -41549,7 +41549,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;101;114;100;111;112;112;101;108;116;101;32;90;97;104;108;58;32;34;32;43;32;122;97;104;108; -`,vw=` +`,ww=` -1; @@ -41596,7 +41596,7 @@ lösung: vb-wald-loesung.visustruct -`,ww=` +`,zw=` @@ -41633,7 +41633,7 @@ lösung: vb-wald-loesung.visustruct -`,zw=` +`,Iw=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; @@ -41693,7 +41693,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;114;105;99;104;116;105;103;32;43;32;34;32;118;111;110;32;34;32;43;32;97;110;122;97;104;108;32;43;32;34;32;114;105;99;104;116;105;103;34; -`,Iw=` +`,kw=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;107;97;98;101;108;110;46;99;115;118;34;41;41; @@ -41702,7 +41702,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,kw=` +`,Sw=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -41721,7 +41721,7 @@ lösung: vb-wald-loesung.visustruct -`,Sw=` +`,_w=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; @@ -41744,7 +41744,7 @@ lösung: vb-wald-loesung.visustruct 108;101;115;101;114;46;99;108;111;115;101;40;41; -`,_w=` +`,Tw=` 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; @@ -41762,7 +41762,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;104;97;116;32;105;110;32;77;97;116;104;101;32;101;105;110;101;32;34;32;43;32;109;97;116;104;101; -`,Tw=` +`,Ow=` 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;97;114;116;92;34;58;32;92;34;90;105;101;103;101;92;34;44;32;92;34;97;108;116;101;114;92;34;58;32;54;125;44;34; @@ -41780,7 +41780,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101; -`,Ow=` +`,Aw=` 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; @@ -41800,7 +41800,7 @@ lösung: vb-wald-loesung.visustruct 100;97;116;101;105;46;99;108;111;115;101;40;41; -`,Aw=` +`,Pw=` 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;34; @@ -41812,7 +41812,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;111;111;100;98;121;101;34; -`,Pw=` +`,jw=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -41831,7 +41831,7 @@ lösung: vb-wald-loesung.visustruct -`,jw=` +`,Cw=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; @@ -41912,7 +41912,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;46;99;108;111;115;101;40;41; -`,Cw=` +`,Bw=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;104;114;111;119;46;99;115;118;34;41;41; @@ -41921,7 +41921,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,Bw=` +`,Dw=` 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -41986,7 +41986,7 @@ lösung: vb-wald-loesung.visustruct -`,Dw=` +`,Zw=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;119;104;111;108;101;32;110;117;109;98;101;114;34; @@ -42012,7 +42012,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;105;110;97;114;121; -`,Zw=` +`,Mw=` 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; @@ -42066,13 +42066,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;101;99;114;101;116; -`,Mw=` +`,Lw=` 99;104;97;114;91;93;32;97;108;112;104;97;98;101;116;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; -`,Lw=` +`,Ww=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;87;104;105;99;104;32;119;111;114;100;32;40;99;97;112;105;116;97;108;32;108;101;116;116;101;114;115;32;111;110;108;121;41;63;34; @@ -42103,7 +42103,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;101;99;114;101;116; -`,Ww=` +`,Ew=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;99;114;101;116;32;34;87;104;105;99;104;32;115;101;99;114;101;116;32;116;101;120;116;63;34; @@ -42134,7 +42134,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;112;108;97;105;110; -`,Ew=` +`,Nw=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;115;116;97;114;116;32;110;117;109;98;101;114;34; @@ -42170,7 +42170,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;101;112;115;58;32;34;32;43;32;115;116;101;112;115; -`,Nw=` +`,Fw=` 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;103;114;97;100;101;115;63;34; @@ -42198,7 +42198,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;118;101;114;97;103;101; -`,Fw=` +`,Jw=` 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;110;117;109;98;101;114;115;63;34; @@ -42235,7 +42235,7 @@ lösung: vb-wald-loesung.visustruct -`,Jw=` +`,Rw=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; @@ -42254,7 +42254,7 @@ lösung: vb-wald-loesung.visustruct -`,Rw=` +`,Gw=` 99;111;110;115;116;32;100;111;117;98;108;101;32;86;65;84;32;61;32;48;46;49;57; @@ -42275,7 +42275,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;103;114;111;115;115;80;114;105;99;101; -`,Gw=` +`,Hw=` 105;110;116;32;112;105;110;32;61;32;48; @@ -42311,7 +42311,7 @@ lösung: vb-wald-loesung.visustruct -`,Hw=` +`,Vw=` 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; @@ -42347,7 +42347,7 @@ lösung: vb-wald-loesung.visustruct -`,Vw=` +`,Qw=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;49;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; @@ -42391,7 +42391,7 @@ lösung: vb-wald-loesung.visustruct -`,Qw=` +`,qw=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -42445,7 +42445,7 @@ lösung: vb-wald-loesung.visustruct -`,qw=` +`,Uw=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -42472,7 +42472,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;99;111;108;117;109;110;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; -`,Uw=` +`,$w=` 105;110;112;117;116;58;32;105;110;116;32;112;105;99;107;32;34;87;104;105;99;104;32;100;105;115;104;63;32;40;49;44;32;50;32;111;114;32;51;41;34; @@ -42501,7 +42501,7 @@ lösung: vb-wald-loesung.visustruct -`,$w=` +`,Yw=` 105;110;116;32;110;117;109;98;101;114;49;32;61;32;52; @@ -42516,7 +42516,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,Yw=` +`,Xw=` 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; @@ -42538,7 +42538,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;66;111;97;114;100;32;100;117;116;121;58;32;34;32;43;32;110;97;109;101;115;91;112;105;99;107;32;45;32;49;93; -`,Xw=` +`,Kw=` 105;110;116;32;110;117;109;98;101;114;32;61;32;52; @@ -42550,7 +42550,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;111;117;98;108;101;100;32;110;117;109;98;101;114;58;32;34;32;43;32;110;117;109;98;101;114; -`,Kw=` +`,e5=` -1; @@ -42597,7 +42597,7 @@ lösung: vb-wald-loesung.visustruct -`,e5=` +`,t5=` @@ -42634,7 +42634,7 @@ lösung: vb-wald-loesung.visustruct -`,t5=` +`,n5=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; @@ -42694,7 +42694,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;114;105;103;104;116;32;43;32;34;32;111;102;32;34;32;43;32;99;111;117;110;116;32;43;32;34;32;114;105;103;104;116;34; -`,n5=` +`,i5=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;119;111;114;100;115;46;99;115;118;34;41;41; @@ -42703,7 +42703,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,i5=` +`,a5=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -42722,7 +42722,7 @@ lösung: vb-wald-loesung.visustruct -`,a5=` +`,s5=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; @@ -42745,7 +42745,7 @@ lösung: vb-wald-loesung.visustruct 114;101;97;100;101;114;46;99;108;111;115;101;40;41; -`,s5=` +`,r5=` 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; @@ -42763,7 +42763,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101;32;43;32;34;32;103;111;116;32;97;32;34;32;43;32;109;97;116;104;115;32;43;32;34;32;105;110;32;109;97;116;104;115;34; -`,r5=` +`,o5=` 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;123;92;34;110;97;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;115;112;101;99;105;101;115;92;34;58;32;92;34;103;111;97;116;92;34;44;32;92;34;97;103;101;92;34;58;32;54;125;44;34; @@ -42781,7 +42781,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101; -`,o5=` +`,l5=` 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; @@ -42801,7 +42801,7 @@ lösung: vb-wald-loesung.visustruct 102;105;108;101;46;99;108;111;115;101;40;41; -`,l5=` +`,u5=` 105;110;116;91;93;91;93;32;116;97;98;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; @@ -42833,7 +42833,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; -`,u5=` +`,m5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -42881,7 +42881,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;114;101;101;58;32;34;32;43;32;102;114;101;101; -`,m5=` +`,c5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -42896,7 +42896,7 @@ lösung: vb-wald-loesung.visustruct 115;101;97;116;115;91;50;93;91;51;93;32;61;32;116;114;117;101; -`,c5=` +`,d5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -42930,7 +42930,7 @@ lösung: vb-wald-loesung.visustruct -`,d5=` +`,h5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -42948,7 +42948,7 @@ lösung: vb-wald-loesung.visustruct 105;110;112;117;116;58;32;105;110;116;32;115;101;97;116;32;34;83;101;97;116;34; -`,h5=` +`,g5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -42996,7 +42996,7 @@ lösung: vb-wald-loesung.visustruct -`,g5=` +`,p5=` 98;111;111;108;101;97;110;91;93;91;93;32;115;101;97;116;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -43020,7 +43020,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;111;119;32;49;44;32;115;101;97;116;32;50;32;115;111;108;100;63;32;34;32;43;32;115;101;97;116;115;91;49;93;91;50;93; -`,p5=` +`,f5=` 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; @@ -43035,7 +43035,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,f5=` +`,x5=` 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; @@ -43050,7 +43050,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,x5=` +`,b5=` 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; @@ -43068,7 +43068,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; -`,b5=` +`,y5=` 105;110;116;32;110;117;109;98;101;114;32;61;32;51; @@ -43083,7 +43083,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;98;101;114; -`,y5=` +`,v5=` 105;110;116;32;110;117;109;98;101;114;32;61;32;50; @@ -43098,7 +43098,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;98;101;114; -`,v5=` +`,w5=` 111;117;116;112;117;116;58;32;110;117;109;98;101;114; @@ -43113,7 +43113,7 @@ lösung: vb-wald-loesung.visustruct 110;117;109;98;101;114;32;61;32;110;117;109;98;101;114;32;43;32;51; -`,w5=` +`,z5=` 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; @@ -43137,7 +43137,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; -`,z5=` +`,I5=` 83;116;114;105;110;103;32;108;101;102;116;32;61;32;34;106;117;105;99;101;34; @@ -43152,7 +43152,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;105;103;104;116;58;32;34;32;43;32;114;105;103;104;116; -`,I5=` +`,k5=` 105;110;116;32;97;32;61;32;53; @@ -43176,7 +43176,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,k5=` +`,S5=` 105;110;116;32;97;103;101;32;61;32;49;52; @@ -43194,7 +43194,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;101;105;103;104;116;58;32;34;32;43;32;104;101;105;103;104;116;32;43;32;34;32;109;34; -`,S5=` +`,_5=` 105;110;116;32;109;105;110;117;116;101;115;32;61;32;49;51;53; @@ -43209,7 +43209,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;104;111;117;114;115;32;43;32;34;32;104;111;117;114;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;109;105;110;117;116;101;115;34; -`,_5=` +`,T5=` 105;110;116;32;99;111;117;110;116;32;61;32;51; @@ -43224,7 +43224,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108;80;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; -`,T5=` +`,O5=` 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; @@ -43239,7 +43239,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;101;102;116;58;32;34;32;43;32;99;114;101;100;105;116; -`,O5=` +`,A5=` 105;110;116;32;99;114;101;100;105;116;32;61;32;50;48; @@ -43254,7 +43254,7 @@ lösung: vb-wald-loesung.visustruct 99;114;101;100;105;116;32;61;32;99;114;101;100;105;116;32;45;32;112;114;105;99;101; -`,A5=` +`,P5=` 105;110;116;32;112;114;105;99;101;32;61;32;57; @@ -43269,7 +43269,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,P5=` +`,j5=` 105;110;116;32;108;101;110;103;116;104;32;61;32;55; @@ -43290,7 +43290,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;101;114;105;109;101;116;101;114;58;32;34;32;43;32;112;101;114;105;109;101;116;101;114; -`,j5=` +`,C5=` 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; @@ -43305,7 +43305,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; -`,C5=` +`,B5=` 105;110;116;32;115;101;99;111;110;100;115;32;61;32;50;48;48; @@ -43314,7 +43314,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;115;32;43;32;34;32;109;105;110;117;116;101;115;32;97;110;100;32;34;32;43;32;114;101;109;97;105;110;100;101;114;32;43;32;34;32;115;101;99;111;110;100;115;34; -`,B5=` +`,D5=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;104;97;116;32;105;115;32;121;111;117;114;32;110;97;109;101;63;34; @@ -43323,7 +43323,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; -`,D5=` +`,Z5=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43338,7 +43338,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; -`,Z5=` +`,M5=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43350,7 +43350,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;40;97;32;43;32;98;41; -`,M5=` +`,L5=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43362,7 +43362,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;97;32;43;32;98; -`,L5=` +`,W5=` 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;115;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -43374,7 +43374,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;104;97;116;32;105;115;32;97;98;111;117;116;32;34;32;43;32;100;97;121;115;32;43;32;34;32;100;97;121;115;46;34; -`,W5=` +`,E5=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43389,7 +43389,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;101;97;110;58;32;34;32;43;32;109;101;97;110; -`,E5=` +`,N5=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43410,7 +43410,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;114;111;100;117;99;116;58;32;34;32;43;32;112;114;111;100;117;99;116; -`,N5=` +`,F5=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -43429,7 +43429,7 @@ lösung: vb-wald-loesung.visustruct -`,F5=` +`,J5=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; @@ -43451,7 +43451,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;98;101;114; -`,J5=` +`,R5=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;78;117;109;98;101;114;63;34; @@ -43470,7 +43470,7 @@ lösung: vb-wald-loesung.visustruct -`,R5=` +`,G5=` 105;110;116;32;112;111;105;110;116;115;32;61;32;48; @@ -43488,7 +43488,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; -`,G5=` +`,H5=` 105;110;116;32;112;111;105;110;116;115;32;61;32;48; @@ -43506,7 +43506,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;105;110;116;115;58;32;34;32;43;32;112;111;105;110;116;115; -`,H5=` +`,V5=` 105;110;116;32;112;114;105;99;101;32;61;32;56; @@ -43524,7 +43524,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,V5=` +`,Q5=` 105;110;116;32;112;114;105;99;101;32;61;32;56; @@ -43542,7 +43542,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,Q5=` +`,q5=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -43564,7 +43564,7 @@ lösung: vb-wald-loesung.visustruct -`,q5=` +`,U5=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;105;99;101;32;34;80;114;105;99;101;32;105;110;32;101;117;114;111;115;63;34; @@ -43586,7 +43586,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;32;112;97;121;58;32;34;32;43;32;112;114;105;99;101;32;43;32;34;32;101;117;114;111;115;34; -`,U5=` +`,$5=` 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; @@ -43605,7 +43605,7 @@ lösung: vb-wald-loesung.visustruct -`,$5=` +`,Y5=` 105;110;112;117;116;58;32;105;110;116;32;112;111;105;110;116;115;32;34;72;111;119;32;109;97;110;121;32;112;111;105;110;116;115;63;34; @@ -43624,7 +43624,7 @@ lösung: vb-wald-loesung.visustruct -`,Y5=` +`,X5=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -43643,7 +43643,7 @@ lösung: vb-wald-loesung.visustruct -`,X5=` +`,K5=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -43662,7 +43662,7 @@ lösung: vb-wald-loesung.visustruct -`,K5=` +`,e6=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -43681,7 +43681,7 @@ lösung: vb-wald-loesung.visustruct -`,e6=` +`,t6=` 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;71;114;97;100;101;63;34; @@ -43700,7 +43700,7 @@ lösung: vb-wald-loesung.visustruct -`,t6=` +`,n6=` 105;110;112;117;116;58;32;105;110;116;32;121;101;97;114;32;34;89;101;97;114;63;34; @@ -43719,7 +43719,7 @@ lösung: vb-wald-loesung.visustruct -`,n6=` +`,i6=` 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;68;97;121;32;40;49;32;116;111;32;55;41;63;34; @@ -43738,7 +43738,7 @@ lösung: vb-wald-loesung.visustruct -`,i6=` +`,a6=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;108;111;114;32;34;87;104;97;116;32;99;111;108;111;114;32;105;115;32;116;104;101;32;116;114;97;102;102;105;99;32;108;105;103;104;116;63;34; @@ -43767,7 +43767,7 @@ lösung: vb-wald-loesung.visustruct -`,a6=` +`,s6=` 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; @@ -43796,7 +43796,7 @@ lösung: vb-wald-loesung.visustruct -`,s6=` +`,r6=` 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; @@ -43815,7 +43815,7 @@ lösung: vb-wald-loesung.visustruct -`,r6=` +`,o6=` 105;110;112;117;116;58;32;105;110;116;32;100;97;121;32;34;87;104;105;99;104;32;100;97;121;32;40;49;32;116;111;32;55;41;63;34; @@ -43834,7 +43834,7 @@ lösung: vb-wald-loesung.visustruct -`,o6=` +`,l6=` 105;110;112;117;116;58;32;105;110;116;32;104;111;117;114;32;34;87;104;97;116;32;116;105;109;101;32;105;115;32;105;116;32;40;106;117;115;116;32;116;104;101;32;104;111;117;114;41;63;34; @@ -43853,7 +43853,7 @@ lösung: vb-wald-loesung.visustruct -`,l6=` +`,u6=` 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101;32;34;87;104;105;99;104;32;103;114;97;100;101;63;34; @@ -43897,7 +43897,7 @@ lösung: vb-wald-loesung.visustruct -`,u6=` +`,m6=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; @@ -43944,7 +43944,7 @@ lösung: vb-wald-loesung.visustruct -`,m6=` +`,c6=` 105;110;112;117;116;58;32;105;110;116;32;99;104;111;105;99;101;32;34;49;32;119;97;116;101;114;44;32;50;32;106;117;105;99;101;44;32;51;32;99;111;99;111;97;34; @@ -43983,52 +43983,52 @@ lösung: vb-wald-loesung.visustruct -`,c6=` +`,d6=` - + 80;117;116;32;97;32;99;117;112;32;111;110;32;116;104;101;32;116;97;98;108;101; - + 83;117;103;97;114;32;119;97;110;116;101;100;63; - + 65;100;100;32;115;117;103;97;114; - + 248; - + 84;101;97;32;115;116;105;108;108;32;116;111;111;32;104;111;116; - + 87;97;105;116;32;49;32;109;105;110;117;116;101; - + 68;114;105;110;107;32;116;104;101;32;116;101;97; -`,d6=` +`,h6=` - + 71;101;116;32;117;112; - + 66;114;117;115;104;32;116;101;101;116;104; - + 71;101;116;32;100;114;101;115;115;101;100; - + 72;97;118;101;32;98;114;101;97;107;102;97;115;116; -`,h6=` +`,g6=` 70;105;108;108;32;116;104;101;32;107;101;116;116;108;101;32;119;105;116;104;32;119;97;116;101;114; @@ -44049,40 +44049,40 @@ lösung: vb-wald-loesung.visustruct 84;97;107;101;32;111;117;116;32;116;104;101;32;116;101;97;32;98;97;103; -`,g6=` +`,p6=` - + 73;115;32;105;116;32;114;97;105;110;105;110;103;63; - + 80;97;99;107;32;97;110;32;117;109;98;114;101;108;108;97; - + 80;97;99;107;32;115;117;110;103;108;97;115;115;101;115; - + 76;101;97;118;101; -`,p6=` +`,f6=` - + 80;108;97;116;101;32;110;111;116;32;101;109;112;116;121; - + 84;97;107;101;32;97;32;98;105;116;101; - + 67;108;101;97;114;32;116;104;101;32;112;108;97;116;101; -`,f6=` +`,x6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;117;110;116;32;117;112;32;116;111;63;34; @@ -44102,7 +44102,7 @@ lösung: vb-wald-loesung.visustruct -`,x6=` +`,b6=` 105;110;116;32;110;117;109;98;101;114;32;61;32;51; @@ -44122,7 +44122,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,b6=` +`,y6=` 105;110;116;32;110;117;109;98;101;114;32;61;32;51; @@ -44139,7 +44139,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,y6=` +`,v6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;99;116;111;114;105;97;108;32;111;102;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44165,7 +44165,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;99;116;111;114;105;97;108; -`,v6=` +`,w6=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -44200,7 +44200,7 @@ lösung: vb-wald-loesung.visustruct -`,w6=` +`,z6=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;63;34; @@ -44235,7 +44235,7 @@ lösung: vb-wald-loesung.visustruct -`,z6=` +`,I6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44264,7 +44264,7 @@ lösung: vb-wald-loesung.visustruct -`,I6=` +`,k6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; @@ -44287,7 +44287,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;116;101;112;115; -`,k6=` +`,S6=` 105;110;116;32;110;117;109;98;101;114;32;61;32;48; @@ -44304,7 +44304,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;104;97;110;107;32;121;111;117;33;34; -`,S6=` +`,_6=` 105;110;116;32;105;32;61;32;49;48; @@ -44321,7 +44321,7 @@ lösung: vb-wald-loesung.visustruct -`,_6=` +`,T6=` 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; @@ -44347,7 +44347,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; -`,T6=` +`,O6=` 105;110;112;117;116;58;32;105;110;116;32;103;111;97;108;32;34;83;97;118;105;110;103;115;32;103;111;97;108;63;34; @@ -44373,7 +44373,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;101;101;107;115;58;32;34;32;43;32;119;101;101;107;115; -`,O6=` +`,A6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;101;114;101;63;34; @@ -44393,7 +44393,7 @@ lösung: vb-wald-loesung.visustruct -`,A6=` +`,P6=` 105;110;116;32;103;114;97;100;101;32;61;32;48; @@ -44410,7 +44410,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;89;111;117;114;32;103;114;97;100;101;58;32;34;32;43;32;103;114;97;100;101; -`,P6=` +`,j6=` 105;110;116;32;115;117;109;32;61;32;48; @@ -44433,7 +44433,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,j6=` +`,C6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;32;110;117;109;98;101;114;34; @@ -44452,7 +44452,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;111;33;34; -`,C6=` +`,B6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; @@ -44471,7 +44471,7 @@ lösung: vb-wald-loesung.visustruct -`,B6=` +`,D6=` 105;110;116;32;105;32;61;32;49; @@ -44484,7 +44484,7 @@ lösung: vb-wald-loesung.visustruct -`,D6=` +`,Z6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; @@ -44501,7 +44501,7 @@ lösung: vb-wald-loesung.visustruct -`,Z6=` +`,M6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; @@ -44518,7 +44518,7 @@ lösung: vb-wald-loesung.visustruct -`,M6=` +`,L6=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;110;117;109;98;101;114;63;34; @@ -44535,7 +44535,7 @@ lösung: vb-wald-loesung.visustruct -`,L6=` +`,W6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44557,7 +44557,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,W6=` +`,E6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;108;105;110;101;115;63;34; @@ -44586,7 +44586,7 @@ lösung: vb-wald-loesung.visustruct -`,E6=` +`,N6=` 105;110;116;32;99;111;117;110;116;32;61;32;48; @@ -44618,7 +44618,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;99;111;117;110;116; -`,N6=` +`,F6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44650,7 +44650,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;99;111;117;110;116; -`,F6=` +`,J6=` 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; @@ -44666,7 +44666,7 @@ lösung: vb-wald-loesung.visustruct -`,J6=` +`,R6=` 105;110;112;117;116;58;32;105;110;116;32;114;111;119;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; @@ -44682,7 +44682,7 @@ lösung: vb-wald-loesung.visustruct -`,R6=` +`,G6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44698,7 +44698,7 @@ lösung: vb-wald-loesung.visustruct -`,G6=` +`,H6=` 105;110;112;117;116;58;32;105;110;116;32;119;105;100;116;104;32;34;87;105;100;116;104;34; @@ -44730,7 +44730,7 @@ lösung: vb-wald-loesung.visustruct -`,H6=` +`,V6=` 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; @@ -44746,7 +44746,7 @@ lösung: vb-wald-loesung.visustruct -`,V6=` +`,Q6=` 105;110;116;91;93;32;118;97;108;117;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; @@ -44761,7 +44761,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;118;97;108;117;101;115;46;108;101;110;103;116;104; -`,Q6=` +`,q6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44793,7 +44793,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; -`,q6=` +`,U6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -44825,7 +44825,7 @@ lösung: vb-wald-loesung.visustruct -`,U6=` +`,$6=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;72;111;119;32;109;97;110;121;32;115;116;101;112;115;63;34; @@ -44854,7 +44854,7 @@ lösung: vb-wald-loesung.visustruct -`,$6=` +`,Y6=` 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; @@ -44873,7 +44873,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;105;114;115;116;32;110;97;109;101;58;32;34;32;43;32;110;97;109;101;115;91;48;93; -`,Y6=` +`,X6=` 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;52;93; @@ -44899,7 +44899,7 @@ lösung: vb-wald-loesung.visustruct -`,X6=` +`,K6=` 105;110;116;91;93;32;110;117;109;98;101;114;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -44950,7 +44950,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,K6=` +`,ez=` 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; @@ -44991,7 +44991,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,ez=` +`,tz=` 105;110;116;32;115;117;109;32;61;32;48; @@ -45014,7 +45014,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; -`,tz=` +`,nz=` 105;110;116;32;115;117;109;32;61;32;48; @@ -45044,7 +45044,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; -`,nz=` +`,iz=` 105;110;112;117;116;58;32;105;110;116;32;108;101;110;103;116;104;32;34;76;101;110;103;116;104;63;34; @@ -45059,13 +45059,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;114;101;97;58;32;34;32;43;32;102; -`,iz=` +`,az=` 114;101;116;117;114;110;32;97;32;42;32;98; -`,az=` +`,sz=` 115;104;111;119;71;114;101;101;116;105;110;103;40;41; @@ -45077,7 +45077,7 @@ lösung: vb-wald-loesung.visustruct 115;104;111;119;82;101;115;117;108;116;40;41; -`,sz=` +`,rz=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -45109,7 +45109,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; -`,rz=` +`,oz=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -45141,7 +45141,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;105;103;104;101;115;116;32;116;101;109;112;101;114;97;116;117;114;101;58;32;34;32;43;32;109;97;120; -`,oz=` +`,lz=` 105;110;116;91;93;32;103;114;97;100;101;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; @@ -45163,7 +45163,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; -`,lz=` +`,uz=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -45175,7 +45175,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;104;101;32;115;113;117;97;114;101;32;105;115;32;34;32;43;32;113; -`,uz=` +`,mz=` 105;110;116;32;114;101;115;117;108;116;32;61;32;120;32;42;32;120; @@ -45184,7 +45184,7 @@ lösung: vb-wald-loesung.visustruct 114;101;116;117;114;110;32;114;101;115;117;108;116; -`,mz=` +`,cz=` 115;104;111;119;84;105;116;108;101;40;41; @@ -45196,7 +45196,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;34;32;43;32;110;97;109;101; -`,cz=` +`,dz=` 111;117;116;112;117;116;58;32;34;87;101;108;99;111;109;101;32;116;111;32;116;104;101;32;113;117;105;122;33;34; @@ -45205,7 +45205,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;89;111;117;32;103;101;116;32;116;104;114;101;101;32;113;117;101;115;116;105;111;110;115;46;34; -`,dz=` +`,hz=` 115;104;111;119;83;117;109;40;51;44;32;52;41; @@ -45217,7 +45217,7 @@ lösung: vb-wald-loesung.visustruct 115;104;111;119;83;117;109;40;120;44;32;120;32;43;32;49;41; -`,hz=` +`,gz=` 105;110;116;32;115;117;109;32;61;32;97;32;43;32;98; @@ -45226,7 +45226,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109; -`,gz=` +`,pz=` 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; @@ -45249,7 +45249,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;111;33;34; -`,pz=` +`,fz=` 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;32;118;97;108;117;101;34; @@ -45272,7 +45272,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;111;34; -`,fz=` +`,xz=` 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -45294,7 +45294,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; -`,xz=` +`,bz=` 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -45316,7 +45316,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;108;97;121;101;114;32;50;58;32;34;32;43;32;116;111;116;97;108; -`,bz=` +`,yz=` 105;110;116;91;93;91;93;32;112;111;105;110;116;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; @@ -45345,7 +45345,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;58;32;34;32;43;32;115;117;109; -`,yz=` +`,vz=` 105;110;116;32;115;117;109;32;61;32;48; @@ -45368,7 +45368,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,vz=` +`,wz=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -45390,7 +45390,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,wz=` +`,zz=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -45412,7 +45412,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109; -`,zz=` +`,Iz=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;87;104;105;99;104;32;116;105;109;101;115;32;116;97;98;108;101;63;34; @@ -45444,7 +45444,7 @@ lösung: vb-wald-loesung.visustruct -`,Iz=` +`,kz=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;69;110;116;101;114;32;97;32;110;117;109;98;101;114;34; @@ -45466,7 +45466,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;97;99;116;111;114;105;97;108; -`,kz=` +`,Sz=` 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; @@ -45498,13 +45498,13 @@ lösung: vb-wald-loesung.visustruct -`,Sz=` +`,_z=` 83;116;114;105;110;103;32;108;101;116;116;101;114;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;101;116;116;101;114;46;116;120;116;34;41;41; -`,_z=` +`,Tz=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; @@ -45516,7 +45516,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,Tz=` +`,Oz=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;32;34;70;105;114;115;116;32;110;97;109;101;63;34; @@ -45528,7 +45528,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;105;114;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; -`,Oz=` +`,Az=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;105;110;112;117;116;32;34;80;97;115;115;119;111;114;100;63;34; @@ -45547,7 +45547,7 @@ lösung: vb-wald-loesung.visustruct -`,Az=` +`,Pz=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -45576,7 +45576,7 @@ lösung: vb-wald-loesung.visustruct -`,Pz=` +`,jz=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;98;101;114;32;34;83;116;97;114;116;32;118;97;108;117;101;63;34; @@ -45596,7 +45596,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;110;100;34; -`,jz=` +`,Cz=` 105;110;116;32;116;114;105;101;115;32;61;32;48; @@ -45629,7 +45629,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; -`,Cz=` +`,Bz=` 105;110;116;32;116;114;105;101;115;32;61;32;48; @@ -45662,7 +45662,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;114;105;101;115;58;32;34;32;43;32;116;114;105;101;115; -`,Bz=` +`,Dz=` 105;110;116;32;115;117;109;32;61;32;48; @@ -45704,7 +45704,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;117;109; -`,Dz=` +`,Zz=` 105;110;112;117;116;58;32;105;110;116;32;97;103;101;32;34;72;111;119;32;111;108;100;32;97;114;101;32;121;111;117;63;34; @@ -45726,7 +45726,7 @@ lösung: vb-wald-loesung.visustruct -`,Zz=` +`,Mz=` 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;32;34;85;112;32;116;111;32;119;104;105;99;104;32;110;117;109;98;101;114;63;34; @@ -45742,7 +45742,7 @@ lösung: vb-wald-loesung.visustruct -`,Mz=` +`,Lz=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -45781,7 +45781,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; -`,Lz=` +`,Wz=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -45820,7 +45820,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; -`,Wz=` +`,Ez=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -45855,7 +45855,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;99;111;117;110;116; -`,Ez=` +`,Nz=` 111;117;116;112;117;116;58;32;34;71;111;111;100;32;109;111;114;110;105;110;103;34; @@ -45864,13 +45864,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;100;97;121;32;119;101;32;108;101;97;114;110;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;46;34; -`,Nz=` +`,Fz=` 111;117;116;112;117;116;58;32;34;72;101;108;108;111;32;87;111;114;108;100;34; -`,Fz=` +`,Jz=` 111;117;116;112;117;116;58;32;34;72;101;108;108;111;34; @@ -45879,7 +45879,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;73;32;97;109;32;108;101;97;114;110;105;110;103;32;115;116;114;117;99;116;117;114;101;32;99;104;97;114;116;115;34; -`,Jz=` +`,Rz=` 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; @@ -45920,7 +45920,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;108;105;110;101;115;32;115;97;118;101;100;34; -`,Rz=` +`,Gz=` 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; @@ -45929,7 +45929,7 @@ lösung: vb-wald-loesung.visustruct 80;114;105;110;116;87;114;105;116;101;114;32;111;117;116;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;115;104;111;112;112;105;110;103;45;110;101;119;46;116;120;116;34;41; -`,Gz=` +`,Hz=` 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; @@ -45955,13 +45955,13 @@ lösung: vb-wald-loesung.visustruct 102;105;108;101;46;99;108;111;115;101;40;41; -`,Hz=` +`,Vz=` 83;99;97;110;110;101;114;32;102;105;108;101;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;115;104;111;112;112;105;110;103;46;116;120;116;34;41;41; -`,Vz=` +`,Qz=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; @@ -46000,7 +46000,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;111;120;58;32;34;32;43;32;99;111;117;110;116; -`,Qz=` +`,qz=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; @@ -46009,7 +46009,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,qz=` +`,Uz=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; @@ -46044,7 +46044,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;111;110;103;101;115;116;32;101;110;116;114;121;58;32;34;32;43;32;108;111;110;103;101;115;116; -`,Uz=` +`,$z=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;111;111;107;46;116;120;116;34;41;41; @@ -46053,7 +46053,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;108;105;110;101;115;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; -`,$z=` +`,Yz=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; @@ -46107,7 +46107,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;66;101;115;116;32;103;114;97;100;101;32;105;110;32;69;110;103;108;105;115;104;58;32;34;32;43;32;98;101;115;116;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;71;114;97;100;101;32;43;32;34;41;34; -`,Yz=` +`,Xz=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; @@ -46116,7 +46116,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,Xz=` +`,Kz=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; @@ -46157,7 +46157,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;116;104;115;32;97;118;101;114;97;103;101;58;32;34;32;43;32;115;117;109;32;47;32;99;111;117;110;116; -`,Kz=` +`,e7=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;99;108;97;115;115;46;99;115;118;34;41;41; @@ -46166,7 +46166,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,e7=` +`,t7=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -46205,7 +46205,7 @@ lösung: vb-wald-loesung.visustruct 114;101;97;100;101;114;46;99;108;111;115;101;40;41; -`,t7=` +`,n7=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -46214,7 +46214,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;101;32;61;32;114;101;97;100;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,n7=` +`,i7=` 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; @@ -46264,7 +46264,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;105;101;115;32;115;97;118;101;100;34; -`,i7=` +`,a7=` 83;116;114;105;110;103;91;93;32;110;97;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;111;120;34;125; @@ -46282,7 +46282,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;46;99;108;111;115;101;40;41; -`,a7=` +`,s7=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; @@ -46335,7 +46335,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;40;108;105;110;101;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;108;115;32;115;97;118;101;100;34; -`,s7=` +`,r7=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; @@ -46356,7 +46356,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;46;99;108;111;115;101;40;41; -`,r7=` +`,o7=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; @@ -46400,7 +46400,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;99;111;117;110;116;32;43;32;34;32;115;101;110;116;101;110;99;101;115;32;115;97;118;101;100;34; -`,o7=` +`,l7=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;114;101;97;100;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;108;115;46;99;115;118;34;41;41; @@ -46421,7 +46421,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;46;99;108;111;115;101;40;41; -`,l7=` +`,u7=` 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; @@ -46433,7 +46433,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,u7=` +`,m7=` 105;110;112;117;116;58;32;105;110;116;32;99;111;117;110;116;32;34;72;111;119;32;109;97;110;121;32;116;105;99;107;101;116;115;63;34; @@ -46445,7 +46445,7 @@ lösung: vb-wald-loesung.visustruct 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;99;111;117;110;116;32;42;32;56;46;53; -`,m7=` +`,c7=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; @@ -46469,7 +46469,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,c7=` +`,d7=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;70;105;114;115;116;32;110;117;109;98;101;114;34; @@ -46490,7 +46490,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,d7=` +`,h7=` 105;110;116;32;97;32;61;32;51; @@ -46514,7 +46514,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,h7=` +`,g7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -46573,7 +46573,7 @@ lösung: vb-wald-loesung.visustruct -`,g7=` +`,p7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -46632,7 +46632,7 @@ lösung: vb-wald-loesung.visustruct -`,p7=` +`,f7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -46706,7 +46706,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; -`,f7=` +`,x7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; @@ -46755,7 +46755,7 @@ lösung: vb-wald-loesung.visustruct -`,x7=` +`,b7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -46804,7 +46804,7 @@ lösung: vb-wald-loesung.visustruct -`,b7=` +`,y7=` 105;110;116;91;93;32;99;97;114;100;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -46862,7 +46862,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;105;115;111;110;115;58;32;34;32;43;32;99;111;109;112;97;114;105;115;111;110;115; -`,y7=` +`,v7=` 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; @@ -46881,7 +46881,7 @@ lösung: vb-wald-loesung.visustruct -`,v7=` +`,w7=` 105;110;116;91;93;32;112;111;105;110;116;115;32;61;32;123;51;44;32;53;44;32;56;125; @@ -46900,7 +46900,7 @@ lösung: vb-wald-loesung.visustruct -`,w7=` +`,z7=` 105;110;116;32;105;32;61;32;48; @@ -46913,7 +46913,7 @@ lösung: vb-wald-loesung.visustruct -`,z7=` +`,I7=` 105;110;116;32;110;117;109;98;101;114;32;61;32;53; @@ -46937,7 +46937,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;102;116;101;114;58;32;34;32;43;32;114;111;119;91;48;93;32;43;32;34;44;32;34;32;43;32;114;111;119;91;49;93; -`,I7=` +`,k7=` 105;110;116;32;105;32;61;32;48; @@ -46950,7 +46950,7 @@ lösung: vb-wald-loesung.visustruct -`,k7=` +`,S7=` 120;32;61;32;120;32;42;32;50; @@ -46959,7 +46959,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;73;110;32;116;104;101;32;115;117;98;112;114;111;103;114;97;109;58;32;120;32;61;32;34;32;43;32;120; -`,S7=` +`,_7=` 105;110;116;32;100;105;115;116;97;110;99;101;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; @@ -46968,7 +46968,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34;41; -`,_7=` +`,T7=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; @@ -46994,7 +46994,7 @@ lösung: vb-wald-loesung.visustruct -`,T7=` +`,O7=` 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; @@ -47021,7 +47021,7 @@ lösung: vb-wald-loesung.visustruct -`,O7=` +`,A7=` 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; @@ -47039,7 +47039,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; -`,A7=` +`,P7=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -47069,7 +47069,7 @@ lösung: vb-wald-loesung.visustruct -`,P7=` +`,j7=` 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;101;108;108;111;33;34;41; @@ -47081,7 +47081,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;32;97;109;32;86;105;115;117;66;111;116;34;41; -`,j7=` +`,C7=` 105;110;116;32;110;117;109;98;101;114;32;61;32;48; @@ -47133,7 +47133,7 @@ lösung: vb-wald-loesung.visustruct -`,C7=` +`,B7=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; @@ -47144,7 +47144,7 @@ lösung: vb-wald-loesung.visustruct -`,B7=` +`,D7=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -47155,7 +47155,7 @@ lösung: vb-wald-loesung.visustruct -`,D7=` +`,Z7=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -47166,7 +47166,7 @@ lösung: vb-wald-loesung.visustruct -`,Z7=` +`,M7=` 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;86;105;115;117;66;111;116;34; @@ -47185,7 +47185,7 @@ lösung: vb-wald-loesung.visustruct -`,M7=` +`,L7=` 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;101;100;34;41; @@ -47197,7 +47197,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;101;101;110;34;41; -`,L7=` +`,W7=` 105;110;116;32;105;32;61;32;48; @@ -47213,7 +47213,7 @@ lösung: vb-wald-loesung.visustruct -`,W7=` +`,E7=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; @@ -47241,7 +47241,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;80;97;114;107;101;100;33;34;41; -`,E7=` +`,N7=` 83;116;114;105;110;103;91;93;32;99;111;108;111;117;114;115;32;61;32;123;34;114;101;100;34;44;32;34;121;101;108;108;111;119;34;44;32;34;103;114;101;101;110;34;44;32;34;98;108;117;101;34;44;32;34;112;117;114;112;108;101;34;125; @@ -47257,7 +47257,7 @@ lösung: vb-wald-loesung.visustruct -`,N7=` +`,F7=` 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; @@ -47283,7 +47283,7 @@ lösung: vb-wald-loesung.visustruct -`,F7=` +`,J7=` 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; @@ -47300,7 +47300,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,J7=` +`,R7=` 109;98;111;116;46;102;111;114;119;97;114;100;40;41; @@ -47318,7 +47318,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;41; -`,R7=` +`,G7=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; @@ -47354,7 +47354,7 @@ lösung: vb-wald-loesung.visustruct -`,G7=` +`,H7=` 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;66;97;116;116;101;114;121;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; @@ -47373,7 +47373,7 @@ lösung: vb-wald-loesung.visustruct -`,H7=` +`,V7=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;117;101;34;41; @@ -47397,7 +47397,7 @@ lösung: vb-wald-loesung.visustruct -`,V7=` +`,Q7=` 105;110;116;32;105;32;61;32;48; @@ -47419,7 +47419,7 @@ lösung: vb-wald-loesung.visustruct -`,Q7=` +`,q7=` 105;110;116;32;105;32;61;32;51; @@ -47438,7 +47438,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;111;33;34;41; -`,q7=` +`,U7=` 105;110;116;32;105;32;61;32;49; @@ -47451,7 +47451,7 @@ lösung: vb-wald-loesung.visustruct -`,U7=` +`,$7=` 105;110;116;32;105;32;61;32;48; @@ -47484,7 +47484,7 @@ lösung: vb-wald-loesung.visustruct -`,$7=` +`,Y7=` 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; @@ -47500,7 +47500,7 @@ lösung: vb-wald-loesung.visustruct -`,Y7=` +`,X7=` 105;110;116;32;105;32;61;32;48; @@ -47519,7 +47519,7 @@ lösung: vb-wald-loesung.visustruct -`,X7=` +`,K7=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -47563,7 +47563,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,K7=` +`,eI=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; @@ -47582,7 +47582,7 @@ lösung: vb-wald-loesung.visustruct -`,eI=` +`,tI=` 105;110;116;32;115;116;101;112;115;32;61;32;48; @@ -47612,7 +47612,7 @@ lösung: vb-wald-loesung.visustruct -`,tI=` +`,nI=` 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; @@ -47640,7 +47640,7 @@ lösung: vb-wald-loesung.visustruct -`,nI=` +`,iI=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;101;108;108;111;32;99;108;97;115;115;34; @@ -47649,7 +47649,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; -`,iI=` +`,aI=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -47663,7 +47663,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; -`,aI=` +`,sI=` 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; @@ -47679,7 +47679,7 @@ lösung: vb-wald-loesung.visustruct -`,sI=` +`,rI=` 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; @@ -47693,7 +47693,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; -`,rI=` +`,oI=` 105;110;116;32;105;32;61;32;48; @@ -47728,7 +47728,7 @@ lösung: vb-wald-loesung.visustruct -`,oI=` +`,lI=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -47762,7 +47762,7 @@ lösung: vb-wald-loesung.visustruct -`,lI=` +`,uI=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;101;100;34;41; @@ -47806,7 +47806,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,uI=` +`,mI=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41; @@ -47832,7 +47832,7 @@ lösung: vb-wald-loesung.visustruct -`,mI=` +`,cI=` 105;110;116;91;93;32;116;111;110;101;115;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; @@ -47848,7 +47848,7 @@ lösung: vb-wald-loesung.visustruct -`,cI=` +`,dI=` 105;110;116;32;105;32;61;32;48; @@ -47914,7 +47914,7 @@ lösung: vb-wald-loesung.visustruct -`,dI=` +`,hI=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; @@ -47930,7 +47930,7 @@ lösung: vb-wald-loesung.visustruct -`,hI=` +`,gI=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; @@ -47947,7 +47947,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; -`,gI=` +`,pI=` 105;110;112;117;116;58;32;105;110;116;32;103;114;97;100;101; @@ -47976,7 +47976,7 @@ lösung: vb-wald-loesung.visustruct -`,pI=` +`,fI=` 105;110;116;32;97;32;61;32;115;113;117;97;114;101;78;117;109;98;101;114;40;51;41; @@ -47991,13 +47991,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,fI=` +`,xI=` 114;101;116;117;114;110;32;120;32;42;32;120; -`,xI=` +`,bI=` 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;76;117;100;119;105;103;34; @@ -48019,7 +48019,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;97;99;107;119;97;114;100;115; -`,bI=` +`,yI=` 105;110;116;32;108;101;110;103;116;104;32;61;32;54;48; @@ -48034,7 +48034,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;105;115;116;97;110;99;101;58;32;34;32;43;32;100;105;115;116;97;110;99;101;32;43;32;34;32;99;109;34; -`,yI=` +`,vI=` 105;110;116;91;93;32;103;114;97;100;101;115;32;61;32;123;50;44;32;49;44;32;51;44;32;50;125; @@ -48059,7 +48059,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;117;110;116;58;32;34;32;43;32;103;114;97;100;101;115;46;108;101;110;103;116;104; -`,vI=` +`,wI=` 109;98;111;116;46;102;111;114;119;97;114;100;40;41; @@ -48134,7 +48134,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; -`,wI=` +`,zI=` 115;113;117;97;114;101;40;51;48;41; @@ -48143,7 +48143,7 @@ lösung: vb-wald-loesung.visustruct 115;113;117;97;114;101;40;53;48;41; -`,zI=` +`,II=` 105;110;116;32;105;32;61;32;48; @@ -48198,7 +48198,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; -`,II=` +`,kI=` 105;110;116;32;105;32;61;32;48; @@ -48214,7 +48214,7 @@ lösung: vb-wald-loesung.visustruct -`,kI=` +`,SI=` 105;110;116;32;105;32;61;32;48; @@ -48237,7 +48237,7 @@ lösung: vb-wald-loesung.visustruct -`,SI=` +`,_I=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -48251,7 +48251,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; -`,_I=` +`,TI=` 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; @@ -48267,7 +48267,7 @@ lösung: vb-wald-loesung.visustruct -`,TI=` +`,OI=` 105;110;116;32;105;32;61;32;48; @@ -48319,7 +48319,7 @@ lösung: vb-wald-loesung.visustruct -`,OI=` +`,AI=` 105;110;116;32;105;32;61;32;49; @@ -48335,7 +48335,7 @@ lösung: vb-wald-loesung.visustruct -`,AI=` +`,PI=` 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; @@ -48349,7 +48349,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; -`,PI=` +`,jI=` 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; @@ -48367,7 +48367,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; -`,jI=` +`,CI=` 105;110;116;32;105;32;61;32;48; @@ -48389,7 +48389,7 @@ lösung: vb-wald-loesung.visustruct -`,CI=` +`,BI=` 105;110;116;32;108;101;102;116;32;61;32;57;57; @@ -48421,7 +48421,7 @@ lösung: vb-wald-loesung.visustruct -`,BI=` +`,DI=` 105;110;116;32;115;105;100;101;32;61;32;51;48; @@ -48440,7 +48440,7 @@ lösung: vb-wald-loesung.visustruct -`,DI=` +`,ZI=` 105;110;116;32;105;32;61;32;48; @@ -48473,7 +48473,7 @@ lösung: vb-wald-loesung.visustruct -`,ZI=` +`,MI=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -48512,7 +48512,7 @@ lösung: vb-wald-loesung.visustruct -`,MI=` +`,LI=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; @@ -48528,7 +48528,7 @@ lösung: vb-wald-loesung.visustruct -`,LI=` +`,WI=` 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; @@ -48548,7 +48548,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,WI=` +`,EI=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;105;114;115;116;78;97;109;101;32;34;70;105;114;115;116;32;110;97;109;101;34; @@ -48560,7 +48560,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;105;114;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;108;97;115;116;78;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,EI=` +`,NI=` 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; @@ -48599,7 +48599,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;116;101;120;116; -`,NI=` +`,FI=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; @@ -48621,7 +48621,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;97;99;107;119;97;114;100;115; -`,FI=` +`,JI=` 83;116;114;105;110;103;32;108;105;110;101;32;61;32;34;76;117;100;119;105;103;59;98;105;108;108;121;32;103;111;97;116;59;55;34; @@ -48640,7 +48640,7 @@ lösung: vb-wald-loesung.visustruct -`,JI=` +`,RI=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;110;116;101;110;99;101;32;34;69;110;116;101;114;32;97;32;115;101;110;116;101;110;99;101;34; @@ -48652,7 +48652,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;111;114;100;115;58;32;34;32;43;32;119;111;114;100;115;46;108;101;110;103;116;104; -`,RI=` +`,GI=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;100;32;34;69;110;116;101;114;32;97;32;119;111;114;100;34; @@ -48684,7 +48684,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;78;117;109;98;101;114;32;111;102;32;101;58;32;34;32;43;32;99;111;117;110;116; -`,GI=` +`,HI=` 83;116;114;105;110;103;32;119;111;114;100;32;61;32;34;66;105;108;108;121;103;111;97;116;34; @@ -48708,7 +48708,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;119;111;114;100;46;116;111;85;112;112;101;114;67;97;115;101;40;41; -`,HI=` +`,VI=` 105;110;116;91;93;91;93;32;116;97;98;101;108;108;101;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; @@ -48740,7 +48740,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;108;101;91;97;32;45;32;49;93;91;98;32;45;32;49;93; -`,VI=` +`,QI=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48788,7 +48788,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;114;101;105;58;32;34;32;43;32;102;114;101;105; -`,QI=` +`,qI=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48803,7 +48803,7 @@ lösung: vb-wald-loesung.visustruct 115;105;116;122;101;91;50;93;91;51;93;32;61;32;116;114;117;101; -`,qI=` +`,UI=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48837,7 +48837,7 @@ lösung: vb-wald-loesung.visustruct -`,UI=` +`,$I=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48855,7 +48855,7 @@ lösung: vb-wald-loesung.visustruct 105;110;112;117;116;58;32;105;110;116;32;112;108;97;116;122;32;34;80;108;97;116;122;34; -`,$I=` +`,YI=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48903,7 +48903,7 @@ lösung: vb-wald-loesung.visustruct -`,YI=` +`,XI=` 98;111;111;108;101;97;110;91;93;91;93;32;115;105;116;122;101;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -48927,7 +48927,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;105;104;101;32;49;44;32;80;108;97;116;122;32;50;32;118;101;114;107;97;117;102;116;63;32;34;32;43;32;115;105;116;122;101;91;49;93;91;50;93; -`,XI=` +`,KI=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -48942,7 +48942,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,KI=` +`,e8=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -48957,7 +48957,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;32;43;32;34;32;115;34; -`,e8=` +`,t8=` 83;116;114;105;110;103;32;110;97;109;101;32;61;32;34;76;117;100;119;105;103;34; @@ -48975,7 +48975,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; -`,t8=` +`,n8=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -48990,7 +48990,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,n8=` +`,i8=` 105;110;116;32;122;97;104;108;32;61;32;50; @@ -49005,7 +49005,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,i8=` +`,a8=` 111;117;116;112;117;116;58;32;122;97;104;108; @@ -49020,7 +49020,7 @@ lösung: vb-wald-loesung.visustruct 122;97;104;108;32;61;32;122;97;104;108;32;43;32;51; -`,a8=` +`,s8=` 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; @@ -49044,7 +49044,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; -`,s8=` +`,r8=` 83;116;114;105;110;103;32;108;105;110;107;115;32;61;32;34;83;97;102;116;34; @@ -49059,7 +49059,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;99;104;116;115;58;32;34;32;43;32;114;101;99;104;116;115; -`,r8=` +`,o8=` 105;110;116;32;97;32;61;32;53; @@ -49083,7 +49083,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,o8=` +`,l8=` 105;110;116;32;97;108;116;101;114;32;61;32;49;52; @@ -49101,7 +49101,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;114;246;223;101;58;32;34;32;43;32;103;114;111;101;115;115;101;32;43;32;34;32;109;34; -`,l8=` +`,u8=` 105;110;116;32;109;105;110;117;116;101;110;32;61;32;49;51;53; @@ -49116,7 +49116,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;116;117;110;100;101;110;32;43;32;34;32;83;116;117;110;100;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;77;105;110;117;116;101;110;34; -`,u8=` +`,m8=` 105;110;116;32;97;110;122;97;104;108;32;61;32;51; @@ -49131,7 +49131,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116;80;114;101;105;115;32;43;32;34;32;69;117;114;111;34; -`,m8=` +`,c8=` 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; @@ -49146,7 +49146,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;220;98;114;105;103;58;32;34;32;43;32;103;117;116;104;97;98;101;110; -`,c8=` +`,d8=` 105;110;116;32;103;117;116;104;97;98;101;110;32;61;32;50;48; @@ -49161,7 +49161,7 @@ lösung: vb-wald-loesung.visustruct 103;117;116;104;97;98;101;110;32;61;32;103;117;116;104;97;98;101;110;32;45;32;112;114;101;105;115; -`,d8=` +`,h8=` 105;110;116;32;112;114;101;105;115;32;61;32;57; @@ -49176,7 +49176,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,h8=` +`,g8=` 105;110;116;32;108;97;101;110;103;101;32;61;32;55; @@ -49197,7 +49197,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;85;109;102;97;110;103;58;32;34;32;43;32;117;109;102;97;110;103; -`,g8=` +`,p8=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -49212,7 +49212,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; -`,p8=` +`,f8=` 105;110;116;32;115;101;107;117;110;100;101;110;32;61;32;50;48;48; @@ -49221,7 +49221,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;101;110;32;43;32;34;32;77;105;110;117;116;101;110;32;117;110;100;32;34;32;43;32;114;101;115;116;32;43;32;34;32;83;101;107;117;110;100;101;110;34; -`,f8=` +`,x8=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;97;109;101;32;34;87;105;101;32;104;101;105;223;116;32;100;117;63;34; @@ -49230,7 +49230,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101;32;43;32;34;33;34; -`,x8=` +`,b8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49245,7 +49245,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,b8=` +`,y8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49257,7 +49257,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;40;97;32;43;32;98;41; -`,y8=` +`,v8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49269,7 +49269,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;97;32;43;32;98; -`,v8=` +`,w8=` 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;101;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49281,7 +49281,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;115;32;115;105;110;100;32;101;116;119;97;32;34;32;43;32;116;97;103;101;32;43;32;34;32;84;97;103;101;46;34; -`,w8=` +`,z8=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49296,7 +49296,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;105;116;116;101;108;119;101;114;116;58;32;34;32;43;32;109;105;116;116;101;108; -`,z8=` +`,I8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49317,7 +49317,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;114;111;100;117;107;116;58;32;34;32;43;32;112;114;111;100;117;107;116; -`,I8=` +`,k8=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49336,7 +49336,7 @@ lösung: vb-wald-loesung.visustruct -`,k8=` +`,S8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; @@ -49358,7 +49358,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;122;97;104;108; -`,S8=` +`,_8=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;90;97;104;108;63;34; @@ -49377,7 +49377,7 @@ lösung: vb-wald-loesung.visustruct -`,_8=` +`,T8=` 105;110;116;32;112;117;110;107;116;101;32;61;32;48; @@ -49395,7 +49395,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; -`,T8=` +`,O8=` 105;110;116;32;112;117;110;107;116;101;32;61;32;48; @@ -49413,7 +49413,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;117;110;107;116;101;58;32;34;32;43;32;112;117;110;107;116;101; -`,O8=` +`,A8=` 105;110;116;32;112;114;101;105;115;32;61;32;56; @@ -49431,7 +49431,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,A8=` +`,P8=` 105;110;116;32;112;114;101;105;115;32;61;32;56; @@ -49449,7 +49449,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,P8=` +`,j8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -49471,7 +49471,7 @@ lösung: vb-wald-loesung.visustruct -`,j8=` +`,C8=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;105;115;32;34;80;114;101;105;115;32;105;110;32;69;117;114;111;63;34; @@ -49493,7 +49493,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;90;117;32;122;97;104;108;101;110;58;32;34;32;43;32;112;114;101;105;115;32;43;32;34;32;69;117;114;111;34; -`,C8=` +`,B8=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; @@ -49512,7 +49512,7 @@ lösung: vb-wald-loesung.visustruct -`,B8=` +`,D8=` 105;110;112;117;116;58;32;105;110;116;32;112;117;110;107;116;101;32;34;87;105;101;32;118;105;101;108;101;32;80;117;110;107;116;101;63;34; @@ -49531,7 +49531,7 @@ lösung: vb-wald-loesung.visustruct -`,D8=` +`,Z8=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49550,7 +49550,7 @@ lösung: vb-wald-loesung.visustruct -`,Z8=` +`,M8=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49569,7 +49569,7 @@ lösung: vb-wald-loesung.visustruct -`,M8=` +`,L8=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -49588,7 +49588,7 @@ lösung: vb-wald-loesung.visustruct -`,L8=` +`,W8=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;78;111;116;101;63;34; @@ -49607,7 +49607,7 @@ lösung: vb-wald-loesung.visustruct -`,W8=` +`,E8=` 105;110;112;117;116;58;32;105;110;116;32;106;97;104;114;32;34;74;97;104;114;63;34; @@ -49626,7 +49626,7 @@ lösung: vb-wald-loesung.visustruct -`,E8=` +`,N8=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49645,7 +49645,7 @@ lösung: vb-wald-loesung.visustruct -`,N8=` +`,F8=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;97;114;98;101;32;34;87;101;108;99;104;101;32;70;97;114;98;101;32;104;97;116;32;100;105;101;32;65;109;112;101;108;63;34; @@ -49674,7 +49674,7 @@ lösung: vb-wald-loesung.visustruct -`,F8=` +`,J8=` 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; @@ -49703,7 +49703,7 @@ lösung: vb-wald-loesung.visustruct -`,J8=` +`,R8=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49722,7 +49722,7 @@ lösung: vb-wald-loesung.visustruct -`,R8=` +`,G8=` 105;110;112;117;116;58;32;105;110;116;32;116;97;103;32;34;87;101;108;99;104;101;114;32;84;97;103;32;40;49;32;98;105;115;32;55;41;63;34; @@ -49741,7 +49741,7 @@ lösung: vb-wald-loesung.visustruct -`,G8=` +`,H8=` 105;110;112;117;116;58;32;105;110;116;32;115;116;117;110;100;101;32;34;87;105;101;32;115;112;228;116;32;105;115;116;32;101;115;32;40;110;117;114;32;100;105;101;32;83;116;117;110;100;101;41;63;34; @@ -49760,7 +49760,7 @@ lösung: vb-wald-loesung.visustruct -`,H8=` +`,V8=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101;32;34;87;101;108;99;104;101;32;78;111;116;101;63;34; @@ -49804,7 +49804,7 @@ lösung: vb-wald-loesung.visustruct -`,V8=` +`,Q8=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; @@ -49851,7 +49851,7 @@ lösung: vb-wald-loesung.visustruct -`,Q8=` +`,q8=` 105;110;112;117;116;58;32;105;110;116;32;119;97;104;108;32;34;49;32;87;97;115;115;101;114;44;32;50;32;83;97;102;116;44;32;51;32;75;97;107;97;111;34; @@ -49890,52 +49890,52 @@ lösung: vb-wald-loesung.visustruct -`,q8=` +`,U8=` - + 84;97;115;115;101;32;97;117;102;32;100;101;110;32;84;105;115;99;104;32;115;116;101;108;108;101;110; - + 90;117;99;107;101;114;32;103;101;119;252;110;115;99;104;116;63; - + 90;117;99;107;101;114;32;104;105;110;101;105;110;103;101;98;101;110; - + 248; - + 84;101;101;32;110;111;99;104;32;122;117;32;104;101;105;223; - + 49;32;77;105;110;117;116;101;32;119;97;114;116;101;110; - + 84;101;101;32;116;114;105;110;107;101;110; -`,U8=` +`,$8=` - + 65;117;102;115;116;101;104;101;110; - + 90;228;104;110;101;32;112;117;116;122;101;110; - + 65;110;122;105;101;104;101;110; - + 70;114;252;104;115;116;252;99;107;101;110; -`,$8=` +`,Y8=` 87;97;115;115;101;114;32;105;110;32;100;101;110;32;87;97;115;115;101;114;107;111;99;104;101;114;32;102;252;108;108;101;110; @@ -49956,40 +49956,40 @@ lösung: vb-wald-loesung.visustruct 84;101;101;98;101;117;116;101;108;32;104;101;114;97;117;115;110;101;104;109;101;110; -`,Y8=` +`,X8=` - + 82;101;103;110;101;116;32;101;115;63; - + 82;101;103;101;110;115;99;104;105;114;109;32;101;105;110;112;97;99;107;101;110; - + 83;111;110;110;101;110;98;114;105;108;108;101;32;101;105;110;112;97;99;107;101;110; - + 76;111;115;103;101;104;101;110; -`,X8=` +`,K8=` - + 84;101;108;108;101;114;32;110;105;99;104;116;32;108;101;101;114; - + 69;105;110;101;110;32;66;105;115;115;101;110;32;101;115;115;101;110; - + 84;101;108;108;101;114;32;97;98;114;228;117;109;101;110; -`,K8=` +`,ek=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;32;122;228;104;108;101;110;63;34; @@ -50009,7 +50009,7 @@ lösung: vb-wald-loesung.visustruct -`,ek=` +`,tk=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -50029,7 +50029,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,tk=` +`,nk=` 105;110;116;32;122;97;104;108;32;61;32;51; @@ -50046,7 +50046,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,nk=` +`,ik=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;107;117;108;116;228;116;32;118;111;110;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50072,7 +50072,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;107;117;108;116;97;101;116; -`,ik=` +`,ak=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -50107,7 +50107,7 @@ lösung: vb-wald-loesung.visustruct -`,ak=` +`,sk=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;63;34; @@ -50142,7 +50142,7 @@ lösung: vb-wald-loesung.visustruct -`,sk=` +`,rk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; @@ -50171,7 +50171,7 @@ lösung: vb-wald-loesung.visustruct -`,rk=` +`,ok=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;34; @@ -50194,7 +50194,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;99;104;114;105;116;116;101; -`,ok=` +`,lk=` 105;110;116;32;122;97;104;108;32;61;32;48; @@ -50211,7 +50211,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;110;107;101;33;34; -`,lk=` +`,uk=` 105;110;116;32;105;32;61;32;49;48; @@ -50228,7 +50228,7 @@ lösung: vb-wald-loesung.visustruct -`,uk=` +`,mk=` 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; @@ -50254,7 +50254,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; -`,mk=` +`,ck=` 105;110;112;117;116;58;32;105;110;116;32;122;105;101;108;32;34;83;112;97;114;122;105;101;108;63;34; @@ -50280,7 +50280,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;111;99;104;101;110;58;32;34;32;43;32;119;111;99;104;101;110; -`,ck=` +`,dk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; @@ -50300,7 +50300,7 @@ lösung: vb-wald-loesung.visustruct -`,dk=` +`,hk=` 105;110;116;32;110;111;116;101;32;61;32;48; @@ -50317,7 +50317,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;101;105;110;101;32;78;111;116;101;58;32;34;32;43;32;110;111;116;101; -`,hk=` +`,gk=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50340,7 +50340,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,gk=` +`,pk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;83;116;97;114;116;122;97;104;108;34; @@ -50359,7 +50359,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;111;115;33;34; -`,pk=` +`,fk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50378,7 +50378,7 @@ lösung: vb-wald-loesung.visustruct -`,fk=` +`,xk=` 105;110;116;32;105;32;61;32;49; @@ -50391,7 +50391,7 @@ lösung: vb-wald-loesung.visustruct -`,xk=` +`,bk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50408,7 +50408,7 @@ lösung: vb-wald-loesung.visustruct -`,bk=` +`,yk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50425,7 +50425,7 @@ lösung: vb-wald-loesung.visustruct -`,yk=` +`,vk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -50442,7 +50442,7 @@ lösung: vb-wald-loesung.visustruct -`,vk=` +`,wk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50464,7 +50464,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,wk=` +`,zk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;90;101;105;108;101;110;63;34; @@ -50493,7 +50493,7 @@ lösung: vb-wald-loesung.visustruct -`,zk=` +`,Ik=` 105;110;116;32;97;110;122;97;104;108;32;61;32;48; @@ -50525,7 +50525,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108; -`,Ik=` +`,kk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50557,7 +50557,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108; -`,kk=` +`,Sk=` 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50573,7 +50573,7 @@ lösung: vb-wald-loesung.visustruct -`,Sk=` +`,_k=` 105;110;112;117;116;58;32;105;110;116;32;114;101;105;104;101;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -50589,7 +50589,7 @@ lösung: vb-wald-loesung.visustruct -`,_k=` +`,Tk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50605,7 +50605,7 @@ lösung: vb-wald-loesung.visustruct -`,Tk=` +`,Ok=` 105;110;112;117;116;58;32;105;110;116;32;98;114;101;105;116;101;32;34;66;114;101;105;116;101;34; @@ -50637,7 +50637,7 @@ lösung: vb-wald-loesung.visustruct -`,Ok=` +`,Ak=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; @@ -50653,7 +50653,7 @@ lösung: vb-wald-loesung.visustruct -`,Ak=` +`,Pk=` 105;110;116;91;93;32;119;101;114;116;101;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; @@ -50668,7 +50668,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;119;101;114;116;101;46;108;101;110;103;116;104; -`,Pk=` +`,jk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50700,7 +50700,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; -`,jk=` +`,Ck=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;122;117;32;119;101;108;99;104;101;114;32;90;97;104;108;63;34; @@ -50732,7 +50732,7 @@ lösung: vb-wald-loesung.visustruct -`,Ck=` +`,Bk=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;87;105;101;32;118;105;101;108;101;32;83;116;117;102;101;110;63;34; @@ -50761,7 +50761,7 @@ lösung: vb-wald-loesung.visustruct -`,Bk=` +`,Dk=` 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; @@ -50780,7 +50780,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;114;115;116;101;114;32;78;97;109;101;58;32;34;32;43;32;110;97;109;101;110;91;48;93; -`,Dk=` +`,Zk=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;52;93; @@ -50806,7 +50806,7 @@ lösung: vb-wald-loesung.visustruct -`,Zk=` +`,Mk=` 105;110;116;91;93;32;122;97;104;108;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -50857,7 +50857,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,Mk=` +`,Lk=` 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; @@ -50898,7 +50898,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;97;120;105;109;117;109;58;32;34;32;43;32;109;97;120; -`,Lk=` +`,Wk=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50921,7 +50921,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Wk=` +`,Ek=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -50951,7 +50951,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Ek=` +`,Nk=` 105;110;112;117;116;58;32;105;110;116;32;108;97;101;110;103;101;32;34;76;228;110;103;101;63;34; @@ -50966,13 +50966,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;108;228;99;104;101;58;32;34;32;43;32;102; -`,Nk=` +`,Fk=` 114;101;116;117;114;110;32;97;32;42;32;98; -`,Fk=` +`,Jk=` 122;101;105;103;101;66;101;103;114;117;101;115;115;117;110;103;40;41; @@ -50984,7 +50984,7 @@ lösung: vb-wald-loesung.visustruct 122;101;105;103;101;69;114;103;101;98;110;105;115;40;41; -`,Jk=` +`,Rk=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -51016,7 +51016,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; -`,Rk=` +`,Gk=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;101;110;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -51048,7 +51048,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;246;99;104;115;116;101;32;84;101;109;112;101;114;97;116;117;114;58;32;34;32;43;32;109;97;120; -`,Gk=` +`,Hk=` 105;110;116;91;93;32;110;111;116;101;110;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; @@ -51070,7 +51070,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,Hk=` +`,Vk=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;90;97;104;108;63;34; @@ -51082,7 +51082,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;97;115;32;81;117;97;100;114;97;116;32;105;115;116;32;34;32;43;32;113; -`,Vk=` +`,Qk=` 105;110;116;32;101;114;103;101;98;110;105;115;32;61;32;120;32;42;32;120; @@ -51091,7 +51091,7 @@ lösung: vb-wald-loesung.visustruct 114;101;116;117;114;110;32;101;114;103;101;98;110;105;115; -`,Qk=` +`,qk=` 122;101;105;103;101;84;105;116;101;108;40;41; @@ -51103,7 +51103,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;34;32;43;32;110;97;109;101; -`,qk=` +`,Uk=` 111;117;116;112;117;116;58;32;34;87;105;108;108;107;111;109;109;101;110;32;122;117;109;32;81;117;105;122;33;34; @@ -51112,7 +51112,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;117;32;98;101;107;111;109;109;115;116;32;100;114;101;105;32;70;114;97;103;101;110;46;34; -`,Uk=` +`,$k=` 122;101;105;103;101;83;117;109;109;101;40;51;44;32;52;41; @@ -51124,7 +51124,7 @@ lösung: vb-wald-loesung.visustruct 122;101;105;103;101;83;117;109;109;101;40;120;44;32;120;32;43;32;49;41; -`,$k=` +`,Yk=` 105;110;116;32;115;117;109;109;101;32;61;32;97;32;43;32;98; @@ -51133,7 +51133,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;117;109;109;101; -`,Yk=` +`,Xk=` 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; @@ -51156,7 +51156,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;111;115;33;34; -`,Xk=` +`,Kk=` 105;110;112;117;116;58;32;105;110;116;32;115;116;97;114;116;32;34;83;116;97;114;116;119;101;114;116;34; @@ -51179,7 +51179,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;111;115;34; -`,Kk=` +`,eS=` 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -51201,7 +51201,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; -`,eS=` +`,tS=` 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -51223,7 +51223,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;112;105;101;108;101;114;32;50;58;32;34;32;43;32;115;117;109;109;101; -`,tS=` +`,nS=` 105;110;116;91;93;91;93;32;112;117;110;107;116;101;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; @@ -51252,7 +51252,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;117;109;109;101;58;32;34;32;43;32;115;117;109;109;101; -`,nS=` +`,iS=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -51275,7 +51275,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,iS=` +`,aS=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; @@ -51297,7 +51297,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,aS=` +`,sS=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;66;105;115;32;119;111;104;105;110;63;34; @@ -51319,7 +51319,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;117;109;109;101; -`,sS=` +`,rS=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;87;101;108;99;104;101;32;82;101;105;104;101;63;34; @@ -51351,7 +51351,7 @@ lösung: vb-wald-loesung.visustruct -`,rS=` +`,oS=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;90;97;104;108;32;101;105;110;103;101;98;101;110;34; @@ -51373,7 +51373,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;97;107;117;108;116;97;101;116; -`,oS=` +`,lS=` 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; @@ -51405,13 +51405,13 @@ lösung: vb-wald-loesung.visustruct -`,lS=` +`,uS=` 83;116;114;105;110;103;32;98;114;105;101;102;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;98;114;105;101;102;46;116;120;116;34;41;41; -`,uS=` +`,mS=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; @@ -51423,7 +51423,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,mS=` +`,cS=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;63;34; @@ -51435,7 +51435,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; -`,cS=` +`,dS=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;105;110;103;97;98;101;32;34;80;97;115;115;119;111;114;116;63;34; @@ -51454,7 +51454,7 @@ lösung: vb-wald-loesung.visustruct -`,dS=` +`,hS=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -51483,7 +51483,7 @@ lösung: vb-wald-loesung.visustruct -`,hS=` +`,gS=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;119;101;114;116;63;34; @@ -51503,7 +51503,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;110;100;101;34; -`,gS=` +`,pS=` 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; @@ -51536,7 +51536,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; -`,pS=` +`,fS=` 105;110;116;32;118;101;114;115;117;99;104;101;32;61;32;48; @@ -51569,7 +51569,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;101;114;115;117;99;104;101;58;32;34;32;43;32;118;101;114;115;117;99;104;101; -`,fS=` +`,xS=` 105;110;116;32;115;117;109;109;101;32;61;32;48; @@ -51611,7 +51611,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;115;117;109;109;101; -`,xS=` +`,bS=` 105;110;112;117;116;58;32;105;110;116;32;97;108;116;101;114;32;34;87;105;101;32;97;108;116;32;98;105;115;116;32;100;117;63;34; @@ -51633,7 +51633,7 @@ lösung: vb-wald-loesung.visustruct -`,bS=` +`,yS=` 105;110;112;117;116;58;32;105;110;116;32;103;114;101;110;122;101;32;34;66;105;115;32;119;111;104;105;110;63;34; @@ -51649,7 +51649,7 @@ lösung: vb-wald-loesung.visustruct -`,yS=` +`,vS=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -51688,7 +51688,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; -`,vS=` +`,wS=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -51727,7 +51727,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;116;105;111;110;58;32;34;32;43;32;112;111;115;105;116;105;111;110; -`,wS=` +`,zS=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -51762,7 +51762,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;97;110;122;97;104;108; -`,zS=` +`,IS=` 111;117;116;112;117;116;58;32;34;71;117;116;101;110;32;77;111;114;103;101;110;34; @@ -51771,13 +51771,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;101;117;116;101;32;108;101;114;110;101;110;32;119;105;114;32;83;116;114;117;107;116;111;103;114;97;109;109;101;46;34; -`,IS=` +`,kS=` 111;117;116;112;117;116;58;32;34;72;97;108;108;111;32;87;101;108;116;34; -`,kS=` +`,SS=` 111;117;116;112;117;116;58;32;34;72;97;108;108;111;34; @@ -51786,7 +51786,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;73;99;104;32;108;101;114;110;101;32;83;116;114;117;107;116;111;103;114;97;109;109;101;34; -`,SS=` +`,_S=` 105;110;112;117;116;58;32;105;110;116;32;122;97;104;108;32;34;83;116;97;114;116;122;97;104;108;63;34; @@ -51806,7 +51806,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;97;114;116;33;34; -`,_S=` +`,TS=` 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; @@ -51847,7 +51847,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;90;101;105;108;101;110;32;103;101;115;112;101;105;99;104;101;114;116;34; -`,TS=` +`,OS=` 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; @@ -51856,7 +51856,7 @@ lösung: vb-wald-loesung.visustruct 80;114;105;110;116;87;114;105;116;101;114;32;97;117;115;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;101;105;110;107;97;117;102;45;110;101;117;46;116;120;116;34;41; -`,OS=` +`,AS=` 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; @@ -51882,13 +51882,13 @@ lösung: vb-wald-loesung.visustruct 100;97;116;101;105;46;99;108;111;115;101;40;41; -`,AS=` +`,PS=` 83;99;97;110;110;101;114;32;100;97;116;101;105;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;101;105;110;107;97;117;102;46;116;120;116;34;41;41; -`,PS=` +`,jS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; @@ -51927,7 +51927,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;117;99;104;115;58;32;34;32;43;32;97;110;122;97;104;108; -`,jS=` +`,CS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; @@ -51936,7 +51936,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,CS=` +`,BS=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; @@ -51971,7 +51971,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;228;110;103;115;116;101;114;32;69;105;110;116;114;97;103;58;32;34;32;43;32;108;97;101;110;103;115;116;101;114; -`,BS=` +`,DS=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;108;111;103;98;117;99;104;46;116;120;116;34;41;41; @@ -51980,7 +51980,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;122;101;105;108;101;110;32;61;32;116;101;120;116;46;115;112;108;105;116;40;34;92;110;34;41; -`,DS=` +`,ZS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; @@ -52034,7 +52034,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;66;101;115;116;101;32;78;111;116;101;32;105;110;32;69;110;103;108;105;115;99;104;58;32;34;32;43;32;98;101;115;116;101;114;78;97;109;101;32;43;32;34;32;40;34;32;43;32;98;101;115;116;101;78;111;116;101;32;43;32;34;41;34; -`,ZS=` +`,MS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; @@ -52043,7 +52043,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,MS=` +`,LS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; @@ -52084,7 +52084,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;99;104;110;105;116;116;32;77;97;116;104;101;58;32;34;32;43;32;115;117;109;109;101;32;47;32;97;110;122;97;104;108; -`,LS=` +`,WS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;107;108;97;115;115;101;46;99;115;118;34;41;41; @@ -52093,7 +52093,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,WS=` +`,ES=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -52132,7 +52132,7 @@ lösung: vb-wald-loesung.visustruct 108;101;115;101;114;46;99;108;111;115;101;40;41; -`,ES=` +`,NS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -52141,7 +52141,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;108;101;115;101;114;46;114;101;97;100;76;105;110;101;40;41; -`,NS=` +`,FS=` 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; @@ -52191,7 +52191,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;97;109;101;110;46;108;101;110;103;116;104;32;43;32;34;32;69;105;110;116;114;228;103;101;32;103;101;115;112;101;105;99;104;101;114;116;34; -`,FS=` +`,JS=` 83;116;114;105;110;103;91;93;32;110;97;109;101;110;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;70;117;99;104;115;34;125; @@ -52209,7 +52209,7 @@ lösung: vb-wald-loesung.visustruct 97;117;115;46;99;108;111;115;101;40;41; -`,JS=` +`,RS=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; @@ -52262,7 +52262,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;40;122;101;105;108;101;110;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;84;105;101;114;101;32;103;101;115;112;101;105;99;104;101;114;116;34; -`,RS=` +`,GS=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;116;105;101;114;101;46;99;115;118;34;41;41; @@ -52283,7 +52283,7 @@ lösung: vb-wald-loesung.visustruct 97;117;115;46;99;108;111;115;101;40;41; -`,GS=` +`,HS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; @@ -52327,7 +52327,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;110;122;97;104;108;32;43;32;34;32;83;228;116;122;101;32;103;101;115;112;101;105;99;104;101;114;116;34; -`,HS=` +`,VS=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;115;101;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;105;101;114;101;46;99;115;118;34;41;41; @@ -52348,7 +52348,7 @@ lösung: vb-wald-loesung.visustruct 97;117;115;46;99;108;111;115;101;40;41; -`,VS=` +`,QS=` 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;34; @@ -52360,7 +52360,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;100;101;117;115;34; -`,QS=` +`,qS=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -52379,7 +52379,7 @@ lösung: vb-wald-loesung.visustruct -`,qS=` +`,US=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; @@ -52460,7 +52460,7 @@ lösung: vb-wald-loesung.visustruct 115;97;105;100;97;46;99;108;111;115;101;40;41; -`,US=` +`,$S=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;108;97;110;99;97;109;101;110;116;111;46;99;115;118;34;41;41; @@ -52469,7 +52469,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,$S=` +`,YS=` 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -52534,7 +52534,7 @@ lösung: vb-wald-loesung.visustruct -`,YS=` +`,XS=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;116;101;105;114;111;34; @@ -52560,7 +52560,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98;105;110;97;114;105;111; -`,XS=` +`,KS=` 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; @@ -52614,13 +52614,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; -`,KS=` +`,e_=` 99;104;97;114;91;93;32;97;108;102;97;98;101;116;111;32;61;32;123;39;65;39;44;32;39;66;39;44;32;39;67;39;44;32;39;68;39;44;32;39;69;39;44;32;39;70;39;44;32;39;71;39;44;32;39;72;39;44;32;39;73;39;44;32;39;74;39;44;32;39;75;39;44;32;39;76;39;44;32;39;77;39;44;32;39;78;39;44;32;39;79;39;44;32;39;80;39;44;32;39;81;39;44;32;39;82;39;44;32;39;83;39;44;32;39;84;39;44;32;39;85;39;44;32;39;86;39;44;32;39;87;39;44;32;39;88;39;44;32;39;89;39;44;32;39;90;39;125; -`,e_=` +`,t_=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;81;117;101;32;112;97;108;97;118;114;97;32;40;115;243;32;109;97;105;250;115;99;117;108;97;115;41;63;34; @@ -52651,7 +52651,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;101;103;114;101;100;111; -`,t_=` +`,n_=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;101;103;114;101;100;111;32;34;81;117;97;108;32;233;32;111;32;116;101;120;116;111;32;99;105;102;114;97;100;111;63;34; @@ -52682,7 +52682,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;116;101;120;116;111; -`,n_=` +`,i_=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;32;105;110;105;99;105;97;108;34; @@ -52718,7 +52718,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;97;115;115;111;115;58;32;34;32;43;32;112;97;115;115;111;115; -`,i_=` +`,a_=` 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;97;115;32;110;111;116;97;115;63;34; @@ -52746,7 +52746,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;101;100;105;97; -`,a_=` +`,s_=` 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;110;250;109;101;114;111;115;63;34; @@ -52783,7 +52783,7 @@ lösung: vb-wald-loesung.visustruct -`,s_=` +`,r_=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; @@ -52802,7 +52802,7 @@ lösung: vb-wald-loesung.visustruct -`,r_=` +`,o_=` 99;111;110;115;116;32;100;111;117;98;108;101;32;73;86;65;32;61;32;48;46;50;51; @@ -52823,7 +52823,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;112;114;101;99;111;67;111;109;73;118;97; -`,o_=` +`,l_=` 105;110;116;32;112;105;110;32;61;32;48; @@ -52859,7 +52859,7 @@ lösung: vb-wald-loesung.visustruct -`,l_=` +`,u_=` 99;111;110;115;116;32;105;110;116;32;80;73;78;32;61;32;49;50;51;52; @@ -52895,7 +52895,7 @@ lösung: vb-wald-loesung.visustruct -`,u_=` +`,m_=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;49;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; @@ -52939,7 +52939,7 @@ lösung: vb-wald-loesung.visustruct -`,m_=` +`,c_=` 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -52993,7 +52993,7 @@ lösung: vb-wald-loesung.visustruct -`,c_=` +`,d_=` 98;111;111;108;101;97;110;91;93;91;93;32;109;97;114;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;53;93;91;53;93; @@ -53020,7 +53020,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;99;111;108;117;110;97;115;32;61;32;123;34;65;34;44;32;34;66;34;44;32;34;67;34;44;32;34;68;34;44;32;34;69;34;125; -`,d_=` +`,h_=` 105;110;112;117;116;58;32;105;110;116;32;112;114;97;116;111;32;34;81;117;101;32;112;114;97;116;111;63;32;40;49;44;32;50;32;111;117;32;51;41;34; @@ -53049,7 +53049,7 @@ lösung: vb-wald-loesung.visustruct -`,h_=` +`,g_=` 105;110;116;32;110;117;109;101;114;111;49;32;61;32;52; @@ -53064,7 +53064,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,g_=` +`,p_=` 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;53;93; @@ -53086,7 +53086,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;105;109;112;97;32;111;32;113;117;97;100;114;111;58;32;34;32;43;32;110;111;109;101;115;91;115;111;114;116;101;97;100;111;32;45;32;49;93; -`,p_=` +`,f_=` 105;110;116;32;110;117;109;101;114;111;32;61;32;52; @@ -53098,7 +53098,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;117;112;108;105;99;97;100;111;58;32;34;32;43;32;110;117;109;101;114;111; -`,f_=` +`,x_=` -1; @@ -53145,7 +53145,7 @@ lösung: vb-wald-loesung.visustruct -`,x_=` +`,b_=` @@ -53182,7 +53182,7 @@ lösung: vb-wald-loesung.visustruct -`,b_=` +`,y_=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; @@ -53242,7 +53242,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;99;101;114;116;97;115;32;43;32;34;32;100;101;32;34;32;43;32;99;111;110;116;97;103;101;109;32;43;32;34;32;99;101;114;116;97;115;34; -`,y_=` +`,v_=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;118;111;99;97;98;117;108;97;114;105;111;46;99;115;118;34;41;41; @@ -53251,7 +53251,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,v_=` +`,w_=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -53270,7 +53270,7 @@ lösung: vb-wald-loesung.visustruct -`,w_=` +`,z_=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; @@ -53293,7 +53293,7 @@ lösung: vb-wald-loesung.visustruct 108;101;105;116;111;114;46;99;108;111;115;101;40;41; -`,z_=` +`,I_=` 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;90;111;114;97;59;49;59;50;59;50;34; @@ -53311,7 +53311,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101;32;43;32;34;32;116;101;109;32;34;32;43;32;109;97;116;101;109;97;116;105;99;97;32;43;32;34;32;97;32;77;97;116;101;109;225;116;105;99;97;34; -`,I_=` +`,k_=` 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;123;92;34;110;111;109;101;92;34;58;32;92;34;90;111;114;97;92;34;44;32;92;34;101;115;112;101;99;105;101;92;34;58;32;92;34;99;97;98;114;97;92;34;44;32;92;34;105;100;97;100;101;92;34;58;32;54;125;44;34; @@ -53329,7 +53329,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101; -`,k_=` +`,S_=` 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; @@ -53349,7 +53349,7 @@ lösung: vb-wald-loesung.visustruct 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; -`,S_=` +`,__=` 105;110;116;91;93;91;93;32;116;97;98;101;108;97;32;61;32;110;101;119;32;105;110;116;91;49;48;93;91;49;48;93; @@ -53381,7 +53381,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;183;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;116;97;98;101;108;97;91;97;32;45;32;49;93;91;98;32;45;32;49;93; -`,__=` +`,T_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53429,7 +53429,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;76;105;118;114;101;115;58;32;34;32;43;32;108;105;118;114;101;115; -`,T_=` +`,O_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53444,7 +53444,7 @@ lösung: vb-wald-loesung.visustruct 108;117;103;97;114;101;115;91;50;93;91;51;93;32;61;32;116;114;117;101; -`,O_=` +`,A_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53478,7 +53478,7 @@ lösung: vb-wald-loesung.visustruct -`,A_=` +`,P_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53496,7 +53496,7 @@ lösung: vb-wald-loesung.visustruct 105;110;112;117;116;58;32;105;110;116;32;108;117;103;97;114;32;34;76;117;103;97;114;34; -`,P_=` +`,j_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53544,7 +53544,7 @@ lösung: vb-wald-loesung.visustruct -`,j_=` +`,C_=` 98;111;111;108;101;97;110;91;93;91;93;32;108;117;103;97;114;101;115;32;61;32;110;101;119;32;98;111;111;108;101;97;110;91;51;93;91;53;93; @@ -53568,7 +53568,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;105;108;97;32;49;44;32;108;117;103;97;114;32;50;32;118;101;110;100;105;100;111;63;32;34;32;43;32;108;117;103;97;114;101;115;91;49;93;91;50;93; -`,C_=` +`,B_=` 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; @@ -53583,7 +53583,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; -`,B_=` +`,D_=` 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; @@ -53598,7 +53598,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;34; -`,D_=` +`,Z_=` 83;116;114;105;110;103;32;110;111;109;101;32;61;32;34;76;117;100;119;105;103;34; @@ -53616,7 +53616,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; -`,Z_=` +`,M_=` 105;110;116;32;110;117;109;101;114;111;32;61;32;51; @@ -53631,7 +53631,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;101;114;111; -`,M_=` +`,L_=` 105;110;116;32;110;117;109;101;114;111;32;61;32;50; @@ -53646,7 +53646,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;101;114;111; -`,L_=` +`,W_=` 111;117;116;112;117;116;58;32;110;117;109;101;114;111; @@ -53661,7 +53661,7 @@ lösung: vb-wald-loesung.visustruct 110;117;109;101;114;111;32;61;32;110;117;109;101;114;111;32;43;32;51; -`,W_=` +`,E_=` 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; @@ -53685,7 +53685,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; -`,E_=` +`,N_=` 83;116;114;105;110;103;32;101;115;113;117;101;114;100;97;32;61;32;34;115;117;109;111;34; @@ -53700,7 +53700,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;105;114;101;105;116;97;58;32;34;32;43;32;100;105;114;101;105;116;97; -`,N_=` +`,F_=` 105;110;116;32;97;32;61;32;53; @@ -53724,7 +53724,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,F_=` +`,J_=` 105;110;116;32;105;100;97;100;101;32;61;32;49;52; @@ -53742,7 +53742,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;108;116;117;114;97;58;32;34;32;43;32;97;108;116;117;114;97;32;43;32;34;32;109;34; -`,J_=` +`,R_=` 105;110;116;32;109;105;110;117;116;111;115;32;61;32;49;51;53; @@ -53757,7 +53757,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;104;111;114;97;115;32;43;32;34;32;104;111;114;97;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;109;105;110;117;116;111;115;34; -`,R_=` +`,G_=` 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;51; @@ -53772,7 +53772,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;112;114;101;99;111;84;111;116;97;108;32;43;32;34;32;101;117;114;111;115;34; -`,G_=` +`,H_=` 105;110;116;32;115;97;108;100;111;32;61;32;50;48; @@ -53787,7 +53787,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;101;115;116;97;58;32;34;32;43;32;115;97;108;100;111; -`,H_=` +`,V_=` 105;110;116;32;115;97;108;100;111;32;61;32;50;48; @@ -53802,7 +53802,7 @@ lösung: vb-wald-loesung.visustruct 115;97;108;100;111;32;61;32;115;97;108;100;111;32;45;32;112;114;101;99;111; -`,V_=` +`,Q_=` 105;110;116;32;112;114;101;99;111;32;61;32;57; @@ -53817,7 +53817,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,Q_=` +`,q_=` 105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;61;32;55; @@ -53838,7 +53838,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;101;114;237;109;101;116;114;111;58;32;34;32;43;32;112;101;114;105;109;101;116;114;111; -`,q_=` +`,U_=` 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; @@ -53853,7 +53853,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; -`,U_=` +`,$_=` 105;110;116;32;115;101;103;117;110;100;111;115;32;61;32;50;48;48; @@ -53862,7 +53862,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;109;105;110;117;116;111;115;32;43;32;34;32;109;105;110;117;116;111;115;32;101;32;34;32;43;32;114;101;115;116;111;32;43;32;34;32;115;101;103;117;110;100;111;115;34; -`,$_=` +`,Y_=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;67;111;109;111;32;116;101;32;99;104;97;109;97;115;63;34; @@ -53871,7 +53871,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101;32;43;32;34;33;34; -`,Y_=` +`,X_=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -53886,7 +53886,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; -`,X_=` +`,K_=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -53898,7 +53898,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;40;97;32;43;32;98;41; -`,K_=` +`,eT=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -53910,7 +53910,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;97;32;43;32;98; -`,eT=` +`,tT=` 105;110;112;117;116;58;32;105;110;116;32;97;110;111;115;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -53922,7 +53922,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;227;111;32;99;101;114;99;97;32;100;101;32;34;32;43;32;100;105;97;115;32;43;32;34;32;100;105;97;115;46;34; -`,tT=` +`,nT=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;120;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -53937,7 +53937,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;233;100;105;97;58;32;34;32;43;32;109;101;100;105;97; -`,nT=` +`,iT=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -53958,7 +53958,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;114;111;100;117;116;111;58;32;34;32;43;32;112;114;111;100;117;116;111; -`,iT=` +`,aT=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -53977,7 +53977,7 @@ lösung: vb-wald-loesung.visustruct -`,aT=` +`,sT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; @@ -53999,7 +53999,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;117;109;101;114;111; -`,sT=` +`,rT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;63;34; @@ -54018,7 +54018,7 @@ lösung: vb-wald-loesung.visustruct -`,rT=` +`,oT=` 105;110;116;32;112;111;110;116;111;115;32;61;32;48; @@ -54036,7 +54036,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; -`,oT=` +`,lT=` 105;110;116;32;112;111;110;116;111;115;32;61;32;48; @@ -54054,7 +54054,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;110;116;111;115;58;32;34;32;43;32;112;111;110;116;111;115; -`,lT=` +`,uT=` 105;110;116;32;112;114;101;99;111;32;61;32;56; @@ -54072,7 +54072,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,uT=` +`,mT=` 105;110;116;32;112;114;101;99;111;32;61;32;56; @@ -54090,7 +54090,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,mT=` +`,cT=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -54112,7 +54112,7 @@ lösung: vb-wald-loesung.visustruct -`,cT=` +`,dT=` 105;110;112;117;116;58;32;100;111;117;98;108;101;32;112;114;101;99;111;32;34;80;114;101;231;111;32;101;109;32;101;117;114;111;115;63;34; @@ -54134,7 +54134,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;32;112;97;103;97;114;58;32;34;32;43;32;112;114;101;99;111;32;43;32;34;32;101;117;114;111;115;34; -`,dT=` +`,hT=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; @@ -54153,7 +54153,7 @@ lösung: vb-wald-loesung.visustruct -`,hT=` +`,gT=` 105;110;112;117;116;58;32;105;110;116;32;112;111;110;116;111;115;32;34;81;117;97;110;116;111;115;32;112;111;110;116;111;115;63;34; @@ -54172,7 +54172,7 @@ lösung: vb-wald-loesung.visustruct -`,gT=` +`,pT=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; @@ -54191,7 +54191,7 @@ lösung: vb-wald-loesung.visustruct -`,pT=` +`,fT=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;101;32;105;100;97;100;101;32;116;101;110;115;63;34; @@ -54210,7 +54210,7 @@ lösung: vb-wald-loesung.visustruct -`,fT=` +`,xT=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -54229,7 +54229,7 @@ lösung: vb-wald-loesung.visustruct -`,xT=` +`,bT=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;78;111;116;97;63;34; @@ -54248,7 +54248,7 @@ lösung: vb-wald-loesung.visustruct -`,bT=` +`,yT=` 105;110;112;117;116;58;32;105;110;116;32;97;110;111;32;34;65;110;111;63;34; @@ -54267,7 +54267,7 @@ lösung: vb-wald-loesung.visustruct -`,yT=` +`,vT=` 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;68;105;97;32;40;49;32;97;32;55;41;63;34; @@ -54286,7 +54286,7 @@ lösung: vb-wald-loesung.visustruct -`,vT=` +`,wT=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;99;111;114;32;34;68;101;32;113;117;101;32;99;111;114;32;101;115;116;225;32;111;32;115;101;109;225;102;111;114;111;63;34; @@ -54315,7 +54315,7 @@ lösung: vb-wald-loesung.visustruct -`,wT=` +`,zT=` 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; @@ -54344,7 +54344,7 @@ lösung: vb-wald-loesung.visustruct -`,zT=` +`,IT=` 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; @@ -54363,7 +54363,7 @@ lösung: vb-wald-loesung.visustruct -`,IT=` +`,kT=` 105;110;112;117;116;58;32;105;110;116;32;100;105;97;32;34;81;117;101;32;100;105;97;32;40;49;32;97;32;55;41;63;34; @@ -54382,7 +54382,7 @@ lösung: vb-wald-loesung.visustruct -`,kT=` +`,ST=` 105;110;112;117;116;58;32;105;110;116;32;104;111;114;97;32;34;81;117;101;32;104;111;114;97;115;32;115;227;111;32;40;115;243;32;97;32;104;111;114;97;41;63;34; @@ -54401,7 +54401,7 @@ lösung: vb-wald-loesung.visustruct -`,ST=` +`,_T=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;97;32;34;81;117;101;32;110;111;116;97;63;34; @@ -54440,7 +54440,7 @@ lösung: vb-wald-loesung.visustruct -`,_T=` +`,TT=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; @@ -54487,7 +54487,7 @@ lösung: vb-wald-loesung.visustruct -`,TT=` +`,OT=` 105;110;112;117;116;58;32;105;110;116;32;101;115;99;111;108;104;97;32;34;49;32;225;103;117;97;44;32;50;32;115;117;109;111;44;32;51;32;99;104;111;99;111;108;97;116;101;32;113;117;101;110;116;101;34; @@ -54526,52 +54526,52 @@ lösung: vb-wald-loesung.visustruct -`,OT=` +`,AT=` - + 80;244;114;32;117;109;97;32;99;104;225;118;101;110;97;32;110;97;32;109;101;115;97; - + 81;117;101;114;32;97;231;250;99;97;114;63; - + 74;117;110;116;97;114;32;97;231;250;99;97;114; - + 248; - + 67;104;225;32;97;105;110;100;97;32;100;101;109;97;115;105;97;100;111;32;113;117;101;110;116;101; - + 69;115;112;101;114;97;114;32;49;32;109;105;110;117;116;111; - + 66;101;98;101;114;32;111;32;99;104;225; -`,AT=` +`,PT=` - + 76;101;118;97;110;116;97;114; - + 76;97;118;97;114;32;111;115;32;100;101;110;116;101;115; - + 86;101;115;116;105;114; - + 84;111;109;97;114;32;111;32;112;101;113;117;101;110;111;45;97;108;109;111;231;111; -`,PT=` +`,jT=` 69;110;99;104;101;114;32;97;32;99;104;97;108;101;105;114;97;32;99;111;109;32;225;103;117;97; @@ -54592,40 +54592,40 @@ lösung: vb-wald-loesung.visustruct 84;105;114;97;114;32;97;32;115;97;113;117;101;116;97;32;100;101;32;99;104;225; -`,jT=` +`,CT=` - + 69;115;116;225;32;97;32;99;104;111;118;101;114;63; - + 76;101;118;97;114;32;103;117;97;114;100;97;45;99;104;117;118;97; - + 76;101;118;97;114;32;243;99;117;108;111;115;32;100;101;32;115;111;108; - + 83;97;105;114; -`,CT=` +`,BT=` - + 80;114;97;116;111;32;110;227;111;32;118;97;122;105;111; - + 68;97;114;32;117;109;97;32;103;97;114;102;97;100;97; - + 76;101;118;97;110;116;97;114;32;111;32;112;114;97;116;111; -`,BT=` +`,DT=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;67;111;110;116;97;114;32;97;116;233;63;34; @@ -54645,7 +54645,7 @@ lösung: vb-wald-loesung.visustruct -`,DT=` +`,ZT=` 105;110;116;32;110;117;109;101;114;111;32;61;32;51; @@ -54665,7 +54665,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; -`,ZT=` +`,MT=` 105;110;116;32;110;117;109;101;114;111;32;61;32;51; @@ -54682,7 +54682,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;97;114;116;105;100;97;33;34; -`,MT=` +`,LT=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;70;97;116;111;114;105;97;108;32;100;101;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -54708,7 +54708,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;32;43;32;34;33;32;61;32;34;32;43;32;102;97;116;111;114;105;97;108; -`,LT=` +`,WT=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -54743,7 +54743,7 @@ lösung: vb-wald-loesung.visustruct -`,WT=` +`,ET=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;63;34; @@ -54778,7 +54778,7 @@ lösung: vb-wald-loesung.visustruct -`,ET=` +`,NT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; @@ -54807,7 +54807,7 @@ lösung: vb-wald-loesung.visustruct -`,NT=` +`,FT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; @@ -54830,7 +54830,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;112;97;115;115;111;115; -`,FT=` +`,JT=` 105;110;116;32;110;117;109;101;114;111;32;61;32;48; @@ -54847,7 +54847,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;79;98;114;105;103;97;100;111;33;34; -`,JT=` +`,RT=` 105;110;116;32;105;32;61;32;49;48; @@ -54864,7 +54864,7 @@ lösung: vb-wald-loesung.visustruct -`,RT=` +`,GT=` 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; @@ -54890,7 +54890,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; -`,GT=` +`,HT=` 105;110;112;117;116;58;32;105;110;116;32;111;98;106;101;116;105;118;111;32;34;79;98;106;101;116;105;118;111;63;34; @@ -54916,7 +54916,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;101;109;97;110;97;115;58;32;34;32;43;32;115;101;109;97;110;97;115; -`,HT=` +`,VT=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;111;110;100;101;63;34; @@ -54936,7 +54936,7 @@ lösung: vb-wald-loesung.visustruct -`,VT=` +`,QT=` 105;110;116;32;110;111;116;97;32;61;32;48; @@ -54953,7 +54953,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;32;116;117;97;32;110;111;116;97;58;32;34;32;43;32;110;111;116;97; -`,QT=` +`,qT=` 105;110;116;32;115;111;109;97;32;61;32;48; @@ -54976,7 +54976,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,qT=` +`,UT=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;34; @@ -54995,7 +54995,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;74;225;33;34; -`,UT=` +`,$T=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; @@ -55014,7 +55014,7 @@ lösung: vb-wald-loesung.visustruct -`,$T=` +`,YT=` 105;110;116;32;105;32;61;32;49; @@ -55027,7 +55027,7 @@ lösung: vb-wald-loesung.visustruct -`,YT=` +`,XT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; @@ -55044,7 +55044,7 @@ lösung: vb-wald-loesung.visustruct -`,XT=` +`,KT=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; @@ -55061,7 +55061,7 @@ lösung: vb-wald-loesung.visustruct -`,KT=` +`,eO=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;78;250;109;101;114;111;32;105;110;105;99;105;97;108;63;34; @@ -55078,7 +55078,7 @@ lösung: vb-wald-loesung.visustruct -`,eO=` +`,tO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55100,7 +55100,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,tO=` +`,nO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;97;115;32;108;105;110;104;97;115;63;34; @@ -55129,7 +55129,7 @@ lösung: vb-wald-loesung.visustruct -`,nO=` +`,iO=` 105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;61;32;48; @@ -55161,7 +55161,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; -`,iO=` +`,aO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55193,7 +55193,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101; -`,aO=` +`,sO=` 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; @@ -55209,7 +55209,7 @@ lösung: vb-wald-loesung.visustruct -`,sO=` +`,rO=` 105;110;112;117;116;58;32;105;110;116;32;116;97;98;117;97;100;97;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; @@ -55225,7 +55225,7 @@ lösung: vb-wald-loesung.visustruct -`,rO=` +`,oO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55241,7 +55241,7 @@ lösung: vb-wald-loesung.visustruct -`,oO=` +`,lO=` 105;110;112;117;116;58;32;105;110;116;32;108;97;114;103;117;114;97;32;34;76;97;114;103;117;114;97;34; @@ -55273,7 +55273,7 @@ lösung: vb-wald-loesung.visustruct -`,lO=` +`,uO=` 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;123;50;44;32;52;44;32;54;44;32;56;44;32;49;48;125; @@ -55289,7 +55289,7 @@ lösung: vb-wald-loesung.visustruct -`,uO=` +`,mO=` 105;110;116;91;93;32;118;97;108;111;114;101;115;32;61;32;123;52;44;32;56;44;32;49;53;44;32;49;54;44;32;50;51;44;32;52;50;125; @@ -55304,7 +55304,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;118;97;108;111;114;101;115;46;108;101;110;103;116;104; -`,mO=` +`,cO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55336,7 +55336,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; -`,cO=` +`,dO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55368,7 +55368,7 @@ lösung: vb-wald-loesung.visustruct -`,dO=` +`,hO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;81;117;97;110;116;111;115;32;100;101;103;114;97;117;115;63;34; @@ -55397,7 +55397,7 @@ lösung: vb-wald-loesung.visustruct -`,hO=` +`,gO=` 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;110;101;119;32;83;116;114;105;110;103;91;51;93; @@ -55416,7 +55416,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;114;105;109;101;105;114;111;32;110;111;109;101;58;32;34;32;43;32;110;111;109;101;115;91;48;93; -`,gO=` +`,pO=` 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;52;93; @@ -55442,7 +55442,7 @@ lösung: vb-wald-loesung.visustruct -`,pO=` +`,fO=` 105;110;116;91;93;32;110;117;109;101;114;111;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -55493,7 +55493,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; -`,fO=` +`,xO=` 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;49;50;44;32;55;44;32;49;57;44;32;52;125; @@ -55534,7 +55534,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;225;120;105;109;111;58;32;34;32;43;32;109;97;120; -`,xO=` +`,bO=` 105;110;116;32;115;111;109;97;32;61;32;48; @@ -55557,7 +55557,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; -`,bO=` +`,yO=` 105;110;116;32;115;111;109;97;32;61;32;48; @@ -55587,7 +55587,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; -`,yO=` +`,vO=` 105;110;112;117;116;58;32;105;110;116;32;99;111;109;112;114;105;109;101;110;116;111;32;34;67;111;109;112;114;105;109;101;110;116;111;63;34; @@ -55602,7 +55602,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;193;114;101;97;58;32;34;32;43;32;102; -`,vO=` +`,wO=` 109;111;115;116;114;97;114;66;111;97;115;86;105;110;100;97;115;40;41; @@ -55614,7 +55614,7 @@ lösung: vb-wald-loesung.visustruct 109;111;115;116;114;97;114;82;101;115;117;108;116;97;100;111;40;41; -`,wO=` +`,zO=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -55646,7 +55646,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; -`,zO=` +`,IO=` 105;110;116;91;93;32;116;101;109;112;101;114;97;116;117;114;97;115;32;61;32;123;45;53;44;32;45;50;44;32;45;56;44;32;45;51;125; @@ -55678,7 +55678,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;101;109;112;101;114;97;116;117;114;97;32;109;97;105;115;32;97;108;116;97;58;32;34;32;43;32;109;97;120; -`,IO=` +`,kO=` 105;110;116;91;93;32;110;111;116;97;115;32;61;32;123;50;44;32;51;44;32;49;44;32;52;125; @@ -55700,7 +55700,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; -`,kO=` +`,SO=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;110;250;109;101;114;111;63;34; @@ -55712,7 +55712,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;79;32;113;117;97;100;114;97;100;111;32;233;32;34;32;43;32;113; -`,SO=` +`,_O=` 105;110;116;32;114;101;115;117;108;116;97;100;111;32;61;32;120;32;42;32;120; @@ -55721,7 +55721,7 @@ lösung: vb-wald-loesung.visustruct 114;101;116;117;114;110;32;114;101;115;117;108;116;97;100;111; -`,_O=` +`,TO=` 109;111;115;116;114;97;114;84;105;116;117;108;111;40;41; @@ -55733,7 +55733,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;79;108;225;32;34;32;43;32;110;111;109;101; -`,TO=` +`,OO=` 111;117;116;112;117;116;58;32;34;66;101;109;45;118;105;110;100;111;32;97;111;32;113;117;105;122;33;34; @@ -55742,7 +55742,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;97;105;115;32;116;101;114;32;116;114;234;115;32;112;101;114;103;117;110;116;97;115;46;34; -`,OO=` +`,AO=` 109;111;115;116;114;97;114;83;111;109;97;40;51;44;32;52;41; @@ -55754,7 +55754,7 @@ lösung: vb-wald-loesung.visustruct 109;111;115;116;114;97;114;83;111;109;97;40;120;44;32;120;32;43;32;49;41; -`,AO=` +`,PO=` 105;110;116;32;115;111;109;97;32;61;32;97;32;43;32;98; @@ -55763,7 +55763,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;97;32;43;32;34;32;43;32;34;32;43;32;98;32;43;32;34;32;61;32;34;32;43;32;115;111;109;97; -`,PO=` +`,jO=` 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; @@ -55786,7 +55786,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;74;225;33;34; -`,jO=` +`,CO=` 105;110;112;117;116;58;32;105;110;116;32;105;110;105;99;105;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;34; @@ -55809,7 +55809,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;74;225;34; -`,CO=` +`,BO=` 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -55831,7 +55831,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; -`,BO=` +`,DO=` 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;44;32;50;125;44;32;123;52;44;32;49;44;32;54;125;125; @@ -55853,7 +55853,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;74;111;103;97;100;111;114;32;50;58;32;34;32;43;32;115;111;109;97; -`,DO=` +`,ZO=` 105;110;116;91;93;91;93;32;112;111;110;116;111;115;32;61;32;123;123;51;44;32;53;125;44;32;123;52;44;32;49;125;44;32;123;50;44;32;50;125;125; @@ -55882,7 +55882,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;111;109;97;58;32;34;32;43;32;115;111;109;97; -`,ZO=` +`,MO=` 105;110;116;32;115;111;109;97;32;61;32;48; @@ -55905,7 +55905,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,MO=` +`,LO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55927,7 +55927,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,LO=` +`,WO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -55949,7 +55949,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;115;111;109;97; -`,WO=` +`,EO=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;81;117;101;32;116;97;98;117;97;100;97;63;34; @@ -55981,7 +55981,7 @@ lösung: vb-wald-loesung.visustruct -`,EO=` +`,NO=` 105;110;112;117;116;58;32;105;110;116;32;110;32;34;73;110;116;114;111;100;117;122;32;117;109;32;110;250;109;101;114;111;34; @@ -56003,7 +56003,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;102;97;116;111;114;105;97;108; -`,NO=` +`,FO=` 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; @@ -56035,13 +56035,13 @@ lösung: vb-wald-loesung.visustruct -`,FO=` +`,JO=` 83;116;114;105;110;103;32;99;97;114;116;97;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;99;97;114;116;97;46;116;120;116;34;41;41; -`,JO=` +`,RO=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; @@ -56053,7 +56053,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,RO=` +`,GO=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;63;34; @@ -56065,7 +56065,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;49;41;32;43;32;34;46;34; -`,GO=` +`,HO=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;101;110;116;114;97;100;97;32;34;80;97;108;97;118;114;97;45;112;97;115;115;101;63;34; @@ -56084,7 +56084,7 @@ lösung: vb-wald-loesung.visustruct -`,HO=` +`,VO=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -56113,7 +56113,7 @@ lösung: vb-wald-loesung.visustruct -`,VO=` +`,QO=` 105;110;112;117;116;58;32;105;110;116;32;110;117;109;101;114;111;32;34;86;97;108;111;114;32;105;110;105;99;105;97;108;63;34; @@ -56133,7 +56133,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;70;105;109;34; -`,QO=` +`,qO=` 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; @@ -56166,7 +56166,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; -`,qO=` +`,UO=` 105;110;116;32;116;101;110;116;97;116;105;118;97;115;32;61;32;48; @@ -56199,7 +56199,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;101;110;116;97;116;105;118;97;115;58;32;34;32;43;32;116;101;110;116;97;116;105;118;97;115; -`,UO=` +`,$O=` 105;110;116;32;115;111;109;97;32;61;32;48; @@ -56241,7 +56241,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;115;111;109;97; -`,$O=` +`,YO=` 105;110;112;117;116;58;32;105;110;116;32;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;97;110;111;115;32;116;101;110;115;63;34; @@ -56263,7 +56263,7 @@ lösung: vb-wald-loesung.visustruct -`,YO=` +`,XO=` 105;110;112;117;116;58;32;105;110;116;32;108;105;109;105;116;101;32;34;65;116;233;32;113;117;101;32;110;250;109;101;114;111;63;34; @@ -56279,7 +56279,7 @@ lösung: vb-wald-loesung.visustruct -`,XO=` +`,KO=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -56318,7 +56318,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; -`,KO=` +`,eA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -56357,7 +56357,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;111;115;105;231;227;111;58;32;34;32;43;32;112;111;115;105;99;97;111; -`,eA=` +`,tA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -56392,7 +56392,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;81;117;97;110;116;105;100;97;100;101;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; -`,tA=` +`,nA=` 111;117;116;112;117;116;58;32;34;66;111;109;32;100;105;97;34; @@ -56401,13 +56401,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;72;111;106;101;32;97;112;114;101;110;100;101;109;111;115;32;101;115;116;114;117;116;111;103;114;97;109;97;115;46;34; -`,nA=` +`,iA=` 111;117;116;112;117;116;58;32;34;79;108;225;32;77;117;110;100;111;34; -`,iA=` +`,aA=` 111;117;116;112;117;116;58;32;34;79;108;225;34; @@ -56416,7 +56416,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;115;116;111;117;32;97;32;97;112;114;101;110;100;101;114;32;101;115;116;114;117;116;111;103;114;97;109;97;115;34; -`,aA=` +`,sA=` 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; @@ -56457,7 +56457,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;108;105;110;104;97;115;32;103;117;97;114;100;97;100;97;115;34; -`,sA=` +`,rA=` 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; @@ -56466,7 +56466,7 @@ lösung: vb-wald-loesung.visustruct 80;114;105;110;116;87;114;105;116;101;114;32;115;97;105;100;97;32;61;32;110;101;119;32;80;114;105;110;116;87;114;105;116;101;114;40;34;99;111;109;112;114;97;115;45;110;111;118;97;46;116;120;116;34;41; -`,rA=` +`,oA=` 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; @@ -56492,13 +56492,13 @@ lösung: vb-wald-loesung.visustruct 102;105;99;104;101;105;114;111;46;99;108;111;115;101;40;41; -`,oA=` +`,lA=` 83;99;97;110;110;101;114;32;102;105;99;104;101;105;114;111;32;61;32;110;101;119;32;83;99;97;110;110;101;114;40;110;101;119;32;70;105;108;101;40;34;99;111;109;112;114;97;115;46;116;120;116;34;41;41; -`,lA=` +`,uA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; @@ -56537,7 +56537,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;82;97;112;111;115;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; -`,uA=` +`,mA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; @@ -56546,7 +56546,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,mA=` +`,cA=` 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; @@ -56581,7 +56581,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;69;110;116;114;97;100;97;32;109;97;105;115;32;108;111;110;103;97;58;32;34;32;43;32;109;97;105;115;76;111;110;103;97; -`,cA=` +`,dA=` 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;100;105;97;114;105;111;46;116;120;116;34;41;41; @@ -56590,7 +56590,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;91;93;32;108;105;110;104;97;115;32;61;32;116;101;120;116;111;46;115;112;108;105;116;40;34;92;110;34;41; -`,dA=` +`,hA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; @@ -56644,7 +56644,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;101;108;104;111;114;32;110;111;116;97;32;97;32;73;110;103;108;234;115;58;32;34;32;43;32;109;101;108;104;111;114;78;111;109;101;32;43;32;34;32;40;34;32;43;32;109;101;108;104;111;114;78;111;116;97;32;43;32;34;41;34; -`,hA=` +`,gA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; @@ -56653,7 +56653,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,gA=` +`,pA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; @@ -56694,7 +56694,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;77;233;100;105;97;32;100;101;32;77;97;116;101;109;225;116;105;99;97;58;32;34;32;43;32;115;111;109;97;32;47;32;113;117;97;110;116;105;100;97;100;101; -`,pA=` +`,fA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;116;117;114;109;97;46;99;115;118;34;41;41; @@ -56703,7 +56703,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,fA=` +`,xA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -56742,7 +56742,7 @@ lösung: vb-wald-loesung.visustruct 108;101;105;116;111;114;46;99;108;111;115;101;40;41; -`,xA=` +`,bA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;122;111;111;46;106;115;111;110;34;41;41; @@ -56751,7 +56751,7 @@ lösung: vb-wald-loesung.visustruct 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;108;101;105;116;111;114;46;114;101;97;100;76;105;110;101;40;41; -`,bA=` +`,yA=` 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; @@ -56801,7 +56801,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101;115;46;108;101;110;103;116;104;32;43;32;34;32;101;110;116;114;97;100;97;115;32;103;117;97;114;100;97;100;97;115;34; -`,yA=` +`,vA=` 83;116;114;105;110;103;91;93;32;110;111;109;101;115;32;61;32;123;34;76;117;100;119;105;103;34;44;32;34;90;111;114;97;34;44;32;34;82;97;112;111;115;97;34;125; @@ -56819,7 +56819,7 @@ lösung: vb-wald-loesung.visustruct 115;97;105;100;97;46;99;108;111;115;101;40;41; -`,vA=` +`,wA=` 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; @@ -56872,7 +56872,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;40;108;105;110;104;97;115;46;108;101;110;103;116;104;32;45;32;49;41;32;43;32;34;32;97;110;105;109;97;105;115;32;103;117;97;114;100;97;100;111;115;34; -`,wA=` +`,zA=` 83;116;114;105;110;103;32;116;101;120;116;111;32;61;32;70;105;108;101;115;46;114;101;97;100;83;116;114;105;110;103;40;80;97;116;104;46;111;102;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; @@ -56893,7 +56893,7 @@ lösung: vb-wald-loesung.visustruct 115;97;105;100;97;46;99;108;111;115;101;40;41; -`,zA=` +`,IA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; @@ -56937,7 +56937,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;113;117;97;110;116;105;100;97;100;101;32;43;32;34;32;102;114;97;115;101;115;32;103;117;97;114;100;97;100;97;115;34; -`,IA=` +`,kA=` 66;117;102;102;101;114;101;100;82;101;97;100;101;114;32;108;101;105;116;111;114;32;61;32;110;101;119;32;66;117;102;102;101;114;101;100;82;101;97;100;101;114;40;110;101;119;32;70;105;108;101;82;101;97;100;101;114;40;34;97;110;105;109;97;105;115;46;99;115;118;34;41;41; @@ -56958,7 +56958,7 @@ lösung: vb-wald-loesung.visustruct 115;97;105;100;97;46;99;108;111;115;101;40;41; -`,kA=` +`,SA=` 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; @@ -56970,7 +56970,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;84;111;116;97;108;58;32;34;32;43;32;116;111;116;97;108; -`,SA=` +`,_A=` 105;110;112;117;116;58;32;105;110;116;32;113;117;97;110;116;105;100;97;100;101;32;34;81;117;97;110;116;111;115;32;98;105;108;104;101;116;101;115;63;34; @@ -56982,7 +56982,7 @@ lösung: vb-wald-loesung.visustruct 100;111;117;98;108;101;32;116;111;116;97;108;32;61;32;113;117;97;110;116;105;100;97;100;101;32;42;32;56;46;53; -`,_A=` +`,TA=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; @@ -57006,7 +57006,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,TA=` +`,OA=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;80;114;105;109;101;105;114;111;32;110;250;109;101;114;111;34; @@ -57027,7 +57027,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,OA=` +`,AA=` 105;110;116;32;97;32;61;32;51; @@ -57051,7 +57051,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,AA=` +`,PA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -57110,7 +57110,7 @@ lösung: vb-wald-loesung.visustruct -`,PA=` +`,jA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -57169,7 +57169,7 @@ lösung: vb-wald-loesung.visustruct -`,jA=` +`,CA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -57243,7 +57243,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; -`,CA=` +`,BA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; @@ -57292,7 +57292,7 @@ lösung: vb-wald-loesung.visustruct -`,BA=` +`,DA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -57341,7 +57341,7 @@ lösung: vb-wald-loesung.visustruct -`,DA=` +`,ZA=` 105;110;116;91;93;32;99;97;114;116;97;115;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -57399,7 +57399,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;67;111;109;112;97;114;97;231;245;101;115;58;32;34;32;43;32;99;111;109;112;97;114;97;99;111;101;115; -`,ZA=` +`,MA=` 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; @@ -57418,7 +57418,7 @@ lösung: vb-wald-loesung.visustruct -`,MA=` +`,LA=` 105;110;116;91;93;32;112;111;110;116;111;115;32;61;32;123;51;44;32;53;44;32;56;125; @@ -57437,7 +57437,7 @@ lösung: vb-wald-loesung.visustruct -`,LA=` +`,WA=` 105;110;116;32;105;32;61;32;48; @@ -57450,7 +57450,7 @@ lösung: vb-wald-loesung.visustruct -`,WA=` +`,EA=` 105;110;116;32;110;117;109;101;114;111;32;61;32;53; @@ -57474,7 +57474,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;68;101;112;111;105;115;58;32;34;32;43;32;102;105;108;97;91;48;93;32;43;32;34;44;32;34;32;43;32;102;105;108;97;91;49;93; -`,EA=` +`,NA=` 105;110;116;32;105;32;61;32;48; @@ -57487,7 +57487,7 @@ lösung: vb-wald-loesung.visustruct -`,NA=` +`,FA=` 120;32;61;32;120;32;42;32;50; @@ -57496,7 +57496,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;78;111;32;115;117;98;112;114;111;103;114;97;109;97;58;32;120;32;61;32;34;32;43;32;120; -`,FA=` +`,JA=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;110;111;109;101;32;34;78;111;109;101;32;112;114;243;112;114;105;111;34; @@ -57508,7 +57508,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;110;111;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;97;112;101;108;105;100;111;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,JA=` +`,RA=` 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; @@ -57547,7 +57547,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;116;101;120;116; -`,RA=` +`,GA=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; @@ -57569,7 +57569,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;105;110;118;101;114;116;105;100;97; -`,GA=` +`,HA=` 83;116;114;105;110;103;32;108;105;110;104;97;32;61;32;34;76;117;100;119;105;103;59;98;111;100;101;59;55;34; @@ -57588,7 +57588,7 @@ lösung: vb-wald-loesung.visustruct -`,HA=` +`,VA=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;102;114;97;115;101;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;102;114;97;115;101;34; @@ -57600,7 +57600,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;80;97;108;97;118;114;97;115;58;32;34;32;43;32;112;97;108;97;118;114;97;115;46;108;101;110;103;116;104; -`,VA=` +`,QA=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;34;73;110;116;114;111;100;117;122;32;117;109;97;32;112;97;108;97;118;114;97;34; @@ -57632,7 +57632,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;78;250;109;101;114;111;32;100;101;32;97;58;32;34;32;43;32;113;117;97;110;116;105;100;97;100;101; -`,QA=` +`,qA=` 83;116;114;105;110;103;32;112;97;108;97;118;114;97;32;61;32;34;80;97;115;115;97;116;101;109;112;111;34; @@ -57656,7 +57656,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;112;97;108;97;118;114;97;46;116;111;85;112;112;101;114;67;97;115;101;40;41; -`,qA=` +`,UA=` 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; @@ -57668,7 +57668,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;71;101;115;97;109;116;58;32;34;32;43;32;103;101;115;97;109;116; -`,UA=` +`,$A=` 105;110;112;117;116;58;32;105;110;116;32;97;110;122;97;104;108;32;34;87;105;101;32;118;105;101;108;101;32;75;97;114;116;101;110;63;34; @@ -57680,7 +57680,7 @@ lösung: vb-wald-loesung.visustruct 100;111;117;98;108;101;32;103;101;115;97;109;116;32;61;32;97;110;122;97;104;108;32;42;32;56;46;53; -`,$A=` +`,YA=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; @@ -57704,7 +57704,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,YA=` +`,XA=` 105;110;112;117;116;58;32;105;110;116;32;97;32;34;69;114;115;116;101;32;90;97;104;108;34; @@ -57725,7 +57725,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,XA=` +`,KA=` 105;110;116;32;97;32;61;32;51; @@ -57749,7 +57749,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;98;32;61;32;34;32;43;32;98; -`,KA=` +`,eP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -57808,7 +57808,7 @@ lösung: vb-wald-loesung.visustruct -`,eP=` +`,tP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;110;101;119;32;105;110;116;91;53;93; @@ -57867,7 +57867,7 @@ lösung: vb-wald-loesung.visustruct -`,tP=` +`,nP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -57941,7 +57941,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; -`,nP=` +`,iP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;55;44;32;51;44;32;49;48;44;32;53;44;32;50;125; @@ -57990,7 +57990,7 @@ lösung: vb-wald-loesung.visustruct -`,iP=` +`,aP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;56;44;32;52;44;32;49;49;44;32;52;44;32;54;125; @@ -58039,7 +58039,7 @@ lösung: vb-wald-loesung.visustruct -`,aP=` +`,sP=` 105;110;116;91;93;32;107;97;114;116;101;110;32;61;32;123;50;44;32;51;44;32;53;44;32;55;44;32;56;44;32;49;48;44;32;49;50;44;32;49;51;44;32;49;53;44;32;49;56;44;32;50;48;44;32;50;49;44;32;50;52;44;32;50;55;44;32;51;48;125; @@ -58097,7 +58097,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;86;101;114;103;108;101;105;99;104;101;58;32;34;32;43;32;118;101;114;103;108;101;105;99;104;101; -`,sP=` +`,rP=` 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; @@ -58116,7 +58116,7 @@ lösung: vb-wald-loesung.visustruct -`,rP=` +`,oP=` 105;110;116;91;93;32;112;117;110;107;116;101;32;61;32;123;51;44;32;53;44;32;56;125; @@ -58135,7 +58135,7 @@ lösung: vb-wald-loesung.visustruct -`,oP=` +`,lP=` 105;110;116;32;105;32;61;32;48; @@ -58148,7 +58148,7 @@ lösung: vb-wald-loesung.visustruct -`,lP=` +`,uP=` 105;110;116;32;122;97;104;108;32;61;32;53; @@ -58172,7 +58172,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;78;97;99;104;104;101;114;58;32;34;32;43;32;114;101;105;104;101;91;48;93;32;43;32;34;44;32;34;32;43;32;114;101;105;104;101;91;49;93; -`,uP=` +`,mP=` 105;110;116;32;105;32;61;32;48; @@ -58185,7 +58185,7 @@ lösung: vb-wald-loesung.visustruct -`,mP=` +`,cP=` 120;32;61;32;120;32;42;32;50; @@ -58194,7 +58194,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;73;109;32;85;110;116;101;114;112;114;111;103;114;97;109;109;58;32;120;32;61;32;34;32;43;32;120; -`,cP=` +`,dP=` 105;110;116;32;97;98;115;116;97;110;100;32;61;32;109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41; @@ -58203,7 +58203,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;98;115;116;97;110;100;58;32;34;32;43;32;97;98;115;116;97;110;100;32;43;32;34;32;99;109;34;41; -`,dP=` +`,hP=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;49;48; @@ -58229,7 +58229,7 @@ lösung: vb-wald-loesung.visustruct -`,hP=` +`,gP=` 33;109;98;111;116;46;105;115;66;117;116;116;111;110;66;40;41; @@ -58256,7 +58256,7 @@ lösung: vb-wald-loesung.visustruct -`,gP=` +`,pP=` 109;98;111;116;46;115;101;116;76;101;100;40;50;53;53;44;32;48;44;32;48;41; @@ -58274,7 +58274,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;101;116;76;101;100;40;48;44;32;50;53;53;44;32;48;41; -`,pP=` +`,fP=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -58304,7 +58304,7 @@ lösung: vb-wald-loesung.visustruct -`,fP=` +`,xP=` 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;72;97;108;108;111;33;34;41; @@ -58316,7 +58316,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;73;99;104;32;98;105;110;32;86;105;115;117;66;111;116;34;41; -`,xP=` +`,bP=` 105;110;116;32;122;97;104;108;32;61;32;48; @@ -58368,7 +58368,7 @@ lösung: vb-wald-loesung.visustruct -`,bP=` +`,yP=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; @@ -58379,7 +58379,7 @@ lösung: vb-wald-loesung.visustruct -`,yP=` +`,vP=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -58390,7 +58390,7 @@ lösung: vb-wald-loesung.visustruct -`,vP=` +`,wP=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -58401,7 +58401,7 @@ lösung: vb-wald-loesung.visustruct -`,wP=` +`,zP=` 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;86;105;115;117;66;111;116;34; @@ -58420,7 +58420,7 @@ lösung: vb-wald-loesung.visustruct -`,zP=` +`,IP=` 109;98;111;116;46;108;101;100;40;48;41;46;115;101;116;67;111;108;111;114;40;34;114;111;116;34;41; @@ -58432,7 +58432,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;108;101;100;40;52;41;46;115;101;116;67;111;108;111;114;40;34;103;114;252;110;34;41; -`,IP=` +`,kP=` 105;110;116;32;105;32;61;32;48; @@ -58448,7 +58448,7 @@ lösung: vb-wald-loesung.visustruct -`,kP=` +`,SP=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; @@ -58476,7 +58476,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;71;101;112;97;114;107;116;33;34;41; -`,SP=` +`,_P=` 83;116;114;105;110;103;91;93;32;102;97;114;98;101;110;32;61;32;123;34;114;111;116;34;44;32;34;103;101;108;98;34;44;32;34;103;114;252;110;34;44;32;34;98;108;97;117;34;44;32;34;108;105;108;97;34;125; @@ -58492,7 +58492,7 @@ lösung: vb-wald-loesung.visustruct -`,_P=` +`,TP=` 109;98;111;116;46;103;101;116;67;111;108;111;114;40;41; @@ -58518,7 +58518,7 @@ lösung: vb-wald-loesung.visustruct -`,TP=` +`,OP=` 109;98;111;116;46;100;114;105;118;101;40;53;48;44;32;53;48;41; @@ -58535,7 +58535,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,OP=` +`,AP=` 109;98;111;116;46;102;111;114;119;97;114;100;40;41; @@ -58553,7 +58553,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;41; -`,AP=` +`,PP=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; @@ -58589,7 +58589,7 @@ lösung: vb-wald-loesung.visustruct -`,PP=` +`,jP=` 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;65;107;107;117;58;32;34;32;43;32;109;98;111;116;46;103;101;116;66;97;116;116;101;114;121;40;41;32;43;32;34;32;37;34;41; @@ -58608,7 +58608,7 @@ lösung: vb-wald-loesung.visustruct -`,jP=` +`,CP=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;98;108;97;117;34;41; @@ -58632,7 +58632,7 @@ lösung: vb-wald-loesung.visustruct -`,CP=` +`,BP=` 105;110;116;32;105;32;61;32;48; @@ -58654,7 +58654,7 @@ lösung: vb-wald-loesung.visustruct -`,BP=` +`,DP=` 105;110;116;32;105;32;61;32;51; @@ -58673,7 +58673,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;76;111;115;33;34;41; -`,DP=` +`,ZP=` 105;110;116;32;105;32;61;32;49; @@ -58686,7 +58686,7 @@ lösung: vb-wald-loesung.visustruct -`,ZP=` +`,MP=` 105;110;116;32;105;32;61;32;48; @@ -58719,7 +58719,7 @@ lösung: vb-wald-loesung.visustruct -`,MP=` +`,LP=` 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;62;32;54;48; @@ -58735,7 +58735,7 @@ lösung: vb-wald-loesung.visustruct -`,LP=` +`,WP=` 105;110;116;32;105;32;61;32;48; @@ -58754,7 +58754,7 @@ lösung: vb-wald-loesung.visustruct -`,WP=` +`,EP=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -58798,7 +58798,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,EP=` +`,NP=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; @@ -58817,7 +58817,7 @@ lösung: vb-wald-loesung.visustruct -`,NP=` +`,FP=` 105;110;116;32;115;99;104;114;105;116;116;101;32;61;32;48; @@ -58847,7 +58847,7 @@ lösung: vb-wald-loesung.visustruct -`,FP=` +`,JP=` 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; @@ -58875,7 +58875,7 @@ lösung: vb-wald-loesung.visustruct -`,JP=` +`,RP=` 83;116;114;105;110;103;32;116;101;120;116;32;61;32;34;72;97;108;108;111;32;75;108;97;115;115;101;34; @@ -58884,7 +58884,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;116;101;120;116;32;43;32;34;32;40;34;32;43;32;116;101;120;116;46;108;101;110;103;116;104;40;41;32;43;32;34;41;34;41; -`,RP=` +`,GP=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;62;32;49;53; @@ -58898,7 +58898,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;112;108;97;121;84;111;110;101;40;52;52;48;44;32;51;48;48;41; -`,GP=` +`,HP=` 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;62;32;45;53;32;38;38;32;109;98;111;116;46;103;101;116;82;111;108;108;40;41;32;60;32;53; @@ -58914,7 +58914,7 @@ lösung: vb-wald-loesung.visustruct -`,HP=` +`,VP=` 109;98;111;116;46;103;101;116;76;111;117;100;110;101;115;115;40;41;32;60;32;53;48; @@ -58928,7 +58928,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; -`,VP=` +`,QP=` 105;110;116;32;105;32;61;32;48; @@ -58963,7 +58963,7 @@ lösung: vb-wald-loesung.visustruct -`,QP=` +`,qP=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -58997,7 +58997,7 @@ lösung: vb-wald-loesung.visustruct -`,qP=` +`,UP=` 33;109;98;111;116;46;103;101;116;67;111;108;111;114;40;41;46;101;113;117;97;108;115;40;34;114;111;116;34;41; @@ -59041,7 +59041,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,UP=` +`,$P=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41; @@ -59067,7 +59067,7 @@ lösung: vb-wald-loesung.visustruct -`,$P=` +`,YP=` 105;110;116;91;93;32;116;111;101;110;101;32;61;32;123;50;54;50;44;32;50;57;52;44;32;51;51;48;44;32;51;52;57;44;32;51;57;50;125; @@ -59083,7 +59083,7 @@ lösung: vb-wald-loesung.visustruct -`,YP=` +`,XP=` 105;110;116;32;105;32;61;32;48; @@ -59149,7 +59149,7 @@ lösung: vb-wald-loesung.visustruct -`,XP=` +`,KP=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;51;48; @@ -59165,7 +59165,7 @@ lösung: vb-wald-loesung.visustruct -`,KP=` +`,ej=` 109;98;111;116;46;103;101;116;66;114;105;103;104;116;110;101;115;115;40;41;32;60;32;50;48; @@ -59182,7 +59182,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;104;111;119;84;101;120;116;40;34;90;122;122;34;41; -`,ej=` +`,tj=` 105;110;112;117;116;58;32;105;110;116;32;110;111;116;101; @@ -59211,7 +59211,7 @@ lösung: vb-wald-loesung.visustruct -`,tj=` +`,nj=` 105;110;116;32;97;32;61;32;113;117;97;100;114;97;116;122;97;104;108;40;51;41; @@ -59226,13 +59226,13 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;98; -`,nj=` +`,ij=` 114;101;116;117;114;110;32;120;32;42;32;120; -`,ij=` +`,aj=` 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;76;117;100;119;105;103;34; @@ -59254,7 +59254,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;114;117;101;99;107;119;97;101;114;116;115; -`,aj=` +`,sj=` 105;110;116;32;108;97;101;110;103;101;32;61;32;54;48; @@ -59269,7 +59269,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;83;116;114;101;99;107;101;58;32;34;32;43;32;115;116;114;101;99;107;101;32;43;32;34;32;99;109;34; -`,sj=` +`,rj=` 105;110;116;91;93;32;110;111;116;101;110;32;61;32;123;50;44;32;49;44;32;51;44;32;50;125; @@ -59294,7 +59294,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;58;32;34;32;43;32;110;111;116;101;110;46;108;101;110;103;116;104; -`,rj=` +`,oj=` 109;98;111;116;46;102;111;114;119;97;114;100;40;41; @@ -59369,7 +59369,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; -`,oj=` +`,lj=` 113;117;97;100;114;97;116;40;51;48;41; @@ -59378,7 +59378,7 @@ lösung: vb-wald-loesung.visustruct 113;117;97;100;114;97;116;40;53;48;41; -`,lj=` +`,uj=` 105;110;116;32;105;32;61;32;48; @@ -59433,7 +59433,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;41; -`,uj=` +`,mj=` 105;110;116;32;105;32;61;32;48; @@ -59449,7 +59449,7 @@ lösung: vb-wald-loesung.visustruct -`,mj=` +`,cj=` 105;110;116;32;105;32;61;32;48; @@ -59472,7 +59472,7 @@ lösung: vb-wald-loesung.visustruct -`,cj=` +`,dj=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -59486,7 +59486,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;116;117;114;110;82;105;103;104;116;40;49;56;48;41; -`,dj=` +`,hj=` 109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;62;32;50;48;32;124;124;32;109;98;111;116;46;103;101;116;80;105;116;99;104;40;41;32;60;32;45;50;48; @@ -59502,7 +59502,7 @@ lösung: vb-wald-loesung.visustruct -`,hj=` +`,gj=` 105;110;116;32;105;32;61;32;48; @@ -59554,7 +59554,7 @@ lösung: vb-wald-loesung.visustruct -`,gj=` +`,pj=` 105;110;116;32;105;32;61;32;49; @@ -59570,7 +59570,7 @@ lösung: vb-wald-loesung.visustruct -`,pj=` +`,fj=` 33;109;98;111;116;46;105;115;66;117;116;116;111;110;65;40;41; @@ -59584,7 +59584,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;102;111;114;119;97;114;100;40;51;48;41; -`,fj=` +`,xj=` 109;98;111;116;46;112;108;97;121;84;111;110;101;40;50;54;50;44;32;51;48;48;41; @@ -59602,7 +59602,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;112;108;97;121;84;111;110;101;40;51;57;50;44;32;51;48;48;41; -`,xj=` +`,bj=` 105;110;116;32;105;32;61;32;48; @@ -59624,7 +59624,7 @@ lösung: vb-wald-loesung.visustruct -`,bj=` +`,yj=` 105;110;116;32;108;105;110;107;115;32;61;32;57;57; @@ -59656,7 +59656,7 @@ lösung: vb-wald-loesung.visustruct -`,yj=` +`,vj=` 105;110;116;32;115;101;105;116;101;32;61;32;51;48; @@ -59675,7 +59675,7 @@ lösung: vb-wald-loesung.visustruct -`,vj=` +`,wj=` 105;110;116;32;105;32;61;32;48; @@ -59708,7 +59708,7 @@ lösung: vb-wald-loesung.visustruct -`,wj=` +`,zj=` 109;98;111;116;46;103;101;116;76;105;110;101;40;41;32;61;61;32;48; @@ -59747,7 +59747,7 @@ lösung: vb-wald-loesung.visustruct -`,zj=` +`,Ij=` 109;98;111;116;46;103;101;116;68;105;115;116;97;110;99;101;40;41;32;60;32;50;48; @@ -59763,7 +59763,7 @@ lösung: vb-wald-loesung.visustruct -`,Ij=` +`,kj=` 109;98;111;116;46;114;101;115;101;116;84;105;109;101;114;40;41; @@ -59783,7 +59783,7 @@ lösung: vb-wald-loesung.visustruct 109;98;111;116;46;115;116;111;112;40;41; -`,kj=` +`,Sj=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;118;111;114;110;97;109;101;32;34;86;111;114;110;97;109;101;34; @@ -59795,7 +59795,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;118;111;114;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;32;34;32;43;32;110;97;99;104;110;97;109;101;46;99;104;97;114;65;116;40;48;41;32;43;32;34;46;34; -`,Sj=` +`,_j=` 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;90;105;101;103;101;110;98;111;99;107;34; @@ -59834,7 +59834,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;116;101;120;116; -`,_j=` +`,Tj=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; @@ -59856,7 +59856,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;114;117;101;99;107;119;97;101;114;116;115; -`,Tj=` +`,Oj=` 83;116;114;105;110;103;32;122;101;105;108;101;32;61;32;34;76;117;100;119;105;103;59;71;101;105;223;98;111;99;107;59;55;34; @@ -59875,7 +59875,7 @@ lösung: vb-wald-loesung.visustruct -`,Oj=` +`,Aj=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;115;97;116;122;32;34;83;97;116;122;32;101;105;110;103;101;98;101;110;34; @@ -59887,7 +59887,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;87;246;114;116;101;114;58;32;34;32;43;32;119;111;101;114;116;101;114;46;108;101;110;103;116;104; -`,Aj=` +`,Pj=` 105;110;112;117;116;58;32;83;116;114;105;110;103;32;119;111;114;116;32;34;87;111;114;116;32;101;105;110;103;101;98;101;110;34; @@ -59919,7 +59919,7 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;34;65;110;122;97;104;108;32;101;58;32;34;32;43;32;97;110;122;97;104;108; -`,Pj=` +`,jj=` 83;116;114;105;110;103;32;119;111;114;116;32;61;32;34;71;101;105;223;98;111;99;107;34; @@ -59943,14 +59943,14 @@ lösung: vb-wald-loesung.visustruct 111;117;116;112;117;116;58;32;119;111;114;116;46;116;111;85;112;112;101;114;67;97;115;101;40;41; -`,jj=`// Labyrinth mit Ausgängen (nach Kara): jede Wandreihe hat genau eine Lücke, immer weiter rechts. Ein Zeichen = 30 cm. +`,Cj=`// Labyrinth mit Ausgängen (nach Kara): jede Wandreihe hat genau eine Lücke, immer weiter rechts. Ein Zeichen = 30 cm. raster: 3 .......Z #####.## ........ ##.##### >....... -`,Cj=`// Labyrinth mit Ausgängen, drei Reihen. Ein Zeichen = 30 cm. +`,Bj=`// Labyrinth mit Ausgängen, drei Reihen. Ein Zeichen = 30 cm. raster: 3 ........Z ######.## @@ -59959,20 +59959,20 @@ raster: 3 ......... .######## >........ -`,Bj=`// Um die Ecke (Sequenz im Kurs, Lektion 5): ein Zeichen = 30 cm. +`,Dj=`// Um die Ecke (Sequenz im Kurs, Lektion 5): ein Zeichen = 30 cm. raster: 3 Z.... ###.. ..... ..### ^.... -`,Dj=`// Fahre bis Rot: kurzer Weg +`,Zj=`// Fahre bis Rot: kurzer Weg ..... ..r.. ..... ..... ..^.. -`,Zj=`// Fahre bis Rot: erst kommt ein grünes Feld +`,Mj=`// Fahre bis Rot: erst kommt ein grünes Feld ..... ..r.. ..... @@ -59981,21 +59981,21 @@ Z.... ..... ..... ..^.. -`,Mj=`// Bis Blau, bei Grün piepen +`,Lj=`// Bis Blau, bei Grün piepen ..... ..b.. ..... ..g.. ..... ..^.. -`,Lj=`// Bis Blau, ohne grünes Feld +`,Wj=`// Bis Blau, ohne grünes Feld ..... ..b.. ..... ..... ..... ..^.. -`,Wj=`// Hindernis ausweichen: ein Klotz im Weg, das rote Feld liegt dahinter. +`,Ej=`// Hindernis ausweichen: ein Klotz im Weg, das rote Feld liegt dahinter. ......... .....r... .....o... @@ -60006,7 +60006,7 @@ Z.... ......... ......... ..^...... -`,Ej=`// Hindernis ausweichen: zwei Klötze im Weg. +`,Nj=`// Hindernis ausweichen: zwei Klötze im Weg. ......... .......r. .......o. @@ -60021,7 +60021,7 @@ Z.... ......... ......... .^....... -`,Nj=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben links. +`,Fj=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben links. ........... .Z......... ........... @@ -60033,7 +60033,7 @@ Z.... ........... .........<. ........... -`,Fj=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben rechts. +`,Jj=`// Labyrinth: Gänge 30 cm breit, Wände 10 cm dick. Ziel oben rechts. ........... .........Z. ........... @@ -60045,7 +60045,7 @@ Z.... ........... .>......... ........... -`,Jj=`// Linienfolger: Die Linie biegt nach rechts ab und endet vor der Wand. +`,Rj=`// Linienfolger: Die Linie biegt nach rechts ab und endet vor der Wand. ######### ......... ......... @@ -60060,7 +60060,7 @@ Z.... ......... ..^...... linie: 2,12 2,8 4,5 4,0.6 -`,Rj=`// Linienfolger: Die Linie biegt nach links ab und endet vor der Wand. +`,Gj=`// Linienfolger: Die Linie biegt nach links ab und endet vor der Wand. ######### ......... ......... @@ -60075,7 +60075,7 @@ linie: 2,12 2,8 4,5 4,0.6 ......... ......^.. linie: 6,12 6,8 4,5 4,0.6 -`,Gj=`// Linienfolger mit Stopp: Am Ende der Linie liegt ein rotes Feld. +`,Hj=`// Linienfolger mit Stopp: Am Ende der Linie liegt ein rotes Feld. ......... .....r... .....o... @@ -60089,7 +60089,7 @@ linie: 6,12 6,8 4,5 4,0.6 ......... ..^...... linie: 2,11 2,8 5,4 5,1.5 -`,Hj=`// Linienfolger mit Stopp: Die Linie schlängelt sich zum roten Feld. +`,Vj=`// Linienfolger mit Stopp: Die Linie schlängelt sich zum roten Feld. ........... ...r....... ...o....... @@ -60105,7 +60105,7 @@ linie: 2,11 2,8 5,4 5,1.5 ........... .......^... linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 -`,Vj=`// Einparken: rechts parken Autos (Klötze), die blaue Markierung zeigt die Lücke. +`,Qj=`// Einparken: rechts parken Autos (Klötze), die blaue Markierung zeigt die Lücke. #....#### #....#### #....#### @@ -60118,7 +60118,7 @@ linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 #....#### #....#### #..^.#### -`,Qj=`// Einparken: Die Lücke liegt weiter vorn. +`,qj=`// Einparken: Die Lücke liegt weiter vorn. #....#### #..b....# #.....o.# @@ -60131,14 +60131,14 @@ linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 #....#### #....#### #..^.#### -`,qj=`// Bis zur Linie: der schwarze Rand ist nah +`,Uj=`// Bis zur Linie: der schwarze Rand ist nah ..... ===== ..... ..... ..^.. ..... -`,Uj=`// Bis zur Linie: der schwarze Rand ist weiter weg +`,$j=`// Bis zur Linie: der schwarze Rand ist weiter weg ..... ===== ..... @@ -60148,17 +60148,17 @@ linie: 7,13 7,10 5,8 5,7 3,5 3,1.5 ..... ..^.. ..... -`,$j=`// Slalom: ein Zeichen = 30 cm. Vier Pylonen, abwechselnd oben und unten herum, Ziel am Ende. +`,Yj=`// Slalom: ein Zeichen = 30 cm. Vier Pylonen, abwechselnd oben und unten herum, Ziel am Ende. raster: 3 ......... >#.#.#.#Z ......... -`,Yj=`// Tunnelsucher (nach Kara): Halt im ersten Feld mit Wand links UND rechts (hellgrün). Ein Zeichen = 30 cm. +`,Xj=`// Tunnelsucher (nach Kara): Halt im ersten Feld mit Wand links UND rechts (hellgrün). Ein Zeichen = 30 cm. raster: 3 ..#..###. >....o... ....##### -`,Xj=`// Tunnelsucher, nach oben. Ein Zeichen = 30 cm. +`,Kj=`// Tunnelsucher, nach oben. Ein Zeichen = 30 cm. raster: 3 .#.#. .#o#. @@ -60166,12 +60166,12 @@ raster: 3 .#... ..... ..^.. -`,Kj=`// Kleeblatt im Wald (nach Kara): Bäume liegen auf dem Weg zum Ziel, nie zwei nebeneinander. Ein Zeichen = 30 cm. +`,eC=`// Kleeblatt im Wald (nach Kara): Bäume liegen auf dem Weg zum Ziel, nie zwei nebeneinander. Ein Zeichen = 30 cm. raster: 3 .......... >..#.#..#Z .......... -`,eC=`// Kleeblatt im Wald, nach oben. Ein Zeichen = 30 cm. +`,tC=`// Kleeblatt im Wald, nach oben. Ein Zeichen = 30 cm. raster: 3 .Z. .#. @@ -60180,7 +60180,7 @@ raster: 3 ... ... .^. -`,tC=`// Wand vorn? Vor dem mBot2 ist viel Platz. +`,nC=`// Wand vorn? Vor dem mBot2 ist viel Platz. ##### ..... ..... @@ -60190,14 +60190,14 @@ raster: 3 ..... ..^.. ..... -`,nC=`// Bis zur Wand: kurzer Weg +`,iC=`// Bis zur Wand: kurzer Weg ##### ..... ..Z.. ..... ..... ..^.. -`,iC=`// Bis zur Wand: langer Weg +`,aC=`// Bis zur Wand: langer Weg ##### ..... ..Z.. @@ -60213,7 +60213,7 @@ raster: 3 ..... ..... ..^.. -`,aC=`// Bis zur Wand: mittlerer Weg +`,sC=`// Bis zur Wand: mittlerer Weg ##### ..... ..Z.. @@ -60224,26 +60224,26 @@ raster: 3 ..... ..... ..^.. -`,sC=`// Wand vorn? Die Wand steht direkt vor dem mBot2. +`,rC=`// Wand vorn? Die Wand steht direkt vor dem mBot2. ##### ..... ..^.. ..... -`,rC=`// Zwei Sekunden mit halber Kraft: Wo bleibt er stehen? +`,oC=`// Zwei Sekunden mit halber Kraft: Wo bleibt er stehen? ..... ..... ..... ..o.. ..... ..^.. -`,oC=`// Fahre bis zum Ziel: kurzer Weg, keine Wand +`,lC=`// Fahre bis zum Ziel: kurzer Weg, keine Wand ..... ..Z.. ..... ..... ..^.. ..... -`,lC=`// Fahre bis zum Ziel: langer Weg, keine Wand +`,uC=`// Fahre bis zum Ziel: langer Weg, keine Wand ..... ..Z.. ..... @@ -60256,77 +60256,77 @@ raster: 3 ..... ..^.. ..... -`,uC=""+new URL("aufgabe-mehrwertsteuer-C-TFTrWz.svg",import.meta.url).href,mC=""+new URL("ben-shneiderman-Cev5hrqS.jpg",import.meta.url).href,cC=""+new URL("caesar-ascii-Bix93F5i.svg",import.meta.url).href,dC=""+new URL("caesar-scheibe-CMRPZI6Y.svg",import.meta.url).href,hC=""+new URL("caesar-verschiebung-DIR-lDbs.svg",import.meta.url).href,gC=""+new URL("aufgabe-mehrwertsteuer-CnrZ00ny.svg",import.meta.url).href,pC=""+new URL("kino-saal-C8zaJk4X.svg",import.meta.url).href,fC=""+new URL("kino-schleifen-D7sfo9iK.svg",import.meta.url).href,xC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlB1dCBhIGN1cCBvbiB0aGUgdGFibGU8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjEzMyI+U3VnYXIgd2FudGVkPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5BZGQgc3VnYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+VGVhIHN0aWxsIHRvbyBob3Q/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+V2FpdCAxIG1pbnV0ZTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5EcmluayB0aGUgdGVhPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIzOTUiPkVuZDwvdGV4dD4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCI+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjE2OCIgZmlsbD0iIzI0OGEzZCI+eWVzPC90ZXh0PgogICAgPHRleHQgeD0iMjQyIiB5PSIxMjIiIGZpbGw9IiNkNzAwMTUiPm5vPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPnllczwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMzIwIiBmaWxsPSIjZDcwMDE1Ij5ubzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5TdGFydCBvciBlbmQ8L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ0MyI+U3RhdGVtZW50PC90ZXh0PgogICAgPHRleHQgeD0iODYiIHk9IjQ3MyI+RGVjaXNpb248L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ3MyI+SW5wdXQgb3Igb3V0cHV0PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",bC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V2hlcmUgZG9lcyB0aGUgZWxlbWVudCBsYW5kPzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij50b3AgaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIxMTUiIHk9Ijk3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj5ib3R0b20gaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+aW4gZnJvbnQ8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YWZ0ZXI8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTMyIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjQwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2Ij7DuDwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjE1NyI+4oaSIDx0c3BhbiBmb250LXdlaWdodD0iNjAwIj5yZXBsYWNlczwvdHNwYW4+IGl0PC90ZXh0Pgo8L3N2Zz4K",yC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWdlID0gMTQ8L3RleHQ+CiAgPHBhdGggZD0iTTEzMCA3MCBMMTcwIDUwIEwzMDAgNTAgTDI2MCA3MCBaIiBmaWxsPSIjYzk4YTNjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE4MCIgeT0iMzQiIHdpZHRoPSI0NCIgaGVpZ2h0PSI1MCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIyMDIiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjIwIiBmb250LXdlaWdodD0iNzAwIj4xNDwvdGV4dD4KICA8cmVjdCB4PSIxMzAiIHk9IjcwIiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5Yjg3MiIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cGF0aCBkPSJNMjYwIDcwIEwzMDAgNTAgTDMwMCAxNTAgTDI2MCAxNzAgWiIgZmlsbD0iI2Q0OWE0YyIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cmVjdCB4PSIxNTAiIHk9IjEwMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjOGE1YTFmIi8+CiAgPHRleHQgeD0iMTk1IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmFnZTwvdGV4dD4KICA8cmVjdCB4PSIxMzgiIHk9IjE0MiIgd2lkdGg9IjM0IiBoZWlnaHQ9IjIwIiByeD0iMTAiIGZpbGw9IiMwMDdhZmYiLz4KICA8dGV4dCB4PSIxNTUiIHk9IjE1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2ZmZmZmZiIgZm9udC13ZWlnaHQ9IjYwMCI+aW50PC90ZXh0PgogIDxnIHN0cm9rZT0iIzZlNmU3MyI+CiAgICA8bGluZSB4MT0iMzEwIiB5MT0iNDgiIHgyPSIyMjYiIHkyPSI1MiIvPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjExNSIgeDI9IjI0MiIgeTI9IjExNSIvPgogICAgPGxpbmUgeDE9IjgwIiB5MT0iMTUyIiB4Mj0iMTM0IiB5Mj0iMTUyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjMxNiIgeT0iNTIiPlZhbHVlPC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0YSB0eXBlPC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMTk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgbmFtZSBnZXRzIHlvdSB0byB0aGUgdmFsdWUuPC90ZXh0Pgo8L3N2Zz4K",vC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9pbnRzPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCB3b3JrIG91dCB0aGUgcmlnaHQ6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIHN0b3JlIHRoZSByZXN1bHQgb24gdGhlIGxlZnQ8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzIGJlZm9yZTogPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj4gICDihpIgICBwb2ludHMgYWZ0ZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",wC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGVmdDwvdGV4dD4KICA8dGV4dCB4PSI3NSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5qdWljZTwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+dGVtcDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+ZW1wdHk8L3RleHQ+CiAgPHRleHQgeD0iMzI1IiB5PSIyMDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnJpZ2h0PC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53YXRlcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxwYXRoIGQ9Ik04OCAxMDQgQzExMCA3MCwgMTYwIDcwLCAxODYgMTA0Ii8+CiAgICA8cGF0aCBkPSJNMzE4IDEwNCBDMjcwIDE1LCAxMzAgMTUsIDgyIDEwNCIvPgogICAgPHBhdGggZD0iTTIxNCAxMDQgQzI0MCA3MCwgMjkwIDcwLCAzMTIgMTA0Ii8+CiAgPC9nPgogIDxnIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPGNpcmNsZSBjeD0iMTM3IiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIxMzciIHk9Ijg1Ij4xPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMzgiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyMDAiIHk9IjQzIj4yPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjYzIiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyNjMiIHk9Ijg1Ij4zPC90ZXh0PgogIDwvZz4KICA8ZyB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMiI+CiAgICA8dGV4dCB4PSI3MCIgeT0iMjQ3Ij4xOiB0ZW1wID0gbGVmdDwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjQ3Ij4yOiBsZWZ0ID0gcmlnaHQ8L3RleHQ+CiAgICA8dGV4dCB4PSIzMzAiIHk9IjI0NyI+MzogcmlnaHQgPSB0ZW1wPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",zC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dmFsaWQ8L3RleHQ+CiAgPHRleHQgeD0iNDAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnZhbGlkPC90ZXh0Pjx0ZXh0IHg9IjM2MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludmFsaWQ8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPmdyYWRlICZndDs9IDEgJmFtcDsmYW1wOyBncmFkZSAmbHQ7PSA2PC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIxNDIiIGZpbGw9IiNiOTFjMWMiPmdyYWRlICZsdDsgMSB8fCBncmFkZSAmZ3Q7IDY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",IC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Ib3cgdGhlIHdoaWxlIGxvb3AgcnVuczwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjQ0IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI2OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGNoZWNrIHRoZSBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgcnVuIHRoZSBpbnNpZGU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5iYWNrPC90ZXh0PgogIDx0ZXh0IHg9IjM4IiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPnRvIHRoZSB0b3A8L3RleHQ+CiAgPHRleHQgeD0iMzQ4IiB5PSIxMzQiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmZhbHNlPC90ZXh0PgogIDx0ZXh0IHg9IjI3NiIgeT0iMjA1IiB0ZXh0LWFuY2hvcj0iZW5kIj5jb250aW51ZSBiZWxvdyB0aGUgbG9vcDwvdGV4dD4KPC9zdmc+Cg==",kC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHJlLXRlc3QgKHdoaWxlKTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5wb3N0LXRlc3QgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBpbnNpZGU8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY29uZGl0aW9uPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5JZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIGF0IG9uY2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50aGUgaW5zaWRlIHJ1bnMgPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm5ldmVyPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgaW5zaWRlIGFsd2F5cyBydW5zPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj48dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+YXQgbGVhc3Qgb25jZTwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",SC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4ob25seSBvbmNlKTwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNzYiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSIxNyIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY2hlY2sgdGhlIGNvbmRpdGlvbjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjEzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIxNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoiBydW4gdGhlIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBzdGVwLCBlLmcuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+YmFjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50byDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZG9uZTwvdGV4dD4KPC9zdmc+Cg==",_C="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtYmVycyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5JbmRleDwvdGV4dD4KICA8dGV4dCB4PSI5MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjA8L3RleHQ+PHJlY3QgeD0iNjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iOTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj4yPC90ZXh0PgogIDx0ZXh0IHg9IjE1MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjE8L3RleHQ+PHJlY3QgeD0iMTIwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjQ8L3RleHQ+CiAgPHRleHQgeD0iMjEwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MjwvdGV4dD48cmVjdCB4PSIxODAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjEwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NjwvdGV4dD4KICA8dGV4dCB4PSIyNzAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4zPC90ZXh0PjxyZWN0IHg9IjI0MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNzAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj44PC90ZXh0PgogIDx0ZXh0IHg9IjMzMCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjQ8L3RleHQ+PHJlY3QgeD0iMzAwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMzMCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjEwPC90ZXh0PgogIDx0ZXh0IHg9IjIwIiB5PSI5MCIgZmlsbD0iIzZlNmU3MyIgZm9udC1zaXplPSIxMiI+VmFsdWU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+PGxpbmUgeDE9IjkwIiB5MT0iMTQwIiB4Mj0iOTAiIHkyPSIxMTIiLz48bGluZSB4MT0iMzMwIiB5MT0iMTQwIiB4Mj0iMzMwIiB5Mj0iMTEyIi8+PC9nPgogIDxnIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dGV4dCB4PSI5MCIgeT0iMTU2Ij5udW1iZXJzWzBdIGlzIDI8L3RleHQ+PHRleHQgeD0iMzMwIiB5PSIxNTYiPm51bWJlcnNbNF0gaXMgMTA8L3RleHQ+PC9nPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTgyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj41IHNsb3RzLCBjb3VudGluZyBzdGFydHMgYXQgMDogdGhlIGxhc3QgaW5kZXggaXMgNC48L3RleHQ+Cjwvc3ZnPgo=",TC=""+new URL("mvc-klick-BIA_bYzu.svg",import.meta.url).href,OC=""+new URL("ss-binaere-suche-D02W1TH_.svg",import.meta.url).href,AC=""+new URL("ss-bubblesort-CmKEoNfO.svg",import.meta.url).href,PC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Mb29raW5nIGZvciB0aGUgOS4gVGhlIGNhcmRzIGFyZSBtaXhlZCB1cC48L3RleHQ+CjxnPjxyZWN0IHg9IjE0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIzNC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij43PC90ZXh0Pjx0ZXh0IHg9IjM0LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjZGMyNjI2Ij7imaU8L3RleHQ+PC9nPgo8dGV4dCB4PSIzNC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMzQuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4xLjwvdGV4dD4KPGc+PHJlY3QgeD0iNjIiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjgyLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjM8L3RleHQ+PHRleHQgeD0iODIuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZoDwvdGV4dD48L2c+Cjx0ZXh0IHg9IjgyLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSI4Mi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjIuPC90ZXh0Pgo8Zz48cmVjdCB4PSIxMTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjEzMC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij4xMDwvdGV4dD48dGV4dCB4PSIxMzAuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpjwvdGV4dD48L2c+Cjx0ZXh0IHg9IjEzMC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTMwLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+My48L3RleHQ+CjxnPjxyZWN0IHg9IjE1OCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTc4LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjU8L3RleHQ+PHRleHQgeD0iMTc4LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaM8L3RleHQ+PC9nPgo8dGV4dCB4PSIxNzguMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjQuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyMDYiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMyIvPjx0ZXh0IHg9IjIyNi4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj45PC90ZXh0Pjx0ZXh0IHg9IjIyNi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iMjI2LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iIzE1ODAzZCI+4pyTPC90ZXh0Pgo8dGV4dCB4PSIyMjYuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj41LjwvdGV4dD4KPGc+PHJlY3QgeD0iMjU0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIyNTgiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjMwMiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzA2IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8Zz48cmVjdCB4PSIzNTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjM1NCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPHRleHQgeD0iMTQiIHk9IjE2OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+VHVybiB0aGVtIG92ZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0OjwvdGV4dD48dGV4dCB4PSIxNCIgeT0iMTg4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5BZnRlciA1IGNvbXBhcmlzb25zIHRoZSA5IGlzIGZvdW5kLjwvdGV4dD4KPC9zdmc+Cg==",jC=""+new URL("ss-vergleiche-UczNldcC.svg",import.meta.url).href,CC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPkNhbGwgYnkgdmFsdWU6IGEgY29weTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1iZXI8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZG91YmxlSXQ8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jb3B5PC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTUwIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj54IGJlY29tZXMgMTAsIGJ1dCBudW1iZXIgc3RheXMgNS48L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNjgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPkxpa2UgYSBwaG90b2NvcHk6IHdyaXRpbmcgb24gdGhlIGNvcHk8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPmRvZXMgbm90IGNoYW5nZSB0aGUgb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5DYWxsIGJ5IHJlZmVyZW5jZTogdGhlIHNhbWUgYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+cm93PC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5jbGVhcjwvdGV4dD4KPHRleHQgeD0iMjYwIiB5PSIzMDAiPnNlYXRzPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5UaGVyZSBpcyBvbmx5IG9uZSBhcnJheS4gV2hhdCBjbGVhciBjaGFuZ2VzIHRocm91Z2ggc2VhdHMsPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDM0IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj50aGUgbWFpbiBwcm9ncmFtIHNlZXMgdW5kZXIgcm93LjwvdGV4dD4KPC9zdmc+Cg==",BC=""+new URL("zk-zeichen-CgUEhNoK.svg",import.meta.url).href,DC=""+new URL("ike-nassi-D2w47gvX.jpg",import.meta.url).href,ZC=""+new URL("kino-saal-CYMOok4_.svg",import.meta.url).href,MC=""+new URL("kino-schleifen-DrTQV7dq.svg",import.meta.url).href,LC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlRhc3NlIGF1ZiBkZW4gVGlzY2ggc3RlbGxlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5adWNrZXIgZ2V3w7xuc2NodD88L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjE5NCI+WnVja2VyIGhpbmVpbmdlYmVuPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIyODUiPlRlZSBub2NoIHp1IGhlacOfPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjMyNy41IiB5PSIyODUiPjEgTWludXRlIHdhcnRlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5UZWUgdHJpbmtlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzk1Ij5FbmRlPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5qYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MiIgeT0iMTIyIiBmaWxsPSIjZDcwMDE1Ij5uZWluPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPmphPC90ZXh0PgogICAgPHRleHQgeD0iMTU2IiB5PSIzMjAiIGZpbGw9IiNkNzAwMTUiPm5laW48L3RleHQ+CiAgPC9nPgogIDwhLS0gTGVnZW5kZSAtLT4KICA8bGluZSB4MT0iMTAiIHkxPSI0MTgiIHgyPSIzOTAiIHkyPSI0MTgiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxnIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgPHJlY3QgeD0iNDAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiByeD0iOSIgZmlsbD0iI2QxZjJkOSIvPgogICAgPHJlY3QgeD0iMjIwIiB5PSI0MzAiIHdpZHRoPSIzNiIgaGVpZ2h0PSIxOCIgZmlsbD0iI2U1ZjBmZiIvPgogICAgPHBhdGggZD0iTTU4IDQ1OCBMNzYgNDY5IEw1OCA0ODAgTDQwIDQ2OSBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8cGF0aCBkPSJNMjI2IDQ2MCBMMjU2IDQ2MCBMMjUwIDQ3OCBMMjIwIDQ3OCBaIiBmaWxsPSIjZjJlNmZmIi8+CiAgPC9nPgogIDxnIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiMzYTNhM2MiPgogICAgPHRleHQgeD0iODYiIHk9IjQ0MyI+U3RhcnQgb2RlciBFbmRlPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NDMiPkFud2Vpc3VuZzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPlZlcnp3ZWlndW5nPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVpbi0gb2RlciBBdXNnYWJlPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",WC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V29oaW4gbGFuZGV0IGRhcyBFbGVtZW50PzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij5vYmVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnVudGVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjIyNCIgeT0iNjIiPuKGkiBrb21tdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGF2b3I8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIga29tbXQgPHRzcGFuIGZvbnQtd2VpZ2h0PSI2MDAiPmRhaGludGVyPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZXJzZXR6dDwvdHNwYW4+IGRlbiBQbGF0emhhbHRlcjwvdGV4dD4KPC9zdmc+Cg==",EC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWx0ZXIgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YWx0ZXI8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5XZXJ0PC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0ZW50eXA8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPsOcYmVyIGRlbiBOYW1lbiBrb21tc3QgZHUgYW4gZGVuIFdlcnQuPC90ZXh0Pgo8L3N2Zz4K",NC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cHVua3RlPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cHVua3RlICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCByZWNodHMgYXVzcmVjaG5lbjogMTAgKyA1ID0gMTU8L3RleHQ+CiAgPHBhdGggZD0iTTI1MCA4MiBDMjMwIDMwLCA5MCAzMCwgNjQgODQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICA8dGV4dCB4PSIxNjAiIHk9IjM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIj7ikaEgRXJnZWJuaXMgbGlua3Mgc3BlaWNoZXJuPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxNjQiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3Ii8+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnB1bmt0ZSB2b3JoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xMDwvdHNwYW4+ICAg4oaSICAgcHVua3RlIG5hY2hoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",FC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGlua3M8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+U2FmdDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aGlsZjwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bGVlcjwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cmVjaHRzPC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5XYXNzZXI8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iNzAiIHk9IjI0NyI+MTogaGlsZiA9IGxpbmtzPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNDciPjI6IGxpbmtzID0gcmVjaHRzPC90ZXh0PgogICAgPHRleHQgeD0iMzMwIiB5PSIyNDciPjM6IHJlY2h0cyA9IGhpbGY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",JC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+Z8O8bHRpZzwvdGV4dD4KICA8dGV4dCB4PSI0MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPnVuZ8O8bHRpZzwvdGV4dD48dGV4dCB4PSIzNjAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj51bmfDvGx0aWc8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGUgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGUgJmx0Oz0gNjwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RlICZsdDsgMSB8fCBub3RlICZndDsgNjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",RC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMTkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+CiAgPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIxOTAiIGZpbGw9IiNmZmZmZmYiLz4KICA8cmVjdCB4PSIyMCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmE8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmI8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIyMjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmEgJmFtcDsmYW1wOyBiPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNzAwIj5hIHx8IGI8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPiFhPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0NiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSI2MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjE0MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyNjAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIzNDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjM4MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjEwMCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzMDAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjExMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjE4MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTQyIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMjIwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8bGluZSB4MT0iMTgwIiB5MT0iMTQiIHgyPSIxODAiIHkyPSIxNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIzIi8+Cjwvc3ZnPgo=",GC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5BYmxhdWYgZGVyIFdoaWxlLVNjaGxlaWZlPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNDQiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSIyMCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjY5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaAgQmVkaW5ndW5nIHByw7xmZW48L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgSW5oYWx0IGF1c2bDvGhyZW48L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53aWVkZXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bmFjaCBvYmVuPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+d2VpdGVyIHVudGVyIGRlciBTY2hsZWlmZTwvdGV4dD4KPC9zdmc+Cg==",HC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+a29wZmdlc3RldWVydCAoV2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmZ1w59nZXN0ZXVlcnQgKERvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBCZWRpbmd1bmc8L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBJbmhhbHQ8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluaGFsdDwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgQmVkaW5ndW5nPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5Jc3QgZGllIEJlZGluZ3VuZyBnbGVpY2ggZmFsc2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5sw6R1ZnQgZGVyIEluaGFsdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+bmllPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5EZXIgSW5oYWx0IGzDpHVmdCBpbW1lcjwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm1pbmRlc3RlbnMgZWlubWFsPC90c3Bhbj4uPC90ZXh0Pgo8L3N2Zz4K",VC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4obnVyIGVpbm1hbCk8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIEJlZGluZ3VuZyBwcsO8ZmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGiIEluaGFsdCBhdXNmw7xocmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMjAwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjMTU4MDNkIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGjIFNjaHJpdHQsIHouIEIuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+enVyw7xjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj56dSDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZmVydGlnPC90ZXh0Pgo8L3N2Zz4K",QC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gemFobGVuID0gezIsIDQsIDYsIDgsIDEwfTwvdGV4dD4KICA8dGV4dCB4PSIyMCIgeT0iNTQiIGZpbGw9IiM2ZTZlNzMiIGZvbnQtc2l6ZT0iMTIiPkluZGV4PC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5XZXJ0PC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYSkiPjxsaW5lIHgxPSI5MCIgeTE9IjE0MCIgeDI9IjkwIiB5Mj0iMTEyIi8+PGxpbmUgeDE9IjMzMCIgeTE9IjE0MCIgeDI9IjMzMCIgeTI9IjExMiIvPjwvZz4KICA8ZyBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRleHQgeD0iOTAiIHk9IjE1NiI+emFobGVuWzBdIGlzdCAyPC90ZXh0Pjx0ZXh0IHg9IjMzMCIgeT0iMTU2Ij56YWhsZW5bNF0gaXN0IDEwPC90ZXh0PjwvZz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+NSBGw6RjaGVyLCBnZXrDpGhsdCB3aXJkIGFiIDA6IGRlciBsZXR6dGUgSW5kZXggaXN0IDQuPC90ZXh0Pgo8L3N2Zz4K",qC=""+new URL("mvc-klick-KmFKqxH-.svg",import.meta.url).href,UC=""+new URL("aufgabe-mehrwertsteuer-KUkerRBd.svg",import.meta.url).href,$C=""+new URL("kino-saal-BOvcmdzb.svg",import.meta.url).href,YC=""+new URL("kino-schleifen-Ci9yPnbo.svg",import.meta.url).href,XC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5JbsOtY2lvPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSI3NiI+UMO0ciB1bWEgY2jDoXZlbmEgbmEgbWVzYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5RdWVyIGHDp8O6Y2FyPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5KdW50YXIgYcOnw7pjYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+Q2jDoSBtdWl0byBxdWVudGU/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+RXNwZXJhciAxIG1pbnV0bzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5CZWJlciBvIGNow6E8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjM5NSI+RmltPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIyNDIiIHk9IjEyMiIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MCIgeT0iMjc0IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjMyMCIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5JbsOtY2lvIG91IGZpbTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI2NiIgeT0iNDQzIj5JbnN0cnXDp8OjbzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPkRlY2lzw6NvPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVudHJhZGEgb3Ugc2HDrWRhPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",KC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+T25kZSBmaWNhIG8gZWxlbWVudG8/PC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RiZWFmZSIvPgogIDxyZWN0IHg9IjIwIiB5PSI3NSIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc1IiB4Mj0iMjEwIiB5Mj0iNzUiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIi8+CiAgPHJlY3QgeD0iMjAiIHk9IjQwIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iNjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxZDRlZDgiPm1ldGFkZSBkZSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPm1ldGFkZSBkZSBiYWl4bzwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YW50ZXM8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGVwb2lzPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+c3Vic3RpdHVpLW88L3RzcGFuPjwvdGV4dD4KPC9zdmc+Cg==",eB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgaWRhZGUgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aWRhZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5WYWxvcjwvdGV4dD4KICA8dGV4dCB4PSIzMTYiIHk9IjExOSI+Tm9tZTwvdGV4dD4KICA8dGV4dCB4PSI4IiB5PSIxNTYiPlRpcG8gZGUgZGFkb3M8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPlBlbG8gbm9tZSBjaGVnYXMgYW8gdmFsb3IuPC90ZXh0Pgo8L3N2Zz4K",tB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9udG9zPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCBjYWxjdWxhciBhIGRpcmVpdGE6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIGd1YXJkYXIgbyByZXN1bHRhZG8gw6AgZXNxdWVyZGE8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zIGFudGVzOiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPiAgIOKGkiAgIHBvbnRvcyBkZXBvaXM6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",nB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMzAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMzAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZXNxdWVyZGE8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+c3VtbzwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YXV4PC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52YXppbzwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZGlyZWl0YTwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+w6FndWE8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iMjAwIiB5PSIyNTAiPjE6IGF1eCA9IGVzcXVlcmRhPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNjgiPjI6IGVzcXVlcmRhID0gZGlyZWl0YTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjg2Ij4zOiBkaXJlaXRhID0gYXV4PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",iB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzAwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iMTAwIiB5PSI1MCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyNCIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc0IiB4Mj0iMzgwIiB5Mj0iNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGxpbmUgeDE9IjUwIiB5MT0iNjgiIHgyPSI1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MDwvdGV4dD4KICA8bGluZSB4MT0iMTAwIiB5MT0iNjgiIHgyPSIxMDAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4xPC90ZXh0PgogIDxsaW5lIHgxPSIxNTAiIHkxPSI2OCIgeDI9IjE1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjI8L3RleHQ+CiAgPGxpbmUgeDE9IjIwMCIgeTE9IjY4IiB4Mj0iMjAwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MzwvdGV4dD4KICA8bGluZSB4MT0iMjUwIiB5MT0iNjgiIHgyPSIyNTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj40PC90ZXh0PgogIDxsaW5lIHgxPSIzMDAiIHkxPSI2OCIgeDI9IjMwMCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMwMCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjU8L3RleHQ+CiAgPGxpbmUgeDE9IjM1MCIgeTE9IjY4IiB4Mj0iMzUwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NjwvdGV4dD4KICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMwMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dsOhbGlkYTwvdGV4dD4KICA8dGV4dCB4PSI1MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludsOhbGlkYTwvdGV4dD48dGV4dCB4PSIzNTAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnbDoWxpZGE8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGEgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGEgJmx0Oz0gNTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RhICZsdDsgMSB8fCBub3RhICZndDsgNTwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",aB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Db21vIGZ1bmNpb25hIG8gY2ljbG8gd2hpbGU8L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSI0NCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0MCIgcng9IjIwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iNjkiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCB2ZXJpZmljYXIgYSBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTI4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE1MyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIGV4ZWN1dGFyIG8gaW50ZXJpb3I8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52b2x0YXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+cGFyYSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+Y29udGludWFyIHBvciBiYWl4byBkbyBjaWNsbzwvdGV4dD4KPC9zdmc+Cg==",sB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHLDqS10ZXN0ZSAod2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnDDs3MtdGVzdGUgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjM1IiB5PSIxMjQiIHdpZHRoPSIxMzAiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgaW50ZXJpb3I8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGludGVyaW9yPC90ZXh0PgogIDxyZWN0IHg9IjIzNSIgeT0iMTI0IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjM2IiByeD0iMTgiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBjb25kacOnw6NvPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5TZSBhIGNvbmRpw6fDo28gZm9yIGxvZ28gZmFsc2EsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5vIGludGVyaW9yIDx0c3BhbiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj5udW5jYTwvdHNwYW4+IMOpIGV4ZWN1dGFkby48L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSIxOTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPk8gaW50ZXJpb3Igw6kgc2VtcHJlIGV4ZWN1dGFkbzwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPnBlbG8gbWVub3MgdW1hIHZlejwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",rB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluw61jaW8gPHRzcGFuIGZpbGw9IiM2ZTZlNzMiPihzw7MgdW1hIHZleik8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIHZlcmlmaWNhciBhIGNvbmRpw6fDo288L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMzgiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaIgZXhlY3V0YXIgbyBpbnRlcmlvcjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBwYXNzbywgcC4gZXguIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+dm9sdGFyPC90ZXh0PgogIDx0ZXh0IHg9IjQ4IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPmFvIOKRoTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9Ijg0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIzMzYiIHk9Ijk4Ij5maW08L3RleHQ+Cjwvc3ZnPgo=",oB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtZXJvcyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj7DjW5kaWNlPC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5WYWxvcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj48bGluZSB4MT0iOTAiIHkxPSIxNDAiIHgyPSI5MCIgeTI9IjExMiIvPjxsaW5lIHgxPSIzMzAiIHkxPSIxNDAiIHgyPSIzMzAiIHkyPSIxMTIiLz48L2c+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjx0ZXh0IHg9IjkwIiB5PSIxNTYiPm51bWVyb3NbMF0gw6kgMjwvdGV4dD48dGV4dCB4PSIzMzAiIHk9IjE1NiI+bnVtZXJvc1s0XSDDqSAxMDwvdGV4dD48L2c+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPjUgcG9zacOnw7VlcywgY29udGEtc2UgYSBwYXJ0aXIgZGUgMDogbyDDumx0aW1vIMOtbmRpY2Ugw6kgNC48L3RleHQ+Cjwvc3ZnPgo=",lB=""+new URL("mvc-klick-DKonBpbs.svg",import.meta.url).href,uB=""+new URL("schiffe-versenken-iEBDHIxD.svg",import.meta.url).href,mB=""+new URL("ss-binaere-suche-DVVS2SNc.svg",import.meta.url).href,cB=""+new URL("ss-bubblesort-AFDcFDah.svg",import.meta.url).href,dB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Qcm9jdXJhLXNlIG8gOS4gQXMgY2FydGFzIGVzdMOjbyBiYXJhbGhhZGFzLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5WaXJhciBkYSBlc3F1ZXJkYSBwYXJhIGEgZGlyZWl0YTo8L3RleHQ+PHRleHQgeD0iMTQiIHk9IjE4OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+QXDDs3MgNSBjb21wYXJhw6fDtWVzLCBvIDkgw6kgZW5jb250cmFkby48L3RleHQ+Cjwvc3ZnPgo=",hB=""+new URL("ss-vergleiche-DWgkIvLr.svg",import.meta.url).href,gB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPlBhc3NhZ2VtIHBvciB2YWxvcjogdW1hIGPDs3BpYTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1lcm88L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZHVwbGljYXI8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggcGFzc2EgYSAxMCwgbWFzIG51bWVybyBmaWNhIDUuPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTY4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5Db21vIHVtYSBmb3RvY8OzcGlhOiBlc2NyZXZlciBuYSBjw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPm7Do28gYWx0ZXJhIG8gb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5QYXNzYWdlbSBwb3IgcmVmZXLDqm5jaWE6IG8gbWVzbW8gYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+ZmlsYTwvdGV4dD4KPGNpcmNsZSBjeD0iMTUwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjMWQ0ZWQ4Ii8+CjxyZWN0IHg9IjI1MCIgeT0iMjUyIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjYyIiByeD0iOCIgZmlsbD0iI2ZmZjdlZCIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyNjAiIHk9IjI3MiIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+bGltcGFyPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9IjMwMCI+bHVnYXJlczwvdGV4dD4KPGNpcmNsZSBjeD0iMzkwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjYjQ1MzA5Ii8+CjxwYXRoIGQ9Ik0xNTAgMzAwIEwxNTAgMzQwIEwxNDAgMzUyIiBmaWxsPSJub25lIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI2IpIi8+CjxwYXRoIGQ9Ik0zOTAgMzAwIEwzOTAgMzQwIEwzMjIgMzU0IiBmaWxsPSJub25lIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI28pIi8+CjxyZWN0IHg9IjkwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjE1MCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyMTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMjcwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9IjEyMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTgwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIyNDAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjMwMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQxNiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+U8OzIGjDoSB1bSBhcnJheS4gTyBxdWUgbGltcGFyIGFsdGVyYSBhdHJhdsOpcyBkZSBsdWdhcmVzLDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+byBwcm9ncmFtYSBwcmluY2lwYWwgdsOqIGVtIGZpbGEuPC90ZXh0Pgo8L3N2Zz4K",pB=""+new URL("zk-zeichen-8efNmpGx.svg",import.meta.url).href,fB=""+new URL("schiffe-versenken-CXt1SF0S.svg",import.meta.url).href,xB=""+new URL("ss-binaere-suche-CPsLGldq.svg",import.meta.url).href,bB=""+new URL("ss-bubblesort-Dic2ZfaT.svg",import.meta.url).href,yB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5HZXN1Y2h0OiBkaWUgOS4gRGllIEthcnRlbiBzaW5kIGdlbWlzY2h0LjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5Wb24gbGlua3MgbmFjaCByZWNodHMgdW1kcmVoZW46PC90ZXh0Pjx0ZXh0IHg9IjE0IiB5PSIxODgiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiM2ZTZlNzMiPk5hY2ggNSBWZXJnbGVpY2hlbiBpc3QgZGllIDkgZ2VmdW5kZW4uPC90ZXh0Pgo8L3N2Zz4K",vB=""+new URL("ss-vergleiche-DRqzU2TZ.svg",import.meta.url).href,wB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPldlcnTDvGJlcmdhYmU6IGVpbmUgS29waWU8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNlZmY2ZmYiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjAiIHk9IjU4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWQ0ZWQ4Ij5IYXVwdHByb2dyYW1tPC90ZXh0Pgo8dGV4dCB4PSIyMCIgeT0iOTgiPnphaGw8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+dmVyZG9wcGxlPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9Ijk4Ij54PC90ZXh0Pgo8cmVjdCB4PSIyODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMzIwIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRzcGFuIGZpbGw9IiM2ZTZlNzMiIHRleHQtZGVjb3JhdGlvbj0ibGluZS10aHJvdWdoIj41PC90c3Bhbj4gPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj48L3RleHQ+CjxsaW5lIHgxPSIxMjgiIHkxPSI5MyIgeDI9IjI0OCIgeTI9IjkzIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiIG1hcmtlci1lbmQ9InVybCgjaykiLz4KPHRleHQgeD0iMjEwIiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+S29waWU8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggd2lyZCAxMCwgYWJlciB6YWhsIGJsZWlidCA1LjwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE2OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+V2llIGJlaSBlaW5lciBGb3Rva29waWU6IFdlciBhdWYgZGVyIEtvcGllIHNjaHJlaWJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE4NiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+w6RuZGVydCBkYXMgT3JpZ2luYWwgbmljaHQuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5SZWZlcmVuesO8YmVyZ2FiZTogZGFzc2VsYmUgQXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPkhhdXB0cHJvZ3JhbW08L3RleHQ+Cjx0ZXh0IHg9IjIwIiB5PSIzMDAiPnJlaWhlPC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5sZWVyZW48L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iMzAwIj5wbGFldHplPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5FcyBnaWJ0IG51ciBlaW4gQXJyYXkuIFdhcyBsZWVyZW4gw7xiZXIgcGxhZXR6ZSDDpG5kZXJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+c2llaHQgZGFzIEhhdXB0cHJvZ3JhbW0gdW50ZXIgcmVpaGUuPC90ZXh0Pgo8L3N2Zz4K",zB=""+new URL("zk-zeichen-vYvc3iJg.svg",import.meta.url).href;function IB(i){const e=[];for(const t of i.replace(/\r\n/g,` +`,mC=""+new URL("aufgabe-mehrwertsteuer-C-TFTrWz.svg",import.meta.url).href,cC=""+new URL("ben-shneiderman-Cev5hrqS.jpg",import.meta.url).href,dC=""+new URL("caesar-ascii-Bix93F5i.svg",import.meta.url).href,hC=""+new URL("caesar-scheibe-CMRPZI6Y.svg",import.meta.url).href,gC=""+new URL("caesar-verschiebung-DIR-lDbs.svg",import.meta.url).href,pC=""+new URL("aufgabe-mehrwertsteuer-CnrZ00ny.svg",import.meta.url).href,fC=""+new URL("kino-saal-C8zaJk4X.svg",import.meta.url).href,xC=""+new URL("kino-schleifen-D7sfo9iK.svg",import.meta.url).href,bC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlB1dCBhIGN1cCBvbiB0aGUgdGFibGU8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjEzMyI+U3VnYXIgd2FudGVkPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5BZGQgc3VnYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+VGVhIHN0aWxsIHRvbyBob3Q/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+V2FpdCAxIG1pbnV0ZTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5EcmluayB0aGUgdGVhPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIzOTUiPkVuZDwvdGV4dD4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZm9udC13ZWlnaHQ9IjYwMCI+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjE2OCIgZmlsbD0iIzI0OGEzZCI+eWVzPC90ZXh0PgogICAgPHRleHQgeD0iMjQyIiB5PSIxMjIiIGZpbGw9IiNkNzAwMTUiPm5vPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPnllczwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMzIwIiBmaWxsPSIjZDcwMDE1Ij5ubzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5TdGFydCBvciBlbmQ8L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ0MyI+U3RhdGVtZW50PC90ZXh0PgogICAgPHRleHQgeD0iODYiIHk9IjQ3MyI+RGVjaXNpb248L3RleHQ+CiAgICA8dGV4dCB4PSIyNjYiIHk9IjQ3MyI+SW5wdXQgb3Igb3V0cHV0PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",yC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V2hlcmUgZG9lcyB0aGUgZWxlbWVudCBsYW5kPzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij50b3AgaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIxMTUiIHk9Ijk3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj5ib3R0b20gaGFsZjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+aW4gZnJvbnQ8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZ29lcyA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YWZ0ZXI8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTMyIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjQwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iMTU3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2Ij7DuDwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjE1NyI+4oaSIDx0c3BhbiBmb250LXdlaWdodD0iNjAwIj5yZXBsYWNlczwvdHNwYW4+IGl0PC90ZXh0Pgo8L3N2Zz4K",vC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWdlID0gMTQ8L3RleHQ+CiAgPHBhdGggZD0iTTEzMCA3MCBMMTcwIDUwIEwzMDAgNTAgTDI2MCA3MCBaIiBmaWxsPSIjYzk4YTNjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE4MCIgeT0iMzQiIHdpZHRoPSI0NCIgaGVpZ2h0PSI1MCIgcng9IjMiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KICA8dGV4dCB4PSIyMDIiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjIwIiBmb250LXdlaWdodD0iNzAwIj4xNDwvdGV4dD4KICA8cmVjdCB4PSIxMzAiIHk9IjcwIiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjEwMCIgZmlsbD0iI2U5Yjg3MiIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cGF0aCBkPSJNMjYwIDcwIEwzMDAgNTAgTDMwMCAxNTAgTDI2MCAxNzAgWiIgZmlsbD0iI2Q0OWE0YyIgc3Ryb2tlPSIjOGE1YTFmIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cmVjdCB4PSIxNTAiIHk9IjEwMCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjOGE1YTFmIi8+CiAgPHRleHQgeD0iMTk1IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmFnZTwvdGV4dD4KICA8cmVjdCB4PSIxMzgiIHk9IjE0MiIgd2lkdGg9IjM0IiBoZWlnaHQ9IjIwIiByeD0iMTAiIGZpbGw9IiMwMDdhZmYiLz4KICA8dGV4dCB4PSIxNTUiIHk9IjE1NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMiIgZmlsbD0iI2ZmZmZmZiIgZm9udC13ZWlnaHQ9IjYwMCI+aW50PC90ZXh0PgogIDxnIHN0cm9rZT0iIzZlNmU3MyI+CiAgICA8bGluZSB4MT0iMzEwIiB5MT0iNDgiIHgyPSIyMjYiIHkyPSI1MiIvPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjExNSIgeDI9IjI0MiIgeTI9IjExNSIvPgogICAgPGxpbmUgeDE9IjgwIiB5MT0iMTUyIiB4Mj0iMTM0IiB5Mj0iMTUyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjMxNiIgeT0iNTIiPlZhbHVlPC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0YSB0eXBlPC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMTk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgbmFtZSBnZXRzIHlvdSB0byB0aGUgdmFsdWUuPC90ZXh0Pgo8L3N2Zz4K",wC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9pbnRzPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCB3b3JrIG91dCB0aGUgcmlnaHQ6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIHN0b3JlIHRoZSByZXN1bHQgb24gdGhlIGxlZnQ8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9pbnRzIGJlZm9yZTogPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj4gICDihpIgICBwb2ludHMgYWZ0ZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",zC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGVmdDwvdGV4dD4KICA8dGV4dCB4PSI3NSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5qdWljZTwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+dGVtcDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+ZW1wdHk8L3RleHQ+CiAgPHRleHQgeD0iMzI1IiB5PSIyMDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnJpZ2h0PC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53YXRlcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxwYXRoIGQ9Ik04OCAxMDQgQzExMCA3MCwgMTYwIDcwLCAxODYgMTA0Ii8+CiAgICA8cGF0aCBkPSJNMzE4IDEwNCBDMjcwIDE1LCAxMzAgMTUsIDgyIDEwNCIvPgogICAgPHBhdGggZD0iTTIxNCAxMDQgQzI0MCA3MCwgMjkwIDcwLCAzMTIgMTA0Ii8+CiAgPC9nPgogIDxnIGZvbnQtd2VpZ2h0PSI3MDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPGNpcmNsZSBjeD0iMTM3IiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIxMzciIHk9Ijg1Ij4xPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMzgiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyMDAiIHk9IjQzIj4yPC90ZXh0PgogICAgPGNpcmNsZSBjeD0iMjYzIiBjeT0iODAiIHI9IjExIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz48dGV4dCB4PSIyNjMiIHk9Ijg1Ij4zPC90ZXh0PgogIDwvZz4KICA8ZyB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMiI+CiAgICA8dGV4dCB4PSI3MCIgeT0iMjQ3Ij4xOiB0ZW1wID0gbGVmdDwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjQ3Ij4yOiBsZWZ0ID0gcmlnaHQ8L3RleHQ+CiAgICA8dGV4dCB4PSIzMzAiIHk9IjI0NyI+MzogcmlnaHQgPSB0ZW1wPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",IC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dmFsaWQ8L3RleHQ+CiAgPHRleHQgeD0iNDAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnZhbGlkPC90ZXh0Pjx0ZXh0IHg9IjM2MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludmFsaWQ8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPmdyYWRlICZndDs9IDEgJmFtcDsmYW1wOyBncmFkZSAmbHQ7PSA2PC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIxNDIiIGZpbGw9IiNiOTFjMWMiPmdyYWRlICZsdDsgMSB8fCBncmFkZSAmZ3Q7IDY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",kC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Ib3cgdGhlIHdoaWxlIGxvb3AgcnVuczwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjQ0IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iMjAiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI2OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGNoZWNrIHRoZSBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgcnVuIHRoZSBpbnNpZGU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5iYWNrPC90ZXh0PgogIDx0ZXh0IHg9IjM4IiB5PSIxMjYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPnRvIHRoZSB0b3A8L3RleHQ+CiAgPHRleHQgeD0iMzQ4IiB5PSIxMzQiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmZhbHNlPC90ZXh0PgogIDx0ZXh0IHg9IjI3NiIgeT0iMjA1IiB0ZXh0LWFuY2hvcj0iZW5kIj5jb250aW51ZSBiZWxvdyB0aGUgbG9vcDwvdGV4dD4KPC9zdmc+Cg==",SC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHJlLXRlc3QgKHdoaWxlKTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNjAwIj5wb3N0LXRlc3QgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kaXRpb248L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBpbnNpZGU8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY29uZGl0aW9uPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5JZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIGF0IG9uY2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50aGUgaW5zaWRlIHJ1bnMgPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm5ldmVyPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5UaGUgaW5zaWRlIGFsd2F5cyBydW5zPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj48dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+YXQgbGVhc3Qgb25jZTwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",_C="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4ob25seSBvbmNlKTwvdHNwYW4+PC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNzYiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSIxNyIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgY2hlY2sgdGhlIGNvbmRpdGlvbjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjEzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIxNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoiBydW4gdGhlIGluc2lkZTwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBzdGVwLCBlLmcuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+YmFjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj50byDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZG9uZTwvdGV4dD4KPC9zdmc+Cg==",TC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtYmVycyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5JbmRleDwvdGV4dD4KICA8dGV4dCB4PSI5MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjA8L3RleHQ+PHJlY3QgeD0iNjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iOTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj4yPC90ZXh0PgogIDx0ZXh0IHg9IjE1MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjE8L3RleHQ+PHJlY3QgeD0iMTIwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjQ8L3RleHQ+CiAgPHRleHQgeD0iMjEwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MjwvdGV4dD48cmVjdCB4PSIxODAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjEwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NjwvdGV4dD4KICA8dGV4dCB4PSIyNzAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4zPC90ZXh0PjxyZWN0IHg9IjI0MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNzAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj44PC90ZXh0PgogIDx0ZXh0IHg9IjMzMCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjQ8L3RleHQ+PHJlY3QgeD0iMzAwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMzMCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjEwPC90ZXh0PgogIDx0ZXh0IHg9IjIwIiB5PSI5MCIgZmlsbD0iIzZlNmU3MyIgZm9udC1zaXplPSIxMiI+VmFsdWU8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDA3YWZmIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+PGxpbmUgeDE9IjkwIiB5MT0iMTQwIiB4Mj0iOTAiIHkyPSIxMTIiLz48bGluZSB4MT0iMzMwIiB5MT0iMTQwIiB4Mj0iMzMwIiB5Mj0iMTEyIi8+PC9nPgogIDxnIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dGV4dCB4PSI5MCIgeT0iMTU2Ij5udW1iZXJzWzBdIGlzIDI8L3RleHQ+PHRleHQgeD0iMzMwIiB5PSIxNTYiPm51bWJlcnNbNF0gaXMgMTA8L3RleHQ+PC9nPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTgyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj41IHNsb3RzLCBjb3VudGluZyBzdGFydHMgYXQgMDogdGhlIGxhc3QgaW5kZXggaXMgNC48L3RleHQ+Cjwvc3ZnPgo=",OC=""+new URL("mvc-klick-BIA_bYzu.svg",import.meta.url).href,AC=""+new URL("ss-binaere-suche-D02W1TH_.svg",import.meta.url).href,PC=""+new URL("ss-bubblesort-CmKEoNfO.svg",import.meta.url).href,jC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Mb29raW5nIGZvciB0aGUgOS4gVGhlIGNhcmRzIGFyZSBtaXhlZCB1cC48L3RleHQ+CjxnPjxyZWN0IHg9IjE0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIzNC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij43PC90ZXh0Pjx0ZXh0IHg9IjM0LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjZGMyNjI2Ij7imaU8L3RleHQ+PC9nPgo8dGV4dCB4PSIzNC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMzQuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4xLjwvdGV4dD4KPGc+PHJlY3QgeD0iNjIiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjgyLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjM8L3RleHQ+PHRleHQgeD0iODIuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZoDwvdGV4dD48L2c+Cjx0ZXh0IHg9IjgyLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSI4Mi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjIuPC90ZXh0Pgo8Zz48cmVjdCB4PSIxMTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjEzMC4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjZGMyNjI2Ij4xMDwvdGV4dD48dGV4dCB4PSIxMzAuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpjwvdGV4dD48L2c+Cjx0ZXh0IHg9IjEzMC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTMwLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+My48L3RleHQ+CjxnPjxyZWN0IHg9IjE1OCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTc4LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjU8L3RleHQ+PHRleHQgeD0iMTc4LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaM8L3RleHQ+PC9nPgo8dGV4dCB4PSIxNzguMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjQuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyMDYiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiMxNTgwM2QiIHN0cm9rZS13aWR0aD0iMyIvPjx0ZXh0IHg9IjIyNi4wIiB5PSI3NS4yIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj45PC90ZXh0Pjx0ZXh0IHg9IjIyNi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iMjI2LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iIzE1ODAzZCI+4pyTPC90ZXh0Pgo8dGV4dCB4PSIyMjYuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj41LjwvdGV4dD4KPGc+PHJlY3QgeD0iMjU0IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIyNTgiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjMwMiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzA2IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8Zz48cmVjdCB4PSIzNTAiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjM1NCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPHRleHQgeD0iMTQiIHk9IjE2OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+VHVybiB0aGVtIG92ZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0OjwvdGV4dD48dGV4dCB4PSIxNCIgeT0iMTg4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5BZnRlciA1IGNvbXBhcmlzb25zIHRoZSA5IGlzIGZvdW5kLjwvdGV4dD4KPC9zdmc+Cg==",CC=""+new URL("ss-vergleiche-UczNldcC.svg",import.meta.url).href,BC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPkNhbGwgYnkgdmFsdWU6IGEgY29weTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1iZXI8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZG91YmxlSXQ8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jb3B5PC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTUwIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj54IGJlY29tZXMgMTAsIGJ1dCBudW1iZXIgc3RheXMgNS48L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNjgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPkxpa2UgYSBwaG90b2NvcHk6IHdyaXRpbmcgb24gdGhlIGNvcHk8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPmRvZXMgbm90IGNoYW5nZSB0aGUgb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5DYWxsIGJ5IHJlZmVyZW5jZTogdGhlIHNhbWUgYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPk1haW4gcHJvZ3JhbTwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+cm93PC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5jbGVhcjwvdGV4dD4KPHRleHQgeD0iMjYwIiB5PSIzMDAiPnNlYXRzPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5UaGVyZSBpcyBvbmx5IG9uZSBhcnJheS4gV2hhdCBjbGVhciBjaGFuZ2VzIHRocm91Z2ggc2VhdHMsPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDM0IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj50aGUgbWFpbiBwcm9ncmFtIHNlZXMgdW5kZXIgcm93LjwvdGV4dD4KPC9zdmc+Cg==",DC=""+new URL("zk-zeichen-CgUEhNoK.svg",import.meta.url).href,ZC=""+new URL("ike-nassi-D2w47gvX.jpg",import.meta.url).href,MC=""+new URL("kino-saal-CYMOok4_.svg",import.meta.url).href,LC=""+new URL("kino-schleifen-DrTQV7dq.svg",import.meta.url).href,WC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5TdGFydDwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iNzYiPlRhc3NlIGF1ZiBkZW4gVGlzY2ggc3RlbGxlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5adWNrZXIgZ2V3w7xuc2NodD88L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjE5NCI+WnVja2VyIGhpbmVpbmdlYmVuPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSIyODUiPlRlZSBub2NoIHp1IGhlacOfPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjMyNy41IiB5PSIyODUiPjEgTWludXRlIHdhcnRlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5UZWUgdHJpbmtlbjwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzk1Ij5FbmRlPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5qYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MiIgeT0iMTIyIiBmaWxsPSIjZDcwMDE1Ij5uZWluPC90ZXh0PgogICAgPHRleHQgeD0iMjQwIiB5PSIyNzQiIGZpbGw9IiMyNDhhM2QiPmphPC90ZXh0PgogICAgPHRleHQgeD0iMTU2IiB5PSIzMjAiIGZpbGw9IiNkNzAwMTUiPm5laW48L3RleHQ+CiAgPC9nPgogIDwhLS0gTGVnZW5kZSAtLT4KICA8bGluZSB4MT0iMTAiIHkxPSI0MTgiIHgyPSIzOTAiIHkyPSI0MTgiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxnIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiPgogICAgPHJlY3QgeD0iNDAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiByeD0iOSIgZmlsbD0iI2QxZjJkOSIvPgogICAgPHJlY3QgeD0iMjIwIiB5PSI0MzAiIHdpZHRoPSIzNiIgaGVpZ2h0PSIxOCIgZmlsbD0iI2U1ZjBmZiIvPgogICAgPHBhdGggZD0iTTU4IDQ1OCBMNzYgNDY5IEw1OCA0ODAgTDQwIDQ2OSBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8cGF0aCBkPSJNMjI2IDQ2MCBMMjU2IDQ2MCBMMjUwIDQ3OCBMMjIwIDQ3OCBaIiBmaWxsPSIjZjJlNmZmIi8+CiAgPC9nPgogIDxnIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiMzYTNhM2MiPgogICAgPHRleHQgeD0iODYiIHk9IjQ0MyI+U3RhcnQgb2RlciBFbmRlPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NDMiPkFud2Vpc3VuZzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPlZlcnp3ZWlndW5nPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVpbi0gb2RlciBBdXNnYWJlPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",EC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+V29oaW4gbGFuZGV0IGRhcyBFbGVtZW50PzwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iNDAiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkYmVhZmUiLz4KICA8cmVjdCB4PSIyMCIgeT0iNzUiIHdpZHRoPSIxOTAiIGhlaWdodD0iMzUiIGZpbGw9IiNkY2ZjZTciLz4KICA8bGluZSB4MT0iMjAiIHkxPSI3NSIgeDI9IjIxMCIgeTI9Ijc1IiBzdHJva2U9IiM2ZTZlNzMiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIvPgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI3MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjYyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMWQ0ZWQ4Ij5vYmVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnVudGVyZSBIw6RsZnRlPC90ZXh0PgogIDx0ZXh0IHg9IjIyNCIgeT0iNjIiPuKGkiBrb21tdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGF2b3I8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIga29tbXQgPHRzcGFuIGZvbnQtd2VpZ2h0PSI2MDAiPmRhaGludGVyPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZXJzZXR6dDwvdHNwYW4+IGRlbiBQbGF0emhhbHRlcjwvdGV4dD4KPC9zdmc+Cg==",NC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgYWx0ZXIgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YWx0ZXI8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5XZXJ0PC90ZXh0PgogIDx0ZXh0IHg9IjMxNiIgeT0iMTE5Ij5OYW1lPC90ZXh0PgogIDx0ZXh0IHg9IjgiIHk9IjE1NiI+RGF0ZW50eXA8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPsOcYmVyIGRlbiBOYW1lbiBrb21tc3QgZHUgYW4gZGVuIFdlcnQuPC90ZXh0Pgo8L3N2Zz4K",FC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cHVua3RlPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cHVua3RlICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCByZWNodHMgYXVzcmVjaG5lbjogMTAgKyA1ID0gMTU8L3RleHQ+CiAgPHBhdGggZD0iTTI1MCA4MiBDMjMwIDMwLCA5MCAzMCwgNjQgODQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIyLjUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICA8dGV4dCB4PSIxNjAiIHk9IjM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIj7ikaEgRXJnZWJuaXMgbGlua3Mgc3BlaWNoZXJuPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxNjQiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjYiIHJ4PSI2IiBmaWxsPSIjZjJmMmY3Ii8+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPnB1bmt0ZSB2b3JoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xMDwvdHNwYW4+ICAg4oaSICAgcHVua3RlIG5hY2hoZXI6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",JC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjYwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjYwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+bGlua3M8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+U2FmdDwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aGlsZjwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bGVlcjwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cmVjaHRzPC90ZXh0PgogIDx0ZXh0IHg9IjMyNSIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5XYXNzZXI8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iNzAiIHk9IjI0NyI+MTogaGlsZiA9IGxpbmtzPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNDciPjI6IGxpbmtzID0gcmVjaHRzPC90ZXh0PgogICAgPHRleHQgeD0iMzMwIiB5PSIyNDciPjM6IHJlY2h0cyA9IGhpbGY8L3RleHQ+CiAgPC9nPgo8L3N2Zz4K",RC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzEwIiB5PSI1MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iOTAiIHk9IjUwIiB3aWR0aD0iMjIwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZGNmY2U3Ii8+CiAgPGxpbmUgeDE9IjIwIiB5MT0iNzQiIHgyPSIzODAiIHkyPSI3NCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8bGluZSB4MT0iNDYiIHkxPSI2OCIgeDI9IjQ2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iNDYiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4wPC90ZXh0PgogIDxsaW5lIHgxPSI5MCIgeTE9IjY4IiB4Mj0iOTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjE8L3RleHQ+CiAgPGxpbmUgeDE9IjEzNCIgeTE9IjY4IiB4Mj0iMTM0IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTM0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MjwvdGV4dD4KICA8bGluZSB4MT0iMTc4IiB5MT0iNjgiIHgyPSIxNzgiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxNzgiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4zPC90ZXh0PgogIDxsaW5lIHgxPSIyMjIiIHkxPSI2OCIgeDI9IjIyMiIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjIyMiIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjQ8L3RleHQ+CiAgPGxpbmUgeDE9IjI2NiIgeTE9IjY4IiB4Mj0iMjY2IiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjY2IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NTwvdGV4dD4KICA8bGluZSB4MT0iMzEwIiB5MT0iNjgiIHgyPSIzMTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIzMTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj42PC90ZXh0PgogIDxsaW5lIHgxPSIzNTQiIHkxPSI2OCIgeDI9IjM1NCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjM1NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjc8L3RleHQ+CiAgPGNpcmNsZSBjeD0iOTAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMxMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+Z8O8bHRpZzwvdGV4dD4KICA8dGV4dCB4PSI0MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPnVuZ8O8bHRpZzwvdGV4dD48dGV4dCB4PSIzNjAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj51bmfDvGx0aWc8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGUgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGUgJmx0Oz0gNjwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RlICZsdDsgMSB8fCBub3RlICZndDsgNjwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",GC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDAgMTkwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+CiAgPHJlY3Qgd2lkdGg9IjQ0MCIgaGVpZ2h0PSIxOTAiIGZpbGw9IiNmZmZmZmYiLz4KICA8cmVjdCB4PSIyMCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmE8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmI8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIyMjAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPmEgJmFtcDsmYW1wOyBiPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTQiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjM1IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXdlaWdodD0iNzAwIj5hIHx8IGI8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iMzUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI3MDAiPiFhPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0NiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSI2MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjE0MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyNjAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIzNDAiIHk9IjQ2IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjM4MC4wIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjEwMCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzMDAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSI3OCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmVlMmUyIiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIzODAuMCIgeT0iOTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iNjAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIj5mYWxzZTwvdGV4dD4KICA8cmVjdCB4PSIxMDAiIHk9IjExMCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZGNmY2U3IiBzdHJva2U9IiM4ZThlOTMiLz48dGV4dCB4PSIxNDAuMCIgeT0iMTMxIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMTU4MDNkIj50cnVlPC90ZXh0PgogIDxyZWN0IHg9IjE4MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjIyMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiPmZhbHNlPC90ZXh0PgogIDxyZWN0IHg9IjI2MCIgeT0iMTEwIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjMwMC4wIiB5PSIxMzEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPnRydWU8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxMTAiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjEzMSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8cmVjdCB4PSIyMCIgeT0iMTQyIiB3aWR0aD0iODAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZWUyZTIiIHN0cm9rZT0iIzhlOGU5MyIvPjx0ZXh0IHg9IjYwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTAwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMTQwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMTgwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMjIwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMjYwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZlZTJlMiIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzAwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iI2I5MWMxYyI+ZmFsc2U8L3RleHQ+CiAgPHJlY3QgeD0iMzQwIiB5PSIxNDIiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjOGU4ZTkzIi8+PHRleHQgeD0iMzgwLjAiIHk9IjE2MyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCI+dHJ1ZTwvdGV4dD4KICA8bGluZSB4MT0iMTgwIiB5MT0iMTQiIHgyPSIxODAiIHkyPSIxNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIzIi8+Cjwvc3ZnPgo=",HC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5BYmxhdWYgZGVyIFdoaWxlLVNjaGxlaWZlPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iNDQiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSIyMCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjY5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaAgQmVkaW5ndW5nIHByw7xmZW48L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMjgiIHdpZHRoPSIxNjAiIGhlaWdodD0iNDAiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTUzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgSW5oYWx0IGF1c2bDvGhyZW48L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj53aWVkZXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+bmFjaCBvYmVuPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+d2VpdGVyIHVudGVyIGRlciBTY2hsZWlmZTwvdGV4dD4KPC9zdmc+Cg==",VC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+a29wZmdlc3RldWVydCAoV2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPmZ1w59nZXN0ZXVlcnQgKERvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBCZWRpbmd1bmc8L3RleHQ+CiAgPHJlY3QgeD0iMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBJbmhhbHQ8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluaGFsdDwvdGV4dD4KICA8cmVjdCB4PSIyMzUiIHk9IjEyNCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjMwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgQmVkaW5ndW5nPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5Jc3QgZGllIEJlZGluZ3VuZyBnbGVpY2ggZmFsc2UsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5sw6R1ZnQgZGVyIEluaGFsdCA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+bmllPC90c3Bhbj4uPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5EZXIgSW5oYWx0IGzDpHVmdCBpbW1lcjwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPm1pbmRlc3RlbnMgZWlubWFsPC90c3Bhbj4uPC90ZXh0Pgo8L3N2Zz4K",QC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIFN0YXJ0IDx0c3BhbiBmaWxsPSIjNmU2ZTczIj4obnVyIGVpbm1hbCk8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIEJlZGluZ3VuZyBwcsO8ZmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGiIEluaGFsdCBhdXNmw7xocmVuPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMjAwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0iI2RjZmNlNyIgc3Ryb2tlPSIjMTU4MDNkIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGjIFNjaHJpdHQsIHouIEIuIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+enVyw7xjazwvdGV4dD4KICA8dGV4dCB4PSI0OCIgeT0iMTc2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj56dSDikaE8L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSI4NCIgZmlsbD0iI2I5MWMxYyIgZm9udC13ZWlnaHQ9IjYwMCI+ZmFsc2U8L3RleHQ+CiAgPHRleHQgeD0iMzM2IiB5PSI5OCI+ZmVydGlnPC90ZXh0Pgo8L3N2Zz4K",qC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gemFobGVuID0gezIsIDQsIDYsIDgsIDEwfTwvdGV4dD4KICA8dGV4dCB4PSIyMCIgeT0iNTQiIGZpbGw9IiM2ZTZlNzMiIGZvbnQtc2l6ZT0iMTIiPkluZGV4PC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5XZXJ0PC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwN2FmZiIgc3Ryb2tlLXdpZHRoPSIxLjgiIG1hcmtlci1lbmQ9InVybCgjYSkiPjxsaW5lIHgxPSI5MCIgeTE9IjE0MCIgeDI9IjkwIiB5Mj0iMTEyIi8+PGxpbmUgeDE9IjMzMCIgeTE9IjE0MCIgeDI9IjMzMCIgeTI9IjExMiIvPjwvZz4KICA8ZyBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRleHQgeD0iOTAiIHk9IjE1NiI+emFobGVuWzBdIGlzdCAyPC90ZXh0Pjx0ZXh0IHg9IjMzMCIgeT0iMTU2Ij56YWhsZW5bNF0gaXN0IDEwPC90ZXh0PjwvZz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+NSBGw6RjaGVyLCBnZXrDpGhsdCB3aXJkIGFiIDA6IGRlciBsZXR6dGUgSW5kZXggaXN0IDQuPC90ZXh0Pgo8L3N2Zz4K",UC=""+new URL("mvc-klick-KmFKqxH-.svg",import.meta.url).href,$C=""+new URL("aufgabe-mehrwertsteuer-KUkerRBd.svg",import.meta.url).href,YC=""+new URL("kino-saal-BOvcmdzb.svg",import.meta.url).href,XC=""+new URL("kino-schleifen-Ci9yPnbo.svg",import.meta.url).href,KC="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgNDkyIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iNDkyIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiPgogICAgPCEtLSBTdGFydCAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMTAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMjgiIHJ4PSIxNCIgZmlsbD0iI2QxZjJkOSIvPgogICAgPGxpbmUgeDE9IjE1MCIgeTE9IjM4IiB4Mj0iMTUwIiB5Mj0iNTQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gQW53ZWlzdW5nIC0tPgogICAgPHJlY3QgeD0iNTAiIHk9IjU2IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iODYiIHgyPSIxNTAiIHkyPSI5OCIgbWFya2VyLWVuZD0idXJsKCNhKSIvPgogICAgPCEtLSBSYXV0ZSAxIC0tPgogICAgPHBhdGggZD0iTTE1MCAxMDAgTDIzNSAxMjggTDE1MCAxNTYgTDY1IDEyOCBaIiBmaWxsPSIjZmZmNGQ2Ii8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMTU2IiB4Mj0iMTUwIiB5Mj0iMTcyIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8cmVjdCB4PSI1MCIgeT0iMTc0IiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8bGluZSB4MT0iMTUwIiB5MT0iMjA0IiB4Mj0iMTUwIiB5Mj0iMjUwIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIG5laW4tV2VnIHVtIGRlbiBLYXN0ZW4gaGVydW0gLS0+CiAgICA8cG9seWxpbmUgcG9pbnRzPSIyMzUsMTI4IDI4NSwxMjggMjg1LDIyMiAxNTAsMjIyIiBmaWxsPSJub25lIiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgICA8IS0tIFJhdXRlIDIgLS0+CiAgICA8cGF0aCBkPSJNMTUwIDI1MiBMMjM1IDI4MCBMMTUwIDMwOCBMNjUgMjgwIFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxsaW5lIHgxPSIyMzUiIHkxPSIyODAiIHgyPSIyNjgiIHkyPSIyODAiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjI3MCIgeT0iMjY1IiB3aWR0aD0iMTE1IiBoZWlnaHQ9IjMwIiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8IS0tIHp1csO8Y2sgenVyIFByw7xmdW5nIC0tPgogICAgPHBvbHlsaW5lIHBvaW50cz0iMzI3LDI2NSAzMjcsMjM4IDE1MCwyMzgiIGZpbGw9Im5vbmUiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzMDgiIHgyPSIxNTAiIHkyPSIzMjYiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDxyZWN0IHg9IjUwIiB5PSIzMjgiIHdpZHRoPSIyMDAiIGhlaWdodD0iMzAiIGZpbGw9IiNlNWYwZmYiLz4KICAgIDxsaW5lIHgxPSIxNTAiIHkxPSIzNTgiIHgyPSIxNTAiIHkyPSIzNzQiIG1hcmtlci1lbmQ9InVybCgjYSkiLz4KICAgIDwhLS0gRW5kZSAtLT4KICAgIDxyZWN0IHg9IjEwMCIgeT0iMzc2IiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjI4IiByeD0iMTQiIGZpbGw9IiNkMWYyZDkiLz4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSI+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI5Ij5JbsOtY2lvPC90ZXh0PgogICAgPHRleHQgeD0iMTUwIiB5PSI3NiI+UMO0ciB1bWEgY2jDoXZlbmEgbmEgbWVzYTwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTMzIj5RdWVyIGHDp8O6Y2FyPzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMTk0Ij5KdW50YXIgYcOnw7pjYXI8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjI4NSI+Q2jDoSBtdWl0byBxdWVudGU/PC90ZXh0PgogICAgPHRleHQgeD0iMzI3LjUiIHk9IjI4NSI+RXNwZXJhciAxIG1pbnV0bzwvdGV4dD4KICAgIDx0ZXh0IHg9IjE1MCIgeT0iMzQ4Ij5CZWJlciBvIGNow6E8L3RleHQ+CiAgICA8dGV4dCB4PSIxNTAiIHk9IjM5NSI+RmltPC90ZXh0PgogIDwvZz4KICA8ZyBmb250LXNpemU9IjEyIiBmb250LXdlaWdodD0iNjAwIj4KICAgIDx0ZXh0IHg9IjE1NiIgeT0iMTY4IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIyNDIiIHk9IjEyMiIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICAgIDx0ZXh0IHg9IjI0MCIgeT0iMjc0IiBmaWxsPSIjMjQ4YTNkIj5zaW08L3RleHQ+CiAgICA8dGV4dCB4PSIxNTYiIHk9IjMyMCIgZmlsbD0iI2Q3MDAxNSI+bsOjbzwvdGV4dD4KICA8L2c+CiAgPCEtLSBMZWdlbmRlIC0tPgogIDxsaW5lIHgxPSIxMCIgeTE9IjQxOCIgeDI9IjM5MCIgeTI9IjQxOCIgc3Ryb2tlPSIjZDFkMWQ2Ii8+CiAgPGcgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuNSI+CiAgICA8cmVjdCB4PSI0MCIgeT0iNDMwIiB3aWR0aD0iMzYiIGhlaWdodD0iMTgiIHJ4PSI5IiBmaWxsPSIjZDFmMmQ5Ii8+CiAgICA8cmVjdCB4PSIyMjAiIHk9IjQzMCIgd2lkdGg9IjM2IiBoZWlnaHQ9IjE4IiBmaWxsPSIjZTVmMGZmIi8+CiAgICA8cGF0aCBkPSJNNTggNDU4IEw3NiA0NjkgTDU4IDQ4MCBMNDAgNDY5IFoiIGZpbGw9IiNmZmY0ZDYiLz4KICAgIDxwYXRoIGQ9Ik0yMjYgNDYwIEwyNTYgNDYwIEwyNTAgNDc4IEwyMjAgNDc4IFoiIGZpbGw9IiNmMmU2ZmYiLz4KICA8L2c+CiAgPGcgZm9udC1zaXplPSIxMiIgZmlsbD0iIzNhM2EzYyI+CiAgICA8dGV4dCB4PSI4NiIgeT0iNDQzIj5JbsOtY2lvIG91IGZpbTwvdGV4dD4KICAgIDx0ZXh0IHg9IjI2NiIgeT0iNDQzIj5JbnN0cnXDp8OjbzwvdGV4dD4KICAgIDx0ZXh0IHg9Ijg2IiB5PSI0NzMiPkRlY2lzw6NvPC90ZXh0PgogICAgPHRleHQgeD0iMjY2IiB5PSI0NzMiPkVudHJhZGEgb3Ugc2HDrWRhPC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",eB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE5MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwIiB5PSIyNCIgZm9udC13ZWlnaHQ9IjYwMCI+T25kZSBmaWNhIG8gZWxlbWVudG8/PC90ZXh0PgogIDxyZWN0IHg9IjIwIiB5PSI0MCIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RiZWFmZSIvPgogIDxyZWN0IHg9IjIwIiB5PSI3NSIgd2lkdGg9IjE5MCIgaGVpZ2h0PSIzNSIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc1IiB4Mj0iMjEwIiB5Mj0iNzUiIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIi8+CiAgPHJlY3QgeD0iMjAiIHk9IjQwIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjcwIiBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjExNSIgeT0iNjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxZDRlZDgiPm1ldGFkZSBkZSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjExNSIgeT0iOTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPm1ldGFkZSBkZSBiYWl4bzwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9IjYyIj7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+YW50ZXM8L3RzcGFuPjwvdGV4dD4KICA8dGV4dCB4PSIyMjQiIHk9Ijk3Ij7ihpIgZmljYSA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+ZGVwb2lzPC90c3Bhbj48L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjEzMiIgd2lkdGg9IjE5MCIgaGVpZ2h0PSI0MCIgZmlsbD0iI2ZlZjNjNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIxMTUiIHk9IjE1NyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiI+w7g8L3RleHQ+CiAgPHRleHQgeD0iMjI0IiB5PSIxNTciPuKGkiA8dHNwYW4gZm9udC13ZWlnaHQ9IjYwMCI+c3Vic3RpdHVpLW88L3RzcGFuPjwvdGV4dD4KPC9zdmc+Cg==",tB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjEwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjIxMCIgZmlsbD0iI2ZmZmZmZiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMjQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlIiBmb250LXNpemU9IjE2Ij5pbnQgaWRhZGUgPSAxNDwvdGV4dD4KICA8cGF0aCBkPSJNMTMwIDcwIEwxNzAgNTAgTDMwMCA1MCBMMjYwIDcwIFoiIGZpbGw9IiNjOThhM2MiIHN0cm9rZT0iIzhhNWExZiIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHJlY3QgeD0iMTgwIiB5PSIzNCIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjUwIiByeD0iMyIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjEuNSIvPgogIDx0ZXh0IHg9IjIwMiIgeT0iNjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMjAiIGZvbnQtd2VpZ2h0PSI3MDAiPjE0PC90ZXh0PgogIDxyZWN0IHg9IjEzMCIgeT0iNzAiIHdpZHRoPSIxMzAiIGhlaWdodD0iMTAwIiBmaWxsPSIjZTliODcyIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxwYXRoIGQ9Ik0yNjAgNzAgTDMwMCA1MCBMMzAwIDE1MCBMMjYwIDE3MCBaIiBmaWxsPSIjZDQ5YTRjIiBzdHJva2U9IiM4YTVhMWYiIHN0cm9rZS13aWR0aD0iMiIvPgogIDxyZWN0IHg9IjE1MCIgeT0iMTAwIiB3aWR0aD0iOTAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiM4YTVhMWYiLz4KICA8dGV4dCB4PSIxOTUiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+aWRhZGU8L3RleHQ+CiAgPHJlY3QgeD0iMTM4IiB5PSIxNDIiIHdpZHRoPSIzNCIgaGVpZ2h0PSIyMCIgcng9IjEwIiBmaWxsPSIjMDA3YWZmIi8+CiAgPHRleHQgeD0iMTU1IiB5PSIxNTYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTIiIGZpbGw9IiNmZmZmZmYiIGZvbnQtd2VpZ2h0PSI2MDAiPmludDwvdGV4dD4KICA8ZyBzdHJva2U9IiM2ZTZlNzMiPgogICAgPGxpbmUgeDE9IjMxMCIgeTE9IjQ4IiB4Mj0iMjI2IiB5Mj0iNTIiLz4KICAgIDxsaW5lIHgxPSIzMTAiIHkxPSIxMTUiIHgyPSIyNDIiIHkyPSIxMTUiLz4KICAgIDxsaW5lIHgxPSI4MCIgeTE9IjE1MiIgeDI9IjEzNCIgeTI9IjE1MiIvPgogIDwvZz4KICA8dGV4dCB4PSIzMTYiIHk9IjUyIj5WYWxvcjwvdGV4dD4KICA8dGV4dCB4PSIzMTYiIHk9IjExOSI+Tm9tZTwvdGV4dD4KICA8dGV4dCB4PSI4IiB5PSIxNTYiPlRpcG8gZGUgZGFkb3M8L3RleHQ+CiAgPHRleHQgeD0iMjAwIiB5PSIxOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPlBlbG8gbm9tZSBjaGVnYXMgYW8gdmFsb3IuPC90ZXh0Pgo8L3N2Zz4K",nB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMjAiPgogICAgPHRleHQgeD0iNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+cG9udG9zPC90ZXh0PgogICAgPHRleHQgeD0iMTI1IiB5PSIxMTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPj08L3RleHQ+CiAgICA8dGV4dCB4PSIyNjAiIHk9IjExMCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zICsgNTwvdGV4dD4KICA8L2c+CiAgPHJlY3QgeD0iMTgwIiB5PSI4NiIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjYwIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNTgwM2QiPuKRoCBjYWxjdWxhciBhIGRpcmVpdGE6IDEwICsgNSA9IDE1PC90ZXh0PgogIDxwYXRoIGQ9Ik0yNTAgODIgQzIzMCAzMCwgOTAgMzAsIDY0IDg0IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMi41IiBtYXJrZXItZW5kPSJ1cmwoI2EpIi8+CiAgPHRleHQgeD0iMTYwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiI+4pGhIGd1YXJkYXIgbyByZXN1bHRhZG8gw6AgZXNxdWVyZGE8L3RleHQ+CiAgPHJlY3QgeD0iMjAiIHk9IjE2NCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIyNiIgcng9IjYiIGZpbGw9IiNmMmYyZjciLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE4MiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+cG9udG9zIGFudGVzOiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPiAgIOKGkiAgIHBvbnRvcyBkZXBvaXM6IDx0c3BhbiBmb250LXdlaWdodD0iNzAwIj4xNTwvdHNwYW4+PC90ZXh0Pgo8L3N2Zz4K",iB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMzAwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMzAwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPGcgc3Ryb2tlPSIjNmU2ZTczIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPgogICAgPHBhdGggZD0iTTQwIDExMCBMNDggMTgwIEwxMDIgMTgwIEwxMTAgMTEwIi8+CiAgICA8cGF0aCBkPSJNMTY1IDExMCBMMTczIDE4MCBMMjI3IDE4MCBMMjM1IDExMCIvPgogICAgPHBhdGggZD0iTTI5MCAxMTAgTDI5OCAxODAgTDM1MiAxODAgTDM2MCAxMTAiLz4KICA8L2c+CiAgPHBhdGggZD0iTTQ0IDEzNSBMNDggMTgwIEwxMDIgMTgwIEwxMDYgMTM1IFoiIGZpbGw9IiNmZGJhNzQiLz4KICA8cGF0aCBkPSJNMjk0IDEzNSBMMjk4IDE4MCBMMzUyIDE4MCBMMzU2IDEzNSBaIiBmaWxsPSIjOTNjNWZkIi8+CiAgPHRleHQgeD0iNzUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZXNxdWVyZGE8L3RleHQ+CiAgPHRleHQgeD0iNzUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+c3VtbzwvdGV4dD4KICA8dGV4dCB4PSIyMDAiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+YXV4PC90ZXh0PgogIDx0ZXh0IHg9IjIwMCIgeT0iMjE3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52YXppbzwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+ZGlyZWl0YTwvdGV4dD4KICA8dGV4dCB4PSIzMjUiIHk9IjIxNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+w6FndWE8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8cGF0aCBkPSJNODggMTA0IEMxMTAgNzAsIDE2MCA3MCwgMTg2IDEwNCIvPgogICAgPHBhdGggZD0iTTMxOCAxMDQgQzI3MCAxNSwgMTMwIDE1LCA4MiAxMDQiLz4KICAgIDxwYXRoIGQ9Ik0yMTQgMTA0IEMyNDAgNzAsIDI5MCA3MCwgMzEyIDEwNCIvPgogIDwvZz4KICA8ZyBmb250LXdlaWdodD0iNzAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4KICAgIDxjaXJjbGUgY3g9IjEzNyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMTM3IiB5PSI4NSI+MTwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjIwMCIgY3k9IjM4IiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjAwIiB5PSI0MyI+MjwvdGV4dD4KICAgIDxjaXJjbGUgY3g9IjI2MyIgY3k9IjgwIiByPSIxMSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+PHRleHQgeD0iMjYzIiB5PSI4NSI+MzwvdGV4dD4KICA8L2c+CiAgPGcgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTIiPgogICAgPHRleHQgeD0iMjAwIiB5PSIyNTAiPjE6IGF1eCA9IGVzcXVlcmRhPC90ZXh0PgogICAgPHRleHQgeD0iMjAwIiB5PSIyNjgiPjI6IGVzcXVlcmRhID0gZGlyZWl0YTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMjg2Ij4zOiBkaXJlaXRhID0gYXV4PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==",aB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8cmVjdCB3aWR0aD0iNDAwIiBoZWlnaHQ9IjE1MCIgZmlsbD0iI2ZmZmZmZiIvPgogIDxyZWN0IHg9IjIwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+PHJlY3QgeD0iMzAwIiB5PSI1MCIgd2lkdGg9IjgwIiBoZWlnaHQ9IjI0IiBmaWxsPSIjZmVlMmUyIi8+CiAgPHJlY3QgeD0iMTAwIiB5PSI1MCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyNCIgZmlsbD0iI2RjZmNlNyIvPgogIDxsaW5lIHgxPSIyMCIgeTE9Ijc0IiB4Mj0iMzgwIiB5Mj0iNzQiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPGxpbmUgeDE9IjUwIiB5MT0iNjgiIHgyPSI1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MDwvdGV4dD4KICA8bGluZSB4MT0iMTAwIiB5MT0iNjgiIHgyPSIxMDAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIxMDAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4xPC90ZXh0PgogIDxsaW5lIHgxPSIxNTAiIHkxPSI2OCIgeDI9IjE1MCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjE1MCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjI8L3RleHQ+CiAgPGxpbmUgeDE9IjIwMCIgeTE9IjY4IiB4Mj0iMjAwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+MzwvdGV4dD4KICA8bGluZSB4MT0iMjUwIiB5MT0iNjgiIHgyPSIyNTAiIHkyPSI4MCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyNTAiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj40PC90ZXh0PgogIDxsaW5lIHgxPSIzMDAiIHkxPSI2OCIgeDI9IjMwMCIgeTI9IjgwIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjMwMCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjU8L3RleHQ+CiAgPGxpbmUgeDE9IjM1MCIgeTE9IjY4IiB4Mj0iMzUwIiB5Mj0iODAiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzUwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+NjwvdGV4dD4KICA8Y2lyY2xlIGN4PSIxMDAiIGN5PSI3NCIgcj0iNiIgZmlsbD0iIzE1ODAzZCIvPjxjaXJjbGUgY3g9IjMwMCIgY3k9Ijc0IiByPSI2IiBmaWxsPSIjMTU4MDNkIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI0MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dsOhbGlkYTwvdGV4dD4KICA8dGV4dCB4PSI1MCIgeT0iNDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiNiOTFjMWMiIGZvbnQtd2VpZ2h0PSI2MDAiPmludsOhbGlkYTwvdGV4dD48dGV4dCB4PSIzNTAiIHk9IjQwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5pbnbDoWxpZGE8L3RleHQ+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPgogICAgPHRleHQgeD0iMjAwIiB5PSIxMjQiIGZpbGw9IiMxNTgwM2QiPm5vdGEgJmd0Oz0gMSAmYW1wOyZhbXA7IG5vdGEgJmx0Oz0gNTwvdGV4dD4KICAgIDx0ZXh0IHg9IjIwMCIgeT0iMTQyIiBmaWxsPSIjYjkxYzFjIj5ub3RhICZsdDsgMSB8fCBub3RhICZndDsgNTwvdGV4dD4KICA8L2c+Cjwvc3ZnPgo=",sB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIj5Db21vIGZ1bmNpb25hIG8gY2ljbG8gd2hpbGU8L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSI0NCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0MCIgcng9IjIwIiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iNjkiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCB2ZXJpZmljYXIgYSBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjEyMCIgeT0iMTI4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIiByeD0iNiIgZmlsbD0iI2RiZWFmZSIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjIiLz4KICA8dGV4dCB4PSIyMDAiIHk9IjE1MyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIGV4ZWN1dGFyIG8gaW50ZXJpb3I8L3RleHQ+CiAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEuOCIgbWFya2VyLWVuZD0idXJsKCNhKSI+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iODQiIHgyPSIyMDAiIHkyPSIxMjYiLz4KICAgIDxwYXRoIGQ9Ik0xMjAgMTQ4IEM4MCAxNDgsIDgwIDY0LCAxMTggNjQiLz4KICAgIDxwYXRoIGQ9Ik0yODAgNjQgTDM0MCA2NCBMMzQwIDIwMCBMMjgyIDIwMCIvPgogIDwvZz4KICA8dGV4dCB4PSIyMDgiIHk9IjExMCIgZmlsbD0iIzE1ODAzZCIgZm9udC13ZWlnaHQ9IjYwMCI+dHJ1ZTwvdGV4dD4KICA8dGV4dCB4PSIzOCIgeT0iMTEwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj52b2x0YXI8L3RleHQ+CiAgPHRleHQgeD0iMzgiIHk9IjEyNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+cGFyYSBjaW1hPC90ZXh0PgogIDx0ZXh0IHg9IjM0OCIgeT0iMTM0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIyNzYiIHk9IjIwNSIgdGV4dC1hbmNob3I9ImVuZCI+Y29udGludWFyIHBvciBiYWl4byBkbyBjaWNsbzwvdGV4dD4KPC9zdmc+Cg==",rB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjMwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjMwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMTAwIiB5PSIyMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjYwMCI+cHLDqS10ZXN0ZSAod2hpbGUpPC90ZXh0PgogIDx0ZXh0IHg9IjMwMCIgeT0iMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtd2VpZ2h0PSI2MDAiPnDDs3MtdGVzdGUgKGRvLXdoaWxlKTwvdGV4dD4KICA8bGluZSB4MT0iMjAwIiB5MT0iMTAiIHgyPSIyMDAiIHkyPSIyMjAiIHN0cm9rZT0iI2QxZDFkNiIvPgogIDxyZWN0IHg9IjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjE4IiBmaWxsPSIjZmVmM2M3IiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iNjciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoCBjb25kacOnw6NvPC90ZXh0PgogIDxyZWN0IHg9IjM1IiB5PSIxMjQiIHdpZHRoPSIxMzAiIGhlaWdodD0iMzYiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjEwMCIgeT0iMTQ3IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaEgaW50ZXJpb3I8L3RleHQ+CiAgPHJlY3QgeD0iMjM1IiB5PSI0NCIgd2lkdGg9IjEzMCIgaGVpZ2h0PSIzNiIgcng9IjYiIGZpbGw9IiNkYmVhZmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSI2NyIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIGludGVyaW9yPC90ZXh0PgogIDxyZWN0IHg9IjIzNSIgeT0iMTI0IiB3aWR0aD0iMTMwIiBoZWlnaHQ9IjM2IiByeD0iMTgiIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMzAwIiB5PSIxNDciIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoSBjb25kacOnw6NvPC90ZXh0PgogIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjYiIG1hcmtlci1lbmQ9InVybCgjYSkiPgogICAgPGxpbmUgeDE9IjEwMCIgeTE9IjgwIiB4Mj0iMTAwIiB5Mj0iMTIyIi8+CiAgICA8cGF0aCBkPSJNMzUgMTQyIEM4IDE0MiwgOCA2MiwgMzMgNjIiLz4KICAgIDxsaW5lIHgxPSIzMDAiIHkxPSI4MCIgeDI9IjMwMCIgeTI9IjEyMiIvPgogICAgPHBhdGggZD0iTTM2NSAxNDIgQzM5MiAxNDIsIDM5MiA2MiwgMzY3IDYyIi8+CiAgPC9nPgogIDx0ZXh0IHg9IjEwNiIgeT0iMTA2IiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjM4MCIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0iZW5kIiBmaWxsPSIjMTU4MDNkIiBmb250LXdlaWdodD0iNjAwIj50cnVlPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMTkwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5TZSBhIGNvbmRpw6fDo28gZm9yIGxvZ28gZmFsc2EsPC90ZXh0PgogIDx0ZXh0IHg9IjEwMCIgeT0iMjA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjNmU2ZTczIj5vIGludGVyaW9yIDx0c3BhbiBmb250LXdlaWdodD0iNzAwIiBmaWxsPSIjMWMxYzFlIj5udW5jYTwvdHNwYW4+IMOpIGV4ZWN1dGFkby48L3RleHQ+CiAgPHRleHQgeD0iMzAwIiB5PSIxOTAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPk8gaW50ZXJpb3Igw6kgc2VtcHJlIGV4ZWN1dGFkbzwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9IjIwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+PHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPnBlbG8gbWVub3MgdW1hIHZlejwvdHNwYW4+LjwvdGV4dD4KPC9zdmc+Cg==",oB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMjUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMWMxYzFlIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMjUwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHJlY3QgeD0iMTIwIiB5PSIxNCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzZlNmU3MyIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIzNiIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGgIEluw61jaW8gPHRzcGFuIGZpbGw9IiM2ZTZlNzMiPihzw7MgdW1hIHZleik8L3RzcGFuPjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9Ijc2IiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjM0IiByeD0iMTciIGZpbGw9IiNmZWYzYzciIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSI+4pGhIHZlcmlmaWNhciBhIGNvbmRpw6fDo288L3RleHQ+CiAgPHJlY3QgeD0iMTIwIiB5PSIxMzgiIHdpZHRoPSIxNjAiIGhlaWdodD0iMzQiIHJ4PSI2IiBmaWxsPSIjZGJlYWZlIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMiIvPgogIDx0ZXh0IHg9IjIwMCIgeT0iMTYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj7ikaIgZXhlY3V0YXIgbyBpbnRlcmlvcjwvdGV4dD4KICA8cmVjdCB4PSIxMjAiIHk9IjIwMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIyIi8+CiAgPHRleHQgeD0iMjAwIiB5PSIyMjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiPuKRoyBwYXNzbywgcC4gZXguIGkrKzwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj4KICAgIDxsaW5lIHgxPSIyMDAiIHkxPSI0OCIgeDI9IjIwMCIgeTI9Ijc0Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTEwIiB4Mj0iMjAwIiB5Mj0iMTM2Ii8+CiAgICA8bGluZSB4MT0iMjAwIiB5MT0iMTcyIiB4Mj0iMjAwIiB5Mj0iMTk4Ii8+CiAgICA8cGF0aCBkPSJNMTIwIDIxNyBDNjAgMjE3LCA2MCA5MywgMTE4IDkzIi8+CiAgICA8cGF0aCBkPSJNMjgwIDkzIEwzMzAgOTMiLz4KICA8L2c+CiAgPHRleHQgeD0iMjA4IiB5PSIxMjkiIGZpbGw9IiMxNTgwM2QiIGZvbnQtd2VpZ2h0PSI2MDAiPnRydWU8L3RleHQ+CiAgPHRleHQgeD0iNDgiIHk9IjE2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzZlNmU3MyI+dm9sdGFyPC90ZXh0PgogIDx0ZXh0IHg9IjQ4IiB5PSIxNzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPmFvIOKRoTwvdGV4dD4KICA8dGV4dCB4PSIzMDAiIHk9Ijg0IiBmaWxsPSIjYjkxYzFjIiBmb250LXdlaWdodD0iNjAwIj5mYWxzZTwvdGV4dD4KICA8dGV4dCB4PSIzMzYiIHk9Ijk4Ij5maW08L3RleHQ+Cjwvc3ZnPgo=",lB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDAgMTkwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KICA8ZGVmcz48bWFya2VyIGlkPSJhIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjMDA3YWZmIi8+PC9tYXJrZXI+PC9kZWZzPgogIDxyZWN0IHdpZHRoPSI0MDAiIGhlaWdodD0iMTkwIiBmaWxsPSIjZmZmZmZmIi8+CiAgPHRleHQgeD0iMjAiIHk9IjI0IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLCBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZSIgZm9udC1zaXplPSIxNCI+aW50W10gbnVtZXJvcyA9IHsyLCA0LCA2LCA4LCAxMH08L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjU0IiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj7DjW5kaWNlPC90ZXh0PgogIDx0ZXh0IHg9IjkwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MDwvdGV4dD48cmVjdCB4PSI2MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSI5MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjI8L3RleHQ+CiAgPHRleHQgeD0iMTUwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+MTwvdGV4dD48cmVjdCB4PSIxMjAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMTUwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+NDwvdGV4dD4KICA8dGV4dCB4PSIyMTAiIHk9IjU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmaWxsPSIjMDA3YWZmIiBmb250LXdlaWdodD0iNzAwIj4yPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI0NiIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjIiLz48dGV4dCB4PSIyMTAiIHk9IjkyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE4IiBmb250LXdlaWdodD0iNjAwIj42PC90ZXh0PgogIDx0ZXh0IHg9IjI3MCIgeT0iNTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMwMDdhZmYiIGZvbnQtd2VpZ2h0PSI3MDAiPjM8L3RleHQ+PHJlY3QgeD0iMjQwIiB5PSI2MiIgd2lkdGg9IjYwIiBoZWlnaHQ9IjQ2IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMiIvPjx0ZXh0IHg9IjI3MCIgeT0iOTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI2MDAiPjg8L3RleHQ+CiAgPHRleHQgeD0iMzMwIiB5PSI1NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZmlsbD0iIzAwN2FmZiIgZm9udC13ZWlnaHQ9IjcwMCI+NDwvdGV4dD48cmVjdCB4PSIzMDAiIHk9IjYyIiB3aWR0aD0iNjAiIGhlaWdodD0iNDYiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIyIi8+PHRleHQgeD0iMzMwIiB5PSI5MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjYwMCI+MTA8L3RleHQ+CiAgPHRleHQgeD0iMjAiIHk9IjkwIiBmaWxsPSIjNmU2ZTczIiBmb250LXNpemU9IjEyIj5WYWxvcjwvdGV4dD4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMwMDdhZmYiIHN0cm9rZS13aWR0aD0iMS44IiBtYXJrZXItZW5kPSJ1cmwoI2EpIj48bGluZSB4MT0iOTAiIHkxPSIxNDAiIHgyPSI5MCIgeTI9IjExMiIvPjxsaW5lIHgxPSIzMzAiIHkxPSIxNDAiIHgyPSIzMzAiIHkyPSIxMTIiLz48L2c+CiAgPGcgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSwgTWVubG8sIENvbnNvbGFzLCBtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTMiIHRleHQtYW5jaG9yPSJtaWRkbGUiPjx0ZXh0IHg9IjkwIiB5PSIxNTYiPm51bWVyb3NbMF0gw6kgMjwvdGV4dD48dGV4dCB4PSIzMzAiIHk9IjE1NiI+bnVtZXJvc1s0XSDDqSAxMDwvdGV4dD48L2c+CiAgPHRleHQgeD0iMjAwIiB5PSIxODIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiM2ZTZlNzMiPjUgcG9zacOnw7VlcywgY29udGEtc2UgYSBwYXJ0aXIgZGUgMDogbyDDumx0aW1vIMOtbmRpY2Ugw6kgNC48L3RleHQ+Cjwvc3ZnPgo=",uB=""+new URL("mvc-klick-DKonBpbs.svg",import.meta.url).href,mB=""+new URL("schiffe-versenken-iEBDHIxD.svg",import.meta.url).href,cB=""+new URL("ss-binaere-suche-DVVS2SNc.svg",import.meta.url).href,dB=""+new URL("ss-bubblesort-AFDcFDah.svg",import.meta.url).href,hB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5Qcm9jdXJhLXNlIG8gOS4gQXMgY2FydGFzIGVzdMOjbyBiYXJhbGhhZGFzLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5WaXJhciBkYSBlc3F1ZXJkYSBwYXJhIGEgZGlyZWl0YTo8L3RleHQ+PHRleHQgeD0iMTQiIHk9IjE4OCIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzZlNmU3MyI+QXDDs3MgNSBjb21wYXJhw6fDtWVzLCBvIDkgw6kgZW5jb250cmFkby48L3RleHQ+Cjwvc3ZnPgo=",gB=""+new URL("ss-vergleiche-DWgkIvLr.svg",import.meta.url).href,pB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPlBhc3NhZ2VtIHBvciB2YWxvcjogdW1hIGPDs3BpYTwvdGV4dD4KPHJlY3QgeD0iMTAiIHk9IjM4IiB3aWR0aD0iMTYwIiBoZWlnaHQ9Ijg2IiByeD0iOCIgZmlsbD0iI2VmZjZmZiIgc3Ryb2tlPSIjMWQ0ZWQ4IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyMCIgeT0iNTgiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMTYiIHk9Ijk4IiBmb250LXNpemU9IjEyIj5udW1lcm88L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+ZHVwbGljYXI8L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iOTgiPng8L3RleHQ+CjxyZWN0IHg9IjI4MCIgeT0iNzgiIHdpZHRoPSI4MCIgaGVpZ2h0PSIzMCIgcng9IjQiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8dGV4dCB4PSIzMjAiIHk9Ijk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj48dHNwYW4gZmlsbD0iIzZlNmU3MyIgdGV4dC1kZWNvcmF0aW9uPSJsaW5lLXRocm91Z2giPjU8L3RzcGFuPiA8dHNwYW4gZm9udC13ZWlnaHQ9IjcwMCI+MTA8L3RzcGFuPjwvdGV4dD4KPGxpbmUgeDE9IjEyOCIgeTE9IjkzIiB4Mj0iMjQ4IiB5Mj0iOTMiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNCIgbWFya2VyLWVuZD0idXJsKCNrKSIvPgo8dGV4dCB4PSIyMTAiIHk9Ijg0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5jw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggcGFzc2EgYSAxMCwgbWFzIG51bWVybyBmaWNhIDUuPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iMTY4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5Db21vIHVtYSBmb3RvY8OzcGlhOiBlc2NyZXZlciBuYSBjw7NwaWE8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxODYiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPm7Do28gYWx0ZXJhIG8gb3JpZ2luYWwuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5QYXNzYWdlbSBwb3IgcmVmZXLDqm5jaWE6IG8gbWVzbW8gYXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPlByb2dyYW1hIHByaW5jaXBhbDwvdGV4dD4KPHRleHQgeD0iMjAiIHk9IjMwMCI+ZmlsYTwvdGV4dD4KPGNpcmNsZSBjeD0iMTUwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjMWQ0ZWQ4Ii8+CjxyZWN0IHg9IjI1MCIgeT0iMjUyIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjYyIiByeD0iOCIgZmlsbD0iI2ZmZjdlZCIgc3Ryb2tlPSIjYjQ1MzA5IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyNjAiIHk9IjI3MiIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+bGltcGFyPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9IjMwMCI+bHVnYXJlczwvdGV4dD4KPGNpcmNsZSBjeD0iMzkwIiBjeT0iMjk1IiByPSI1IiBmaWxsPSIjYjQ1MzA5Ii8+CjxwYXRoIGQ9Ik0xNTAgMzAwIEwxNTAgMzQwIEwxNDAgMzUyIiBmaWxsPSJub25lIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI2IpIi8+CjxwYXRoIGQ9Ik0zOTAgMzAwIEwzOTAgMzQwIEwzMjIgMzU0IiBmaWxsPSJub25lIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41IiBtYXJrZXItZW5kPSJ1cmwoI28pIi8+CjxyZWN0IHg9IjkwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjE1MCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyMTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMjcwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9IjEyMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTgwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIyNDAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjMwMCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQxNiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+U8OzIGjDoSB1bSBhcnJheS4gTyBxdWUgbGltcGFyIGFsdGVyYSBhdHJhdsOpcyBkZSBsdWdhcmVzLDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+byBwcm9ncmFtYSBwcmluY2lwYWwgdsOqIGVtIGZpbGEuPC90ZXh0Pgo8L3N2Zz4K",fB=""+new URL("zk-zeichen-8efNmpGx.svg",import.meta.url).href,xB=""+new URL("schiffe-versenken-CXt1SF0S.svg",import.meta.url).href,bB=""+new URL("ss-binaere-suche-CPsLGldq.svg",import.meta.url).href,yB=""+new URL("ss-bubblesort-Dic2ZfaT.svg",import.meta.url).href,vB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MDQgMTk2IiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWMxYzFlIj4KPHJlY3Qgd2lkdGg9IjQwNCIgaGVpZ2h0PSIxOTYiIGZpbGw9IiNmZmZmZmYiLz4KPHRleHQgeD0iMTQiIHk9IjI0IiBmb250LXdlaWdodD0iNjAwIiBmb250LXNpemU9IjE1Ij5HZXN1Y2h0OiBkaWUgOS4gRGllIEthcnRlbiBzaW5kIGdlbWlzY2h0LjwvdGV4dD4KPGc+PHJlY3QgeD0iMTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjZjJmMmY3IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjx0ZXh0IHg9IjM0LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjc8L3RleHQ+PHRleHQgeD0iMzQuMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiNkYzI2MjYiPuKZpTwvdGV4dD48L2c+Cjx0ZXh0IHg9IjM0LjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIzNC4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjEuPC90ZXh0Pgo8Zz48cmVjdCB4PSI2MiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iODIuMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+MzwvdGV4dD48dGV4dCB4PSI4Mi4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iIzFjMWMxZSI+4pmgPC90ZXh0PjwvZz4KPHRleHQgeD0iODIuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZGMyNjI2Ij7inJc8L3RleHQ+Cjx0ZXh0IHg9IjgyLjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+Mi48L3RleHQ+CjxnPjxyZWN0IHg9IjExMCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNmMmYyZjciIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHRleHQgeD0iMTMwLjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiNkYzI2MjYiPjEwPC90ZXh0Pjx0ZXh0IHg9IjEzMC4wIiB5PSI5NS45MTk5OTk5OTk5OTk5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2RjMjYyNiI+4pmmPC90ZXh0PjwvZz4KPHRleHQgeD0iMTMwLjAiIHk9IjEzMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxNiIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2RjMjYyNiI+4pyXPC90ZXh0Pgo8dGV4dCB4PSIxMzAuMCIgeT0iMTQ4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj4zLjwvdGV4dD4KPGc+PHJlY3QgeD0iMTU4IiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iI2YyZjJmNyIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48dGV4dCB4PSIxNzguMCIgeT0iNzUuMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxOCIgZm9udC13ZWlnaHQ9IjcwMCIgZmlsbD0iIzFjMWMxZSI+NTwvdGV4dD48dGV4dCB4PSIxNzguMCIgeT0iOTUuOTE5OTk5OTk5OTk5OTkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiMxYzFjMWUiPuKZozwvdGV4dD48L2c+Cjx0ZXh0IHg9IjE3OC4wIiB5PSIxMzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTYiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNkYzI2MjYiPuKclzwvdGV4dD4KPHRleHQgeD0iMTc4LjAiIHk9IjE0OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+NC48L3RleHQ+CjxnPjxyZWN0IHg9IjIwNiIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiNkY2ZjZTciIHN0cm9rZT0iIzE1ODAzZCIgc3Ryb2tlLXdpZHRoPSIzIi8+PHRleHQgeD0iMjI2LjAiIHk9Ijc1LjIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTgiIGZvbnQtd2VpZ2h0PSI3MDAiIGZpbGw9IiMxYzFjMWUiPjk8L3RleHQ+PHRleHQgeD0iMjI2LjAiIHk9Ijk1LjkxOTk5OTk5OTk5OTk5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE1IiBmaWxsPSIjMWMxYzFlIj7imaA8L3RleHQ+PC9nPgo8dGV4dCB4PSIyMjYuMCIgeT0iMTMwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMTU4MDNkIj7inJM8L3RleHQ+Cjx0ZXh0IHg9IjIyNi4wIiB5PSIxNDgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPjUuPC90ZXh0Pgo8Zz48cmVjdCB4PSIyNTQiIHk9IjUwIiB3aWR0aD0iNDAiIGhlaWdodD0iNTYiIHJ4PSI1IiBmaWxsPSIjMWQ0ZWQ4IiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMSIvPjxyZWN0IHg9IjI1OCIgeT0iNTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSI0OCIgcng9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMiIvPjwvZz4KPGc+PHJlY3QgeD0iMzAyIiB5PSI1MCIgd2lkdGg9IjQwIiBoZWlnaHQ9IjU2IiByeD0iNSIgZmlsbD0iIzFkNGVkOCIgc3Ryb2tlPSIjMWMxYzFlIiBzdHJva2Utd2lkdGg9IjEiLz48cmVjdCB4PSIzMDYiIHk9IjU0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDgiIHJ4PSIzIiBmaWxsPSJub25lIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSIzIDIiLz48L2c+CjxnPjxyZWN0IHg9IjM1MCIgeT0iNTAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI1NiIgcng9IjUiIGZpbGw9IiMxZDRlZDgiIHN0cm9rZT0iIzFjMWMxZSIgc3Ryb2tlLXdpZHRoPSIxIi8+PHJlY3QgeD0iMzU0IiB5PSI1NCIgd2lkdGg9IjMyIiBoZWlnaHQ9IjQ4IiByeD0iMyIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuMiIgc3Ryb2tlLWRhc2hhcnJheT0iMyAyIi8+PC9nPgo8dGV4dCB4PSIxNCIgeT0iMTY4IiBmb250LXNpemU9IjE1IiBmaWxsPSIjNmU2ZTczIj5Wb24gbGlua3MgbmFjaCByZWNodHMgdW1kcmVoZW46PC90ZXh0Pjx0ZXh0IHg9IjE0IiB5PSIxODgiIGZvbnQtc2l6ZT0iMTUiIGZpbGw9IiM2ZTZlNzMiPk5hY2ggNSBWZXJnbGVpY2hlbiBpc3QgZGllIDkgZ2VmdW5kZW4uPC90ZXh0Pgo8L3N2Zz4K",wB=""+new URL("ss-vergleiche-DRqzU2TZ.svg",import.meta.url).href,zB="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MjAgNDUwIiBmb250LWZhbWlseT0ic3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgUm9ib3RvLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjE0IiBmaWxsPSIjMWMxYzFlIj4KPGRlZnM+PG1hcmtlciBpZD0iayIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI5IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNiIgbWFya2VySGVpZ2h0PSI2IiBvcmllbnQ9ImF1dG8iPjxwYXRoIGQ9Ik0wIDAgTDEwIDUgTDAgMTAgWiIgZmlsbD0iIzFjMWMxZSIvPjwvbWFya2VyPjxtYXJrZXIgaWQ9ImIiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOSIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjYiIG1hcmtlckhlaWdodD0iNiIgb3JpZW50PSJhdXRvIj48cGF0aCBkPSJNMCAwIEwxMCA1IEwwIDEwIFoiIGZpbGw9IiMxZDRlZDgiLz48L21hcmtlcj48bWFya2VyIGlkPSJvIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjkiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI2IiBtYXJrZXJIZWlnaHQ9IjYiIG9yaWVudD0iYXV0byI+PHBhdGggZD0iTTAgMCBMMTAgNSBMMCAxMCBaIiBmaWxsPSIjYjQ1MzA5Ii8+PC9tYXJrZXI+PC9kZWZzPgo8cmVjdCB3aWR0aD0iNDIwIiBoZWlnaHQ9IjQ1MCIgZmlsbD0iI2ZmZmZmZiIvPgo8dGV4dCB4PSIxMCIgeT0iMjIiIGZvbnQtc2l6ZT0iMTUiIGZvbnQtd2VpZ2h0PSI3MDAiPldlcnTDvGJlcmdhYmU6IGVpbmUgS29waWU8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNlZmY2ZmYiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjAiIHk9IjU4IiBmb250LXNpemU9IjEzIiBmaWxsPSIjMWQ0ZWQ4Ij5IYXVwdHByb2dyYW1tPC90ZXh0Pgo8dGV4dCB4PSIyMCIgeT0iOTgiPnphaGw8L3RleHQ+CjxyZWN0IHg9IjcwIiB5PSI3OCIgd2lkdGg9IjU2IiBoZWlnaHQ9IjMwIiByeD0iNCIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+Cjx0ZXh0IHg9Ijk4IiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC13ZWlnaHQ9IjcwMCI+NTwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIzOCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI4NiIgcng9IjgiIGZpbGw9IiNmZmY3ZWQiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iMjYwIiB5PSI1OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iI2I0NTMwOSI+dmVyZG9wcGxlPC90ZXh0Pgo8dGV4dCB4PSIyNjAiIHk9Ijk4Ij54PC90ZXh0Pgo8cmVjdCB4PSIyODAiIHk9Ijc4IiB3aWR0aD0iODAiIGhlaWdodD0iMzAiIHJ4PSI0IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMzIwIiB5PSI5OSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+PHRzcGFuIGZpbGw9IiM2ZTZlNzMiIHRleHQtZGVjb3JhdGlvbj0ibGluZS10aHJvdWdoIj41PC90c3Bhbj4gPHRzcGFuIGZvbnQtd2VpZ2h0PSI3MDAiPjEwPC90c3Bhbj48L3RleHQ+CjxsaW5lIHgxPSIxMjgiIHkxPSI5MyIgeDI9IjI0OCIgeTI9IjkzIiBzdHJva2U9IiMxYzFjMWUiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiIG1hcmtlci1lbmQ9InVybCgjaykiLz4KPHRleHQgeD0iMjEwIiB5PSI4NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+S29waWU8L3RleHQ+Cjx0ZXh0IHg9IjEwIiB5PSIxNTAiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiM2ZTZlNzMiPnggd2lyZCAxMCwgYWJlciB6YWhsIGJsZWlidCA1LjwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE2OCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+V2llIGJlaSBlaW5lciBGb3Rva29waWU6IFdlciBhdWYgZGVyIEtvcGllIHNjaHJlaWJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjE4NiIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+w6RuZGVydCBkYXMgT3JpZ2luYWwgbmljaHQuPC90ZXh0Pgo8bGluZSB4MT0iMTAiIHkxPSIyMDgiIHgyPSI0MTAiIHkyPSIyMDgiIHN0cm9rZT0iI2QxZDFkNiIvPgo8dGV4dCB4PSIxMCIgeT0iMjM2IiBmb250LXNpemU9IjE1IiBmb250LXdlaWdodD0iNzAwIj5SZWZlcmVuesO8YmVyZ2FiZTogZGFzc2VsYmUgQXJyYXk8L3RleHQ+CjxyZWN0IHg9IjEwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMxZDRlZDgiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjIwIiB5PSIyNzIiIGZvbnQtc2l6ZT0iMTMiIGZpbGw9IiMxZDRlZDgiPkhhdXB0cHJvZ3JhbW08L3RleHQ+Cjx0ZXh0IHg9IjIwIiB5PSIzMDAiPnJlaWhlPC90ZXh0Pgo8Y2lyY2xlIGN4PSIxNTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiMxZDRlZDgiLz4KPHJlY3QgeD0iMjUwIiB5PSIyNTIiIHdpZHRoPSIxNjAiIGhlaWdodD0iNjIiIHJ4PSI4IiBmaWxsPSIjZmZmN2VkIiBzdHJva2U9IiNiNDUzMDkiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI2MCIgeT0iMjcyIiBmb250LXNpemU9IjEzIiBmaWxsPSIjYjQ1MzA5Ij5sZWVyZW48L3RleHQ+Cjx0ZXh0IHg9IjI2MCIgeT0iMzAwIj5wbGFldHplPC90ZXh0Pgo8Y2lyY2xlIGN4PSIzOTAiIGN5PSIyOTUiIHI9IjUiIGZpbGw9IiNiNDUzMDkiLz4KPHBhdGggZD0iTTE1MCAzMDAgTDE1MCAzNDAgTDE0MCAzNTIiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzFkNGVkOCIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjYikiLz4KPHBhdGggZD0iTTM5MCAzMDAgTDM5MCAzNDAgTDMyMiAzNTQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2I0NTMwOSIgc3Ryb2tlLXdpZHRoPSIxLjUiIG1hcmtlci1lbmQ9InVybCgjbykiLz4KPHJlY3QgeD0iOTAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHJlY3QgeD0iMTUwIiB5PSIzNTgiIHdpZHRoPSI2MCIgaGVpZ2h0PSIzMiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSIjMWMxYzFlIi8+CjxyZWN0IHg9IjIxMCIgeT0iMzU4IiB3aWR0aD0iNjAiIGhlaWdodD0iMzIiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0iIzFjMWMxZSIvPgo8cmVjdCB4PSIyNzAiIHk9IjM1OCIgd2lkdGg9IjYwIiBoZWlnaHQ9IjMyIiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9IiMxYzFjMWUiLz4KPHRleHQgeD0iMTIwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxODAiIHk9IjM3OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSIxMyI+ZmFsc2U8L3RleHQ+Cjx0ZXh0IHg9IjI0MCIgeT0iMzc5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjEzIj5mYWxzZTwvdGV4dD4KPHRleHQgeD0iMzAwIiB5PSIzNzkiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTMiPmZhbHNlPC90ZXh0Pgo8dGV4dCB4PSIxMCIgeT0iNDE2IiBmb250LXNpemU9IjEzIiBmaWxsPSIjNmU2ZTczIj5FcyBnaWJ0IG51ciBlaW4gQXJyYXkuIFdhcyBsZWVyZW4gw7xiZXIgcGxhZXR6ZSDDpG5kZXJ0LDwvdGV4dD4KPHRleHQgeD0iMTAiIHk9IjQzNCIgZm9udC1zaXplPSIxMyIgZmlsbD0iIzZlNmU3MyI+c2llaHQgZGFzIEhhdXB0cHJvZ3JhbW0gdW50ZXIgcmVpaGUuPC90ZXh0Pgo8L3N2Zz4K",IB=""+new URL("zk-zeichen-vYvc3iJg.svg",import.meta.url).href;function kB(i){const e=[];for(const t of i.replace(/\r\n/g,` `).split(` -`)){const n=/^###\s+(.+)$/.exec(t),a=e.at(-1);if(n){const s=n[1].trim();e.push({term:s,forms:[s],text:""})}else a&&/^(auch|also):/i.test(t)?a.forms.push(...t.replace(/^(auch|also):/i,"").split(",").map(s=>s.trim()).filter(Boolean)):a&&t.trim()!==""&&(a.text=(a.text+" "+t.trim()).trim())}return e.filter(t=>t.text!=="")}const kB=i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function ju(i){const e=i.flatMap(t=>t.forms).sort((t,n)=>n.length-t.length);if(e.length!==0)return new RegExp(`(?t.forms.includes(e))}class To extends Error{}function SB(i){return i==="zuhoerer"||i==="vertrag"||i==="layout"||i==="bombe"||i==="frage"||i==="reihenfolge"}function _B(i,e,t){const n=h=>{throw new To(`${t}: ${h}`)};let a="",s="",r="",o=[],l,u;const m=[];let c,d=!1;for(const h of e){const g=h.trim();if(c&&d&&(/^ {4}|^\t/.test(h)||g==="")){c.code+=(c.code?` -`:"")+h.replace(/^( {4}|\t)/,"");continue}if(d=!1,!g)continue;const f=/^(titel|intro|antworten|frage|runde|klicks|richtig|zeit|fehler|besser|daten):\s*(.*)$/.exec(g);if(f){const[,y,w]=f;y==="runde"?(c={code:"",question:r,options:[],explanation:"",clicks:[]},m.push(c),d=!0):c?y==="frage"?c.question=w:y==="fehler"?c.wrongLine=Number(w):y==="besser"?c.fix=w:y==="klicks"?c.clicks=w.split(",").map(_=>_.trim()).filter(Boolean):y==="richtig"?c.rightText=w:n(`„${y}:“ gehört vor die erste Runde.`):y==="titel"?a=w:y==="intro"?s=w:y==="antworten"?o=w.split("|").map(_=>_.trim()):y==="frage"?r=w:y==="zeit"?l=Number(w):y==="daten"?u=w==="csv"?w:n("„daten:“ kennt nur „csv“."):n(`„${y}:“ gehört in eine Runde.`);continue}c||n(`Unbekannte Zeile vor der ersten Runde: „${g}“`);const x=c,b=/^-\s+(\[x\]\s+)?(.+)$/.exec(g);b?x.options.push({text:b[2].trim().replaceAll("\\n",` +`)){const n=/^###\s+(.+)$/.exec(t),a=e.at(-1);if(n){const s=n[1].trim();e.push({term:s,forms:[s],text:""})}else a&&/^(auch|also):/i.test(t)?a.forms.push(...t.replace(/^(auch|also):/i,"").split(",").map(s=>s.trim()).filter(Boolean)):a&&t.trim()!==""&&(a.text=(a.text+" "+t.trim()).trim())}return e.filter(t=>t.text!=="")}const SB=i=>i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");function ju(i){const e=i.flatMap(t=>t.forms).sort((t,n)=>n.length-t.length);if(e.length!==0)return new RegExp(`(?t.forms.includes(e))}class To extends Error{}function _B(i){return i==="zuhoerer"||i==="vertrag"||i==="layout"||i==="bombe"||i==="frage"||i==="reihenfolge"}function TB(i,e,t){const n=h=>{throw new To(`${t}: ${h}`)};let a="",s="",r="",o=[],l,u;const m=[];let c,d=!1;for(const h of e){const g=h.trim();if(c&&d&&(/^ {4}|^\t/.test(h)||g==="")){c.code+=(c.code?` +`:"")+h.replace(/^( {4}|\t)/,"");continue}if(d=!1,!g)continue;const f=/^(titel|intro|antworten|frage|runde|klicks|richtig|zeit|fehler|besser|daten):\s*(.*)$/.exec(g);if(f){const[,y,w]=f;y==="runde"?(c={code:"",question:r,options:[],explanation:"",clicks:[]},m.push(c),d=!0):c?y==="frage"?c.question=w:y==="fehler"?c.wrongLine=Number(w):y==="besser"?c.fix=w:y==="klicks"?c.clicks=w.split(",").map(S=>S.trim()).filter(Boolean):y==="richtig"?c.rightText=w:n(`„${y}:“ gehört vor die erste Runde.`):y==="titel"?a=w:y==="intro"?s=w:y==="antworten"?o=w.split("|").map(S=>S.trim()):y==="frage"?r=w:y==="zeit"?l=Number(w):y==="daten"?u=w==="csv"?w:n("„daten:“ kennt nur „csv“."):n(`„${y}:“ gehört in eine Runde.`);continue}c||n(`Unbekannte Zeile vor der ersten Runde: „${g}“`);const x=c,b=/^-\s+(\[x\]\s+)?(.+)$/.exec(g);b?x.options.push({text:b[2].trim().replaceAll("\\n",` `),right:!!b[1]}):g.startsWith(">")?x.explanation+=(x.explanation?" ":"")+g.slice(1).trim():n(`Unbekannte Zeile im Spiel: „${g}“`)}return a||n("Das Spiel braucht eine Zeile „titel:“."),m.length||n("Das Spiel braucht mindestens eine „runde:“."),m.forEach((h,g)=>{if(h.code=h.code.replace(/\n+$/,""),i==="bombe"){const f=h.code.split(` -`),x=h.wrongLine;(!x||!Number.isInteger(x)||x<1||x>f.length||!f[x-1].trim())&&n(`Runde ${g+1}: „fehler:“ muss eine Zeile des Codes sein.`),h.fix||n(`Runde ${g+1}: „besser:“ fehlt.`),h.options.length&&n(`Runde ${g+1}: Bei „bombe“ gibt es keine Antworten, man tippt auf die Zeile.`),h.question||n(`Runde ${g+1}: keine Frage.`);return}if(i==="reihenfolge"){h.options.length<3&&n(`Runde ${g+1}: „reihenfolge“ braucht mindestens drei Schritte.`),h.options.some(f=>f.right)&&n(`Runde ${g+1}: Bei „reihenfolge“ gibt es kein [x], die Schritte stehen der Reihe nach da.`),new Set(h.options.map(f=>f.text)).size!==h.options.length&&n(`Runde ${g+1}: zwei Schritte sind gleich.`),h.question||n(`Runde ${g+1}: keine Frage.`);return}if(h.options.length||(o.length||n(`Runde ${g+1}: keine Antworten.`),(!h.rightText||!o.includes(h.rightText))&&n(`Runde ${g+1}: „richtig:“ muss eine der Antworten sein.`),h.options=o.map(f=>({text:f,right:f===h.rightText}))),h.options.filter(f=>f.right).length!==1&&n(`Runde ${g+1}: genau eine Antwort muss richtig sein.`),h.question||n(`Runde ${g+1}: keine Frage.`),i==="layout"&&h.options.forEach(f=>Ch(f.text,`Runde ${g+1}`,n)),i==="zuhoerer")try{const f=Bh(h.code);for(const x of h.clicks)f.buttons.some(b=>b.caption===x)||n(`Runde ${g+1}: Knopf „${x}“ gibt es nicht.`);TB(f,h.clicks)}catch(f){if(f instanceof To)throw f;n(`Runde ${g+1}: ${f.message}`)}delete h.rightText}),i==="bombe"&&!(l&&l>0)&&n("„bombe“ braucht „zeit:“ mit den Sekunden je Runde."),{kind:i,title:a,intro:s,...i==="bombe"?{seconds:l,...u?{data:u}:{}}:{},rounds:m}}function Ch(i,e="",t=n=>{throw new To(n)}){const n=/^(grid|flow|border):\s*(.+)$/.exec(i);if(!n)return t(`${e}: Antwort „${i}“ ist kein Fensterbild (grid:, flow: oder border:).`);if(n[1]==="border"){const s={};for(const r of n[2].split(/\s+/)){const o=/^([NSWEC])=(.+)$/.exec(r);o||t(`${e}: „${r}“ im BorderLayout-Bild verstehe ich nicht (z. B. N=A).`),s[o[1]]=o[2]}return{kind:"border",areas:s}}const a=n[2].split("/").map(s=>s.trim().split(/\s+/).filter(Boolean));return{kind:n[1],rows:a}}const Za='"((?:[^"\\\\]|\\\\.)*)"';function Bh(i){const e=i.split(` -`),t={title:"",buttons:[],labels:[],ints:{},listeners:[]},n=new Map,a=(r,o,l)=>{if(o.startsWith("{")){let m=r+1;const c=[];for(;m=e.length)throw new Error(`Dem Zuhörer fehlt „${l}“.`);return{from:r,to:m,statements:Oo(c.join(" "))}}const u=l==="});"?o.replace(/\)\s*;\s*$/,""):o.replace(/;\s*$/,"");return{from:r,to:r,statements:Oo(u)}},s=r=>{if(!t.buttons.some(o=>o.name===r))throw new Error(`Knopf ${r} ist nicht angelegt.`);return r};for(let r=0;r\s*(.*)$/.exec(o)){const u=a(r,l[2],"};");n.set(l[1],u),r=u.to}else if(l=/^(\w+)\.addActionListener\(\s*(\w+)\s*\)\s*;$/.exec(o)){const u=n.get(l[2]);if(!u)throw new Error(`Zuhörer ${l[2]} ist nicht angelegt.`);t.listeners.push({button:s(l[1]),...u})}else if(l=/^(\w+)\.addActionListener\(\s*\w+\s*->\s*(.*)$/.exec(o)){const u=a(r,l[2],"});");t.listeners.push({button:s(l[1]),...u}),r=u.to}}return t}function Oo(i){const e=[];let t=0;const n=()=>{for(;t{let u=0,m=!1;const c=t+1;for(;t{let o=0,l=!1;const u=t;for(;t{if(n(),i[t]==="{")return Oo(a("{","}"));if(/^if\s*\(/.test(i.slice(t))){t=i.indexOf("(",t);const l=a("(",")").trim(),u=r();n();let m=[];return/^else\b/.test(i.slice(t))&&(t+=4,m=r()),[{condition:l,then:u,otherwise:m}]}const o=s();return o?[o]:[]};for(n();ta.caption===t)??i.buttons.find(a=>e.texts[a.name]===t);if(!n)throw new Error(`Knopf „${t}“ gibt es nicht.`);return Mh(i,e,n.name)}function Mh(i,e,t){const n=i.listeners.find(r=>r.button===t),a=[],s={source:t,command:e.texts[t]};for(const r of(n==null?void 0:n.statements)??[])Lh(r,e,a,s);return{button:t,listener:n,texts:{...e.texts},console:a}}function TB(i,e){const t=Dh(i);return e.map(n=>Zh(i,t,n))}function Lh(i,e,t,n){if(typeof i!="string"){for(const s of OB(i.condition,e,n)?i.then:i.otherwise)Lh(s,e,t,n);return}let a;if(a=/^(\w+)\.setText\((.*)\)$/.exec(i)){if(!(a[1]in e.texts))throw new Error(`${a[1]} ist keine Beschriftung und kein Knopf.`);e.texts[a[1]]=String(Qn(a[2],e,n))}else if(a=/^System\.out\.println\((.*)\)$/.exec(i))t.push(String(Qn(a[1],e,n)));else if(a=/^(\w+)\s*(\+\+|--)$/.exec(i))e.ints[Bu(a[1],e)]+=a[2]==="++"?1:-1;else if(a=/^(\w+)\s*([+-]?=)\s*(.+)$/.exec(i)){const s=Bu(a[1],e),r=Number(Qn(a[3],e,n));e.ints[s]=a[2]==="="?r:a[2]==="+="?e.ints[s]+r:e.ints[s]-r}else throw new Error(`Diese Anweisung kann das Spiel nicht nachspielen: „${i}“`)}function OB(i,e,t){let n;if(n=/^e\.getSource\(\)\s*(==|!=)\s*(\w+)$/.exec(i)){if(!(n[2]in e.texts))throw new Error(`${n[2]} ist kein Knopf.`);return t.source===n[2]==(n[1]==="==")}if(n=/^(!?)(.+)\.equals\((.+)\)$/.exec(i))return String(Qn(n[2],e,t))===String(Qn(n[3],e,t))!=(n[1]==="!");if(n=/^(.+?)\s*(==|!=|<=|>=|<|>)\s*(.+)$/.exec(i)){const a=Number(Qn(n[1],e,t)),s=Number(Qn(n[3],e,t));return{"==":a===s,"!=":a!==s,"<=":a<=s,">=":a>=s,"<":a":a>s}[n[2]]}throw new Error(`Diese Bedingung kann das Spiel nicht nachspielen: „${i}“`)}function Bu(i,e){if(!(i in e.ints))throw new Error(`Variable ${i} ist nicht angelegt.`);return i}function Qn(i,e,t){const n=i.match(new RegExp(`${Za}|\\d+|e\\.getActionCommand\\(\\)|\\w+(?:\\.getText\\(\\))?|[-+*/()]`,"g"))??[];let a=0;const s=()=>{const l=n[a++];if(l===void 0)throw new Error(`Unvollständiger Ausdruck „${i}“`);if(l==="("){const u=o();return a++,u}if(l.startsWith('"'))return JSON.parse(l);if(/^\d+$/.test(l))return Number(l);if(l==="e.getActionCommand()"){if(!t)throw new Error("e.getActionCommand() gibt es nur im Zuhörer.");return t.command}if(l.endsWith(".getText()"))return e.texts[l.slice(0,-10)]??"";if(l in e.ints)return e.ints[l];throw new Error(`Unbekannt: „${l}“`)},r=()=>{let l=s();for(;n[a]==="*"||n[a]==="/";){const u=n[a++],m=Number(s());l=u==="*"?Number(l)*m:Math.trunc(Number(l)/m)}return l},o=()=>{let l=r();for(;n[a]==="+"||n[a]==="-";){const u=n[a++],m=r();u==="+"?l=typeof l=="string"||typeof m=="string"?`${l}${m}`:l+m:l=Number(l)-Number(m)}return l};return o()}class AB extends Error{}const cs="___";function PB(i){const e=Array.from({length:i.rows},()=>Array(i.cols).fill(""));for(const t of i.words)[...t.word].forEach((n,a)=>e[t.row+(t.across?0:a)][t.col+(t.across?a:0)]=n);return e}function jB(i,e){const t=T=>{throw new AB(`${e}: ${T}`)},n=(T,j)=>{const B=/^(\d+)\s+(\d+)$/.exec(T.trim());return!B||Number(B[1])<1||Number(B[2])<1?t(`${j}: „${T}“ ist kein Feld (Zeile Spalte, ab 1).`):{row:Number(B[1])-1,col:Number(B[2])-1}};let a="",s="",r="ABCDEFGHIJKLMNOPQRSTUVWXYZ",o="",l="",u="",m="";const c=[],d=[];let h=[],g,f="start";for(const T of i){const j=T.trim();if(g&&(/^( {4}|\t)/.test(T)||j==="")){const P=T.replace(/^( {4}|\t)/,"");if(g==="station"){const A=c[c.length-1];A.code+=(A.code?` +`),x=h.wrongLine;(!x||!Number.isInteger(x)||x<1||x>f.length||!f[x-1].trim())&&n(`Runde ${g+1}: „fehler:“ muss eine Zeile des Codes sein.`),h.fix||n(`Runde ${g+1}: „besser:“ fehlt.`),h.options.length&&n(`Runde ${g+1}: Bei „bombe“ gibt es keine Antworten, man tippt auf die Zeile.`),h.question||n(`Runde ${g+1}: keine Frage.`);return}if(i==="reihenfolge"){h.options.length<3&&n(`Runde ${g+1}: „reihenfolge“ braucht mindestens drei Schritte.`),h.options.some(f=>f.right)&&n(`Runde ${g+1}: Bei „reihenfolge“ gibt es kein [x], die Schritte stehen der Reihe nach da.`),new Set(h.options.map(f=>f.text)).size!==h.options.length&&n(`Runde ${g+1}: zwei Schritte sind gleich.`),h.question||n(`Runde ${g+1}: keine Frage.`);return}if(h.options.length||(o.length||n(`Runde ${g+1}: keine Antworten.`),(!h.rightText||!o.includes(h.rightText))&&n(`Runde ${g+1}: „richtig:“ muss eine der Antworten sein.`),h.options=o.map(f=>({text:f,right:f===h.rightText}))),h.options.filter(f=>f.right).length!==1&&n(`Runde ${g+1}: genau eine Antwort muss richtig sein.`),h.question||n(`Runde ${g+1}: keine Frage.`),i==="layout"&&h.options.forEach(f=>Bh(f.text,`Runde ${g+1}`,n)),i==="zuhoerer")try{const f=Dh(h.code);for(const x of h.clicks)f.buttons.some(b=>b.caption===x)||n(`Runde ${g+1}: Knopf „${x}“ gibt es nicht.`);OB(f,h.clicks)}catch(f){if(f instanceof To)throw f;n(`Runde ${g+1}: ${f.message}`)}delete h.rightText}),i==="bombe"&&!(l&&l>0)&&n("„bombe“ braucht „zeit:“ mit den Sekunden je Runde."),{kind:i,title:a,intro:s,...i==="bombe"?{seconds:l,...u?{data:u}:{}}:{},rounds:m}}function Bh(i,e="",t=n=>{throw new To(n)}){const n=/^(grid|flow|border):\s*(.+)$/.exec(i);if(!n)return t(`${e}: Antwort „${i}“ ist kein Fensterbild (grid:, flow: oder border:).`);if(n[1]==="border"){const s={};for(const r of n[2].split(/\s+/)){const o=/^([NSWEC])=(.+)$/.exec(r);o||t(`${e}: „${r}“ im BorderLayout-Bild verstehe ich nicht (z. B. N=A).`),s[o[1]]=o[2]}return{kind:"border",areas:s}}const a=n[2].split("/").map(s=>s.trim().split(/\s+/).filter(Boolean));return{kind:n[1],rows:a}}const Za='"((?:[^"\\\\]|\\\\.)*)"';function Dh(i){const e=i.split(` +`),t={title:"",buttons:[],labels:[],ints:{},listeners:[]},n=new Map,a=(r,o,l)=>{if(o.startsWith("{")){let m=r+1;const c=[];for(;m=e.length)throw new Error(`Dem Zuhörer fehlt „${l}“.`);return{from:r,to:m,statements:Oo(c.join(" "))}}const u=l==="});"?o.replace(/\)\s*;\s*$/,""):o.replace(/;\s*$/,"");return{from:r,to:r,statements:Oo(u)}},s=r=>{if(!t.buttons.some(o=>o.name===r))throw new Error(`Knopf ${r} ist nicht angelegt.`);return r};for(let r=0;r\s*(.*)$/.exec(o)){const u=a(r,l[2],"};");n.set(l[1],u),r=u.to}else if(l=/^(\w+)\.addActionListener\(\s*(\w+)\s*\)\s*;$/.exec(o)){const u=n.get(l[2]);if(!u)throw new Error(`Zuhörer ${l[2]} ist nicht angelegt.`);t.listeners.push({button:s(l[1]),...u})}else if(l=/^(\w+)\.addActionListener\(\s*\w+\s*->\s*(.*)$/.exec(o)){const u=a(r,l[2],"});");t.listeners.push({button:s(l[1]),...u}),r=u.to}}return t}function Oo(i){const e=[];let t=0;const n=()=>{for(;t{let u=0,m=!1;const c=t+1;for(;t{let o=0,l=!1;const u=t;for(;t{if(n(),i[t]==="{")return Oo(a("{","}"));if(/^if\s*\(/.test(i.slice(t))){t=i.indexOf("(",t);const l=a("(",")").trim(),u=r();n();let m=[];return/^else\b/.test(i.slice(t))&&(t+=4,m=r()),[{condition:l,then:u,otherwise:m}]}const o=s();return o?[o]:[]};for(n();ta.caption===t)??i.buttons.find(a=>e.texts[a.name]===t);if(!n)throw new Error(`Knopf „${t}“ gibt es nicht.`);return Lh(i,e,n.name)}function Lh(i,e,t){const n=i.listeners.find(r=>r.button===t),a=[],s={source:t,command:e.texts[t]};for(const r of(n==null?void 0:n.statements)??[])Wh(r,e,a,s);return{button:t,listener:n,texts:{...e.texts},console:a}}function OB(i,e){const t=Zh(i);return e.map(n=>Mh(i,t,n))}function Wh(i,e,t,n){if(typeof i!="string"){for(const s of AB(i.condition,e,n)?i.then:i.otherwise)Wh(s,e,t,n);return}let a;if(a=/^(\w+)\.setText\((.*)\)$/.exec(i)){if(!(a[1]in e.texts))throw new Error(`${a[1]} ist keine Beschriftung und kein Knopf.`);e.texts[a[1]]=String(Qn(a[2],e,n))}else if(a=/^System\.out\.println\((.*)\)$/.exec(i))t.push(String(Qn(a[1],e,n)));else if(a=/^(\w+)\s*(\+\+|--)$/.exec(i))e.ints[Bu(a[1],e)]+=a[2]==="++"?1:-1;else if(a=/^(\w+)\s*([+-]?=)\s*(.+)$/.exec(i)){const s=Bu(a[1],e),r=Number(Qn(a[3],e,n));e.ints[s]=a[2]==="="?r:a[2]==="+="?e.ints[s]+r:e.ints[s]-r}else throw new Error(`Diese Anweisung kann das Spiel nicht nachspielen: „${i}“`)}function AB(i,e,t){let n;if(n=/^e\.getSource\(\)\s*(==|!=)\s*(\w+)$/.exec(i)){if(!(n[2]in e.texts))throw new Error(`${n[2]} ist kein Knopf.`);return t.source===n[2]==(n[1]==="==")}if(n=/^(!?)(.+)\.equals\((.+)\)$/.exec(i))return String(Qn(n[2],e,t))===String(Qn(n[3],e,t))!=(n[1]==="!");if(n=/^(.+?)\s*(==|!=|<=|>=|<|>)\s*(.+)$/.exec(i)){const a=Number(Qn(n[1],e,t)),s=Number(Qn(n[3],e,t));return{"==":a===s,"!=":a!==s,"<=":a<=s,">=":a>=s,"<":a":a>s}[n[2]]}throw new Error(`Diese Bedingung kann das Spiel nicht nachspielen: „${i}“`)}function Bu(i,e){if(!(i in e.ints))throw new Error(`Variable ${i} ist nicht angelegt.`);return i}function Qn(i,e,t){const n=i.match(new RegExp(`${Za}|\\d+|e\\.getActionCommand\\(\\)|\\w+(?:\\.getText\\(\\))?|[-+*/()]`,"g"))??[];let a=0;const s=()=>{const l=n[a++];if(l===void 0)throw new Error(`Unvollständiger Ausdruck „${i}“`);if(l==="("){const u=o();return a++,u}if(l.startsWith('"'))return JSON.parse(l);if(/^\d+$/.test(l))return Number(l);if(l==="e.getActionCommand()"){if(!t)throw new Error("e.getActionCommand() gibt es nur im Zuhörer.");return t.command}if(l.endsWith(".getText()"))return e.texts[l.slice(0,-10)]??"";if(l in e.ints)return e.ints[l];throw new Error(`Unbekannt: „${l}“`)},r=()=>{let l=s();for(;n[a]==="*"||n[a]==="/";){const u=n[a++],m=Number(s());l=u==="*"?Number(l)*m:Math.trunc(Number(l)/m)}return l},o=()=>{let l=r();for(;n[a]==="+"||n[a]==="-";){const u=n[a++],m=r();u==="+"?l=typeof l=="string"||typeof m=="string"?`${l}${m}`:l+m:l=Number(l)-Number(m)}return l};return o()}class PB extends Error{}const cs="___";function jB(i){const e=Array.from({length:i.rows},()=>Array(i.cols).fill(""));for(const t of i.words)[...t.word].forEach((n,a)=>e[t.row+(t.across?0:a)][t.col+(t.across?a:0)]=n);return e}function CB(i,e){const t=T=>{throw new PB(`${e}: ${T}`)},n=(T,j)=>{const C=/^(\d+)\s+(\d+)$/.exec(T.trim());return!C||Number(C[1])<1||Number(C[2])<1?t(`${j}: „${T}“ ist kein Feld (Zeile Spalte, ab 1).`):{row:Number(C[1])-1,col:Number(C[2])-1}};let a="",s="",r="ABCDEFGHIJKLMNOPQRSTUVWXYZ",o="",l="",u="",m="";const c=[],d=[];let h=[],g,f="start";for(const T of i){const j=T.trim();if(g&&(/^( {4}|\t)/.test(T)||j==="")){const P=T.replace(/^( {4}|\t)/,"");if(g==="station"){const O=c[c.length-1];O.code+=(O.code?` `:"")+P}else u+=(u?` -`:"")+P;continue}if(g=void 0,!j)continue;const B=/^(titel|intro|alphabet|station|frage|zahl|feld|tipp|kreuzwort|lösung|loesung|tor|ende):\s*(.*)$/.exec(j);if(B){const[,P,A]=B;if(P==="station")c.push({name:A,code:"",question:"",hint:"",explanation:""}),f="station",g="station";else if(P==="kreuzwort")o=A,f="crossword";else if(P==="tor")l=A,f="gate",g="gate";else if(P==="titel")a=A;else if(P==="intro")s=A;else if(P==="alphabet")r=A;else if(P==="ende")m=A;else if(P==="lösung"||P==="loesung")f!=="crossword"&&t("„lösung:“ gehört zum Kreuzworträtsel."),h=A.split(",").map(W=>n(W,"lösung"));else{f!=="station"&&t(`„${P}:“ gehört in eine Station.`);const W=c[c.length-1];P==="frage"?W.question=A:P==="tipp"?W.hint=A:P==="zahl"?W.answer=/^-?\d+$/.test(A)?Number(A):t(`Station „${W.name}“: „zahl:“ muss eine ganze Zahl sein.`):Object.assign(W,n(A,`Station „${W.name}“`))}continue}if(f==="crossword"){const P=/^-\s+([→↓])\s+(\d+)\s+(\d+)\s+([A-ZÄÖÜ]+):\s*(.+)$/u.exec(j);P||t(`Kreuzworträtsel: „${j}“ verstehe ich nicht (z. B. „- → 1 3 STRING: Hinweis“).`),d.push({across:P[1]==="→",row:Number(P[2])-1,col:Number(P[3])-1,word:P[4],clue:P[5]});continue}if(f==="station"&&j.startsWith(">")){const P=c[c.length-1];P.explanation+=(P.explanation?" ":"")+j.slice(1).trim();continue}t(`Unbekannte Zeile im Spiel: „${j}“`)}a||t("Das Spiel braucht eine Zeile „titel:“."),c.length||t("Das Spiel braucht mindestens eine „station:“."),d.length||t("Das Spiel braucht ein „kreuzwort:“ mit Wörtern."),h.length||t("Das Kreuzworträtsel braucht eine Zeile „lösung:“."),u.includes(cs)||t(`Der Code bei „tor:“ braucht ${cs} für das Eingabefeld.`),new Set(r).size!==r.length&&t("Im Alphabet kommt ein Zeichen doppelt vor.");const x=Math.max(...d.map(T=>T.row+(T.across?1:T.word.length))),b=Math.max(...d.map(T=>T.col+(T.across?T.word.length:1))),y=Array.from({length:x},()=>Array(b).fill(""));for(const T of d)[...T.word].forEach((j,B)=>{const P=T.row+(T.across?0:B),A=T.col+(T.across?B:0);y[P][A]&&y[P][A]!==j&&t(`Kreuzworträtsel: ${T.word} passt in Zeile ${P+1}, Spalte ${A+1} nicht (dort steht ${y[P][A]}).`),y[P][A]=j});const w=[...new Set(d.map(T=>T.row*b+T.col))].sort((T,j)=>T-j),_=d.map(T=>({...T,number:w.indexOf(T.row*b+T.col)+1})),z=(T,j)=>{var B;return((B=y[T])==null?void 0:B[j])??""},S=h.map(({row:T,col:j})=>z(T,j)||t(`lösung: In Zeile ${T+1}, Spalte ${j+1} ist kein Feld.`)).join(""),k=c.map(T=>{T.code||t(`Station „${T.name}“: Code fehlt.`),T.question||t(`Station „${T.name}“: „frage:“ fehlt.`),T.answer===void 0&&t(`Station „${T.name}“: „zahl:“ fehlt.`),T.row===void 0&&t(`Station „${T.name}“: „feld:“ fehlt.`);const j=r.charAt(T.answer);j||t(`Station „${T.name}“: alphabet.charAt(${T.answer}) gibt es nicht.`);const B=z(T.row,T.col);return B!==j&&t(`Station „${T.name}“: alphabet.charAt(${T.answer}) ist ${j}, im Feld ${T.row+1} ${T.col+1} steht aber „${B}“.`),T.code=T.code.replace(/\n+$/,""),T});return{title:a,intro:s,alphabet:r,stations:k,crosswordText:o,rows:x,cols:b,words:_,solution:h,keyword:S,gateText:l,gateCode:u.replace(/\n+$/,""),end:m}}const CB=/\[\[(.+?)\]\]/g;function BB(i,e){const t={title:"",task:"",blocks:[]},n=[];let a=!1;for(const s of i){if(/^\s*```/.test(s)){a||n.push([]),a=!a;continue}if(a){n[n.length-1].push(s.replace(/\s+$/,""));continue}const r=s.trim();if(!r)continue;const o=/^([a-zäöü]+):\s*(.*)$/i.exec(r);if(!o)throw new Error(`${e}: Unbekannte Zeile im Lückentext: „${r}“.`);const l=o[2].trim();switch(o[1].toLowerCase()){case"titel":t.title=l;break;case"auftrag":t.task=l;break;case"erklärung":case"erklaerung":t.explanation=l;break;default:throw new Error(`${e}: Unbekannter Schlüssel „${o[1]}“ im Lückentext.`)}}if(a)throw new Error(`${e}: Der Codeblock im Lückentext wird nicht mit \`\`\` geschlossen.`);if(!t.title)throw new Error(`${e}: Ein Lückentext braucht einen Titel.`);if(!n.some(s=>s.some(r=>r.trim())))throw new Error(`${e}: Lückentext „${t.title}“ braucht einen Codeblock.`);if(t.blocks=n.map(s=>{const r=Math.min(...s.filter(o=>o.trim()).map(o=>/^ */.exec(o)[0].length));return s.map(o=>DB(o.slice(r),e,t.title))}),!ZB(t).length)throw new Error(`${e}: Lückentext „${t.title}“ braucht mindestens eine Lücke [[…]].`);return t}function DB(i,e,t){const n=[];let a=0;for(const s of i.matchAll(CB)){s.index>a&&n.push(i.slice(a,s.index));const r=s[1].split(/\s+\|\s+/).map(o=>o.trim()).filter(Boolean);if(!r.length)throw new Error(`${e}: Leere Lücke im Lückentext „${t}“.`);n.push({answers:r}),a=s.index+s[0].length}if(atypeof s=="string"&&(s.includes("[[")||s.includes("]]"))))throw new Error(`${e}: Unvollständige Lücke im Lückentext „${t}“: „${i}“.`);return n}function ZB(i){return i.blocks.flat().flatMap(e=>e.flatMap(t=>typeof t=="string"?[]:[t.answers]))}function MB(i,e){const t=n=>n.replace(/\s+/g,"");return t(e)!==""&&i.some(n=>t(n)===t(e))}class K extends Error{}function Wh(i,e){const t=/^---\n([\s\S]*?)\n---\n?/.exec(i.replace(/\r\n/g,` -`));if(!t)throw new K(`${e}: Kopfzeilen (--- … ---) fehlen.`);const n=new Map;for(const a of t[1].split(` +`:"")+P;continue}if(g=void 0,!j)continue;const C=/^(titel|intro|alphabet|station|frage|zahl|feld|tipp|kreuzwort|lösung|loesung|tor|ende):\s*(.*)$/.exec(j);if(C){const[,P,O]=C;if(P==="station")c.push({name:O,code:"",question:"",hint:"",explanation:""}),f="station",g="station";else if(P==="kreuzwort")o=O,f="crossword";else if(P==="tor")l=O,f="gate",g="gate";else if(P==="titel")a=O;else if(P==="intro")s=O;else if(P==="alphabet")r=O;else if(P==="ende")m=O;else if(P==="lösung"||P==="loesung")f!=="crossword"&&t("„lösung:“ gehört zum Kreuzworträtsel."),h=O.split(",").map(L=>n(L,"lösung"));else{f!=="station"&&t(`„${P}:“ gehört in eine Station.`);const L=c[c.length-1];P==="frage"?L.question=O:P==="tipp"?L.hint=O:P==="zahl"?L.answer=/^-?\d+$/.test(O)?Number(O):t(`Station „${L.name}“: „zahl:“ muss eine ganze Zahl sein.`):Object.assign(L,n(O,`Station „${L.name}“`))}continue}if(f==="crossword"){const P=/^-\s+([→↓])\s+(\d+)\s+(\d+)\s+([A-ZÄÖÜ]+):\s*(.+)$/u.exec(j);P||t(`Kreuzworträtsel: „${j}“ verstehe ich nicht (z. B. „- → 1 3 STRING: Hinweis“).`),d.push({across:P[1]==="→",row:Number(P[2])-1,col:Number(P[3])-1,word:P[4],clue:P[5]});continue}if(f==="station"&&j.startsWith(">")){const P=c[c.length-1];P.explanation+=(P.explanation?" ":"")+j.slice(1).trim();continue}t(`Unbekannte Zeile im Spiel: „${j}“`)}a||t("Das Spiel braucht eine Zeile „titel:“."),c.length||t("Das Spiel braucht mindestens eine „station:“."),d.length||t("Das Spiel braucht ein „kreuzwort:“ mit Wörtern."),h.length||t("Das Kreuzworträtsel braucht eine Zeile „lösung:“."),u.includes(cs)||t(`Der Code bei „tor:“ braucht ${cs} für das Eingabefeld.`),new Set(r).size!==r.length&&t("Im Alphabet kommt ein Zeichen doppelt vor.");const x=Math.max(...d.map(T=>T.row+(T.across?1:T.word.length))),b=Math.max(...d.map(T=>T.col+(T.across?T.word.length:1))),y=Array.from({length:x},()=>Array(b).fill(""));for(const T of d)[...T.word].forEach((j,C)=>{const P=T.row+(T.across?0:C),O=T.col+(T.across?C:0);y[P][O]&&y[P][O]!==j&&t(`Kreuzworträtsel: ${T.word} passt in Zeile ${P+1}, Spalte ${O+1} nicht (dort steht ${y[P][O]}).`),y[P][O]=j});const w=[...new Set(d.map(T=>T.row*b+T.col))].sort((T,j)=>T-j),S=d.map(T=>({...T,number:w.indexOf(T.row*b+T.col)+1})),z=(T,j)=>{var C;return((C=y[T])==null?void 0:C[j])??""},k=h.map(({row:T,col:j})=>z(T,j)||t(`lösung: In Zeile ${T+1}, Spalte ${j+1} ist kein Feld.`)).join(""),_=c.map(T=>{T.code||t(`Station „${T.name}“: Code fehlt.`),T.question||t(`Station „${T.name}“: „frage:“ fehlt.`),T.answer===void 0&&t(`Station „${T.name}“: „zahl:“ fehlt.`),T.row===void 0&&t(`Station „${T.name}“: „feld:“ fehlt.`);const j=r.charAt(T.answer);j||t(`Station „${T.name}“: alphabet.charAt(${T.answer}) gibt es nicht.`);const C=z(T.row,T.col);return C!==j&&t(`Station „${T.name}“: alphabet.charAt(${T.answer}) ist ${j}, im Feld ${T.row+1} ${T.col+1} steht aber „${C}“.`),T.code=T.code.replace(/\n+$/,""),T});return{title:a,intro:s,alphabet:r,stations:_,crosswordText:o,rows:x,cols:b,words:S,solution:h,keyword:k,gateText:l,gateCode:u.replace(/\n+$/,""),end:m}}const BB=/\[\[(.+?)\]\]/g;function DB(i,e){const t={title:"",task:"",blocks:[]},n=[];let a=!1;for(const s of i){if(/^\s*```/.test(s)){a||n.push([]),a=!a;continue}if(a){n[n.length-1].push(s.replace(/\s+$/,""));continue}const r=s.trim();if(!r)continue;const o=/^([a-zäöü]+):\s*(.*)$/i.exec(r);if(!o)throw new Error(`${e}: Unbekannte Zeile im Lückentext: „${r}“.`);const l=o[2].trim();switch(o[1].toLowerCase()){case"titel":t.title=l;break;case"auftrag":t.task=l;break;case"erklärung":case"erklaerung":t.explanation=l;break;default:throw new Error(`${e}: Unbekannter Schlüssel „${o[1]}“ im Lückentext.`)}}if(a)throw new Error(`${e}: Der Codeblock im Lückentext wird nicht mit \`\`\` geschlossen.`);if(!t.title)throw new Error(`${e}: Ein Lückentext braucht einen Titel.`);if(!n.some(s=>s.some(r=>r.trim())))throw new Error(`${e}: Lückentext „${t.title}“ braucht einen Codeblock.`);if(t.blocks=n.map(s=>{const r=Math.min(...s.filter(o=>o.trim()).map(o=>/^ */.exec(o)[0].length));return s.map(o=>ZB(o.slice(r),e,t.title))}),!MB(t).length)throw new Error(`${e}: Lückentext „${t.title}“ braucht mindestens eine Lücke [[…]].`);return t}function ZB(i,e,t){const n=[];let a=0;for(const s of i.matchAll(BB)){s.index>a&&n.push(i.slice(a,s.index));const r=s[1].split(/\s+\|\s+/).map(o=>o.trim()).filter(Boolean);if(!r.length)throw new Error(`${e}: Leere Lücke im Lückentext „${t}“.`);n.push({answers:r}),a=s.index+s[0].length}if(atypeof s=="string"&&(s.includes("[[")||s.includes("]]"))))throw new Error(`${e}: Unvollständige Lücke im Lückentext „${t}“: „${i}“.`);return n}function MB(i){return i.blocks.flat().flatMap(e=>e.flatMap(t=>typeof t=="string"?[]:[t.answers]))}function LB(i,e){const t=n=>n.replace(/\s+/g,"");return t(e)!==""&&i.some(n=>t(n)===t(e))}class te extends Error{}function Eh(i,e){const t=/^---\n([\s\S]*?)\n---\n?/.exec(i.replace(/\r\n/g,` +`));if(!t)throw new te(`${e}: Kopfzeilen (--- … ---) fehlen.`);const n=new Map;for(const a of t[1].split(` `)){const s=/^([a-zäöüß]+):\s*(.*)$/i.exec(a.trim());s&&n.set(s[1].toLowerCase(),s[2].trim())}return{meta:n,body:i.replace(/\r\n/g,` -`).slice(t[0].length)}}function LB(i,e){const t=i.split(/\s*(?:->|→)\s*/);if(t.length!==2)throw new K(`${e}: Test „${i}“ braucht genau ein „->“.`);const n=(a,s)=>a.trim()===""||a.trim()==="-"?[]:a.split(s).map(r=>r.trim());return{inputs:n(t[0],/\s*,\s*/),expected:n(t[1],/\s*\|\s*/)}}function WB(i){const e=/^(.*?)\s*(?:->|→)\s*(.*)$/.exec(i.trim());if(!e)throw new Error(`„messwerte: ${i}“ braucht ein „->“.`);const t={};for(const n of e[1].split(/\s*,\s*/).filter(Boolean)){const a=/^(\w+)\s*=\s*(.+)$/.exec(n);if(!a||!(a[1]in St))throw new Error(`Unbekannter Sensor in „${n}“.`);t[a[1]]=a[2].split("/").map(s=>{const r=s.trim();if(r==="true"||r==="false")return r==="true";if(/^-?\d+(\.\d+)?$/.test(r))return Number(r);if(typeof St[a[1]].simulated=="string")return r;throw new Error(`Messwert „${r}“ ist keine Zahl und nicht true/false.`)})}return Eh({inputs:[],expected:[],sensors:t},e[2])}function Eh(i,e){const t=[];e=e.replace(/\bscreen\s+("(?:[^"\\]|\\.)*")/u,(n,a)=>(i.screen=JSON.parse(a),""));for(const n of e.split(/\s*,\s*/).filter(Boolean))n==="ledOn"||n==="ledOff"?i.led=n==="ledOn":n==="tone"||n==="noTone"?i.tone=n==="tone":n==="none"?i.drive=[]:n==="drives"?i.drives=!0:t.push(n);return t.length&&(i.drive=es(th(t.join(", ")))),i}function EB(i,e,t){const n={id:i,title:"",task:"",tests:[],requires:[],hints:[],subprograms:[]};let a;for(const s of e){const r=/^(titel|auftrag|start|test|datei|fahrt|befehle|welt|messwerte|schleifentiefe|braucht|tipp|lösung|loesung|unterprogramm|code):\s*(.*)$/i.exec(s.trim());if(r){const[,o,l]=r;switch(a=void 0,o.toLowerCase()){case"titel":n.title=l;break;case"auftrag":n.task=l,a="task";break;case"start":n.start=l;break;case"test":n.tests.push(LB(l,t));break;case"datei":{const u=/^([\w.-]+)\s*(?:->|→)\s*(.*)$/.exec(l.trim());if(!u||!n.tests.length)throw new K(`${t}: Übung „${i}“: „datei:“ braucht vorher einen Test und die Form „name.txt -> Zeile | Zeile“.`);const m=n.tests[n.tests.length-1];m.files=[...m.files??[],{name:u[1],lines:u[2].trim()===""?[]:u[2].split(/\s*\|\s*/).map(c=>c.trim())}];break}case"fahrt":try{n.tests.push({inputs:[],expected:[],drive:es(th(l))})}catch(u){throw new K(`${t}: Übung „${i}“: ${u.message}`)}break;case"welt":{const u=/^([\w-]+)\s*(?:->|→)\s*(.+)$/.exec(l.trim());if(u){try{n.tests.push(Eh({inputs:[],expected:[],world:u[1]},u[2]))}catch(m){throw new K(`${t}: Übung „${i}“: ${m.message}`)}break}for(const m of l.split(/\s*,\s*/).filter(Boolean)){if(!/^[\w-]+$/.test(m))throw new K(`${t}: Übung „${i}“: Weltname „${m}“ (nur Buchstaben, Ziffern, -).`);n.tests.push({inputs:[],expected:[],world:m})}break}case"befehle":try{n.tests.push({inputs:[],expected:[],actions:i3(l)})}catch(u){throw new K(`${t}: Übung „${i}“: ${u.message}`)}break;case"messwerte":try{n.tests.push(WB(l))}catch(u){throw new K(`${t}: Übung „${i}“: ${u.message}`)}break;case"schleifentiefe":if(n.loopDepth=Number(l),!Number.isInteger(n.loopDepth)||n.loopDepth<1)throw new K(`${t}: Übung „${i}“: „schleifentiefe:“ braucht eine Zahl ab 1.`);break;case"braucht":n.requires.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"tipp":n.hints.push(l),a="hint";break;case"lösung":case"loesung":n.solution=l;break;case"unterprogramm":n.subprograms.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"code":if(l.trim().toLowerCase()!=="java")throw new K(`${t}: Übung „${i}“: „code:“ kennt nur „java“.`);n.code="java";break}}else a&&s.trim()!==""?a==="task"?n.task+=` +`).slice(t[0].length)}}function WB(i,e){const t=i.split(/\s*(?:->|→)\s*/);if(t.length!==2)throw new te(`${e}: Test „${i}“ braucht genau ein „->“.`);const n=(a,s)=>a.trim()===""||a.trim()==="-"?[]:a.split(s).map(r=>r.trim());return{inputs:n(t[0],/\s*,\s*/),expected:n(t[1],/\s*\|\s*/)}}function EB(i){const e=/^(.*?)\s*(?:->|→)\s*(.*)$/.exec(i.trim());if(!e)throw new Error(`„messwerte: ${i}“ braucht ein „->“.`);const t={};for(const n of e[1].split(/\s*,\s*/).filter(Boolean)){const a=/^(\w+)\s*=\s*(.+)$/.exec(n);if(!a||!(a[1]in St))throw new Error(`Unbekannter Sensor in „${n}“.`);t[a[1]]=a[2].split("/").map(s=>{const r=s.trim();if(r==="true"||r==="false")return r==="true";if(/^-?\d+(\.\d+)?$/.test(r))return Number(r);if(typeof St[a[1]].simulated=="string")return r;throw new Error(`Messwert „${r}“ ist keine Zahl und nicht true/false.`)})}return Nh({inputs:[],expected:[],sensors:t},e[2])}function Nh(i,e){const t=[];e=e.replace(/\bscreen\s+("(?:[^"\\]|\\.)*")/u,(n,a)=>(i.screen=JSON.parse(a),""));for(const n of e.split(/\s*,\s*/).filter(Boolean))n==="ledOn"||n==="ledOff"?i.led=n==="ledOn":n==="tone"||n==="noTone"?i.tone=n==="tone":n==="none"?i.drive=[]:n==="drives"?i.drives=!0:t.push(n);return t.length&&(i.drive=es(nh(t.join(", ")))),i}function NB(i,e,t){const n={id:i,title:"",task:"",tests:[],requires:[],hints:[],subprograms:[]};let a;for(const s of e){const r=/^(titel|auftrag|start|test|datei|fahrt|befehle|welt|messwerte|schleifentiefe|braucht|tipp|lösung|loesung|unterprogramm|code):\s*(.*)$/i.exec(s.trim());if(r){const[,o,l]=r;switch(a=void 0,o.toLowerCase()){case"titel":n.title=l;break;case"auftrag":n.task=l,a="task";break;case"start":n.start=l;break;case"test":n.tests.push(WB(l,t));break;case"datei":{const u=/^([\w.-]+)\s*(?:->|→)\s*(.*)$/.exec(l.trim());if(!u||!n.tests.length)throw new te(`${t}: Übung „${i}“: „datei:“ braucht vorher einen Test und die Form „name.txt -> Zeile | Zeile“.`);const m=n.tests[n.tests.length-1];m.files=[...m.files??[],{name:u[1],lines:u[2].trim()===""?[]:u[2].split(/\s*\|\s*/).map(c=>c.trim())}];break}case"fahrt":try{n.tests.push({inputs:[],expected:[],drive:es(nh(l))})}catch(u){throw new te(`${t}: Übung „${i}“: ${u.message}`)}break;case"welt":{const u=/^([\w-]+)\s*(?:->|→)\s*(.+)$/.exec(l.trim());if(u){try{n.tests.push(Nh({inputs:[],expected:[],world:u[1]},u[2]))}catch(m){throw new te(`${t}: Übung „${i}“: ${m.message}`)}break}for(const m of l.split(/\s*,\s*/).filter(Boolean)){if(!/^[\w-]+$/.test(m))throw new te(`${t}: Übung „${i}“: Weltname „${m}“ (nur Buchstaben, Ziffern, -).`);n.tests.push({inputs:[],expected:[],world:m})}break}case"befehle":try{n.tests.push({inputs:[],expected:[],actions:a3(l)})}catch(u){throw new te(`${t}: Übung „${i}“: ${u.message}`)}break;case"messwerte":try{n.tests.push(EB(l))}catch(u){throw new te(`${t}: Übung „${i}“: ${u.message}`)}break;case"schleifentiefe":if(n.loopDepth=Number(l),!Number.isInteger(n.loopDepth)||n.loopDepth<1)throw new te(`${t}: Übung „${i}“: „schleifentiefe:“ braucht eine Zahl ab 1.`);break;case"braucht":n.requires.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"tipp":n.hints.push(l),a="hint";break;case"lösung":case"loesung":n.solution=l;break;case"unterprogramm":n.subprograms.push(...l.split(/\s*,\s*/).filter(Boolean));break;case"code":if(l.trim().toLowerCase()!=="java")throw new te(`${t}: Übung „${i}“: „code:“ kennt nur „java“.`);n.code="java";break}}else a&&s.trim()!==""?a==="task"?n.task+=` `+s.trim():n.hints[n.hints.length-1]+=` `+s.trim():s.trim()===""&&a==="task"&&(n.task+=` -`)}if(!n.title)throw new K(`${t}: Übung „${i}“ hat keinen Titel.`);if(!n.task.trim())throw new K(`${t}: Übung „${i}“ hat keinen Auftrag.`);return n.task=n.task.trim(),n}function NB(i,e){const t=[];for(const n of i){const a=n.trim();if(a.startsWith("?"))t.push({question:a.slice(1).trim(),options:[]});else if(/^- \[[ xX]\]/.test(a)){const s=t.at(-1);if(!s)throw new K(`${e}: Antwort ohne Frage im Quiz.`);s.options.push({text:a.slice(5).trim(),correct:a[3].toLowerCase()==="x"})}else if(a.startsWith("= ")){const s=t.at(-1),r=/^=\s+(.+?)\s+->\s+(.+)$/.exec(a);if(!s||!r)throw new K(`${e}: Zuordnung „${a}“ braucht die Form „= links -> rechts“ nach einer Frage.`);(s.pairs??(s.pairs=[])).push({left:r[1].trim(),right:r[2].trim()})}else if(a.startsWith(">")){const s=t.at(-1);s&&(s.explanation=((s.explanation?s.explanation+" ":"")+a.slice(1).trim()).trim())}}for(const n of t){if(n.pairs){const a=new Set(n.pairs.map(s=>s.right));if(n.options.length>0||n.pairs.length<2||a.size!==n.pairs.length)throw new K(`${e}: Zuordnung „${n.question}“ braucht mindestens zwei Paare mit verschiedenen rechten Seiten und keine Antworten.`);continue}if(n.options.length<2||!n.options.some(a=>a.correct))throw new K(`${e}: Quizfrage „${n.question}“ braucht mindestens zwei Antworten, davon eine richtige.`)}return t}function Nh(i,e){const t=[],n=i.split(` +`)}if(!n.title)throw new te(`${t}: Übung „${i}“ hat keinen Titel.`);if(!n.task.trim())throw new te(`${t}: Übung „${i}“ hat keinen Auftrag.`);return n.task=n.task.trim(),n}function FB(i,e){const t=[];for(const n of i){const a=n.trim();if(a.startsWith("?"))t.push({question:a.slice(1).trim(),options:[]});else if(/^- \[[ xX]\]/.test(a)){const s=t.at(-1);if(!s)throw new te(`${e}: Antwort ohne Frage im Quiz.`);s.options.push({text:a.slice(5).trim(),correct:a[3].toLowerCase()==="x"})}else if(a.startsWith("= ")){const s=t.at(-1),r=/^=\s+(.+?)\s+->\s+(.+)$/.exec(a);if(!s||!r)throw new te(`${e}: Zuordnung „${a}“ braucht die Form „= links -> rechts“ nach einer Frage.`);(s.pairs??(s.pairs=[])).push({left:r[1].trim(),right:r[2].trim()})}else if(a.startsWith(">")){const s=t.at(-1);s&&(s.explanation=((s.explanation?s.explanation+" ":"")+a.slice(1).trim()).trim())}}for(const n of t){if(n.pairs){const a=new Set(n.pairs.map(s=>s.right));if(n.options.length>0||n.pairs.length<2||a.size!==n.pairs.length)throw new te(`${e}: Zuordnung „${n.question}“ braucht mindestens zwei Paare mit verschiedenen rechten Seiten und keine Antworten.`);continue}if(n.options.length<2||!n.options.some(a=>a.correct))throw new te(`${e}: Quizfrage „${n.question}“ braucht mindestens zwei Antworten, davon eine richtige.`)}return t}function Fh(i,e){const t=[],n=i.split(` `);let a=[];const s=()=>{const r=a.join(` -`).trim();r&&t.push({kind:"markdown",text:r}),a=[]};for(let r=0;r=n.length)throw new K(`${e}: Block „::: ${o[1]}“ wird nicht mit „:::“ geschlossen.`);const m=o[1].toLowerCase(),c=o[2].trim();switch(m){case"diagramm":if(!c)throw new K(`${e}: „::: diagramm“ braucht einen Dateinamen.`);t.push({kind:"diagram",file:c,caption:l.join(" ").trim()});break;case"übung":case"uebung":if(!c)throw new K(`${e}: „::: übung“ braucht eine Kennung.`);t.push({kind:"exercise",exercise:EB(c,l,e)});break;case"checkliste":t.push({kind:"checklist",items:l.map(d=>d.trim()).filter(d=>d.startsWith("- ")).map(d=>FB(d.slice(2).trim()))});break;case"quiz":t.push({kind:"quiz",questions:NB(l,e)});break;case"bild":if(!c)throw new K(`${e}: „::: bild“ braucht einen Dateinamen.`);t.push({kind:"images",files:c.split(/\s+/),caption:l.join(" ").trim()});break;case"grafik":if(!c)throw new K(`${e}: „::: grafik“ braucht einen Dateinamen.`);t.push({kind:"graphic",file:c,caption:l.join(" ").trim()});break;case"angeberwissen":t.push({kind:"brag",text:l.join(` -`).trim()});break;case"spiel":try{if(SB(c))t.push({kind:"roundGame",game:_B(c,l,e)});else if(c==="prinzessin")t.push({kind:"rescueGame",game:jB(l,e)});else{if(c)throw new K(`${e}: Unbekanntes Spiel „${c}“ (zuhoerer, vertrag, layout, bombe, frage, reihenfolge oder prinzessin).`);t.push({kind:"game",game:Rx(l,e)})}}catch(d){throw new K(d.message)}break;case"lückentext":case"lueckentext":try{t.push({kind:"cloze",cloze:BB(l,e)})}catch(d){throw new K(d.message)}break;case"ludwig":t.push({kind:"brag",text:l.join(` -`).trim(),tip:!0});break;case"caesar":{const d=c?Number(c):3;if(!Number.isInteger(d)||d<0||d>25)throw new K(`${e}: „::: caesar“ braucht einen Schlüssel von 0 bis 25.`);t.push({kind:"caesar",key:d,text:l.join(" ").trim()});break}case"mbot2":{const d={kind:"robotModel",focus:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*(fokus|focus|ansicht|view|drehen|spin):\s*(.*)$/i.exec(h);if(!g)throw new K(`${e}: „::: mbot2“ kennt nur Zeilen „fokus:“, „ansicht:“ und „drehen:“.`);const f=g[1].toLowerCase();f==="fokus"||f==="focus"?d.focus=Du(g[2],e):f==="ansicht"||f==="view"?d.view=g[2].trim().toLowerCase():d.spin=/^(ja|yes|true|sim)$/i.test(g[2].trim())}t.push(d);break}case"mbot2quiz":{const d={kind:"robotQuiz",tasks:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*-\s*(\w+)\s*:\s*(.+)$/.exec(h),f=/^\s*(fertig|done):\s*(.+)$/i.exec(h);if(g)d.tasks.push({part:Du(g[1],e)[0],question:g[2].trim()});else if(f)d.done=f[2].trim();else throw new K(`${e}: „::: mbot2quiz“ braucht Zeilen „- teil: Frage“ und optional „fertig: Text“.`)}if(!d.tasks.length)throw new K(`${e}: „::: mbot2quiz“ hat keine Fragen.`);t.push(d);break}case"datei":{if(!/^[\w.-]+\.(txt|csv|json)$/u.test(c))throw new K(`${e}: „::: datei“ braucht einen Dateinamen wie brief.txt, liste.csv oder daten.json.`);for(;l.length&&l[0].trim()==="";)l.shift();for(;l.length&&l[l.length-1].trim()==="";)l.pop();t.push({kind:"textFile",name:c,content:l.join(` -`)});break}default:throw new K(`${e}: Unbekannter Block „::: ${o[1]}“.`)}r=u}return s(),t}function FB(i){const e=/^(.*?)\s+→\s+(.+)$/.exec(i);return e?{text:e[1],ref:e[2].trim()}:{text:i}}function JB(i,e){const t=new Map(i.map((n,a)=>[n.title.toLowerCase(),a]));for(const n of i.flatMap(a=>a.blocks))if(n.kind==="checklist"){for(const a of n.items)if(a.ref!==void 0&&(a.step=t.get(a.ref.toLowerCase()),a.step===void 0))throw new K(`${e}: Checkliste verweist auf unbekannten Schritt „${a.ref}“.`)}}function RB(i,e){var c;const{meta:t,body:n}=Wh(i,e),a=e.replace(/^.*\//,"").replace(/\.md$/,""),s=Number((c=/^(\d+)/.exec(a))==null?void 0:c[1]);if(!Number.isFinite(s))throw new K(`${e}: Dateiname muss mit der Nummer beginnen (z. B. 01-…).`);const r=[];let o=[],l;const u=()=>{l&&r.push({title:l.title,blocks:Nh(l.lines.join(` +`).trim();r&&t.push({kind:"markdown",text:r}),a=[]};for(let r=0;r=n.length)throw new te(`${e}: Block „::: ${o[1]}“ wird nicht mit „:::“ geschlossen.`);const m=o[1].toLowerCase(),c=o[2].trim();switch(m){case"diagramm":if(!c)throw new te(`${e}: „::: diagramm“ braucht einen Dateinamen.`);t.push({kind:"diagram",file:c,caption:l.join(" ").trim()});break;case"übung":case"uebung":if(!c)throw new te(`${e}: „::: übung“ braucht eine Kennung.`);t.push({kind:"exercise",exercise:NB(c,l,e)});break;case"checkliste":t.push({kind:"checklist",items:l.map(d=>d.trim()).filter(d=>d.startsWith("- ")).map(d=>JB(d.slice(2).trim()))});break;case"quiz":t.push({kind:"quiz",questions:FB(l,e)});break;case"bild":if(!c)throw new te(`${e}: „::: bild“ braucht einen Dateinamen.`);t.push({kind:"images",files:c.split(/\s+/),caption:l.join(" ").trim()});break;case"grafik":if(!c)throw new te(`${e}: „::: grafik“ braucht einen Dateinamen.`);t.push({kind:"graphic",file:c,caption:l.join(" ").trim()});break;case"angeberwissen":t.push({kind:"brag",text:l.join(` +`).trim()});break;case"spiel":try{if(_B(c))t.push({kind:"roundGame",game:TB(c,l,e)});else if(c==="prinzessin")t.push({kind:"rescueGame",game:CB(l,e)});else{if(c)throw new te(`${e}: Unbekanntes Spiel „${c}“ (zuhoerer, vertrag, layout, bombe, frage, reihenfolge oder prinzessin).`);t.push({kind:"game",game:Gx(l,e)})}}catch(d){throw new te(d.message)}break;case"lückentext":case"lueckentext":try{t.push({kind:"cloze",cloze:DB(l,e)})}catch(d){throw new te(d.message)}break;case"ludwig":t.push({kind:"brag",text:l.join(` +`).trim(),tip:!0});break;case"caesar":{const d=c?Number(c):3;if(!Number.isInteger(d)||d<0||d>25)throw new te(`${e}: „::: caesar“ braucht einen Schlüssel von 0 bis 25.`);t.push({kind:"caesar",key:d,text:l.join(" ").trim()});break}case"mbot2":{const d={kind:"robotModel",focus:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*(fokus|focus|ansicht|view|drehen|spin):\s*(.*)$/i.exec(h);if(!g)throw new te(`${e}: „::: mbot2“ kennt nur Zeilen „fokus:“, „ansicht:“ und „drehen:“.`);const f=g[1].toLowerCase();f==="fokus"||f==="focus"?d.focus=Du(g[2],e):f==="ansicht"||f==="view"?d.view=g[2].trim().toLowerCase():d.spin=/^(ja|yes|true|sim)$/i.test(g[2].trim())}t.push(d);break}case"mbot2quiz":{const d={kind:"robotQuiz",tasks:[]};for(const h of l.filter(g=>g.trim())){const g=/^\s*-\s*(\w+)\s*:\s*(.+)$/.exec(h),f=/^\s*(fertig|done):\s*(.+)$/i.exec(h);if(g)d.tasks.push({part:Du(g[1],e)[0],question:g[2].trim()});else if(f)d.done=f[2].trim();else throw new te(`${e}: „::: mbot2quiz“ braucht Zeilen „- teil: Frage“ und optional „fertig: Text“.`)}if(!d.tasks.length)throw new te(`${e}: „::: mbot2quiz“ hat keine Fragen.`);t.push(d);break}case"datei":{if(!/^[\w.-]+\.(txt|csv|json)$/u.test(c))throw new te(`${e}: „::: datei“ braucht einen Dateinamen wie brief.txt, liste.csv oder daten.json.`);for(;l.length&&l[0].trim()==="";)l.shift();for(;l.length&&l[l.length-1].trim()==="";)l.pop();t.push({kind:"textFile",name:c,content:l.join(` +`)});break}default:throw new te(`${e}: Unbekannter Block „::: ${o[1]}“.`)}r=u}return s(),t}function JB(i){const e=/^(.*?)\s+→\s+(.+)$/.exec(i);return e?{text:e[1],ref:e[2].trim()}:{text:i}}function RB(i,e){const t=new Map(i.map((n,a)=>[n.title.toLowerCase(),a]));for(const n of i.flatMap(a=>a.blocks))if(n.kind==="checklist"){for(const a of n.items)if(a.ref!==void 0&&(a.step=t.get(a.ref.toLowerCase()),a.step===void 0))throw new te(`${e}: Checkliste verweist auf unbekannten Schritt „${a.ref}“.`)}}function GB(i,e){var c;const{meta:t,body:n}=Eh(i,e),a=e.replace(/^.*\//,"").replace(/\.md$/,""),s=Number((c=/^(\d+)/.exec(a))==null?void 0:c[1]);if(!Number.isFinite(s))throw new te(`${e}: Dateiname muss mit der Nummer beginnen (z. B. 01-…).`);const r=[];let o=[],l;const u=()=>{l&&r.push({title:l.title,blocks:Fh(l.lines.join(` `),e)})};for(const d of n.split(` -`)){const h=/^##\s+(.*)$/.exec(d);h?(u(),l={title:h[1].trim(),lines:[]}):l?l.lines.push(d):o.push(d)}if(u(),r.length===0)throw new K(`${e}: Keine Schritte (## Überschrift) gefunden.`);JB(r,e);const m=t.get("titel");if(!m)throw new K(`${e}: „titel:“ fehlt.`);return{id:a,number:s,title:m,section:t.get("bereich")??"",summary:t.get("kurz")??o.join(" ").trim(),steps:r}}function GB(i,e){const{meta:t,body:n}=Wh(i,e),a=t.get("titel");if(!a)throw new K(`${e}: „titel:“ fehlt.`);const s=t.get("nach");return{id:e.replace(/^.*\//,"").replace(/\.md$/,""),title:a,after:s?Number(s):void 0,level:Number(t.get("stufe")??"1")||1,blocks:Nh(n,e)}}function Du(i,e){const t=i.split(/\s*,\s*/).map(n=>n.trim()).filter(Boolean);for(const n of t)if(!r3(n))throw new K(`${e}: Unbekanntes Teil „${n}“. Bekannt: ${nh.join(", ")}.`);return t}const HB=Object.assign({"../../lessons/de/01-was-ist-ein-struktogramm.md":$x,"../../lessons/de/02-der-editor.md":Yx,"../../lessons/de/03-speichern-oeffnen-exportieren.md":Xx,"../../lessons/de/04-variablen-und-datentypen.md":Kx,"../../lessons/de/05-sequenz.md":eb,"../../lessons/de/06-eingabe-und-ausgabe.md":tb,"../../lessons/de/07-simulation-und-schreibtischtest.md":nb,"../../lessons/de/08-verzweigung.md":ib,"../../lessons/de/09-bedingungen-verknuepfen.md":ab,"../../lessons/de/10-fallauswahl.md":sb,"../../lessons/de/11-while-schleife.md":rb,"../../lessons/de/12-do-while-schleife.md":ob,"../../lessons/de/13-for-schleife.md":lb,"../../lessons/de/14-verschachteln.md":ub,"../../lessons/de/15-arrays.md":mb,"../../lessons/de/16-zweidimensionale-arrays.md":cb,"../../lessons/de/17-zeichenketten.md":db,"../../lessons/de/18-aufruf-und-aussprung.md":hb,"../../lessons/de/19-suchen-und-sortieren.md":gb,"../../lessons/de/20-java.md":pb,"../../lessons/de/21-python-und-javascript.md":fb,"../../lessons/de/22-try-und-catch.md":xb,"../../lessons/de/23-text-einlesen-und-speichern.md":bb,"../../lessons/de/24-zeile-fuer-zeile.md":yb,"../../lessons/de/25-tabellen-als-csv.md":vb,"../../lessons/de/26-json.md":wb,"../../lessons/de/27-formate-im-vergleich.md":zb,"../../lessons/de/28-erstes-fenster.md":Ib,"../../lessons/de/29-knopf-im-fenster.md":kb,"../../lessons/de/30-der-knopf-reagiert.md":Sb,"../../lessons/de/31-zahl-verdoppeln.md":_b,"../../lessons/de/32-klickzaehler.md":Tb,"../../lessons/de/33-ampel.md":Ob,"../../lessons/de/34-notenrechner.md":Ab,"../../lessons/de/35-taschenrechner.md":Pb,"../../lessons/de/36-zahlenraten.md":jb,"../../lessons/de/37-viele-knoepfe-ein-zuhoerer.md":Cb,"../../lessons/de/38-innere-klassen.md":Bb,"../../lessons/de/39-zwei-reiter.md":Db,"../../lessons/de/40-model-view-controller.md":Zb,"../../lessons/de/begriffe.md":Mb,"../../lessons/de/nachschlagen.md":Lb,"../../lessons/en/01-was-ist-ein-struktogramm.md":Wb,"../../lessons/en/02-der-editor.md":Eb,"../../lessons/en/03-speichern-oeffnen-exportieren.md":Nb,"../../lessons/en/04-variablen-und-datentypen.md":Fb,"../../lessons/en/05-sequenz.md":Jb,"../../lessons/en/06-eingabe-und-ausgabe.md":Rb,"../../lessons/en/07-simulation-und-schreibtischtest.md":Gb,"../../lessons/en/08-verzweigung.md":Hb,"../../lessons/en/09-bedingungen-verknuepfen.md":Vb,"../../lessons/en/10-fallauswahl.md":Qb,"../../lessons/en/11-while-schleife.md":qb,"../../lessons/en/12-do-while-schleife.md":Ub,"../../lessons/en/13-for-schleife.md":$b,"../../lessons/en/14-verschachteln.md":Yb,"../../lessons/en/15-arrays.md":Xb,"../../lessons/en/16-zweidimensionale-arrays.md":Kb,"../../lessons/en/17-zeichenketten.md":e4,"../../lessons/en/18-aufruf-und-aussprung.md":t4,"../../lessons/en/19-suchen-und-sortieren.md":n4,"../../lessons/en/20-java.md":i4,"../../lessons/en/21-python-und-javascript.md":a4,"../../lessons/en/22-try-und-catch.md":s4,"../../lessons/en/23-text-einlesen-und-speichern.md":r4,"../../lessons/en/24-zeile-fuer-zeile.md":o4,"../../lessons/en/25-tabellen-als-csv.md":l4,"../../lessons/en/26-json.md":u4,"../../lessons/en/27-formate-im-vergleich.md":m4,"../../lessons/en/28-erstes-fenster.md":c4,"../../lessons/en/29-knopf-im-fenster.md":d4,"../../lessons/en/30-der-knopf-reagiert.md":h4,"../../lessons/en/31-zahl-verdoppeln.md":g4,"../../lessons/en/32-klickzaehler.md":p4,"../../lessons/en/33-ampel.md":f4,"../../lessons/en/34-notenrechner.md":x4,"../../lessons/en/35-taschenrechner.md":b4,"../../lessons/en/36-zahlenraten.md":y4,"../../lessons/en/37-viele-knoepfe-ein-zuhoerer.md":v4,"../../lessons/en/38-innere-klassen.md":w4,"../../lessons/en/39-zwei-reiter.md":z4,"../../lessons/en/40-model-view-controller.md":I4,"../../lessons/en/begriffe.md":k4,"../../lessons/en/nachschlagen.md":S4,"../../lessons/pt/01-was-ist-ein-struktogramm.md":_4,"../../lessons/pt/02-der-editor.md":T4,"../../lessons/pt/03-speichern-oeffnen-exportieren.md":O4,"../../lessons/pt/04-variablen-und-datentypen.md":A4,"../../lessons/pt/05-sequenz.md":P4,"../../lessons/pt/06-eingabe-und-ausgabe.md":j4,"../../lessons/pt/07-simulation-und-schreibtischtest.md":C4,"../../lessons/pt/08-verzweigung.md":B4,"../../lessons/pt/09-bedingungen-verknuepfen.md":D4,"../../lessons/pt/10-fallauswahl.md":Z4,"../../lessons/pt/11-while-schleife.md":M4,"../../lessons/pt/12-do-while-schleife.md":L4,"../../lessons/pt/13-for-schleife.md":W4,"../../lessons/pt/14-verschachteln.md":E4,"../../lessons/pt/15-arrays.md":N4,"../../lessons/pt/16-zweidimensionale-arrays.md":F4,"../../lessons/pt/17-zeichenketten.md":J4,"../../lessons/pt/18-aufruf-und-aussprung.md":R4,"../../lessons/pt/19-suchen-und-sortieren.md":G4,"../../lessons/pt/20-java.md":H4,"../../lessons/pt/21-python-und-javascript.md":V4,"../../lessons/pt/22-try-und-catch.md":Q4,"../../lessons/pt/23-text-einlesen-und-speichern.md":q4,"../../lessons/pt/24-zeile-fuer-zeile.md":U4,"../../lessons/pt/25-tabellen-als-csv.md":$4,"../../lessons/pt/26-json.md":Y4,"../../lessons/pt/27-formate-im-vergleich.md":X4,"../../lessons/pt/28-erstes-fenster.md":K4,"../../lessons/pt/29-knopf-im-fenster.md":ey,"../../lessons/pt/30-der-knopf-reagiert.md":ty,"../../lessons/pt/31-zahl-verdoppeln.md":ny,"../../lessons/pt/32-klickzaehler.md":iy,"../../lessons/pt/33-ampel.md":ay,"../../lessons/pt/34-notenrechner.md":sy,"../../lessons/pt/35-taschenrechner.md":ry,"../../lessons/pt/36-zahlenraten.md":oy,"../../lessons/pt/37-viele-knoepfe-ein-zuhoerer.md":ly,"../../lessons/pt/38-innere-klassen.md":uy,"../../lessons/pt/39-zwei-reiter.md":my,"../../lessons/pt/40-model-view-controller.md":cy,"../../lessons/pt/begriffe.md":dy,"../../lessons/pt/nachschlagen.md":hy}),VB=Object.assign({"../../lessons/de/aufgaben/alter-unterprogramm.md":gy,"../../lessons/de/aufgaben/ballwurf.md":py,"../../lessons/de/aufgaben/bestenliste.md":fy,"../../lessons/de/aufgaben/binaerzahl.md":xy,"../../lessons/de/aufgaben/caesar.md":by,"../../lessons/de/aufgaben/collatz.md":yy,"../../lessons/de/aufgaben/einheitenrechner.md":vy,"../../lessons/de/aufgaben/fibonacci.md":wy,"../../lessons/de/aufgaben/gerade-ungerade.md":zy,"../../lessons/de/aufgaben/mehrwertsteuer.md":Iy,"../../lessons/de/aufgaben/notendurchschnitt.md":ky,"../../lessons/de/aufgaben/pin-pruefen.md":Sy,"../../lessons/de/aufgaben/schiffe-versenken.md":_y,"../../lessons/de/aufgaben/speisekarte.md":Ty,"../../lessons/de/aufgaben/summe-bilden.md":Oy,"../../lessons/de/aufgaben/tafeldienst.md":Ay,"../../lessons/de/aufgaben/taschenrechner.md":Py,"../../lessons/de/aufgaben/verleih-menue.md":jy,"../../lessons/de/aufgaben/vokabeltrainer.md":Cy,"../../lessons/de/aufgaben/volljaehrig.md":By,"../../lessons/de/aufgaben/wuerfel-mvc.md":Dy,"../../lessons/de/aufgaben/zahl-verdoppeln.md":Zy,"../../lessons/en/aufgaben/alter-unterprogramm.md":My,"../../lessons/en/aufgaben/ballwurf.md":Ly,"../../lessons/en/aufgaben/bestenliste.md":Wy,"../../lessons/en/aufgaben/binaerzahl.md":Ey,"../../lessons/en/aufgaben/caesar.md":Ny,"../../lessons/en/aufgaben/collatz.md":Fy,"../../lessons/en/aufgaben/einheitenrechner.md":Jy,"../../lessons/en/aufgaben/fibonacci.md":Ry,"../../lessons/en/aufgaben/gerade-ungerade.md":Gy,"../../lessons/en/aufgaben/mehrwertsteuer.md":Hy,"../../lessons/en/aufgaben/notendurchschnitt.md":Vy,"../../lessons/en/aufgaben/pin-pruefen.md":Qy,"../../lessons/en/aufgaben/schiffe-versenken.md":qy,"../../lessons/en/aufgaben/speisekarte.md":Uy,"../../lessons/en/aufgaben/summe-bilden.md":$y,"../../lessons/en/aufgaben/tafeldienst.md":Yy,"../../lessons/en/aufgaben/taschenrechner.md":Xy,"../../lessons/en/aufgaben/verleih-menue.md":Ky,"../../lessons/en/aufgaben/vokabeltrainer.md":ev,"../../lessons/en/aufgaben/volljaehrig.md":tv,"../../lessons/en/aufgaben/wuerfel-mvc.md":nv,"../../lessons/en/aufgaben/zahl-verdoppeln.md":iv,"../../lessons/pt/aufgaben/alter-unterprogramm.md":av,"../../lessons/pt/aufgaben/ballwurf.md":sv,"../../lessons/pt/aufgaben/bestenliste.md":rv,"../../lessons/pt/aufgaben/binaerzahl.md":ov,"../../lessons/pt/aufgaben/caesar.md":lv,"../../lessons/pt/aufgaben/collatz.md":uv,"../../lessons/pt/aufgaben/einheitenrechner.md":mv,"../../lessons/pt/aufgaben/fibonacci.md":cv,"../../lessons/pt/aufgaben/gerade-ungerade.md":dv,"../../lessons/pt/aufgaben/mehrwertsteuer.md":hv,"../../lessons/pt/aufgaben/notendurchschnitt.md":gv,"../../lessons/pt/aufgaben/pin-pruefen.md":pv,"../../lessons/pt/aufgaben/schiffe-versenken.md":fv,"../../lessons/pt/aufgaben/speisekarte.md":xv,"../../lessons/pt/aufgaben/summe-bilden.md":bv,"../../lessons/pt/aufgaben/tafeldienst.md":yv,"../../lessons/pt/aufgaben/taschenrechner.md":vv,"../../lessons/pt/aufgaben/verleih-menue.md":wv,"../../lessons/pt/aufgaben/vokabeltrainer.md":zv,"../../lessons/pt/aufgaben/volljaehrig.md":Iv,"../../lessons/pt/aufgaben/wuerfel-mvc.md":kv,"../../lessons/pt/aufgaben/zahl-verdoppeln.md":Sv}),Zu=Object.assign({"../../lessons/de/visubot/01-der-mbot2.md":_v,"../../lessons/de/visubot/02-das-quadrat.md":Tv,"../../lessons/de/visubot/03-variablen-und-ausgabe.md":Ov,"../../lessons/de/visubot/04-sensoren.md":Av,"../../lessons/de/visubot/05-bis-zur-wand.md":Pv,"../../lessons/de/visubot/06-abstand.md":jv,"../../lessons/de/visubot/07-linie.md":Cv,"../../lessons/de/visubot/08-farben.md":Bv,"../../lessons/de/visubot/09-fallauswahl.md":Dv,"../../lessons/de/visubot/10-tasten-joystick.md":Zv,"../../lessons/de/visubot/11-licht.md":Mv,"../../lessons/de/visubot/12-lautstaerke.md":Lv,"../../lessons/de/visubot/13-neigung.md":Wv,"../../lessons/de/visubot/14-leds.md":Ev,"../../lessons/de/visubot/15-einzelne-leds.md":Nv,"../../lessons/de/visubot/16-lautsprecher.md":Fv,"../../lessons/de/visubot/17-arrays-melodie.md":Jv,"../../lessons/de/visubot/18-bildschirm.md":Rv,"../../lessons/de/visubot/19-zeichenketten.md":Gv,"../../lessons/de/visubot/20-motoren.md":Hv,"../../lessons/de/visubot/21-stoppuhr-akku.md":Vv,"../../lessons/de/visubot/22-eigene-methoden.md":Qv,"../../lessons/de/visubot/nachschlagen.md":qv,"../../lessons/en/visubot/01-der-mbot2.md":Uv,"../../lessons/en/visubot/02-das-quadrat.md":$v,"../../lessons/en/visubot/03-variablen-und-ausgabe.md":Yv,"../../lessons/en/visubot/04-sensoren.md":Xv,"../../lessons/en/visubot/05-bis-zur-wand.md":Kv,"../../lessons/en/visubot/06-abstand.md":e9,"../../lessons/en/visubot/07-linie.md":t9,"../../lessons/en/visubot/08-farben.md":n9,"../../lessons/en/visubot/09-fallauswahl.md":i9,"../../lessons/en/visubot/10-tasten-joystick.md":a9,"../../lessons/en/visubot/11-licht.md":s9,"../../lessons/en/visubot/12-lautstaerke.md":r9,"../../lessons/en/visubot/13-neigung.md":o9,"../../lessons/en/visubot/14-leds.md":l9,"../../lessons/en/visubot/15-einzelne-leds.md":u9,"../../lessons/en/visubot/16-lautsprecher.md":m9,"../../lessons/en/visubot/17-arrays-melodie.md":c9,"../../lessons/en/visubot/18-bildschirm.md":d9,"../../lessons/en/visubot/19-zeichenketten.md":h9,"../../lessons/en/visubot/20-motoren.md":g9,"../../lessons/en/visubot/21-stoppuhr-akku.md":p9,"../../lessons/en/visubot/22-eigene-methoden.md":f9,"../../lessons/en/visubot/nachschlagen.md":x9}),QB=Object.assign({"../../lessons/de/visubot/aufgaben/alarmanlage.md":b9,"../../lessons/de/visubot/aufgaben/ausgang.md":y9,"../../lessons/de/visubot/aufgaben/binaer-zaehlen.md":v9,"../../lessons/de/visubot/aufgaben/dreieck.md":w9,"../../lessons/de/visubot/aufgaben/einparken.md":z9,"../../lessons/de/visubot/aufgaben/hindernis.md":I9,"../../lessons/de/visubot/aufgaben/knight-rider.md":k9,"../../lessons/de/visubot/aufgaben/labyrinth.md":S9,"../../lessons/de/visubot/aufgaben/linienfolger-stopp.md":_9,"../../lessons/de/visubot/aufgaben/morsen.md":T9,"../../lessons/de/visubot/aufgaben/nachtwaechter.md":O9,"../../lessons/de/visubot/aufgaben/slalom.md":A9,"../../lessons/de/visubot/aufgaben/spirale.md":P9,"../../lessons/de/visubot/aufgaben/treppe.md":j9,"../../lessons/de/visubot/aufgaben/tunnel.md":C9,"../../lessons/de/visubot/aufgaben/wald.md":B9,"../../lessons/en/visubot/aufgaben/alarmanlage.md":D9,"../../lessons/en/visubot/aufgaben/ausgang.md":Z9,"../../lessons/en/visubot/aufgaben/binaer-zaehlen.md":M9,"../../lessons/en/visubot/aufgaben/dreieck.md":L9,"../../lessons/en/visubot/aufgaben/einparken.md":W9,"../../lessons/en/visubot/aufgaben/hindernis.md":E9,"../../lessons/en/visubot/aufgaben/knight-rider.md":N9,"../../lessons/en/visubot/aufgaben/labyrinth.md":F9,"../../lessons/en/visubot/aufgaben/linienfolger-stopp.md":J9,"../../lessons/en/visubot/aufgaben/morsen.md":R9,"../../lessons/en/visubot/aufgaben/nachtwaechter.md":G9,"../../lessons/en/visubot/aufgaben/slalom.md":H9,"../../lessons/en/visubot/aufgaben/spirale.md":V9,"../../lessons/en/visubot/aufgaben/treppe.md":Q9,"../../lessons/en/visubot/aufgaben/tunnel.md":q9,"../../lessons/en/visubot/aufgaben/wald.md":U9}),qB=Object.assign({"../../lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct":$9,"../../lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct":Y9,"../../lessons/diagramme/aufgabe-ballwurf-loesung.visustruct":X9,"../../lessons/diagramme/aufgabe-ballwurf-start.visustruct":K9,"../../lessons/diagramme/aufgabe-bestenliste-loesung.visustruct":ew,"../../lessons/diagramme/aufgabe-binaer-loesung.visustruct":tw,"../../lessons/diagramme/aufgabe-caesar-array-loesung.visustruct":nw,"../../lessons/diagramme/aufgabe-caesar-array-start.visustruct":iw,"../../lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct":aw,"../../lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct":sw,"../../lessons/diagramme/aufgabe-collatz-loesung.visustruct":rw,"../../lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct":ow,"../../lessons/diagramme/aufgabe-fibonacci-loesung.visustruct":lw,"../../lessons/diagramme/aufgabe-gerade-loesung.visustruct":uw,"../../lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct":mw,"../../lessons/diagramme/aufgabe-pin-java-loesung.visustruct":cw,"../../lessons/diagramme/aufgabe-pin-loesung.visustruct":dw,"../../lessons/diagramme/aufgabe-rechner-loesung.visustruct":hw,"../../lessons/diagramme/aufgabe-schiffe-loesung.visustruct":gw,"../../lessons/diagramme/aufgabe-schiffe-start.visustruct":pw,"../../lessons/diagramme/aufgabe-speisekarte-loesung.visustruct":fw,"../../lessons/diagramme/aufgabe-summe-loesung.visustruct":xw,"../../lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct":bw,"../../lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct":yw,"../../lessons/diagramme/aufgabe-verleih-java-loesung.visustruct":vw,"../../lessons/diagramme/aufgabe-verleih-loesung.visustruct":ww,"../../lessons/diagramme/aufgabe-vokabeln-loesung.visustruct":zw,"../../lessons/diagramme/aufgabe-vokabeln-start.visustruct":Iw,"../../lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct":kw,"../../lessons/diagramme/dt-buffered.visustruct":Sw,"../../lessons/diagramme/dt-csv.visustruct":_w,"../../lessons/diagramme/dt-json.visustruct":Tw,"../../lessons/diagramme/dt-lesen.visustruct":Ow,"../../lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct":Aw,"../../lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct":Pw,"../../lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct":jw,"../../lessons/diagramme/en/aufgabe-ballwurf-start.visustruct":Cw,"../../lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct":Bw,"../../lessons/diagramme/en/aufgabe-binaer-loesung.visustruct":Dw,"../../lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct":Zw,"../../lessons/diagramme/en/aufgabe-caesar-array-start.visustruct":Mw,"../../lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct":Lw,"../../lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct":Ww,"../../lessons/diagramme/en/aufgabe-collatz-loesung.visustruct":Ew,"../../lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct":Nw,"../../lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct":Fw,"../../lessons/diagramme/en/aufgabe-gerade-loesung.visustruct":Jw,"../../lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct":Rw,"../../lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct":Gw,"../../lessons/diagramme/en/aufgabe-pin-loesung.visustruct":Hw,"../../lessons/diagramme/en/aufgabe-rechner-loesung.visustruct":Vw,"../../lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct":Qw,"../../lessons/diagramme/en/aufgabe-schiffe-start.visustruct":qw,"../../lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct":Uw,"../../lessons/diagramme/en/aufgabe-summe-loesung.visustruct":$w,"../../lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct":Yw,"../../lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct":Xw,"../../lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct":Kw,"../../lessons/diagramme/en/aufgabe-verleih-loesung.visustruct":e5,"../../lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct":t5,"../../lessons/diagramme/en/aufgabe-vokabeln-start.visustruct":n5,"../../lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct":i5,"../../lessons/diagramme/en/dt-buffered.visustruct":a5,"../../lessons/diagramme/en/dt-csv.visustruct":s5,"../../lessons/diagramme/en/dt-json.visustruct":r5,"../../lessons/diagramme/en/dt-lesen.visustruct":o5,"../../lessons/diagramme/en/kino-einmaleins-loesung.visustruct":l5,"../../lessons/diagramme/en/kino-frei-loesung.visustruct":u5,"../../lessons/diagramme/en/kino-frei-start.visustruct":m5,"../../lessons/diagramme/en/kino-karte-loesung.visustruct":c5,"../../lessons/diagramme/en/kino-karte-start.visustruct":d5,"../../lessons/diagramme/en/kino-saalplan.visustruct":h5,"../../lessons/diagramme/en/kino-verkaufen.visustruct":g5,"../../lessons/diagramme/en/l04-java-fehler-loesung.visustruct":p5,"../../lessons/diagramme/en/l04-java-fehler-start.visustruct":f5,"../../lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct":x5,"../../lessons/diagramme/en/l04-rechnen.visustruct":b5,"../../lessons/diagramme/en/l04-reihenfolge-loesung.visustruct":y5,"../../lessons/diagramme/en/l04-reihenfolge-start.visustruct":v5,"../../lessons/diagramme/en/l04-tauschen-loesung.visustruct":w5,"../../lessons/diagramme/en/l04-tauschen-start.visustruct":z5,"../../lessons/diagramme/en/l04-tauschen.visustruct":I5,"../../lessons/diagramme/en/l05-datentypen.visustruct":k5,"../../lessons/diagramme/en/l05-division.visustruct":S5,"../../lessons/diagramme/en/l05-einkauf-loesung.visustruct":_5,"../../lessons/diagramme/en/l05-java-fehler-loesung.visustruct":T5,"../../lessons/diagramme/en/l05-java-fehler-start.visustruct":O5,"../../lessons/diagramme/en/l05-java-kino-loesung.visustruct":A5,"../../lessons/diagramme/en/l05-rechteck-loesung.visustruct":P5,"../../lessons/diagramme/en/l05-sekunden-loesung.visustruct":j5,"../../lessons/diagramme/en/l05-sekunden-start.visustruct":C5,"../../lessons/diagramme/en/l06-begruessung-loesung.visustruct":B5,"../../lessons/diagramme/en/l06-eva.visustruct":D5,"../../lessons/diagramme/en/l06-java-fehler-loesung.visustruct":Z5,"../../lessons/diagramme/en/l06-java-fehler-start.visustruct":M5,"../../lessons/diagramme/en/l06-java-tage-loesung.visustruct":L5,"../../lessons/diagramme/en/l06-mittelwert-loesung.visustruct":W5,"../../lessons/diagramme/en/l06-rechner-loesung.visustruct":E5,"../../lessons/diagramme/en/l07-alter-pruefen.visustruct":N5,"../../lessons/diagramme/en/l07-betrag-loesung.visustruct":F5,"../../lessons/diagramme/en/l07-gerade-loesung.visustruct":J5,"../../lessons/diagramme/en/l07-java-fehler-loesung.visustruct":R5,"../../lessons/diagramme/en/l07-java-fehler-start.visustruct":G5,"../../lessons/diagramme/en/l07-java-pizza-loesung.visustruct":H5,"../../lessons/diagramme/en/l07-java-pizza-start.visustruct":V5,"../../lessons/diagramme/en/l07-maximum-loesung.visustruct":Q5,"../../lessons/diagramme/en/l07-rabatt.visustruct":q5,"../../lessons/diagramme/en/l08-gueltig-loesung.visustruct":U5,"../../lessons/diagramme/en/l08-java-bestanden-loesung.visustruct":$5,"../../lessons/diagramme/en/l08-java-fehler-loesung.visustruct":Y5,"../../lessons/diagramme/en/l08-java-fehler-start.visustruct":X5,"../../lessons/diagramme/en/l08-jugendticket.visustruct":K5,"../../lessons/diagramme/en/l08-note.visustruct":e6,"../../lessons/diagramme/en/l08-schaltjahr-loesung.visustruct":t6,"../../lessons/diagramme/en/l08-wochenende-loesung.visustruct":n6,"../../lessons/diagramme/en/l09-ampel.visustruct":i6,"../../lessons/diagramme/en/l09-automat.visustruct":a6,"../../lessons/diagramme/en/l09-java-fehler-loesung.visustruct":s6,"../../lessons/diagramme/en/l09-java-fehler-start.visustruct":r6,"../../lessons/diagramme/en/l09-java-schule-loesung.visustruct":o6,"../../lessons/diagramme/en/l09-note-loesung.visustruct":l6,"../../lessons/diagramme/en/l09-rechner-loesung.visustruct":u6,"../../lessons/diagramme/en/l09-verschachtelt.visustruct":m6,"../../lessons/diagramme/en/l1-grundbausteine.visustruct":c6,"../../lessons/diagramme/en/l1-sequenz.visustruct":d6,"../../lessons/diagramme/en/l1-tee.visustruct":h6,"../../lessons/diagramme/en/l1-verzweigung.visustruct":g6,"../../lessons/diagramme/en/l1-wiederholung.visustruct":p6,"../../lessons/diagramme/en/l10-bis-n-loesung.visustruct":f6,"../../lessons/diagramme/en/l10-countdown.visustruct":x6,"../../lessons/diagramme/en/l10-endlos.visustruct":b6,"../../lessons/diagramme/en/l10-fakultaet.visustruct":y6,"../../lessons/diagramme/en/l10-java-fehler-loesung.visustruct":v6,"../../lessons/diagramme/en/l10-java-fehler-start.visustruct":w6,"../../lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct":z6,"../../lessons/diagramme/en/l10-verdoppeln-loesung.visustruct":I6,"../../lessons/diagramme/en/l11-eingabe-pruefen.visustruct":k6,"../../lessons/diagramme/en/l11-einmal.visustruct":S6,"../../lessons/diagramme/en/l11-java-fehler-loesung.visustruct":_6,"../../lessons/diagramme/en/l11-java-fehler-start.visustruct":T6,"../../lessons/diagramme/en/l11-java-gerade-loesung.visustruct":O6,"../../lessons/diagramme/en/l11-note-loesung.visustruct":A6,"../../lessons/diagramme/en/l11-summe-loesung.visustruct":P6,"../../lessons/diagramme/en/l12-countdown-loesung.visustruct":j6,"../../lessons/diagramme/en/l12-einmaleins-loesung.visustruct":C6,"../../lessons/diagramme/en/l12-eins-bis-fuenf.visustruct":B6,"../../lessons/diagramme/en/l12-java-fehler-loesung.visustruct":D6,"../../lessons/diagramme/en/l12-java-fehler-start.visustruct":Z6,"../../lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct":M6,"../../lessons/diagramme/en/l12-summe.visustruct":L6,"../../lessons/diagramme/en/l13-dreieck.visustruct":W6,"../../lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct":E6,"../../lessons/diagramme/en/l13-gerade-zaehlen.visustruct":N6,"../../lessons/diagramme/en/l13-java-fehler-loesung.visustruct":F6,"../../lessons/diagramme/en/l13-java-fehler-start.visustruct":J6,"../../lessons/diagramme/en/l13-java-quadrate-loesung.visustruct":R6,"../../lessons/diagramme/en/l13-rechteck-loesung.visustruct":G6,"../../lessons/diagramme/en/l14-array-durchlaufen.visustruct":H6,"../../lessons/diagramme/en/l14-erster-letzter-loesung.visustruct":V6,"../../lessons/diagramme/en/l14-java-fehler-loesung.visustruct":Q6,"../../lessons/diagramme/en/l14-java-fehler-start.visustruct":q6,"../../lessons/diagramme/en/l14-java-treppe-loesung.visustruct":U6,"../../lessons/diagramme/en/l14-namen-eingeben.visustruct":$6,"../../lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct":Y6,"../../lessons/diagramme/en/l14-summe-max-loesung.visustruct":X6,"../../lessons/diagramme/en/l14-summe-maximum.visustruct":K6,"../../lessons/diagramme/en/l15-bis-null-loesung.visustruct":ez,"../../lessons/diagramme/en/l15-endlos-aussprung.visustruct":tz,"../../lessons/diagramme/en/l15-flaeche-loesung.visustruct":nz,"../../lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct":iz,"../../lessons/diagramme/en/l15-hauptprogramm.visustruct":az,"../../lessons/diagramme/en/l15-java-fehler-loesung.visustruct":sz,"../../lessons/diagramme/en/l15-java-fehler-start.visustruct":rz,"../../lessons/diagramme/en/l15-java-noten-loesung.visustruct":oz,"../../lessons/diagramme/en/l15-quadrat-haupt.visustruct":lz,"../../lessons/diagramme/en/l15-quadrat.visustruct":uz,"../../lessons/diagramme/en/l15-titel-loesung.visustruct":mz,"../../lessons/diagramme/en/l15-unterprogramm.visustruct":cz,"../../lessons/diagramme/en/l15-zeige-summe-haupt.visustruct":dz,"../../lessons/diagramme/en/l15-zeige-summe.visustruct":hz,"../../lessons/diagramme/en/l16-countdown-loesung.visustruct":gz,"../../lessons/diagramme/en/l16-countdown-start.visustruct":pz,"../../lessons/diagramme/en/l16-java-fehler-loesung.visustruct":fz,"../../lessons/diagramme/en/l16-java-fehler-start.visustruct":xz,"../../lessons/diagramme/en/l16-java-punkte-loesung.visustruct":bz,"../../lessons/diagramme/en/l16-schreibtisch.visustruct":yz,"../../lessons/diagramme/en/l16-summe-loesung.visustruct":vz,"../../lessons/diagramme/en/l16-summe-start.visustruct":wz,"../../lessons/diagramme/en/l17-beispiel.visustruct":zz,"../../lessons/diagramme/en/l17-fakultaet-loesung.visustruct":Iz,"../../lessons/diagramme/en/l17-java-brief-loesung.visustruct":kz,"../../lessons/diagramme/en/l17-java-brief-start.visustruct":Sz,"../../lessons/diagramme/en/l17-java-fehler-loesung.visustruct":_z,"../../lessons/diagramme/en/l17-java-fehler-start.visustruct":Tz,"../../lessons/diagramme/en/l17-java-passwort-loesung.visustruct":Oz,"../../lessons/diagramme/en/l17-ticket-loesung.visustruct":Az,"../../lessons/diagramme/en/l18-beispiel.visustruct":Pz,"../../lessons/diagramme/en/l18-java-fehler-loesung.visustruct":jz,"../../lessons/diagramme/en/l18-java-fehler-start.visustruct":Cz,"../../lessons/diagramme/en/l18-java-kasse-loesung.visustruct":Bz,"../../lessons/diagramme/en/l18-js-loesung.visustruct":Dz,"../../lessons/diagramme/en/l18-python-loesung.visustruct":Zz,"../../lessons/diagramme/en/l19-java-fehler-loesung.visustruct":Mz,"../../lessons/diagramme/en/l19-java-fehler-start.visustruct":Lz,"../../lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct":Wz,"../../lessons/diagramme/en/l2-ausgabe.visustruct":Ez,"../../lessons/diagramme/en/l2-hallo-loesung.visustruct":Nz,"../../lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct":Fz,"../../lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct":Jz,"../../lessons/diagramme/en/l23-java-ergaenzen-start.visustruct":Rz,"../../lessons/diagramme/en/l23-java-nummern-loesung.visustruct":Gz,"../../lessons/diagramme/en/l23-java-nummern-start.visustruct":Hz,"../../lessons/diagramme/en/l24-java-fuchs-loesung.visustruct":Vz,"../../lessons/diagramme/en/l24-java-fuchs-start.visustruct":Qz,"../../lessons/diagramme/en/l24-java-laengster-loesung.visustruct":qz,"../../lessons/diagramme/en/l24-java-laengster-start.visustruct":Uz,"../../lessons/diagramme/en/l25-java-beste-loesung.visustruct":$z,"../../lessons/diagramme/en/l25-java-beste-start.visustruct":Yz,"../../lessons/diagramme/en/l25-java-schnitt-loesung.visustruct":Xz,"../../lessons/diagramme/en/l25-java-schnitt-start.visustruct":Kz,"../../lessons/diagramme/en/l26-java-namen-loesung.visustruct":e7,"../../lessons/diagramme/en/l26-java-namen-start.visustruct":t7,"../../lessons/diagramme/en/l26-java-schreiben-loesung.visustruct":n7,"../../lessons/diagramme/en/l26-java-schreiben-start.visustruct":i7,"../../lessons/diagramme/en/l27-java-json-loesung.visustruct":a7,"../../lessons/diagramme/en/l27-java-json-start.visustruct":s7,"../../lessons/diagramme/en/l27-java-saetze-loesung.visustruct":r7,"../../lessons/diagramme/en/l27-java-saetze-start.visustruct":o7,"../../lessons/diagramme/en/sim-kino-loesung.visustruct":l7,"../../lessons/diagramme/en/sim-kino-start.visustruct":u7,"../../lessons/diagramme/en/sim-tausch-loesung.visustruct":m7,"../../lessons/diagramme/en/sim-tausch-start.visustruct":c7,"../../lessons/diagramme/en/sim-tausch.visustruct":d7,"../../lessons/diagramme/en/ss-absteigend-loesung.visustruct":h7,"../../lessons/diagramme/en/ss-absteigend-start.visustruct":g7,"../../lessons/diagramme/en/ss-binaere-suche.visustruct":p7,"../../lessons/diagramme/en/ss-bubblesort.visustruct":f7,"../../lessons/diagramme/en/ss-karte-suchen-loesung.visustruct":x7,"../../lessons/diagramme/en/ss-lineare-suche.visustruct":b7,"../../lessons/diagramme/en/uebergabe-bonus-loesung.visustruct":y7,"../../lessons/diagramme/en/uebergabe-bonus-start.visustruct":v7,"../../lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct":w7,"../../lessons/diagramme/en/uebergabe-haupt.visustruct":z7,"../../lessons/diagramme/en/uebergabe-leeren.visustruct":I7,"../../lessons/diagramme/en/uebergabe-verdopple.visustruct":k7,"../../lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct":S7,"../../lessons/diagramme/en/vb-abstand-halten-loesung.visustruct":_7,"../../lessons/diagramme/en/vb-alarmanlage-loesung.visustruct":T7,"../../lessons/diagramme/en/vb-ampel-loesung.visustruct":O7,"../../lessons/diagramme/en/vb-ausgang-loesung.visustruct":A7,"../../lessons/diagramme/en/vb-begruessung-loesung.visustruct":P7,"../../lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct":j7,"../../lessons/diagramme/en/vb-bis-rot-loesung.visustruct":C7,"../../lessons/diagramme/en/vb-bis-wand-loesung.visustruct":B7,"../../lessons/diagramme/en/vb-bis-ziel-loesung.visustruct":D7,"../../lessons/diagramme/en/vb-buchstaben-loesung.visustruct":Z7,"../../lessons/diagramme/en/vb-drei-lichter-loesung.visustruct":M7,"../../lessons/diagramme/en/vb-dreieck-loesung.visustruct":L7,"../../lessons/diagramme/en/vb-einparken-loesung.visustruct":W7,"../../lessons/diagramme/en/vb-farben-loesung.visustruct":E7,"../../lessons/diagramme/en/vb-farbweiche-loesung.visustruct":N7,"../../lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct":F7,"../../lessons/diagramme/en/vb-gerade-loesung.visustruct":J7,"../../lessons/diagramme/en/vb-hindernis-loesung.visustruct":R7,"../../lessons/diagramme/en/vb-java-akku-loesung.visustruct":G7,"../../lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct":H7,"../../lessons/diagramme/en/vb-java-blinken-loesung.visustruct":V7,"../../lessons/diagramme/en/vb-java-countdown-loesung.visustruct":Q7,"../../lessons/diagramme/en/vb-java-hoeher-loesung.visustruct":q7,"../../lessons/diagramme/en/vb-java-joystick-loesung.visustruct":U7,"../../lessons/diagramme/en/vb-java-laermampel-loesung.visustruct":$7,"../../lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct":Y7,"../../lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct":X7,"../../lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct":K7,"../../lessons/diagramme/en/vb-java-rand-loesung.visustruct":eI,"../../lessons/diagramme/en/vb-java-rechteck-loesung.visustruct":tI,"../../lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct":nI,"../../lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct":iI,"../../lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct":aI,"../../lessons/diagramme/en/vb-klatschen-loesung.visustruct":sI,"../../lessons/diagramme/en/vb-knight-rider-loesung.visustruct":rI,"../../lessons/diagramme/en/vb-labyrinth-loesung.visustruct":oI,"../../lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct":lI,"../../lessons/diagramme/en/vb-linienmuster-loesung.visustruct":uI,"../../lessons/diagramme/en/vb-melodie-loesung.visustruct":mI,"../../lessons/diagramme/en/vb-morsen-loesung.visustruct":cI,"../../lessons/diagramme/en/vb-nachtlicht-loesung.visustruct":dI,"../../lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct":hI,"../../lessons/diagramme/en/vb-ohne-noten-loesung.visustruct":gI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-loesung.visustruct":pI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":fI,"../../lessons/diagramme/en/vb-ohne-rueckwaerts-loesung.visustruct":xI,"../../lessons/diagramme/en/vb-ohne-strecke-loesung.visustruct":bI,"../../lessons/diagramme/en/vb-ohne-summe-loesung.visustruct":yI,"../../lessons/diagramme/en/vb-quadrat-loesung.visustruct":vI,"../../lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct":wI,"../../lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct":zI,"../../lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct":II,"../../lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct":kI,"../../lessons/diagramme/en/vb-rand-loesung.visustruct":SI,"../../lessons/diagramme/en/vb-schraeglage-loesung.visustruct":_I,"../../lessons/diagramme/en/vb-slalom-loesung.visustruct":TI,"../../lessons/diagramme/en/vb-spirale-loesung.visustruct":OI,"../../lessons/diagramme/en/vb-start-a-loesung.visustruct":AI,"../../lessons/diagramme/en/vb-tonleiter-loesung.visustruct":PI,"../../lessons/diagramme/en/vb-treppe-loesung.visustruct":jI,"../../lessons/diagramme/en/vb-tunnel-loesung.visustruct":CI,"../../lessons/diagramme/en/vb-variable-seite-loesung.visustruct":BI,"../../lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct":DI,"../../lessons/diagramme/en/vb-wald-loesung.visustruct":ZI,"../../lessons/diagramme/en/vb-wand-vorn-loesung.visustruct":MI,"../../lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct":LI,"../../lessons/diagramme/en/zk-initialen-loesung.visustruct":WI,"../../lessons/diagramme/en/zk-mehr.visustruct":EI,"../../lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct":NI,"../../lessons/diagramme/en/zk-split.visustruct":FI,"../../lessons/diagramme/en/zk-woerter-loesung.visustruct":JI,"../../lessons/diagramme/en/zk-zaehlen.visustruct":RI,"../../lessons/diagramme/en/zk-zeichen.visustruct":GI,"../../lessons/diagramme/kino-einmaleins-loesung.visustruct":HI,"../../lessons/diagramme/kino-frei-loesung.visustruct":VI,"../../lessons/diagramme/kino-frei-start.visustruct":QI,"../../lessons/diagramme/kino-karte-loesung.visustruct":qI,"../../lessons/diagramme/kino-karte-start.visustruct":UI,"../../lessons/diagramme/kino-saalplan.visustruct":$I,"../../lessons/diagramme/kino-verkaufen.visustruct":YI,"../../lessons/diagramme/l04-java-fehler-loesung.visustruct":XI,"../../lessons/diagramme/l04-java-fehler-start.visustruct":KI,"../../lessons/diagramme/l04-java-steckbrief-loesung.visustruct":e8,"../../lessons/diagramme/l04-rechnen.visustruct":t8,"../../lessons/diagramme/l04-reihenfolge-loesung.visustruct":n8,"../../lessons/diagramme/l04-reihenfolge-start.visustruct":i8,"../../lessons/diagramme/l04-tauschen-loesung.visustruct":a8,"../../lessons/diagramme/l04-tauschen-start.visustruct":s8,"../../lessons/diagramme/l04-tauschen.visustruct":r8,"../../lessons/diagramme/l05-datentypen.visustruct":o8,"../../lessons/diagramme/l05-division.visustruct":l8,"../../lessons/diagramme/l05-einkauf-loesung.visustruct":u8,"../../lessons/diagramme/l05-java-fehler-loesung.visustruct":m8,"../../lessons/diagramme/l05-java-fehler-start.visustruct":c8,"../../lessons/diagramme/l05-java-kino-loesung.visustruct":d8,"../../lessons/diagramme/l05-rechteck-loesung.visustruct":h8,"../../lessons/diagramme/l05-sekunden-loesung.visustruct":g8,"../../lessons/diagramme/l05-sekunden-start.visustruct":p8,"../../lessons/diagramme/l06-begruessung-loesung.visustruct":f8,"../../lessons/diagramme/l06-eva.visustruct":x8,"../../lessons/diagramme/l06-java-fehler-loesung.visustruct":b8,"../../lessons/diagramme/l06-java-fehler-start.visustruct":y8,"../../lessons/diagramme/l06-java-tage-loesung.visustruct":v8,"../../lessons/diagramme/l06-mittelwert-loesung.visustruct":w8,"../../lessons/diagramme/l06-rechner-loesung.visustruct":z8,"../../lessons/diagramme/l07-alter-pruefen.visustruct":I8,"../../lessons/diagramme/l07-betrag-loesung.visustruct":k8,"../../lessons/diagramme/l07-gerade-loesung.visustruct":S8,"../../lessons/diagramme/l07-java-fehler-loesung.visustruct":_8,"../../lessons/diagramme/l07-java-fehler-start.visustruct":T8,"../../lessons/diagramme/l07-java-pizza-loesung.visustruct":O8,"../../lessons/diagramme/l07-java-pizza-start.visustruct":A8,"../../lessons/diagramme/l07-maximum-loesung.visustruct":P8,"../../lessons/diagramme/l07-rabatt.visustruct":j8,"../../lessons/diagramme/l08-gueltig-loesung.visustruct":C8,"../../lessons/diagramme/l08-java-bestanden-loesung.visustruct":B8,"../../lessons/diagramme/l08-java-fehler-loesung.visustruct":D8,"../../lessons/diagramme/l08-java-fehler-start.visustruct":Z8,"../../lessons/diagramme/l08-jugendticket.visustruct":M8,"../../lessons/diagramme/l08-note.visustruct":L8,"../../lessons/diagramme/l08-schaltjahr-loesung.visustruct":W8,"../../lessons/diagramme/l08-wochenende-loesung.visustruct":E8,"../../lessons/diagramme/l09-ampel.visustruct":N8,"../../lessons/diagramme/l09-automat.visustruct":F8,"../../lessons/diagramme/l09-java-fehler-loesung.visustruct":J8,"../../lessons/diagramme/l09-java-fehler-start.visustruct":R8,"../../lessons/diagramme/l09-java-schule-loesung.visustruct":G8,"../../lessons/diagramme/l09-note-loesung.visustruct":H8,"../../lessons/diagramme/l09-rechner-loesung.visustruct":V8,"../../lessons/diagramme/l09-verschachtelt.visustruct":Q8,"../../lessons/diagramme/l1-grundbausteine.visustruct":q8,"../../lessons/diagramme/l1-sequenz.visustruct":U8,"../../lessons/diagramme/l1-tee.visustruct":$8,"../../lessons/diagramme/l1-verzweigung.visustruct":Y8,"../../lessons/diagramme/l1-wiederholung.visustruct":X8,"../../lessons/diagramme/l10-bis-n-loesung.visustruct":K8,"../../lessons/diagramme/l10-countdown.visustruct":ek,"../../lessons/diagramme/l10-endlos.visustruct":tk,"../../lessons/diagramme/l10-fakultaet.visustruct":nk,"../../lessons/diagramme/l10-java-fehler-loesung.visustruct":ik,"../../lessons/diagramme/l10-java-fehler-start.visustruct":ak,"../../lessons/diagramme/l10-java-wuerfel-loesung.visustruct":sk,"../../lessons/diagramme/l10-verdoppeln-loesung.visustruct":rk,"../../lessons/diagramme/l11-eingabe-pruefen.visustruct":ok,"../../lessons/diagramme/l11-einmal.visustruct":lk,"../../lessons/diagramme/l11-java-fehler-loesung.visustruct":uk,"../../lessons/diagramme/l11-java-fehler-start.visustruct":mk,"../../lessons/diagramme/l11-java-gerade-loesung.visustruct":ck,"../../lessons/diagramme/l11-note-loesung.visustruct":dk,"../../lessons/diagramme/l11-summe-loesung.visustruct":hk,"../../lessons/diagramme/l12-countdown-loesung.visustruct":gk,"../../lessons/diagramme/l12-einmaleins-loesung.visustruct":pk,"../../lessons/diagramme/l12-eins-bis-fuenf.visustruct":fk,"../../lessons/diagramme/l12-java-fehler-loesung.visustruct":xk,"../../lessons/diagramme/l12-java-fehler-start.visustruct":bk,"../../lessons/diagramme/l12-java-verdoppeln-loesung.visustruct":yk,"../../lessons/diagramme/l12-summe.visustruct":vk,"../../lessons/diagramme/l13-dreieck.visustruct":wk,"../../lessons/diagramme/l13-gerade-eingaben-loesung.visustruct":zk,"../../lessons/diagramme/l13-gerade-zaehlen.visustruct":Ik,"../../lessons/diagramme/l13-java-fehler-loesung.visustruct":kk,"../../lessons/diagramme/l13-java-fehler-start.visustruct":Sk,"../../lessons/diagramme/l13-java-quadrate-loesung.visustruct":_k,"../../lessons/diagramme/l13-rechteck-loesung.visustruct":Tk,"../../lessons/diagramme/l14-array-durchlaufen.visustruct":Ok,"../../lessons/diagramme/l14-erster-letzter-loesung.visustruct":Ak,"../../lessons/diagramme/l14-java-fehler-loesung.visustruct":Pk,"../../lessons/diagramme/l14-java-fehler-start.visustruct":jk,"../../lessons/diagramme/l14-java-treppe-loesung.visustruct":Ck,"../../lessons/diagramme/l14-namen-eingeben.visustruct":Bk,"../../lessons/diagramme/l14-rueckwaerts-loesung.visustruct":Dk,"../../lessons/diagramme/l14-summe-max-loesung.visustruct":Zk,"../../lessons/diagramme/l14-summe-maximum.visustruct":Mk,"../../lessons/diagramme/l15-bis-null-loesung.visustruct":Lk,"../../lessons/diagramme/l15-endlos-aussprung.visustruct":Wk,"../../lessons/diagramme/l15-flaeche-loesung.visustruct":Ek,"../../lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct":Nk,"../../lessons/diagramme/l15-hauptprogramm.visustruct":Fk,"../../lessons/diagramme/l15-java-fehler-loesung.visustruct":Jk,"../../lessons/diagramme/l15-java-fehler-start.visustruct":Rk,"../../lessons/diagramme/l15-java-noten-loesung.visustruct":Gk,"../../lessons/diagramme/l15-quadrat-haupt.visustruct":Hk,"../../lessons/diagramme/l15-quadrat.visustruct":Vk,"../../lessons/diagramme/l15-titel-loesung.visustruct":Qk,"../../lessons/diagramme/l15-unterprogramm.visustruct":qk,"../../lessons/diagramme/l15-zeige-summe-haupt.visustruct":Uk,"../../lessons/diagramme/l15-zeige-summe.visustruct":$k,"../../lessons/diagramme/l16-countdown-loesung.visustruct":Yk,"../../lessons/diagramme/l16-countdown-start.visustruct":Xk,"../../lessons/diagramme/l16-java-fehler-loesung.visustruct":Kk,"../../lessons/diagramme/l16-java-fehler-start.visustruct":eS,"../../lessons/diagramme/l16-java-punkte-loesung.visustruct":tS,"../../lessons/diagramme/l16-schreibtisch.visustruct":nS,"../../lessons/diagramme/l16-summe-loesung.visustruct":iS,"../../lessons/diagramme/l16-summe-start.visustruct":aS,"../../lessons/diagramme/l17-beispiel.visustruct":sS,"../../lessons/diagramme/l17-fakultaet-loesung.visustruct":rS,"../../lessons/diagramme/l17-java-brief-loesung.visustruct":oS,"../../lessons/diagramme/l17-java-brief-start.visustruct":lS,"../../lessons/diagramme/l17-java-fehler-loesung.visustruct":uS,"../../lessons/diagramme/l17-java-fehler-start.visustruct":mS,"../../lessons/diagramme/l17-java-passwort-loesung.visustruct":cS,"../../lessons/diagramme/l17-ticket-loesung.visustruct":dS,"../../lessons/diagramme/l18-beispiel.visustruct":hS,"../../lessons/diagramme/l18-java-fehler-loesung.visustruct":gS,"../../lessons/diagramme/l18-java-fehler-start.visustruct":pS,"../../lessons/diagramme/l18-java-kasse-loesung.visustruct":fS,"../../lessons/diagramme/l18-js-loesung.visustruct":xS,"../../lessons/diagramme/l18-python-loesung.visustruct":bS,"../../lessons/diagramme/l19-java-fehler-loesung.visustruct":yS,"../../lessons/diagramme/l19-java-fehler-start.visustruct":vS,"../../lessons/diagramme/l19-java-zaehlen-loesung.visustruct":wS,"../../lessons/diagramme/l2-ausgabe.visustruct":zS,"../../lessons/diagramme/l2-hallo-loesung.visustruct":IS,"../../lessons/diagramme/l2-zwei-zeilen-loesung.visustruct":kS,"../../lessons/diagramme/l20-countdown-loesung.visustruct":SS,"../../lessons/diagramme/l23-java-ergaenzen-loesung.visustruct":_S,"../../lessons/diagramme/l23-java-ergaenzen-start.visustruct":TS,"../../lessons/diagramme/l23-java-nummern-loesung.visustruct":OS,"../../lessons/diagramme/l23-java-nummern-start.visustruct":AS,"../../lessons/diagramme/l24-java-fuchs-loesung.visustruct":PS,"../../lessons/diagramme/l24-java-fuchs-start.visustruct":jS,"../../lessons/diagramme/l24-java-laengster-loesung.visustruct":CS,"../../lessons/diagramme/l24-java-laengster-start.visustruct":BS,"../../lessons/diagramme/l25-java-beste-loesung.visustruct":DS,"../../lessons/diagramme/l25-java-beste-start.visustruct":ZS,"../../lessons/diagramme/l25-java-schnitt-loesung.visustruct":MS,"../../lessons/diagramme/l25-java-schnitt-start.visustruct":LS,"../../lessons/diagramme/l26-java-namen-loesung.visustruct":WS,"../../lessons/diagramme/l26-java-namen-start.visustruct":ES,"../../lessons/diagramme/l26-java-schreiben-loesung.visustruct":NS,"../../lessons/diagramme/l26-java-schreiben-start.visustruct":FS,"../../lessons/diagramme/l27-java-json-loesung.visustruct":JS,"../../lessons/diagramme/l27-java-json-start.visustruct":RS,"../../lessons/diagramme/l27-java-saetze-loesung.visustruct":GS,"../../lessons/diagramme/l27-java-saetze-start.visustruct":HS,"../../lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct":VS,"../../lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct":QS,"../../lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct":qS,"../../lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct":US,"../../lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct":$S,"../../lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct":YS,"../../lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct":XS,"../../lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct":KS,"../../lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct":e_,"../../lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct":t_,"../../lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct":n_,"../../lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct":i_,"../../lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct":a_,"../../lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct":s_,"../../lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct":r_,"../../lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct":o_,"../../lessons/diagramme/pt/aufgabe-pin-loesung.visustruct":l_,"../../lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct":u_,"../../lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct":m_,"../../lessons/diagramme/pt/aufgabe-schiffe-start.visustruct":c_,"../../lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct":d_,"../../lessons/diagramme/pt/aufgabe-summe-loesung.visustruct":h_,"../../lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct":g_,"../../lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct":p_,"../../lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct":f_,"../../lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct":x_,"../../lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct":b_,"../../lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct":y_,"../../lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct":v_,"../../lessons/diagramme/pt/dt-buffered.visustruct":w_,"../../lessons/diagramme/pt/dt-csv.visustruct":z_,"../../lessons/diagramme/pt/dt-json.visustruct":I_,"../../lessons/diagramme/pt/dt-lesen.visustruct":k_,"../../lessons/diagramme/pt/kino-einmaleins-loesung.visustruct":S_,"../../lessons/diagramme/pt/kino-frei-loesung.visustruct":__,"../../lessons/diagramme/pt/kino-frei-start.visustruct":T_,"../../lessons/diagramme/pt/kino-karte-loesung.visustruct":O_,"../../lessons/diagramme/pt/kino-karte-start.visustruct":A_,"../../lessons/diagramme/pt/kino-saalplan.visustruct":P_,"../../lessons/diagramme/pt/kino-verkaufen.visustruct":j_,"../../lessons/diagramme/pt/l04-java-fehler-loesung.visustruct":C_,"../../lessons/diagramme/pt/l04-java-fehler-start.visustruct":B_,"../../lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct":D_,"../../lessons/diagramme/pt/l04-rechnen.visustruct":Z_,"../../lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct":M_,"../../lessons/diagramme/pt/l04-reihenfolge-start.visustruct":L_,"../../lessons/diagramme/pt/l04-tauschen-loesung.visustruct":W_,"../../lessons/diagramme/pt/l04-tauschen-start.visustruct":E_,"../../lessons/diagramme/pt/l04-tauschen.visustruct":N_,"../../lessons/diagramme/pt/l05-datentypen.visustruct":F_,"../../lessons/diagramme/pt/l05-division.visustruct":J_,"../../lessons/diagramme/pt/l05-einkauf-loesung.visustruct":R_,"../../lessons/diagramme/pt/l05-java-fehler-loesung.visustruct":G_,"../../lessons/diagramme/pt/l05-java-fehler-start.visustruct":H_,"../../lessons/diagramme/pt/l05-java-kino-loesung.visustruct":V_,"../../lessons/diagramme/pt/l05-rechteck-loesung.visustruct":Q_,"../../lessons/diagramme/pt/l05-sekunden-loesung.visustruct":q_,"../../lessons/diagramme/pt/l05-sekunden-start.visustruct":U_,"../../lessons/diagramme/pt/l06-begruessung-loesung.visustruct":$_,"../../lessons/diagramme/pt/l06-eva.visustruct":Y_,"../../lessons/diagramme/pt/l06-java-fehler-loesung.visustruct":X_,"../../lessons/diagramme/pt/l06-java-fehler-start.visustruct":K_,"../../lessons/diagramme/pt/l06-java-tage-loesung.visustruct":eT,"../../lessons/diagramme/pt/l06-mittelwert-loesung.visustruct":tT,"../../lessons/diagramme/pt/l06-rechner-loesung.visustruct":nT,"../../lessons/diagramme/pt/l07-alter-pruefen.visustruct":iT,"../../lessons/diagramme/pt/l07-betrag-loesung.visustruct":aT,"../../lessons/diagramme/pt/l07-gerade-loesung.visustruct":sT,"../../lessons/diagramme/pt/l07-java-fehler-loesung.visustruct":rT,"../../lessons/diagramme/pt/l07-java-fehler-start.visustruct":oT,"../../lessons/diagramme/pt/l07-java-pizza-loesung.visustruct":lT,"../../lessons/diagramme/pt/l07-java-pizza-start.visustruct":uT,"../../lessons/diagramme/pt/l07-maximum-loesung.visustruct":mT,"../../lessons/diagramme/pt/l07-rabatt.visustruct":cT,"../../lessons/diagramme/pt/l08-gueltig-loesung.visustruct":dT,"../../lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct":hT,"../../lessons/diagramme/pt/l08-java-fehler-loesung.visustruct":gT,"../../lessons/diagramme/pt/l08-java-fehler-start.visustruct":pT,"../../lessons/diagramme/pt/l08-jugendticket.visustruct":fT,"../../lessons/diagramme/pt/l08-note.visustruct":xT,"../../lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct":bT,"../../lessons/diagramme/pt/l08-wochenende-loesung.visustruct":yT,"../../lessons/diagramme/pt/l09-ampel.visustruct":vT,"../../lessons/diagramme/pt/l09-automat.visustruct":wT,"../../lessons/diagramme/pt/l09-java-fehler-loesung.visustruct":zT,"../../lessons/diagramme/pt/l09-java-fehler-start.visustruct":IT,"../../lessons/diagramme/pt/l09-java-schule-loesung.visustruct":kT,"../../lessons/diagramme/pt/l09-note-loesung.visustruct":ST,"../../lessons/diagramme/pt/l09-rechner-loesung.visustruct":_T,"../../lessons/diagramme/pt/l09-verschachtelt.visustruct":TT,"../../lessons/diagramme/pt/l1-grundbausteine.visustruct":OT,"../../lessons/diagramme/pt/l1-sequenz.visustruct":AT,"../../lessons/diagramme/pt/l1-tee.visustruct":PT,"../../lessons/diagramme/pt/l1-verzweigung.visustruct":jT,"../../lessons/diagramme/pt/l1-wiederholung.visustruct":CT,"../../lessons/diagramme/pt/l10-bis-n-loesung.visustruct":BT,"../../lessons/diagramme/pt/l10-countdown.visustruct":DT,"../../lessons/diagramme/pt/l10-endlos.visustruct":ZT,"../../lessons/diagramme/pt/l10-fakultaet.visustruct":MT,"../../lessons/diagramme/pt/l10-java-fehler-loesung.visustruct":LT,"../../lessons/diagramme/pt/l10-java-fehler-start.visustruct":WT,"../../lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct":ET,"../../lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct":NT,"../../lessons/diagramme/pt/l11-eingabe-pruefen.visustruct":FT,"../../lessons/diagramme/pt/l11-einmal.visustruct":JT,"../../lessons/diagramme/pt/l11-java-fehler-loesung.visustruct":RT,"../../lessons/diagramme/pt/l11-java-fehler-start.visustruct":GT,"../../lessons/diagramme/pt/l11-java-gerade-loesung.visustruct":HT,"../../lessons/diagramme/pt/l11-note-loesung.visustruct":VT,"../../lessons/diagramme/pt/l11-summe-loesung.visustruct":QT,"../../lessons/diagramme/pt/l12-countdown-loesung.visustruct":qT,"../../lessons/diagramme/pt/l12-einmaleins-loesung.visustruct":UT,"../../lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct":$T,"../../lessons/diagramme/pt/l12-java-fehler-loesung.visustruct":YT,"../../lessons/diagramme/pt/l12-java-fehler-start.visustruct":XT,"../../lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct":KT,"../../lessons/diagramme/pt/l12-summe.visustruct":eO,"../../lessons/diagramme/pt/l13-dreieck.visustruct":tO,"../../lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct":nO,"../../lessons/diagramme/pt/l13-gerade-zaehlen.visustruct":iO,"../../lessons/diagramme/pt/l13-java-fehler-loesung.visustruct":aO,"../../lessons/diagramme/pt/l13-java-fehler-start.visustruct":sO,"../../lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct":rO,"../../lessons/diagramme/pt/l13-rechteck-loesung.visustruct":oO,"../../lessons/diagramme/pt/l14-array-durchlaufen.visustruct":lO,"../../lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct":uO,"../../lessons/diagramme/pt/l14-java-fehler-loesung.visustruct":mO,"../../lessons/diagramme/pt/l14-java-fehler-start.visustruct":cO,"../../lessons/diagramme/pt/l14-java-treppe-loesung.visustruct":dO,"../../lessons/diagramme/pt/l14-namen-eingeben.visustruct":hO,"../../lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct":gO,"../../lessons/diagramme/pt/l14-summe-max-loesung.visustruct":pO,"../../lessons/diagramme/pt/l14-summe-maximum.visustruct":fO,"../../lessons/diagramme/pt/l15-bis-null-loesung.visustruct":xO,"../../lessons/diagramme/pt/l15-endlos-aussprung.visustruct":bO,"../../lessons/diagramme/pt/l15-flaeche-loesung.visustruct":yO,"../../lessons/diagramme/pt/l15-hauptprogramm.visustruct":vO,"../../lessons/diagramme/pt/l15-java-fehler-loesung.visustruct":wO,"../../lessons/diagramme/pt/l15-java-fehler-start.visustruct":zO,"../../lessons/diagramme/pt/l15-java-noten-loesung.visustruct":IO,"../../lessons/diagramme/pt/l15-quadrat-haupt.visustruct":kO,"../../lessons/diagramme/pt/l15-quadrat.visustruct":SO,"../../lessons/diagramme/pt/l15-titel-loesung.visustruct":_O,"../../lessons/diagramme/pt/l15-unterprogramm.visustruct":TO,"../../lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct":OO,"../../lessons/diagramme/pt/l15-zeige-summe.visustruct":AO,"../../lessons/diagramme/pt/l16-countdown-loesung.visustruct":PO,"../../lessons/diagramme/pt/l16-countdown-start.visustruct":jO,"../../lessons/diagramme/pt/l16-java-fehler-loesung.visustruct":CO,"../../lessons/diagramme/pt/l16-java-fehler-start.visustruct":BO,"../../lessons/diagramme/pt/l16-java-punkte-loesung.visustruct":DO,"../../lessons/diagramme/pt/l16-schreibtisch.visustruct":ZO,"../../lessons/diagramme/pt/l16-summe-loesung.visustruct":MO,"../../lessons/diagramme/pt/l16-summe-start.visustruct":LO,"../../lessons/diagramme/pt/l17-beispiel.visustruct":WO,"../../lessons/diagramme/pt/l17-fakultaet-loesung.visustruct":EO,"../../lessons/diagramme/pt/l17-java-brief-loesung.visustruct":NO,"../../lessons/diagramme/pt/l17-java-brief-start.visustruct":FO,"../../lessons/diagramme/pt/l17-java-fehler-loesung.visustruct":JO,"../../lessons/diagramme/pt/l17-java-fehler-start.visustruct":RO,"../../lessons/diagramme/pt/l17-java-passwort-loesung.visustruct":GO,"../../lessons/diagramme/pt/l17-ticket-loesung.visustruct":HO,"../../lessons/diagramme/pt/l18-beispiel.visustruct":VO,"../../lessons/diagramme/pt/l18-java-fehler-loesung.visustruct":QO,"../../lessons/diagramme/pt/l18-java-fehler-start.visustruct":qO,"../../lessons/diagramme/pt/l18-java-kasse-loesung.visustruct":UO,"../../lessons/diagramme/pt/l18-js-loesung.visustruct":$O,"../../lessons/diagramme/pt/l18-python-loesung.visustruct":YO,"../../lessons/diagramme/pt/l19-java-fehler-loesung.visustruct":XO,"../../lessons/diagramme/pt/l19-java-fehler-start.visustruct":KO,"../../lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct":eA,"../../lessons/diagramme/pt/l2-ausgabe.visustruct":tA,"../../lessons/diagramme/pt/l2-hallo-loesung.visustruct":nA,"../../lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct":iA,"../../lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct":aA,"../../lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct":sA,"../../lessons/diagramme/pt/l23-java-nummern-loesung.visustruct":rA,"../../lessons/diagramme/pt/l23-java-nummern-start.visustruct":oA,"../../lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct":lA,"../../lessons/diagramme/pt/l24-java-fuchs-start.visustruct":uA,"../../lessons/diagramme/pt/l24-java-laengster-loesung.visustruct":mA,"../../lessons/diagramme/pt/l24-java-laengster-start.visustruct":cA,"../../lessons/diagramme/pt/l25-java-beste-loesung.visustruct":dA,"../../lessons/diagramme/pt/l25-java-beste-start.visustruct":hA,"../../lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct":gA,"../../lessons/diagramme/pt/l25-java-schnitt-start.visustruct":pA,"../../lessons/diagramme/pt/l26-java-namen-loesung.visustruct":fA,"../../lessons/diagramme/pt/l26-java-namen-start.visustruct":xA,"../../lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct":bA,"../../lessons/diagramme/pt/l26-java-schreiben-start.visustruct":yA,"../../lessons/diagramme/pt/l27-java-json-loesung.visustruct":vA,"../../lessons/diagramme/pt/l27-java-json-start.visustruct":wA,"../../lessons/diagramme/pt/l27-java-saetze-loesung.visustruct":zA,"../../lessons/diagramme/pt/l27-java-saetze-start.visustruct":IA,"../../lessons/diagramme/pt/sim-kino-loesung.visustruct":kA,"../../lessons/diagramme/pt/sim-kino-start.visustruct":SA,"../../lessons/diagramme/pt/sim-tausch-loesung.visustruct":_A,"../../lessons/diagramme/pt/sim-tausch-start.visustruct":TA,"../../lessons/diagramme/pt/sim-tausch.visustruct":OA,"../../lessons/diagramme/pt/ss-absteigend-loesung.visustruct":AA,"../../lessons/diagramme/pt/ss-absteigend-start.visustruct":PA,"../../lessons/diagramme/pt/ss-binaere-suche.visustruct":jA,"../../lessons/diagramme/pt/ss-bubblesort.visustruct":CA,"../../lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct":BA,"../../lessons/diagramme/pt/ss-lineare-suche.visustruct":DA,"../../lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct":ZA,"../../lessons/diagramme/pt/uebergabe-bonus-start.visustruct":MA,"../../lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct":LA,"../../lessons/diagramme/pt/uebergabe-haupt.visustruct":WA,"../../lessons/diagramme/pt/uebergabe-leeren.visustruct":EA,"../../lessons/diagramme/pt/uebergabe-verdopple.visustruct":NA,"../../lessons/diagramme/pt/zk-initialen-loesung.visustruct":FA,"../../lessons/diagramme/pt/zk-mehr.visustruct":JA,"../../lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct":RA,"../../lessons/diagramme/pt/zk-split.visustruct":GA,"../../lessons/diagramme/pt/zk-woerter-loesung.visustruct":HA,"../../lessons/diagramme/pt/zk-zaehlen.visustruct":VA,"../../lessons/diagramme/pt/zk-zeichen.visustruct":QA,"../../lessons/diagramme/sim-kino-loesung.visustruct":qA,"../../lessons/diagramme/sim-kino-start.visustruct":UA,"../../lessons/diagramme/sim-tausch-loesung.visustruct":$A,"../../lessons/diagramme/sim-tausch-start.visustruct":YA,"../../lessons/diagramme/sim-tausch.visustruct":XA,"../../lessons/diagramme/ss-absteigend-loesung.visustruct":KA,"../../lessons/diagramme/ss-absteigend-start.visustruct":eP,"../../lessons/diagramme/ss-binaere-suche.visustruct":tP,"../../lessons/diagramme/ss-bubblesort.visustruct":nP,"../../lessons/diagramme/ss-karte-suchen-loesung.visustruct":iP,"../../lessons/diagramme/ss-lineare-suche.visustruct":aP,"../../lessons/diagramme/uebergabe-bonus-loesung.visustruct":sP,"../../lessons/diagramme/uebergabe-bonus-start.visustruct":rP,"../../lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct":oP,"../../lessons/diagramme/uebergabe-haupt.visustruct":lP,"../../lessons/diagramme/uebergabe-leeren.visustruct":uP,"../../lessons/diagramme/uebergabe-verdopple.visustruct":mP,"../../lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct":cP,"../../lessons/diagramme/vb-abstand-halten-loesung.visustruct":dP,"../../lessons/diagramme/vb-alarmanlage-loesung.visustruct":hP,"../../lessons/diagramme/vb-ampel-loesung.visustruct":gP,"../../lessons/diagramme/vb-ausgang-loesung.visustruct":pP,"../../lessons/diagramme/vb-begruessung-loesung.visustruct":fP,"../../lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct":xP,"../../lessons/diagramme/vb-bis-rot-loesung.visustruct":bP,"../../lessons/diagramme/vb-bis-wand-loesung.visustruct":yP,"../../lessons/diagramme/vb-bis-ziel-loesung.visustruct":vP,"../../lessons/diagramme/vb-buchstaben-loesung.visustruct":wP,"../../lessons/diagramme/vb-drei-lichter-loesung.visustruct":zP,"../../lessons/diagramme/vb-dreieck-loesung.visustruct":IP,"../../lessons/diagramme/vb-einparken-loesung.visustruct":kP,"../../lessons/diagramme/vb-farben-loesung.visustruct":SP,"../../lessons/diagramme/vb-farbweiche-loesung.visustruct":_P,"../../lessons/diagramme/vb-gas-bis-wand-loesung.visustruct":TP,"../../lessons/diagramme/vb-gerade-loesung.visustruct":OP,"../../lessons/diagramme/vb-hindernis-loesung.visustruct":AP,"../../lessons/diagramme/vb-java-akku-loesung.visustruct":PP,"../../lessons/diagramme/vb-java-blau-gruen-loesung.visustruct":jP,"../../lessons/diagramme/vb-java-blinken-loesung.visustruct":CP,"../../lessons/diagramme/vb-java-countdown-loesung.visustruct":BP,"../../lessons/diagramme/vb-java-hoeher-loesung.visustruct":DP,"../../lessons/diagramme/vb-java-joystick-loesung.visustruct":ZP,"../../lessons/diagramme/vb-java-laermampel-loesung.visustruct":MP,"../../lessons/diagramme/vb-java-lauflicht-loesung.visustruct":LP,"../../lessons/diagramme/vb-java-linienfolger-loesung.visustruct":WP,"../../lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct":EP,"../../lessons/diagramme/vb-java-rand-loesung.visustruct":NP,"../../lessons/diagramme/vb-java-rechteck-loesung.visustruct":FP,"../../lessons/diagramme/vb-java-textlaenge-loesung.visustruct":JP,"../../lessons/diagramme/vb-java-wand-piep-loesung.visustruct":RP,"../../lessons/diagramme/vb-java-wasserwaage-loesung.visustruct":GP,"../../lessons/diagramme/vb-klatschen-loesung.visustruct":HP,"../../lessons/diagramme/vb-knight-rider-loesung.visustruct":VP,"../../lessons/diagramme/vb-labyrinth-loesung.visustruct":QP,"../../lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct":qP,"../../lessons/diagramme/vb-linienmuster-loesung.visustruct":UP,"../../lessons/diagramme/vb-melodie-loesung.visustruct":$P,"../../lessons/diagramme/vb-morsen-loesung.visustruct":YP,"../../lessons/diagramme/vb-nachtlicht-loesung.visustruct":XP,"../../lessons/diagramme/vb-nachtwaechter-loesung.visustruct":KP,"../../lessons/diagramme/vb-ohne-noten-loesung.visustruct":ej,"../../lessons/diagramme/vb-ohne-quadratzahl-loesung.visustruct":tj,"../../lessons/diagramme/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":nj,"../../lessons/diagramme/vb-ohne-rueckwaerts-loesung.visustruct":ij,"../../lessons/diagramme/vb-ohne-strecke-loesung.visustruct":aj,"../../lessons/diagramme/vb-ohne-summe-loesung.visustruct":sj,"../../lessons/diagramme/vb-quadrat-loesung.visustruct":rj,"../../lessons/diagramme/vb-quadrat-methode-loesung.visustruct":oj,"../../lessons/diagramme/vb-quadrat-schleife-loesung.visustruct":lj,"../../lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct":uj,"../../lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct":mj,"../../lessons/diagramme/vb-rand-loesung.visustruct":cj,"../../lessons/diagramme/vb-schraeglage-loesung.visustruct":dj,"../../lessons/diagramme/vb-slalom-loesung.visustruct":hj,"../../lessons/diagramme/vb-spirale-loesung.visustruct":gj,"../../lessons/diagramme/vb-start-a-loesung.visustruct":pj,"../../lessons/diagramme/vb-tonleiter-loesung.visustruct":fj,"../../lessons/diagramme/vb-treppe-loesung.visustruct":xj,"../../lessons/diagramme/vb-tunnel-loesung.visustruct":bj,"../../lessons/diagramme/vb-variable-seite-loesung.visustruct":yj,"../../lessons/diagramme/vb-vier-quadrate-loesung.visustruct":vj,"../../lessons/diagramme/vb-wald-loesung.visustruct":wj,"../../lessons/diagramme/vb-wand-vorn-loesung.visustruct":zj,"../../lessons/diagramme/vb-zwei-sekunden-loesung.visustruct":Ij,"../../lessons/diagramme/zk-initialen-loesung.visustruct":kj,"../../lessons/diagramme/zk-mehr.visustruct":Sj,"../../lessons/diagramme/zk-rueckwaerts-loesung.visustruct":_j,"../../lessons/diagramme/zk-split.visustruct":Tj,"../../lessons/diagramme/zk-woerter-loesung.visustruct":Oj,"../../lessons/diagramme/zk-zaehlen.visustruct":Aj,"../../lessons/diagramme/zk-zeichen.visustruct":Pj}),UB=Object.assign({"../../lessons/welten/ausgang-1.txt":jj,"../../lessons/welten/ausgang-2.txt":Cj,"../../lessons/welten/ecke.txt":Bj,"../../lessons/welten/farbe-1.txt":Dj,"../../lessons/welten/farbe-2.txt":Zj,"../../lessons/welten/farbe-3.txt":Mj,"../../lessons/welten/farbe-4.txt":Lj,"../../lessons/welten/hindernis-1.txt":Wj,"../../lessons/welten/hindernis-2.txt":Ej,"../../lessons/welten/labyrinth-1.txt":Nj,"../../lessons/welten/labyrinth-2.txt":Fj,"../../lessons/welten/linie-1.txt":Jj,"../../lessons/welten/linie-2.txt":Rj,"../../lessons/welten/linie-rot-1.txt":Gj,"../../lessons/welten/linie-rot-2.txt":Hj,"../../lessons/welten/parken-1.txt":Vj,"../../lessons/welten/parken-2.txt":Qj,"../../lessons/welten/rand-1.txt":qj,"../../lessons/welten/rand-2.txt":Uj,"../../lessons/welten/slalom.txt":$j,"../../lessons/welten/tunnel-1.txt":Yj,"../../lessons/welten/tunnel-2.txt":Xj,"../../lessons/welten/wald-1.txt":Kj,"../../lessons/welten/wald-2.txt":eC,"../../lessons/welten/wand-frei.txt":tC,"../../lessons/welten/wand-kurz.txt":nC,"../../lessons/welten/wand-lang.txt":iC,"../../lessons/welten/wand-mittel.txt":aC,"../../lessons/welten/wand-nah.txt":sC,"../../lessons/welten/zeit-1.txt":rC,"../../lessons/welten/ziel-kurz.txt":oC,"../../lessons/welten/ziel-lang.txt":lC}),$B=Object.assign({"../../lessons/bilder/aufgabe-mehrwertsteuer.svg":uC,"../../lessons/bilder/ben-shneiderman.jpg":mC,"../../lessons/bilder/caesar-ascii.svg":cC,"../../lessons/bilder/caesar-scheibe.svg":dC,"../../lessons/bilder/caesar-verschiebung.svg":hC,"../../lessons/bilder/en/aufgabe-mehrwertsteuer.svg":gC,"../../lessons/bilder/en/kino-saal.svg":pC,"../../lessons/bilder/en/kino-schleifen.svg":fC,"../../lessons/bilder/en/l01-pap.svg":xC,"../../lessons/bilder/en/l02-einfuegen.svg":bC,"../../lessons/bilder/en/l04-variable.svg":yC,"../../lessons/bilder/en/l04-zuweisung.svg":vC,"../../lessons/bilder/en/l05-tauschen.svg":wC,"../../lessons/bilder/en/l08-zahlenstrahl.svg":zC,"../../lessons/bilder/en/l10-kopfgesteuert.svg":IC,"../../lessons/bilder/en/l11-vergleich.svg":kC,"../../lessons/bilder/en/l12-for-ablauf.svg":SC,"../../lessons/bilder/en/l14-array.svg":_C,"../../lessons/bilder/en/mvc-klick.svg":TC,"../../lessons/bilder/en/ss-binaere-suche.svg":OC,"../../lessons/bilder/en/ss-bubblesort.svg":AC,"../../lessons/bilder/en/ss-lineare-suche.svg":PC,"../../lessons/bilder/en/ss-vergleiche.svg":jC,"../../lessons/bilder/en/uebergabe.svg":CC,"../../lessons/bilder/en/zk-zeichen.svg":BC,"../../lessons/bilder/ike-nassi.jpg":DC,"../../lessons/bilder/kino-saal.svg":ZC,"../../lessons/bilder/kino-schleifen.svg":MC,"../../lessons/bilder/l01-pap.svg":LC,"../../lessons/bilder/l02-einfuegen.svg":WC,"../../lessons/bilder/l04-variable.svg":EC,"../../lessons/bilder/l04-zuweisung.svg":NC,"../../lessons/bilder/l05-tauschen.svg":FC,"../../lessons/bilder/l08-zahlenstrahl.svg":JC,"../../lessons/bilder/l09-wahrheitstabelle.svg":RC,"../../lessons/bilder/l10-kopfgesteuert.svg":GC,"../../lessons/bilder/l11-vergleich.svg":HC,"../../lessons/bilder/l12-for-ablauf.svg":VC,"../../lessons/bilder/l14-array.svg":QC,"../../lessons/bilder/mvc-klick.svg":qC,"../../lessons/bilder/pt/aufgabe-mehrwertsteuer.svg":UC,"../../lessons/bilder/pt/kino-saal.svg":$C,"../../lessons/bilder/pt/kino-schleifen.svg":YC,"../../lessons/bilder/pt/l01-pap.svg":XC,"../../lessons/bilder/pt/l02-einfuegen.svg":KC,"../../lessons/bilder/pt/l04-variable.svg":eB,"../../lessons/bilder/pt/l04-zuweisung.svg":tB,"../../lessons/bilder/pt/l05-tauschen.svg":nB,"../../lessons/bilder/pt/l08-zahlenstrahl.svg":iB,"../../lessons/bilder/pt/l10-kopfgesteuert.svg":aB,"../../lessons/bilder/pt/l11-vergleich.svg":sB,"../../lessons/bilder/pt/l12-for-ablauf.svg":rB,"../../lessons/bilder/pt/l14-array.svg":oB,"../../lessons/bilder/pt/mvc-klick.svg":lB,"../../lessons/bilder/pt/schiffe-versenken.svg":uB,"../../lessons/bilder/pt/ss-binaere-suche.svg":mB,"../../lessons/bilder/pt/ss-bubblesort.svg":cB,"../../lessons/bilder/pt/ss-lineare-suche.svg":dB,"../../lessons/bilder/pt/ss-vergleiche.svg":hB,"../../lessons/bilder/pt/uebergabe.svg":gB,"../../lessons/bilder/pt/zk-zeichen.svg":pB,"../../lessons/bilder/schiffe-versenken.svg":fB,"../../lessons/bilder/ss-binaere-suche.svg":xB,"../../lessons/bilder/ss-bubblesort.svg":bB,"../../lessons/bilder/ss-lineare-suche.svg":yB,"../../lessons/bilder/ss-vergleiche.svg":vB,"../../lessons/bilder/uebergabe.svg":wB,"../../lessons/bilder/zk-zeichen.svg":zB}),Fh=i=>i.replace(/^.*\//,"");function F1(i,e,t){const n=s=>new Map(Object.entries(i).filter(([r])=>{var o;return((o=e.exec(r))==null?void 0:o[1])===s}).map(([r,o])=>[Fh(r),o]));return[...new Map([...n("en"),...t==="en"?[]:n(t)])]}function Mu(i){return i==="de"?"de":i==="pt-PT"?"pt":"en"}let w1="en",Ot=[],Tn=[],Ma="",La=[],ds="off";function Lu(i){i!==ds&&(ds=i,Ot=[],hs(w1))}function hs(i){var s,r,o;if(K2(i),i===w1&&Ot.length>0)return;w1=i;const e=F1(HB,/\/lessons\/([^/]+)\/[^/]+\.md$/,i),t=(l,u)=>l.filter(([m])=>/^\d+/.test(m)).map(([m,c])=>RB(Nu(c,u),`${i}/${m}`)).sort((m,c)=>m.number-c.number),n=(l,u,m)=>l.map(([c,d])=>{const h=GB(Nu(d,m),`${i}/${u}${c}`);return m&&h.after!==void 0?{...h,after:m.get(h.after)??h.after}:h}),a=F1(VB,/\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/,i);if(ds==="on"){const l=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i),u=YB(Eu(e),Eu(l)),m=t(e,u.normal),c=h=>{var g;return((g=[...m].reverse().find(f=>u.normal.get(f.number)({...h,number:u.normal.get(h.number)})),...t(l,u.robot).map(h=>{const g=u.robot.get(h.number);return{...h,number:g,section:c(g),robot:!0}})].sort((h,g)=>h.number-g.number);const d=F1(QB,/\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/,i);Tn=[...n(a,"aufgaben/",u.normal),...n(d,"visubot/aufgaben/",u.robot).map(h=>({...h,robot:!0}))]}else Ot=t(e),Tn=n(a,"aufgaben/");Tn.sort((l,u)=>(l.after??0)-(u.after??0)||l.level-u.level||l.title.localeCompare(u.title,i));for(const l of[...Ot.flatMap(u=>u.steps.flatMap(m=>m.blocks)),...Tn.flatMap(u=>u.blocks)])l.kind==="textFile"&&u3(l.name,l.content);if(Ma=((s=e.find(([l])=>l==="nachschlagen.md"))==null?void 0:s[1])??"",ds!=="off"){const l=(r=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i).find(([u])=>u==="nachschlagen.md"))==null?void 0:r[1];l&&(Ma=`${Ma.trimEnd()} +`)){const h=/^##\s+(.*)$/.exec(d);h?(u(),l={title:h[1].trim(),lines:[]}):l?l.lines.push(d):o.push(d)}if(u(),r.length===0)throw new te(`${e}: Keine Schritte (## Überschrift) gefunden.`);RB(r,e);const m=t.get("titel");if(!m)throw new te(`${e}: „titel:“ fehlt.`);return{id:a,number:s,title:m,section:t.get("bereich")??"",summary:t.get("kurz")??o.join(" ").trim(),steps:r}}function HB(i,e){const{meta:t,body:n}=Eh(i,e),a=t.get("titel");if(!a)throw new te(`${e}: „titel:“ fehlt.`);const s=t.get("nach");return{id:e.replace(/^.*\//,"").replace(/\.md$/,""),title:a,after:s?Number(s):void 0,level:Number(t.get("stufe")??"1")||1,blocks:Fh(n,e)}}function Du(i,e){const t=i.split(/\s*,\s*/).map(n=>n.trim()).filter(Boolean);for(const n of t)if(!o3(n))throw new te(`${e}: Unbekanntes Teil „${n}“. Bekannt: ${ih.join(", ")}.`);return t}const VB=Object.assign({"../../lessons/de/01-was-ist-ein-struktogramm.md":Yx,"../../lessons/de/02-der-editor.md":Xx,"../../lessons/de/03-speichern-oeffnen-exportieren.md":Kx,"../../lessons/de/04-variablen-und-datentypen.md":eb,"../../lessons/de/05-sequenz.md":tb,"../../lessons/de/06-eingabe-und-ausgabe.md":nb,"../../lessons/de/07-simulation-und-schreibtischtest.md":ib,"../../lessons/de/08-verzweigung.md":ab,"../../lessons/de/09-bedingungen-verknuepfen.md":sb,"../../lessons/de/10-fallauswahl.md":rb,"../../lessons/de/11-while-schleife.md":ob,"../../lessons/de/12-do-while-schleife.md":lb,"../../lessons/de/13-for-schleife.md":ub,"../../lessons/de/14-verschachteln.md":mb,"../../lessons/de/15-arrays.md":cb,"../../lessons/de/16-zweidimensionale-arrays.md":db,"../../lessons/de/17-zeichenketten.md":hb,"../../lessons/de/18-aufruf-und-aussprung.md":gb,"../../lessons/de/19-suchen-und-sortieren.md":pb,"../../lessons/de/20-java.md":fb,"../../lessons/de/21-python-und-javascript.md":xb,"../../lessons/de/22-try-und-catch.md":bb,"../../lessons/de/23-text-einlesen-und-speichern.md":yb,"../../lessons/de/24-zeile-fuer-zeile.md":vb,"../../lessons/de/25-tabellen-als-csv.md":wb,"../../lessons/de/26-json.md":zb,"../../lessons/de/27-formate-im-vergleich.md":Ib,"../../lessons/de/28-erstes-fenster.md":kb,"../../lessons/de/29-knopf-im-fenster.md":Sb,"../../lessons/de/30-der-knopf-reagiert.md":_b,"../../lessons/de/31-zahl-verdoppeln.md":Tb,"../../lessons/de/32-klickzaehler.md":Ob,"../../lessons/de/33-ampel.md":Ab,"../../lessons/de/34-notenrechner.md":Pb,"../../lessons/de/35-taschenrechner.md":jb,"../../lessons/de/36-zahlenraten.md":Cb,"../../lessons/de/37-viele-knoepfe-ein-zuhoerer.md":Bb,"../../lessons/de/38-innere-klassen.md":Db,"../../lessons/de/39-zwei-reiter.md":Zb,"../../lessons/de/40-model-view-controller.md":Mb,"../../lessons/de/begriffe.md":Lb,"../../lessons/de/nachschlagen.md":Wb,"../../lessons/en/01-was-ist-ein-struktogramm.md":Eb,"../../lessons/en/02-der-editor.md":Nb,"../../lessons/en/03-speichern-oeffnen-exportieren.md":Fb,"../../lessons/en/04-variablen-und-datentypen.md":Jb,"../../lessons/en/05-sequenz.md":Rb,"../../lessons/en/06-eingabe-und-ausgabe.md":Gb,"../../lessons/en/07-simulation-und-schreibtischtest.md":Hb,"../../lessons/en/08-verzweigung.md":Vb,"../../lessons/en/09-bedingungen-verknuepfen.md":Qb,"../../lessons/en/10-fallauswahl.md":qb,"../../lessons/en/11-while-schleife.md":Ub,"../../lessons/en/12-do-while-schleife.md":$b,"../../lessons/en/13-for-schleife.md":Yb,"../../lessons/en/14-verschachteln.md":Xb,"../../lessons/en/15-arrays.md":Kb,"../../lessons/en/16-zweidimensionale-arrays.md":e4,"../../lessons/en/17-zeichenketten.md":t4,"../../lessons/en/18-aufruf-und-aussprung.md":n4,"../../lessons/en/19-suchen-und-sortieren.md":i4,"../../lessons/en/20-java.md":a4,"../../lessons/en/21-python-und-javascript.md":s4,"../../lessons/en/22-try-und-catch.md":r4,"../../lessons/en/23-text-einlesen-und-speichern.md":o4,"../../lessons/en/24-zeile-fuer-zeile.md":l4,"../../lessons/en/25-tabellen-als-csv.md":u4,"../../lessons/en/26-json.md":m4,"../../lessons/en/27-formate-im-vergleich.md":c4,"../../lessons/en/28-erstes-fenster.md":d4,"../../lessons/en/29-knopf-im-fenster.md":h4,"../../lessons/en/30-der-knopf-reagiert.md":g4,"../../lessons/en/31-zahl-verdoppeln.md":p4,"../../lessons/en/32-klickzaehler.md":f4,"../../lessons/en/33-ampel.md":x4,"../../lessons/en/34-notenrechner.md":b4,"../../lessons/en/35-taschenrechner.md":y4,"../../lessons/en/36-zahlenraten.md":v4,"../../lessons/en/37-viele-knoepfe-ein-zuhoerer.md":w4,"../../lessons/en/38-innere-klassen.md":z4,"../../lessons/en/39-zwei-reiter.md":I4,"../../lessons/en/40-model-view-controller.md":k4,"../../lessons/en/begriffe.md":S4,"../../lessons/en/nachschlagen.md":_4,"../../lessons/pt/01-was-ist-ein-struktogramm.md":T4,"../../lessons/pt/02-der-editor.md":O4,"../../lessons/pt/03-speichern-oeffnen-exportieren.md":A4,"../../lessons/pt/04-variablen-und-datentypen.md":P4,"../../lessons/pt/05-sequenz.md":j4,"../../lessons/pt/06-eingabe-und-ausgabe.md":C4,"../../lessons/pt/07-simulation-und-schreibtischtest.md":B4,"../../lessons/pt/08-verzweigung.md":D4,"../../lessons/pt/09-bedingungen-verknuepfen.md":Z4,"../../lessons/pt/10-fallauswahl.md":M4,"../../lessons/pt/11-while-schleife.md":L4,"../../lessons/pt/12-do-while-schleife.md":W4,"../../lessons/pt/13-for-schleife.md":E4,"../../lessons/pt/14-verschachteln.md":N4,"../../lessons/pt/15-arrays.md":F4,"../../lessons/pt/16-zweidimensionale-arrays.md":J4,"../../lessons/pt/17-zeichenketten.md":R4,"../../lessons/pt/18-aufruf-und-aussprung.md":G4,"../../lessons/pt/19-suchen-und-sortieren.md":H4,"../../lessons/pt/20-java.md":V4,"../../lessons/pt/21-python-und-javascript.md":Q4,"../../lessons/pt/22-try-und-catch.md":q4,"../../lessons/pt/23-text-einlesen-und-speichern.md":U4,"../../lessons/pt/24-zeile-fuer-zeile.md":$4,"../../lessons/pt/25-tabellen-als-csv.md":Y4,"../../lessons/pt/26-json.md":X4,"../../lessons/pt/27-formate-im-vergleich.md":K4,"../../lessons/pt/28-erstes-fenster.md":ey,"../../lessons/pt/29-knopf-im-fenster.md":ty,"../../lessons/pt/30-der-knopf-reagiert.md":ny,"../../lessons/pt/31-zahl-verdoppeln.md":iy,"../../lessons/pt/32-klickzaehler.md":ay,"../../lessons/pt/33-ampel.md":sy,"../../lessons/pt/34-notenrechner.md":ry,"../../lessons/pt/35-taschenrechner.md":oy,"../../lessons/pt/36-zahlenraten.md":ly,"../../lessons/pt/37-viele-knoepfe-ein-zuhoerer.md":uy,"../../lessons/pt/38-innere-klassen.md":my,"../../lessons/pt/39-zwei-reiter.md":cy,"../../lessons/pt/40-model-view-controller.md":dy,"../../lessons/pt/begriffe.md":hy,"../../lessons/pt/nachschlagen.md":gy}),QB=Object.assign({"../../lessons/de/aufgaben/alter-unterprogramm.md":py,"../../lessons/de/aufgaben/ballwurf.md":fy,"../../lessons/de/aufgaben/bestenliste.md":xy,"../../lessons/de/aufgaben/binaerzahl.md":by,"../../lessons/de/aufgaben/caesar.md":yy,"../../lessons/de/aufgaben/collatz.md":vy,"../../lessons/de/aufgaben/einheitenrechner.md":wy,"../../lessons/de/aufgaben/fibonacci.md":zy,"../../lessons/de/aufgaben/gerade-ungerade.md":Iy,"../../lessons/de/aufgaben/mehrwertsteuer.md":ky,"../../lessons/de/aufgaben/notendurchschnitt.md":Sy,"../../lessons/de/aufgaben/pin-pruefen.md":_y,"../../lessons/de/aufgaben/schiffe-versenken.md":Ty,"../../lessons/de/aufgaben/speisekarte.md":Oy,"../../lessons/de/aufgaben/summe-bilden.md":Ay,"../../lessons/de/aufgaben/tafeldienst.md":Py,"../../lessons/de/aufgaben/taschenrechner.md":jy,"../../lessons/de/aufgaben/verleih-menue.md":Cy,"../../lessons/de/aufgaben/vokabeltrainer.md":By,"../../lessons/de/aufgaben/volljaehrig.md":Dy,"../../lessons/de/aufgaben/wuerfel-mvc.md":Zy,"../../lessons/de/aufgaben/zahl-verdoppeln.md":My,"../../lessons/en/aufgaben/alter-unterprogramm.md":Ly,"../../lessons/en/aufgaben/ballwurf.md":Wy,"../../lessons/en/aufgaben/bestenliste.md":Ey,"../../lessons/en/aufgaben/binaerzahl.md":Ny,"../../lessons/en/aufgaben/caesar.md":Fy,"../../lessons/en/aufgaben/collatz.md":Jy,"../../lessons/en/aufgaben/einheitenrechner.md":Ry,"../../lessons/en/aufgaben/fibonacci.md":Gy,"../../lessons/en/aufgaben/gerade-ungerade.md":Hy,"../../lessons/en/aufgaben/mehrwertsteuer.md":Vy,"../../lessons/en/aufgaben/notendurchschnitt.md":Qy,"../../lessons/en/aufgaben/pin-pruefen.md":qy,"../../lessons/en/aufgaben/schiffe-versenken.md":Uy,"../../lessons/en/aufgaben/speisekarte.md":$y,"../../lessons/en/aufgaben/summe-bilden.md":Yy,"../../lessons/en/aufgaben/tafeldienst.md":Xy,"../../lessons/en/aufgaben/taschenrechner.md":Ky,"../../lessons/en/aufgaben/verleih-menue.md":ev,"../../lessons/en/aufgaben/vokabeltrainer.md":tv,"../../lessons/en/aufgaben/volljaehrig.md":nv,"../../lessons/en/aufgaben/wuerfel-mvc.md":iv,"../../lessons/en/aufgaben/zahl-verdoppeln.md":av,"../../lessons/pt/aufgaben/alter-unterprogramm.md":sv,"../../lessons/pt/aufgaben/ballwurf.md":rv,"../../lessons/pt/aufgaben/bestenliste.md":ov,"../../lessons/pt/aufgaben/binaerzahl.md":lv,"../../lessons/pt/aufgaben/caesar.md":uv,"../../lessons/pt/aufgaben/collatz.md":mv,"../../lessons/pt/aufgaben/einheitenrechner.md":cv,"../../lessons/pt/aufgaben/fibonacci.md":dv,"../../lessons/pt/aufgaben/gerade-ungerade.md":hv,"../../lessons/pt/aufgaben/mehrwertsteuer.md":gv,"../../lessons/pt/aufgaben/notendurchschnitt.md":pv,"../../lessons/pt/aufgaben/pin-pruefen.md":fv,"../../lessons/pt/aufgaben/schiffe-versenken.md":xv,"../../lessons/pt/aufgaben/speisekarte.md":bv,"../../lessons/pt/aufgaben/summe-bilden.md":yv,"../../lessons/pt/aufgaben/tafeldienst.md":vv,"../../lessons/pt/aufgaben/taschenrechner.md":wv,"../../lessons/pt/aufgaben/verleih-menue.md":zv,"../../lessons/pt/aufgaben/vokabeltrainer.md":Iv,"../../lessons/pt/aufgaben/volljaehrig.md":kv,"../../lessons/pt/aufgaben/wuerfel-mvc.md":Sv,"../../lessons/pt/aufgaben/zahl-verdoppeln.md":_v}),Zu=Object.assign({"../../lessons/de/visubot/01-der-mbot2.md":Tv,"../../lessons/de/visubot/02-das-quadrat.md":Ov,"../../lessons/de/visubot/03-variablen-und-ausgabe.md":Av,"../../lessons/de/visubot/04-sensoren.md":Pv,"../../lessons/de/visubot/05-bis-zur-wand.md":jv,"../../lessons/de/visubot/06-abstand.md":Cv,"../../lessons/de/visubot/07-linie.md":Bv,"../../lessons/de/visubot/08-farben.md":Dv,"../../lessons/de/visubot/09-fallauswahl.md":Zv,"../../lessons/de/visubot/10-tasten-joystick.md":Mv,"../../lessons/de/visubot/11-licht.md":Lv,"../../lessons/de/visubot/12-lautstaerke.md":Wv,"../../lessons/de/visubot/13-neigung.md":Ev,"../../lessons/de/visubot/14-leds.md":Nv,"../../lessons/de/visubot/15-einzelne-leds.md":Fv,"../../lessons/de/visubot/16-lautsprecher.md":Jv,"../../lessons/de/visubot/17-arrays-melodie.md":Rv,"../../lessons/de/visubot/18-bildschirm.md":Gv,"../../lessons/de/visubot/19-zeichenketten.md":Hv,"../../lessons/de/visubot/20-motoren.md":Vv,"../../lessons/de/visubot/21-stoppuhr-akku.md":Qv,"../../lessons/de/visubot/22-eigene-methoden.md":qv,"../../lessons/de/visubot/nachschlagen.md":Uv,"../../lessons/en/visubot/01-der-mbot2.md":$v,"../../lessons/en/visubot/02-das-quadrat.md":Yv,"../../lessons/en/visubot/03-variablen-und-ausgabe.md":Xv,"../../lessons/en/visubot/04-sensoren.md":Kv,"../../lessons/en/visubot/05-bis-zur-wand.md":e9,"../../lessons/en/visubot/06-abstand.md":t9,"../../lessons/en/visubot/07-linie.md":n9,"../../lessons/en/visubot/08-farben.md":i9,"../../lessons/en/visubot/09-fallauswahl.md":a9,"../../lessons/en/visubot/10-tasten-joystick.md":s9,"../../lessons/en/visubot/11-licht.md":r9,"../../lessons/en/visubot/12-lautstaerke.md":o9,"../../lessons/en/visubot/13-neigung.md":l9,"../../lessons/en/visubot/14-leds.md":u9,"../../lessons/en/visubot/15-einzelne-leds.md":m9,"../../lessons/en/visubot/16-lautsprecher.md":c9,"../../lessons/en/visubot/17-arrays-melodie.md":d9,"../../lessons/en/visubot/18-bildschirm.md":h9,"../../lessons/en/visubot/19-zeichenketten.md":g9,"../../lessons/en/visubot/20-motoren.md":p9,"../../lessons/en/visubot/21-stoppuhr-akku.md":f9,"../../lessons/en/visubot/22-eigene-methoden.md":x9,"../../lessons/en/visubot/nachschlagen.md":b9}),qB=Object.assign({"../../lessons/de/visubot/aufgaben/alarmanlage.md":y9,"../../lessons/de/visubot/aufgaben/ausgang.md":v9,"../../lessons/de/visubot/aufgaben/binaer-zaehlen.md":w9,"../../lessons/de/visubot/aufgaben/dreieck.md":z9,"../../lessons/de/visubot/aufgaben/einparken.md":I9,"../../lessons/de/visubot/aufgaben/hindernis.md":k9,"../../lessons/de/visubot/aufgaben/knight-rider.md":S9,"../../lessons/de/visubot/aufgaben/labyrinth.md":_9,"../../lessons/de/visubot/aufgaben/linienfolger-stopp.md":T9,"../../lessons/de/visubot/aufgaben/morsen.md":O9,"../../lessons/de/visubot/aufgaben/nachtwaechter.md":A9,"../../lessons/de/visubot/aufgaben/slalom.md":P9,"../../lessons/de/visubot/aufgaben/spirale.md":j9,"../../lessons/de/visubot/aufgaben/treppe.md":C9,"../../lessons/de/visubot/aufgaben/tunnel.md":B9,"../../lessons/de/visubot/aufgaben/wald.md":D9,"../../lessons/en/visubot/aufgaben/alarmanlage.md":Z9,"../../lessons/en/visubot/aufgaben/ausgang.md":M9,"../../lessons/en/visubot/aufgaben/binaer-zaehlen.md":L9,"../../lessons/en/visubot/aufgaben/dreieck.md":W9,"../../lessons/en/visubot/aufgaben/einparken.md":E9,"../../lessons/en/visubot/aufgaben/hindernis.md":N9,"../../lessons/en/visubot/aufgaben/knight-rider.md":F9,"../../lessons/en/visubot/aufgaben/labyrinth.md":J9,"../../lessons/en/visubot/aufgaben/linienfolger-stopp.md":R9,"../../lessons/en/visubot/aufgaben/morsen.md":G9,"../../lessons/en/visubot/aufgaben/nachtwaechter.md":H9,"../../lessons/en/visubot/aufgaben/slalom.md":V9,"../../lessons/en/visubot/aufgaben/spirale.md":Q9,"../../lessons/en/visubot/aufgaben/treppe.md":q9,"../../lessons/en/visubot/aufgaben/tunnel.md":U9,"../../lessons/en/visubot/aufgaben/wald.md":$9}),UB=Object.assign({"../../lessons/diagramme/aufgabe-alter-haupt-loesung.visustruct":Y9,"../../lessons/diagramme/aufgabe-alter-unterprogramm-loesung.visustruct":X9,"../../lessons/diagramme/aufgabe-ballwurf-loesung.visustruct":K9,"../../lessons/diagramme/aufgabe-ballwurf-start.visustruct":ew,"../../lessons/diagramme/aufgabe-bestenliste-loesung.visustruct":tw,"../../lessons/diagramme/aufgabe-binaer-loesung.visustruct":nw,"../../lessons/diagramme/aufgabe-caesar-array-loesung.visustruct":iw,"../../lessons/diagramme/aufgabe-caesar-array-start.visustruct":aw,"../../lessons/diagramme/aufgabe-caesar-ascii-loesung.visustruct":sw,"../../lessons/diagramme/aufgabe-caesar-entschluesseln-loesung.visustruct":rw,"../../lessons/diagramme/aufgabe-collatz-loesung.visustruct":ow,"../../lessons/diagramme/aufgabe-durchschnitt-loesung.visustruct":lw,"../../lessons/diagramme/aufgabe-fibonacci-loesung.visustruct":uw,"../../lessons/diagramme/aufgabe-gerade-loesung.visustruct":mw,"../../lessons/diagramme/aufgabe-mehrwertsteuer-loesung.visustruct":cw,"../../lessons/diagramme/aufgabe-pin-java-loesung.visustruct":dw,"../../lessons/diagramme/aufgabe-pin-loesung.visustruct":hw,"../../lessons/diagramme/aufgabe-rechner-loesung.visustruct":gw,"../../lessons/diagramme/aufgabe-schiffe-loesung.visustruct":pw,"../../lessons/diagramme/aufgabe-schiffe-start.visustruct":fw,"../../lessons/diagramme/aufgabe-speisekarte-loesung.visustruct":xw,"../../lessons/diagramme/aufgabe-summe-loesung.visustruct":bw,"../../lessons/diagramme/aufgabe-tafeldienst-loesung.visustruct":yw,"../../lessons/diagramme/aufgabe-verdoppeln-loesung.visustruct":vw,"../../lessons/diagramme/aufgabe-verleih-java-loesung.visustruct":ww,"../../lessons/diagramme/aufgabe-verleih-loesung.visustruct":zw,"../../lessons/diagramme/aufgabe-vokabeln-loesung.visustruct":Iw,"../../lessons/diagramme/aufgabe-vokabeln-start.visustruct":kw,"../../lessons/diagramme/aufgabe-volljaehrig-loesung.visustruct":Sw,"../../lessons/diagramme/dt-buffered.visustruct":_w,"../../lessons/diagramme/dt-csv.visustruct":Tw,"../../lessons/diagramme/dt-json.visustruct":Ow,"../../lessons/diagramme/dt-lesen.visustruct":Aw,"../../lessons/diagramme/en/aufgabe-alter-haupt-loesung.visustruct":Pw,"../../lessons/diagramme/en/aufgabe-alter-unterprogramm-loesung.visustruct":jw,"../../lessons/diagramme/en/aufgabe-ballwurf-loesung.visustruct":Cw,"../../lessons/diagramme/en/aufgabe-ballwurf-start.visustruct":Bw,"../../lessons/diagramme/en/aufgabe-bestenliste-loesung.visustruct":Dw,"../../lessons/diagramme/en/aufgabe-binaer-loesung.visustruct":Zw,"../../lessons/diagramme/en/aufgabe-caesar-array-loesung.visustruct":Mw,"../../lessons/diagramme/en/aufgabe-caesar-array-start.visustruct":Lw,"../../lessons/diagramme/en/aufgabe-caesar-ascii-loesung.visustruct":Ww,"../../lessons/diagramme/en/aufgabe-caesar-entschluesseln-loesung.visustruct":Ew,"../../lessons/diagramme/en/aufgabe-collatz-loesung.visustruct":Nw,"../../lessons/diagramme/en/aufgabe-durchschnitt-loesung.visustruct":Fw,"../../lessons/diagramme/en/aufgabe-fibonacci-loesung.visustruct":Jw,"../../lessons/diagramme/en/aufgabe-gerade-loesung.visustruct":Rw,"../../lessons/diagramme/en/aufgabe-mehrwertsteuer-loesung.visustruct":Gw,"../../lessons/diagramme/en/aufgabe-pin-java-loesung.visustruct":Hw,"../../lessons/diagramme/en/aufgabe-pin-loesung.visustruct":Vw,"../../lessons/diagramme/en/aufgabe-rechner-loesung.visustruct":Qw,"../../lessons/diagramme/en/aufgabe-schiffe-loesung.visustruct":qw,"../../lessons/diagramme/en/aufgabe-schiffe-start.visustruct":Uw,"../../lessons/diagramme/en/aufgabe-speisekarte-loesung.visustruct":$w,"../../lessons/diagramme/en/aufgabe-summe-loesung.visustruct":Yw,"../../lessons/diagramme/en/aufgabe-tafeldienst-loesung.visustruct":Xw,"../../lessons/diagramme/en/aufgabe-verdoppeln-loesung.visustruct":Kw,"../../lessons/diagramme/en/aufgabe-verleih-java-loesung.visustruct":e5,"../../lessons/diagramme/en/aufgabe-verleih-loesung.visustruct":t5,"../../lessons/diagramme/en/aufgabe-vokabeln-loesung.visustruct":n5,"../../lessons/diagramme/en/aufgabe-vokabeln-start.visustruct":i5,"../../lessons/diagramme/en/aufgabe-volljaehrig-loesung.visustruct":a5,"../../lessons/diagramme/en/dt-buffered.visustruct":s5,"../../lessons/diagramme/en/dt-csv.visustruct":r5,"../../lessons/diagramme/en/dt-json.visustruct":o5,"../../lessons/diagramme/en/dt-lesen.visustruct":l5,"../../lessons/diagramme/en/kino-einmaleins-loesung.visustruct":u5,"../../lessons/diagramme/en/kino-frei-loesung.visustruct":m5,"../../lessons/diagramme/en/kino-frei-start.visustruct":c5,"../../lessons/diagramme/en/kino-karte-loesung.visustruct":d5,"../../lessons/diagramme/en/kino-karte-start.visustruct":h5,"../../lessons/diagramme/en/kino-saalplan.visustruct":g5,"../../lessons/diagramme/en/kino-verkaufen.visustruct":p5,"../../lessons/diagramme/en/l04-java-fehler-loesung.visustruct":f5,"../../lessons/diagramme/en/l04-java-fehler-start.visustruct":x5,"../../lessons/diagramme/en/l04-java-steckbrief-loesung.visustruct":b5,"../../lessons/diagramme/en/l04-rechnen.visustruct":y5,"../../lessons/diagramme/en/l04-reihenfolge-loesung.visustruct":v5,"../../lessons/diagramme/en/l04-reihenfolge-start.visustruct":w5,"../../lessons/diagramme/en/l04-tauschen-loesung.visustruct":z5,"../../lessons/diagramme/en/l04-tauschen-start.visustruct":I5,"../../lessons/diagramme/en/l04-tauschen.visustruct":k5,"../../lessons/diagramme/en/l05-datentypen.visustruct":S5,"../../lessons/diagramme/en/l05-division.visustruct":_5,"../../lessons/diagramme/en/l05-einkauf-loesung.visustruct":T5,"../../lessons/diagramme/en/l05-java-fehler-loesung.visustruct":O5,"../../lessons/diagramme/en/l05-java-fehler-start.visustruct":A5,"../../lessons/diagramme/en/l05-java-kino-loesung.visustruct":P5,"../../lessons/diagramme/en/l05-rechteck-loesung.visustruct":j5,"../../lessons/diagramme/en/l05-sekunden-loesung.visustruct":C5,"../../lessons/diagramme/en/l05-sekunden-start.visustruct":B5,"../../lessons/diagramme/en/l06-begruessung-loesung.visustruct":D5,"../../lessons/diagramme/en/l06-eva.visustruct":Z5,"../../lessons/diagramme/en/l06-java-fehler-loesung.visustruct":M5,"../../lessons/diagramme/en/l06-java-fehler-start.visustruct":L5,"../../lessons/diagramme/en/l06-java-tage-loesung.visustruct":W5,"../../lessons/diagramme/en/l06-mittelwert-loesung.visustruct":E5,"../../lessons/diagramme/en/l06-rechner-loesung.visustruct":N5,"../../lessons/diagramme/en/l07-alter-pruefen.visustruct":F5,"../../lessons/diagramme/en/l07-betrag-loesung.visustruct":J5,"../../lessons/diagramme/en/l07-gerade-loesung.visustruct":R5,"../../lessons/diagramme/en/l07-java-fehler-loesung.visustruct":G5,"../../lessons/diagramme/en/l07-java-fehler-start.visustruct":H5,"../../lessons/diagramme/en/l07-java-pizza-loesung.visustruct":V5,"../../lessons/diagramme/en/l07-java-pizza-start.visustruct":Q5,"../../lessons/diagramme/en/l07-maximum-loesung.visustruct":q5,"../../lessons/diagramme/en/l07-rabatt.visustruct":U5,"../../lessons/diagramme/en/l08-gueltig-loesung.visustruct":$5,"../../lessons/diagramme/en/l08-java-bestanden-loesung.visustruct":Y5,"../../lessons/diagramme/en/l08-java-fehler-loesung.visustruct":X5,"../../lessons/diagramme/en/l08-java-fehler-start.visustruct":K5,"../../lessons/diagramme/en/l08-jugendticket.visustruct":e6,"../../lessons/diagramme/en/l08-note.visustruct":t6,"../../lessons/diagramme/en/l08-schaltjahr-loesung.visustruct":n6,"../../lessons/diagramme/en/l08-wochenende-loesung.visustruct":i6,"../../lessons/diagramme/en/l09-ampel.visustruct":a6,"../../lessons/diagramme/en/l09-automat.visustruct":s6,"../../lessons/diagramme/en/l09-java-fehler-loesung.visustruct":r6,"../../lessons/diagramme/en/l09-java-fehler-start.visustruct":o6,"../../lessons/diagramme/en/l09-java-schule-loesung.visustruct":l6,"../../lessons/diagramme/en/l09-note-loesung.visustruct":u6,"../../lessons/diagramme/en/l09-rechner-loesung.visustruct":m6,"../../lessons/diagramme/en/l09-verschachtelt.visustruct":c6,"../../lessons/diagramme/en/l1-grundbausteine.visustruct":d6,"../../lessons/diagramme/en/l1-sequenz.visustruct":h6,"../../lessons/diagramme/en/l1-tee.visustruct":g6,"../../lessons/diagramme/en/l1-verzweigung.visustruct":p6,"../../lessons/diagramme/en/l1-wiederholung.visustruct":f6,"../../lessons/diagramme/en/l10-bis-n-loesung.visustruct":x6,"../../lessons/diagramme/en/l10-countdown.visustruct":b6,"../../lessons/diagramme/en/l10-endlos.visustruct":y6,"../../lessons/diagramme/en/l10-fakultaet.visustruct":v6,"../../lessons/diagramme/en/l10-java-fehler-loesung.visustruct":w6,"../../lessons/diagramme/en/l10-java-fehler-start.visustruct":z6,"../../lessons/diagramme/en/l10-java-wuerfel-loesung.visustruct":I6,"../../lessons/diagramme/en/l10-verdoppeln-loesung.visustruct":k6,"../../lessons/diagramme/en/l11-eingabe-pruefen.visustruct":S6,"../../lessons/diagramme/en/l11-einmal.visustruct":_6,"../../lessons/diagramme/en/l11-java-fehler-loesung.visustruct":T6,"../../lessons/diagramme/en/l11-java-fehler-start.visustruct":O6,"../../lessons/diagramme/en/l11-java-gerade-loesung.visustruct":A6,"../../lessons/diagramme/en/l11-note-loesung.visustruct":P6,"../../lessons/diagramme/en/l11-summe-loesung.visustruct":j6,"../../lessons/diagramme/en/l12-countdown-loesung.visustruct":C6,"../../lessons/diagramme/en/l12-einmaleins-loesung.visustruct":B6,"../../lessons/diagramme/en/l12-eins-bis-fuenf.visustruct":D6,"../../lessons/diagramme/en/l12-java-fehler-loesung.visustruct":Z6,"../../lessons/diagramme/en/l12-java-fehler-start.visustruct":M6,"../../lessons/diagramme/en/l12-java-verdoppeln-loesung.visustruct":L6,"../../lessons/diagramme/en/l12-summe.visustruct":W6,"../../lessons/diagramme/en/l13-dreieck.visustruct":E6,"../../lessons/diagramme/en/l13-gerade-eingaben-loesung.visustruct":N6,"../../lessons/diagramme/en/l13-gerade-zaehlen.visustruct":F6,"../../lessons/diagramme/en/l13-java-fehler-loesung.visustruct":J6,"../../lessons/diagramme/en/l13-java-fehler-start.visustruct":R6,"../../lessons/diagramme/en/l13-java-quadrate-loesung.visustruct":G6,"../../lessons/diagramme/en/l13-rechteck-loesung.visustruct":H6,"../../lessons/diagramme/en/l14-array-durchlaufen.visustruct":V6,"../../lessons/diagramme/en/l14-erster-letzter-loesung.visustruct":Q6,"../../lessons/diagramme/en/l14-java-fehler-loesung.visustruct":q6,"../../lessons/diagramme/en/l14-java-fehler-start.visustruct":U6,"../../lessons/diagramme/en/l14-java-treppe-loesung.visustruct":$6,"../../lessons/diagramme/en/l14-namen-eingeben.visustruct":Y6,"../../lessons/diagramme/en/l14-rueckwaerts-loesung.visustruct":X6,"../../lessons/diagramme/en/l14-summe-max-loesung.visustruct":K6,"../../lessons/diagramme/en/l14-summe-maximum.visustruct":ez,"../../lessons/diagramme/en/l15-bis-null-loesung.visustruct":tz,"../../lessons/diagramme/en/l15-endlos-aussprung.visustruct":nz,"../../lessons/diagramme/en/l15-flaeche-loesung.visustruct":iz,"../../lessons/diagramme/en/l15-flaeche-unterprogramm-loesung.visustruct":az,"../../lessons/diagramme/en/l15-hauptprogramm.visustruct":sz,"../../lessons/diagramme/en/l15-java-fehler-loesung.visustruct":rz,"../../lessons/diagramme/en/l15-java-fehler-start.visustruct":oz,"../../lessons/diagramme/en/l15-java-noten-loesung.visustruct":lz,"../../lessons/diagramme/en/l15-quadrat-haupt.visustruct":uz,"../../lessons/diagramme/en/l15-quadrat.visustruct":mz,"../../lessons/diagramme/en/l15-titel-loesung.visustruct":cz,"../../lessons/diagramme/en/l15-unterprogramm.visustruct":dz,"../../lessons/diagramme/en/l15-zeige-summe-haupt.visustruct":hz,"../../lessons/diagramme/en/l15-zeige-summe.visustruct":gz,"../../lessons/diagramme/en/l16-countdown-loesung.visustruct":pz,"../../lessons/diagramme/en/l16-countdown-start.visustruct":fz,"../../lessons/diagramme/en/l16-java-fehler-loesung.visustruct":xz,"../../lessons/diagramme/en/l16-java-fehler-start.visustruct":bz,"../../lessons/diagramme/en/l16-java-punkte-loesung.visustruct":yz,"../../lessons/diagramme/en/l16-schreibtisch.visustruct":vz,"../../lessons/diagramme/en/l16-summe-loesung.visustruct":wz,"../../lessons/diagramme/en/l16-summe-start.visustruct":zz,"../../lessons/diagramme/en/l17-beispiel.visustruct":Iz,"../../lessons/diagramme/en/l17-fakultaet-loesung.visustruct":kz,"../../lessons/diagramme/en/l17-java-brief-loesung.visustruct":Sz,"../../lessons/diagramme/en/l17-java-brief-start.visustruct":_z,"../../lessons/diagramme/en/l17-java-fehler-loesung.visustruct":Tz,"../../lessons/diagramme/en/l17-java-fehler-start.visustruct":Oz,"../../lessons/diagramme/en/l17-java-passwort-loesung.visustruct":Az,"../../lessons/diagramme/en/l17-ticket-loesung.visustruct":Pz,"../../lessons/diagramme/en/l18-beispiel.visustruct":jz,"../../lessons/diagramme/en/l18-java-fehler-loesung.visustruct":Cz,"../../lessons/diagramme/en/l18-java-fehler-start.visustruct":Bz,"../../lessons/diagramme/en/l18-java-kasse-loesung.visustruct":Dz,"../../lessons/diagramme/en/l18-js-loesung.visustruct":Zz,"../../lessons/diagramme/en/l18-python-loesung.visustruct":Mz,"../../lessons/diagramme/en/l19-java-fehler-loesung.visustruct":Lz,"../../lessons/diagramme/en/l19-java-fehler-start.visustruct":Wz,"../../lessons/diagramme/en/l19-java-zaehlen-loesung.visustruct":Ez,"../../lessons/diagramme/en/l2-ausgabe.visustruct":Nz,"../../lessons/diagramme/en/l2-hallo-loesung.visustruct":Fz,"../../lessons/diagramme/en/l2-zwei-zeilen-loesung.visustruct":Jz,"../../lessons/diagramme/en/l23-java-ergaenzen-loesung.visustruct":Rz,"../../lessons/diagramme/en/l23-java-ergaenzen-start.visustruct":Gz,"../../lessons/diagramme/en/l23-java-nummern-loesung.visustruct":Hz,"../../lessons/diagramme/en/l23-java-nummern-start.visustruct":Vz,"../../lessons/diagramme/en/l24-java-fuchs-loesung.visustruct":Qz,"../../lessons/diagramme/en/l24-java-fuchs-start.visustruct":qz,"../../lessons/diagramme/en/l24-java-laengster-loesung.visustruct":Uz,"../../lessons/diagramme/en/l24-java-laengster-start.visustruct":$z,"../../lessons/diagramme/en/l25-java-beste-loesung.visustruct":Yz,"../../lessons/diagramme/en/l25-java-beste-start.visustruct":Xz,"../../lessons/diagramme/en/l25-java-schnitt-loesung.visustruct":Kz,"../../lessons/diagramme/en/l25-java-schnitt-start.visustruct":e7,"../../lessons/diagramme/en/l26-java-namen-loesung.visustruct":t7,"../../lessons/diagramme/en/l26-java-namen-start.visustruct":n7,"../../lessons/diagramme/en/l26-java-schreiben-loesung.visustruct":i7,"../../lessons/diagramme/en/l26-java-schreiben-start.visustruct":a7,"../../lessons/diagramme/en/l27-java-json-loesung.visustruct":s7,"../../lessons/diagramme/en/l27-java-json-start.visustruct":r7,"../../lessons/diagramme/en/l27-java-saetze-loesung.visustruct":o7,"../../lessons/diagramme/en/l27-java-saetze-start.visustruct":l7,"../../lessons/diagramme/en/sim-kino-loesung.visustruct":u7,"../../lessons/diagramme/en/sim-kino-start.visustruct":m7,"../../lessons/diagramme/en/sim-tausch-loesung.visustruct":c7,"../../lessons/diagramme/en/sim-tausch-start.visustruct":d7,"../../lessons/diagramme/en/sim-tausch.visustruct":h7,"../../lessons/diagramme/en/ss-absteigend-loesung.visustruct":g7,"../../lessons/diagramme/en/ss-absteigend-start.visustruct":p7,"../../lessons/diagramme/en/ss-binaere-suche.visustruct":f7,"../../lessons/diagramme/en/ss-bubblesort.visustruct":x7,"../../lessons/diagramme/en/ss-karte-suchen-loesung.visustruct":b7,"../../lessons/diagramme/en/ss-lineare-suche.visustruct":y7,"../../lessons/diagramme/en/uebergabe-bonus-loesung.visustruct":v7,"../../lessons/diagramme/en/uebergabe-bonus-start.visustruct":w7,"../../lessons/diagramme/en/uebergabe-bonus-unterprogramm-loesung.visustruct":z7,"../../lessons/diagramme/en/uebergabe-haupt.visustruct":I7,"../../lessons/diagramme/en/uebergabe-leeren.visustruct":k7,"../../lessons/diagramme/en/uebergabe-verdopple.visustruct":S7,"../../lessons/diagramme/en/vb-abstand-anzeigen-loesung.visustruct":_7,"../../lessons/diagramme/en/vb-abstand-halten-loesung.visustruct":T7,"../../lessons/diagramme/en/vb-alarmanlage-loesung.visustruct":O7,"../../lessons/diagramme/en/vb-ampel-loesung.visustruct":A7,"../../lessons/diagramme/en/vb-ausgang-loesung.visustruct":P7,"../../lessons/diagramme/en/vb-begruessung-loesung.visustruct":j7,"../../lessons/diagramme/en/vb-binaer-zaehlen-loesung.visustruct":C7,"../../lessons/diagramme/en/vb-bis-rot-loesung.visustruct":B7,"../../lessons/diagramme/en/vb-bis-wand-loesung.visustruct":D7,"../../lessons/diagramme/en/vb-bis-ziel-loesung.visustruct":Z7,"../../lessons/diagramme/en/vb-buchstaben-loesung.visustruct":M7,"../../lessons/diagramme/en/vb-drei-lichter-loesung.visustruct":L7,"../../lessons/diagramme/en/vb-dreieck-loesung.visustruct":W7,"../../lessons/diagramme/en/vb-einparken-loesung.visustruct":E7,"../../lessons/diagramme/en/vb-farben-loesung.visustruct":N7,"../../lessons/diagramme/en/vb-farbweiche-loesung.visustruct":F7,"../../lessons/diagramme/en/vb-gas-bis-wand-loesung.visustruct":J7,"../../lessons/diagramme/en/vb-gerade-loesung.visustruct":R7,"../../lessons/diagramme/en/vb-hindernis-loesung.visustruct":G7,"../../lessons/diagramme/en/vb-java-akku-loesung.visustruct":H7,"../../lessons/diagramme/en/vb-java-blau-gruen-loesung.visustruct":V7,"../../lessons/diagramme/en/vb-java-blinken-loesung.visustruct":Q7,"../../lessons/diagramme/en/vb-java-countdown-loesung.visustruct":q7,"../../lessons/diagramme/en/vb-java-hoeher-loesung.visustruct":U7,"../../lessons/diagramme/en/vb-java-joystick-loesung.visustruct":$7,"../../lessons/diagramme/en/vb-java-laermampel-loesung.visustruct":Y7,"../../lessons/diagramme/en/vb-java-lauflicht-loesung.visustruct":X7,"../../lessons/diagramme/en/vb-java-linienfolger-loesung.visustruct":K7,"../../lessons/diagramme/en/vb-java-nachtlicht-ton-loesung.visustruct":eI,"../../lessons/diagramme/en/vb-java-rand-loesung.visustruct":tI,"../../lessons/diagramme/en/vb-java-rechteck-loesung.visustruct":nI,"../../lessons/diagramme/en/vb-java-textlaenge-loesung.visustruct":iI,"../../lessons/diagramme/en/vb-java-wand-piep-loesung.visustruct":aI,"../../lessons/diagramme/en/vb-java-wasserwaage-loesung.visustruct":sI,"../../lessons/diagramme/en/vb-klatschen-loesung.visustruct":rI,"../../lessons/diagramme/en/vb-knight-rider-loesung.visustruct":oI,"../../lessons/diagramme/en/vb-labyrinth-loesung.visustruct":lI,"../../lessons/diagramme/en/vb-linienfolger-stopp-loesung.visustruct":uI,"../../lessons/diagramme/en/vb-linienmuster-loesung.visustruct":mI,"../../lessons/diagramme/en/vb-melodie-loesung.visustruct":cI,"../../lessons/diagramme/en/vb-morsen-loesung.visustruct":dI,"../../lessons/diagramme/en/vb-nachtlicht-loesung.visustruct":hI,"../../lessons/diagramme/en/vb-nachtwaechter-loesung.visustruct":gI,"../../lessons/diagramme/en/vb-ohne-noten-loesung.visustruct":pI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-loesung.visustruct":fI,"../../lessons/diagramme/en/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":xI,"../../lessons/diagramme/en/vb-ohne-rueckwaerts-loesung.visustruct":bI,"../../lessons/diagramme/en/vb-ohne-strecke-loesung.visustruct":yI,"../../lessons/diagramme/en/vb-ohne-summe-loesung.visustruct":vI,"../../lessons/diagramme/en/vb-quadrat-loesung.visustruct":wI,"../../lessons/diagramme/en/vb-quadrat-methode-loesung.visustruct":zI,"../../lessons/diagramme/en/vb-quadrat-schleife-loesung.visustruct":II,"../../lessons/diagramme/en/vb-quadrat-unterprogramm-loesung.visustruct":kI,"../../lessons/diagramme/en/vb-quadrat-verschachtelt-loesung.visustruct":SI,"../../lessons/diagramme/en/vb-rand-loesung.visustruct":_I,"../../lessons/diagramme/en/vb-schraeglage-loesung.visustruct":TI,"../../lessons/diagramme/en/vb-slalom-loesung.visustruct":OI,"../../lessons/diagramme/en/vb-spirale-loesung.visustruct":AI,"../../lessons/diagramme/en/vb-start-a-loesung.visustruct":PI,"../../lessons/diagramme/en/vb-tonleiter-loesung.visustruct":jI,"../../lessons/diagramme/en/vb-treppe-loesung.visustruct":CI,"../../lessons/diagramme/en/vb-tunnel-loesung.visustruct":BI,"../../lessons/diagramme/en/vb-variable-seite-loesung.visustruct":DI,"../../lessons/diagramme/en/vb-vier-quadrate-loesung.visustruct":ZI,"../../lessons/diagramme/en/vb-wald-loesung.visustruct":MI,"../../lessons/diagramme/en/vb-wand-vorn-loesung.visustruct":LI,"../../lessons/diagramme/en/vb-zwei-sekunden-loesung.visustruct":WI,"../../lessons/diagramme/en/zk-initialen-loesung.visustruct":EI,"../../lessons/diagramme/en/zk-mehr.visustruct":NI,"../../lessons/diagramme/en/zk-rueckwaerts-loesung.visustruct":FI,"../../lessons/diagramme/en/zk-split.visustruct":JI,"../../lessons/diagramme/en/zk-woerter-loesung.visustruct":RI,"../../lessons/diagramme/en/zk-zaehlen.visustruct":GI,"../../lessons/diagramme/en/zk-zeichen.visustruct":HI,"../../lessons/diagramme/kino-einmaleins-loesung.visustruct":VI,"../../lessons/diagramme/kino-frei-loesung.visustruct":QI,"../../lessons/diagramme/kino-frei-start.visustruct":qI,"../../lessons/diagramme/kino-karte-loesung.visustruct":UI,"../../lessons/diagramme/kino-karte-start.visustruct":$I,"../../lessons/diagramme/kino-saalplan.visustruct":YI,"../../lessons/diagramme/kino-verkaufen.visustruct":XI,"../../lessons/diagramme/l04-java-fehler-loesung.visustruct":KI,"../../lessons/diagramme/l04-java-fehler-start.visustruct":e8,"../../lessons/diagramme/l04-java-steckbrief-loesung.visustruct":t8,"../../lessons/diagramme/l04-rechnen.visustruct":n8,"../../lessons/diagramme/l04-reihenfolge-loesung.visustruct":i8,"../../lessons/diagramme/l04-reihenfolge-start.visustruct":a8,"../../lessons/diagramme/l04-tauschen-loesung.visustruct":s8,"../../lessons/diagramme/l04-tauschen-start.visustruct":r8,"../../lessons/diagramme/l04-tauschen.visustruct":o8,"../../lessons/diagramme/l05-datentypen.visustruct":l8,"../../lessons/diagramme/l05-division.visustruct":u8,"../../lessons/diagramme/l05-einkauf-loesung.visustruct":m8,"../../lessons/diagramme/l05-java-fehler-loesung.visustruct":c8,"../../lessons/diagramme/l05-java-fehler-start.visustruct":d8,"../../lessons/diagramme/l05-java-kino-loesung.visustruct":h8,"../../lessons/diagramme/l05-rechteck-loesung.visustruct":g8,"../../lessons/diagramme/l05-sekunden-loesung.visustruct":p8,"../../lessons/diagramme/l05-sekunden-start.visustruct":f8,"../../lessons/diagramme/l06-begruessung-loesung.visustruct":x8,"../../lessons/diagramme/l06-eva.visustruct":b8,"../../lessons/diagramme/l06-java-fehler-loesung.visustruct":y8,"../../lessons/diagramme/l06-java-fehler-start.visustruct":v8,"../../lessons/diagramme/l06-java-tage-loesung.visustruct":w8,"../../lessons/diagramme/l06-mittelwert-loesung.visustruct":z8,"../../lessons/diagramme/l06-rechner-loesung.visustruct":I8,"../../lessons/diagramme/l07-alter-pruefen.visustruct":k8,"../../lessons/diagramme/l07-betrag-loesung.visustruct":S8,"../../lessons/diagramme/l07-gerade-loesung.visustruct":_8,"../../lessons/diagramme/l07-java-fehler-loesung.visustruct":T8,"../../lessons/diagramme/l07-java-fehler-start.visustruct":O8,"../../lessons/diagramme/l07-java-pizza-loesung.visustruct":A8,"../../lessons/diagramme/l07-java-pizza-start.visustruct":P8,"../../lessons/diagramme/l07-maximum-loesung.visustruct":j8,"../../lessons/diagramme/l07-rabatt.visustruct":C8,"../../lessons/diagramme/l08-gueltig-loesung.visustruct":B8,"../../lessons/diagramme/l08-java-bestanden-loesung.visustruct":D8,"../../lessons/diagramme/l08-java-fehler-loesung.visustruct":Z8,"../../lessons/diagramme/l08-java-fehler-start.visustruct":M8,"../../lessons/diagramme/l08-jugendticket.visustruct":L8,"../../lessons/diagramme/l08-note.visustruct":W8,"../../lessons/diagramme/l08-schaltjahr-loesung.visustruct":E8,"../../lessons/diagramme/l08-wochenende-loesung.visustruct":N8,"../../lessons/diagramme/l09-ampel.visustruct":F8,"../../lessons/diagramme/l09-automat.visustruct":J8,"../../lessons/diagramme/l09-java-fehler-loesung.visustruct":R8,"../../lessons/diagramme/l09-java-fehler-start.visustruct":G8,"../../lessons/diagramme/l09-java-schule-loesung.visustruct":H8,"../../lessons/diagramme/l09-note-loesung.visustruct":V8,"../../lessons/diagramme/l09-rechner-loesung.visustruct":Q8,"../../lessons/diagramme/l09-verschachtelt.visustruct":q8,"../../lessons/diagramme/l1-grundbausteine.visustruct":U8,"../../lessons/diagramme/l1-sequenz.visustruct":$8,"../../lessons/diagramme/l1-tee.visustruct":Y8,"../../lessons/diagramme/l1-verzweigung.visustruct":X8,"../../lessons/diagramme/l1-wiederholung.visustruct":K8,"../../lessons/diagramme/l10-bis-n-loesung.visustruct":ek,"../../lessons/diagramme/l10-countdown.visustruct":tk,"../../lessons/diagramme/l10-endlos.visustruct":nk,"../../lessons/diagramme/l10-fakultaet.visustruct":ik,"../../lessons/diagramme/l10-java-fehler-loesung.visustruct":ak,"../../lessons/diagramme/l10-java-fehler-start.visustruct":sk,"../../lessons/diagramme/l10-java-wuerfel-loesung.visustruct":rk,"../../lessons/diagramme/l10-verdoppeln-loesung.visustruct":ok,"../../lessons/diagramme/l11-eingabe-pruefen.visustruct":lk,"../../lessons/diagramme/l11-einmal.visustruct":uk,"../../lessons/diagramme/l11-java-fehler-loesung.visustruct":mk,"../../lessons/diagramme/l11-java-fehler-start.visustruct":ck,"../../lessons/diagramme/l11-java-gerade-loesung.visustruct":dk,"../../lessons/diagramme/l11-note-loesung.visustruct":hk,"../../lessons/diagramme/l11-summe-loesung.visustruct":gk,"../../lessons/diagramme/l12-countdown-loesung.visustruct":pk,"../../lessons/diagramme/l12-einmaleins-loesung.visustruct":fk,"../../lessons/diagramme/l12-eins-bis-fuenf.visustruct":xk,"../../lessons/diagramme/l12-java-fehler-loesung.visustruct":bk,"../../lessons/diagramme/l12-java-fehler-start.visustruct":yk,"../../lessons/diagramme/l12-java-verdoppeln-loesung.visustruct":vk,"../../lessons/diagramme/l12-summe.visustruct":wk,"../../lessons/diagramme/l13-dreieck.visustruct":zk,"../../lessons/diagramme/l13-gerade-eingaben-loesung.visustruct":Ik,"../../lessons/diagramme/l13-gerade-zaehlen.visustruct":kk,"../../lessons/diagramme/l13-java-fehler-loesung.visustruct":Sk,"../../lessons/diagramme/l13-java-fehler-start.visustruct":_k,"../../lessons/diagramme/l13-java-quadrate-loesung.visustruct":Tk,"../../lessons/diagramme/l13-rechteck-loesung.visustruct":Ok,"../../lessons/diagramme/l14-array-durchlaufen.visustruct":Ak,"../../lessons/diagramme/l14-erster-letzter-loesung.visustruct":Pk,"../../lessons/diagramme/l14-java-fehler-loesung.visustruct":jk,"../../lessons/diagramme/l14-java-fehler-start.visustruct":Ck,"../../lessons/diagramme/l14-java-treppe-loesung.visustruct":Bk,"../../lessons/diagramme/l14-namen-eingeben.visustruct":Dk,"../../lessons/diagramme/l14-rueckwaerts-loesung.visustruct":Zk,"../../lessons/diagramme/l14-summe-max-loesung.visustruct":Mk,"../../lessons/diagramme/l14-summe-maximum.visustruct":Lk,"../../lessons/diagramme/l15-bis-null-loesung.visustruct":Wk,"../../lessons/diagramme/l15-endlos-aussprung.visustruct":Ek,"../../lessons/diagramme/l15-flaeche-loesung.visustruct":Nk,"../../lessons/diagramme/l15-flaeche-unterprogramm-loesung.visustruct":Fk,"../../lessons/diagramme/l15-hauptprogramm.visustruct":Jk,"../../lessons/diagramme/l15-java-fehler-loesung.visustruct":Rk,"../../lessons/diagramme/l15-java-fehler-start.visustruct":Gk,"../../lessons/diagramme/l15-java-noten-loesung.visustruct":Hk,"../../lessons/diagramme/l15-quadrat-haupt.visustruct":Vk,"../../lessons/diagramme/l15-quadrat.visustruct":Qk,"../../lessons/diagramme/l15-titel-loesung.visustruct":qk,"../../lessons/diagramme/l15-unterprogramm.visustruct":Uk,"../../lessons/diagramme/l15-zeige-summe-haupt.visustruct":$k,"../../lessons/diagramme/l15-zeige-summe.visustruct":Yk,"../../lessons/diagramme/l16-countdown-loesung.visustruct":Xk,"../../lessons/diagramme/l16-countdown-start.visustruct":Kk,"../../lessons/diagramme/l16-java-fehler-loesung.visustruct":eS,"../../lessons/diagramme/l16-java-fehler-start.visustruct":tS,"../../lessons/diagramme/l16-java-punkte-loesung.visustruct":nS,"../../lessons/diagramme/l16-schreibtisch.visustruct":iS,"../../lessons/diagramme/l16-summe-loesung.visustruct":aS,"../../lessons/diagramme/l16-summe-start.visustruct":sS,"../../lessons/diagramme/l17-beispiel.visustruct":rS,"../../lessons/diagramme/l17-fakultaet-loesung.visustruct":oS,"../../lessons/diagramme/l17-java-brief-loesung.visustruct":lS,"../../lessons/diagramme/l17-java-brief-start.visustruct":uS,"../../lessons/diagramme/l17-java-fehler-loesung.visustruct":mS,"../../lessons/diagramme/l17-java-fehler-start.visustruct":cS,"../../lessons/diagramme/l17-java-passwort-loesung.visustruct":dS,"../../lessons/diagramme/l17-ticket-loesung.visustruct":hS,"../../lessons/diagramme/l18-beispiel.visustruct":gS,"../../lessons/diagramme/l18-java-fehler-loesung.visustruct":pS,"../../lessons/diagramme/l18-java-fehler-start.visustruct":fS,"../../lessons/diagramme/l18-java-kasse-loesung.visustruct":xS,"../../lessons/diagramme/l18-js-loesung.visustruct":bS,"../../lessons/diagramme/l18-python-loesung.visustruct":yS,"../../lessons/diagramme/l19-java-fehler-loesung.visustruct":vS,"../../lessons/diagramme/l19-java-fehler-start.visustruct":wS,"../../lessons/diagramme/l19-java-zaehlen-loesung.visustruct":zS,"../../lessons/diagramme/l2-ausgabe.visustruct":IS,"../../lessons/diagramme/l2-hallo-loesung.visustruct":kS,"../../lessons/diagramme/l2-zwei-zeilen-loesung.visustruct":SS,"../../lessons/diagramme/l20-countdown-loesung.visustruct":_S,"../../lessons/diagramme/l23-java-ergaenzen-loesung.visustruct":TS,"../../lessons/diagramme/l23-java-ergaenzen-start.visustruct":OS,"../../lessons/diagramme/l23-java-nummern-loesung.visustruct":AS,"../../lessons/diagramme/l23-java-nummern-start.visustruct":PS,"../../lessons/diagramme/l24-java-fuchs-loesung.visustruct":jS,"../../lessons/diagramme/l24-java-fuchs-start.visustruct":CS,"../../lessons/diagramme/l24-java-laengster-loesung.visustruct":BS,"../../lessons/diagramme/l24-java-laengster-start.visustruct":DS,"../../lessons/diagramme/l25-java-beste-loesung.visustruct":ZS,"../../lessons/diagramme/l25-java-beste-start.visustruct":MS,"../../lessons/diagramme/l25-java-schnitt-loesung.visustruct":LS,"../../lessons/diagramme/l25-java-schnitt-start.visustruct":WS,"../../lessons/diagramme/l26-java-namen-loesung.visustruct":ES,"../../lessons/diagramme/l26-java-namen-start.visustruct":NS,"../../lessons/diagramme/l26-java-schreiben-loesung.visustruct":FS,"../../lessons/diagramme/l26-java-schreiben-start.visustruct":JS,"../../lessons/diagramme/l27-java-json-loesung.visustruct":RS,"../../lessons/diagramme/l27-java-json-start.visustruct":GS,"../../lessons/diagramme/l27-java-saetze-loesung.visustruct":HS,"../../lessons/diagramme/l27-java-saetze-start.visustruct":VS,"../../lessons/diagramme/pt/aufgabe-alter-haupt-loesung.visustruct":QS,"../../lessons/diagramme/pt/aufgabe-alter-unterprogramm-loesung.visustruct":qS,"../../lessons/diagramme/pt/aufgabe-ballwurf-loesung.visustruct":US,"../../lessons/diagramme/pt/aufgabe-ballwurf-start.visustruct":$S,"../../lessons/diagramme/pt/aufgabe-bestenliste-loesung.visustruct":YS,"../../lessons/diagramme/pt/aufgabe-binaer-loesung.visustruct":XS,"../../lessons/diagramme/pt/aufgabe-caesar-array-loesung.visustruct":KS,"../../lessons/diagramme/pt/aufgabe-caesar-array-start.visustruct":e_,"../../lessons/diagramme/pt/aufgabe-caesar-ascii-loesung.visustruct":t_,"../../lessons/diagramme/pt/aufgabe-caesar-entschluesseln-loesung.visustruct":n_,"../../lessons/diagramme/pt/aufgabe-collatz-loesung.visustruct":i_,"../../lessons/diagramme/pt/aufgabe-durchschnitt-loesung.visustruct":a_,"../../lessons/diagramme/pt/aufgabe-fibonacci-loesung.visustruct":s_,"../../lessons/diagramme/pt/aufgabe-gerade-loesung.visustruct":r_,"../../lessons/diagramme/pt/aufgabe-mehrwertsteuer-loesung.visustruct":o_,"../../lessons/diagramme/pt/aufgabe-pin-java-loesung.visustruct":l_,"../../lessons/diagramme/pt/aufgabe-pin-loesung.visustruct":u_,"../../lessons/diagramme/pt/aufgabe-rechner-loesung.visustruct":m_,"../../lessons/diagramme/pt/aufgabe-schiffe-loesung.visustruct":c_,"../../lessons/diagramme/pt/aufgabe-schiffe-start.visustruct":d_,"../../lessons/diagramme/pt/aufgabe-speisekarte-loesung.visustruct":h_,"../../lessons/diagramme/pt/aufgabe-summe-loesung.visustruct":g_,"../../lessons/diagramme/pt/aufgabe-tafeldienst-loesung.visustruct":p_,"../../lessons/diagramme/pt/aufgabe-verdoppeln-loesung.visustruct":f_,"../../lessons/diagramme/pt/aufgabe-verleih-java-loesung.visustruct":x_,"../../lessons/diagramme/pt/aufgabe-verleih-loesung.visustruct":b_,"../../lessons/diagramme/pt/aufgabe-vokabeln-loesung.visustruct":y_,"../../lessons/diagramme/pt/aufgabe-vokabeln-start.visustruct":v_,"../../lessons/diagramme/pt/aufgabe-volljaehrig-loesung.visustruct":w_,"../../lessons/diagramme/pt/dt-buffered.visustruct":z_,"../../lessons/diagramme/pt/dt-csv.visustruct":I_,"../../lessons/diagramme/pt/dt-json.visustruct":k_,"../../lessons/diagramme/pt/dt-lesen.visustruct":S_,"../../lessons/diagramme/pt/kino-einmaleins-loesung.visustruct":__,"../../lessons/diagramme/pt/kino-frei-loesung.visustruct":T_,"../../lessons/diagramme/pt/kino-frei-start.visustruct":O_,"../../lessons/diagramme/pt/kino-karte-loesung.visustruct":A_,"../../lessons/diagramme/pt/kino-karte-start.visustruct":P_,"../../lessons/diagramme/pt/kino-saalplan.visustruct":j_,"../../lessons/diagramme/pt/kino-verkaufen.visustruct":C_,"../../lessons/diagramme/pt/l04-java-fehler-loesung.visustruct":B_,"../../lessons/diagramme/pt/l04-java-fehler-start.visustruct":D_,"../../lessons/diagramme/pt/l04-java-steckbrief-loesung.visustruct":Z_,"../../lessons/diagramme/pt/l04-rechnen.visustruct":M_,"../../lessons/diagramme/pt/l04-reihenfolge-loesung.visustruct":L_,"../../lessons/diagramme/pt/l04-reihenfolge-start.visustruct":W_,"../../lessons/diagramme/pt/l04-tauschen-loesung.visustruct":E_,"../../lessons/diagramme/pt/l04-tauschen-start.visustruct":N_,"../../lessons/diagramme/pt/l04-tauschen.visustruct":F_,"../../lessons/diagramme/pt/l05-datentypen.visustruct":J_,"../../lessons/diagramme/pt/l05-division.visustruct":R_,"../../lessons/diagramme/pt/l05-einkauf-loesung.visustruct":G_,"../../lessons/diagramme/pt/l05-java-fehler-loesung.visustruct":H_,"../../lessons/diagramme/pt/l05-java-fehler-start.visustruct":V_,"../../lessons/diagramme/pt/l05-java-kino-loesung.visustruct":Q_,"../../lessons/diagramme/pt/l05-rechteck-loesung.visustruct":q_,"../../lessons/diagramme/pt/l05-sekunden-loesung.visustruct":U_,"../../lessons/diagramme/pt/l05-sekunden-start.visustruct":$_,"../../lessons/diagramme/pt/l06-begruessung-loesung.visustruct":Y_,"../../lessons/diagramme/pt/l06-eva.visustruct":X_,"../../lessons/diagramme/pt/l06-java-fehler-loesung.visustruct":K_,"../../lessons/diagramme/pt/l06-java-fehler-start.visustruct":eT,"../../lessons/diagramme/pt/l06-java-tage-loesung.visustruct":tT,"../../lessons/diagramme/pt/l06-mittelwert-loesung.visustruct":nT,"../../lessons/diagramme/pt/l06-rechner-loesung.visustruct":iT,"../../lessons/diagramme/pt/l07-alter-pruefen.visustruct":aT,"../../lessons/diagramme/pt/l07-betrag-loesung.visustruct":sT,"../../lessons/diagramme/pt/l07-gerade-loesung.visustruct":rT,"../../lessons/diagramme/pt/l07-java-fehler-loesung.visustruct":oT,"../../lessons/diagramme/pt/l07-java-fehler-start.visustruct":lT,"../../lessons/diagramme/pt/l07-java-pizza-loesung.visustruct":uT,"../../lessons/diagramme/pt/l07-java-pizza-start.visustruct":mT,"../../lessons/diagramme/pt/l07-maximum-loesung.visustruct":cT,"../../lessons/diagramme/pt/l07-rabatt.visustruct":dT,"../../lessons/diagramme/pt/l08-gueltig-loesung.visustruct":hT,"../../lessons/diagramme/pt/l08-java-bestanden-loesung.visustruct":gT,"../../lessons/diagramme/pt/l08-java-fehler-loesung.visustruct":pT,"../../lessons/diagramme/pt/l08-java-fehler-start.visustruct":fT,"../../lessons/diagramme/pt/l08-jugendticket.visustruct":xT,"../../lessons/diagramme/pt/l08-note.visustruct":bT,"../../lessons/diagramme/pt/l08-schaltjahr-loesung.visustruct":yT,"../../lessons/diagramme/pt/l08-wochenende-loesung.visustruct":vT,"../../lessons/diagramme/pt/l09-ampel.visustruct":wT,"../../lessons/diagramme/pt/l09-automat.visustruct":zT,"../../lessons/diagramme/pt/l09-java-fehler-loesung.visustruct":IT,"../../lessons/diagramme/pt/l09-java-fehler-start.visustruct":kT,"../../lessons/diagramme/pt/l09-java-schule-loesung.visustruct":ST,"../../lessons/diagramme/pt/l09-note-loesung.visustruct":_T,"../../lessons/diagramme/pt/l09-rechner-loesung.visustruct":TT,"../../lessons/diagramme/pt/l09-verschachtelt.visustruct":OT,"../../lessons/diagramme/pt/l1-grundbausteine.visustruct":AT,"../../lessons/diagramme/pt/l1-sequenz.visustruct":PT,"../../lessons/diagramme/pt/l1-tee.visustruct":jT,"../../lessons/diagramme/pt/l1-verzweigung.visustruct":CT,"../../lessons/diagramme/pt/l1-wiederholung.visustruct":BT,"../../lessons/diagramme/pt/l10-bis-n-loesung.visustruct":DT,"../../lessons/diagramme/pt/l10-countdown.visustruct":ZT,"../../lessons/diagramme/pt/l10-endlos.visustruct":MT,"../../lessons/diagramme/pt/l10-fakultaet.visustruct":LT,"../../lessons/diagramme/pt/l10-java-fehler-loesung.visustruct":WT,"../../lessons/diagramme/pt/l10-java-fehler-start.visustruct":ET,"../../lessons/diagramme/pt/l10-java-wuerfel-loesung.visustruct":NT,"../../lessons/diagramme/pt/l10-verdoppeln-loesung.visustruct":FT,"../../lessons/diagramme/pt/l11-eingabe-pruefen.visustruct":JT,"../../lessons/diagramme/pt/l11-einmal.visustruct":RT,"../../lessons/diagramme/pt/l11-java-fehler-loesung.visustruct":GT,"../../lessons/diagramme/pt/l11-java-fehler-start.visustruct":HT,"../../lessons/diagramme/pt/l11-java-gerade-loesung.visustruct":VT,"../../lessons/diagramme/pt/l11-note-loesung.visustruct":QT,"../../lessons/diagramme/pt/l11-summe-loesung.visustruct":qT,"../../lessons/diagramme/pt/l12-countdown-loesung.visustruct":UT,"../../lessons/diagramme/pt/l12-einmaleins-loesung.visustruct":$T,"../../lessons/diagramme/pt/l12-eins-bis-fuenf.visustruct":YT,"../../lessons/diagramme/pt/l12-java-fehler-loesung.visustruct":XT,"../../lessons/diagramme/pt/l12-java-fehler-start.visustruct":KT,"../../lessons/diagramme/pt/l12-java-verdoppeln-loesung.visustruct":eO,"../../lessons/diagramme/pt/l12-summe.visustruct":tO,"../../lessons/diagramme/pt/l13-dreieck.visustruct":nO,"../../lessons/diagramme/pt/l13-gerade-eingaben-loesung.visustruct":iO,"../../lessons/diagramme/pt/l13-gerade-zaehlen.visustruct":aO,"../../lessons/diagramme/pt/l13-java-fehler-loesung.visustruct":sO,"../../lessons/diagramme/pt/l13-java-fehler-start.visustruct":rO,"../../lessons/diagramme/pt/l13-java-quadrate-loesung.visustruct":oO,"../../lessons/diagramme/pt/l13-rechteck-loesung.visustruct":lO,"../../lessons/diagramme/pt/l14-array-durchlaufen.visustruct":uO,"../../lessons/diagramme/pt/l14-erster-letzter-loesung.visustruct":mO,"../../lessons/diagramme/pt/l14-java-fehler-loesung.visustruct":cO,"../../lessons/diagramme/pt/l14-java-fehler-start.visustruct":dO,"../../lessons/diagramme/pt/l14-java-treppe-loesung.visustruct":hO,"../../lessons/diagramme/pt/l14-namen-eingeben.visustruct":gO,"../../lessons/diagramme/pt/l14-rueckwaerts-loesung.visustruct":pO,"../../lessons/diagramme/pt/l14-summe-max-loesung.visustruct":fO,"../../lessons/diagramme/pt/l14-summe-maximum.visustruct":xO,"../../lessons/diagramme/pt/l15-bis-null-loesung.visustruct":bO,"../../lessons/diagramme/pt/l15-endlos-aussprung.visustruct":yO,"../../lessons/diagramme/pt/l15-flaeche-loesung.visustruct":vO,"../../lessons/diagramme/pt/l15-hauptprogramm.visustruct":wO,"../../lessons/diagramme/pt/l15-java-fehler-loesung.visustruct":zO,"../../lessons/diagramme/pt/l15-java-fehler-start.visustruct":IO,"../../lessons/diagramme/pt/l15-java-noten-loesung.visustruct":kO,"../../lessons/diagramme/pt/l15-quadrat-haupt.visustruct":SO,"../../lessons/diagramme/pt/l15-quadrat.visustruct":_O,"../../lessons/diagramme/pt/l15-titel-loesung.visustruct":TO,"../../lessons/diagramme/pt/l15-unterprogramm.visustruct":OO,"../../lessons/diagramme/pt/l15-zeige-summe-haupt.visustruct":AO,"../../lessons/diagramme/pt/l15-zeige-summe.visustruct":PO,"../../lessons/diagramme/pt/l16-countdown-loesung.visustruct":jO,"../../lessons/diagramme/pt/l16-countdown-start.visustruct":CO,"../../lessons/diagramme/pt/l16-java-fehler-loesung.visustruct":BO,"../../lessons/diagramme/pt/l16-java-fehler-start.visustruct":DO,"../../lessons/diagramme/pt/l16-java-punkte-loesung.visustruct":ZO,"../../lessons/diagramme/pt/l16-schreibtisch.visustruct":MO,"../../lessons/diagramme/pt/l16-summe-loesung.visustruct":LO,"../../lessons/diagramme/pt/l16-summe-start.visustruct":WO,"../../lessons/diagramme/pt/l17-beispiel.visustruct":EO,"../../lessons/diagramme/pt/l17-fakultaet-loesung.visustruct":NO,"../../lessons/diagramme/pt/l17-java-brief-loesung.visustruct":FO,"../../lessons/diagramme/pt/l17-java-brief-start.visustruct":JO,"../../lessons/diagramme/pt/l17-java-fehler-loesung.visustruct":RO,"../../lessons/diagramme/pt/l17-java-fehler-start.visustruct":GO,"../../lessons/diagramme/pt/l17-java-passwort-loesung.visustruct":HO,"../../lessons/diagramme/pt/l17-ticket-loesung.visustruct":VO,"../../lessons/diagramme/pt/l18-beispiel.visustruct":QO,"../../lessons/diagramme/pt/l18-java-fehler-loesung.visustruct":qO,"../../lessons/diagramme/pt/l18-java-fehler-start.visustruct":UO,"../../lessons/diagramme/pt/l18-java-kasse-loesung.visustruct":$O,"../../lessons/diagramme/pt/l18-js-loesung.visustruct":YO,"../../lessons/diagramme/pt/l18-python-loesung.visustruct":XO,"../../lessons/diagramme/pt/l19-java-fehler-loesung.visustruct":KO,"../../lessons/diagramme/pt/l19-java-fehler-start.visustruct":eA,"../../lessons/diagramme/pt/l19-java-zaehlen-loesung.visustruct":tA,"../../lessons/diagramme/pt/l2-ausgabe.visustruct":nA,"../../lessons/diagramme/pt/l2-hallo-loesung.visustruct":iA,"../../lessons/diagramme/pt/l2-zwei-zeilen-loesung.visustruct":aA,"../../lessons/diagramme/pt/l23-java-ergaenzen-loesung.visustruct":sA,"../../lessons/diagramme/pt/l23-java-ergaenzen-start.visustruct":rA,"../../lessons/diagramme/pt/l23-java-nummern-loesung.visustruct":oA,"../../lessons/diagramme/pt/l23-java-nummern-start.visustruct":lA,"../../lessons/diagramme/pt/l24-java-fuchs-loesung.visustruct":uA,"../../lessons/diagramme/pt/l24-java-fuchs-start.visustruct":mA,"../../lessons/diagramme/pt/l24-java-laengster-loesung.visustruct":cA,"../../lessons/diagramme/pt/l24-java-laengster-start.visustruct":dA,"../../lessons/diagramme/pt/l25-java-beste-loesung.visustruct":hA,"../../lessons/diagramme/pt/l25-java-beste-start.visustruct":gA,"../../lessons/diagramme/pt/l25-java-schnitt-loesung.visustruct":pA,"../../lessons/diagramme/pt/l25-java-schnitt-start.visustruct":fA,"../../lessons/diagramme/pt/l26-java-namen-loesung.visustruct":xA,"../../lessons/diagramme/pt/l26-java-namen-start.visustruct":bA,"../../lessons/diagramme/pt/l26-java-schreiben-loesung.visustruct":yA,"../../lessons/diagramme/pt/l26-java-schreiben-start.visustruct":vA,"../../lessons/diagramme/pt/l27-java-json-loesung.visustruct":wA,"../../lessons/diagramme/pt/l27-java-json-start.visustruct":zA,"../../lessons/diagramme/pt/l27-java-saetze-loesung.visustruct":IA,"../../lessons/diagramme/pt/l27-java-saetze-start.visustruct":kA,"../../lessons/diagramme/pt/sim-kino-loesung.visustruct":SA,"../../lessons/diagramme/pt/sim-kino-start.visustruct":_A,"../../lessons/diagramme/pt/sim-tausch-loesung.visustruct":TA,"../../lessons/diagramme/pt/sim-tausch-start.visustruct":OA,"../../lessons/diagramme/pt/sim-tausch.visustruct":AA,"../../lessons/diagramme/pt/ss-absteigend-loesung.visustruct":PA,"../../lessons/diagramme/pt/ss-absteigend-start.visustruct":jA,"../../lessons/diagramme/pt/ss-binaere-suche.visustruct":CA,"../../lessons/diagramme/pt/ss-bubblesort.visustruct":BA,"../../lessons/diagramme/pt/ss-karte-suchen-loesung.visustruct":DA,"../../lessons/diagramme/pt/ss-lineare-suche.visustruct":ZA,"../../lessons/diagramme/pt/uebergabe-bonus-loesung.visustruct":MA,"../../lessons/diagramme/pt/uebergabe-bonus-start.visustruct":LA,"../../lessons/diagramme/pt/uebergabe-bonus-unterprogramm-loesung.visustruct":WA,"../../lessons/diagramme/pt/uebergabe-haupt.visustruct":EA,"../../lessons/diagramme/pt/uebergabe-leeren.visustruct":NA,"../../lessons/diagramme/pt/uebergabe-verdopple.visustruct":FA,"../../lessons/diagramme/pt/zk-initialen-loesung.visustruct":JA,"../../lessons/diagramme/pt/zk-mehr.visustruct":RA,"../../lessons/diagramme/pt/zk-rueckwaerts-loesung.visustruct":GA,"../../lessons/diagramme/pt/zk-split.visustruct":HA,"../../lessons/diagramme/pt/zk-woerter-loesung.visustruct":VA,"../../lessons/diagramme/pt/zk-zaehlen.visustruct":QA,"../../lessons/diagramme/pt/zk-zeichen.visustruct":qA,"../../lessons/diagramme/sim-kino-loesung.visustruct":UA,"../../lessons/diagramme/sim-kino-start.visustruct":$A,"../../lessons/diagramme/sim-tausch-loesung.visustruct":YA,"../../lessons/diagramme/sim-tausch-start.visustruct":XA,"../../lessons/diagramme/sim-tausch.visustruct":KA,"../../lessons/diagramme/ss-absteigend-loesung.visustruct":eP,"../../lessons/diagramme/ss-absteigend-start.visustruct":tP,"../../lessons/diagramme/ss-binaere-suche.visustruct":nP,"../../lessons/diagramme/ss-bubblesort.visustruct":iP,"../../lessons/diagramme/ss-karte-suchen-loesung.visustruct":aP,"../../lessons/diagramme/ss-lineare-suche.visustruct":sP,"../../lessons/diagramme/uebergabe-bonus-loesung.visustruct":rP,"../../lessons/diagramme/uebergabe-bonus-start.visustruct":oP,"../../lessons/diagramme/uebergabe-bonus-unterprogramm-loesung.visustruct":lP,"../../lessons/diagramme/uebergabe-haupt.visustruct":uP,"../../lessons/diagramme/uebergabe-leeren.visustruct":mP,"../../lessons/diagramme/uebergabe-verdopple.visustruct":cP,"../../lessons/diagramme/vb-abstand-anzeigen-loesung.visustruct":dP,"../../lessons/diagramme/vb-abstand-halten-loesung.visustruct":hP,"../../lessons/diagramme/vb-alarmanlage-loesung.visustruct":gP,"../../lessons/diagramme/vb-ampel-loesung.visustruct":pP,"../../lessons/diagramme/vb-ausgang-loesung.visustruct":fP,"../../lessons/diagramme/vb-begruessung-loesung.visustruct":xP,"../../lessons/diagramme/vb-binaer-zaehlen-loesung.visustruct":bP,"../../lessons/diagramme/vb-bis-rot-loesung.visustruct":yP,"../../lessons/diagramme/vb-bis-wand-loesung.visustruct":vP,"../../lessons/diagramme/vb-bis-ziel-loesung.visustruct":wP,"../../lessons/diagramme/vb-buchstaben-loesung.visustruct":zP,"../../lessons/diagramme/vb-drei-lichter-loesung.visustruct":IP,"../../lessons/diagramme/vb-dreieck-loesung.visustruct":kP,"../../lessons/diagramme/vb-einparken-loesung.visustruct":SP,"../../lessons/diagramme/vb-farben-loesung.visustruct":_P,"../../lessons/diagramme/vb-farbweiche-loesung.visustruct":TP,"../../lessons/diagramme/vb-gas-bis-wand-loesung.visustruct":OP,"../../lessons/diagramme/vb-gerade-loesung.visustruct":AP,"../../lessons/diagramme/vb-hindernis-loesung.visustruct":PP,"../../lessons/diagramme/vb-java-akku-loesung.visustruct":jP,"../../lessons/diagramme/vb-java-blau-gruen-loesung.visustruct":CP,"../../lessons/diagramme/vb-java-blinken-loesung.visustruct":BP,"../../lessons/diagramme/vb-java-countdown-loesung.visustruct":DP,"../../lessons/diagramme/vb-java-hoeher-loesung.visustruct":ZP,"../../lessons/diagramme/vb-java-joystick-loesung.visustruct":MP,"../../lessons/diagramme/vb-java-laermampel-loesung.visustruct":LP,"../../lessons/diagramme/vb-java-lauflicht-loesung.visustruct":WP,"../../lessons/diagramme/vb-java-linienfolger-loesung.visustruct":EP,"../../lessons/diagramme/vb-java-nachtlicht-ton-loesung.visustruct":NP,"../../lessons/diagramme/vb-java-rand-loesung.visustruct":FP,"../../lessons/diagramme/vb-java-rechteck-loesung.visustruct":JP,"../../lessons/diagramme/vb-java-textlaenge-loesung.visustruct":RP,"../../lessons/diagramme/vb-java-wand-piep-loesung.visustruct":GP,"../../lessons/diagramme/vb-java-wasserwaage-loesung.visustruct":HP,"../../lessons/diagramme/vb-klatschen-loesung.visustruct":VP,"../../lessons/diagramme/vb-knight-rider-loesung.visustruct":QP,"../../lessons/diagramme/vb-labyrinth-loesung.visustruct":qP,"../../lessons/diagramme/vb-linienfolger-stopp-loesung.visustruct":UP,"../../lessons/diagramme/vb-linienmuster-loesung.visustruct":$P,"../../lessons/diagramme/vb-melodie-loesung.visustruct":YP,"../../lessons/diagramme/vb-morsen-loesung.visustruct":XP,"../../lessons/diagramme/vb-nachtlicht-loesung.visustruct":KP,"../../lessons/diagramme/vb-nachtwaechter-loesung.visustruct":ej,"../../lessons/diagramme/vb-ohne-noten-loesung.visustruct":tj,"../../lessons/diagramme/vb-ohne-quadratzahl-loesung.visustruct":nj,"../../lessons/diagramme/vb-ohne-quadratzahl-unterprogramm-loesung.visustruct":ij,"../../lessons/diagramme/vb-ohne-rueckwaerts-loesung.visustruct":aj,"../../lessons/diagramme/vb-ohne-strecke-loesung.visustruct":sj,"../../lessons/diagramme/vb-ohne-summe-loesung.visustruct":rj,"../../lessons/diagramme/vb-quadrat-loesung.visustruct":oj,"../../lessons/diagramme/vb-quadrat-methode-loesung.visustruct":lj,"../../lessons/diagramme/vb-quadrat-schleife-loesung.visustruct":uj,"../../lessons/diagramme/vb-quadrat-unterprogramm-loesung.visustruct":mj,"../../lessons/diagramme/vb-quadrat-verschachtelt-loesung.visustruct":cj,"../../lessons/diagramme/vb-rand-loesung.visustruct":dj,"../../lessons/diagramme/vb-schraeglage-loesung.visustruct":hj,"../../lessons/diagramme/vb-slalom-loesung.visustruct":gj,"../../lessons/diagramme/vb-spirale-loesung.visustruct":pj,"../../lessons/diagramme/vb-start-a-loesung.visustruct":fj,"../../lessons/diagramme/vb-tonleiter-loesung.visustruct":xj,"../../lessons/diagramme/vb-treppe-loesung.visustruct":bj,"../../lessons/diagramme/vb-tunnel-loesung.visustruct":yj,"../../lessons/diagramme/vb-variable-seite-loesung.visustruct":vj,"../../lessons/diagramme/vb-vier-quadrate-loesung.visustruct":wj,"../../lessons/diagramme/vb-wald-loesung.visustruct":zj,"../../lessons/diagramme/vb-wand-vorn-loesung.visustruct":Ij,"../../lessons/diagramme/vb-zwei-sekunden-loesung.visustruct":kj,"../../lessons/diagramme/zk-initialen-loesung.visustruct":Sj,"../../lessons/diagramme/zk-mehr.visustruct":_j,"../../lessons/diagramme/zk-rueckwaerts-loesung.visustruct":Tj,"../../lessons/diagramme/zk-split.visustruct":Oj,"../../lessons/diagramme/zk-woerter-loesung.visustruct":Aj,"../../lessons/diagramme/zk-zaehlen.visustruct":Pj,"../../lessons/diagramme/zk-zeichen.visustruct":jj}),$B=Object.assign({"../../lessons/welten/ausgang-1.txt":Cj,"../../lessons/welten/ausgang-2.txt":Bj,"../../lessons/welten/ecke.txt":Dj,"../../lessons/welten/farbe-1.txt":Zj,"../../lessons/welten/farbe-2.txt":Mj,"../../lessons/welten/farbe-3.txt":Lj,"../../lessons/welten/farbe-4.txt":Wj,"../../lessons/welten/hindernis-1.txt":Ej,"../../lessons/welten/hindernis-2.txt":Nj,"../../lessons/welten/labyrinth-1.txt":Fj,"../../lessons/welten/labyrinth-2.txt":Jj,"../../lessons/welten/linie-1.txt":Rj,"../../lessons/welten/linie-2.txt":Gj,"../../lessons/welten/linie-rot-1.txt":Hj,"../../lessons/welten/linie-rot-2.txt":Vj,"../../lessons/welten/parken-1.txt":Qj,"../../lessons/welten/parken-2.txt":qj,"../../lessons/welten/rand-1.txt":Uj,"../../lessons/welten/rand-2.txt":$j,"../../lessons/welten/slalom.txt":Yj,"../../lessons/welten/tunnel-1.txt":Xj,"../../lessons/welten/tunnel-2.txt":Kj,"../../lessons/welten/wald-1.txt":eC,"../../lessons/welten/wald-2.txt":tC,"../../lessons/welten/wand-frei.txt":nC,"../../lessons/welten/wand-kurz.txt":iC,"../../lessons/welten/wand-lang.txt":aC,"../../lessons/welten/wand-mittel.txt":sC,"../../lessons/welten/wand-nah.txt":rC,"../../lessons/welten/zeit-1.txt":oC,"../../lessons/welten/ziel-kurz.txt":lC,"../../lessons/welten/ziel-lang.txt":uC}),YB=Object.assign({"../../lessons/bilder/aufgabe-mehrwertsteuer.svg":mC,"../../lessons/bilder/ben-shneiderman.jpg":cC,"../../lessons/bilder/caesar-ascii.svg":dC,"../../lessons/bilder/caesar-scheibe.svg":hC,"../../lessons/bilder/caesar-verschiebung.svg":gC,"../../lessons/bilder/en/aufgabe-mehrwertsteuer.svg":pC,"../../lessons/bilder/en/kino-saal.svg":fC,"../../lessons/bilder/en/kino-schleifen.svg":xC,"../../lessons/bilder/en/l01-pap.svg":bC,"../../lessons/bilder/en/l02-einfuegen.svg":yC,"../../lessons/bilder/en/l04-variable.svg":vC,"../../lessons/bilder/en/l04-zuweisung.svg":wC,"../../lessons/bilder/en/l05-tauschen.svg":zC,"../../lessons/bilder/en/l08-zahlenstrahl.svg":IC,"../../lessons/bilder/en/l10-kopfgesteuert.svg":kC,"../../lessons/bilder/en/l11-vergleich.svg":SC,"../../lessons/bilder/en/l12-for-ablauf.svg":_C,"../../lessons/bilder/en/l14-array.svg":TC,"../../lessons/bilder/en/mvc-klick.svg":OC,"../../lessons/bilder/en/ss-binaere-suche.svg":AC,"../../lessons/bilder/en/ss-bubblesort.svg":PC,"../../lessons/bilder/en/ss-lineare-suche.svg":jC,"../../lessons/bilder/en/ss-vergleiche.svg":CC,"../../lessons/bilder/en/uebergabe.svg":BC,"../../lessons/bilder/en/zk-zeichen.svg":DC,"../../lessons/bilder/ike-nassi.jpg":ZC,"../../lessons/bilder/kino-saal.svg":MC,"../../lessons/bilder/kino-schleifen.svg":LC,"../../lessons/bilder/l01-pap.svg":WC,"../../lessons/bilder/l02-einfuegen.svg":EC,"../../lessons/bilder/l04-variable.svg":NC,"../../lessons/bilder/l04-zuweisung.svg":FC,"../../lessons/bilder/l05-tauschen.svg":JC,"../../lessons/bilder/l08-zahlenstrahl.svg":RC,"../../lessons/bilder/l09-wahrheitstabelle.svg":GC,"../../lessons/bilder/l10-kopfgesteuert.svg":HC,"../../lessons/bilder/l11-vergleich.svg":VC,"../../lessons/bilder/l12-for-ablauf.svg":QC,"../../lessons/bilder/l14-array.svg":qC,"../../lessons/bilder/mvc-klick.svg":UC,"../../lessons/bilder/pt/aufgabe-mehrwertsteuer.svg":$C,"../../lessons/bilder/pt/kino-saal.svg":YC,"../../lessons/bilder/pt/kino-schleifen.svg":XC,"../../lessons/bilder/pt/l01-pap.svg":KC,"../../lessons/bilder/pt/l02-einfuegen.svg":eB,"../../lessons/bilder/pt/l04-variable.svg":tB,"../../lessons/bilder/pt/l04-zuweisung.svg":nB,"../../lessons/bilder/pt/l05-tauschen.svg":iB,"../../lessons/bilder/pt/l08-zahlenstrahl.svg":aB,"../../lessons/bilder/pt/l10-kopfgesteuert.svg":sB,"../../lessons/bilder/pt/l11-vergleich.svg":rB,"../../lessons/bilder/pt/l12-for-ablauf.svg":oB,"../../lessons/bilder/pt/l14-array.svg":lB,"../../lessons/bilder/pt/mvc-klick.svg":uB,"../../lessons/bilder/pt/schiffe-versenken.svg":mB,"../../lessons/bilder/pt/ss-binaere-suche.svg":cB,"../../lessons/bilder/pt/ss-bubblesort.svg":dB,"../../lessons/bilder/pt/ss-lineare-suche.svg":hB,"../../lessons/bilder/pt/ss-vergleiche.svg":gB,"../../lessons/bilder/pt/uebergabe.svg":pB,"../../lessons/bilder/pt/zk-zeichen.svg":fB,"../../lessons/bilder/schiffe-versenken.svg":xB,"../../lessons/bilder/ss-binaere-suche.svg":bB,"../../lessons/bilder/ss-bubblesort.svg":yB,"../../lessons/bilder/ss-lineare-suche.svg":vB,"../../lessons/bilder/ss-vergleiche.svg":wB,"../../lessons/bilder/uebergabe.svg":zB,"../../lessons/bilder/zk-zeichen.svg":IB}),Jh=i=>i.replace(/^.*\//,"");function F1(i,e,t){const n=s=>new Map(Object.entries(i).filter(([r])=>{var o;return((o=e.exec(r))==null?void 0:o[1])===s}).map(([r,o])=>[Jh(r),o]));return[...new Map([...n("en"),...t==="en"?[]:n(t)])]}function Mu(i){return i==="de"?"de":i==="pt-PT"?"pt":"en"}let w1="en",Ot=[],Tn=[],Ma="",La=[],ds="off";function Lu(i){i!==ds&&(ds=i,Ot=[],hs(w1))}function hs(i){var s,r,o;if(e3(i),i===w1&&Ot.length>0)return;w1=i;const e=F1(VB,/\/lessons\/([^/]+)\/[^/]+\.md$/,i),t=(l,u)=>l.filter(([m])=>/^\d+/.test(m)).map(([m,c])=>GB(Nu(c,u),`${i}/${m}`)).sort((m,c)=>m.number-c.number),n=(l,u,m)=>l.map(([c,d])=>{const h=HB(Nu(d,m),`${i}/${u}${c}`);return m&&h.after!==void 0?{...h,after:m.get(h.after)??h.after}:h}),a=F1(QB,/\/lessons\/([^/]+)\/aufgaben\/[^/]+\.md$/,i);if(ds==="on"){const l=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i),u=XB(Eu(e),Eu(l)),m=t(e,u.normal),c=h=>{var g;return((g=[...m].reverse().find(f=>u.normal.get(f.number)({...h,number:u.normal.get(h.number)})),...t(l,u.robot).map(h=>{const g=u.robot.get(h.number);return{...h,number:g,section:c(g),robot:!0}})].sort((h,g)=>h.number-g.number);const d=F1(qB,/\/lessons\/([^/]+)\/visubot\/aufgaben\/[^/]+\.md$/,i);Tn=[...n(a,"aufgaben/",u.normal),...n(d,"visubot/aufgaben/",u.robot).map(h=>({...h,robot:!0}))]}else Ot=t(e),Tn=n(a,"aufgaben/");Tn.sort((l,u)=>(l.after??0)-(u.after??0)||l.level-u.level||l.title.localeCompare(u.title,i));for(const l of[...Ot.flatMap(u=>u.steps.flatMap(m=>m.blocks)),...Tn.flatMap(u=>u.blocks)])l.kind==="textFile"&&m3(l.name,l.content);if(Ma=((s=e.find(([l])=>l==="nachschlagen.md"))==null?void 0:s[1])??"",ds!=="off"){const l=(r=F1(Zu,/\/lessons\/([^/]+)\/visubot\/[^/]+\.md$/,i).find(([u])=>u==="nachschlagen.md"))==null?void 0:r[1];l&&(Ma=`${Ma.trimEnd()} -${l}`)}La=IB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const Wu={1:3,2:5,3:5,4:8,5:11,6:11,7:11,8:11,9:11,10:11,11:11,12:11,13:11,14:11,15:11,16:14,17:15,18:15,19:17,20:17,21:17,22:18},Eu=i=>i.map(([e])=>{var t;return Number((t=/^(\d+)/.exec(e))==null?void 0:t[1])}).filter(Number.isFinite).sort((e,t)=>e-t);function YB(i,e){const t=[...i].reverse().find(o=>o<=19)??i.at(-1)??0,n=o=>i.includes(Wu[o])?Wu[o]:t,a=new Map,s=new Map;let r=1;for(const o of i){a.set(o,r++);for(const l of e.filter(u=>n(u)===o))s.set(l,r++)}return{normal:a,robot:s}}function Nu(i,e){return e?i.replace(/\b(Lektion(?:en)?|Lessons?|Li[cç](?:ão|ões))(\s+\d+(?:\s*(?:,|bis|und|and|to|a|e|–|-)\s*\d+)*)/gi,(t,n,a)=>n+a.replace(/\d+/g,s=>String(e.get(Number(s))??s))):i}hs("en");function Jh(i,e){return w1==="de"?i.get(e)??i.get(`en/${e}`):(w1==="en"?void 0:i.get(`${w1}/${e}`))??i.get(`en/${e}`)??i.get(e)}const Rh=(i,e)=>i.slice(i.indexOf(e)+e.length),XB=new Map(Object.entries(qB).map(([i,e])=>[Rh(i,"/diagramme/"),e]));function X1(i){const e=Jh(XB,i);return e===void 0?void 0:Bl(e)}const KB=new Map(Object.entries($B).map(([i,e])=>[Rh(i,"/bilder/"),e]));function Fu(i){return Jh(KB,i)}const eD=new Map(Object.entries(UB).map(([i,e])=>[Fh(i).replace(/\.txt$/,""),e])),Ju=new Map;function Wa(i){const e=eD.get(i);if(e===void 0)return;let t=Ju.get(i);return t||Ju.set(i,t=Tx(e)),t}const Gh=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function Fe(i){const e=[];let t=Gh(i).replace(/`([^`]+)`/g,(n,a)=>(e.push(a),`\0${e.length-1}\0`));return t=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/(^|[^*])\*([^*\s][^*]*?)\*/g,"$1$2").replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(n,a,s)=>{const r=/^(https?:|mailto:|#|\.{0,2}\/)/.test(s)?s:"#",o=/^https?:/.test(r)?' target="_blank" rel="noopener noreferrer"':"";return`${a}`}).replace(/\[([^\]]+)\]\{\.(blau|orange|gruen)\}/g,'$1').replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g,'$1'),t.replace(/\u0000(\d+)\u0000/g,(n,a)=>`${e[Number(a)]}`)}function kn(i){const e=[],t=i.replace(/\r\n/g,` +${l}`)}La=kB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const Wu={1:3,2:5,3:5,4:8,5:11,6:11,7:11,8:11,9:11,10:11,11:11,12:11,13:11,14:11,15:11,16:14,17:15,18:15,19:17,20:17,21:17,22:18},Eu=i=>i.map(([e])=>{var t;return Number((t=/^(\d+)/.exec(e))==null?void 0:t[1])}).filter(Number.isFinite).sort((e,t)=>e-t);function XB(i,e){const t=[...i].reverse().find(o=>o<=19)??i.at(-1)??0,n=o=>i.includes(Wu[o])?Wu[o]:t,a=new Map,s=new Map;let r=1;for(const o of i){a.set(o,r++);for(const l of e.filter(u=>n(u)===o))s.set(l,r++)}return{normal:a,robot:s}}function Nu(i,e){return e?i.replace(/\b(Lektion(?:en)?|Lessons?|Li[cç](?:ão|ões))(\s+\d+(?:\s*(?:,|bis|und|and|to|a|e|–|-)\s*\d+)*)/gi,(t,n,a)=>n+a.replace(/\d+/g,s=>String(e.get(Number(s))??s))):i}hs("en");function Rh(i,e){return w1==="de"?i.get(e)??i.get(`en/${e}`):(w1==="en"?void 0:i.get(`${w1}/${e}`))??i.get(`en/${e}`)??i.get(e)}const Gh=(i,e)=>i.slice(i.indexOf(e)+e.length),KB=new Map(Object.entries(UB).map(([i,e])=>[Gh(i,"/diagramme/"),e]));function X1(i){const e=Rh(KB,i);return e===void 0?void 0:Bl(e)}const eD=new Map(Object.entries(YB).map(([i,e])=>[Gh(i,"/bilder/"),e]));function Fu(i){return Rh(eD,i)}const tD=new Map(Object.entries($B).map(([i,e])=>[Jh(i).replace(/\.txt$/,""),e])),Ju=new Map;function Wa(i){const e=tD.get(i);if(e===void 0)return;let t=Ju.get(i);return t||Ju.set(i,t=Ox(e)),t}const Hh=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function Re(i){const e=[];let t=Hh(i).replace(/`([^`]+)`/g,(n,a)=>(e.push(a),`\0${e.length-1}\0`));return t=t.replace(/\*\*(.+?)\*\*/g,"$1").replace(/(^|[^*])\*([^*\s][^*]*?)\*/g,"$1$2").replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(n,a,s)=>{const r=/^(https?:|mailto:|#|\.{0,2}\/)/.test(s)?s:"#",o=/^https?:/.test(r)?' target="_blank" rel="noopener noreferrer"':"";return`${a}`}).replace(/\[([^\]]+)\]\{\.(blau|orange|gruen|gelb|rosa)\}/g,'$1').replace(/\[([^\]]+)\]\{(?:teil|part)=([\w,]+)\}/g,'$1'),t.replace(/\u0000(\d+)\u0000/g,(n,a)=>`${e[Number(a)]}`)}function kn(i){const e=[],t=i.replace(/\r\n/g,` `).split(` -`);let n=0;for(;n${Gh(l.join(` -`))}`);continue}const s=/^(#{2,4})\s+(.*)$/.exec(a);if(s){const o=s[1].length;e.push(`${Fe(s[2])}`),n++;continue}if(/^\s*([-*]|\d+\.)\s+/.test(a)){const o=/^\s*\d+\./.test(a),l=[];for(;n${Fe(u)}`)}e.push(o?`
    ${l.join("")}
`:`
    ${l.join("")}
`);continue}if(a.startsWith("|")&&/^\|?[\s:|-]*-{3,}[\s:|-]*$/.test(t[n+1]??"")){const o=m=>m.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(c=>Fe(c.trim())),l=o(a);n+=2;const u=[];for(;n${l.map(m=>``).join("")}${u.map(m=>`${m.map(c=>``).join("")}`).join("")}
${m}
${c}
`);continue}if(a.startsWith(">")){const o=[];for(;n");)o.push(t[n++].replace(/^>\s?/,""));e.push(``);continue}const r=[];for(;n|\||\s*([-*]|\d+\.)\s+)/.test(t[n]);)r.push(t[n++].trim());e.push(`

${Fe(r.join(" "))}

`)}return e.join(` -`)}const aa=""+new URL("ludwig-Cus1i402.webp",import.meta.url).href,Ao="f4ecc8e489ae7865308288c7d0fa313333cf2be3ff529b23bc214bee010310e0",Kl="visustruct.learn.teacher";let e0=!1;function Ru(){if(e0)return!0;try{return localStorage.getItem(Kl)===Ao}catch{return!1}}async function tD(i){const e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(i));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}async function nD(i){let e=!1;try{e=await tD(i.trim())===Ao}catch{return!1}if(e){e0=!0;try{localStorage.setItem(Kl,Ao)}catch{}}return e}function iD(){e0=!1;try{localStorage.removeItem(Kl)}catch{}}function Hh(i,e,t=!1){const n=document.createElement("figure");n.className=t?"learn-file written":"learn-file";const a=document.createElement("figcaption"),s=document.createElement("span");s.className="learn-file-icon",s.setAttribute("aria-hidden","true"),s.textContent="📄",a.append(s,t?p("web_sim_written_file_fmt",i):i);const r=document.createElement("pre");return r.className="learn-file-text",r.dir="ltr",e.replace(/\n$/,"").split(` +`);let n=0;for(;n${Hh(l.join(` +`))}`);continue}const s=/^(#{2,4})\s+(.*)$/.exec(a);if(s){const o=s[1].length;e.push(`${Re(s[2])}`),n++;continue}if(/^\s*([-*]|\d+\.)\s+/.test(a)){const o=/^\s*\d+\./.test(a),l=[];for(;n${Re(u)}`)}e.push(o?`
    ${l.join("")}
`:`
    ${l.join("")}
`);continue}if(a.startsWith("|")&&/^\|?[\s:|-]*-{3,}[\s:|-]*$/.test(t[n+1]??"")){const o=m=>m.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(c=>Re(c.trim())),l=o(a);n+=2;const u=[];for(;n${l.map(m=>``).join("")}${u.map(m=>`${m.map(c=>``).join("")}`).join("")}
${m}
${c}
`);continue}if(a.startsWith(">")){const o=[];for(;n");)o.push(t[n++].replace(/^>\s?/,""));e.push(``);continue}const r=[];for(;n|\||\s*([-*]|\d+\.)\s+)/.test(t[n]);)r.push(t[n++].trim());e.push(`

${Re(r.join(" "))}

`)}return e.join(` +`)}const aa=""+new URL("ludwig-Cus1i402.webp",import.meta.url).href,Ao="f4ecc8e489ae7865308288c7d0fa313333cf2be3ff529b23bc214bee010310e0",Kl="visustruct.learn.teacher";let e0=!1;function Ru(){if(e0)return!0;try{return localStorage.getItem(Kl)===Ao}catch{return!1}}async function nD(i){const e=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(i));return[...new Uint8Array(e)].map(t=>t.toString(16).padStart(2,"0")).join("")}async function iD(i){let e=!1;try{e=await nD(i.trim())===Ao}catch{return!1}if(e){e0=!0;try{localStorage.setItem(Kl,Ao)}catch{}}return e}function aD(){e0=!1;try{localStorage.removeItem(Kl)}catch{}}function Vh(i,e,t=!1){const n=document.createElement("figure");n.className=t?"learn-file written":"learn-file";const a=document.createElement("figcaption"),s=document.createElement("span");s.className="learn-file-icon",s.setAttribute("aria-hidden","true"),s.textContent="📄",a.append(s,t?p("web_sim_written_file_fmt",i):i);const r=document.createElement("pre");return r.className="learn-file-text",r.dir="ltr",e.replace(/\n$/,"").split(` `).forEach((l,u)=>{const m=document.createElement("span");m.className="ln",m.textContent=String(u+1),r.append(m,l+` -`)}),n.append(a,r),n}function Vh(i){return[...i].map(([e,t])=>Hh(e,t,!0))}function Kn(i){switch(i.kind){case"finished":return p("sim_notice_finished");case"infiniteLoopWithoutBody":return p("sim_notice_infinite_loop_empty");case"unsupportedStatement":return p("sim_notice_unsupported_statement_fmt",i.text);case"invalidExpression":return p("sim_notice_invalid_expression_fmt",i.text);case"unknownVariable":return p("sim_notice_unknown_variable_fmt",i.text);case"divisionByZero":return p("sim_notice_division_by_zero");case"wholeNumberExpected":return p("sim_notice_whole_number_expected");case"numberExpected":return p("sim_notice_number_expected");case"booleanExpected":return p("sim_notice_boolean_expected");case"subprogramNotFound":return p("sim_notice_subprogram_not_found_fmt",i.text);case"callTooDeep":return p("sim_notice_call_too_deep");case"callArguments":return p("web_sim_call_arguments_fmt",i.text);case"missingReturn":return p("web_sim_missing_return_fmt",i.text);case"fileNotFound":return p("web_sim_file_not_found_fmt",i.text);case"endOfFile":return p("web_sim_end_of_file_fmt",i.text);case"nullValue":return p("web_sim_null_value_fmt",i.text);case"other":return i.text}}const Te=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Gu=["0.2","0.5","1.0","1.5","2.0"],aD=i=>Number(i).toLocaleString(i1()==="java"?"en":i1(),{minimumFractionDigits:1}),fr="visustruct.simulation.stepDelay",Hu="visustruct.simulation.highlightMode";function xr(i){try{return localStorage.getItem(i)}catch{return null}}function Vu(i,e){try{localStorage.setItem(i,e)}catch{}}class sD{constructor(e,t,n=()=>{},a=()=>{},s=()=>{}){v(this,"element");v(this,"engine");v(this,"isPlaying",!1);v(this,"playTimer");v(this,"wasPlayingBeforeInput",!1);v(this,"delay",Gu.includes(xr(fr)??"")?xr(fr):"0.5");v(this,"highlightMode",xr(Hu)==="nextToExecute"?"nextToExecute":"lastExecuted");v(this,"buttons");v(this,"inputSection");v(this,"trace");v(this,"variables");v(this,"output");v(this,"transcript",[]);v(this,"printed",0);v(this,"notice");v(this,"editButton");v(this,"robot");v(this,"liveBusy",!1);this.currentDocument=e,this.onHighlight=t,this.findSubprogram=n,this.onEdit=a,this.onTranscript=s,this.engine=new bi(e(),n),this.element=document.createElement("aside"),this.element.className="simpanel",this.build()}setRobot(e){var t;this.robot!==e&&((t=this.robot)==null||t.element.remove(),this.robot=e,e&&(this.element.querySelector("section").after(e.element),e.onWorldChange=()=>this.restartEngine(),e.reset()))}showRobot(){var e;(e=this.robot)==null||e.show()}begin(){this.pause(),this.restartEngine(),this.showRobot()}end(){this.pause()}step(){var n,a,s;if((n=this.robot)!=null&&n.live){this.stepLive();return}if(!this.engine.canStep){this.pause();return}const e=this.isPlaying,t=this.engine.currentStepPath;(a=this.robot)==null||a.prepare(this.engine),this.engine.step(),(s=this.robot)==null||s.follow(this.engine.state.robotActions,e?Number(this.delay)*850:450),this.afterStep(e,t)}async stepLive(){if(this.liveBusy)return;if(!this.engine.canStep){this.pause();return}this.liveBusy=!0;const e=this.robot,t=this.isPlaying,n=this.engine.currentStepPath;try{await e.prepareLive(this.engine,t3(JSON.stringify(this.currentDocument()))),this.engine.step(),e.follow(this.engine.state.robotActions,450),await e.drive(this.engine.state.robotActions)}catch(a){e.liveFailed(a),this.isPlaying=!1}finally{this.liveBusy=!1}this.afterStep(t,n)}afterStep(e,t){this.collectOutput(),this.highlightMode==="nextToExecute"&&this.engine.canStep?this.onHighlight(this.engine.currentStepPath):this.onHighlight(t??this.engine.currentStepPath),this.engine.state.inputRequest&&e&&(this.wasPlayingBeforeInput=!0),this.engine.canStep||this.pause(),this.update()}reset(){this.pause(),this.restartEngine()}play(){if(this.isPlaying||!this.engine.canStep)return;this.isPlaying=!0;const e=async()=>{var t;this.playTimer=void 0,this.isPlaying&&((t=this.robot)!=null&&t.live?await this.stepLive():this.step(),this.isPlaying&&this.engine.canStep?this.playTimer=window.setTimeout(()=>void e(),Number(this.delay)*1e3):(this.isPlaying=!1,this.update()))};e()}pause(){this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.isPlaying=!1,this.update()}submitInput(e){var s,r;const t=this.isPlaying||this.wasPlayingBeforeInput;this.pause();const n=((s=this.engine.state.inputRequest)==null?void 0:s.prompt)??"",a=(r=this.engine.state.inputRequest)==null?void 0:r.continuesLine;if(this.engine.provideInput(e.value),!this.engine.state.inputRequest){const o=this.transcript[this.transcript.length-1];a&&o&&o.typed===void 0?o.typed=e.value:this.transcript.push({text:n?`${n} `:"",typed:e.value}),e.value=""}this.onHighlight(this.engine.currentStepPath),t&&this.engine.canStep&&(this.wasPlayingBeforeInput=!1,this.play()),this.update()}restartEngine(){var e;this.engine=new bi(this.currentDocument(),this.findSubprogram),this.transcript=[],this.printed=0,this.wasPlayingBeforeInput=!1,(e=this.robot)==null||e.reset(),this.onHighlight(this.engine.currentStepPath),this.update()}build(){this.element.innerHTML=` +`)}),n.append(a,r),n}function Qh(i){return[...i].map(([e,t])=>Vh(e,t,!0))}function Kn(i){switch(i.kind){case"finished":return p("sim_notice_finished");case"infiniteLoopWithoutBody":return p("sim_notice_infinite_loop_empty");case"unsupportedStatement":return p("sim_notice_unsupported_statement_fmt",i.text);case"invalidExpression":return p("sim_notice_invalid_expression_fmt",i.text);case"unknownVariable":return p("sim_notice_unknown_variable_fmt",i.text);case"divisionByZero":return p("sim_notice_division_by_zero");case"wholeNumberExpected":return p("sim_notice_whole_number_expected");case"numberExpected":return p("sim_notice_number_expected");case"booleanExpected":return p("sim_notice_boolean_expected");case"subprogramNotFound":return p("sim_notice_subprogram_not_found_fmt",i.text);case"callTooDeep":return p("sim_notice_call_too_deep");case"callArguments":return p("web_sim_call_arguments_fmt",i.text);case"missingReturn":return p("web_sim_missing_return_fmt",i.text);case"fileNotFound":return p("web_sim_file_not_found_fmt",i.text);case"endOfFile":return p("web_sim_end_of_file_fmt",i.text);case"nullValue":return p("web_sim_null_value_fmt",i.text);case"other":return i.text}}const Ae=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),Gu=["0.2","0.5","1.0","1.5","2.0"],sD=i=>Number(i).toLocaleString(i1()==="java"?"en":i1(),{minimumFractionDigits:1}),fr="visustruct.simulation.stepDelay",Hu="visustruct.simulation.highlightMode";function xr(i){try{return localStorage.getItem(i)}catch{return null}}function Vu(i,e){try{localStorage.setItem(i,e)}catch{}}class rD{constructor(e,t,n=()=>{},a=()=>{},s=()=>{}){v(this,"element");v(this,"engine");v(this,"isPlaying",!1);v(this,"playTimer");v(this,"wasPlayingBeforeInput",!1);v(this,"delay",Gu.includes(xr(fr)??"")?xr(fr):"0.5");v(this,"highlightMode",xr(Hu)==="nextToExecute"?"nextToExecute":"lastExecuted");v(this,"buttons");v(this,"inputSection");v(this,"trace");v(this,"variables");v(this,"output");v(this,"transcript",[]);v(this,"printed",0);v(this,"notice");v(this,"editButton");v(this,"robot");v(this,"liveBusy",!1);this.currentDocument=e,this.onHighlight=t,this.findSubprogram=n,this.onEdit=a,this.onTranscript=s,this.engine=new bi(e(),n),this.element=document.createElement("aside"),this.element.className="simpanel",this.build()}setRobot(e){var t;this.robot!==e&&((t=this.robot)==null||t.element.remove(),this.robot=e,e&&(this.element.querySelector("section").after(e.element),e.onWorldChange=()=>this.restartEngine(),e.reset()))}showRobot(){var e;(e=this.robot)==null||e.show()}begin(){this.pause(),this.restartEngine(),this.showRobot()}end(){this.pause()}step(){var n,a,s;if((n=this.robot)!=null&&n.live){this.stepLive();return}if(!this.engine.canStep){this.pause();return}const e=this.isPlaying,t=this.engine.currentStepPath;(a=this.robot)==null||a.prepare(this.engine),this.engine.step(),(s=this.robot)==null||s.follow(this.engine.state.robotActions,e?Number(this.delay)*850:450),this.afterStep(e,t)}async stepLive(){if(this.liveBusy)return;if(!this.engine.canStep){this.pause();return}this.liveBusy=!0;const e=this.robot,t=this.isPlaying,n=this.engine.currentStepPath;try{await e.prepareLive(this.engine,n3(JSON.stringify(this.currentDocument()))),this.engine.step(),e.follow(this.engine.state.robotActions,450),await e.drive(this.engine.state.robotActions)}catch(a){e.liveFailed(a),this.isPlaying=!1}finally{this.liveBusy=!1}this.afterStep(t,n)}afterStep(e,t){this.collectOutput(),this.highlightMode==="nextToExecute"&&this.engine.canStep?this.onHighlight(this.engine.currentStepPath):this.onHighlight(t??this.engine.currentStepPath),this.engine.state.inputRequest&&e&&(this.wasPlayingBeforeInput=!0),this.engine.canStep||this.pause(),this.update()}reset(){this.pause(),this.restartEngine()}play(){if(this.isPlaying||!this.engine.canStep)return;this.isPlaying=!0;const e=async()=>{var t;this.playTimer=void 0,this.isPlaying&&((t=this.robot)!=null&&t.live?await this.stepLive():this.step(),this.isPlaying&&this.engine.canStep?this.playTimer=window.setTimeout(()=>void e(),Number(this.delay)*1e3):(this.isPlaying=!1,this.update()))};e()}pause(){this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.isPlaying=!1,this.update()}submitInput(e){var s,r;const t=this.isPlaying||this.wasPlayingBeforeInput;this.pause();const n=((s=this.engine.state.inputRequest)==null?void 0:s.prompt)??"",a=(r=this.engine.state.inputRequest)==null?void 0:r.continuesLine;if(this.engine.provideInput(e.value),!this.engine.state.inputRequest){const o=this.transcript[this.transcript.length-1];a&&o&&o.typed===void 0?o.typed=e.value:this.transcript.push({text:n?`${n} `:"",typed:e.value}),e.value=""}this.onHighlight(this.engine.currentStepPath),t&&this.engine.canStep&&(this.wasPlayingBeforeInput=!1,this.play()),this.update()}restartEngine(){var e;this.engine=new bi(this.currentDocument(),this.findSubprogram),this.transcript=[],this.printed=0,this.wasPlayingBeforeInput=!1,(e=this.robot)==null||e.reset(),this.onHighlight(this.engine.currentStepPath),this.update()}build(){this.element.innerHTML=`
-

${Te(p("simulation_controls"))}

+

${Ae(p("simulation_controls"))}

- - - - + + + +
-

- -

${Te(p("simulation_input"))}

-

${Te(p("simulation_trace"))}

-

${Te(p("simulation_variables"))}

-

${Te(p("simulation_output"))}

- `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Te(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(Qh(u)):m.textContent=ve(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Te(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...Vh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Te(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function Qh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,rD="http://www.w3.org/2000/svg";function Ze(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(rD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function oD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function lD(i,e){let t=i,n=!1,a=-t*Jn;const s=Ze("section",{class:"learn-game learn-caesar"});s.append(Ze("div",{class:"learn-game-head"},Ze("strong",{},p("web_learn_caesar_title")))),s.append(Ze("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:uD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let A=0;A{o.cells.forEach((W,J)=>W.classList.toggle("marked",J===A)),u.cells.forEach((W,J)=>W.classList.toggle("marked",A!==void 0&&J===(A+t)%26))},k=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),_.textContent=oD(y.value,n?-t:t)||" ";const A=Array.from(y.value.toUpperCase()).reverse().find(J=>f1.includes(J));if(A===void 0)return S();const W=f1.indexOf(A);S(n?(W-t+26)%26:W)},T=A=>{t=(A%26+26)%26,a=-t*Jn,k()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var A;n&&(y.value=((A=_.textContent)==null?void 0:A.trim())??""),n=!1,k()}),x.addEventListener("click",()=>{var A;n||(y.value=((A=_.textContent)==null?void 0:A.trim())??""),n=!0,k()}),y.addEventListener("input",k),o.cells.forEach((A,W)=>A.addEventListener("click",()=>S(W)));let j;const B=A=>{const W=r.getBoundingClientRect();return Math.atan2(A.clientY-(W.top+W.height/2),A.clientX-(W.left+W.width/2))*180/Math.PI};l.addEventListener("pointerdown",A=>{const W=A;j=B(W)-a,l.classList.add("dragging"),r.setPointerCapture(W.pointerId),W.preventDefault()}),r.addEventListener("pointermove",A=>{if(j===void 0)return;a=B(A)-j,l.setAttribute("transform",`rotate(${a})`);const W=Math.round(-a/Jn);if((W%26+26)%26!==t){t=(W%26+26)%26;const J=a;k(),a=J,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),k(),s}function uD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),qh=new WeakMap;function Uh(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=Q(async()=>{const{Robot3D:c}=await import("./robot3d-AYD_3VhA.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return qh.set(a,m),m}function mD(i,e,t=!1){return Uh(i,e,t).box}function cD(i){const e=i.querySelector(".visubot-model"),t=e&&qh.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function dD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=Uh([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(y=>{window.clearTimeout(y),window.clearInterval(y)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const y=V("button",{class:"primary"},o+1{o++,o{const y=i.rounds[o],w=i.seconds,_=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),S=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,_),k=V("div",{class:"learn-game-feedback",role:"status"}),T=y.code.split(` -`).map((J,U)=>{const ie=V("button",{class:"ln",type:"button"},J||" ");return ie.disabled=!J.trim(),ie.addEventListener("click",()=>A(U+1===y.wrongLine?"right":"wrong",ie)),ie}),j=V("div",{class:"learn-game-code learn-bomb-code mono",dir:"ltr"},...T),B=Date.now(),P=()=>{if(!t.isConnected&&Date.now()-B>1e3)return m();const J=Math.max(0,w-(Date.now()-B)/1e3);z.textContent=p("web_game_time_fmt",Math.ceil(J)),_.firstChild.style.width=`${J/w*100}%`,S.classList.toggle("hurry",J<=5),J<=0&&A("time")},A=(J,U)=>{m(),T.forEach((He,ye)=>{He.disabled=!0,ye+1===y.wrongLine&&He.classList.add("right")}),U&&J==="wrong"&&U.classList.add("wrong");const ie=J==="right";ie&&l++,c(),S.classList.add(ie?"defused":"boom"),S.firstChild.textContent=ie?"✂️":"💥",k.className=`learn-game-feedback ${ie?"right":"wrong"}`;const je=d();k.replaceChildren(V("p",{},p(ie?"web_game_defused":J==="time"?"web_game_boom_time":"web_game_boom_wrong")),Nn("div",{class:"learn-game-explain"},y.explanation),V("p",{class:"learn-bomb-fix"},`${p("web_game_fix")} `,V("code",{},y.fix.trim())),je),je.focus({preventScroll:!0})};s.replaceChildren(S,Nn("p",{class:"learn-game-question"},y.question),j,k),P();const W=window.setInterval(P,200);u.push(W)},g=()=>{const y=i.rounds[o],w=[];y.code.trim()&&w.push(Uu(y.code).element),w.push(Nn("p",{class:"learn-game-question"},y.question),V("p",{class:"learn-order-hint"},p("web_game_order_hint")));const _=V("div",{class:"learn-game-options learn-order"}),z=V("div",{class:"learn-game-feedback",role:"status"});let S=0;const k=gD(y.options.length).map(j=>{const B=V("span",{class:"learn-order-badge","aria-hidden":"true"}),P=V("span",{});P.innerHTML=Fe(y.options[j].text);const A=V("button",{},B,P);return A.addEventListener("click",()=>{if(j!==S)return A.classList.add("wrong"),T(!1);A.classList.add("right"),B.textContent=String(++S),A.disabled=!0,S===y.options.length&&T(!0)}),_.append(A),{k:j,b:A,badge:B}}),T=j=>{for(const{k:P,b:A,badge:W}of[...k].sort((J,U)=>J.k-U.k))A.disabled=!0,W.textContent=String(P+1),_.append(A);j&&l++,c(),z.className=`learn-game-feedback ${j?"right":"wrong"}`;const B=d();z.replaceChildren(V("p",{},p(j?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation),B),B.focus({preventScroll:!0})};s.replaceChildren(...w,_,z)},f=()=>{if(m(),i.kind==="bombe"||i.kind==="reihenfolge"){c(),i.kind==="bombe"?h():g();return}const y=i.rounds[o];c();const w=Uu(y.code),_=[];let z;i.kind==="zuhoerer"?(z=pD(Bh(y.code),w),_.push(V("div",{class:"learn-swing-row"},w.element,z.element)),y.clicks.length&&_.push(V("p",{class:"learn-swing-clicks"},`${p("web_game_clicks")} `,...y.clicks.flatMap((B,P)=>[...P?[" → "]:[],V("code",{},B)])))):y.code.trim()&&_.push(w.element),_.push(Nn("p",{class:"learn-game-question"},y.question));const S=V("div",{class:`learn-game-options ${i.kind==="layout"?"pictures":""}`}),k=V("div",{class:"learn-game-feedback",role:"status"}),T=y.options.map(B=>{const P=V("button",{});return i.kind==="layout"?P.append(xD(B.text)):B.text.includes(` -`)?P.append(fD(B.text)):P.innerHTML=Fe(B.text),P.addEventListener("click",()=>j(B.right,P)),S.append(P),P}),j=(B,P)=>{T.forEach((W,J)=>{W.disabled=!0,y.options[J].right&&W.classList.add("right")}),B||P.classList.add("wrong"),B&&l++,c(),k.className=`learn-game-feedback ${B?"right":"wrong"}`;const A=d();k.replaceChildren(V("p",{},p(B?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation)),k.append(A),z&&(u=z.replay(y.clicks,()=>A.before(V("p",{class:"learn-swing-try"},p("web_game_try"))))),A.focus({preventScroll:!0})};s.replaceChildren(..._,S,k)},x=()=>{m(),a.textContent="";const y=V("button",{class:"primary"},p("web_game_again"));y.addEventListener("click",()=>{o=l=0,f()}),s.replaceChildren(V("p",{class:"learn-game-result"},p("web_game_done_fmt",l,r)),V("p",{},p(l===r?"web_game_perfect":l>=r*.7?"web_game_good":"web_game_practice_short")),y)},b=V("button",{class:"primary"},p("web_game_start"));return b.addEventListener("click",f),s.append(Nn("p",{},i.intro),b),t}function gD(i){const e=[...Array(i).keys()];for(;e.every((t,n)=>t===n);)for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function Uu(i){const e=i.split(` -`).map(n=>V("div",{class:"ln"},n||" "));return{element:V("pre",{class:"learn-game-code mono",dir:"ltr"},...e),highlight(n,a){e.forEach((s,r)=>s.classList.toggle("hit",n!==void 0&&r>=n&&r<=(a??n)))}}}function pD(i,e){const t=Dh(i),n=V("div",{class:"learn-swing-window",dir:"ltr"});n.append(V("div",{class:"learn-swing-title"},i.title||" "));const a=V("div",{class:"learn-swing-body"}),s=new Map;for(const c of i.labels){const d=V("div",{class:"learn-swing-label"},t.texts[c.name]);s.set(c.name,d),a.append(d)}const r=i.buttons.map(c=>{const d=V("button",{class:"learn-swing-button",disabled:""},t.texts[c.name]);return s.set(c.name,d),a.append(d),d}),o=V("p",{class:"learn-swing-event",role:"status"}),l=V("pre",{class:"learn-swing-console mono",hidden:""});n.append(a,o,l);const u=c=>{var h,g;const d=s.get(c.button);d.classList.add("pressed"),window.setTimeout(()=>d.classList.remove("pressed"),350),e.highlight((h=c.listener)==null?void 0:h.from,(g=c.listener)==null?void 0:g.to),o.textContent=c.listener?p("web_game_event_fmt",d.textContent??""):p("web_game_nobody"),o.className=`learn-swing-event ${c.listener?"heard":"nobody"}`;for(const[f,x]of Object.entries(c.texts)){const b=s.get(f);b&&b.textContent!==x&&(b.textContent=x,b.classList.remove("changed"),b.offsetWidth,b.classList.add("changed"))}c.console.length&&(l.hidden=!1,l.textContent+=c.console.map(f=>`${f} -`).join(""))},m=c=>u(Zh(i,t,c));return{element:n,replay(c,d){const h=c.map((g,f)=>window.setTimeout(()=>m(g),(f+.3)*qu));return h.push(window.setTimeout(()=>{i.buttons.forEach((g,f)=>{r[f].disabled=!1,r[f].addEventListener("click",()=>u(Mh(i,t,g.name)))}),d()},(c.length+.3)*qu)),h}}}function fD(i){return V("pre",{class:"learn-game-file mono",dir:"ltr"},i)}function xD(i){const e=Ch(i),t=V("div",{class:"learn-layout-window",dir:"ltr"},V("div",{class:"learn-layout-title"})),n=V("div",{class:`learn-layout-body ${e.kind}`}),a=(s,r)=>V("span",{class:"learn-layout-cell",...r?{style:`grid-area:${r}`}:{}},s);if(e.kind==="border")for(const[s,r]of Object.entries(e.areas))n.append(a(r,s));else if(e.kind==="grid"){const s=Math.max(...e.rows.map(r=>r.length));n.style.gridTemplateColumns=`repeat(${s}, 1fr)`;for(const r of e.rows)for(let o=0;oa(r))));return t.append(n),t}function R(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function vn(i,e,t){const n=R(i,e);return n.innerHTML=Fe(t),n}function $u(i){return R("pre",{class:"learn-game-code mono",dir:"ltr"},...i.split(` -`).map(e=>R("div",{class:"ln"},e||" ")))}function bD(i,e){const t=R("section",{class:"learn-game learn-rescue"}),n=R("div",{class:"learn-game-head"});n.append(R("img",{src:e,alt:"",width:"40",height:"40"}),R("strong",{},i.title));const a=i.stations.length,s=i.stations.map(()=>R("span",{class:"learn-rescue-dot"})),r=R("img",{class:"learn-rescue-ludwig",src:e,alt:"",width:"32",height:"32"}),o=R("span",{class:"learn-rescue-tower","aria-hidden":"true"},"🏰",R("span",{class:"learn-rescue-zora"},"🐐"),R("span",{class:"learn-rescue-fox"},"🦊")),l=R("span",{class:"learn-rescue-free"},"🐐"),u=R("div",{class:"learn-rescue-path","aria-hidden":"true"},r,...s,o),m=R("p",{class:"learn-game-status"}),c=R("div",{class:"learn-game-stage"}),d=yD(i);t.append(n,u,m,c);let h=0;const g=()=>{s.forEach((z,S)=>z.classList.toggle("done",S{const z=[...i.alphabet].map((S,k)=>R("span",{class:"learn-rescue-letter"},R("b",{},S),R("small",{},String(k))));return{element:R("div",{class:"learn-rescue-alphabet mono",dir:"ltr"},...z),cells:z}},x=z=>{const S=i.stations[z];m.textContent=p("web_learn_rescue_station_fmt",z+1,a,S.name);const k=f(),T=R("input",{type:"text",inputmode:"numeric",autocomplete:"off",class:"learn-rescue-number mono","aria-label":p("web_learn_rescue_number")}),j=R("button",{class:"primary"},p("web_learn_check")),B=R("div",{class:"learn-game-feedback",role:"status"}),P=()=>{const A=T.value.trim();if(!/^-?\d+$/.test(A)){B.className="learn-game-feedback wrong",B.replaceChildren(R("p",{},p("web_learn_rescue_not_number")));return}if(Number(A)!==S.answer){B.className="learn-game-feedback wrong",B.replaceChildren(R("p",{},p("web_learn_rescue_wrong")),...S.hint?[vn("div",{class:"learn-game-explain"},`**${p("web_learn_hint")}:** ${S.hint}`)]:[]),T.select();return}T.disabled=j.disabled=!0;const W=i.alphabet.charAt(S.answer);k.cells[S.answer].classList.add("hit"),d.give(S.row,S.col,W),h++,g();const J=z+1===a,U=R("button",{class:"primary"},p(J?"web_learn_rescue_to_crossword":"web_game_next"));U.addEventListener("click",()=>J?b():x(z+1)),B.className="learn-game-feedback right",B.replaceChildren(R("p",{},p("web_game_right")),R("p",{class:"learn-rescue-charat mono",dir:"ltr"},`alphabet.charAt(${S.answer})`,R("span",{"aria-hidden":"true"}," → "),R("code",{},`'${W}'`)),vn("div",{class:"learn-game-explain"},S.explanation),R("p",{class:"learn-rescue-moved"},p("web_learn_rescue_letter_moved")),U),U.focus({preventScroll:!0})};j.addEventListener("click",P),T.addEventListener("keydown",A=>{A.key==="Enter"&&P()}),c.replaceChildren($u(S.code),vn("p",{class:"learn-game-question"},S.question),R("div",{class:"learn-rescue-answer"},T,j),B,R("p",{class:"learn-rescue-label"},p("web_learn_rescue_alphabet")),$u(`String alphabet = "${i.alphabet}";`),k.element,d.element),T.focus({preventScroll:!0})},b=()=>{m.textContent=p("web_learn_rescue_crossword");const z=R("div",{class:"learn-game-feedback",role:"status"}),S=R("button",{class:"primary"},p("web_learn_check"));S.addEventListener("click",()=>{if(!d.check()){z.className="learn-game-feedback wrong",z.replaceChildren(R("p",{},p("web_learn_rescue_cw_wrong")));return}S.disabled=!0,d.lock();const k=R("button",{class:"primary"},p("web_learn_rescue_to_gate"));k.addEventListener("click",y),z.className="learn-game-feedback right",z.replaceChildren(R("p",{},p("web_learn_rescue_cw_done")),k),k.focus({preventScroll:!0})}),d.unlock(),c.replaceChildren(vn("p",{},i.crosswordText),d.element,S,z),d.focusFirst()},y=()=>{m.textContent=p("web_learn_rescue_gate");const z=R("input",{type:"text",autocomplete:"off",autocapitalize:"off",spellcheck:"false",class:"learn-rescue-word mono",size:String(i.keyword.length+2),"aria-label":p("web_learn_rescue_word")}),S=i.gateCode.split(` -`).map(B=>{const P=B.indexOf(cs);return P<0?R("div",{class:"ln"},B||" "):R("div",{class:"ln"},B.slice(0,P),z,B.slice(P+cs.length))}),k=R("button",{class:"primary"},p("web_learn_rescue_open")),T=R("div",{class:"learn-game-feedback",role:"status"}),j=()=>{const B=z.value.trim();if(B!==i.keyword){const A=B.toUpperCase()===i.keyword.toUpperCase();T.className="learn-game-feedback wrong",T.replaceChildren(R("p",{},p(A?"web_learn_rescue_gate_case":"web_learn_rescue_gate_wrong"))),z.select();return}z.disabled=k.disabled=!0,t.classList.add("freed"),r.after(l),m.textContent="";const P=R("button",{},p("web_game_again"));P.addEventListener("click",w),T.className="learn-game-feedback right",T.replaceChildren(R("p",{},p("web_learn_rescue_freed")),vn("div",{class:"learn-game-explain"},i.end),P)};k.addEventListener("click",j),z.addEventListener("keydown",B=>{B.key==="Enter"&&j()}),c.replaceChildren(vn("p",{},i.gateText),R("div",{class:"learn-game-code mono learn-rescue-gate",dir:"ltr"},...S),k,T),z.focus({preventScroll:!0})},w=()=>{h=0,t.classList.remove("freed"),l.remove(),d.reset(),g(),x(0)},_=R("button",{class:"primary"},p("web_game_start"));return _.addEventListener("click",w),c.append(vn("p",{},i.intro),_),t}function yD(i){const e=PB(i),t=new Map(i.solution.map((g,f)=>[`${g.row} ${g.col}`,f])),n=new Map;for(const g of i.words)n.set(`${g.row} ${g.col}`,g.number);const a=new Map,s=R("div",{class:"learn-cw-grid",dir:"ltr"});s.style.gridTemplateColumns=`repeat(${i.cols}, var(--cw-cell))`;let r=!0;const o=(g,f)=>i.words.filter(x=>x.across?x.row===g&&f>=x.col&&f=x.row&&g{var y;const b=r?`${g} ${f+x}`:`${g+x} ${f}`;(y=a.get(b))==null||y.focus()};e.forEach((g,f)=>g.forEach((x,b)=>{if(!x)return s.append(R("span",{class:"learn-cw-empty"}));const y=`${f} ${b}`,w=R("input",{type:"text",maxlength:"1",autocomplete:"off",autocapitalize:"characters",spellcheck:"false","aria-label":p("web_learn_rescue_cell_fmt",f+1,b+1)});w.disabled=!0,w.addEventListener("focus",()=>{const k=o(f,b);k.some(T=>T.across===r)||(r=k[0].across),w.select()}),w.addEventListener("input",()=>{w.value=w.value.slice(-1).toUpperCase(),w.classList.remove("wrong"),c(),w.value&&l(f,b,1)}),w.addEventListener("keydown",k=>{if(k.key==="Backspace"&&!w.value)l(f,b,-1);else if(k.key==="ArrowRight"||k.key==="ArrowLeft")r=!0,l(f,b,k.key==="ArrowRight"?1:-1);else if(k.key==="ArrowDown"||k.key==="ArrowUp")r=!1,l(f,b,k.key==="ArrowDown"?1:-1);else return;k.preventDefault()}),a.set(y,w);const _=t.get(y),z=R("span",{class:`learn-cw-cell${_!==void 0?" key":""}`}),S=n.get(y);S&&z.append(R("small",{class:"learn-cw-number"},String(S))),_!==void 0&&z.append(R("small",{class:"learn-cw-keyindex"},String(_+1))),z.append(w),s.append(z)}));const u=g=>{const f=R("ol",{class:"learn-cw-clues"});for(const x of i.words.filter(b=>b.across===g).sort((b,y)=>b.number-y.number)){const b=vn("li",{value:String(x.number)},`${x.clue} (${x.word.length})`);b.addEventListener("click",()=>{var y;r=x.across,(y=a.get(`${x.row} ${x.col}`))==null||y.focus()}),f.append(b)}return R("div",{},R("strong",{},p(g?"web_learn_rescue_across":"web_learn_rescue_down")),f)},m=i.solution.map(()=>R("span",{class:"learn-cw-keybox"})),c=()=>i.solution.forEach((g,f)=>m[f].textContent=a.get(`${g.row} ${g.col}`).value||" "),d=R("div",{class:"learn-cw"},R("div",{class:"learn-cw-board"},s,R("p",{class:"learn-cw-keyword"},`${p("web_learn_rescue_keyword")} `,R("span",{class:"mono",dir:"ltr"},...m))),R("div",{class:"learn-cw-cluebox"},u(!0),u(!1))),h=new Set;return{element:d,give(g,f,x){const b=a.get(`${g} ${f}`);b.value=x,b.parentElement.classList.add("given","arrived"),h.add(`${g} ${f}`),c()},unlock(){for(const[g,f]of a)f.disabled=h.has(g)},lock(){for(const g of a.values())g.disabled=!0},focusFirst(){var g;(g=[...a].find(([f])=>!h.has(f)))==null||g[1].focus({preventScroll:!0})},check(){let g=!0;for(const[f,x]of a){const[b,y]=f.split(" ").map(Number),w=x.value!==e[b][y];x.classList.toggle("wrong",w),w&&(g=!1)}return g},reset(){h.clear();for(const g of a.values())g.value="",g.disabled=!0,g.classList.remove("wrong"),g.parentElement.classList.remove("given","arrived");c()}}}function zt(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function Yu(i,e,t){const n=zt(i,e);return n.innerHTML=Fe(t),n}function vD(i){const e=zt("section",{class:"learn-cloze"});e.append(zt("strong",{class:"learn-cloze-title"},i.title)),i.task&&e.append(Yu("p",{},i.task)),e.append(zt("p",{class:"learn-cloze-hint"},p("web_learn_cloze_hint")));const t=[];for(const m of i.blocks){const c=zt("pre",{class:"learn-cloze-code mono",dir:"ltr"});for(const d of m){const h=zt("div",{class:"ln"});for(const g of d){if(typeof g=="string"){h.append(g);continue}const f=zt("input",{type:"text",class:"learn-cloze-gap mono",autocomplete:"off",autocapitalize:"off",autocorrect:"off",spellcheck:"false",enterkeyhint:"done","aria-label":`${t.length+1}`});f.style.width=`${Math.max(3,...g.answers.map(x=>x.length))+1}ch`,t.push({input:f,answers:g.answers}),h.append(f)}d.length||h.append(` -`),c.append(h)}e.append(c)}const n=zt("p",{class:"learn-cloze-status",role:"status"}),a=i.explanation?Yu("p",{class:"learn-explanation"},i.explanation):void 0;a&&(a.hidden=!0);const s=zt("button",{class:"learn-cloze-check"},p("web_learn_check")),r=zt("button",{},p("web_learn_cloze_solution")),o=zt("button",{},p("web_learn_cloze_again"));r.hidden=!0,o.hidden=!0;const l=zt("div",{class:"learn-cloze-actions"},s,r,o);e.append(l,n),a&&e.append(a);const u=()=>{var d;let m=0;for(const h of t){const g=MB(h.answers,h.input.value);h.input.classList.toggle("right",g),h.input.classList.toggle("wrong",!g),g&&m++}const c=m===t.length;n.textContent=c?p("web_learn_cloze_all_right"):p("web_learn_cloze_score_fmt",m,t.length),n.className=`learn-cloze-status ${c?"right":"wrong"}`,a&&(a.hidden=!c),c?(t.forEach(h=>h.input.disabled=!0),s.hidden=!0,o.hidden=!1):(r.hidden=!1,(d=t.find(h=>h.input.classList.contains("wrong")))==null||d.input.focus())};return s.addEventListener("click",u),r.addEventListener("click",()=>{for(const m of t)m.input.value=m.answers[0],m.input.classList.remove("right","wrong"),m.input.classList.add("shown"),m.input.disabled=!0;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!1),s.hidden=!0,r.hidden=!0,o.hidden=!1}),o.addEventListener("click",()=>{var m;for(const c of t)c.input.value="",c.input.classList.remove("right","wrong","shown"),c.input.disabled=!1;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!0),s.hidden=!1,r.hidden=!0,o.hidden=!0,(m=t[0])==null||m.input.focus()}),t.forEach((m,c)=>{m.input.addEventListener("input",()=>m.input.classList.remove("right","wrong")),m.input.addEventListener("keydown",d=>{d.key==="Enter"&&(d.preventDefault(),c[...o.querySelectorAll("strong")])){const o=ju(e),l=o==null?void 0:o.exec(r.textContent??""),u=l?Cu(e,l[0]):void 0;u&&n.add(u)}let a=e.filter(r=>!n.has(r));for(const r of t){const o=document.createTreeWalker(r,NodeFilter.SHOW_TEXT),l=[];for(;o.nextNode();){const u=o.currentNode;(s=u.parentElement)!=null&&s.closest(wD)||l.push(u)}for(let u of l)for(;;){const m=ju(a),c=m==null?void 0:m.exec(u.data),d=c?Cu(a,c[0]):void 0;if(!c||!d)break;const h=u.splitText(c.index);u=h.splitText(c[0].length);const g=document.createElement("span");g.className="term",g.tabIndex=0,g.setAttribute("role","button"),g.setAttribute("aria-describedby","term-tip"),g.dataset.term=d.term,g.dataset.text=d.text,h.replaceWith(g),g.append(h),a=a.filter(f=>f!==d)}}}function zD(i){const e=document.createElement("div");e.id="term-tip",e.className="term-tip",e.setAttribute("role","tooltip"),e.hidden=!0,document.body.append(e);let t,n=!1;const a=o=>{t=o,e.replaceChildren();const l=document.createElement("strong");l.textContent=o.dataset.term??"",e.append(l,document.createTextNode(" "+(o.dataset.text??""))),e.hidden=!1;const u=o.getBoundingClientRect(),m=e.offsetWidth,c=e.offsetHeight,d=Math.max(8,Math.min(u.left,window.innerWidth-m-8)),h=u.bottom+6;e.style.left=`${d}px`,e.style.top=`${h+c>window.innerHeight-8?Math.max(8,u.top-c-6):h}px`,o.setAttribute("aria-expanded","true")},s=()=>{t==null||t.setAttribute("aria-expanded","false"),t=void 0,n=!1,e.hidden=!0},r=o=>{var l,u;return((u=(l=o.target)==null?void 0:l.closest)==null?void 0:u.call(l,".term"))??void 0};return i.addEventListener("pointerover",o=>{const l=r(o);l&&o.pointerType==="mouse"&&!n&&a(l)}),i.addEventListener("pointerout",o=>{r(o)&&o.pointerType==="mouse"&&!n&&s()}),i.addEventListener("click",o=>{const l=r(o);if(l){if(n&&t===l)return s();a(l),n=!0}}),i.addEventListener("focusin",o=>{const l=r(o);l&&!n&&a(l)}),i.addEventListener("focusout",o=>{r(o)&&!n&&s()}),i.addEventListener("keydown",o=>{const l=r(o);o.key==="Escape"&&t?s():l&&(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),l.click())}),i.addEventListener("scroll",s,!0),document.addEventListener("pointerdown",o=>{t&&!r(o)&&!e.contains(o.target)&&s()}),{hide:s}}const $h={leiste:".topbar > .toolbar",werkzeuge:".diagram-tools",dateien:".files-rail, .files",codelive:".live-rail, .livecode",ausfuehren:"[data-run=play]",konsole:".livecode .console",einzelschritt:"[data-run=step]",elemente:".palette",struktogramm:".canvas",objektinspektor:".inspector",reiter:".tabs",titel:".caption",neu:"[data-action=new]",oeffnen:"[data-action=open]",speichern:"[data-action=save]",exportieren:"[data-action=export]",rueckgaengig:"[data-action=undo]",textgroesse:"[data-action=settings]",einstellungen:"[data-action=settings]",lernen:".learn .learn-hide",code:"[data-action=code]",simulation:"[data-action=simulate]"},ID=new Set(["werkzeuge","elemente","struktogramm","objektinspektor","reiter","titel","rueckgaengig","exportieren","code","simulation"]),kD=new Set(["ausfuehren","konsole","einzelschritt"]);function n0(i,e){return[...i.querySelectorAll(".ui-pointer")].some(t=>e.has(t.dataset.target??""))}function SD(i){return n0(i,new Set(["dateien"]))}function _D(i){return n0(i,ID)}function TD(i){return n0(i,kD)}function Ku(i){for(const e of i.querySelectorAll('a[href^="#zeige-"]')){const t=e.getAttribute("href").slice(7);if(!(t in $h))continue;const n=document.createElement("span");n.className="ui-pointer",n.tabIndex=0,n.setAttribute("role","button"),n.dataset.target=t,n.append(...e.childNodes),e.replaceWith(n)}}function OD(i){let e,t;const n=()=>{e==null||e.classList.remove("ui-spot"),e=void 0,window.clearTimeout(t)},a=(r,o)=>{n();const l=[...document.querySelectorAll($h[r.dataset.target??""]??":not(*)")].find(u=>u.getClientRects().length>0);l&&(e=l,l.classList.add("ui-spot"),o&&(t=window.setTimeout(n,2500)))},s=r=>{var o,l;return((l=(o=r.target)==null?void 0:o.closest)==null?void 0:l.call(o,".ui-pointer"))??void 0};return i.addEventListener("pointerover",r=>{const o=s(r);o&&r.pointerType==="mouse"&&a(o,!1)}),i.addEventListener("pointerout",r=>{s(r)&&r.pointerType==="mouse"&&n()}),i.addEventListener("click",r=>{const o=s(r);o&&a(o,!0)}),i.addEventListener("focusin",r=>{const o=s(r);o&&a(o,!1)}),i.addEventListener("focusout",r=>{s(r)&&n()}),i.addEventListener("keydown",r=>{const o=s(r);o&&(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),a(o,!0))}),{off:n}}const kt='',AD=()=>{const i=[];for(const e of Ot){const t=i.at(-1);t&&t.name===e.section?t.lessons.push(e):i.push({name:e.section,lessons:[e]})}return i};function O(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function gt(i,e,t){const n=O(i,e);return n.innerHTML=t,n}const PD=i=>p(`element_${I[i]}`);function jD(i){return{caption:i,elements:[we(I.anweisung,{textLines:["ø"]})]}}function em(i){const e=i.start?X1(i.start):void 0;return e?{...e,caption:e.caption||i.title}:jD(i.title)}class CD{constructor(e){v(this,"element");v(this,"tab","lessons");v(this,"returnTo");v(this,"lessonId");v(this,"taskId");v(this,"body");v(this,"tips");v(this,"pointers");this.host=e,this.element=O("aside",{class:"learn","aria-label":p("web_learn_title")}),this.tips=zD(this.element),this.pointers=OD(this.element),hs(Mu(i1())),this.restore()}restore(){const e=he.view();e&&(this.tab=["lessons","tasks","reference"].find(t=>t===e.tab)??"lessons",this.lessonId=Ot.some(t=>t.id===e.lesson)?e.lesson:void 0,this.taskId=Tn.some(t=>t.id===e.task)?e.task:void 0),this.render()}render(){this.tips.hide(),this.pointers.off(),hs(Mu(i1()));const e=O("div",{class:"segmented learn-tabs",role:"tablist"});for(const[a,s]of[["lessons",p("web_learn_lessons")],["tasks",p("web_learn_tasks")],["reference",p("web_learn_reference")]]){const r=O("button",{role:"tab","aria-pressed":String(this.tab===a),"data-learn-tab":a},s);r.addEventListener("click",()=>{this.tab===a&&(a==="lessons"&&(this.lessonId=void 0),a==="tasks"&&(this.taskId=void 0)),this.tab=a,this.persist(),this.render()}),e.append(r)}const t=gt("button",{class:"learn-hide",title:p("web_learn_hide"),"aria-label":p("web_learn_hide")},kt);t.addEventListener("click",()=>this.host.collapse());const n=O("div",{class:"learn-head"},e,t);if(this.body=O("div",{class:"learn-body"}),this.element.replaceChildren(n,this.body),this.tab==="lessons"){const a=Ot.find(s=>s.id===this.lessonId);a?this.renderLesson(a):this.renderLessonList()}else if(this.tab==="tasks"){const a=Tn.find(s=>s.id===this.taskId);a?this.renderTask(a):this.renderTaskList()}else{const a=La.map(r=>`- **${r.term}:** ${r.text}`).join(` + +

${Ae(p("simulation_input"))}

+

${Ae(p("simulation_trace"))}

+

${Ae(p("simulation_variables"))}

+

${Ae(p("simulation_output"))}

+ `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Ae(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(qh(u)):m.textContent=we(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Ae(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...Qh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Ae(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function qh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,oD="http://www.w3.org/2000/svg";function Me(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(oD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function lD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function uD(i,e){let t=i,n=!1,a=-t*Jn;const s=Me("section",{class:"learn-game learn-caesar"});s.append(Me("div",{class:"learn-game-head"},Me("strong",{},p("web_learn_caesar_title")))),s.append(Me("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:mD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let O=0;O{o.cells.forEach((L,E)=>L.classList.toggle("marked",E===O)),u.cells.forEach((L,E)=>L.classList.toggle("marked",O!==void 0&&E===(O+t)%26))},_=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),S.textContent=lD(y.value,n?-t:t)||" ";const O=Array.from(y.value.toUpperCase()).reverse().find(E=>f1.includes(E));if(O===void 0)return k();const L=f1.indexOf(O);k(n?(L-t+26)%26:L)},T=O=>{t=(O%26+26)%26,a=-t*Jn,_()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var O;n&&(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!1,_()}),x.addEventListener("click",()=>{var O;n||(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!0,_()}),y.addEventListener("input",_),o.cells.forEach((O,L)=>O.addEventListener("click",()=>k(L)));let j;const C=O=>{const L=r.getBoundingClientRect();return Math.atan2(O.clientY-(L.top+L.height/2),O.clientX-(L.left+L.width/2))*180/Math.PI};l.addEventListener("pointerdown",O=>{const L=O;j=C(L)-a,l.classList.add("dragging"),r.setPointerCapture(L.pointerId),L.preventDefault()}),r.addEventListener("pointermove",O=>{if(j===void 0)return;a=C(O)-j,l.setAttribute("transform",`rotate(${a})`);const L=Math.round(-a/Jn);if((L%26+26)%26!==t){t=(L%26+26)%26;const E=a;_(),a=E,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),_(),s}function mD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),Uh=new WeakMap;function $h(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=q(async()=>{const{Robot3D:c}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return Uh.set(a,m),m}function cD(i,e,t=!1){return $h(i,e,t).box}function dD(i){const e=i.querySelector(".visubot-model"),t=e&&Uh.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function hD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=$h([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(y=>{window.clearTimeout(y),window.clearInterval(y)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const y=V("button",{class:"primary"},o+1{o++,o{const y=i.rounds[o],w=i.seconds,S=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),k=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,S),_=V("div",{class:"learn-game-feedback",role:"status"}),T=y.code.split(` +`).map((E,Q)=>{const $=V("button",{class:"ln",type:"button"},E||" ");return $.disabled=!E.trim(),$.addEventListener("click",()=>O(Q+1===y.wrongLine?"right":"wrong",$)),$}),j=V("div",{class:"learn-game-code learn-bomb-code mono",dir:"ltr"},...T),C=Date.now(),P=()=>{if(!t.isConnected&&Date.now()-C>1e3)return m();const E=Math.max(0,w-(Date.now()-C)/1e3);z.textContent=p("web_game_time_fmt",Math.ceil(E)),S.firstChild.style.width=`${E/w*100}%`,k.classList.toggle("hurry",E<=5),E<=0&&O("time")},O=(E,Q)=>{m(),T.forEach((Te,xe)=>{Te.disabled=!0,xe+1===y.wrongLine&&Te.classList.add("right")}),Q&&E==="wrong"&&Q.classList.add("wrong");const $=E==="right";$&&l++,c(),k.classList.add($?"defused":"boom"),k.firstChild.textContent=$?"✂️":"💥",_.className=`learn-game-feedback ${$?"right":"wrong"}`;const he=d();_.replaceChildren(V("p",{},p($?"web_game_defused":E==="time"?"web_game_boom_time":"web_game_boom_wrong")),Nn("div",{class:"learn-game-explain"},y.explanation),V("p",{class:"learn-bomb-fix"},`${p("web_game_fix")} `,V("code",{},y.fix.trim())),he),he.focus({preventScroll:!0})};s.replaceChildren(k,Nn("p",{class:"learn-game-question"},y.question),j,_),P();const L=window.setInterval(P,200);u.push(L)},g=()=>{const y=i.rounds[o],w=[];y.code.trim()&&w.push(Uu(y.code).element),w.push(Nn("p",{class:"learn-game-question"},y.question),V("p",{class:"learn-order-hint"},p("web_game_order_hint")));const S=V("div",{class:"learn-game-options learn-order"}),z=V("div",{class:"learn-game-feedback",role:"status"});let k=0;const _=pD(y.options.length).map(j=>{const C=V("span",{class:"learn-order-badge","aria-hidden":"true"}),P=V("span",{});P.innerHTML=Re(y.options[j].text);const O=V("button",{},C,P);return O.addEventListener("click",()=>{if(j!==k)return O.classList.add("wrong"),T(!1);O.classList.add("right"),C.textContent=String(++k),O.disabled=!0,k===y.options.length&&T(!0)}),S.append(O),{k:j,b:O,badge:C}}),T=j=>{for(const{k:P,b:O,badge:L}of[..._].sort((E,Q)=>E.k-Q.k))O.disabled=!0,L.textContent=String(P+1),S.append(O);j&&l++,c(),z.className=`learn-game-feedback ${j?"right":"wrong"}`;const C=d();z.replaceChildren(V("p",{},p(j?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation),C),C.focus({preventScroll:!0})};s.replaceChildren(...w,S,z)},f=()=>{if(m(),i.kind==="bombe"||i.kind==="reihenfolge"){c(),i.kind==="bombe"?h():g();return}const y=i.rounds[o];c();const w=Uu(y.code),S=[];let z;i.kind==="zuhoerer"?(z=fD(Dh(y.code),w),S.push(V("div",{class:"learn-swing-row"},w.element,z.element)),y.clicks.length&&S.push(V("p",{class:"learn-swing-clicks"},`${p("web_game_clicks")} `,...y.clicks.flatMap((C,P)=>[...P?[" → "]:[],V("code",{},C)])))):y.code.trim()&&S.push(w.element),S.push(Nn("p",{class:"learn-game-question"},y.question));const k=V("div",{class:`learn-game-options ${i.kind==="layout"?"pictures":""}`}),_=V("div",{class:"learn-game-feedback",role:"status"}),T=y.options.map(C=>{const P=V("button",{});return i.kind==="layout"?P.append(bD(C.text)):C.text.includes(` +`)?P.append(xD(C.text)):P.innerHTML=Re(C.text),P.addEventListener("click",()=>j(C.right,P)),k.append(P),P}),j=(C,P)=>{T.forEach((L,E)=>{L.disabled=!0,y.options[E].right&&L.classList.add("right")}),C||P.classList.add("wrong"),C&&l++,c(),_.className=`learn-game-feedback ${C?"right":"wrong"}`;const O=d();_.replaceChildren(V("p",{},p(C?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation)),_.append(O),z&&(u=z.replay(y.clicks,()=>O.before(V("p",{class:"learn-swing-try"},p("web_game_try"))))),O.focus({preventScroll:!0})};s.replaceChildren(...S,k,_)},x=()=>{m(),a.textContent="";const y=V("button",{class:"primary"},p("web_game_again"));y.addEventListener("click",()=>{o=l=0,f()}),s.replaceChildren(V("p",{class:"learn-game-result"},p("web_game_done_fmt",l,r)),V("p",{},p(l===r?"web_game_perfect":l>=r*.7?"web_game_good":"web_game_practice_short")),y)},b=V("button",{class:"primary"},p("web_game_start"));return b.addEventListener("click",f),s.append(Nn("p",{},i.intro),b),t}function pD(i){const e=[...Array(i).keys()];for(;e.every((t,n)=>t===n);)for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function Uu(i){const e=i.split(` +`).map(n=>V("div",{class:"ln"},n||" "));return{element:V("pre",{class:"learn-game-code mono",dir:"ltr"},...e),highlight(n,a){e.forEach((s,r)=>s.classList.toggle("hit",n!==void 0&&r>=n&&r<=(a??n)))}}}function fD(i,e){const t=Zh(i),n=V("div",{class:"learn-swing-window",dir:"ltr"});n.append(V("div",{class:"learn-swing-title"},i.title||" "));const a=V("div",{class:"learn-swing-body"}),s=new Map;for(const c of i.labels){const d=V("div",{class:"learn-swing-label"},t.texts[c.name]);s.set(c.name,d),a.append(d)}const r=i.buttons.map(c=>{const d=V("button",{class:"learn-swing-button",disabled:""},t.texts[c.name]);return s.set(c.name,d),a.append(d),d}),o=V("p",{class:"learn-swing-event",role:"status"}),l=V("pre",{class:"learn-swing-console mono",hidden:""});n.append(a,o,l);const u=c=>{var h,g;const d=s.get(c.button);d.classList.add("pressed"),window.setTimeout(()=>d.classList.remove("pressed"),350),e.highlight((h=c.listener)==null?void 0:h.from,(g=c.listener)==null?void 0:g.to),o.textContent=c.listener?p("web_game_event_fmt",d.textContent??""):p("web_game_nobody"),o.className=`learn-swing-event ${c.listener?"heard":"nobody"}`;for(const[f,x]of Object.entries(c.texts)){const b=s.get(f);b&&b.textContent!==x&&(b.textContent=x,b.classList.remove("changed"),b.offsetWidth,b.classList.add("changed"))}c.console.length&&(l.hidden=!1,l.textContent+=c.console.map(f=>`${f} +`).join(""))},m=c=>u(Mh(i,t,c));return{element:n,replay(c,d){const h=c.map((g,f)=>window.setTimeout(()=>m(g),(f+.3)*qu));return h.push(window.setTimeout(()=>{i.buttons.forEach((g,f)=>{r[f].disabled=!1,r[f].addEventListener("click",()=>u(Lh(i,t,g.name)))}),d()},(c.length+.3)*qu)),h}}}function xD(i){return V("pre",{class:"learn-game-file mono",dir:"ltr"},i)}function bD(i){const e=Bh(i),t=V("div",{class:"learn-layout-window",dir:"ltr"},V("div",{class:"learn-layout-title"})),n=V("div",{class:`learn-layout-body ${e.kind}`}),a=(s,r)=>V("span",{class:"learn-layout-cell",...r?{style:`grid-area:${r}`}:{}},s);if(e.kind==="border")for(const[s,r]of Object.entries(e.areas))n.append(a(r,s));else if(e.kind==="grid"){const s=Math.max(...e.rows.map(r=>r.length));n.style.gridTemplateColumns=`repeat(${s}, 1fr)`;for(const r of e.rows)for(let o=0;oa(r))));return t.append(n),t}function R(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function vn(i,e,t){const n=R(i,e);return n.innerHTML=Re(t),n}function $u(i){return R("pre",{class:"learn-game-code mono",dir:"ltr"},...i.split(` +`).map(e=>R("div",{class:"ln"},e||" ")))}function yD(i,e){const t=R("section",{class:"learn-game learn-rescue"}),n=R("div",{class:"learn-game-head"});n.append(R("img",{src:e,alt:"",width:"40",height:"40"}),R("strong",{},i.title));const a=i.stations.length,s=i.stations.map(()=>R("span",{class:"learn-rescue-dot"})),r=R("img",{class:"learn-rescue-ludwig",src:e,alt:"",width:"32",height:"32"}),o=R("span",{class:"learn-rescue-tower","aria-hidden":"true"},"🏰",R("span",{class:"learn-rescue-zora"},"🐐"),R("span",{class:"learn-rescue-fox"},"🦊")),l=R("span",{class:"learn-rescue-free"},"🐐"),u=R("div",{class:"learn-rescue-path","aria-hidden":"true"},r,...s,o),m=R("p",{class:"learn-game-status"}),c=R("div",{class:"learn-game-stage"}),d=vD(i);t.append(n,u,m,c);let h=0;const g=()=>{s.forEach((z,k)=>z.classList.toggle("done",k{const z=[...i.alphabet].map((k,_)=>R("span",{class:"learn-rescue-letter"},R("b",{},k),R("small",{},String(_))));return{element:R("div",{class:"learn-rescue-alphabet mono",dir:"ltr"},...z),cells:z}},x=z=>{const k=i.stations[z];m.textContent=p("web_learn_rescue_station_fmt",z+1,a,k.name);const _=f(),T=R("input",{type:"text",inputmode:"numeric",autocomplete:"off",class:"learn-rescue-number mono","aria-label":p("web_learn_rescue_number")}),j=R("button",{class:"primary"},p("web_learn_check")),C=R("div",{class:"learn-game-feedback",role:"status"}),P=()=>{const O=T.value.trim();if(!/^-?\d+$/.test(O)){C.className="learn-game-feedback wrong",C.replaceChildren(R("p",{},p("web_learn_rescue_not_number")));return}if(Number(O)!==k.answer){C.className="learn-game-feedback wrong",C.replaceChildren(R("p",{},p("web_learn_rescue_wrong")),...k.hint?[vn("div",{class:"learn-game-explain"},`**${p("web_learn_hint")}:** ${k.hint}`)]:[]),T.select();return}T.disabled=j.disabled=!0;const L=i.alphabet.charAt(k.answer);_.cells[k.answer].classList.add("hit"),d.give(k.row,k.col,L),h++,g();const E=z+1===a,Q=R("button",{class:"primary"},p(E?"web_learn_rescue_to_crossword":"web_game_next"));Q.addEventListener("click",()=>E?b():x(z+1)),C.className="learn-game-feedback right",C.replaceChildren(R("p",{},p("web_game_right")),R("p",{class:"learn-rescue-charat mono",dir:"ltr"},`alphabet.charAt(${k.answer})`,R("span",{"aria-hidden":"true"}," → "),R("code",{},`'${L}'`)),vn("div",{class:"learn-game-explain"},k.explanation),R("p",{class:"learn-rescue-moved"},p("web_learn_rescue_letter_moved")),Q),Q.focus({preventScroll:!0})};j.addEventListener("click",P),T.addEventListener("keydown",O=>{O.key==="Enter"&&P()}),c.replaceChildren($u(k.code),vn("p",{class:"learn-game-question"},k.question),R("div",{class:"learn-rescue-answer"},T,j),C,R("p",{class:"learn-rescue-label"},p("web_learn_rescue_alphabet")),$u(`String alphabet = "${i.alphabet}";`),_.element,d.element),T.focus({preventScroll:!0})},b=()=>{m.textContent=p("web_learn_rescue_crossword");const z=R("div",{class:"learn-game-feedback",role:"status"}),k=R("button",{class:"primary"},p("web_learn_check"));k.addEventListener("click",()=>{if(!d.check()){z.className="learn-game-feedback wrong",z.replaceChildren(R("p",{},p("web_learn_rescue_cw_wrong")));return}k.disabled=!0,d.lock();const _=R("button",{class:"primary"},p("web_learn_rescue_to_gate"));_.addEventListener("click",y),z.className="learn-game-feedback right",z.replaceChildren(R("p",{},p("web_learn_rescue_cw_done")),_),_.focus({preventScroll:!0})}),d.unlock(),c.replaceChildren(vn("p",{},i.crosswordText),d.element,k,z),d.focusFirst()},y=()=>{m.textContent=p("web_learn_rescue_gate");const z=R("input",{type:"text",autocomplete:"off",autocapitalize:"off",spellcheck:"false",class:"learn-rescue-word mono",size:String(i.keyword.length+2),"aria-label":p("web_learn_rescue_word")}),k=i.gateCode.split(` +`).map(C=>{const P=C.indexOf(cs);return P<0?R("div",{class:"ln"},C||" "):R("div",{class:"ln"},C.slice(0,P),z,C.slice(P+cs.length))}),_=R("button",{class:"primary"},p("web_learn_rescue_open")),T=R("div",{class:"learn-game-feedback",role:"status"}),j=()=>{const C=z.value.trim();if(C!==i.keyword){const O=C.toUpperCase()===i.keyword.toUpperCase();T.className="learn-game-feedback wrong",T.replaceChildren(R("p",{},p(O?"web_learn_rescue_gate_case":"web_learn_rescue_gate_wrong"))),z.select();return}z.disabled=_.disabled=!0,t.classList.add("freed"),r.after(l),m.textContent="";const P=R("button",{},p("web_game_again"));P.addEventListener("click",w),T.className="learn-game-feedback right",T.replaceChildren(R("p",{},p("web_learn_rescue_freed")),vn("div",{class:"learn-game-explain"},i.end),P)};_.addEventListener("click",j),z.addEventListener("keydown",C=>{C.key==="Enter"&&j()}),c.replaceChildren(vn("p",{},i.gateText),R("div",{class:"learn-game-code mono learn-rescue-gate",dir:"ltr"},...k),_,T),z.focus({preventScroll:!0})},w=()=>{h=0,t.classList.remove("freed"),l.remove(),d.reset(),g(),x(0)},S=R("button",{class:"primary"},p("web_game_start"));return S.addEventListener("click",w),c.append(vn("p",{},i.intro),S),t}function vD(i){const e=jB(i),t=new Map(i.solution.map((g,f)=>[`${g.row} ${g.col}`,f])),n=new Map;for(const g of i.words)n.set(`${g.row} ${g.col}`,g.number);const a=new Map,s=R("div",{class:"learn-cw-grid",dir:"ltr"});s.style.gridTemplateColumns=`repeat(${i.cols}, var(--cw-cell))`;let r=!0;const o=(g,f)=>i.words.filter(x=>x.across?x.row===g&&f>=x.col&&f=x.row&&g{var y;const b=r?`${g} ${f+x}`:`${g+x} ${f}`;(y=a.get(b))==null||y.focus()};e.forEach((g,f)=>g.forEach((x,b)=>{if(!x)return s.append(R("span",{class:"learn-cw-empty"}));const y=`${f} ${b}`,w=R("input",{type:"text",maxlength:"1",autocomplete:"off",autocapitalize:"characters",spellcheck:"false","aria-label":p("web_learn_rescue_cell_fmt",f+1,b+1)});w.disabled=!0,w.addEventListener("focus",()=>{const _=o(f,b);_.some(T=>T.across===r)||(r=_[0].across),w.select()}),w.addEventListener("input",()=>{w.value=w.value.slice(-1).toUpperCase(),w.classList.remove("wrong"),c(),w.value&&l(f,b,1)}),w.addEventListener("keydown",_=>{if(_.key==="Backspace"&&!w.value)l(f,b,-1);else if(_.key==="ArrowRight"||_.key==="ArrowLeft")r=!0,l(f,b,_.key==="ArrowRight"?1:-1);else if(_.key==="ArrowDown"||_.key==="ArrowUp")r=!1,l(f,b,_.key==="ArrowDown"?1:-1);else return;_.preventDefault()}),a.set(y,w);const S=t.get(y),z=R("span",{class:`learn-cw-cell${S!==void 0?" key":""}`}),k=n.get(y);k&&z.append(R("small",{class:"learn-cw-number"},String(k))),S!==void 0&&z.append(R("small",{class:"learn-cw-keyindex"},String(S+1))),z.append(w),s.append(z)}));const u=g=>{const f=R("ol",{class:"learn-cw-clues"});for(const x of i.words.filter(b=>b.across===g).sort((b,y)=>b.number-y.number)){const b=vn("li",{value:String(x.number)},`${x.clue} (${x.word.length})`);b.addEventListener("click",()=>{var y;r=x.across,(y=a.get(`${x.row} ${x.col}`))==null||y.focus()}),f.append(b)}return R("div",{},R("strong",{},p(g?"web_learn_rescue_across":"web_learn_rescue_down")),f)},m=i.solution.map(()=>R("span",{class:"learn-cw-keybox"})),c=()=>i.solution.forEach((g,f)=>m[f].textContent=a.get(`${g.row} ${g.col}`).value||" "),d=R("div",{class:"learn-cw"},R("div",{class:"learn-cw-board"},s,R("p",{class:"learn-cw-keyword"},`${p("web_learn_rescue_keyword")} `,R("span",{class:"mono",dir:"ltr"},...m))),R("div",{class:"learn-cw-cluebox"},u(!0),u(!1))),h=new Set;return{element:d,give(g,f,x){const b=a.get(`${g} ${f}`);b.value=x,b.parentElement.classList.add("given","arrived"),h.add(`${g} ${f}`),c()},unlock(){for(const[g,f]of a)f.disabled=h.has(g)},lock(){for(const g of a.values())g.disabled=!0},focusFirst(){var g;(g=[...a].find(([f])=>!h.has(f)))==null||g[1].focus({preventScroll:!0})},check(){let g=!0;for(const[f,x]of a){const[b,y]=f.split(" ").map(Number),w=x.value!==e[b][y];x.classList.toggle("wrong",w),w&&(g=!1)}return g},reset(){h.clear();for(const g of a.values())g.value="",g.disabled=!0,g.classList.remove("wrong"),g.parentElement.classList.remove("given","arrived");c()}}}function zt(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function Yu(i,e,t){const n=zt(i,e);return n.innerHTML=Re(t),n}function wD(i){const e=zt("section",{class:"learn-cloze"});e.append(zt("strong",{class:"learn-cloze-title"},i.title)),i.task&&e.append(Yu("p",{},i.task)),e.append(zt("p",{class:"learn-cloze-hint"},p("web_learn_cloze_hint")));const t=[];for(const m of i.blocks){const c=zt("pre",{class:"learn-cloze-code mono",dir:"ltr"});for(const d of m){const h=zt("div",{class:"ln"});for(const g of d){if(typeof g=="string"){h.append(g);continue}const f=zt("input",{type:"text",class:"learn-cloze-gap mono",autocomplete:"off",autocapitalize:"off",autocorrect:"off",spellcheck:"false",enterkeyhint:"done","aria-label":`${t.length+1}`});f.style.width=`${Math.max(3,...g.answers.map(x=>x.length))+1}ch`,t.push({input:f,answers:g.answers}),h.append(f)}d.length||h.append(` +`),c.append(h)}e.append(c)}const n=zt("p",{class:"learn-cloze-status",role:"status"}),a=i.explanation?Yu("p",{class:"learn-explanation"},i.explanation):void 0;a&&(a.hidden=!0);const s=zt("button",{class:"learn-cloze-check"},p("web_learn_check")),r=zt("button",{},p("web_learn_cloze_solution")),o=zt("button",{},p("web_learn_cloze_again"));r.hidden=!0,o.hidden=!0;const l=zt("div",{class:"learn-cloze-actions"},s,r,o);e.append(l,n),a&&e.append(a);const u=()=>{var d;let m=0;for(const h of t){const g=LB(h.answers,h.input.value);h.input.classList.toggle("right",g),h.input.classList.toggle("wrong",!g),g&&m++}const c=m===t.length;n.textContent=c?p("web_learn_cloze_all_right"):p("web_learn_cloze_score_fmt",m,t.length),n.className=`learn-cloze-status ${c?"right":"wrong"}`,a&&(a.hidden=!c),c?(t.forEach(h=>h.input.disabled=!0),s.hidden=!0,o.hidden=!1):(r.hidden=!1,(d=t.find(h=>h.input.classList.contains("wrong")))==null||d.input.focus())};return s.addEventListener("click",u),r.addEventListener("click",()=>{for(const m of t)m.input.value=m.answers[0],m.input.classList.remove("right","wrong"),m.input.classList.add("shown"),m.input.disabled=!0;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!1),s.hidden=!0,r.hidden=!0,o.hidden=!1}),o.addEventListener("click",()=>{var m;for(const c of t)c.input.value="",c.input.classList.remove("right","wrong","shown"),c.input.disabled=!1;n.textContent="",n.className="learn-cloze-status",a&&(a.hidden=!0),s.hidden=!1,r.hidden=!0,o.hidden=!0,(m=t[0])==null||m.input.focus()}),t.forEach((m,c)=>{m.input.addEventListener("input",()=>m.input.classList.remove("right","wrong")),m.input.addEventListener("keydown",d=>{d.key==="Enter"&&(d.preventDefault(),c[...o.querySelectorAll("strong")])){const o=ju(e),l=o==null?void 0:o.exec(r.textContent??""),u=l?Cu(e,l[0]):void 0;u&&n.add(u)}let a=e.filter(r=>!n.has(r));for(const r of t){const o=document.createTreeWalker(r,NodeFilter.SHOW_TEXT),l=[];for(;o.nextNode();){const u=o.currentNode;(s=u.parentElement)!=null&&s.closest(zD)||l.push(u)}for(let u of l)for(;;){const m=ju(a),c=m==null?void 0:m.exec(u.data),d=c?Cu(a,c[0]):void 0;if(!c||!d)break;const h=u.splitText(c.index);u=h.splitText(c[0].length);const g=document.createElement("span");g.className="term",g.tabIndex=0,g.setAttribute("role","button"),g.setAttribute("aria-describedby","term-tip"),g.dataset.term=d.term,g.dataset.text=d.text,h.replaceWith(g),g.append(h),a=a.filter(f=>f!==d)}}}function ID(i){const e=document.createElement("div");e.id="term-tip",e.className="term-tip",e.setAttribute("role","tooltip"),e.hidden=!0,document.body.append(e);let t,n=!1;const a=o=>{t=o,e.replaceChildren();const l=document.createElement("strong");l.textContent=o.dataset.term??"",e.append(l,document.createTextNode(" "+(o.dataset.text??""))),e.hidden=!1;const u=o.getBoundingClientRect(),m=e.offsetWidth,c=e.offsetHeight,d=Math.max(8,Math.min(u.left,window.innerWidth-m-8)),h=u.bottom+6;e.style.left=`${d}px`,e.style.top=`${h+c>window.innerHeight-8?Math.max(8,u.top-c-6):h}px`,o.setAttribute("aria-expanded","true")},s=()=>{t==null||t.setAttribute("aria-expanded","false"),t=void 0,n=!1,e.hidden=!0},r=o=>{var l,u;return((u=(l=o.target)==null?void 0:l.closest)==null?void 0:u.call(l,".term"))??void 0};return i.addEventListener("pointerover",o=>{const l=r(o);l&&o.pointerType==="mouse"&&!n&&a(l)}),i.addEventListener("pointerout",o=>{r(o)&&o.pointerType==="mouse"&&!n&&s()}),i.addEventListener("click",o=>{const l=r(o);if(l){if(n&&t===l)return s();a(l),n=!0}}),i.addEventListener("focusin",o=>{const l=r(o);l&&!n&&a(l)}),i.addEventListener("focusout",o=>{r(o)&&!n&&s()}),i.addEventListener("keydown",o=>{const l=r(o);o.key==="Escape"&&t?s():l&&(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),l.click())}),i.addEventListener("scroll",s,!0),document.addEventListener("pointerdown",o=>{t&&!r(o)&&!e.contains(o.target)&&s()}),{hide:s}}const Yh={leiste:".topbar > .toolbar",werkzeuge:".diagram-tools",dateien:".files-rail, .files",codelive:".live-rail, .livecode",ausfuehren:"[data-run=play]",konsole:".livecode .console",einzelschritt:"[data-run=step]",elemente:".palette",struktogramm:".canvas",objektinspektor:".inspector",reiter:".tabs",titel:".caption",neu:"[data-action=new]",oeffnen:"[data-action=open]",speichern:"[data-action=save]",exportieren:"[data-action=export]",rueckgaengig:"[data-action=undo]",textgroesse:"[data-action=settings]",einstellungen:"[data-action=settings]",lernen:".learn .learn-hide",code:"[data-action=code]",simulation:"[data-action=simulate]"},kD=new Set(["werkzeuge","elemente","struktogramm","objektinspektor","reiter","titel","rueckgaengig","exportieren","code","simulation"]),SD=new Set(["ausfuehren","konsole","einzelschritt"]);function n0(i,e){return[...i.querySelectorAll(".ui-pointer")].some(t=>e.has(t.dataset.target??""))}function _D(i){return n0(i,new Set(["dateien"]))}function TD(i){return n0(i,kD)}function OD(i){return n0(i,SD)}function Ku(i){for(const e of i.querySelectorAll('a[href^="#zeige-"]')){const t=e.getAttribute("href").slice(7);if(!(t in Yh))continue;const n=document.createElement("span");n.className="ui-pointer",n.tabIndex=0,n.setAttribute("role","button"),n.dataset.target=t,n.append(...e.childNodes),e.replaceWith(n)}}function AD(i){let e,t;const n=()=>{e==null||e.classList.remove("ui-spot"),e=void 0,window.clearTimeout(t)},a=(r,o)=>{n();const l=[...document.querySelectorAll(Yh[r.dataset.target??""]??":not(*)")].find(u=>u.getClientRects().length>0);l&&(e=l,l.classList.add("ui-spot"),o&&(t=window.setTimeout(n,2500)))},s=r=>{var o,l;return((l=(o=r.target)==null?void 0:o.closest)==null?void 0:l.call(o,".ui-pointer"))??void 0};return i.addEventListener("pointerover",r=>{const o=s(r);o&&r.pointerType==="mouse"&&a(o,!1)}),i.addEventListener("pointerout",r=>{s(r)&&r.pointerType==="mouse"&&n()}),i.addEventListener("click",r=>{const o=s(r);o&&a(o,!0)}),i.addEventListener("focusin",r=>{const o=s(r);o&&a(o,!1)}),i.addEventListener("focusout",r=>{s(r)&&n()}),i.addEventListener("keydown",r=>{const o=s(r);o&&(r.key==="Enter"||r.key===" ")&&(r.preventDefault(),a(o,!0))}),{off:n}}const kt='',PD=()=>{const i=[];for(const e of Ot){const t=i.at(-1);t&&t.name===e.section?t.lessons.push(e):i.push({name:e.section,lessons:[e]})}return i};function A(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function gt(i,e,t){const n=A(i,e);return n.innerHTML=t,n}const jD=i=>p(`element_${I[i]}`);function CD(i){return{caption:i,elements:[ze(I.anweisung,{textLines:["ø"]})]}}function em(i){const e=i.start?X1(i.start):void 0;return e?{...e,caption:e.caption||i.title}:CD(i.title)}class BD{constructor(e){v(this,"element");v(this,"tab","lessons");v(this,"returnTo");v(this,"lessonId");v(this,"taskId");v(this,"body");v(this,"tips");v(this,"pointers");this.host=e,this.element=A("aside",{class:"learn","aria-label":p("web_learn_title")}),this.tips=ID(this.element),this.pointers=AD(this.element),hs(Mu(i1())),this.restore()}restore(){const e=ge.view();e&&(this.tab=["lessons","tasks","reference"].find(t=>t===e.tab)??"lessons",this.lessonId=Ot.some(t=>t.id===e.lesson)?e.lesson:void 0,this.taskId=Tn.some(t=>t.id===e.task)?e.task:void 0),this.render()}render(){this.tips.hide(),this.pointers.off(),hs(Mu(i1()));const e=A("div",{class:"segmented learn-tabs",role:"tablist"});for(const[a,s]of[["lessons",p("web_learn_lessons")],["tasks",p("web_learn_tasks")],["reference",p("web_learn_reference")]]){const r=A("button",{role:"tab","aria-pressed":String(this.tab===a),"data-learn-tab":a},s);r.addEventListener("click",()=>{this.tab===a&&(a==="lessons"&&(this.lessonId=void 0),a==="tasks"&&(this.taskId=void 0)),this.tab=a,this.persist(),this.render()}),e.append(r)}const t=gt("button",{class:"learn-hide",title:p("web_learn_hide"),"aria-label":p("web_learn_hide")},kt);t.addEventListener("click",()=>this.host.collapse());const n=A("div",{class:"learn-head"},e,t);if(this.body=A("div",{class:"learn-body"}),this.element.replaceChildren(n,this.body),this.tab==="lessons"){const a=Ot.find(s=>s.id===this.lessonId);a?this.renderLesson(a):this.renderLessonList()}else if(this.tab==="tasks"){const a=Tn.find(s=>s.id===this.taskId);a?this.renderTask(a):this.renderTaskList()}else{const a=La.map(r=>`- **${r.term}:** ${r.text}`).join(` `),s=gt("div",{class:"learn-text learn-reference"},kn(`${Ma} ## ${p("web_learn_terms")} -${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="visustruct.reference.open";let n=[];try{n=JSON.parse(localStorage.getItem(t)??"[]")}catch{}for(const a of[...e.querySelectorAll("h2")]){const s=a.textContent??"",r=O("details",{class:"reference-group"});r.open=n.includes(s);const o=O("summary",{},s);for(a.replaceWith(r),r.append(o);r.nextSibling&&r.nextSibling.nodeName!=="H2";)r.append(r.nextSibling);r.addEventListener("toggle",()=>{n=r.open?[...new Set([...n,s])]:n.filter(l=>l!==s);try{localStorage.setItem(t,JSON.stringify(n))}catch{}})}}showReference(){this.tab="reference",this.persist(),this.render()}persist(){he.setView({tab:this.tab,lesson:this.lessonId,task:this.taskId})}openLesson(e){this.tab="lessons",this.lessonId=e,this.returnTo=void 0,this.persist(),this.render(),this.body.scrollTop=0}renderLessonList(){this.body.append(O("p",{class:"hint"},p("web_learn_intro")));for(const e of AD()){this.body.append(O("h3",{class:"learn-section"},e.name));const t=O("ol",{class:"learn-list"});for(const n of e.lessons){const a=he.lesson(n.id),s=a.done?"✓":a.step>0?p("web_learn_step_of_fmt",a.step+1,n.steps.length):"",r=O("button",{class:"learn-item"+(a.done?" done":""),"data-lesson":n.id},O("span",{class:"learn-num"},String(n.number)),O("span",{class:"learn-item-text"},O("strong",{},n.robot?`🤖 ${n.title}`:n.title),O("small",{},n.summary)),O("span",{class:"learn-status"},s));r.addEventListener("click",()=>this.openLesson(n.id)),t.append(O("li",{},r))}this.body.append(t)}this.body.append(this.renderTeacherBox())}renderLesson(e){var c;const t=he.lesson(e.id),n=Math.min(t.step,e.steps.length-1),a=e.steps[n],s=O("button",{class:"learn-back"},`← ${p("web_learn_all_lessons")}`);s.addEventListener("click",()=>this.openLesson(void 0));const r=O("nav",{class:"learn-progress","aria-label":p("web_learn_step_of_fmt",n+1,e.steps.length)});r.append(...e.steps.map((d,h)=>{const g=p("web_learn_step_fmt",h+1,d.title),f=hthis.goToStep(e,h)),x})),this.body.append(s,O("p",{class:"learn-kicker"},`${p("web_learn_lesson_fmt",e.number)} · ${e.section}${e.robot?" · 🤖 VisuBot":""}`),O("h2",{class:"learn-title"},O("span",{class:"learn-num","aria-hidden":"true"},String(e.number)),e.title),r,O("h3",{class:"learn-step-title"},`${n+1}. ${a.title}`));const o=((c=this.returnTo)==null?void 0:c.lesson)===e.id&&this.returnTo.step!==n?this.returnTo:void 0,l=()=>{const d=O("button",{class:"learn-return"},`↩ ${p("web_learn_back_to_checklist")}`);return d.addEventListener("click",()=>{this.returnTo=void 0,this.goToStep(e,o.step),this.body.scrollTop=o.scroll}),d};o&&this.body.append(l()),a.blocks.forEach((d,h)=>this.body.append(this.renderBlock(d,`${n}-${h}`,e))),Ku(this.body),cD(this.body),this.openNeededColumns(a.blocks),Xu(this.body,La);const u=O("div",{class:"learn-nav"}),m=O("button",{},`← ${p("web_learn_back")}`);if(m.disabled=n===0,m.addEventListener("click",()=>this.goToStep(e,n-1)),u.append(m),nthis.goToStep(e,n+1)),u.append(d)}else{const d=O("button",{class:"primary"},t.done?`✓ ${p("web_learn_done")}`:p("web_learn_finish"));d.addEventListener("click",()=>{he.updateLesson(e.id,{done:!0});const h=Ot.find(g=>g.number===e.number+1);this.openLesson(h==null?void 0:h.id)}),u.append(d)}this.body.append(u),o&&this.body.append(l())}goToStep(e,t){he.updateLesson(e.id,{step:t}),this.render(),this.body.scrollTop=0}openNeededColumns(e){const t=e.flatMap(n=>n.kind==="exercise"?[n.exercise]:[]);_D(this.body)?this.host.showEditor():SD(this.body)?this.host.showFiles():t.some(n=>n.code!=="java")?this.host.showEditor():(t.length>0||this.body.querySelector(".lesson-code[data-lang=java]"))&&this.host.showJava(),TD(this.body)&&this.host.showLiveCode()}renderTaskList(){this.body.append(O("p",{class:"hint"},p("web_learn_tasks_intro")));const e=O("ul",{class:"learn-list"});for(const t of Tn){const n=this.taskExercises(t),a=n.length>0&&n.every(o=>he.exercise(o.id).done),s=Ot.find(o=>o.number===t.after),r=O("button",{class:"learn-item"+(a?" done":""),"data-task":t.id},O("span",{class:"learn-num","aria-label":p("web_learn_level_fmt",t.level)},"★".repeat(t.level)),O("span",{class:"learn-item-text"},O("strong",{},t.title),O("small",{},s?p("web_learn_after_fmt",s.number,s.title):"")),O("span",{class:"learn-status"},a?"✓":""));r.addEventListener("click",()=>{this.taskId=t.id,this.persist(),this.render(),this.body.scrollTop=0}),e.append(O("li",{},r))}this.body.append(e,this.renderTeacherBox())}renderTeacherBox(){const e=O("details",{class:"learn-teacher"},O("summary",{},p("web_learn_teacher")));if(Ru()){e.setAttribute("open","");const s=O("button",{},p("web_learn_teacher_off"));return s.addEventListener("click",()=>{iD(),this.render()}),e.append(O("p",{},p("web_learn_teacher_on")),s),e}const t=O("input",{type:"password",autocomplete:"off","aria-label":p("web_learn_teacher_code"),placeholder:p("web_learn_teacher_code")}),n=O("p",{class:"learn-result",role:"status"}),a=O("form",{class:"group"},t,O("button",{type:"submit"},p("web_learn_teacher_unlock")));return a.addEventListener("submit",async s=>{s.preventDefault(),await nD(t.value)?this.render():(n.className="learn-result info",n.textContent=p("web_learn_teacher_wrong"))}),e.append(O("p",{class:"hint"},p("web_learn_teacher_intro")),a,n),e}taskExercises(e){return e.blocks.flatMap(t=>t.kind==="exercise"?[t.exercise]:[])}renderTask(e){const t=O("button",{class:"learn-back"},`← ${p("web_learn_all_tasks")}`);t.addEventListener("click",()=>{this.taskId=void 0,this.persist(),this.render()});const n=Ot.find(a=>a.number===e.after);if(this.body.append(t,O("h2",{class:"learn-title"},e.title)),n){const a=O("button",{class:"link-button"},p("web_learn_after_fmt",n.number,n.title));a.addEventListener("click",()=>this.openLesson(n.id)),this.body.append(O("p",{class:"learn-kicker"},a))}e.blocks.forEach((a,s)=>this.body.append(this.renderBlock(a,`task-${s}`))),Ku(this.body),this.openNeededColumns(e.blocks),Xu(this.body,La)}renderBlock(e,t,n){switch(e.kind){case"markdown":return gt("div",{class:"learn-text"},kn(e.text));case"diagram":return this.renderDiagram(e.file,e.caption);case"exercise":return this.renderExercise(e.exercise);case"checklist":return this.renderChecklist(e.items,t,n);case"quiz":return this.renderQuiz(e.questions,t,n);case"brag":return this.renderBrag(e.text,e.tip);case"images":return this.renderImages(e.files,e.caption);case"graphic":return this.renderGraphic(e.file,e.caption);case"game":return this.renderGame(e.game);case"roundGame":return hD(e.game,aa);case"rescueGame":return bD(e.game,aa);case"caesar":return lD(e.key,e.text);case"cloze":return vD(e.cloze);case"textFile":return Hh(e.name,e.content);case"robotModel":return mD(e.focus,e.view,e.spin);case"robotQuiz":return dD(e.tasks,e.done)}}renderBrag(e,t=!1){const n=O("aside",{class:"learn-brag"});n.append(O("img",{src:aa,alt:"",width:"48",height:"48"}));const a=O("div",{},O("p",{class:"learn-brag-title"},p(t?"web_learn_ludwig_tip":"web_learn_brag")));return a.append(gt("div",{class:"learn-text"},kn(e))),n.append(a),n}renderGame(e){const n=O("section",{class:"learn-game"}),a=O("div",{class:"learn-game-head"});a.append(O("img",{src:aa,alt:"",width:"40",height:"40"}),O("strong",{},p("web_game_title")));const s=O("p",{class:"learn-game-status"}),r=O("div",{class:"learn-game-stage"});n.append(a,s,r);let o=0,l=0;const u=()=>{const d=qx(e,o,10);s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`;const h=O("div",{class:"learn-game-values mono"});for(const[w,_]of Ux(d))h.append(O("code",{},`${w} = ${_}`));const g=O("div",{class:"group learn-game-answers"}),f=O("button",{class:"learn-game-true"},`✓ ${p("web_game_true")}`),x=O("button",{class:"learn-game-false"},`✗ ${p("web_game_false")}`);g.append(f,x);const b=O("div",{class:"learn-game-feedback",role:"status"}),y=w=>{f.disabled=x.disabled=!0;const _=w===d.answer;_&&l++,s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`,b.className=`learn-game-feedback ${_?"right":"wrong"}`;const z=O("div",{class:"learn-game-steps mono"});Vx(d.condition,d.values).forEach((k,T)=>z.append(O("div",{},`${T?"→ ":""}${k}`)));const S=O("button",{class:"primary"},o+1<10?p("web_game_next"):p("web_game_finish"));S.addEventListener("click",()=>{o++,o<10?u():m()}),b.replaceChildren(O("p",{},p(_?"web_game_right":"web_game_wrong")),z,S),S.focus()};f.addEventListener("click",()=>y(!0)),x.addEventListener("click",()=>y(!1)),r.replaceChildren(h,O("div",{class:"learn-game-condition mono"},d.condition),g,b)},m=()=>{s.textContent="";const d=O("button",{class:"primary"},p("web_game_again"));d.addEventListener("click",()=>{o=l=0,u()}),r.replaceChildren(O("p",{class:"learn-game-result"},p("web_game_done_fmt",l,10)),O("p",{},p(l===10?"web_game_perfect":l>=10*.7?"web_game_good":"web_game_practice")),d)},c=O("button",{class:"primary"},p("web_game_start"));return c.addEventListener("click",u),r.append(O("p",{},p("web_game_intro")),c),n}renderImages(e,t){const n=O("figure",{class:"learn-figure"}),a=O("div",{class:"learn-images"});for(const s of e){const r=Fu(s);r&&a.append(O("img",{src:r,alt:"",loading:"lazy"}))}return n.append(a),t&&n.append(gt("figcaption",{},Fe(t))),n}renderGraphic(e,t){const n=O("figure",{class:"learn-figure"}),a=Fu(e);return a&&n.append(O("img",{class:"learn-graphic",src:a,alt:"",loading:"lazy"})),t&&n.append(gt("figcaption",{},Fe(t))),n}renderDiagram(e,t){const n=X1(e),a=O("figure",{class:"learn-figure"});if(!n)return a;const s=this.host.preview(n);s&&a.append(O("div",{class:"learn-preview",dir:"ltr"},s)),t&&a.append(gt("figcaption",{},Fe(t)));const r=O("button",{},p("web_learn_open_in_editor"));return r.addEventListener("click",()=>this.host.openDiagram(n,e)),a.append(r),a}renderExercise(e){const t=O("section",{class:"learn-exercise","data-exercise":e.id}),n=()=>he.exercise(e.id),a=O("span",{class:"learn-badge"},`✓ ${p("web_learn_solved")}`);a.hidden=!n().done,t.append(O("h4",{},`${p("web_learn_exercise")}: ${e.title}`,a),gt("div",{class:"learn-text"},kn(e.task)));const s=O("div",{class:"learn-result",role:"status"}),r=O("div",{class:"learn-hints"}),o=O("div",{class:"group"}),l=O("button",{class:"primary"},p("web_learn_open_exercise"));l.addEventListener("click",()=>{const c=n().xml;let d=em(e);if(c)try{d=Bl(c)}catch{}this.host.openExercise(e,d)});const u=O("button",{},p("web_learn_check"));if(u.addEventListener("click",()=>{const c=this.host.exerciseDocument(e.id);if(!c){s.className="learn-result info",s.textContent=p("web_learn_open_first");return}if(c.elements.every(Al)){s.className="learn-result info",s.textContent=p("web_learn_empty");return}this.host.stopSimulation();const d=Fx(c,e.tests,this.host.subprogramsFor(e.id),Wa),h=Jx(c),g=e.requires.map(b=>b==="forZaehlSchleife"?"forSchleife":b).filter(b=>b in I&&!h.has(I[b])),f=e.loopDepth!==void 0&&_o(c.elements)b.passed)&&g.length===0&&!f;this.showResult(s,d,g,x,f),x&&(he.updateExercise(e.id,{done:!0}),a.hidden=!1)}),o.append(l,u),e.hints.length>0){const c=O("button",{},p("web_learn_hint"));c.addEventListener("click",()=>{const d=r.children.length;if(d>=e.hints.length)return;const h=e.hints.length>1?`**${p("web_learn_hint_fmt",d+1,e.hints.length)}:** `:"";r.append(gt("aside",{class:"lesson-note"},kn(h+e.hints[d]))),c.textContent=p("web_learn_hint_more"),c.toggleAttribute("disabled",d+1>=e.hints.length)}),o.append(c)}const m=O("button",{class:"danger-text"},p("web_learn_reset"));if(m.addEventListener("click",()=>{if(m.dataset.confirm!=="1"){m.dataset.confirm="1",m.textContent=p("web_learn_reset_confirm"),setTimeout(()=>{m.dataset.confirm="",m.textContent=p("web_learn_reset")},4e3);return}he.resetExercise(e.id),this.host.resetExercise(e.id,em(e)),a.hidden=!0,s.replaceChildren(),s.className="learn-result",m.dataset.confirm="",m.textContent=p("web_learn_reset")}),o.append(m),t.append(o,r,s),Ru()&&e.solution){const c=X1(e.solution);if(c){const d=O("details",{class:"learn-solution"},O("summary",{},p("web_learn_solution")));d.addEventListener("toggle",()=>{if(!d.open||d.querySelector(".learn-preview"))return;const h=this.host.preview(c);h&&d.append(O("div",{class:"learn-preview",dir:"ltr"},h));const g=O("button",{},p("web_learn_open_in_editor"));g.addEventListener("click",()=>{this.host.openDiagram(c,e.solution);for(const f of e.subprograms){const x=X1(f);x&&this.host.openDiagram(x,f)}});for(const f of e.subprograms){const x=X1(f),b=x&&this.host.preview(x);b&&d.append(O("div",{class:"learn-preview",dir:"ltr"},b))}d.append(g)}),t.append(d)}}return t}showResult(e,t,n,a,s){var o,l,u,m,c;e.className="learn-result "+(a?"ok":"fail"),e.replaceChildren(O("p",{class:"learn-result-head"},a?`🎉 ${p("web_learn_passed")}`:p("web_learn_failed")));for(const d of n)e.append(O("p",{},`✗ ${p("web_learn_missing_fmt",PD(I[d]))}`));s&&e.append(O("p",{},`✗ ${p("web_visubot_depth_fmt",s)}`));const r=O("ul",{class:"learn-tests",dir:"auto"});for(const d of t){const h=d.test.world?t.filter(b=>b.test.world).indexOf(d)+1:0,g=d.test.world?`🗺 ${p("web_visubot_world_fmt",h)}`:d.test.actions?`🤖 ${p("web_visubot_actions")}`:d.test.sensors?`🎛 ${Object.entries(d.test.sensors).map(([b,y])=>`mbot.${b}() = ${y.join(" → ")}`).join(", ")}`:d.test.drive?`🤖 ${p("web_visubot_drive")}`:d.test.inputs.length?p("web_learn_input_fmt",d.test.inputs.join(", ")):p("web_learn_no_input"),f=[`${d.passed?"✓":"✗"} ${g}`],x=O("div",{class:"learn-test-detail"});if(d.test.drive&&x.append(O("span",{},`${p("web_learn_expected")}: `,O("code",{},U1(d.test.drive)||"–")),O("span",{},`${p("web_learn_actual")}: `,O("code",{},U1(d.result.drive??[])||"–"))),d.test.actions&&x.append(O("span",{},`${p("web_learn_expected")}: `,O("code",{},U1(d.test.actions)||"–")),O("span",{},`${p("web_learn_actual")}: `,O("code",{},U1(d.result.actions??[])||"–"))),d.test.led!==void 0){const b=y=>p(y?"web_visubot_led_on":"web_visubot_led_off");x.append(O("span",{},`💡 ${p("web_learn_expected")}: ${b(d.test.led)} · ${p("web_learn_actual")}: ${b(d.result.led)}`))}if(d.test.tone!==void 0){const b=y=>p(y?"web_visubot_tone_yes":"web_visubot_tone_no");x.append(O("span",{},`🔊 ${p("web_learn_expected")}: ${b(d.test.tone)} · ${p("web_learn_actual")}: ${b(d.result.tone)}`))}d.test.screen!==void 0&&x.append(O("span",{},`📺 ${p("web_learn_expected")}: `,O("code",{},d.test.screen),` · ${p("web_learn_actual")}: `,O("code",{},d.result.screen??"–"))),d.test.world&&(((l=(o=Wa(d.test.world))==null?void 0:o.goals)!=null&&l.length||(m=(u=Wa(d.test.world))==null?void 0:u.targets)!=null&&m.length)&&x.append(O("span",{},d.result.atGoal?`✓ ${p("web_visubot_goal_reached")}`:`✗ ${p("web_visubot_goal_missed")}`)),d.result.bumps&&x.append(O("span",{class:"learn-error"},`⚠︎ ${p("web_visubot_bumps")}: ${d.result.bumps}`))),(!d.test.drive&&!d.test.world&&!d.test.sensors&&!d.test.actions||d.result.outputs.length)&&x.append(O("span",{},`${p("web_learn_expected")}: `,O("code",{},d.test.expected.join(" | ")||"–")),O("span",{},`${p("web_learn_actual")}: `,O("code",{},d.result.outputs.join(" | ")||"–")));for(const b of d.test.files??[])x.append(O("span",{},`📄 ${b.name}, ${p("web_learn_expected")}: `,O("code",{},b.lines.join(" | ")||"–")),O("span",{},`📄 ${b.name}, ${p("web_learn_actual")}: `,O("code",{},jh((c=d.result.files)==null?void 0:c.get(b.name)).join(" | ")||"–")));d.result.error&&x.append(O("span",{class:"learn-error"},Kn(d.result.error))),d.result.missingInput&&x.append(O("span",{class:"learn-error"},p("web_learn_missing_input"))),d.result.tooManySteps&&x.append(O("span",{class:"learn-error"},p("web_learn_too_many_steps"))),!d.passed&&d.result.unusedInputs&&x.append(O("span",{class:"learn-error"},p("web_learn_unused_input"))),r.append(O("li",{class:d.passed?"ok":"fail"},...f,x))}e.append(r)}renderChecklist(e,t,n){const a=O("ul",{class:"learn-checklist"});return e.forEach((s,r)=>{var c;const o=`${t}-${r}`,l=O("input",{type:"checkbox"});l.checked=!!(n&&((c=he.lesson(n.id).checks)!=null&&c[o])),l.addEventListener("change",()=>{if(!n)return;const d={...he.lesson(n.id).checks??{},[o]:l.checked};he.updateLesson(n.id,{checks:d})});const u=O("label",{},l);u.insertAdjacentHTML("beforeend"," "+Fe(s.text));const m=O("li",{},u);if(n&&s.step!==void 0){const d=s.step,h=p("web_learn_step_fmt",d+1,n.steps[d].title),g=O("button",{class:"link-button learn-check-link",title:h,"aria-label":`${p("web_learn_review")}: ${h}`},p("web_learn_review"));g.addEventListener("click",()=>{this.returnTo={lesson:n.id,step:he.lesson(n.id).step,scroll:this.body.scrollTop},this.goToStep(n,d)}),m.append(g)}a.append(m)}),a}renderQuiz(e,t,n){const a=O("div",{class:"learn-quiz"}),s=O("p",{class:"learn-score",role:"status"}),r=()=>n?he.lesson(n.id).quiz??{}:{},o=()=>{const l=r(),u=(h,g)=>h.pairs?h.pairs.every((f,x)=>l[`${t}-${g}-${x}`]!==void 0):l[`${t}-${g}`]!==void 0,m=(h,g)=>{var f;return h.pairs?h.pairs.every((x,b)=>tm(h)[l[`${t}-${g}-${b}`]]===h.pairs[b].right):(f=h.options[l[`${t}-${g}`]])==null?void 0:f.correct},c=e.filter(u).length,d=e.filter(m).length;s.textContent=c===e.length?p("web_learn_score_fmt",d,e.length):""};return e.forEach((l,u)=>{const m=`${t}-${u}`,c=O("fieldset",{},gt("legend",{},Fe(l.question))),d=gt("p",{class:"learn-explanation"},Fe(l.explanation??""));if(l.pairs){c.append(this.renderMatch(l,m,r,n,d,o),d),a.append(c);return}const h=g=>{c.querySelectorAll("button").forEach((f,x)=>{f.classList.toggle("right",g!==void 0&&l.options[x].correct),f.classList.toggle("wrong",g===x&&!l.options[x].correct),f.setAttribute("aria-pressed",String(g===x))}),d.hidden=g===void 0||!l.explanation};l.options.forEach((g,f)=>{const x=gt("button",{class:"learn-option"},Fe(g.text));x.addEventListener("click",()=>{n&&he.updateLesson(n.id,{quiz:{...r(),[m]:f}}),h(f),o()}),c.append(x)}),c.append(d),h(r()[m]),a.append(c)}),a.append(s),o(),a}renderMatch(e,t,n,a,s,r){const o=e.pairs,l=tm(e),u=O("div",{class:"learn-match"});let m={};const c=()=>a?n():m,d=x=>a?he.updateLesson(a.id,{quiz:x}):m=x,h=x=>c()[`${t}-${x}`],g=o.map(x=>{const b=O("select",{class:"learn-match-select"});b.append(O("option",{value:""},"–")),l.forEach((w,_)=>b.append(O("option",{value:String(_)},w)));const y=gt("label",{class:"learn-match-left"},Fe(x.left));return y.append(b),u.append(y),b}),f=()=>{const x=o.every((b,y)=>h(y)!==void 0);g.forEach((b,y)=>{const w=h(y);b.value=w===void 0?"":String(w),b.classList.toggle("right",x&&l[w]===o[y].right),b.classList.toggle("wrong",x&&l[w]!==o[y].right)}),s.hidden=!x||!e.explanation};return g.forEach((x,b)=>x.addEventListener("change",()=>{const y={...c()};x.value===""?delete y[`${t}-${b}`]:y[`${t}-${b}`]=Number(x.value),d(y),f(),r()})),f(),u}}function tm(i){return(i.pairs??[]).map(e=>e.right).sort((e,t)=>e.localeCompare(t,"de"))}const BD=""+new URL("visubot-CyGFOI9V.webp",import.meta.url).href,i0="visustruct.visubot";function a0(){try{return localStorage.getItem(i0)}catch{return null}}function ri(){const i=a0();return i==="1"||i==="kurs"?"on":"off"}const Yh=()=>a0()==="2";function Xh(){try{localStorage.setItem(i0,"2")}catch{}}const DD=()=>a0()!==null;function br(i){try{localStorage.setItem(i0,i==="on"?"1":"0")}catch{}}const ZD=`VisuBot`,Rn=()=>ri()!=="off",nm=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function Po(){const i=Yh()?"object":ri(),e=(n,a)=>``,t={off:"web_visubot_world_visustruct_hint",on:"web_visubot_world_visubot_hint",object:"web_visuobject_world_hint"}[i];return`
+${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="visustruct.reference.open";let n=[];try{n=JSON.parse(localStorage.getItem(t)??"[]")}catch{}for(const a of[...e.querySelectorAll("h2")]){const s=a.textContent??"",r=A("details",{class:"reference-group"});r.open=n.includes(s);const o=A("summary",{},s);for(a.replaceWith(r),r.append(o);r.nextSibling&&r.nextSibling.nodeName!=="H2";)r.append(r.nextSibling);r.addEventListener("toggle",()=>{n=r.open?[...new Set([...n,s])]:n.filter(l=>l!==s);try{localStorage.setItem(t,JSON.stringify(n))}catch{}})}}showReference(){this.tab="reference",this.persist(),this.render()}persist(){ge.setView({tab:this.tab,lesson:this.lessonId,task:this.taskId})}openLesson(e){this.tab="lessons",this.lessonId=e,this.returnTo=void 0,this.persist(),this.render(),this.body.scrollTop=0}renderLessonList(){this.body.append(A("p",{class:"hint"},p("web_learn_intro")));for(const e of PD()){this.body.append(A("h3",{class:"learn-section"},e.name));const t=A("ol",{class:"learn-list"});for(const n of e.lessons){const a=ge.lesson(n.id),s=a.done?"✓":a.step>0?p("web_learn_step_of_fmt",a.step+1,n.steps.length):"",r=A("button",{class:"learn-item"+(a.done?" done":""),"data-lesson":n.id},A("span",{class:"learn-num"},String(n.number)),A("span",{class:"learn-item-text"},A("strong",{},n.robot?`🤖 ${n.title}`:n.title),A("small",{},n.summary)),A("span",{class:"learn-status"},s));r.addEventListener("click",()=>this.openLesson(n.id)),t.append(A("li",{},r))}this.body.append(t)}this.body.append(this.renderTeacherBox())}renderLesson(e){var c;const t=ge.lesson(e.id),n=Math.min(t.step,e.steps.length-1),a=e.steps[n],s=A("button",{class:"learn-back"},`← ${p("web_learn_all_lessons")}`);s.addEventListener("click",()=>this.openLesson(void 0));const r=A("nav",{class:"learn-progress","aria-label":p("web_learn_step_of_fmt",n+1,e.steps.length)});r.append(...e.steps.map((d,h)=>{const g=p("web_learn_step_fmt",h+1,d.title),f=hthis.goToStep(e,h)),x})),this.body.append(s,A("p",{class:"learn-kicker"},`${p("web_learn_lesson_fmt",e.number)} · ${e.section}${e.robot?" · 🤖 VisuBot":""}`),A("h2",{class:"learn-title"},A("span",{class:"learn-num","aria-hidden":"true"},String(e.number)),e.title),r,A("h3",{class:"learn-step-title"},`${n+1}. ${a.title}`));const o=((c=this.returnTo)==null?void 0:c.lesson)===e.id&&this.returnTo.step!==n?this.returnTo:void 0,l=()=>{const d=A("button",{class:"learn-return"},`↩ ${p("web_learn_back_to_checklist")}`);return d.addEventListener("click",()=>{this.returnTo=void 0,this.goToStep(e,o.step),this.body.scrollTop=o.scroll}),d};o&&this.body.append(l()),a.blocks.forEach((d,h)=>this.body.append(this.renderBlock(d,`${n}-${h}`,e))),Ku(this.body),dD(this.body),this.openNeededColumns(a.blocks),Xu(this.body,La);const u=A("div",{class:"learn-nav"}),m=A("button",{},`← ${p("web_learn_back")}`);if(m.disabled=n===0,m.addEventListener("click",()=>this.goToStep(e,n-1)),u.append(m),nthis.goToStep(e,n+1)),u.append(d)}else{const d=A("button",{class:"primary"},t.done?`✓ ${p("web_learn_done")}`:p("web_learn_finish"));d.addEventListener("click",()=>{ge.updateLesson(e.id,{done:!0});const h=Ot.find(g=>g.number===e.number+1);this.openLesson(h==null?void 0:h.id)}),u.append(d)}this.body.append(u),o&&this.body.append(l())}goToStep(e,t){ge.updateLesson(e.id,{step:t}),this.render(),this.body.scrollTop=0}openNeededColumns(e){const t=e.flatMap(n=>n.kind==="exercise"?[n.exercise]:[]);TD(this.body)?this.host.showEditor():_D(this.body)?this.host.showFiles():t.some(n=>n.code!=="java")?this.host.showEditor():(t.length>0||this.body.querySelector(".lesson-code[data-lang=java]"))&&this.host.showJava(),OD(this.body)&&this.host.showLiveCode()}renderTaskList(){this.body.append(A("p",{class:"hint"},p("web_learn_tasks_intro")));const e=A("ul",{class:"learn-list"});for(const t of Tn){const n=this.taskExercises(t),a=n.length>0&&n.every(o=>ge.exercise(o.id).done),s=Ot.find(o=>o.number===t.after),r=A("button",{class:"learn-item"+(a?" done":""),"data-task":t.id},A("span",{class:"learn-num","aria-label":p("web_learn_level_fmt",t.level)},"★".repeat(t.level)),A("span",{class:"learn-item-text"},A("strong",{},t.title),A("small",{},s?p("web_learn_after_fmt",s.number,s.title):"")),A("span",{class:"learn-status"},a?"✓":""));r.addEventListener("click",()=>{this.taskId=t.id,this.persist(),this.render(),this.body.scrollTop=0}),e.append(A("li",{},r))}this.body.append(e,this.renderTeacherBox())}renderTeacherBox(){const e=A("details",{class:"learn-teacher"},A("summary",{},p("web_learn_teacher")));if(Ru()){e.setAttribute("open","");const s=A("button",{},p("web_learn_teacher_off"));return s.addEventListener("click",()=>{aD(),this.render()}),e.append(A("p",{},p("web_learn_teacher_on")),s),e}const t=A("input",{type:"password",autocomplete:"off","aria-label":p("web_learn_teacher_code"),placeholder:p("web_learn_teacher_code")}),n=A("p",{class:"learn-result",role:"status"}),a=A("form",{class:"group"},t,A("button",{type:"submit"},p("web_learn_teacher_unlock")));return a.addEventListener("submit",async s=>{s.preventDefault(),await iD(t.value)?this.render():(n.className="learn-result info",n.textContent=p("web_learn_teacher_wrong"))}),e.append(A("p",{class:"hint"},p("web_learn_teacher_intro")),a,n),e}taskExercises(e){return e.blocks.flatMap(t=>t.kind==="exercise"?[t.exercise]:[])}renderTask(e){const t=A("button",{class:"learn-back"},`← ${p("web_learn_all_tasks")}`);t.addEventListener("click",()=>{this.taskId=void 0,this.persist(),this.render()});const n=Ot.find(a=>a.number===e.after);if(this.body.append(t,A("h2",{class:"learn-title"},e.title)),n){const a=A("button",{class:"link-button"},p("web_learn_after_fmt",n.number,n.title));a.addEventListener("click",()=>this.openLesson(n.id)),this.body.append(A("p",{class:"learn-kicker"},a))}e.blocks.forEach((a,s)=>this.body.append(this.renderBlock(a,`task-${s}`))),Ku(this.body),this.openNeededColumns(e.blocks),Xu(this.body,La)}renderBlock(e,t,n){switch(e.kind){case"markdown":return gt("div",{class:"learn-text"},kn(e.text));case"diagram":return this.renderDiagram(e.file,e.caption);case"exercise":return this.renderExercise(e.exercise);case"checklist":return this.renderChecklist(e.items,t,n);case"quiz":return this.renderQuiz(e.questions,t,n);case"brag":return this.renderBrag(e.text,e.tip);case"images":return this.renderImages(e.files,e.caption);case"graphic":return this.renderGraphic(e.file,e.caption);case"game":return this.renderGame(e.game);case"roundGame":return gD(e.game,aa);case"rescueGame":return yD(e.game,aa);case"caesar":return uD(e.key,e.text);case"cloze":return wD(e.cloze);case"textFile":return Vh(e.name,e.content);case"robotModel":return cD(e.focus,e.view,e.spin);case"robotQuiz":return hD(e.tasks,e.done)}}renderBrag(e,t=!1){const n=A("aside",{class:"learn-brag"});n.append(A("img",{src:aa,alt:"",width:"48",height:"48"}));const a=A("div",{},A("p",{class:"learn-brag-title"},p(t?"web_learn_ludwig_tip":"web_learn_brag")));return a.append(gt("div",{class:"learn-text"},kn(e))),n.append(a),n}renderGame(e){const n=A("section",{class:"learn-game"}),a=A("div",{class:"learn-game-head"});a.append(A("img",{src:aa,alt:"",width:"40",height:"40"}),A("strong",{},p("web_game_title")));const s=A("p",{class:"learn-game-status"}),r=A("div",{class:"learn-game-stage"});n.append(a,s,r);let o=0,l=0;const u=()=>{const d=Ux(e,o,10);s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`;const h=A("div",{class:"learn-game-values mono"});for(const[w,S]of $x(d))h.append(A("code",{},`${w} = ${S}`));const g=A("div",{class:"group learn-game-answers"}),f=A("button",{class:"learn-game-true"},`✓ ${p("web_game_true")}`),x=A("button",{class:"learn-game-false"},`✗ ${p("web_game_false")}`);g.append(f,x);const b=A("div",{class:"learn-game-feedback",role:"status"}),y=w=>{f.disabled=x.disabled=!0;const S=w===d.answer;S&&l++,s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`,b.className=`learn-game-feedback ${S?"right":"wrong"}`;const z=A("div",{class:"learn-game-steps mono"});Qx(d.condition,d.values).forEach((_,T)=>z.append(A("div",{},`${T?"→ ":""}${_}`)));const k=A("button",{class:"primary"},o+1<10?p("web_game_next"):p("web_game_finish"));k.addEventListener("click",()=>{o++,o<10?u():m()}),b.replaceChildren(A("p",{},p(S?"web_game_right":"web_game_wrong")),z,k),k.focus()};f.addEventListener("click",()=>y(!0)),x.addEventListener("click",()=>y(!1)),r.replaceChildren(h,A("div",{class:"learn-game-condition mono"},d.condition),g,b)},m=()=>{s.textContent="";const d=A("button",{class:"primary"},p("web_game_again"));d.addEventListener("click",()=>{o=l=0,u()}),r.replaceChildren(A("p",{class:"learn-game-result"},p("web_game_done_fmt",l,10)),A("p",{},p(l===10?"web_game_perfect":l>=10*.7?"web_game_good":"web_game_practice")),d)},c=A("button",{class:"primary"},p("web_game_start"));return c.addEventListener("click",u),r.append(A("p",{},p("web_game_intro")),c),n}renderImages(e,t){const n=A("figure",{class:"learn-figure"}),a=A("div",{class:"learn-images"});for(const s of e){const r=Fu(s);r&&a.append(A("img",{src:r,alt:"",loading:"lazy"}))}return n.append(a),t&&n.append(gt("figcaption",{},Re(t))),n}renderGraphic(e,t){const n=A("figure",{class:"learn-figure"}),a=Fu(e);return a&&n.append(A("img",{class:"learn-graphic",src:a,alt:"",loading:"lazy"})),t&&n.append(gt("figcaption",{},Re(t))),n}renderDiagram(e,t){const n=X1(e),a=A("figure",{class:"learn-figure"});if(!n)return a;const s=this.host.preview(n);s&&a.append(A("div",{class:"learn-preview",dir:"ltr"},s)),t&&a.append(gt("figcaption",{},Re(t)));const r=A("button",{},p("web_learn_open_in_editor"));return r.addEventListener("click",()=>this.host.openDiagram(n,e)),a.append(r),a}renderExercise(e){const t=A("section",{class:"learn-exercise","data-exercise":e.id}),n=()=>ge.exercise(e.id),a=A("span",{class:"learn-badge"},`✓ ${p("web_learn_solved")}`);a.hidden=!n().done,t.append(A("h4",{},`${p("web_learn_exercise")}: ${e.title}`,a),gt("div",{class:"learn-text"},kn(e.task)));const s=A("div",{class:"learn-result",role:"status"}),r=A("div",{class:"learn-hints"}),o=A("div",{class:"group"}),l=A("button",{class:"primary"},p("web_learn_open_exercise"));l.addEventListener("click",()=>{const c=n().xml;let d=em(e);if(c)try{d=Bl(c)}catch{}this.host.openExercise(e,d)});const u=A("button",{},p("web_learn_check"));if(u.addEventListener("click",()=>{const c=this.host.exerciseDocument(e.id);if(!c){s.className="learn-result info",s.textContent=p("web_learn_open_first");return}if(c.elements.every(Al)){s.className="learn-result info",s.textContent=p("web_learn_empty");return}this.host.stopSimulation();const d=Jx(c,e.tests,this.host.subprogramsFor(e.id),Wa),h=Rx(c),g=e.requires.map(b=>b==="forZaehlSchleife"?"forSchleife":b).filter(b=>b in I&&!h.has(I[b])),f=e.loopDepth!==void 0&&_o(c.elements)b.passed)&&g.length===0&&!f;this.showResult(s,d,g,x,f),x&&(ge.updateExercise(e.id,{done:!0}),a.hidden=!1)}),o.append(l,u),e.hints.length>0){const c=A("button",{},p("web_learn_hint"));c.addEventListener("click",()=>{const d=r.children.length;if(d>=e.hints.length)return;const h=e.hints.length>1?`**${p("web_learn_hint_fmt",d+1,e.hints.length)}:** `:"";r.append(gt("aside",{class:"lesson-note"},kn(h+e.hints[d]))),c.textContent=p("web_learn_hint_more"),c.toggleAttribute("disabled",d+1>=e.hints.length)}),o.append(c)}const m=A("button",{class:"danger-text"},p("web_learn_reset"));if(m.addEventListener("click",()=>{if(m.dataset.confirm!=="1"){m.dataset.confirm="1",m.textContent=p("web_learn_reset_confirm"),setTimeout(()=>{m.dataset.confirm="",m.textContent=p("web_learn_reset")},4e3);return}ge.resetExercise(e.id),this.host.resetExercise(e.id,em(e)),a.hidden=!0,s.replaceChildren(),s.className="learn-result",m.dataset.confirm="",m.textContent=p("web_learn_reset")}),o.append(m),t.append(o,r,s),Ru()&&e.solution){const c=X1(e.solution);if(c){const d=A("details",{class:"learn-solution"},A("summary",{},p("web_learn_solution")));d.addEventListener("toggle",()=>{if(!d.open||d.querySelector(".learn-preview"))return;const h=this.host.preview(c);h&&d.append(A("div",{class:"learn-preview",dir:"ltr"},h));const g=A("button",{},p("web_learn_open_in_editor"));g.addEventListener("click",()=>{this.host.openDiagram(c,e.solution);for(const f of e.subprograms){const x=X1(f);x&&this.host.openDiagram(x,f)}});for(const f of e.subprograms){const x=X1(f),b=x&&this.host.preview(x);b&&d.append(A("div",{class:"learn-preview",dir:"ltr"},b))}d.append(g)}),t.append(d)}}return t}showResult(e,t,n,a,s){var o,l,u,m,c;e.className="learn-result "+(a?"ok":"fail"),e.replaceChildren(A("p",{class:"learn-result-head"},a?`🎉 ${p("web_learn_passed")}`:p("web_learn_failed")));for(const d of n)e.append(A("p",{},`✗ ${p("web_learn_missing_fmt",jD(I[d]))}`));s&&e.append(A("p",{},`✗ ${p("web_visubot_depth_fmt",s)}`));const r=A("ul",{class:"learn-tests",dir:"auto"});for(const d of t){const h=d.test.world?t.filter(b=>b.test.world).indexOf(d)+1:0,g=d.test.world?`🗺 ${p("web_visubot_world_fmt",h)}`:d.test.actions?`🤖 ${p("web_visubot_actions")}`:d.test.sensors?`🎛 ${Object.entries(d.test.sensors).map(([b,y])=>`mbot.${b}() = ${y.join(" → ")}`).join(", ")}`:d.test.drive?`🤖 ${p("web_visubot_drive")}`:d.test.inputs.length?p("web_learn_input_fmt",d.test.inputs.join(", ")):p("web_learn_no_input"),f=[`${d.passed?"✓":"✗"} ${g}`],x=A("div",{class:"learn-test-detail"});if(d.test.drive&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.drive)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.drive??[])||"–"))),d.test.actions&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.actions)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.actions??[])||"–"))),d.test.led!==void 0){const b=y=>p(y?"web_visubot_led_on":"web_visubot_led_off");x.append(A("span",{},`💡 ${p("web_learn_expected")}: ${b(d.test.led)} · ${p("web_learn_actual")}: ${b(d.result.led)}`))}if(d.test.tone!==void 0){const b=y=>p(y?"web_visubot_tone_yes":"web_visubot_tone_no");x.append(A("span",{},`🔊 ${p("web_learn_expected")}: ${b(d.test.tone)} · ${p("web_learn_actual")}: ${b(d.result.tone)}`))}d.test.screen!==void 0&&x.append(A("span",{},`📺 ${p("web_learn_expected")}: `,A("code",{},d.test.screen),` · ${p("web_learn_actual")}: `,A("code",{},d.result.screen??"–"))),d.test.world&&(((l=(o=Wa(d.test.world))==null?void 0:o.goals)!=null&&l.length||(m=(u=Wa(d.test.world))==null?void 0:u.targets)!=null&&m.length)&&x.append(A("span",{},d.result.atGoal?`✓ ${p("web_visubot_goal_reached")}`:`✗ ${p("web_visubot_goal_missed")}`)),d.result.bumps&&x.append(A("span",{class:"learn-error"},`⚠︎ ${p("web_visubot_bumps")}: ${d.result.bumps}`))),(!d.test.drive&&!d.test.world&&!d.test.sensors&&!d.test.actions||d.result.outputs.length)&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},d.test.expected.join(" | ")||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},d.result.outputs.join(" | ")||"–")));for(const b of d.test.files??[])x.append(A("span",{},`📄 ${b.name}, ${p("web_learn_expected")}: `,A("code",{},b.lines.join(" | ")||"–")),A("span",{},`📄 ${b.name}, ${p("web_learn_actual")}: `,A("code",{},Ch((c=d.result.files)==null?void 0:c.get(b.name)).join(" | ")||"–")));d.result.error&&x.append(A("span",{class:"learn-error"},Kn(d.result.error))),d.result.missingInput&&x.append(A("span",{class:"learn-error"},p("web_learn_missing_input"))),d.result.tooManySteps&&x.append(A("span",{class:"learn-error"},p("web_learn_too_many_steps"))),!d.passed&&d.result.unusedInputs&&x.append(A("span",{class:"learn-error"},p("web_learn_unused_input"))),r.append(A("li",{class:d.passed?"ok":"fail"},...f,x))}e.append(r)}renderChecklist(e,t,n){const a=A("ul",{class:"learn-checklist"});return e.forEach((s,r)=>{var c;const o=`${t}-${r}`,l=A("input",{type:"checkbox"});l.checked=!!(n&&((c=ge.lesson(n.id).checks)!=null&&c[o])),l.addEventListener("change",()=>{if(!n)return;const d={...ge.lesson(n.id).checks??{},[o]:l.checked};ge.updateLesson(n.id,{checks:d})});const u=A("label",{},l);u.insertAdjacentHTML("beforeend"," "+Re(s.text));const m=A("li",{},u);if(n&&s.step!==void 0){const d=s.step,h=p("web_learn_step_fmt",d+1,n.steps[d].title),g=A("button",{class:"link-button learn-check-link",title:h,"aria-label":`${p("web_learn_review")}: ${h}`},p("web_learn_review"));g.addEventListener("click",()=>{this.returnTo={lesson:n.id,step:ge.lesson(n.id).step,scroll:this.body.scrollTop},this.goToStep(n,d)}),m.append(g)}a.append(m)}),a}renderQuiz(e,t,n){const a=A("div",{class:"learn-quiz"}),s=A("p",{class:"learn-score",role:"status"}),r=()=>n?ge.lesson(n.id).quiz??{}:{},o=()=>{const l=r(),u=(h,g)=>h.pairs?h.pairs.every((f,x)=>l[`${t}-${g}-${x}`]!==void 0):l[`${t}-${g}`]!==void 0,m=(h,g)=>{var f;return h.pairs?h.pairs.every((x,b)=>tm(h)[l[`${t}-${g}-${b}`]]===h.pairs[b].right):(f=h.options[l[`${t}-${g}`]])==null?void 0:f.correct},c=e.filter(u).length,d=e.filter(m).length;s.textContent=c===e.length?p("web_learn_score_fmt",d,e.length):""};return e.forEach((l,u)=>{const m=`${t}-${u}`,c=A("fieldset",{},gt("legend",{},Re(l.question))),d=gt("p",{class:"learn-explanation"},Re(l.explanation??""));if(l.pairs){c.append(this.renderMatch(l,m,r,n,d,o),d),a.append(c);return}const h=g=>{c.querySelectorAll("button").forEach((f,x)=>{f.classList.toggle("right",g!==void 0&&l.options[x].correct),f.classList.toggle("wrong",g===x&&!l.options[x].correct),f.setAttribute("aria-pressed",String(g===x))}),d.hidden=g===void 0||!l.explanation};l.options.forEach((g,f)=>{const x=gt("button",{class:"learn-option"},Re(g.text));x.addEventListener("click",()=>{n&&ge.updateLesson(n.id,{quiz:{...r(),[m]:f}}),h(f),o()}),c.append(x)}),c.append(d),h(r()[m]),a.append(c)}),a.append(s),o(),a}renderMatch(e,t,n,a,s,r){const o=e.pairs,l=tm(e),u=A("div",{class:"learn-match"});let m={};const c=()=>a?n():m,d=x=>a?ge.updateLesson(a.id,{quiz:x}):m=x,h=x=>c()[`${t}-${x}`],g=o.map(x=>{const b=A("select",{class:"learn-match-select"});b.append(A("option",{value:""},"–")),l.forEach((w,S)=>b.append(A("option",{value:String(S)},w)));const y=gt("label",{class:"learn-match-left"},Re(x.left));return y.append(b),u.append(y),b}),f=()=>{const x=o.every((b,y)=>h(y)!==void 0);g.forEach((b,y)=>{const w=h(y);b.value=w===void 0?"":String(w),b.classList.toggle("right",x&&l[w]===o[y].right),b.classList.toggle("wrong",x&&l[w]!==o[y].right)}),s.hidden=!x||!e.explanation};return g.forEach((x,b)=>x.addEventListener("change",()=>{const y={...c()};x.value===""?delete y[`${t}-${b}`]:y[`${t}-${b}`]=Number(x.value),d(y),f(),r()})),f(),u}}function tm(i){return(i.pairs??[]).map(e=>e.right).sort((e,t)=>e.localeCompare(t,"de"))}const DD=""+new URL("visubot-CyGFOI9V.webp",import.meta.url).href,i0="visustruct.visubot";function a0(){try{return localStorage.getItem(i0)}catch{return null}}function ri(){const i=a0();return i==="1"||i==="kurs"?"on":"off"}const Xh=()=>a0()==="2";function Kh(){try{localStorage.setItem(i0,"2")}catch{}}const ZD=()=>a0()!==null;function br(i){try{localStorage.setItem(i0,i==="on"?"1":"0")}catch{}}const MD=`VisuBot`,Rn=()=>ri()!=="off",nm=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function Po(){const i=Xh()?"object":ri(),e=(n,a)=>``,t={off:"web_visubot_world_visustruct_hint",on:"web_visubot_world_visubot_hint",object:"web_visuobject_world_hint"}[i];return`
${e("off","VisuStruct")}${e("on","🤖 VisuBot")}${e("object","VisuObject")}
- ${nm(p(t))}`}class MD{constructor(e=vi){v(this,"element");v(this,"world");v(this,"view");v(this,"loading");v(this,"status");v(this,"stage");v(this,"picker");v(this,"applied",0);v(this,"sent",0);v(this,"liveStatus");v(this,"viewport");v(this,"stopListening");v(this,"realSensors");v(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});v(this,"pressTimers",new Map);v(this,"check");v(this,"checking",!1);v(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${LD()}${WD()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=Q(async()=>{const{Robot3D:e}=await import("./robot3d-AYD_3VhA.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??vi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=eg(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function Kh(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function LD(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")} + ${nm(p(t))}`}class LD{constructor(e=vi){v(this,"element");v(this,"world");v(this,"view");v(this,"loading");v(this,"status");v(this,"stage");v(this,"picker");v(this,"applied",0);v(this,"sent",0);v(this,"liveStatus");v(this,"viewport");v(this,"stopListening");v(this,"realSensors");v(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});v(this,"pressTimers",new Map);v(this,"check");v(this,"checking",!1);v(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${WD()}${ED()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??vi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=tg(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function eg(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function WD(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")}

${p("web_visubot_controls_hint")}

${i("getBrightness","web_visubot_sensor_brightness",0,100,50)} ${i("getLoudness","web_visubot_sensor_loudness",0,100,0)} @@ -60338,76 +60338,76 @@ ${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="vis ${e("isJoystickLeft","←","web_visubot_sensor_joy_left")}${e("isJoystickRight","→","web_visubot_sensor_joy_right")} ${e("isShaken",`〰 ${p("web_visubot_shake")}`,"web_visubot_sensor_shake")}
- `}function WD(){const i=a=>a.replace(/"/g,"""),e=(a,s,r,o=1e3)=>``,t="mbot2.EM_stop('ALL')",n=tg.map(a=>`${p(a.key)}…`).join("");return``}function ED(){const i=a=>a.replace(/"/g,"""),e=(a,s,r,o=1e3)=>``,t="mbot2.EM_stop('ALL')",n=ng.map(a=>`${p(a.key)}…`).join("");return``}function eg(){return le.connecting?p("web_visubot_connecting"):le.connected?`✓ ${p("web_visubot_connected")}`:le.error?`⚠︎ ${p("web_visubot_link_error")}: ${le.error}`:""}async function ED(){if(le.connected||le.connecting)return le.disconnect();try{await le.connect()}catch(i){await le.disconnect(i.name==="NotFoundError"?void 0:i.message)}}const ut=i=>()=>we(I.anweisung,{textLines:[i]}),ND=[{key:"web_visubot_el_forward",group:"drive",type:I.anweisung,make:ut("mbot.forward()")},{key:"web_visubot_el_backward",group:"drive",type:I.anweisung,make:ut("mbot.backward()")},{key:"web_visubot_el_right",group:"drive",type:I.anweisung,make:ut("mbot.turnRight()")},{key:"web_visubot_el_left",group:"drive",type:I.anweisung,make:ut("mbot.turnLeft()")},{key:"web_visubot_el_drive",group:"wheels",type:I.anweisung,make:ut("mbot.drive(30, 30)")},{key:"web_visubot_el_stop",group:"wheels",type:I.anweisung,make:ut("mbot.stop()")},{key:"web_visubot_el_led",group:"output",type:I.anweisung,make:ut("mbot.setLed(255, 0, 0)")},{key:"web_visubot_el_led_off",group:"output",type:I.anweisung,make:ut("mbot.ledOff()")},{key:"web_visubot_el_led_color",group:"output",type:I.anweisung,make:ut('mbot.led(0).setColor("grün")')},{key:"web_visubot_el_tone",group:"output",type:I.anweisung,make:ut("mbot.playTone(440, 300)")},{key:"web_visubot_el_text",group:"output",type:I.anweisung,make:ut('mbot.showText("Hallo")')},{key:"web_visubot_el_wait",group:"wait",type:I.anweisung,make:ut("mbot.pause(100)")},{key:"web_visubot_el_emotion",group:"emotion",type:I.anweisung,make:ut('mbot.emotion("smile")')},{key:"web_visubot_el_timer",group:"wait",type:I.anweisung,make:ut("mbot.resetTimer()")}],tg=[{key:"web_visubot_sensor_distance",group:"distance",text:"mbot.getDistance()"},{key:"web_visubot_sensor_line",group:"line",text:"mbot.getLine()"},{key:"web_visubot_sensor_line_left",group:"line",text:"mbot.isLineLeft()"},{key:"web_visubot_sensor_line_right",group:"line",text:"mbot.isLineRight()"},{key:"web_visubot_sensor_color",group:"color",get text(){return`mbot.getColor().equals("${Kd("red")}")`}},{key:"web_visubot_sensor_button_a",group:"buttons",text:"mbot.isButtonA()"},{key:"web_visubot_sensor_button_b",group:"buttons",text:"mbot.isButtonB()"},{key:"web_visubot_sensor_joy_up",group:"buttons",text:"mbot.isJoystickUp()"},{key:"web_visubot_sensor_joy_down",group:"buttons",text:"mbot.isJoystickDown()"},{key:"web_visubot_sensor_joy_left",group:"buttons",text:"mbot.isJoystickLeft()"},{key:"web_visubot_sensor_joy_right",group:"buttons",text:"mbot.isJoystickRight()"},{key:"web_visubot_sensor_brightness",group:"light",text:"mbot.getBrightness()"},{key:"web_visubot_sensor_loudness",group:"light",text:"mbot.getLoudness()"},{key:"web_visubot_sensor_pitch",group:"tilt",text:"mbot.getPitch()"},{key:"web_visubot_sensor_roll",group:"tilt",text:"mbot.getRoll()"},{key:"web_visubot_sensor_shake",group:"tilt",text:"mbot.isShaken()"},{key:"web_visubot_sensor_timer",group:"timer",text:"mbot.getTimer()"},{key:"web_visubot_sensor_battery",group:"timer",text:"mbot.getBattery()"}],sa=()=>typeof window.showDirectoryPicker=="function";class Hs{constructor(e){this.handle=e}get name(){return this.handle.name}async list(){const e=[];for await(const t of this.handle.values())t.name.startsWith(".")||e.push({kind:t.kind,name:t.name});return e}async dir(e,t=!1){return new Hs(await this.handle.getDirectoryHandle(e,{create:t}))}async read(e){return(await(await this.handle.getFileHandle(e)).getFile()).text()}async write(e,t){const a=await(await this.handle.getFileHandle(e,{create:!0})).createWritable();await a.write(t),await a.close()}async has(e){try{return await this.handle.getFileHandle(e),!0}catch{try{return await this.handle.getDirectoryHandle(e),!0}catch{return!1}}}async remove(e){await this.handle.removeEntry(e,{recursive:!0})}}const FD="visustruct-workspace";function JD(){return new Promise((i,e)=>{const t=indexedDB.open(FD,1);t.onupgradeneeded=()=>{t.result.createObjectStore("files"),t.result.createObjectStore("meta")},t.onsuccess=()=>i(t.result),t.onerror=()=>e(t.error)})}async function It(i,e,t){const n=await JD();return new Promise((a,s)=>{const r=t(n.transaction(i,e).objectStore(i));r.onsuccess=()=>a(r.result),r.onerror=()=>s(r.error)})}class s0{constructor(e,t){this.name=e,this.path=t}key(e){return this.path+e}async list(){const e=await It("files","readonly",n=>n.getAllKeys()),t=new Map;for(const n of e){if(!n.startsWith(this.path)||n===this.path)continue;const a=n.slice(this.path.length),s=a.indexOf("/"),r=s<0?a:a.slice(0,s);t.has(r)||t.set(r,{kind:s<0?"file":"directory",name:r})}return[...t.values()]}async dir(e,t=!1){const n=this.key(e)+"/";if(!(await It("files","readonly",s=>s.count(n))>0)){if(!t)throw new DOMException(e,"NotFoundError");await It("files","readwrite",s=>s.put("",n))}return new s0(e,n)}async read(e){const t=await It("files","readonly",n=>n.get(this.key(e)));if(typeof t!="string")throw new DOMException(e,"NotFoundError");return t}async write(e,t){await It("files","readwrite",n=>n.put(t,this.key(e)))}async has(e){const t=await It("files","readonly",a=>a.count(this.key(e))),n=await It("files","readonly",a=>a.count(this.key(e)+"/"));return t+n>0}async remove(e){const t=this.key(e);await It("files","readwrite",n=>n.delete(t)),await It("files","readwrite",n=>n.delete(IDBKeyRange.bound(t+"/",t+"/￿")))}}async function RD(i,e="folder"){const t=await window.showDirectoryPicker({id:e==="folder"?"visustruct-workspace":e,mode:"readwrite"}),n=i&&t.name!==i?await t.getDirectoryHandle(i,{create:!0}):t;return await It("meta","readwrite",a=>a.put(n,e)),{kind:"folder",root:new Hs(n)}}function im(){return{kind:"browser",root:new s0("VisuStruct","")}}async function GD(i="folder"){var e;try{const t=await It("meta","readonly",a=>a.get(i));if(!t)return;const n=await((e=t.queryPermission)==null?void 0:e.call(t,{mode:"readwrite"}))??"granted";return{handle:t,ready:n==="granted"}}catch{return}}async function am(i){var t;return(await((t=i.requestPermission)==null?void 0:t.call(i,{mode:"readwrite"}))??"granted")==="granted"?{kind:"folder",root:new Hs(i)}:void 0}async function HD(i="folder"){try{await It("meta","readwrite",e=>e.delete(i))}catch{}}const ra="learnProgress.json",oa="lernstand.json",la="visustruct.files.mode",sm="visustruct.files.expanded";function VD(i){try{const e=JSON.parse(ng(i)??"[]");return Array.isArray(e)?e.filter(t=>typeof t=="string"):[]}catch{return[]}}function ng(i){try{return localStorage.getItem(i)}catch{return null}}function ua(i,e){try{e===null?localStorage.removeItem(i):localStorage.setItem(i,e)}catch{}}const q=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");function rm(i){return new Promise(e=>{const t=document.createElement("div");t.className="confirm";const n=(i.choices??[]).map(o=>``).join("");t.innerHTML=``;const a=t.querySelector("form"),s=a.querySelector("input"),r=o=>{t.remove(),e(o)};a.addEventListener("submit",o=>{if(o.preventDefault(),!s)return r("");s.value.trim()?r(s.value):s.focus()}),t.addEventListener("click",o=>{var m;const l=o.target,u=(m=l.closest("[data-choice]"))==null?void 0:m.dataset.choice;u!==void 0?r(u):(l===t||l.closest("[data-cancel]"))&&r(void 0)}),t.addEventListener("keydown",o=>o.key==="Escape"&&r(void 0)),document.body.append(t),(s??a.querySelector("[data-cancel]")).focus()})}class QD{constructor(e){v(this,"element");v(this,"body");v(this,"workspace");v(this,"pending");v(this,"expanded",new Set(VD(sm)));v(this,"rendering",0);v(this,"progressWorkspace");v(this,"hadWorkspace",!1);v(this,"progressTimer");this.host=e,this.element=document.createElement("aside"),this.element.className="files",this.build(),he.onChange(()=>this.progressChanged()),this.restore()}rememberExpanded(){ua(sm,JSON.stringify([...this.expanded]))}get ready(){return!!this.workspace}build(){this.element.innerHTML=` + ${i.input!==void 0?``:""} +
+ `;const a=t.querySelector("form"),s=a.querySelector("input"),r=o=>{t.remove(),e(o)};a.addEventListener("submit",o=>{if(o.preventDefault(),!s)return r("");s.value.trim()?r(s.value):s.focus()}),t.addEventListener("click",o=>{var m;const l=o.target,u=(m=l.closest("[data-choice]"))==null?void 0:m.dataset.choice;u!==void 0?r(u):(l===t||l.closest("[data-cancel]"))&&r(void 0)}),t.addEventListener("keydown",o=>o.key==="Escape"&&r(void 0)),document.body.append(t),(s??a.querySelector("[data-cancel]")).focus()})}class qD{constructor(e){v(this,"element");v(this,"body");v(this,"workspace");v(this,"pending");v(this,"expanded",new Set(QD(sm)));v(this,"rendering",0);v(this,"progressWorkspace");v(this,"hadWorkspace",!1);v(this,"progressTimer");this.host=e,this.element=document.createElement("aside"),this.element.className="files",this.build(),ge.onChange(()=>this.progressChanged()),this.restore()}rememberExpanded(){ua(sm,JSON.stringify([...this.expanded]))}get ready(){return!!this.workspace}build(){this.element.innerHTML=`
-

${q(p("web_files_title"))}

- - - +

${U(p("web_files_title"))}

+ + +
- `,this.body=this.element.querySelector(".files-body");const e=(t,n)=>this.element.querySelector(`[data-files=${t}]`).addEventListener("click",n);e("hide",()=>this.host.hide()),e("new-folder",()=>void this.newFolder()),e("switch",()=>void this.switchWorkspace()),this.body.addEventListener("click",t=>void this.onTreeClick(t)),this.render()}async restore(){if(ng(la)==="browser")this.workspace=im();else if(sa()){const e=await GD();e!=null&&e.ready?this.workspace=await am(e.handle):this.pending=e==null?void 0:e.handle}await this.render(),this.workspace||this.startDialog()}async startDialog(){var r;const e=p("web_learn_start_folder"),t=(o,l,u=!1,m)=>`${m?`

${q(m)}

`:""}`,n=sa()?[this.pending?t("reconnect",`${te.open} ${q(p("web_learn_start_continue_fmt",this.pending.name))}`,!0):"",t("pick",`${te.open} ${q(p("web_learn_start_open"))}`,!this.pending),t("create",`${te.newFolder} ${q(p("web_learn_start_create_fmt",e))}`,!1,p("web_learn_start_create_hint"))]:[t("browser",q(p("web_files_browser")),!0,p("web_files_browser_hint"))],a=document.createElement("div");a.className="confirm",a.innerHTML=``;const s=()=>a.remove();a.addEventListener("click",o=>{var m,c;const l=(m=o.target.closest("[data-world]"))==null?void 0:m.dataset.world;if(l){this.host.chooseWorld(l).then(()=>a.querySelector(".start-world").innerHTML=Po());return}const u=(c=o.target.closest("[data-start]"))==null?void 0:c.dataset.start;u&&(s(),u==="reconnect"?this.reconnect():u==="pick"?this.connectFolder():u==="create"?this.connectFolder(e):u==="browser"&&this.useBrowser())}),a.addEventListener("keydown",o=>o.key==="Escape"&&s()),document.body.append(a),(r=a.querySelector(".files-start"))==null||r.focus()}async connectFolder(e){try{this.workspace=await GD(e),this.pending=void 0,ua(la,"folder")}catch{}await this.render()}async reconnect(){this.pending&&(this.workspace=await am(this.pending),this.workspace&&(this.pending=void 0),await this.render())}async useBrowser(){this.workspace=im(),ua(la,"browser"),await this.render()}async switchWorkspace(){if(sa())return this.connectFolder();this.workspace=void 0,ua(la,null),await VD(),await this.render()}async syncProgress(e){if(this.progressWorkspace=e,!e)return;const t=!this.hadWorkspace;this.hadWorkspace=!0;try{const n=await e.root.has(ra)?ra:await e.root.has(oa)?oa:void 0;(!n||!ge.loadFile(await e.root.read(n),t))&&(t||ge.clear()),this.host.progressLoaded(),await this.writeProgress(e),await e.root.has(oa)&&(await e.root.remove(oa),await this.render())}catch{}}async writeProgress(e){if(e===this.progressWorkspace)try{const t=!await e.root.has(ra);await e.root.write(ra,ge.toFile()),t&&await this.render()}catch{}}progressChanged(){const e=this.progressWorkspace;e&&(window.clearTimeout(this.progressTimer),this.progressTimer=window.setTimeout(()=>void this.writeProgress(e),1e3))}async render(){const e=++this.rendering,t=this.workspace;if(t!==this.progressWorkspace&&this.syncProgress(t),this.element.querySelector("[data-files=new-folder]").hidden=!t,this.element.querySelector("[data-files=switch]").hidden=!t,!t){this.body.innerHTML=this.startHTML();return}const n=[],a=async(o,l,u)=>{const m=(await o.list()).sort(kx);for(const c of m){const d=l?`${l}/${c.name}`:c.name;if(c.kind==="directory"){const h=this.expanded.has(d);n.push(`
+ + +
`),h&&await a(await o.dir(c.name),d,u+1)}else if(/\.(visustruct|java|json)$/i.test(c.name)){if(/\.java$/i.test(c.name)&&m.some(g=>g.name===c.name.replace(/\.java$/i,".visustruct")))continue;const h=/\.(visustruct|java)$/i.test(c.name);n.push(`
+ + ${h?``:""} +
`)}}};try{await a(t.root,"",0)}catch(o){n.push(`

${U(o.message)}

`)}if(e!==this.rendering)return;const s=t.kind==="folder"?`📁 ${U(t.root.name)}`:U(p("web_files_in_browser")),r=p("web_files_save_hint_fmt",wu());this.body.innerHTML=`

${s}

-
${n.join("")||`

${q(p("web_files_empty"))}

`}
-

${q(r)}

- `}startHTML(){return this.pending?`

${q(p("web_files_reconnect_hint"))}

- - `:sa()?`

${q(p("web_files_connect_hint"))}

- `:`

${q(p("web_files_browser_hint"))}

- `}async onTreeClick(e){var r;const t=e.target,n=(r=t.closest("[data-start]"))==null?void 0:r.dataset.start;if(n==="pick")return this.connectFolder();if(n==="reconnect")return this.reconnect();if(n==="browser")return this.useBrowser();const a=t.closest(".files-row");if(!a||!this.workspace)return;const s=a.dataset.path;if(t.closest(".files-delete"))return this.remove(a);if(a.dataset.kind==="dir")return this.expanded.has(s)?this.expanded.delete(s):this.expanded.add(s),this.rememberExpanded(),this.render();if(a.dataset.kind==="program")return this.openProgram(s)}async locate(e){const t=e.split("/");let n=this.workspace.root;for(const a of t.slice(0,-1))n=await n.dir(a);return{dir:n,name:t.at(-1)}}async openProgram(e){try{const{dir:t,name:n}=await this.locate(e),a=n.replace(/\.(visustruct|java)$/i,""),s=await t.has(`${a}.visustruct`)?await t.read(`${a}.visustruct`):void 0,r=await t.has(`${a}.java`)?await t.read(`${a}.java`):void 0;if(s===void 0&&r===void 0)return;const o={dir:t,base:a,path:e.replace(/\.(visustruct|java)$/i,"")};this.host.open(s??"",o,r)}catch(t){this.host.message(t.message)}}async remove(e){const t=e.dataset.path,n=e.dataset.kind==="program",a=n?t.replace(/\.(visustruct|java)$/i,""):t;if(await rm({title:p("web_files_delete_confirm_fmt",a),ok:p("web_files_delete"),danger:!0})!==void 0){try{const{dir:s,name:r}=await this.locate(t);if(n){const o=r.replace(/\.(visustruct|java)$/i,"");for(const l of[".visustruct",".java"])await s.has(o+l)&&await s.remove(o+l)}else await s.remove(r)}catch(s){this.host.message(s.message)}await this.render()}}async newFolder(){if(!this.workspace)return;const e=_x(await rm({title:p("web_files_folder_prompt"),input:"",ok:p("web_files_create")})??"");if(e){try{await this.workspace.root.dir(e,!0)}catch(t){this.host.message(t.message)}await this.render()}}async save(e,t,n,a){const s=this.workspace;if(!s)return;let r=a;if(!r){const o=wu(),l=await s.root.dir(o,!0),u=Sx(kx(e,p("web_files_default_name")),(await l.list()).map(m=>m.name));r={dir:l,base:u,path:`${o}/${u}`},this.expanded.add(o),this.rememberExpanded()}return await r.dir.write(`${r.base}.visustruct`,t),n!==void 0&&await r.dir.write(`${r.base}.java`,n),await this.render(),r}}const ig=["boolean","int","double","String","char","long","float","short","byte"],qD=new Set([...ig,"Boolean","Integer","Double","Character","Long","Float","Short","Byte","var","void"]);function UD(i){if(qD.has(i))return;const e=i.toLowerCase();for(const t of ig)if($D(e,t.toLowerCase())<=(t.length>=6?2:1))return t}function $D(i,e){const t=Array.from({length:i.length+1},(n,a)=>Array.from({length:e.length+1},(s,r)=>a===0?r:r===0?a:0));for(let n=1;n<=i.length;n++)for(let a=1;a<=e.length;a++){const s=i[n-1]===e[a-1]?0:1;t[n][a]=Math.min(t[n-1][a]+1,t[n][a-1]+1,t[n-1][a-1]+s),n>1&&a>1&&i[n-1]===e[a-2]&&i[n-2]===e[a-1]&&(t[n][a]=Math.min(t[n][a],t[n-2][a-2]+1))}return t[i.length][e.length]}const YD=[">>>=","<<=",">>=",">>>","->","::","++","--","==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","&=","|=","^=","<<"];function XD(i,e){const t=[];let n=0,a=0;const s=(r,o,l,u)=>t.push({kind:r,text:i.slice(o,l),start:o,end:l,line:u});for(;n${n.join("")||`

${U(p("web_files_empty"))}

`} +

${U(r)}

+ `}startHTML(){return this.pending?`

${U(p("web_files_reconnect_hint"))}

+ + `:sa()?`

${U(p("web_files_connect_hint"))}

+ `:`

${U(p("web_files_browser_hint"))}

+ `}async onTreeClick(e){var r;const t=e.target,n=(r=t.closest("[data-start]"))==null?void 0:r.dataset.start;if(n==="pick")return this.connectFolder();if(n==="reconnect")return this.reconnect();if(n==="browser")return this.useBrowser();const a=t.closest(".files-row");if(!a||!this.workspace)return;const s=a.dataset.path;if(t.closest(".files-delete"))return this.remove(a);if(a.dataset.kind==="dir")return this.expanded.has(s)?this.expanded.delete(s):this.expanded.add(s),this.rememberExpanded(),this.render();if(a.dataset.kind==="program")return this.openProgram(s)}async locate(e){const t=e.split("/");let n=this.workspace.root;for(const a of t.slice(0,-1))n=await n.dir(a);return{dir:n,name:t.at(-1)}}async openProgram(e){try{const{dir:t,name:n}=await this.locate(e),a=n.replace(/\.(visustruct|java)$/i,""),s=await t.has(`${a}.visustruct`)?await t.read(`${a}.visustruct`):void 0,r=await t.has(`${a}.java`)?await t.read(`${a}.java`):void 0;if(s===void 0&&r===void 0)return;const o={dir:t,base:a,path:e.replace(/\.(visustruct|java)$/i,"")};this.host.open(s??"",o,r)}catch(t){this.host.message(t.message)}}async remove(e){const t=e.dataset.path,n=e.dataset.kind==="program",a=n?t.replace(/\.(visustruct|java)$/i,""):t;if(await rm({title:p("web_files_delete_confirm_fmt",a),ok:p("web_files_delete"),danger:!0})!==void 0){try{const{dir:s,name:r}=await this.locate(t);if(n){const o=r.replace(/\.(visustruct|java)$/i,"");for(const l of[".visustruct",".java"])await s.has(o+l)&&await s.remove(o+l)}else await s.remove(r)}catch(s){this.host.message(s.message)}await this.render()}}async newFolder(){if(!this.workspace)return;const e=Tx(await rm({title:p("web_files_folder_prompt"),input:"",ok:p("web_files_create")})??"");if(e){try{await this.workspace.root.dir(e,!0)}catch(t){this.host.message(t.message)}await this.render()}}async save(e,t,n,a){const s=this.workspace;if(!s)return;let r=a;if(!r){const o=wu(),l=await s.root.dir(o,!0),u=_x(Sx(e,p("web_files_default_name")),(await l.list()).map(m=>m.name));r={dir:l,base:u,path:`${o}/${u}`},this.expanded.add(o),this.rememberExpanded()}return await r.dir.write(`${r.base}.visustruct`,t),n!==void 0&&await r.dir.write(`${r.base}.java`,n),await this.render(),r}}const ag=["boolean","int","double","String","char","long","float","short","byte"],UD=new Set([...ag,"Boolean","Integer","Double","Character","Long","Float","Short","Byte","var","void"]);function $D(i){if(UD.has(i))return;const e=i.toLowerCase();for(const t of ag)if(YD(e,t.toLowerCase())<=(t.length>=6?2:1))return t}function YD(i,e){const t=Array.from({length:i.length+1},(n,a)=>Array.from({length:e.length+1},(s,r)=>a===0?r:r===0?a:0));for(let n=1;n<=i.length;n++)for(let a=1;a<=e.length;a++){const s=i[n-1]===e[a-1]?0:1;t[n][a]=Math.min(t[n-1][a]+1,t[n][a-1]+1,t[n-1][a-1]+s),n>1&&a>1&&i[n-1]===e[a-2]&&i[n-2]===e[a-1]&&(t[n][a]=Math.min(t[n][a],t[n-2][a-2]+1))}return t[i.length][e.length]}const XD=[">>>=","<<=",">>=",">>>","->","::","++","--","==","!=","<=",">=","&&","||","+=","-=","*=","/=","%=","&=","|=","^=","<<"];function KD(i,e){const t=[];let n=0,a=0;const s=(r,o,l,u)=>t.push({kind:r,text:i.slice(o,l),start:o,end:l,line:u});for(;ni.startsWith(d,n))??r;n+=c.length,s("op",o,n,l)}return t}const yr=new Set(["if","else","for","while","do","switch","case","default","break","return","try"]),vr=new Set(["public","private","protected","static","final","abstract"]),om="(?:int|long|short|byte|float|double|boolean|char|String)";let KD=class{constructor(e,t,n){v(this,"toks");v(this,"comments");v(this,"i",0);v(this,"problems",[]);v(this,"placeholders",[]);v(this,"lines",new Map);v(this,"className");v(this,"imports",[]);v(this,"fileScanners",new Set);this.src=e,this.labels=t,this.opts=n;const a=XD(e,this.problems);this.toks=a.filter(s=>s.kind!=="comment"),this.comments=a.filter(s=>s.kind==="comment")}get tok(){return this.toks[this.i]}is(e,t=this.tok){return t!==void 0&&t.text===e&&t.kind!=="str"}next(){return this.toks[this.i++]}eat(e){return this.is(e)?this.next():void 0}prev(){return this.toks[this.i-1]}problem(e,t,n){const a=t??{start:this.src.length,end:this.src.length};this.problems.push({from:a.start,to:Math.max(a.end,a.start+1),key:e,arg:n})}missingAfter(e,t){const n=e?e.end:this.src.length;this.problems.push({from:Math.max(0,n-1),to:n,key:"web_parse_missing",arg:t})}text(e,t){let n="",a=e;for(const s of this.comments)s.end<=e||s.start>=t||(n+=this.src.slice(a,Math.max(a,s.start)),a=Math.max(a,s.end));return n+=this.src.slice(a,Math.max(a,t)),n.replace(/\s*\n\s*/g," ").trim()}slot(e,t,n){const a=this.text(e,t);if(a===n){const s=this.src.indexOf(n,e);return s>=0&&this.placeholders.push({from:s,to:s+n.length}),""}return a}record(e,t,n){return this.lines.set(e,[t,n]),{element:e,from:t,to:n}}lineOf(e){var t;return(e==null?void 0:e.line)??((t=this.toks[this.toks.length-1])==null?void 0:t.line)??0}checkImports(){const e=["File","PrintWriter","FileReader","FileWriter","BufferedReader","IOException","FileNotFoundException"].map(t=>[t,"java.io"]);for(const[t,n]of[["Scanner","java.util"],["Files","java.nio.file"],["Path","java.nio.file"],["Paths","java.nio.file"],...e]){const a=this.imports.some(r=>r===`import${n}.${t};`||r===`import${n}.*;`),s=this.toks.find((r,o)=>{var l;return r.kind==="id"&&r.text===t&&(n!=="java.nio.file"||((l=this.toks[o+1])==null?void 0:l.text)===".")});if(!a&&s){this.problem("web_parse_missing_import",s,n==="java.util"?`import ${n}.${t};`:`import ${n}.*;`);return}}}checkScanners(){var n;const e=new Set(["next","nextInt","nextDouble","nextLine","nextBoolean","nextLong","nextFloat","hasNext","hasNextInt","hasNextLine","hasNextDouble"]),t=a=>this.toks.some((s,r)=>{const o=this.toks[r-1];return s.kind==="id"&&s.text===a&&!!o&&(o.kind==="id"&&!yr.has(o.text)&&o.text!=="new"||o.text===">"||o.text==="]")});for(let a=0;a{var s;return((s=this.toks[a-1])==null?void 0:s.text)==="class"}).map(n=>n.text));for(let n=0;no.text).join(""));continue}const a=this.classStart();if(a!==void 0){this.className??(this.className=a.name),this.i=a.index;const r=this.parseClassBody();e.push(...r.elements),t??(t=r.caption);continue}const s=this.methodStart();if(s){n&&this.problem("web_parse_more_methods",this.tok);const r=this.parseMethod(s);n||(t=s.caption,e.push(...r)),n=!0;continue}if(this.is("}")){this.problem("web_parse_extra",this.next(),"}");continue}e.push(...this.parseStatement())}return{caption:t,elements:this.finishList(e)}}skipPast(e){for(;this.tok&&!this.is(e);)this.next();this.eat(e)}classStart(){var n,a;let e=this.i;for(;this.toks[e]&&vr.has(this.toks[e].text);)e++;if(((n=this.toks[e])==null?void 0:n.text)!=="class"||((a=this.toks[e+1])==null?void 0:a.kind)!=="id")return;const t=this.toks[e+1].text;for(e+=2;this.toks[e]&&this.toks[e].text!=="{";)e++;return{name:t,index:e+1}}parseClassBody(){let e,t,n=!1;const a=[];for(;this.tok&&!this.is("}");){const s=this.methodStart();if(!s){this.is("{")?a.push(...this.parseBlock().elements):a.push(...this.parseStatement());continue}const r=this.tok,o=this.parseMethod(s);s.name==="main"?e??(e=o):t?n=!0:t={caption:s.caption,body:o},(e&&t||n)&&this.problem("web_parse_more_methods",r)}return this.eat("}"),e?{elements:e}:a.length>0||!t?{elements:a}:{caption:t.caption,elements:t.body}}methodStart(){var g,f,x,b,y,w,_,z,S,k,T;let e=this.i,t=0;for(;this.toks[e]&&vr.has(this.toks[e].text);)e++,t++;const n=this.toks[e];if((n==null?void 0:n.kind)!=="id"||yr.has(n.text)||n.text==="new")return;for(e++;((g=this.toks[e])==null?void 0:g.text)==="["&&((f=this.toks[e+1])==null?void 0:f.text)==="]";)e+=2;const a=this.toks[e];if((a==null?void 0:a.kind)!=="id"||((x=this.toks[e+1])==null?void 0:x.text)!=="(")return;let s=0,r=e+1;for(;this.toks[r];r++){const j=this.toks[r].text;if(j==="(")s++;else{if(j===")"&&--s===0)break;if(j===";"||j==="{"||j==="}")break}}let o=r+1;if(((b=this.toks[r])==null?void 0:b.text)===")"&&((y=this.toks[o])==null?void 0:y.text)==="throws")for(o++;((w=this.toks[o])==null?void 0:w.kind)==="id"&&(((_=this.toks[o+1])==null?void 0:_.text)===","||((z=this.toks[o+1])==null?void 0:z.text)==="{"||((S=this.toks[o+1])==null?void 0:S.text)===".");)o+=this.toks[o+1].text==="{"?1:2;const l=this.toks[o],u=((k=this.toks[r])==null?void 0:k.text)===")"&&(l==null?void 0:l.text)==="{";if(!u&&!(t>0&&(l===void 0||this.toks[r]===void 0)))return;const m=((T=this.toks[r])==null?void 0:T.text)===")"?this.toks[r].start:this.src.length,c=this.text(this.toks[e+1].end,m),h=`${this.text(n.start,this.toks[e-1].end).replace(/\s+/g,"")} ${a.text}(${c.replace(/\s*,\s*/g,", ")})`;return this.i=Math.min(u?o:r+1,this.toks.length),{name:a.text,caption:a.text==="main"||!yt(h)?void 0:h}}parseMethod(e){return this.is("{")?this.parseBlock().elements:(this.missingAfter(this.prev(),"{"),[])}parseBlock(){const e=this.next(),t=[];for(;this.tok&&!this.is("}")&&!(this.is("case")||this.is("default"));)t.push(...this.parseStatement());const n=this.eat("}");if(n||this.problem("web_parse_missing",e,"}"),t.length===0){const a=(n==null?void 0:n.start)??this.src.length,s=this.comments.find(r=>r.start>e.end&&r.startn.element)}parseStatement(){const e=this.tok;switch(e.kind==="id"?e.text:""){case"if":return[this.parseIf()];case"while":return[this.parseWhile()];case"do":return[this.parseDo()];case"for":return[this.parseFor()];case"switch":return[this.parseSwitch()];case"try":return this.parseTry();case"break":{this.next();const t=this.eat(";");t||this.missingAfter(e,";");const n=this.trailingComment(t??e);return[this.record(we(I.aussprung,{textLines:[n]}),e.line,e.line)]}case"else":return this.problem("web_parse_else_without_if",this.next()),[];case"case":case"default":for(this.problem("web_parse_case_outside_switch",this.next());this.tok&&!this.is(":")&&!this.is("->")&&!this.is(";");)this.next();return this.next(),[]}return this.is("{")?this.parseBlock().elements:this.is(";")?(this.next(),[this.record(we(I.anweisung),e.line,e.line)]):this.parseSimple()}parseTry(){const e=this.next();let t=e;const n=(r,o)=>{t=this.next();let u=1;for(;this.tok;){const m=this.next();if(t=m,m.kind!=="str"){if(m.text===r)u++;else if(m.text===o&&--u===0)return!0}}return this.missingAfter(t,o),!1};let a=!0;for(this.is("(")&&(a=n("(",")")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{");a&&(this.is("catch")||this.is("finally"));){const r=this.next().text==="catch";t=this.prev(),r&&(this.is("(")?a=n("(",")"):this.missingAfter(t,"(")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{")}const s=this.text(e.start,t.end).replace(/\s+/g," ");return[this.record(we(I.anweisung,{textLines:[s]}),e.line,t.line)]}trailingComment(e){const t=this.comments.find(a=>a.start>=e.end&&a.line===e.line),n=this.toks.find(a=>a.start>=e.end);return!t||n&&n.start1;)m.push("");const c=this.parseBody();return this.record(we(I.forSchleife,{textLines:m,loopBody:c.elements}),e.line,c.end)}parseSwitch(){const e=this.next(),t=this.parenthesized(e,this.labels.selector),n=[];let a=this.lineOf(this.prev());const s=this.eat("{");if(!s)this.missingAfter(this.prev(),"{");else{for(;this.tok&&!this.is("}");){if(!this.is("case")&&!this.is("default")){this.problem("web_parse_case_outside_switch",this.tok),this.parseStatement();continue}n.push(this.parseCase())}const o=this.eat("}");o||this.problem("web_parse_missing",s,"}"),a=this.lineOf(o??this.prev())}n.some(o=>o.isDefault)||n.push({name:"default",elements:[en()],isDefault:!0});const r=[...n.filter(o=>!o.isDefault),...n.filter(o=>o.isDefault)].map(({name:o,elements:l})=>({name:o,elements:l}));return this.record(we(I.fallauswahl,{textLines:[t.text],cases:r}),e.line,a)}parseCase(){var l;const e=this.next(),t=e.text==="default",n=((l=this.tok)==null?void 0:l.start)??e.end;let a=n;for(;this.tok&&!this.is("->")&&!this.is(":")&&!this.is("{")&&!this.is("}");)a=this.next().end;const s=this.eat("->")??this.eat(":");s||this.missingAfter(this.prev(),"->");let r=t?"default":this.text(n,a),o=[];if((s==null?void 0:s.text)==="->")this.is("{")?(t&&(r=this.trailingComment(this.tok)||r),o=this.parseBlock().elements):this.tok&&!this.is("}")&&(o=this.parseStatement());else{for(t&&s&&(r=this.trailingComment(s)||r);this.tok&&!this.is("case")&&!this.is("default")&&!this.is("}");)o.push(...this.parseStatement());const u=o[o.length-1];(u==null?void 0:u.element.type)===I.aussprung&&u.element.textLines.every(m=>m==="")&&o.pop()}return{name:r,elements:this.finishList(o),isDefault:t}}parseSimple(){const e=this.next();let t=e;const n=e.text==="("||e.text==="["||e.text==="{"?[e.text]:[],a=()=>n.length>0&&n[n.length-1]==="{"&&e.text!=="{";let s;for(;this.tok;){const u=this.tok;if(u.text===";"&&u.kind==="op"&&!a()){s=this.next();break}if(u.line!==t.line&&!a()&&(n.length===0||u.kind==="id"&&yr.has(u.text)||u.text==="}")||u.text==="}"&&n.length===0)break;(u.text==="("||u.text==="["||u.text==="{")&&n.push(u.text),(u.text===")"||u.text==="]"||u.text==="}")&&n.pop(),t=this.next()}s||this.missingAfter(t,";"),this.checkBrackets(e,t);const r=this.text(e.start,t.end),o=this.simpleElement(r);if(!o)return[];const l=this.record(o.element,e.line,t.line);return l.prompt=o.prompt,[l]}checkBrackets(e,t){const n=[],a={")":"(","]":"[","}":"{"},s={"(":")","[":"]","{":"}"};for(let r=this.toks.indexOf(e);r>=0&&rwe(I.anweisung,{textLines:[u]}),a=/^System\.out\.println\s*\(([\s\S]*?)\)?$/.exec(e);if(a){const u=a[1].trim();if(u==="")return{element:n("output: ")};const m=/^"((?:[^"\\]|\\.)*)"$/.exec(u),c=m?eZ(m[1]):void 0;return{element:n(`output: ${u}`),prompt:c!==void 0&&!c.includes('"')?c:void 0}}const s=new RegExp(`^(?:(${om})\\s+)?([A-Za-z_]\\w*(?:\\s*\\[[^\\]]+\\])*)\\s*=\\s*\\w+\\.(nextInt|nextDouble|nextLine|next|nextBoolean)\\s*\\(\\s*\\)$`).exec(e);if(s&&!this.fileScanners.has(e.replace(/^[\s\S]*=\s*(\w+)\.\w+\s*\(\s*\)$/,"$1"))){const u={nextInt:"int",nextDouble:"double",nextLine:"String",next:"String",nextBoolean:"boolean"}[s[3]],m=s[2].replace(/\s+/g,"");if((s[1]===u||!s[1]&&m.includes("["))&&u)return{element:n(`input: ${u} ${m}`)}}const r=new RegExp(`^final\\s+(${om}\\s+[\\s\\S]*)$`).exec(e);if(r)return{element:n(`const ${r[1]}`)};const o=/^(?:(?:\w+\s+)?\w+\s*=\s*)?([A-Za-z_]\w*)\s*\(/.exec(e);return o&&((l=this.opts.subprograms)!=null&&l.has(o[1]))?{element:we(I.aufruf,{textLines:[e]})}:{element:n(e)}}spansFor(e,t=[],n=[]){return e.forEach((a,s)=>{var l;const r=[...t,s],o=this.lines.get(a);o&&n.push({path:r,from:o[0],to:o[1]}),a.loopBody&&this.spansFor(a.loopBody,[...r,0],n),(l=a.cases)==null||l.forEach((u,m)=>this.spansFor(u.elements,[...r,m],n))}),n}isCodePlaceholder(e){return e.text.startsWith("//")&&e.text.slice(2).trim()===this.labels.code}markPlaceholderComments(){for(const e of this.comments)this.isCodePlaceholder(e)&&this.placeholders.push({from:e.start,to:e.end})}};function eZ(i){return i.replace(/\\(.)/g,(e,t)=>({n:` -`,r:"\r",t:" "})[t]??t)}function jo(i,e,t={}){const n=new KD(i,e,t),{caption:a,elements:s}=n.parseProgram();n.markPlaceholderComments(),n.checkImports(),n.checkScanners(),n.checkTypes();const r=n.spansFor(s),o=n.problems.sort((l,u)=>l.from-u.from);return{caption:a,className:n.className,elements:s,spans:r,placeholders:n.placeholders.sort((l,u)=>l.from-u.from),problems:o}}const r0={asClass:!1,withMain:!1},lm=i=>/^import\s+[\w.]+(?:\.\*)?\s*;$/.test(i.trim()),um=i=>i.map(e=>e.trim()===""?"":" "+e);function ag(i,e,t=r0){var u;const n=Sh(i,"java",e);let a=n.text.replaceAll(Mi,"").replaceAll(ql,"").split(` -`),s=n.spans;const r=m=>s=s.map(c=>({...c,from:c.from+m,to:c.to+m})),o=yt(i.caption)!==void 0,l=[];if(t.withMain&&!o||t.asClass){for(let m=a.findIndex(lm);m>=0;m=a.findIndex(lm))l.push(a[m].trim()),a.splice(m,1),s=s.map(c=>({...c,from:c.from>m?c.from-1:c.from,to:c.to>m?c.to-1:c.to}));l.length&&((u=a[0])==null?void 0:u.trim())===""&&(a.splice(0,1),s=s.map(m=>({...m,from:m.from>0?m.from-1:m.from,to:m.to>0?m.to-1:m.to}))),l.length&&l.push("")}return t.withMain&&!o&&(a=[`public static void main(String[] args)${K3(i)?" throws Exception":""} {`,...um(a),"}"],r(1)),t.asClass&&(a=[`public class ${Gs(o?"Main":i.caption)} {`,...um(a),"}"],r(1)),l.length&&(a=[...l,...a],r(l.length)),{text:a.join(` -`),spans:s}}function oi(i,e,t=r0){return ag(i,e,t).text}function wr(i){const e=sg(i).code;return(e.trim()===""?i:e).replace(/\s+/g,"")}function sg(i){let e="";for(let t=0;tnew Array(a+1).fill(0));for(let u=n-1;u>=0;u--)for(let m=a-1;m>=0;m--)s[u][m]=t(i[u],e[m])?s[u+1][m+1]+1:Math.max(s[u+1][m],s[u][m+1]);const r=[];let o=0,l=0;for(;o=s[o][l+1])?r.push({kind:"del",a:o++}):r.push({kind:"ins",b:l++});return r}function cm(i,e,t,n,a={},s=r0){const r=oi(t,n,s),o=oi(e,n,s);if(i===o)return r;const l=o.split(` +`;)n+=i[n]==="\\"?2:1;i[n]===r?n++:e.push({from:o,to:Math.min(n,i.length),key:"web_parse_unclosed_string",arg:r}),s("str",o,Math.min(n,i.length),l);continue}const u=/^\d[\d_]*(?:\.\d+)?(?:[eE][+-]?\d+)?[lLfFdD]?/.exec(i.slice(n,n+64));if(u){n+=u[0].length,s("num",o,n,l);continue}const m=/^[\p{L}_$][\p{L}\p{N}_$]*/u.exec(i.slice(n,n+256));if(m){n+=m[0].length,s("id",o,n,l);continue}const c=XD.find(d=>i.startsWith(d,n))??r;n+=c.length,s("op",o,n,l)}return t}const yr=new Set(["if","else","for","while","do","switch","case","default","break","return","try"]),vr=new Set(["public","private","protected","static","final","abstract"]),om="(?:int|long|short|byte|float|double|boolean|char|String)";let eZ=class{constructor(e,t,n){v(this,"toks");v(this,"comments");v(this,"i",0);v(this,"problems",[]);v(this,"placeholders",[]);v(this,"lines",new Map);v(this,"className");v(this,"imports",[]);v(this,"fileScanners",new Set);this.src=e,this.labels=t,this.opts=n;const a=KD(e,this.problems);this.toks=a.filter(s=>s.kind!=="comment"),this.comments=a.filter(s=>s.kind==="comment")}get tok(){return this.toks[this.i]}is(e,t=this.tok){return t!==void 0&&t.text===e&&t.kind!=="str"}next(){return this.toks[this.i++]}eat(e){return this.is(e)?this.next():void 0}prev(){return this.toks[this.i-1]}problem(e,t,n){const a=t??{start:this.src.length,end:this.src.length};this.problems.push({from:a.start,to:Math.max(a.end,a.start+1),key:e,arg:n})}missingAfter(e,t){const n=e?e.end:this.src.length;this.problems.push({from:Math.max(0,n-1),to:n,key:"web_parse_missing",arg:t})}text(e,t){let n="",a=e;for(const s of this.comments)s.end<=e||s.start>=t||(n+=this.src.slice(a,Math.max(a,s.start)),a=Math.max(a,s.end));return n+=this.src.slice(a,Math.max(a,t)),n.replace(/\s*\n\s*/g," ").trim()}slot(e,t,n){const a=this.text(e,t);if(a===n){const s=this.src.indexOf(n,e);return s>=0&&this.placeholders.push({from:s,to:s+n.length}),""}return a}record(e,t,n){return this.lines.set(e,[t,n]),{element:e,from:t,to:n}}lineOf(e){var t;return(e==null?void 0:e.line)??((t=this.toks[this.toks.length-1])==null?void 0:t.line)??0}checkImports(){const e=["File","PrintWriter","FileReader","FileWriter","BufferedReader","IOException","FileNotFoundException"].map(t=>[t,"java.io"]);for(const[t,n]of[["Scanner","java.util"],["Files","java.nio.file"],["Path","java.nio.file"],["Paths","java.nio.file"],...e]){const a=this.imports.some(r=>r===`import${n}.${t};`||r===`import${n}.*;`),s=this.toks.find((r,o)=>{var l;return r.kind==="id"&&r.text===t&&(n!=="java.nio.file"||((l=this.toks[o+1])==null?void 0:l.text)===".")});if(!a&&s){this.problem("web_parse_missing_import",s,n==="java.util"?`import ${n}.${t};`:`import ${n}.*;`);return}}}checkScanners(){var n;const e=new Set(["next","nextInt","nextDouble","nextLine","nextBoolean","nextLong","nextFloat","hasNext","hasNextInt","hasNextLine","hasNextDouble"]),t=a=>this.toks.some((s,r)=>{const o=this.toks[r-1];return s.kind==="id"&&s.text===a&&!!o&&(o.kind==="id"&&!yr.has(o.text)&&o.text!=="new"||o.text===">"||o.text==="]")});for(let a=0;a{var s;return((s=this.toks[a-1])==null?void 0:s.text)==="class"}).map(n=>n.text));for(let n=0;no.text).join(""));continue}const a=this.classStart();if(a!==void 0){this.className??(this.className=a.name),this.i=a.index;const r=this.parseClassBody();e.push(...r.elements),t??(t=r.caption);continue}const s=this.methodStart();if(s){n&&this.problem("web_parse_more_methods",this.tok);const r=this.parseMethod(s);n||(t=s.caption,e.push(...r)),n=!0;continue}if(this.is("}")){this.problem("web_parse_extra",this.next(),"}");continue}e.push(...this.parseStatement())}return{caption:t,elements:this.finishList(e)}}skipPast(e){for(;this.tok&&!this.is(e);)this.next();this.eat(e)}classStart(){var n,a;let e=this.i;for(;this.toks[e]&&vr.has(this.toks[e].text);)e++;if(((n=this.toks[e])==null?void 0:n.text)!=="class"||((a=this.toks[e+1])==null?void 0:a.kind)!=="id")return;const t=this.toks[e+1].text;for(e+=2;this.toks[e]&&this.toks[e].text!=="{";)e++;return{name:t,index:e+1}}parseClassBody(){let e,t,n=!1;const a=[];for(;this.tok&&!this.is("}");){const s=this.methodStart();if(!s){this.is("{")?a.push(...this.parseBlock().elements):a.push(...this.parseStatement());continue}const r=this.tok,o=this.parseMethod(s);s.name==="main"?e??(e=o):t?n=!0:t={caption:s.caption,body:o},(e&&t||n)&&this.problem("web_parse_more_methods",r)}return this.eat("}"),e?{elements:e}:a.length>0||!t?{elements:a}:{caption:t.caption,elements:t.body}}methodStart(){var g,f,x,b,y,w,S,z,k,_,T;let e=this.i,t=0;for(;this.toks[e]&&vr.has(this.toks[e].text);)e++,t++;const n=this.toks[e];if((n==null?void 0:n.kind)!=="id"||yr.has(n.text)||n.text==="new")return;for(e++;((g=this.toks[e])==null?void 0:g.text)==="["&&((f=this.toks[e+1])==null?void 0:f.text)==="]";)e+=2;const a=this.toks[e];if((a==null?void 0:a.kind)!=="id"||((x=this.toks[e+1])==null?void 0:x.text)!=="(")return;let s=0,r=e+1;for(;this.toks[r];r++){const j=this.toks[r].text;if(j==="(")s++;else{if(j===")"&&--s===0)break;if(j===";"||j==="{"||j==="}")break}}let o=r+1;if(((b=this.toks[r])==null?void 0:b.text)===")"&&((y=this.toks[o])==null?void 0:y.text)==="throws")for(o++;((w=this.toks[o])==null?void 0:w.kind)==="id"&&(((S=this.toks[o+1])==null?void 0:S.text)===","||((z=this.toks[o+1])==null?void 0:z.text)==="{"||((k=this.toks[o+1])==null?void 0:k.text)===".");)o+=this.toks[o+1].text==="{"?1:2;const l=this.toks[o],u=((_=this.toks[r])==null?void 0:_.text)===")"&&(l==null?void 0:l.text)==="{";if(!u&&!(t>0&&(l===void 0||this.toks[r]===void 0)))return;const m=((T=this.toks[r])==null?void 0:T.text)===")"?this.toks[r].start:this.src.length,c=this.text(this.toks[e+1].end,m),h=`${this.text(n.start,this.toks[e-1].end).replace(/\s+/g,"")} ${a.text}(${c.replace(/\s*,\s*/g,", ")})`;return this.i=Math.min(u?o:r+1,this.toks.length),{name:a.text,caption:a.text==="main"||!yt(h)?void 0:h}}parseMethod(e){return this.is("{")?this.parseBlock().elements:(this.missingAfter(this.prev(),"{"),[])}parseBlock(){const e=this.next(),t=[];for(;this.tok&&!this.is("}")&&!(this.is("case")||this.is("default"));)t.push(...this.parseStatement());const n=this.eat("}");if(n||this.problem("web_parse_missing",e,"}"),t.length===0){const a=(n==null?void 0:n.start)??this.src.length,s=this.comments.find(r=>r.start>e.end&&r.startn.element)}parseStatement(){const e=this.tok;switch(e.kind==="id"?e.text:""){case"if":return[this.parseIf()];case"while":return[this.parseWhile()];case"do":return[this.parseDo()];case"for":return[this.parseFor()];case"switch":return[this.parseSwitch()];case"try":return this.parseTry();case"break":{this.next();const t=this.eat(";");t||this.missingAfter(e,";");const n=this.trailingComment(t??e);return[this.record(ze(I.aussprung,{textLines:[n]}),e.line,e.line)]}case"else":return this.problem("web_parse_else_without_if",this.next()),[];case"case":case"default":for(this.problem("web_parse_case_outside_switch",this.next());this.tok&&!this.is(":")&&!this.is("->")&&!this.is(";");)this.next();return this.next(),[]}return this.is("{")?this.parseBlock().elements:this.is(";")?(this.next(),[this.record(ze(I.anweisung),e.line,e.line)]):this.parseSimple()}parseTry(){const e=this.next();let t=e;const n=(r,o)=>{t=this.next();let u=1;for(;this.tok;){const m=this.next();if(t=m,m.kind!=="str"){if(m.text===r)u++;else if(m.text===o&&--u===0)return!0}}return this.missingAfter(t,o),!1};let a=!0;for(this.is("(")&&(a=n("(",")")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{");a&&(this.is("catch")||this.is("finally"));){const r=this.next().text==="catch";t=this.prev(),r&&(this.is("(")?a=n("(",")"):this.missingAfter(t,"(")),a&&this.is("{")?a=n("{","}"):a&&this.missingAfter(t,"{")}const s=this.text(e.start,t.end).replace(/\s+/g," ");return[this.record(ze(I.anweisung,{textLines:[s]}),e.line,t.line)]}trailingComment(e){const t=this.comments.find(a=>a.start>=e.end&&a.line===e.line),n=this.toks.find(a=>a.start>=e.end);return!t||n&&n.start1;)m.push("");const c=this.parseBody();return this.record(ze(I.forSchleife,{textLines:m,loopBody:c.elements}),e.line,c.end)}parseSwitch(){const e=this.next(),t=this.parenthesized(e,this.labels.selector),n=[];let a=this.lineOf(this.prev());const s=this.eat("{");if(!s)this.missingAfter(this.prev(),"{");else{for(;this.tok&&!this.is("}");){if(!this.is("case")&&!this.is("default")){this.problem("web_parse_case_outside_switch",this.tok),this.parseStatement();continue}n.push(this.parseCase())}const o=this.eat("}");o||this.problem("web_parse_missing",s,"}"),a=this.lineOf(o??this.prev())}n.some(o=>o.isDefault)||n.push({name:"default",elements:[en()],isDefault:!0});const r=[...n.filter(o=>!o.isDefault),...n.filter(o=>o.isDefault)].map(({name:o,elements:l})=>({name:o,elements:l}));return this.record(ze(I.fallauswahl,{textLines:[t.text],cases:r}),e.line,a)}parseCase(){var l;const e=this.next(),t=e.text==="default",n=((l=this.tok)==null?void 0:l.start)??e.end;let a=n;for(;this.tok&&!this.is("->")&&!this.is(":")&&!this.is("{")&&!this.is("}");)a=this.next().end;const s=this.eat("->")??this.eat(":");s||this.missingAfter(this.prev(),"->");let r=t?"default":this.text(n,a),o=[];if((s==null?void 0:s.text)==="->")this.is("{")?(t&&(r=this.trailingComment(this.tok)||r),o=this.parseBlock().elements):this.tok&&!this.is("}")&&(o=this.parseStatement());else{for(t&&s&&(r=this.trailingComment(s)||r);this.tok&&!this.is("case")&&!this.is("default")&&!this.is("}");)o.push(...this.parseStatement());const u=o[o.length-1];(u==null?void 0:u.element.type)===I.aussprung&&u.element.textLines.every(m=>m==="")&&o.pop()}return{name:r,elements:this.finishList(o),isDefault:t}}parseSimple(){const e=this.next();let t=e;const n=e.text==="("||e.text==="["||e.text==="{"?[e.text]:[],a=()=>n.length>0&&n[n.length-1]==="{"&&e.text!=="{";let s;for(;this.tok;){const u=this.tok;if(u.text===";"&&u.kind==="op"&&!a()){s=this.next();break}if(u.line!==t.line&&!a()&&(n.length===0||u.kind==="id"&&yr.has(u.text)||u.text==="}")||u.text==="}"&&n.length===0)break;(u.text==="("||u.text==="["||u.text==="{")&&n.push(u.text),(u.text===")"||u.text==="]"||u.text==="}")&&n.pop(),t=this.next()}s||this.missingAfter(t,";"),this.checkBrackets(e,t);const r=this.text(e.start,t.end),o=this.simpleElement(r);if(!o)return[];const l=this.record(o.element,e.line,t.line);return l.prompt=o.prompt,[l]}checkBrackets(e,t){const n=[],a={")":"(","]":"[","}":"{"},s={"(":")","[":"]","{":"}"};for(let r=this.toks.indexOf(e);r>=0&&rze(I.anweisung,{textLines:[u]}),a=/^System\.out\.println\s*\(([\s\S]*?)\)?$/.exec(e);if(a){const u=a[1].trim();if(u==="")return{element:n("output: ")};const m=/^"((?:[^"\\]|\\.)*)"$/.exec(u),c=m?tZ(m[1]):void 0;return{element:n(`output: ${u}`),prompt:c!==void 0&&!c.includes('"')?c:void 0}}const s=new RegExp(`^(?:(${om})\\s+)?([A-Za-z_]\\w*(?:\\s*\\[[^\\]]+\\])*)\\s*=\\s*\\w+\\.(nextInt|nextDouble|nextLine|next|nextBoolean)\\s*\\(\\s*\\)$`).exec(e);if(s&&!this.fileScanners.has(e.replace(/^[\s\S]*=\s*(\w+)\.\w+\s*\(\s*\)$/,"$1"))){const u={nextInt:"int",nextDouble:"double",nextLine:"String",next:"String",nextBoolean:"boolean"}[s[3]],m=s[2].replace(/\s+/g,"");if((s[1]===u||!s[1]&&m.includes("["))&&u)return{element:n(`input: ${u} ${m}`)}}const r=new RegExp(`^final\\s+(${om}\\s+[\\s\\S]*)$`).exec(e);if(r)return{element:n(`const ${r[1]}`)};const o=/^(?:(?:\w+\s+)?\w+\s*=\s*)?([A-Za-z_]\w*)\s*\(/.exec(e);return o&&((l=this.opts.subprograms)!=null&&l.has(o[1]))?{element:ze(I.aufruf,{textLines:[e]})}:{element:n(e)}}spansFor(e,t=[],n=[]){return e.forEach((a,s)=>{var l;const r=[...t,s],o=this.lines.get(a);o&&n.push({path:r,from:o[0],to:o[1]}),a.loopBody&&this.spansFor(a.loopBody,[...r,0],n),(l=a.cases)==null||l.forEach((u,m)=>this.spansFor(u.elements,[...r,m],n))}),n}isCodePlaceholder(e){return e.text.startsWith("//")&&e.text.slice(2).trim()===this.labels.code}markPlaceholderComments(){for(const e of this.comments)this.isCodePlaceholder(e)&&this.placeholders.push({from:e.start,to:e.end})}};function tZ(i){return i.replace(/\\(.)/g,(e,t)=>({n:` +`,r:"\r",t:" "})[t]??t)}function jo(i,e,t={}){const n=new eZ(i,e,t),{caption:a,elements:s}=n.parseProgram();n.markPlaceholderComments(),n.checkImports(),n.checkScanners(),n.checkTypes();const r=n.spansFor(s),o=n.problems.sort((l,u)=>l.from-u.from);return{caption:a,className:n.className,elements:s,spans:r,placeholders:n.placeholders.sort((l,u)=>l.from-u.from),problems:o}}const r0={asClass:!1,withMain:!1},lm=i=>/^import\s+[\w.]+(?:\.\*)?\s*;$/.test(i.trim()),um=i=>i.map(e=>e.trim()===""?"":" "+e);function sg(i,e,t=r0){var u;const n=_h(i,"java",e);let a=n.text.replaceAll(Mi,"").replaceAll(ql,"").split(` +`),s=n.spans;const r=m=>s=s.map(c=>({...c,from:c.from+m,to:c.to+m})),o=yt(i.caption)!==void 0,l=[];if(t.withMain&&!o||t.asClass){for(let m=a.findIndex(lm);m>=0;m=a.findIndex(lm))l.push(a[m].trim()),a.splice(m,1),s=s.map(c=>({...c,from:c.from>m?c.from-1:c.from,to:c.to>m?c.to-1:c.to}));l.length&&((u=a[0])==null?void 0:u.trim())===""&&(a.splice(0,1),s=s.map(m=>({...m,from:m.from>0?m.from-1:m.from,to:m.to>0?m.to-1:m.to}))),l.length&&l.push("")}return t.withMain&&!o&&(a=[`public static void main(String[] args)${ex(i)?" throws Exception":""} {`,...um(a),"}"],r(1)),t.asClass&&(a=[`public class ${Gs(o?"Main":i.caption)} {`,...um(a),"}"],r(1)),l.length&&(a=[...l,...a],r(l.length)),{text:a.join(` +`),spans:s}}function oi(i,e,t=r0){return sg(i,e,t).text}function wr(i){const e=rg(i).code;return(e.trim()===""?i:e).replace(/\s+/g,"")}function rg(i){let e="";for(let t=0;tnew Array(a+1).fill(0));for(let u=n-1;u>=0;u--)for(let m=a-1;m>=0;m--)s[u][m]=t(i[u],e[m])?s[u+1][m+1]+1:Math.max(s[u+1][m],s[u][m+1]);const r=[];let o=0,l=0;for(;o=s[o][l+1])?r.push({kind:"del",a:o++}):r.push({kind:"ins",b:l++});return r}function cm(i,e,t,n,a={},s=r0){const r=oi(t,n,s),o=oi(e,n,s);if(i===o)return r;const l=o.split(` `),u=r.split(` `),m=i.split(` -`),c=new Array(l.length).fill(-1);for(const y of mm(l,m,(w,_)=>wr(w)!==""&&wr(w)===wr(_)))y.kind==="keep"&&(c[y.a]=y.b);const d=[];let h=0,g="";const f=y=>{for(;hw===_))if(y.kind==="keep")c[y.a]>=0&&(f(c[y.a]+1),g="");else if(y.kind==="del"){const w=c[y.a];if(w<0)continue;f(w),g||(g=sg(m[w]).comment),h=w+1}else{const w=u[y.b];d.push(g&&w.trim()!==""?`${w} ${g}`:w),w.trim()!==""&&(g="")}f(m.length);const x=d.join(` -`),b=jo(x,n,a);return oi(Co(t,b),n,s)===r?x:r}function Co(i,e){let t=e.caption??(yt(i.caption)?"":i.caption);return!e.caption&&e.className&&Gs(t)!==e.className&&(t=e.className),{...i,caption:t,elements:Bo(i.elements,e.elements)}}function Bo(i,e){return e.map((t,n)=>{const a=i[n];if(!a||a.type!==t.type)return t;const s={...t,zoomX:a.zoomX,zoomY:a.zoomY};return a.textColor&&(s.textColor=a.textColor),a.backgroundColor&&(s.backgroundColor=a.backgroundColor),t.loopBody&&(s.loopBody=Bo(a.loopBody??[],t.loopBody)),t.cases&&(s.cases=t.cases.map((r,o)=>{var l,u;return{...r,elements:Bo(((u=(l=a.cases)==null?void 0:l[o])==null?void 0:u.elements)??[],r.elements)}})),s})}let Do=[],rg=[];(()=>{let i="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(i=rg[n])e=n+1;else return!0;if(e==t)return!1}}function dm(i){return i>=127462&&i<=127487}const hm=8205;function nZ(i,e,t=!0,n=!0){return(t?og:iZ)(i,e,n)}function og(i,e,t){if(e==i.length)return e;e&&lg(i.charCodeAt(e))&&ug(i.charCodeAt(e-1))&&e--;let n=zr(i,e);for(e+=gm(n);e=0&&dm(zr(i,r));)s++,r-=2;if(s%2==0)break;e+=2}else break}return e}function iZ(i,e,t){for(;e>1;){let n=og(i,e-2,t);if(n=56320&&i<57344}function ug(i){return i>=55296&&i<56320}function gm(i){return i<65536?1:2}class ae{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=O1(this,e,t);let a=[];return this.decompose(0,e,a,2),n.length&&n.decompose(0,n.length,a,3),this.decompose(t,this.length,a,1),tn.from(a,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=O1(this,e,t);let n=[];return this.decompose(e,t,n,0),tn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),a=new li(this),s=new li(e);for(let r=t,o=t;;){if(a.next(r),s.next(r),r=0,a.lineBreak!=s.lineBreak||a.done!=s.done||a.value!=s.value)return!1;if(o+=a.value.length,a.done||o>=n)return!0}}iter(e=1){return new li(this,e)}iterRange(e,t=this.length){return new mg(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t==null&&(t=this.lines+1);let a=this.line(e).from;n=this.iterRange(a,Math.max(a,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new cg(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?ae.empty:e.length<=32?new Se(e):tn.from(Se.split(e,[]))}}class Se extends ae{constructor(e,t=aZ(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.text[s],o=a+r.length;if((t?n:o)>=e)return new sZ(a,o,n,r);a=o+1,n++}}decompose(e,t,n,a){let s=e<=0&&t>=this.length?this:new Se(pm(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(a&1){let r=n.pop(),o=Ea(s.text,r.text.slice(),0,s.length);if(o.length<=32)n.push(new Se(o,r.length+s.length));else{let l=o.length>>1;n.push(new Se(o.slice(0,l)),new Se(o.slice(l)))}}else n.push(s)}replace(e,t,n){if(!(n instanceof Se))return super.replace(e,t,n);[e,t]=O1(this,e,t);let a=Ea(this.text,Ea(n.text,pm(this.text,0,e)),t),s=this.length+n.length-(t-e);return a.length<=32?new Se(a,s):tn.from(Se.split(a,[]),s)}sliceString(e,t=this.length,n=` -`){[e,t]=O1(this,e,t);let a="";for(let s=0,r=0;s<=t&&re&&r&&(a+=n),es&&(a+=o.slice(Math.max(0,e-s),t-s)),s=l+1}return a}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let n=[],a=-1;for(let s of e)n.push(s),a+=s.length+1,n.length==32&&(t.push(new Se(n,a)),n=[],a=-1);return a>-1&&t.push(new Se(n,a)),t}}class tn extends ae{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let n of e)this.lines+=n.lines}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.children[s],o=a+r.length,l=n+r.lines-1;if((t?l:o)>=e)return r.lineInner(e,t,n,a);a=o+1,n=l+1}}decompose(e,t,n,a){for(let s=0,r=0;r<=t&&s=r){let u=a&((r<=e?1:0)|(l>=t?2:0));r>=e&&l<=t&&!u?n.push(o):o.decompose(e-r,t-r,n,u)}r=l+1}}replace(e,t,n){if([e,t]=O1(this,e,t),n.lines=s&&t<=o){let l=r.replace(e-s,t-s,n),u=this.lines-r.lines+l.lines;if(l.lines>4&&l.lines>u>>6){let m=this.children.slice();return m[a]=l,new tn(m,this.length-(t-e)+n.length)}return super.replace(s,o,l)}s=o+1}return super.replace(e,t,n)}sliceString(e,t=this.length,n=` -`){[e,t]=O1(this,e,t);let a="";for(let s=0,r=0;se&&s&&(a+=n),er&&(a+=o.sliceString(e-r,t-r,n)),r=l+1}return a}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof tn))return 0;let n=0,[a,s,r,o]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;a+=t,s+=t){if(a==r||s==o)return n;let l=this.children[a],u=e.children[s];if(l!=u)return n+l.scanIdentical(u,t);n+=l.length+1}}static from(e,t=e.reduce((n,a)=>n+a.length+1,-1)){let n=0;for(let h of e)n+=h.lines;if(n<32){let h=[];for(let g of e)g.flatten(h);return new Se(h,t)}let a=Math.max(32,n>>5),s=a<<1,r=a>>1,o=[],l=0,u=-1,m=[];function c(h){let g;if(h.lines>s&&h instanceof tn)for(let f of h.children)c(f);else h.lines>r&&(l>r||!l)?(d(),o.push(h)):h instanceof Se&&l&&(g=m[m.length-1])instanceof Se&&h.lines+g.lines<=32?(l+=h.lines,u+=h.length+1,m[m.length-1]=new Se(g.text.concat(h.text),g.length+1+h.length)):(l+h.lines>a&&d(),l+=h.lines,u+=h.length+1,m.push(h))}function d(){l!=0&&(o.push(m.length==1?m[0]:tn.from(m,u)),u=-1,l=m.length=0)}for(let h of e)c(h);return d(),o.length==1?o[0]:new tn(o,t)}}ae.empty=new Se([""],0);function aZ(i){let e=-1;for(let t of i)e+=t.length+1;return e}function Ea(i,e,t=0,n=1e9){for(let a=0,s=0,r=!0;s=t&&(l>n&&(o=o.slice(0,n-a)),a0?1:(e instanceof Se?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,a=this.nodes[n],s=this.offsets[n],r=s>>1,o=a instanceof Se?a.text.length:a.children.length;if(r==(t>0?o:0)){if(n==0)return this.done=!0,this.value="",this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((s&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=` -`,this;e--}else if(a instanceof Se){let l=a.text[r+(t<0?-1:0)];if(this.offsets[n]+=t,l.length>Math.max(0,e))return this.value=e==0?l:t>0?l.slice(e):l.slice(0,l.length-e),this;e-=l.length}else{let l=a.children[r+(t<0?-1:0)];e>l.length?(e-=l.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(l),this.offsets.push(t>0?1:(l instanceof Se?l.text.length:l.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class mg{constructor(e,t,n){this.value="",this.done=!1,this.cursor=new li(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:a}=this.cursor.next(e);return this.pos+=(a.length+e)*t,this.value=a.length<=n?a:t<0?a.slice(a.length-n):a.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class cg{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:n,value:a}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):n?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=a,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(ae.prototype[Symbol.iterator]=function(){return this.iter()},li.prototype[Symbol.iterator]=mg.prototype[Symbol.iterator]=cg.prototype[Symbol.iterator]=function(){return this});class sZ{constructor(e,t,n,a){this.from=e,this.to=t,this.number=n,this.text=a}get length(){return this.to-this.from}}function O1(i,e,t){return e=Math.max(0,Math.min(i.length,e)),[e,Math.max(e,Math.min(i.length,t))]}function Ke(i,e,t=!0,n=!0){return nZ(i,e,t,n)}function rZ(i){return i>=56320&&i<57344}function oZ(i){return i>=55296&&i<56320}function _t(i,e){let t=i.charCodeAt(e);if(!oZ(t)||e+1==i.length)return t;let n=i.charCodeAt(e+1);return rZ(n)?(t-55296<<10)+(n-56320)+65536:t}function dg(i){return i<=65535?String.fromCharCode(i):(i-=65536,String.fromCharCode((i>>10)+55296,(i&1023)+56320))}function un(i){return i<65536?1:2}const Zo=/\r\n?|\n/;var Xe=(function(i){return i[i.Simple=0]="Simple",i[i.TrackDel=1]="TrackDel",i[i.TrackBefore=2]="TrackBefore",i[i.TrackAfter=3]="TrackAfter",i})(Xe||(Xe={}));class cn{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-a);s+=o}else{if(n!=Xe.Simple&&u>=e&&(n==Xe.TrackDel&&ae||n==Xe.TrackBefore&&ae))return null;if(u>e||u==e&&t<0&&!o)return e==a||t<0?s:s+l;s+=l}a=u}if(e>a)throw new RangeError(`Position ${e} is out of range for changeset of length ${a}`);return s}touchesRange(e,t=e){for(let n=0,a=0;n=0&&a<=t&&o>=e)return at?"cover":!0;a=o}return!1}toString(){let e="";for(let t=0;t=0?":"+a:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new cn(e)}static create(e){return new cn(e)}}class Me extends cn{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Mo(this,(t,n,a,s,r)=>e=e.replace(a,a+(n-t),r),!1),e}mapDesc(e,t=!1){return Lo(this,e,t,!0)}invert(e){let t=this.sections.slice(),n=[];for(let a=0,s=0;a=0){t[a]=o,t[a+1]=r;let l=a>>1;for(;n.length0&&On(n,t,s.text),s.forward(m),o+=m}let u=e[r++];for(;o>1].toJSON()))}return e}static of(e,t,n){let a=[],s=[],r=0,o=null;function l(m=!1){if(!m&&!a.length)return;rd||c<0||d>t)throw new RangeError(`Invalid change range ${c} to ${d} (in doc of length ${t})`);let g=h?typeof h=="string"?ae.of(h.split(n||Zo)):h:ae.empty,f=g.length;if(c==d&&f==0)return;cr&&Ye(a,c-r,-1),Ye(a,d-c,f),On(s,a,g),r=d}}return u(e),l(!o),o}static empty(e){return new Me(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],n=[];for(let a=0;ao&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(s.length==1)t.push(s[0],0);else{for(;n.length=0&&t<=0&&t==i[a+1]?i[a]+=e:a>=0&&e==0&&i[a]==0?i[a+1]+=t:n?(i[a]+=e,i[a+1]+=t):i.push(e,t)}function On(i,e,t){if(t.length==0)return;let n=e.length-2>>1;if(n>1])),!(t||r==i.sections.length||i.sections[r+1]<0);)o=i.sections[r++],l=i.sections[r++];e(a,u,s,m,c),a=u,s=m}}}function Lo(i,e,t,n=!1){let a=[],s=n?[]:null,r=new zi(i),o=new zi(e);for(let l=-1;;){if(r.done&&o.len||o.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&o.ins==-1){let u=Math.min(r.len,o.len);Ye(a,u,-1),r.forward(u),o.forward(u)}else if(o.ins>=0&&(r.ins<0||l==r.i||r.off==0&&(o.len=0&&l=0){let u=0,m=r.len;for(;m;)if(o.ins==-1){let c=Math.min(m,o.len);u+=c,m-=c,o.forward(c)}else if(o.ins==0&&o.lenl||r.ins>=0&&r.len>l)&&(o||n.length>u),s.forward2(l),r.forward(l)}}}}class zi{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?ae.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?ae.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class Sn{constructor(e,t,n,a){this.from=e,this.to=t,this.flags=n,this.goalColumn=a}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(e,t=-1){let n,a;return this.empty?n=a=e.mapPos(this.from,t):(n=e.mapPos(this.from,1),a=e.mapPos(this.to,-1)),n==this.from&&a==this.to?this:new Sn(n,a,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return C.range(e,t,void 0,void 0,n);let a=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return C.range(this.anchor,a,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return C.range(e.anchor,e.head)}static create(e,t,n,a){return new Sn(e,t,n,a)}}class C{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:C.create(this.ranges.map(n=>n.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;ne.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new C(e.ranges.map(t=>Sn.fromJSON(t)),e.main)}static single(e,t=e){return new C([C.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let n=0,a=0;aa.from-s.from),t=e.indexOf(n);for(let a=1;as.head?C.range(l,o):C.range(o,l))}}return new C(e,t)}}function gg(i,e){for(let t of i.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let o0=0;class G{constructor(e,t,n,a,s){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=a,this.id=o0++,this.default=e([]),this.extensions=typeof s=="function"?s(this):s}get reader(){return this}static define(e={}){return new G(e.combine||(t=>t),e.compareInput||((t,n)=>t===n),e.compare||(e.combine?(t,n)=>t===n:l0),!!e.static,e.enables)}of(e){return new Na([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Na(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Na(e,this,2,t)}from(e,t){return t||(t=n=>n),this.compute([e],n=>t(n.field(e)))}}function l0(i,e){return i==e||i.length==e.length&&i.every((t,n)=>t===e[n])}class Na{constructor(e,t,n,a){this.dependencies=e,this.facet=t,this.type=n,this.value=a,this.id=o0++}dynamicSlot(e){var t;let n=this.value,a=this.facet.compareInput,s=this.id,r=e[s]>>1,o=this.type==2,l=!1,u=!1,m=[];for(let c of this.dependencies)c=="doc"?l=!0:c=="selection"?u=!0:(((t=e[c.id])!==null&&t!==void 0?t:1)&1)==0&&m.push(e[c.id]);return{create(c){return c.values[r]=n(c),1},update(c,d){if(l&&d.docChanged||u&&(d.docChanged||d.selection)||Wo(c,m)){let h=n(c);if(o?!fm(h,c.values[r],a):!a(h,c.values[r]))return c.values[r]=h,1}return 0},reconfigure:(c,d)=>{let h,g=d.config.address[s];if(g!=null){let f=ps(d,g);if(this.dependencies.every(x=>x instanceof G?d.facet(x)===c.facet(x):x instanceof Zt?d.field(x,!1)==c.field(x,!1):!0)||(o?fm(h=n(c),f,a):a(h=n(c),f)))return c.values[r]=f,0}else h=n(c);return c.values[r]=h,1}}}get extension(){return this}}function fm(i,e,t){if(i.length!=e.length)return!1;for(let n=0;ni[l.id]),a=t.map(l=>l.type),s=n.filter(l=>!(l&1)),r=i[e.id]>>1;function o(l){let u=[];for(let m=0;mn===a),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(ma).find(n=>n.field==this);return((t==null?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:n=>(n.values[t]=this.create(n),1),update:(n,a)=>{let s=n.values[t],r=this.updateF(s,a);return this.compareF(s,r)?0:(n.values[t]=r,1)},reconfigure:(n,a)=>{let s=n.facet(ma),r=a.facet(ma),o;return(o=s.find(l=>l.field==this))&&o!=r.find(l=>l.field==this)?(n.values[t]=o.create(n),1):a.config.address[this.id]!=null?(n.values[t]=a.field(this),0):(n.values[t]=this.create(n),1)}}}init(e){return[this,ma.of({field:this,create:e})]}get extension(){return this}}const Hn={lowest:4,low:3,default:2,high:1,highest:0};function R1(i){return e=>new pg(e,i)}const r1={highest:R1(Hn.highest),high:R1(Hn.high),default:R1(Hn.default),low:R1(Hn.low),lowest:R1(Hn.lowest)};class pg{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}}class Li{of(e){return new Eo(this,e)}reconfigure(e){return Li.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class Eo{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}}class gs{constructor(e,t,n,a,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=a,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,n){let a=[],s=Object.create(null),r=new Map;for(let d of uZ(e,t,r))d instanceof Zt?a.push(d):(s[d.facet.id]||(s[d.facet.id]=[])).push(d);let o=Object.create(null),l=[],u=[];for(let d of a)o[d.id]=u.length<<1,u.push(h=>d.slot(h));let m=n==null?void 0:n.config.facets;for(let d in s){let h=s[d],g=h[0].facet,f=m&&m[d]||[];if(h.every(x=>x.type==0))if(o[g.id]=l.length<<1|1,l0(f,h))l.push(n.facet(g));else{let x=g.combine(h.map(b=>b.value));l.push(n&&g.compare(x,n.facet(g))?n.facet(g):x)}else{for(let x of h)x.type==0?(o[x.id]=l.length<<1|1,l.push(x.value)):(o[x.id]=u.length<<1,u.push(b=>x.dynamicSlot(b)));o[g.id]=u.length<<1,u.push(x=>lZ(x,g,h))}}let c=u.map(d=>d(o));return new gs(e,r,c,o,l,s)}}function uZ(i,e,t){let n=[[],[],[],[],[]],a=new Map;function s(r,o){let l=a.get(r);if(l!=null){if(l<=o)return;let u=n[l].indexOf(r);u>-1&&n[l].splice(u,1),r instanceof Eo&&t.delete(r.compartment)}if(a.set(r,o),Array.isArray(r))for(let u of r)s(u,o);else if(r instanceof Eo){if(t.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let u=e.get(r.compartment)||r.inner;t.set(r.compartment,u),s(u,o)}else if(r instanceof pg)s(r.inner,r.prec);else if(r instanceof Zt)n[o].push(r),r.provides&&s(r.provides,o);else if(r instanceof Na)n[o].push(r),r.facet.extensions&&s(r.facet.extensions,Hn.default);else{let u=r.extension;if(!u)throw new Error(`Unrecognized extension value in extension set (${r}).`);if(u==r)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);s(u,o)}}return s(i,Hn.default),n.reduce((r,o)=>r.concat(o))}function ui(i,e){if(e&1)return 2;let t=e>>1,n=i.status[t];if(n==4)throw new Error("Cyclic dependency between fields and/or facets");if(n&2)return n;i.status[t]=4;let a=i.computeSlot(i,i.config.dynamicSlots[t]);return i.status[t]=2|a}function ps(i,e){return e&1?i.config.staticValues[e>>1]:i.values[e>>1]}const fg=G.define(),No=G.define({combine:i=>i.some(e=>e),static:!0}),xg=G.define({combine:i=>i.length?i[0]:void 0,static:!0}),bg=G.define(),yg=G.define(),vg=G.define(),wg=G.define({combine:i=>i.length?i[0]:!1});class Ln{constructor(e,t){this.type=e,this.value=t}static define(){return new mZ}}class mZ{of(e){return new Ln(this,e)}}class cZ{constructor(e){this.map=e}of(e){return new re(this,e)}}class re{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new re(this.type,t)}is(e){return this.type==e}static define(e={}){return new cZ(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let a of e){let s=a.map(t);s&&n.push(s)}return n}}re.reconfigure=re.define();re.appendConfig=re.define();class Re{constructor(e,t,n,a,s,r){this.startState=e,this.changes=t,this.selection=n,this.effects=a,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,n&&gg(n,t.newLength),s.some(o=>o.type==Re.time)||(this.annotations=s.concat(Re.time.of(Date.now())))}static create(e,t,n,a,s,r){return new Re(e,t,n,a,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(Re.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}Re.time=Ln.define();Re.userEvent=Ln.define();Re.addToHistory=Ln.define();Re.remote=Ln.define();function dZ(i,e){let t=[];for(let n=0,a=0;;){let s,r;if(n=i[n]))s=i[n++],r=i[n++];else if(a=0;a--){let s=n[a](i);s instanceof Re?i=s:Array.isArray(s)&&s.length==1&&s[0]instanceof Re?i=s[0]:i=Ig(e,z1(s),!1)}return i}function gZ(i){let e=i.startState,t=e.facet(vg),n=i;for(let a=t.length-1;a>=0;a--){let s=t[a](i);s&&Object.keys(s).length&&(n=zg(n,Fo(e,s,i.changes.newLength),!0))}return n==i?i:Re.create(e,i.changes,i.selection,n.effects,n.annotations,n.scrollIntoView)}const pZ=[];function z1(i){return i==null?pZ:Array.isArray(i)?i:[i]}var Pt=(function(i){return i[i.Word=0]="Word",i[i.Space=1]="Space",i[i.Other=2]="Other",i})(Pt||(Pt={}));const fZ=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let Jo;try{Jo=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function xZ(i){if(Jo)return Jo.test(i);for(let e=0;e"€"&&(t.toUpperCase()!=t.toLowerCase()||fZ.test(t)))return!0}return!1}function bZ(i){return e=>{if(!/\S/.test(e))return Pt.Space;if(xZ(e))return Pt.Word;for(let t=0;t-1)return Pt.Word;return Pt.Other}}class ne{constructor(e,t,n,a,s,r){this.config=e,this.doc=t,this.selection=n,this.values=a,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let o=0;oa.set(u,l)),t=null),a.set(o.value.compartment,o.value.extension)):o.is(re.reconfigure)?(t=null,n=o.value):o.is(re.appendConfig)&&(t=null,n=z1(n).concat(o.value));let s;t?s=e.startState.values.slice():(t=gs.resolve(n,a,this),s=new ne(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,u)=>u.reconfigure(l,this),null).values);let r=e.startState.facet(No)?e.newSelection:e.newSelection.asSingle();new ne(t,e.newDoc,r,s,(o,l)=>l.update(o,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:C.cursor(t.from+e.length,-1)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),a=this.changes(n.changes),s=[n.range],r=z1(n.effects);for(let o=1;or.spec.fromJSON(o,l)))}}return ne.create({doc:e.doc,selection:C.fromJSON(e.selection),extensions:t.extensions?a.concat([t.extensions]):a})}static create(e={}){let t=gs.resolve(e.extensions||[],new Map),n=e.doc instanceof ae?e.doc:ae.of((e.doc||"").split(t.staticFacet(ne.lineSeparator)||Zo)),a=e.selection?e.selection instanceof C?e.selection:C.single(e.selection.anchor,e.selection.head):C.single(0);return gg(a,n.length),t.staticFacet(No)||(a=a.asSingle()),new ne(t,n,a,t.dynamicSlots.map(()=>null),(s,r)=>r.create(s),null)}get tabSize(){return this.facet(ne.tabSize)}get lineBreak(){return this.facet(ne.lineSeparator)||` -`}get readOnly(){return this.facet(wg)}phrase(e,...t){for(let n of this.facet(ne.phrases))if(Object.prototype.hasOwnProperty.call(n,e)){e=n[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(n,a)=>{if(a=="$")return"$";let s=+(a||1);return!s||s>t.length?n:t[s-1]})),e}languageDataAt(e,t,n=-1){let a=[];for(let s of this.facet(fg))for(let r of s(this,t,n))Object.prototype.hasOwnProperty.call(r,e)&&a.push(r[e]);return a}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return bZ(t.length?t[0]:"")}wordAt(e){let{text:t,from:n,length:a}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-n,o=e-n;for(;r>0;){let l=Ke(t,r,!1);if(s(t.slice(l,r))!=Pt.Word)break;r=l}for(;oi.length?i[0]:4});ne.lineSeparator=xg;ne.readOnly=wg;ne.phrases=G.define({compare(i,e){let t=Object.keys(i),n=Object.keys(e);return t.length==n.length&&t.every(a=>i[a]==e[a])}});ne.languageData=fg;ne.changeFilter=bg;ne.transactionFilter=yg;ne.transactionExtender=vg;Li.reconfigure=re.define();function u0(i,e,t={}){let n={};for(let a of i)for(let s of Object.keys(a)){let r=a[s],o=n[s];if(o===void 0)n[s]=r;else if(!(o===r||r===void 0))if(Object.hasOwnProperty.call(t,s))n[s]=t[s](o,r);else throw new Error("Config merge conflict for field "+s)}for(let a in e)n[a]===void 0&&(n[a]=e[a]);return n}class Cn{eq(e){return this==e}range(e,t=e){return Ro.create(e,t,this)}}Cn.prototype.startSide=Cn.prototype.endSide=0;Cn.prototype.point=!1;Cn.prototype.mapMode=Xe.TrackDel;function m0(i,e){return i==e||i.constructor==e.constructor&&i.eq(e)}let Ro=class kg{constructor(e,t,n){this.from=e,this.to=t,this.value=n}static create(e,t,n){return new kg(e,t,n)}};function Go(i,e){return i.from-e.from||i.value.startSide-e.value.startSide}class c0{constructor(e,t,n,a){this.from=e,this.to=t,this.value=n,this.maxPoint=a}get length(){return h1(this.to)}findIndex(e,t,n,a=0){let s=n?this.to:this.from;for(let r=a,o=s.length;;){if(r==o)return r;let l=r+o>>1,u=s[l]-e||(n?this.value[l].endSide:this.value[l].startSide)-t;if(l==r)return u>=0?r:o;u>=0?o=l:r=l+1}}between(e,t,n,a){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(n,1e9,!1,s);sx||f==x&&d.startSide>0&&d.endSide<=0)continue;if(!((x-f||d.endSide-d.startSide)<0))if(u<0&&(u=f),d.point&&(m=Math.max(m,x-f)),(f-n||d.startSide-a)>=0)r.push(d),o.push(f-u),l.push(x-u),n=x,a=d.endSide;else{if(f==x)for(let b=r.length;b>0;b--){if((f-(l[b-1]+u)||d.startSide-r[b-1].endSide)>=0){r.splice(b,0,d),o.splice(b,0,f-u),l.splice(b,0,x-u);continue e}if((f-(o[b-1]+u)||d.endSide-r[b-1].startSide)>0)break}s(f,x,d)}}return{mapped:r.length?new c0(o,l,r,m):null,pos:u}}}class Y{constructor(e,t,n,a){this.chunkPos=e,this.chunk=t,this.nextLayer=n,this.maxPoint=a}static create(e,t,n,a){return new Y(e,t,n,a)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:n=!1,filterFrom:a=0,filterTo:s=this.length}=e,r=e.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(Go)),this.isEmpty)return t.length?Y.of(t):this;let o=new Sg(this,null,-1).goto(0),l=0,u=[],m=new e1;for(;o.value||l=0){let c=t[l++];m.addInner(c.from,c.to,c.value,!1)||u.push(c)}else o.rangeIndex==1&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s{s||(s=new e1),s.addRange(l,u,m,!1)};for(let l=0;l=s&&e<=s+r.length&&r.between(s,e-s,t-s,n)===!1)return}this.nextLayer.between(e,t,n)}}iter(e=0){return Ii.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Ii.from(e).goto(t)}static compare(e,t,n,a,s=-1){let r=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),l=xm(r,o,n),u=new G1(r,l,s),m=new G1(o,l,s);n.iterGaps((c,d,h)=>bm(u,c,m,d,h,a)),n.empty&&n.length==0&&bm(u,0,m,0,0,a)}static eq(e,t,n=0,a){a==null&&(a=999999999);let s=e.filter(m=>!m.isEmpty&&t.indexOf(m)<0),r=t.filter(m=>!m.isEmpty&&e.indexOf(m)<0);if(s.length!=r.length)return!1;if(!s.length)return!0;let o=xm(s,r),l=new G1(s,o,0).goto(n),u=new G1(r,o,0).goto(n);for(;;){if(l.to!=u.to||!Ho(l.active,u.active)||l.point&&(!u.point||!m0(l.point,u.point)))return!1;if(l.to>a)return!0;l.next(),u.next()}}static spans(e,t,n,a,s=-1){let r=new G1(e,null,s).goto(t),o=t,l=r.openStart;for(;;){let u=Math.min(r.to,n);if(r.point){let m=r.activeForPoint(r.to),c=r.pointFromo&&(a.span(o,u,r.active,l),l=r.openEnd(u));if(r.to>n)return l+(r.point&&r.to>n?1:0);o=r.to,r.next()}}static of(e,t=!1){let n=new e1;for(let a of e instanceof Ro?[e]:t?yZ(e):e)n.add(a.from,a.to,a.value);return n.finish()}static join(e){if(!e.length)return Y.empty;let t=h1(e);for(let n=e.length-2;n>=0;n--)for(let a=e[n];a!=Y.empty;a=a.nextLayer)t=new Y(a.chunkPos,a.chunk,t,Math.max(a.maxPoint,t.maxPoint));return t}}Y.empty=new Y([],[],null,-1);function h1(i){return i[i.length-1]}function yZ(i){if(i.length>1)for(let e=i[0],t=1;t0)return i.slice().sort(Go);e=n}return i}Y.empty.nextLayer=Y.empty;class e1{finishChunk(e){this.chunks.push(new c0(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,n){this.addRange(e,t,n,!0)}addRange(e,t,n,a){this.addInner(e,t,n,a)||(this.nextLayer||(this.nextLayer=new e1)).addRange(e,t,n,a)}addInner(e,t,n,a){let s=e-this.lastTo||n.startSide-this.last.endSide;if(a&&s<=0&&(e-this.lastFrom||n.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=n,this.lastFrom=e,this.lastTo=t,this.value.push(n),n.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let n=t.value.length-1;return this.last=t.value[n],this.lastFrom=t.from[n]+e,this.lastTo=t.to[n]+e,!0}finish(){return this.finishInner(Y.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=Y.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function xm(i,e,t){let n=new Map;for(let s of i)for(let r=0;r=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=n&&a.push(new Sg(r,t,n,s));return a.length==1?a[0]:new Ii(a)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let n of this.heap)n.goto(e,t);for(let n=this.heap.length>>1;n>=0;n--)Ir(this.heap,n);return this.next(),this}forward(e,t){for(let n of this.heap)n.forward(e,t);for(let n=this.heap.length>>1;n>=0;n--)Ir(this.heap,n);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Ir(this.heap,0)}}}function Ir(i,e){for(let t=i[e];;){let n=(e<<1)+1;if(n>=i.length)break;let a=i[n];if(n+1=0&&(a=i[n+1],n++),t.compare(a)<0)break;i[n]=t,i[e]=a,e=n}}class G1{constructor(e,t,n){this.minPoint=n,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ii.from(e,t,n)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){ca(this.active,e),ca(this.activeTo,e),ca(this.activeRank,e),this.minActive=ym(this.active,this.activeTo)}addActive(e){let t=0,{value:n,to:a,rank:s}=this.cursor;for(;t0;)t++;da(this.active,t,n),da(this.activeTo,t,a),da(this.activeRank,t,s),e&&da(e,t,this.cursor.from),this.minActive=ym(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let n=this.openStart<0?[]:null;for(;;){let a=this.minActive;if(a>-1&&(this.activeTo[a]-this.cursor.from||this.active[a].endSide-this.cursor.startSide)<0){if(this.activeTo[a]>e){this.to=this.activeTo[a],this.endSide=this.active[a].endSide;break}this.removeActive(a),n&&ca(n,a)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let s=this.cursor.value;if(!s.point)this.addActive(n),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&n[a]=0&&!(this.activeRank[n]e||this.activeTo[n]==e&&this.active[n].endSide>=this.point.endSide)&&t.push(this.active[n]);return t.reverse()}openEnd(e){let t=0;for(let n=this.activeTo.length-1;n>=0&&this.activeTo[n]>e;n--)t++;return t}}function bm(i,e,t,n,a,s){i.goto(e),t.goto(n);let r=n+a,o=n,l=n-e,u=!!s.boundChange;for(let m=!1;;){let c=i.to+l-t.to,d=c||i.endSide-t.endSide,h=d<0?i.to+l:t.to,g=Math.min(h,r);if(i.point||t.point?(i.point&&t.point&&m0(i.point,t.point)&&Ho(i.activeForPoint(i.to),t.activeForPoint(t.to))||s.comparePoint(o,g,i.point,t.point),m=!1):(m&&(s.boundChange(o),m=!1),g>o&&!Ho(i.active,t.active)&&s.compareRange(o,g,i.active,t.active),u&&gr)break;o=h,d<=0&&i.next(),d>=0&&t.next()}}function Ho(i,e){if(i.length!=e.length)return!1;for(let t=0;t=e;n--)i[n+1]=i[n];i[e]=t}function ym(i,e){let t=-1,n=1e9;for(let a=0;a=e)return a;if(a==i.length)break;s+=i.charCodeAt(a)==9?t-s%t:1,a=Ke(i,a)}return i.length}const Vo="ͼ",vm=typeof Symbol>"u"?"__"+Vo:Symbol.for(Vo),Qo=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),wm=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};class Bn{constructor(e,t){this.rules=[];let{finish:n}=t||{};function a(r){return/^@/.test(r)?[r]:r.split(/,\s*/)}function s(r,o,l,u){let m=[],c=/^@(\w+)\b/.exec(r[0]),d=c&&c[1]=="keyframes";if(c&&o==null)return l.push(r[0]+";");for(let h in o){let g=o[h];if(/&/.test(h))s(h.split(/,\s*/).map(f=>r.map(x=>f.replace(/&/,x))).reduce((f,x)=>f.concat(x)),g,l);else if(g&&typeof g=="object"){if(!c)throw new RangeError("The value of a property ("+h+") should be a primitive value.");s(a(h),g,m,d)}else g!=null&&m.push(h.replace(/_.*/,"").replace(/[A-Z]/g,f=>"-"+f.toLowerCase())+": "+g+";")}(m.length||d)&&l.push((n&&!c&&!u?r.map(n):r).join(", ")+" {"+m.join(" ")+"}")}for(let r in e)s(a(r),e[r],this.rules)}getRules(){return this.rules.join(` -`)}static newName(){let e=wm[vm]||1;return wm[vm]=e+1,Vo+e.toString(36)}static mount(e,t,n){let a=e[Qo],s=n&&n.nonce;a?s&&a.setNonce(s):a=new wZ(e,s),a.mount(Array.isArray(t)?t:[t],e)}}let zm=new Map;class wZ{constructor(e,t){let n=e.ownerDocument||e,a=n.defaultView;if(!e.head&&e.adoptedStyleSheets&&a.CSSStyleSheet){let s=zm.get(n);if(s)return e[Qo]=s;this.sheet=new a.CSSStyleSheet,zm.set(n,this)}else this.styleTag=n.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[Qo]=this}mount(e,t){let n=this.sheet,a=0,s=0,r=!1;for(let o=0;o-1&&(this.modules.splice(u,1),r=!0,s--,u=-1),u==-1){if(this.modules.splice(s++,0,l),r=!0,n)for(let m=0;m",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},zZ=typeof navigator<"u"&&/Mac/.test(navigator.platform),IZ=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var Je=0;Je<10;Je++)Dn[48+Je]=Dn[96+Je]=String(Je);for(var Je=1;Je<=24;Je++)Dn[Je+111]="F"+Je;for(var Je=65;Je<=90;Je++)Dn[Je]=String.fromCharCode(Je+32),ki[Je]=String.fromCharCode(Je);for(var kr in Dn)ki.hasOwnProperty(kr)||(ki[kr]=Dn[kr]);function kZ(i){var e=zZ&&i.metaKey&&i.shiftKey&&!i.ctrlKey&&!i.altKey||IZ&&i.shiftKey&&i.key&&i.key.length==1||i.key=="Unidentified",t=!e&&i.key||(i.shiftKey?ki:Dn)[i.keyCode]||i.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}let st=typeof navigator<"u"?navigator:{userAgent:"",vendor:"",platform:""},qo=typeof document<"u"?document:{documentElement:{style:{}}};const Uo=/Edge\/(\d+)/.exec(st.userAgent),_g=/MSIE \d/.test(st.userAgent),$o=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(st.userAgent),Vs=!!(_g||$o||Uo),Im=!Vs&&/gecko\/(\d+)/i.test(st.userAgent),Sr=!Vs&&/Chrome\/(\d+)/.exec(st.userAgent),km="webkitFontSmoothing"in qo.documentElement.style,Yo=!Vs&&/Apple Computer/.test(st.vendor),Sm=Yo&&(/Mobile\/\w+/.test(st.userAgent)||st.maxTouchPoints>2);var F={mac:Sm||/Mac/.test(st.platform),windows:/Win/.test(st.platform),linux:/Linux|X11/.test(st.platform),ie:Vs,ie_version:_g?qo.documentMode||6:$o?+$o[1]:Uo?+Uo[1]:0,gecko:Im,gecko_version:Im?+(/Firefox\/(\d+)/.exec(st.userAgent)||[0,0])[1]:0,chrome:!!Sr,chrome_version:Sr?+Sr[1]:0,ios:Sm,android:/Android\b/.test(st.userAgent),webkit:km,webkit_version:km?+(/\bAppleWebKit\/(\d+)/.exec(st.userAgent)||[0,0])[1]:0,safari:Yo,safari_version:Yo?+(/\bVersion\/(\d+(\.\d+)?)/.exec(st.userAgent)||[0,0])[1]:0,tabSize:qo.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function d0(i,e){for(let t in i)t=="class"&&e.class?e.class+=" "+i.class:t=="style"&&e.style?e.style+=";"+i.style:e[t]=i[t];return e}const fs=Object.create(null);function h0(i,e,t){if(i==e)return!0;i||(i=fs),e||(e=fs);let n=Object.keys(i),a=Object.keys(e);if(n.length-0!=a.length-0)return!1;for(let s of n)if(s!=t&&(a.indexOf(s)==-1||i[s]!==e[s]))return!1;return!0}function SZ(i,e){for(let t=i.attributes.length-1;t>=0;t--){let n=i.attributes[t].name;e[n]==null&&i.removeAttribute(n)}for(let t in e){let n=e[t];t=="style"?i.style.cssText=n:i.getAttribute(t)!=n&&i.setAttribute(t,n)}}function _m(i,e,t){let n=!1;if(e)for(let a in e)t&&a in t||(n=!0,a=="style"?i.style.cssText="":i.removeAttribute(a));if(t)for(let a in t)e&&e[a]==t[a]||(n=!0,a=="style"?i.style.cssText=t[a]:i.setAttribute(a,t[a]));return n}function _Z(i){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new a1(e,t,t,n,e.widget||null,!1)}static replace(e){let t=!!e.block,n,a;if(e.isBlockGap)n=-5e8,a=4e8;else{let{start:s,end:r}=Tg(e,t);n=(s?t?-3e8:-1:5e8)-1,a=(r?t?2e8:1:-6e8)+1}return new a1(e,n,a,t,e.widget||null,!0)}static line(e){return new Fi(e)}static set(e,t=!1){return Y.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}}ue.none=Y.empty;class Ni extends ue{constructor(e){let{start:t,end:n}=Tg(e);super(t?-1:5e8,n?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?d0(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||fs}eq(e){return this==e||e instanceof Ni&&this.tagName==e.tagName&&h0(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}Ni.prototype.point=!1;class Fi extends ue{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof Fi&&this.spec.class==e.spec.class&&h0(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}Fi.prototype.mapMode=Xe.TrackBefore;Fi.prototype.point=!0;class a1 extends ue{constructor(e,t,n,a,s,r){super(t,n,s,e),this.block=a,this.isReplace=r,this.mapMode=a?t<=0?Xe.TrackBefore:Xe.TrackAfter:Xe.TrackDel}get type(){return this.startSide!=this.endSide?Ge.WidgetRange:this.startSide<=0?Ge.WidgetBefore:Ge.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof a1&&TZ(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}a1.prototype.point=!0;function Tg(i,e=!1){let{inclusiveStart:t,inclusiveEnd:n}=i;return t==null&&(t=i.inclusive),n==null&&(n=i.inclusive),{start:t??e,end:n??e}}function TZ(i,e){return i==e||!!(i&&e&&i.compare(e))}function I1(i,e,t,n=0){let a=t.length-1;a>=0&&t[a]+n>=i?t[a]=Math.max(t[a],e):t.push(i,e)}class Si extends Cn{constructor(e,t,n){super(),this.tagName=e,this.attributes=t,this.rank=n}eq(e){return e==this||e instanceof Si&&this.tagName==e.tagName&&h0(this.attributes,e.attributes)}static create(e){return new Si(e.tagName,e.attributes||fs,e.rank==null?50:Math.max(0,Math.min(e.rank,100)))}static set(e,t=!1){return Y.of(e,t)}}Si.prototype.startSide=Si.prototype.endSide=-1;const We=i=>i.nodeType==1,A1=i=>i.nodeType==3;function _i(i){let e;return i.nodeType==11?e=i.getSelection?i:i.ownerDocument:e=i,e.getSelection()}function Xo(i,e){return e?i==e||i.contains(e.nodeType!=1?e.parentNode:e):!1}function mi(i,e){if(!e.anchorNode)return!1;try{return Xo(i,e.anchorNode)}catch{return!1}}function Fa(i){return A1(i)?Ti(i,0,i.nodeValue.length).getClientRects():We(i)?i.getClientRects():[]}function ci(i,e,t,n){return t?Tm(i,e,t,n,-1)||Tm(i,e,t,n,1):!1}function Zn(i){for(var e=0;;e++)if(i=i.previousSibling,!i)return e}function xs(i){return We(i)&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(i.nodeName)}function Tm(i,e,t,n,a){for(;;){if(i==t&&e==n)return!0;if(e==(a<0?0:pn(i))){if(i.nodeName=="DIV")return!1;let s=i.parentNode;if(!s||!We(s))return!1;e=Zn(i)+(a<0?0:1),i=s}else if(We(i)){if(i=i.childNodes[e+(a<0?-1:0)],We(i)&&(i.nodeName=="IMG"||i.nodeName=="BR"||i.contentEditable=="false"))return!1;e=a<0?pn(i):0}else return!1}}function pn(i){return A1(i)?i.nodeValue.length:i.childNodes.length}function bs(i,e){let{left:t,right:n}=i;if(t==n)return i;let a=e?t:n;return{left:a,right:a,top:i.top,bottom:i.bottom}}function OZ(i){let e=i.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:i.innerWidth,top:0,bottom:i.innerHeight}}function Og(i,e){let t=e.width/i.offsetWidth,n=e.height/i.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-i.offsetWidth)<1)&&(t=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-i.offsetHeight)<1)&&(n=1),{scaleX:t,scaleY:n}}function AZ(i,e,t,n,a,s,r,o){let l=i.ownerDocument,u=l.defaultView||window;for(let m=i,c=!1;m&&!c;)if(We(m)){let d,h=m==l.body,g=1,f=1,x=!0,b=!0;if(h)d=OZ(u);else{let _=getComputedStyle(m);if(/^(fixed|sticky)$/.test(_.position)&&(c=!0),(m.scrollHeight<=m.clientHeight||!/auto|scroll/.test(_.overflowY))&&(b=!1),(m.scrollWidth<=m.clientWidth||!/auto|scroll/.test(_.overflowX))&&(x=!1),!x&&!b){m=m.assignedSlot||m.parentNode;continue}let z=m.getBoundingClientRect();({scaleX:g,scaleY:f}=Og(m,z)),d={left:z.left,right:z.left+m.clientWidth*g,top:z.top,bottom:z.top+m.clientHeight*f}}let y=0,w=0;if(b)if(a=="nearest")e.top0&&e.bottom>d.bottom+w&&(w=e.bottom-d.bottom+r)):e.bottom>d.bottom-r&&(w=e.bottom-d.bottom+r,t<0&&e.top-w0&&e.right>d.right+y&&(y=e.right-d.right+s)):e.right>d.right-s&&(y=e.right-d.right+s,t<0&&e.leftd.bottom||e.leftd.right)&&(e={left:Math.max(e.left,d.left),right:Math.min(e.right,d.right),top:Math.max(e.top,d.top),bottom:Math.min(e.bottom,d.bottom)}),m=m.assignedSlot||m.parentNode}else if(m.nodeType==11)m=m.host;else break}function Ag(i,e=!0){let t=i.ownerDocument,n=null,a=null;for(let s=i.parentNode;s&&!(s==t.body||(!e||n)&&a);)if(We(s))!a&&s.scrollHeight>s.clientHeight&&/scroll|auto/.test(getComputedStyle(s).overflowY)&&(a=s),e&&!n&&s.scrollWidth>s.clientWidth&&/scroll|auto/.test(getComputedStyle(s).overflowX)&&(n=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:n,y:a}}class PZ{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:n}=e;this.set(t,Math.min(e.anchorOffset,t?pn(t):0),n,Math.min(e.focusOffset,n?pn(n):0))}set(e,t,n,a){this.anchorNode=e,this.anchorOffset=t,this.focusNode=n,this.focusOffset=a}}function Pg(i){let e=[];for(let t=i;t;t=t.nodeType==11?t.host:t.parentNode)We(t)&&e.push({node:t,left:t.scrollLeft,top:t.scrollTop});return e}function jg(i,e=!0){for(let{node:t,left:n,top:a}of i)e&&t.scrollTop!=a&&(t.scrollTop=a),t.scrollLeft!=n&&(t.scrollLeft=n)}let Gn=null;F.safari&&F.safari_version>=26&&(Gn=!1);function Cg(i){if(i.setActive)return i.setActive();if(Gn)return i.focus(Gn);let e=Pg(i);i.focus(Gn==null?{get preventScroll(){return Gn={preventScroll:!0},!0}}:void 0),Gn||(Gn=!1,jg(e))}let Om;function Ti(i,e,t=e){let n=Om||(Om=document.createRange());return n.setEnd(i,t),n.setStart(i,e),n}function k1(i,e,t,n){let a={key:e,code:e,keyCode:t,which:t,cancelable:!0};n&&({altKey:a.altKey,ctrlKey:a.ctrlKey,shiftKey:a.shiftKey,metaKey:a.metaKey}=n);let s=new KeyboardEvent("keydown",a);s.synthetic=!0,i.dispatchEvent(s);let r=new KeyboardEvent("keyup",a);return r.synthetic=!0,i.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function jZ(i){for(;i;){if(i&&(i.nodeType==9||i.nodeType==11&&i.host))return i;i=i.assignedSlot||i.parentNode}return null}function CZ(i,e){let t=e.focusNode,n=e.focusOffset;if(!t||e.anchorNode!=t||e.anchorOffset!=n)return!1;for(n=Math.min(n,pn(t));;)if(n){if(!We(t))return!1;let a=t.childNodes[n-1];a.contentEditable=="false"?n--:(t=a,n=pn(t))}else{if(t==i)return!0;n=Zn(t),t=t.parentNode}}function Bg(i){return i instanceof Window?i.pageYOffset>Math.max(0,i.document.documentElement.scrollHeight-i.innerHeight-4):i.scrollTop>Math.max(1,i.scrollHeight-i.clientHeight-4)}function Dg(i,e){for(let t=i,n=e;;){if(A1(t)&&n>0)return{node:t,offset:n};if(We(t)&&n>0){if(t.contentEditable=="false")return null;t=t.childNodes[n-1],n=pn(t)}else if(t.parentNode&&!xs(t))n=Zn(t),t=t.parentNode;else return null}}function Zg(i,e){for(let t=i,n=e;;){if(A1(t)&&n=t){if(o.level==n)return r;(s<0||(a!=0?a<0?o.fromt:e[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function Wg(i,e){if(i.length!=e.length)return!1;for(let t=0;t=0;f-=3)if(Ut[f+1]==-h){let x=Ut[f+2],b=x&2?a:x&4?x&1?s:a:0;b&&(me[c]=me[Ut[f]]=b),o=f;break}}else{if(Ut.length==189)break;Ut[o++]=c,Ut[o++]=d,Ut[o++]=l}else if((g=me[c])==2||g==1){let f=g==a;l=f?0:1;for(let x=o-3;x>=0;x-=3){let b=Ut[x+2];if(b&2)break;if(f)Ut[x+2]|=2;else{if(b&4)break;Ut[x+2]|=4}}}}}function WZ(i,e,t,n){for(let a=0,s=n;a<=t.length;a++){let r=a?t[a-1].to:i,o=al;)g==x&&(g=t[--f].from,x=f?t[f-1].to:i),me[--g]=h;l=m}else s=u,l++}}}function el(i,e,t,n,a,s,r){let o=n%2?2:1;if(n%2==a%2)for(let l=e,u=0;ll&&r.push(new an(l,f.from,h));let x=f.direction==P1!=!(h%2);tl(i,x?n+1:n,a,f.inner,f.from,f.to,r),l=f.to}g=f.to}else{if(g==t||(m?me[g]!=o:me[g]==o))break;g++}d?el(i,l,g,n+1,a,d,r):le;){let m=!0,c=!1;if(!u||l>s[u-1].to){let f=me[l-1];f!=o&&(m=!1,c=f==16)}let d=!m&&o==1?[]:null,h=m?n:n+1,g=l;e:for(;;)if(u&&g==s[u-1].to){if(c)break e;let f=s[--u];if(!m)for(let x=f.from,b=u;;){if(x==e)break e;if(b&&s[b-1].to==x)x=s[--b].from;else{if(me[x-1]==o)break e;break}}if(d)d.push(f);else{f.tome.length;)me[me.length]=256;let n=[],a=e==P1?0:1;return tl(i,a,a,t,0,i.length,n),n}function Eg(i){return[new an(0,i,0)]}let Ng="";function NZ(i,e,t,n,a){var s;if(!i.length)return null;let r=n.head-i.from,o;if(n.head==i.from&&n.assoc<0){if(!a)return null;r=e[o=0].side(!1,t)}else if(n.head==i.to&&n.assoc>0){if(a)return null;r=e[o=e.length-1].side(!0,t)}else o=an.find(e,r,(s=n.bidiLevel)!==null&&s!==void 0?s:-1,n.assoc);let l=e[o],u=l.side(a,t);if(r==u){let d=o+=a?1:-1;if(d<0||d>=e.length)return null;l=e[o=d],r=l.side(!a,t),u=l.side(a,t)}let m=Ke(i.text,r,l.forward(a,t));(ml.to)&&(m=u),Ng=i.text.slice(Math.min(r,m),Math.max(r,m));let c=o==(a?e.length-1:0)?null:e[o+(a?1:-1)];if(m==u){if(!c)return a?C.cursor(i.to,1):C.cursor(i.from,-1);if(c.level+(a?0:1)i.some(e=>e)}),JZ=G.define({combine:i=>i.some(e=>e)}),qg=G.define();class S1{constructor(e,t,n,a,s,r=!1){this.range=e,this.y=t,this.x=n,this.yMargin=a,this.xMargin=s,this.isSnapshot=r}map(e){return e.empty?this:new S1(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new S1(C.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const ha=re.define({map:(i,e)=>i.map(e)}),Ug=re.define();function bt(i,e,t){let n=i.facet(Gg);n.length?n[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}const mn=G.define({combine:i=>i.length?i[0]:!0});let RZ=0;const x1=G.define({combine(i){return i.filter((e,t)=>{for(let n=0;n{let l=[];return r&&l.push(Qs.of(u=>{let m=u.plugin(o);return m?r(m):ue.none})),s&&l.push(s(o)),l})}static fromClass(e,t){return Dt.define((n,a)=>new e(n,a),t)}}class _r{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(n){if(bt(t.state,n,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){bt(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(n){bt(e.state,n,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const $g=G.define(),x0=G.define(),Qs=G.define(),Yg=G.define(),b0=G.define(),Ji=G.define(),Xg=G.define();function Am(i,e){let t=i.state.facet(Xg);if(!t.length)return t;let n=t.map(s=>s instanceof Function?s(i):s),a=[];return Y.spans(n,e.from,e.to,{point(){},span(s,r,o,l){let u=s-e.from,m=r-e.from,c=a;for(let d=o.length-1;d>=0;d--,l--){let h=o[d].spec.bidiIsolate,g;if(l>0&&c.length&&(g=c[c.length-1]).to==u&&g.direction==h)g.to=m,c=g.inner;else{let f={from:u,to:m,direction:h,inner:[]};c.push(f),c=f.inner}}}}),Kg(e.text,a)}function Kg(i,e){for(let t of e){if(t.direction==null){for(let n=t.from,a=0;n0;t--){let a=e[t-1];if(!(a.fromA>n.toA)){if(a.toAa.push(new jt(s,r,o,l))),this.changedRanges=a}static create(e,t,n){return new ys(e,t,n)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}}const GZ=[];class Ie{constructor(e,t,n=0){this.dom=e,this.length=t,this.flags=n,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return GZ}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttrs;t&&SZ(this.dom,t)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let n=t;for(let a of this.children){if(a==e)return n;n+=a.length+a.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t,n){return null}domPosFor(e,t){let n=Zn(this.dom),a=this.length?e>0:t>0;return new Jt(this.parent.dom,n+(a?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof Us)return e;return null}static get(e){return e.cmTile}}class qs extends Ie{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,n=null,a,s=(e==null?void 0:e.node)==t?e:null,r=0;for(let o of this.children){if(o.sync(e),r+=o.length+o.breakAfter,a=n?n.nextSibling:t.firstChild,s&&a!=o.dom&&(s.written=!0),o.dom.parentNode==t)for(;a&&a!=o.dom;)a=Pm(a);else t.insertBefore(o.dom,a);n=o.dom}for(a=n?n.nextSibling:t.firstChild,s&&a&&(s.written=!0);a;)a=Pm(a);this.length=r}}function Pm(i){let e=i.nextSibling;return i.parentNode.removeChild(i),e}class Us extends qs{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=Ie.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],n=this,a=0,s=0;;)if(a==n.children.length){if(!t.length)return;n=n.parent,n.breakAfter&&s++,a=t.pop()}else{let r=n.children[a++];if(r instanceof dn)t.push(a),n=r,a=0;else{let o=s+r.length,l=e(r,s);if(l!==void 0)return l;s=o+r.breakAfter}}}resolveBlock(e,t){let n,a=-1,s,r=-1;if(this.blockTiles((o,l)=>{let u=l+o.length;if(e>=l&&e<=u){if(o.isWidget()&&t>=-1&&t<=1){if(o.flags&32)return!0;o.flags&16&&(n=void 0)}(le||e==l&&(t>1?o.length:o.covers(-1)))&&(!s||!o.isWidget()&&s.isWidget())&&(s=o,r=e-l)}}),!n&&!s)throw new Error("No tile at position "+e);return n&&t<0||!s?{tile:n,offset:a}:{tile:s,offset:r}}}class dn extends qs{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,t){let n=new dn(t||document.createElement(e.tagName),e);return t||(n.flags|=4),n}}class j1 extends qs{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,n){let a=new j1(t||document.createElement("div"),e);return(!t||!n)&&(a.flags|=4),a}get domAttrs(){return this.attrs}resolveInline(e,t,n=!1){let a=null,s=-1,r=null,o=-1;function l(m,c){for(let d=0,h=0;d=c&&(g.isComposite()?l(g,c-h):(!r||n&&r.isHidden&&(t>0&&!(r.flags&32)||n&&VZ(r,g)))&&(f>c||g.flags&32&&t<=1)?(r=g,o=c-h):(h=-1)&&(a=g,s=c-h)),h=f}}l(this,e);let u=(t<0?a:r)||a||r;return u?{tile:u,offset:u==a?s:o}:null}coordsIn(e,t,n){let a=this.resolveInline(e,t,!0);return a?a.tile.coordsIn(Math.max(0,a.offset),t,n):HZ(this)}domIn(e,t){let n=this.resolveInline(e,t);if(n){let{tile:a,offset:s}=n;if(this.dom.contains(a.dom))return a.isText()?new Jt(a.dom,Math.min(a.dom.nodeValue.length,s)):a.domPosFor(s,a.flags&16?1:a.flags&32?-1:t);let r=n.tile.parent,o=!1;for(let l of r.children){if(o)return new Jt(l.dom,0);l==n.tile&&(o=!0)}}return new Jt(this.dom,0)}}function HZ(i){let e=i.dom.lastChild;if(!e)return i.dom.getBoundingClientRect();let t=Fa(e);return t[t.length-1]||null}function VZ(i,e){let t=i.coordsIn(0,1),n=e.coordsIn(0,1);return t&&n&&n.topa&&(e=a);let s=e,r=e,o=0;e==0&&t<0||e==a&&t>=0?F.chrome||F.gecko||(e?(s--,o=1):r=0)?0:l.length-1];return F.safari&&!o&&u.width==0&&(u=Array.prototype.find.call(l,m=>m.width)||u),n==null?u:bs(u,(o?o>0:t<0)==n)}static of(e,t){let n=new qn(t||document.createTextNode(e),e);return t||(n.flags|=2),n}}class s1 extends Ie{constructor(e,t,n,a){super(e,t,a),this.widget=n}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,n){let a=this.widget.coordsAt(this.dom,e,t);if(a)return a;if(n)return bs(this.dom.getBoundingClientRect(),this.length?e==0:t<=0);{let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.flags&16?!0:this.flags&32?!1:e>0;for(let l=o?s.length-1:0;r=s[l],!(e>0?l==0:l==s.length-1||r.top0==n)}}class QZ{constructor(e){this.index=0,this.beforeBreak=!1,this.parents=[],this.tile=e}advance(e,t,n){let{tile:a,index:s,beforeBreak:r,parents:o}=this;for(;e||t>0;)if(a.isComposite())if(r){if(!e)break;n&&n.break(),e--,r=!1}else if(s==a.children.length){if(!e&&!o.length)break;n&&n.leave(a),r=!!a.breakAfter,{tile:a,index:s}=o.pop(),s++}else{let l=a.children[s],u=l.breakAfter;(t>0?l.length<=e:l.length=0;o--){let l=t.marks[o],u=a.lastChild;if(u instanceof ct&&u.mark.eq(l.mark))u.dom!=l.dom&&u.setDOM(Tr(l.dom)),a=u;else{let{dom:m}=l;this.cache.reused.get(l)&&Ie.get(l.dom)&&(m=Tr(l.dom));let c=ct.of(l.mark,m);a.append(c),a=c}this.cache.reused.set(l,2)}let s=Ie.get(e.text);s&&this.cache.reused.set(s,2);let r=new qn(e.text,e.text.nodeValue);r.flags|=8,this.pos=e.range.toB,a.append(r)}addInlineWidget(e,t,n){let a=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);a||this.flushBuffer();let s=this.ensureMarks(t,n);!a&&!(e.flags&16)&&s.append(this.getBuffer(1)),s.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,n){this.flushBuffer(),this.ensureMarks(t,n).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,this.pos+=e}addLineStart(e,t){var n;e||(e=tp);let a=j1.start(e,t||((n=this.cache.find(j1))===null||n===void 0?void 0:n.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=a)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var n;let a=this.curLine;for(let s=e.length-1;s>=0;s--){let r=e[s],o;if(t>0&&(o=a.lastChild)&&o instanceof ct&&o.mark.eq(r))a=o,t--;else{let l=ct.of(r,(n=this.cache.find(ct,u=>u.mark.eq(r)))===null||n===void 0?void 0:n.dom);a.append(l),a=l,t=0}}return a}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!jm(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(F.ios&&jm(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(Or,0,32)||new s1(Or.toDOM(),0,Or,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=e.rank*102+e.value.rank,n=new qZ(e.from,e.to,e.value,t),a=this.wrappers.length;for(;a>0&&(this.wrappers[a-1].rank-n.rank||this.wrappers[a-1].to-n.to)<0;)a--;this.wrappers.splice(a,0,n)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let n of this.wrappers){let a=t.lastChild;if(n.fromr.wrapper.eq(n.wrapper)))===null||e===void 0?void 0:e.dom);t.append(s),t=s}}return t}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let t=2|(e<0?16:32),n=this.cache.find(vs,void 0,1);return n&&(n.flags=t),n||new vs(t)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}}class $Z{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:a,lineBreak:s,done:r}=this.cursor.next(this.skipCount);if(this.skipCount=0,r)throw new Error("Ran out of text content when drawing inline views");this.text=a;let o=this.textOff=Math.min(e,a.length);return s?null:a.slice(0,o)}let t=Math.min(this.text.length,this.textOff+e),n=this.text.slice(this.textOff,t);return this.textOff=t,n}}const ws=[s1,j1,qn,ct,vs,dn,Us];for(let i=0;i[]),this.index=ws.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,n=this.buckets[t];n.length<6?n.push(e):n[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,n=2){let a=e.bucket,s=this.buckets[a],r=this.index[a];for(let o=0;o{if(this.cache.add(r),r.isComposite())return!1},enter:r=>this.cache.add(r),leave:()=>{},break:()=>{}}}run(e,t){let n=t&&this.getCompositionContext(t.text);for(let a=0,s=0,r=0;;){let o=ra){let u=l-a;this.preserve(u,!r,!o),a=l,s+=u}if(!o)break;t&&o.fromA<=t.range.fromA&&o.toA>=t.range.toA?(this.forward(o.fromA,t.range.fromA,t.range.fromA{if(r.isWidget())if(this.openWidget)this.builder.continueWidget(l-o);else{let u=l>0||o{r.isLine()?this.builder.addLineStart(r.attrs,this.cache.maybeReuse(r)):(this.cache.add(r),r instanceof ct&&a.unshift(r.mark)),this.openWidget=!1},leave:r=>{r.isLine()?a.length&&(a.length=s=0):r instanceof ct&&(a.shift(),s=Math.min(s,a.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let n=null,a=this.builder,s=-1,r=Y.spans(this.decorations,e,t,{point:(o,l,u,m,c,d)=>{if(u instanceof a1){if(this.disallowBlockEffectsFor[d]){if(u.block)throw new RangeError("Block decorations may not be specified via plugins");if(l>this.view.state.doc.lineAt(o).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(s=m.length,c>m.length)a.continueWidget(l-o);else{let h=u.widget||(u.block?C1.block:C1.inline),g=KZ(u),f=this.cache.findWidget(h,l-o,g)||s1.of(h,this.view,l-o,g);u.block?(u.startSide>0&&a.addLineStartIfNotCovered(n),a.addBlockWidget(f)):(a.ensureLine(n),a.addInlineWidget(f,m,c))}n=null}else n=eM(n,u);l>o&&this.text.skip(l-o)},span:(o,l,u,m)=>{for(let c=o;c-1&&(this.openWidget=r>s),this.openWidget||a.addLineStartIfNotCovered(n),this.openMarks=r}forward(e,t,n=1){t-e<=10?this.old.advance(t-e,n,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,n,this.reuseWalker))}getCompositionContext(e){let t=[],n=null;for(let a=e.parentNode;;a=a.parentNode){let s=Ie.get(a);if(a==this.view.contentDOM)break;s instanceof ct?t.push(s):s!=null&&s.isLine()?n=s:s instanceof dn||(a.nodeName=="DIV"&&!n?n=new j1(a,tp):n||t.push(ct.of(new Ni({tagName:a.nodeName.toLowerCase(),attributes:_Z(a)}),a)))}return n?{line:n,marks:t}:null}}function jm(i,e){let t=n=>{for(let a of n.children)if((e?a.isText():a.length)||t(a))return!0;return!1};return t(i)}function KZ(i){let e=i.isReplace?(i.startSide<0?64:0)|(i.endSide>0?128:0):i.startSide>0?32:16;return i.block&&(e|=256),e}const tp={class:"cm-line"};function eM(i,e){let t=e.spec.attributes,n=e.spec.class;return!t&&!n||(i||(i={class:"cm-line"}),t&&d0(t,i),n&&(i.class+=" "+n)),i}function tM(i){let e=[];for(let t=i.parents.length;t>1;t--){let n=t==i.parents.length?i.tile:i.parents[t].tile;n instanceof ct&&e.push(n.mark)}return e}function Tr(i){let e=Ie.get(i);return e&&e.setDOM(i.cloneNode()),i}class C1 extends Ei{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}C1.inline=new C1("span");C1.block=new C1("div");const Or=new class extends Ei{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}};class Cm{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=ue.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new Us(e,e.contentDOM),this.updateInner([new jt(0,0,0,e.state.doc.length)],null)}update(e){var t;let n=e.changedRanges;this.minWidth>0&&n.length&&(n.every(({fromA:m,toA:c})=>cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let a=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?a=this.domChanged.newSel.head:!mM(e.changes,this.hasComposition)&&!e.selectionSet&&(a=e.state.selection.main.head));let s=a>-1?iM(this.view,e.changes,a):null;if(this.domChanged=null,this.hasComposition){let{from:m,to:c}=this.hasComposition;n=new jt(m,c,e.changes.mapPos(m,-1),e.changes.mapPos(c,1)).addToSet(n.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(F.ie||F.chrome)&&!s&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=this.decorations,o=this.blockWrappers;this.updateDeco();let l=rM(r,this.decorations,e.changes);l.length&&(n=jt.extendWithRanges(n,l));let u=lM(o,this.blockWrappers,e.changes);return u.length&&(n=jt.extendWithRanges(n,u)),s&&!n.some(m=>m.fromA<=s.range.fromA&&m.toA>=s.range.toA)&&(n=s.range.addToSet(n.slice())),this.tile.flags&2&&n.length==0?!1:(this.updateInner(n,s),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:n}=this.view;n.ignore(()=>{if(t||e.length){let r=this.tile,o=new XZ(this.view,r,this.blockWrappers,this.decorations,this.dynamicDecorationMap);t&&Ie.get(t.text)&&o.cache.reused.set(Ie.get(t.text),2),this.tile=o.run(e,t),il(r,o.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let s=F.chrome||F.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(s),s&&(s.written||n.selectionRange.focusNode!=s.node||!this.tile.dom.contains(s.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let a=[];if(this.view.viewport.from||this.view.viewport.to-1)&&mi(n,this.view.observer.selectionRange)&&!(a&&n.contains(a));if(!(s||t||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,u,m;if(l.empty?m=u=this.inlineDOMNearPos(l.anchor,l.assoc||1):(m=this.inlineDOMNearPos(l.head,l.head==l.from?1:-1),u=this.inlineDOMNearPos(l.anchor,l.anchor==l.from?1:-1)),F.gecko&&l.empty&&!this.hasComposition&&nM(u)){let d=document.createTextNode("");this.view.observer.ignore(()=>u.node.insertBefore(d,u.node.childNodes[u.offset]||null)),u=m=new Jt(d,0),o=!0}let c=this.view.observer.selectionRange;(o||!c.focusNode||(!ci(u.node,u.offset,c.anchorNode,c.anchorOffset)||!ci(m.node,m.offset,c.focusNode,c.focusOffset))&&!this.suppressWidgetCursorChange(c,l))&&(this.view.observer.ignore(()=>{F.android&&F.chrome&&n.contains(c.focusNode)&&uM(c.focusNode,n)&&(n.blur(),n.focus({preventScroll:!0}));let d=_i(this.view.root);if(d)if(l.empty){if(F.gecko){let h=aM(u.node,u.offset);if(h&&h!=3){let g=(h==1?Dg:Zg)(u.node,u.offset);g&&(u=new Jt(g.node,g.offset))}}d.collapse(u.node,u.offset),l.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=l.bidiLevel)}else if(d.extend){d.collapse(u.node,u.offset);try{d.extend(m.node,m.offset)}catch{}}else{let h=document.createRange();l.anchor>l.head&&([u,m]=[m,u]),h.setEnd(m.node,m.offset),h.setStart(u.node,u.offset),d.removeAllRanges(),d.addRange(h)}r&&this.view.root.activeElement==n&&(n.blur(),a&&a.focus())}),this.view.observer.setSelectionRange(u,m)),this.impreciseAnchor=u.precise?null:new Jt(c.anchorNode,c.anchorOffset),this.impreciseHead=m.precise?null:new Jt(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&ci(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,n=_i(e.root),{anchorNode:a,anchorOffset:s}=e.observer.selectionRange;if(!n||!t.empty||!t.assoc||!n.modify)return;let r=this.lineAt(t.head,t.assoc);if(!r)return;let o=r.posAtStart;if(t.head==o||t.head==o+r.length)return;let l=this.coordsAt(t.head,-1),u=this.coordsAt(t.head,1);if(!l||!u||l.bottom>u.top)return;let m=this.domAtPos(t.head+t.assoc,t.assoc);n.collapse(m.node,m.offset),n.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let c=e.observer.selectionRange;e.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=t.from&&n.collapse(a,s)}posFromDOM(e,t){let n=this.tile.nearest(e);if(!n)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let a=n.posAtStart;if(n.isComposite()){let s;if(e==n.dom)s=n.dom.childNodes[t];else{let r=pn(e)==0?0:t==0?-1:1;for(;;){let o=e.parentNode;if(o==n.dom)break;r==0&&o.firstChild!=o.lastChild&&(e==o.firstChild?r=-1:r=1),e=o}r<0?s=e:s=e.nextSibling}if(s==n.dom.firstChild)return a;for(;s&&!Ie.get(s);)s=s.nextSibling;if(!s)return a+n.length;for(let r=0,o=a;;r++){let l=n.children[r];if(l.dom==s)return o;o+=l.length+l.breakAfter}}else return n.isText()?e==n.dom?a+t:a+(t?n.length:0):a}domAtPos(e,t){let{tile:n,offset:a}=this.tile.resolveBlock(e,t);return n.isWidget()?n.domPosFor(a,t):n.domIn(a,t)}inlineDOMNearPos(e,t){let n,a=-1,s=!1,r,o=-1,l=!1;return this.tile.blockTiles((u,m)=>{if(u.isWidget()){if(u.flags&32&&m>=e)return!0;u.flags&16&&(s=!0)}else{let c=m+u.length;if(m<=e&&(n=u,a=e-m,s=c=e&&!r&&(r=u,o=e-m,l=m>e),m>e&&r)return!0}}),!n&&!r?this.domAtPos(e,t):(s&&r?n=null:l&&n&&(r=null),n&&t<0||!r?n.domIn(a,t):r.domIn(o,t))}coordsAt(e,t,n){let{tile:a,offset:s}=this.tile.resolveBlock(e,t);return a.isWidget()?a.widget instanceof Ar?null:a.coordsInWidget(s,t,!0):a.coordsIn(s,t,n)}lineAt(e,t){let{tile:n}=this.tile.resolveBlock(e,t);return n.isLine()?n:null}coordsForChar(e){let{tile:t,offset:n}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;function a(s,r){if(s.isComposite())for(let o of s.children){if(o.length>=r){let l=a(o,r);if(l)return l}if(r-=o.length,r<0)break}else if(s.isText()&&rMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,l=this.view.textDirection==de.LTR,u=0,m=(c,d,h)=>{for(let g=0;ga);g++){let f=c.children[g],x=d+f.length,b=f.dom.getBoundingClientRect(),{height:y}=b;if(h&&!g&&(u+=b.top-h.top),f instanceof dn)x>n&&m(f,d,b);else if(d>=n&&(u>0&&t.push(-u),t.push(y+u),u=0,r)){let w=f.dom.lastChild,_=w?Fa(w):[];if(_.length){let z=_[_.length-1],S=l?z.right-b.left:b.right-z.left;S>o&&(o=S,this.minWidth=s,this.minWidthFrom=d,this.minWidthTo=x)}}h&&g==c.children.length-1&&(u+=h.bottom-b.bottom),d=x+f.breakAfter}};return m(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getComputedStyle(t.dom).direction=="rtl"?de.RTL:de.LTR}measureTextSize(){let e=this.tile.blockTiles(r=>{if(r.isLine()&&r.children.length&&r.length<=20){let o=0,l;for(let u of r.children){if(!u.isText()||/[^ -~]/.test(u.text))return;let m=Fa(u.dom);if(m.length!=1)return;o+=m[0].width,l=m[0].height}if(o)return{lineHeight:r.dom.getBoundingClientRect().height,charWidth:o/r.length,textHeight:l}}});if(e)return e;let t=document.createElement("div"),n,a,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(t);let r=Fa(t.firstChild)[0];n=t.getBoundingClientRect().height,a=r&&r.width?r.width/27:7,s=r&&r.height?r.height:n,t.remove()}),{lineHeight:n,charWidth:a,textHeight:s}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let n=0,a=0;;a++){let s=a==t.viewports.length?null:t.viewports[a],r=s?s.from-1:this.view.state.doc.length;if(r>n){let o=(t.lineBlockAt(r).bottom-t.lineBlockAt(n).top)/this.view.scaleY;e.push(ue.replace({widget:new Ar(o),block:!0,inclusive:!0,isBlockGap:!0}).range(n,r))}if(!s)break;n=s.to+1}return ue.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Qs).map(s=>(this.dynamicDecorationMap[e++]=typeof s=="function")?s(this.view):s),n=!1,a=this.view.state.facet(b0).map((s,r)=>{let o=typeof s=="function";return o&&(n=!0),o?s(this.view):s});for(a.length&&(this.dynamicDecorationMap[e++]=n,t.push(Y.join(a))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof s=="function"?s(this.view):s)}scrollIntoView(e){if(e.isSnapshot){let u=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=u.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let u of this.view.state.facet(qg))try{if(u(this.view,e.range,e))return!0}catch(m){bt(this.view.state,m,"scroll handler")}let{range:t}=e,n=this.coordsAt(t.head,t.assoc||(t.head>t.anchor?-1:1)),a;if(!n)return;!t.empty&&(a=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(n={left:Math.min(n.left,a.left),top:Math.min(n.top,a.top),right:Math.max(n.right,a.right),bottom:Math.max(n.bottom,a.bottom)});let s=y0(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:l}=this.view.scrollDOM;if(AZ(this.view.scrollDOM,r,t.head1&&(n.top>window.visualViewport.offsetTop+window.visualViewport.height||n.bottomn.isWidget()||n.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){il(this.tile)}}function il(i,e){let t=e==null?void 0:e.get(i);if(t!=1){t==null&&i.destroy();for(let n of i.children)il(n,e)}}function nM(i){return We(i.node)&&i.node.firstChild&&(i.offset==0||i.node.childNodes[i.offset-1].contentEditable=="false")&&(i.offset==i.node.childNodes.length||i.node.childNodes[i.offset].contentEditable=="false")}function np(i,e){let t=i.observer.selectionRange;if(!t.focusNode)return null;let n=Dg(t.focusNode,t.focusOffset),a=Zg(t.focusNode,t.focusOffset),s=n||a;if(a&&n&&a.node!=n.node){let o=Ie.get(a.node);if(!o||o.isText()&&o.text!=a.node.nodeValue)s=a;else if(i.docView.lastCompositionAfterCursor){let l=Ie.get(n.node);!l||l.isText()&&l.text!=n.node.nodeValue||(s=a)}}if(i.docView.lastCompositionAfterCursor=s!=n,!s)return null;let r=e-s.offset;return{from:r,to:r+s.node.nodeValue.length,node:s.node}}function iM(i,e,t){let n=np(i,t);if(!n)return null;let{node:a,from:s,to:r}=n,o=a.nodeValue;if(/[\n\r]/.test(o)||i.state.doc.sliceString(n.from,n.to)!=o)return null;let l=e.invertedDesc;return{range:new jt(l.mapPos(s),l.mapPos(r),s,r),text:a}}function aM(i,e){return We(i)?(e&&i.childNodes[e-1].contentEditable=="false"?1:0)|(e{ne.from&&(t=!0)}),t}class Ar extends Ei{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}function cM(i,e,t=1){let n=i.charCategorizer(e),a=i.doc.lineAt(e),s=e-a.from;if(a.length==0)return C.cursor(e);s==0?t=1:s==a.length&&(t=-1);let r=s,o=s;t<0?r=Ke(a.text,s,!1):o=Ke(a.text,s);let l=n(a.text.slice(r,o));for(;r>0;){let u=Ke(a.text,r,!1);if(n(a.text.slice(u,r))!=l)break;r=u}for(;oi.defaultLineHeight*1.5){let o=i.viewState.heightOracle.textHeight,l=Math.floor((a-t.top-(i.defaultLineHeight-o)*.5)/o);s+=l*i.viewState.heightOracle.lineLength}let r=i.state.sliceDoc(t.from,t.to);return t.from+vZ(r,s,i.state.tabSize)}function al(i,e,t){let n=i.lineBlockAt(e);if(Array.isArray(n.type)){let a;for(let s of n.type){if(s.from>e)break;if(!(s.toe)return s;(!a||s.type==Ge.Text&&(a.type!=s.type||(t<0?s.frome)))&&(a=s)}}return a||n}return n}function hM(i,e,t,n){let a=al(i,e.head,e.assoc||-1),s=!n||a.type!=Ge.Text||!(i.lineWrapping||a.widgetLineBreaks)?null:i.coordsAtPos(e.assoc<0&&e.head>a.from?e.head-1:e.head);if(s){let r=i.dom.getBoundingClientRect(),o=i.textDirectionAt(a.from),l=i.posAndSideAtCoords({x:t==(o==de.LTR)?r.right-1:r.left+1,y:(s.top+s.bottom)/2});if(l)return C.cursor(l.pos,l.assoc)}return C.cursor(t?a.to:a.from,t?1:-1)}function Bm(i,e,t,n){let a=i.state.doc.lineAt(e.head),s=i.bidiSpans(a),r=i.textDirectionAt(a.from);for(let o=e,l=null;;){let u=NZ(a,s,r,o,t),m=Ng;if(!u){if(a.number==(t?i.state.doc.lines:1))return o;m=` -`,a=i.state.doc.line(a.number+(t?1:-1)),s=i.bidiSpans(a),u=t?C.cursor(a.from,-1):C.cursor(a.to,1)}if(l){if(!l(m))return o}else{if(!n)return u;l=n(m)}o=u}}function gM(i,e,t){let n=i.state.charCategorizer(e),a=n(t);return s=>{let r=n(s);return a==Pt.Space&&(a=r),a==r}}function pM(i,e,t,n){let a=e.head,s=t?1:-1;if(a==(t?i.state.doc.length:0))return C.cursor(a,e.assoc);let r=e.goalColumn,o,l=i.contentDOM.getBoundingClientRect(),u=i.coordsAtPos(a,e.assoc||((e.empty?t:e.head==e.from)?1:-1)),m=i.documentTop;if(u)r==null&&(r=u.left-l.left),o=s<0?u.top:u.bottom;else{let g=i.viewState.lineBlockAt(a);r==null&&(r=Math.min(l.right-l.left,i.defaultCharacterWidth*(a-g.from))),o=(s<0?g.top:g.bottom)+m}let c=l.left+r,d=i.viewState.heightOracle.textHeight>>1,h=n??d;for(let g=0;;g+=d){let f=o+(h+g)*s,x=sl(i,{x:c,y:f},!1,s);if(t?f>l.bottom:fo:y{if(e>s&&ea(i)),t.from,e.head>t.from?-1:1);return n==t.from?t:C.cursor(n,ni.viewState.docHeight)return new nn(i.state.doc.length,-1);if(u=i.elementAtHeight(l),n==null)break;if(u.type==Ge.Text){if(n<0?u.toi.viewport.to)break;let d=i.docView.coordsAt(n<0?u.from:u.to,n>0?-1:1);if(d&&(n<0?d.top<=l+s:d.bottom>=l+s))break}let c=i.viewState.heightOracle.textHeight/2;l=n>0?u.bottom+c:u.top-c}if(i.viewport.from>=u.to||i.viewport.to<=u.from){if(t)return null;if(u.type==Ge.Text){let c=dM(i,a,u,r,o);return new nn(c,c==u.from?1:-1)}}if(u.type!=Ge.Text)return l<(u.top+u.bottom)/2?new nn(u.from,1):new nn(u.to,-1);let m=i.docView.lineAt(u.from,2);return(!m||m.length!=u.length)&&(m=i.docView.lineAt(u.from,-2)),new fM(i,r,o,i.textDirectionAt(u.from)).scanTile(m,u.from)}class fM{constructor(e,t,n,a){this.view=e,this.x=t,this.y=n,this.baseDir=a,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||n.length&&(n[0].level!=this.baseDir||n[0].to+a.from>1;t:if(r.has(f)){for(let y=1;y=s&&(w-=g),!r.has(w)){f=w;break t}}break e}r.add(f);let x=t(f),b=0;if(x)for(let y=0;y1))if(w.bottomthis.y)(!u||u.top>w.top)&&(u=w),b=-1;else{let _=w.left>this.x?this.x-w.left:w.right(g+g+f)/3)return this.y=l.bottom-1,this.scan(e,t,!0);if(u&&u.top<(g+f+f)/3)return this.y=u.top+1,this.scan(e,t,!0)}let h=(o?this.dirAt(e[m],1):this.baseDir)==de.LTR;return{i:m,after:this.x>(d.left+d.right)/2==h}}scanText(e,t){let n=[];for(let s=0;s{let r=n[s]-t,o=n[s+1]-t;return Ti(e.dom,r,o).getClientRects()});return a.after?new nn(n[a.i+1],-1):new nn(n[a.i],1)}scanTile(e,t){if(!e.length)return new nn(t,1);if(e.children.length==1){let o=e.children[0];if(o.isText())return this.scanText(o,t);if(o.isComposite())return this.scanTile(o,t)}let n=[t];for(let o=0,l=t;o{let l=e.children[o];return l.flags&48?null:(We(l.dom)?l.dom:Ti(l.dom,0,l.length)).getClientRects()}),s=e.children[a.i],r=n[a.i];return s.isText()?this.scanText(s,r):s.isComposite()?this.scanTile(s,r):a.after?new nn(n[a.i+1],-1):new nn(r,1)}}const g1="￿";class xM{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(ne.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=g1}readRange(e,t){if(!e)return this;let n=e.parentNode;for(let a=e;;){this.findPointBefore(n,a);let s=this.text.length;this.readNode(a);let r=Ie.get(a),o=a.nextSibling;if(o==t){r!=null&&r.breakAfter&&!o&&n!=this.view.contentDOM&&this.lineBreak();break}let l=Ie.get(o);(r&&l?r.breakAfter:(r?r.breakAfter:xs(a))||xs(o)&&(a.nodeName!="BR"||r!=null&&r.isWidget())&&this.text.length>s)&&!yM(o,t)&&this.lineBreak(),a=o}return this.findPointBefore(n,t),this}readTextNode(e){let t=e.nodeValue;for(let n of this.points)n.node==e&&(n.pos=this.text.length+Math.min(n.offset,t.length));for(let n=0,a=this.lineSeparator?null:/\r\n?|\n/g;;){let s=-1,r=1,o;if(this.lineSeparator?(s=t.indexOf(this.lineSeparator,n),r=this.lineSeparator.length):(o=a.exec(t))&&(s=o.index,r=o[0].length),this.append(t.slice(n,s<0?t.length:s)),s<0)break;if(this.lineBreak(),r>1)for(let l of this.points)l.node==e&&l.pos>this.text.length&&(l.pos-=r-1);n=s+r}}readNode(e){let t=Ie.get(e),n=t&&t.overrideDOMText;if(n!=null){this.findPointInside(e,n.length);for(let a=n.iter();!a.next().done;)a.lineBreak?this.lineBreak():this.append(a.value)}else A1(e)?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():We(e)&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let n of this.points)n.node==e&&e.childNodes[n.offset]==t&&(n.pos=this.text.length)}findPointInside(e,t){for(let n of this.points)(A1(e)?n.node==e:e.contains(n.node))&&(n.pos=this.text.length+(bM(e,n.node,n.offset)?t:0))}}function bM(i,e,t){for(;;){if(!e||t-1;let{impreciseHead:s,impreciseAnchor:r}=e.docView,o=e.state.selection;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=ap(e.docView.tile,t,n,0))){let l=s||r?[]:zM(e),u=new xM(l,e);u.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=u.text,this.newSel=IM(l,this.bounds.from)}else{let l=e.observer.selectionRange,u=s&&s.node==l.focusNode&&s.offset==l.focusOffset||!Xo(e.contentDOM,l.focusNode)?o.main.head:e.docView.posFromDOM(l.focusNode,l.focusOffset),m=r&&r.node==l.anchorNode&&r.offset==l.anchorOffset||!Xo(e.contentDOM,l.anchorNode)?o.main.anchor:e.docView.posFromDOM(l.anchorNode,l.anchorOffset),c=e.viewport;if((F.ios||F.chrome)&&u!=m&&Math.min(u,m)<=o.main.from&&Math.max(u,m)>=o.main.to&&(c.from>0||c.to-1&&o.ranges.length>1)this.newSel=o.replaceRange(C.range(m,u));else if(e.lineWrapping&&m==u&&!(o.main.empty&&o.main.head==u)&&e.inputState.lastTouchTime>Date.now()-100){let d=e.coordsAtPos(u,-1),h=0;d&&(h=e.inputState.lastTouchY<=d.bottom?-1:1),this.newSel=C.create([C.cursor(u,h)])}else this.newSel=C.single(m,u)}}}function ap(i,e,t,n){if(i.isComposite()){let a=-1,s=-1,r=-1,o=-1;for(let l=0,u=n,m=n;lt)return ap(c,e,t,u);if(d>=e&&a==-1&&(a=l,s=u),u>t&&c.dom.parentNode==i.dom){r=l,o=m;break}m=d,u=d+c.breakAfter}return{from:s,to:o<0?n+i.length:o,startDOM:(a?i.children[a-1].dom.nextSibling:null)||i.dom.firstChild,endDOM:r=0?i.children[r].dom:null}}else return i.isText()?{from:n,to:n+i.length,startDOM:i.dom,endDOM:i.dom.nextSibling}:null}function sp(i,e){let t,{newSel:n}=e,{state:a}=i,s=a.selection.main,r=i.inputState.lastKeyTime>Date.now()-100?i.inputState.lastKeyCode:-1;if(e.bounds){let{from:o,to:l}=e.bounds,u=s.from,m=null;(r===8||F.android&&e.text.length=o&&s.to<=l&&(e.typeOver||c!=e.text)&&c.slice(0,s.from-o)==e.text.slice(0,s.from-o)&&c.slice(s.to-o)==e.text.slice(d=e.text.length-(c.length-(s.to-o)))?t={from:s.from,to:s.to,insert:ae.of(e.text.slice(s.from-o,d).split(g1))}:(h=rp(c,e.text,u-o,m))&&(F.chrome&&r==13&&h.toB==h.from+2&&e.text.slice(h.from,h.toB)==g1+g1&&h.toB--,t={from:o+h.from,to:o+h.toA,insert:ae.of(e.text.slice(h.from,h.toB).split(g1))})}else n&&(!i.hasFocus&&a.facet(mn)||rl(n,s))&&(n=null);if(!t&&!n)return!1;if((F.mac||F.android)&&t&&t.from==t.to&&t.from==s.head-1&&/^\. ?$/.test(t.insert.toString())&&i.contentDOM.getAttribute("autocorrect")=="off"?(n&&t.insert.length==2&&(n=C.single(n.main.anchor-1,n.main.head-1)),t={from:t.from,to:t.to,insert:ae.of([t.insert.toString().replace("."," ")])}):a.doc.lineAt(s.from).toDate.now()-50?t={from:s.from,to:s.to,insert:a.toText(i.inputState.insertingText)}:F.chrome&&t&&t.from==t.to&&t.from==s.head&&t.insert.toString()==` - `&&i.lineWrapping&&(n&&(n=C.single(n.main.anchor-1,n.main.head-1)),t={from:s.from,to:s.to,insert:ae.of([" "])}),t)return v0(i,t,n,r);if(n&&!rl(n,s)){let o=!1,l="select";return i.inputState.lastSelectionTime>Date.now()-50&&(i.inputState.lastSelectionOrigin=="select"&&(o=!0),l=i.inputState.lastSelectionOrigin,l=="select.pointer"&&(n=ip(a.facet(Ji).map(u=>u(i)),n))),i.dispatch({selection:n,scrollIntoView:o,userEvent:l}),!0}else return!1}function v0(i,e,t,n=-1){if(F.ios&&i.inputState.flushIOSKey(e))return!0;let a=i.state.selection.main;if(F.android&&(e.to==a.to&&(e.from==a.from||e.from==a.from-1&&i.state.sliceDoc(e.from,a.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&k1(i.contentDOM,"Enter",13)||(e.from==a.from-1&&e.to==a.to&&e.insert.length==0||n==8&&e.insert.lengtha.head)&&k1(i.contentDOM,"Backspace",8)||e.from==a.from&&e.to==a.to+1&&e.insert.length==0&&k1(i.contentDOM,"Delete",46)))return!0;let s=e.insert.toString();i.inputState.composing>=0&&i.inputState.composing++;let r,o=()=>r||(r=wM(i,e,t));return i.state.facet(Hg).some(l=>l(i,e.from,e.to,s,o))||i.dispatch(o()),!0}function wM(i,e,t){let n,a=i.state,s=a.selection.main,r=-1;if(e.from==e.to&&e.froms.to){let l=e.fromc(i)),u,l);e.from==m&&(r=m)}if(r>-1)n={changes:e,selection:C.cursor(e.from+e.insert.length,-1)};else if(e.from>=s.from&&e.to<=s.to&&e.to-e.from>=(s.to-s.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&i.inputState.composing<0){let l=s.frome.to?a.sliceDoc(e.to,s.to):"";n=a.replaceSelection(i.state.toText(l+e.insert.sliceString(0,void 0,i.state.lineBreak)+u))}else{let l=a.changes(e),u=t&&t.main.to<=l.newLength?t.main:void 0;if(a.selection.ranges.length>1&&(i.inputState.composing>=0||i.inputState.compositionPendingChange)&&e.to<=s.to+10&&e.to>=s.to-10){let m=i.state.sliceDoc(e.from,e.to),c,d=t&&np(i,t.main.head);if(d){let g=e.insert.length-(e.to-e.from);c={from:d.from,to:d.to-g}}else c=i.state.doc.lineAt(s.head);let h=s.to-e.to;n=a.changeByRange(g=>{if(g.from==s.from&&g.to==s.to)return{changes:l,range:u||g.map(l)};let f=g.to-h,x=f-m.length;if(i.state.sliceDoc(x,f)!=m||f>=c.from&&x<=c.to)return{range:g};let b=a.changes({from:x,to:f,insert:e.insert}),y=g.to-s.to;return{changes:b,range:u?C.range(Math.max(0,u.anchor+y),Math.max(0,u.head+y)):g.map(b)}})}else n={changes:l,selection:u&&a.selection.replaceRange(u)}}let o="input.type";return(i.composing||i.inputState.compositionPendingChange&&i.inputState.compositionEndedAt>Date.now()-50)&&(i.inputState.compositionPendingChange=!1,o+=".compose",i.inputState.compositionFirstChange&&(o+=".start",i.inputState.compositionFirstChange=!1)),a.update(n,{userEvent:o,scrollIntoView:!0})}function rp(i,e,t,n){let a=Math.min(i.length,e.length),s=0;for(;s0&&o>0&&i.charCodeAt(r-1)==e.charCodeAt(o-1);)r--,o--;if(n=="end"){let l=Math.max(0,s-Math.min(r,o));t-=r+l-s}if(r=r?s-t:0;s-=l,o=s+(o-r),r=s}else if(o=o?s-t:0;s-=l,r=s+(r-o),o=s}return{from:s,toA:r,toB:o}}function zM(i){let e=[];if(i.root.activeElement!=i.contentDOM)return e;let{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}=i.observer.selectionRange;return t&&(e.push(new Dm(t,n)),(a!=t||s!=n)&&e.push(new Dm(a,s))),e}function IM(i,e){if(i.length==0)return null;let t=i[0].pos,n=i.length==2?i[1].pos:t;return t<0||n<0?null:t==n?C.create([C.cursor(n+e,-1)]):C.single(t+e,n+e)}function rl(i,e){return e.head==i.main.head&&e.anchor==i.main.anchor}class kM{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.touchActive=!1,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.lastIOSMomentumScroll=0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,F.safari&&e.contentDOM.addEventListener("input",()=>null),F.gecko&&NM(e.contentDOM.ownerDocument)}handleEvent(e){!BM(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let n=this.handlers[e];if(n){for(let a of n.observers)a(this.view,t);for(let a of n.handlers){if(t.defaultPrevented)break;if(a(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=_M(e),n=this.handlers,a=this.view.contentDOM;for(let s in t)if(s!="scroll"){let r=!t[s].handlers.length,o=n[s];o&&r!=!o.handlers.length&&(a.removeEventListener(s,this.handleEvent),o=null),o||a.addEventListener(s,this.handleEvent,{passive:r})}for(let s in n)s!="scroll"&&!t[s]&&a.removeEventListener(s,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&lp.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),F.android&&F.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;if(F.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&(op.some(t=>t.keyCode==e.keyCode)&&!e.ctrlKey||TM.indexOf(e.key)>-1&&e.ctrlKey)){let t={ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey,shiftKey:e.shiftKey};t.shiftKey&&F.ios&&!/^(off|none)$/.test(this.view.contentDOM.autocapitalize)&&SM(this.view.win)&&(t.shiftKey=!1);let n=this.pendingIOSKey={key:e.key,keyCode:e.keyCode,mods:t};return setTimeout(()=>{this.pendingIOSKey==n&&this.flushIOSKey()},50),!0}return e.keyCode!=229&&this.view.observer.forceFlush(),!1}flushIOSKey(e){let t=this.pendingIOSKey;return!t||this.view.observer.pendingRecords().length||t.key=="Enter"&&e&&e.from0?!0:F.safari&&!F.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function SM(i){return i.visualViewport?i.visualViewport.height*i.visualViewport.scale/i.document.documentElement.clientHeight<.85:!1}function Zm(i,e){return(t,n)=>{try{return e.call(i,n,t)}catch(a){bt(t.state,a)}}}function _M(i){let e=Object.create(null);function t(n){return e[n]||(e[n]={observers:[],handlers:[]})}for(let n of i){let a=n.spec,s=a&&a.plugin.domEventHandlers,r=a&&a.plugin.domEventObservers;if(s)for(let o in s){let l=s[o];l&&t(o).handlers.push(Zm(n.value,l))}if(r)for(let o in r){let l=r[o];l&&t(o).observers.push(Zm(n.value,l))}}for(let n in Gt)t(n).handlers.push(Gt[n]);for(let n in ot)t(n).observers.push(ot[n]);return e}const op=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],TM="dthko",lp=[16,17,18,20,91,92,224,225],ga=6;function pa(i){return Math.max(0,i)*.7+8}function OM(i,e){return Math.max(Math.abs(i.clientX-e.clientX),Math.abs(i.clientY-e.clientY))}class AM{constructor(e,t,n,a){this.view=e,this.startEvent=t,this.style=n,this.mustSelect=a,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=Ag(e.contentDOM),this.atoms=e.state.facet(Ji).map(r=>r(e));let s=e.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(ne.allowMultipleSelections)&&PM(e,t),this.dragging=CM(e,t)&&cp(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&OM(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,n=0,a=0,s=0,r=this.view.win.innerWidth,o=this.view.win.innerHeight;this.scrollParents.x&&({left:a,right:r}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:s,bottom:o}=this.scrollParents.y.getBoundingClientRect());let l=y0(this.view);e.clientX-l.left<=a+ga?t=-pa(a-e.clientX):e.clientX+l.right>=r-ga&&(t=pa(e.clientX-r)),e.clientY-l.top<=s+ga?n=-pa(s-e.clientY):e.clientY+l.bottom>=o-ga&&(n=pa(e.clientY-o)),this.setScrollSpeed(t,n)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:t}=this,n=ip(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!n.eq(t.state.selection,this.dragging===!1))&&this.view.dispatch({selection:n,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}}function PM(i,e){let t=i.state.facet(Fg);return t.length?t[0](e):F.mac?e.metaKey:e.ctrlKey}function jM(i,e){let t=i.state.facet(Jg);return t.length?t[0](e):F.mac?!e.altKey:!e.ctrlKey}function CM(i,e){let{main:t}=i.state.selection;if(t.empty)return!1;let n=_i(i.root);if(!n||n.rangeCount==0)return!0;let a=n.getRangeAt(0).getClientRects();for(let s=0;s=e.clientX&&r.top<=e.clientY&&r.bottom>=e.clientY)return!0}return!1}function BM(i,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,n;t!=i.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(n=Ie.get(t))&&n.isWidget()&&!n.isHidden&&n.widget.ignoreEvent(e))return!1;return!0}const Gt=Object.create(null),ot=Object.create(null),up=F.ie&&F.ie_version<15||F.ios&&F.webkit_version<604;function DM(i){let e=i.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{i.focus(),t.remove(),mp(i,t.value)},50)}function $s(i,e,t){for(let n of i.facet(e))t=n(t,i);return t}function mp(i,e){e=$s(i.state,p0,e);let{state:t}=i,n,a=1,s=t.toText(e),r=s.lines==t.selection.ranges.length;if(ol!=null&&t.selection.ranges.every(l=>l.empty)&&ol==s.toString()){let l=-1;n=t.changeByRange(u=>{let m=t.doc.lineAt(u.from);if(m.from==l)return{range:u};l=m.from;let c=t.toText((r?s.line(a++).text:e)+t.lineBreak);return{changes:{from:m.from,insert:c},range:C.cursor(u.from+c.length,-1)}})}else r?n=t.changeByRange(l=>{let u=s.line(a++);return{changes:{from:l.from,to:l.to,insert:u.text},range:C.cursor(l.from+u.length,-1)}}):n=t.replaceSelection(s);i.dispatch(n,{userEvent:"input.paste",scrollIntoView:!0})}ot.scroll=i=>{let e=i.inputState;e.lastScrollTop=i.scrollDOM.scrollTop,e.lastScrollLeft=i.scrollDOM.scrollLeft,F.ios&&!e.touchActive&&(e.lastIOSMomentumScroll=Date.now())};ot.wheel=ot.mousewheel=i=>{i.inputState.lastWheelEvent=Date.now()};Gt.keydown=(i,e)=>(i.inputState.setSelectionOrigin("select"),e.keyCode==27&&i.inputState.tabFocusMode!=0&&(i.inputState.tabFocusMode=Date.now()+2e3),!1);ot.touchstart=(i,e)=>{let t=i.inputState,n=e.targetTouches[0];t.touchActive=!0,t.lastTouchTime=Date.now(),n&&(t.lastTouchX=n.clientX,t.lastTouchY=n.clientY),t.setSelectionOrigin("select.pointer")};ot.touchmove=i=>{i.inputState.setSelectionOrigin("select.pointer")};ot.touchend=(i,e)=>{i.inputState.touchActive=!1};Gt.mousedown=(i,e)=>{if(i.observer.flush(),i.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let n of i.state.facet(Rg))if(t=n(i,e),t)break;if(!t&&e.button==0&&(t=MM(i,e)),t){let n=!i.hasFocus;i.inputState.startMouseSelection(new AM(i,e,t,n)),n&&i.observer.ignore(()=>{Cg(i.contentDOM);let s=i.root.activeElement;s&&!s.contains(i.contentDOM)&&s.blur()});let a=i.inputState.mouseSelection;if(a)return a.start(e),a.dragging===!1}else i.inputState.setSelectionOrigin("select.pointer");return!1};function Mm(i,e,t,n){if(n==1)return C.cursor(e,t);if(n==2)return cM(i.state,e,t);{let a=i.docView.lineAt(e,t),s=i.state.doc.lineAt(a?a.posAtEnd:e),r=a?a.posAtStart:s.from,o=a?a.posAtEnd:s.to;return oDate.now()-400&&Math.abs(e.clientX-i.clientX)<2&&Math.abs(e.clientY-i.clientY)<2?(Wm+1)%3:1}function MM(i,e){let t=i.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),n=cp(e),a=i.state.selection;return{update(s){s.docChanged&&(t.pos=s.changes.mapPos(t.pos),a=a.map(s.changes))},get(s,r,o){let l=i.posAndSideAtCoords({x:s.clientX,y:s.clientY},!1),u,m=Mm(i,l.pos,l.assoc,n);if(t.pos!=l.pos&&!r){let c=Mm(i,t.pos,t.assoc,n),d=Math.min(c.from,m.from),h=Math.max(c.to,m.to);m=d1&&(u=LM(a,l.pos))?u:o?a.addRange(m):C.create([m])}}}function LM(i,e){for(let t=0;t=e)return C.create(i.ranges.slice(0,t).concat(i.ranges.slice(t+1)),i.mainIndex==t?0:i.mainIndex-(i.mainIndex>t?1:0))}return null}Gt.dragstart=(i,e)=>{let{selection:{main:t}}=i.state;if(e.target.draggable){let a=i.docView.tile.nearest(e.target);if(a&&a.isWidget()){let s=a.posAtStart,r=s+a.length;(s>=t.to||r<=t.from)&&(t=C.undirectionalRange(s,r))}}let{inputState:n}=i;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",$s(i.state,f0,i.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};Gt.dragend=i=>(i.inputState.draggedContent=null,!1);function Nm(i,e,t,n){if(t=$s(i.state,p0,t),!t)return;let a=i.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:s}=i.inputState,r=n&&s&&jM(i,e)?{from:s.from,to:s.to}:null,o={from:a,insert:t},l=i.state.changes(r?[r,o]:o);i.focus(),i.dispatch({changes:l,selection:{anchor:l.mapPos(a,-1),head:l.mapPos(a,1)},userEvent:r?"move.drop":"input.drop"}),i.inputState.draggedContent=null}Gt.drop=(i,e)=>{if(!e.dataTransfer)return!1;if(i.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let n=Array(t.length),a=0,s=()=>{++a==t.length&&Nm(i,e,n.filter(r=>r!=null).join(i.state.lineBreak),!1)};for(let r=0;r{/[\x00-\x08\x0e-\x1f]{2}/.test(o.result)||(n[r]=o.result),s()},o.readAsText(t[r])}return!0}else{let n=e.dataTransfer.getData("Text");if(n)return Nm(i,e,n,!0),!0}return!1};Gt.paste=(i,e)=>{if(i.state.readOnly)return!0;i.observer.flush();let t=up?null:e.clipboardData;return t?(mp(i,t.getData("text/plain")||t.getData("text/uri-list")),!0):(DM(i),!1)};function WM(i,e){let t=i.dom.parentNode;if(!t)return;let n=t.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout(()=>{n.remove(),i.focus()},50)}function EM(i){let e=[],t=[],n=!1;for(let a of i.selection.ranges)a.empty||(e.push(i.sliceDoc(a.from,a.to)),t.push(a));if(!e.length){let a=-1;for(let{from:s}of i.selection.ranges){let r=i.doc.lineAt(s);r.number>a&&(e.push(r.text),t.push({from:r.from,to:Math.min(i.doc.length,r.to+1)})),a=r.number}n=!0}return{text:$s(i,f0,e.join(i.lineBreak)),ranges:t,linewise:n}}let ol=null;Gt.copy=Gt.cut=(i,e)=>{if(!mi(i.contentDOM,i.observer.selectionRange))return!1;let{text:t,ranges:n,linewise:a}=EM(i.state);if(!t&&!a)return!1;ol=a?t:null,e.type=="cut"&&!i.state.readOnly&&i.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let s=up?null:e.clipboardData;return s?(s.clearData(),s.setData("text/plain",t),!0):(WM(i,t),!1)};const dp=Ln.define();function hp(i,e){let t=[];for(let n of i.facet(Vg)){let a=n(i,e);a&&t.push(a)}return t.length?i.update({effects:t,annotations:dp.of(!0)}):null}function gp(i){setTimeout(()=>{let e=i.hasFocus;if(e!=i.inputState.notifiedFocused){let t=hp(i.state,e);t?i.dispatch(t):i.update([])}},10)}ot.focus=i=>{i.inputState.lastFocusTime=Date.now(),!i.scrollDOM.scrollTop&&(i.inputState.lastScrollTop||i.inputState.lastScrollLeft)&&(i.scrollDOM.scrollTop=i.inputState.lastScrollTop,i.scrollDOM.scrollLeft=i.inputState.lastScrollLeft),gp(i)};ot.blur=i=>{i.observer.clearSelectionRange(),gp(i)};ot.compositionstart=ot.compositionupdate=(i,e)=>{if(!i.observer.editContext&&(i.inputState.compositionFirstChange==null&&(i.inputState.compositionFirstChange=!0),i.inputState.composing<0)){let{main:t}=i.state.selection;!t.empty&&i.lineBlockAt(t.from).from!=i.lineBlockAt(t.to).from&&!i.state.readOnly&&i.dispatch({changes:i.state.selection.ranges.filter(n=>!n.empty).map(n=>({from:n.from,to:n.to})),userEvent:"input"}),i.inputState.composing=0}};ot.compositionend=i=>{i.observer.editContext||(i.inputState.composing=-1,i.inputState.compositionEndedAt=Date.now(),i.inputState.compositionPendingKey=!0,i.inputState.compositionPendingChange=i.observer.pendingRecords().length>0,i.inputState.compositionFirstChange=null,F.chrome&&F.android?i.observer.flushSoon():i.inputState.compositionPendingChange?Promise.resolve().then(()=>i.observer.flush()):setTimeout(()=>{i.inputState.composing<0&&i.docView.hasComposition&&i.update([])},50))};ot.contextmenu=i=>{i.inputState.lastContextMenu=Date.now()};Gt.beforeinput=(i,e)=>{var t,n;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(i.inputState.insertingText=e.data,i.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&i.observer.editContext){let s=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),r=e.getTargetRanges();if(s&&r.length){let o=r[0],l=i.posAtDOM(o.startContainer,o.startOffset),u=i.posAtDOM(o.endContainer,o.endOffset);return v0(i,{from:l,to:u,insert:i.state.toText(s)},null),!0}}let a;if(F.chrome&&F.android&&(a=op.find(s=>s.inputType==e.inputType))&&(i.observer.delayAndroidKey(a.key,a.keyCode),a.key=="Backspace"||a.key=="Delete")){let s=((n=window.visualViewport)===null||n===void 0?void 0:n.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>s+10&&i.hasFocus&&(i.contentDOM.blur(),i.focus())},100)}return F.ios&&e.inputType=="deleteContentForward"&&i.observer.flushSoon(),F.safari&&e.inputType=="insertText"&&i.inputState.composing>=0&&setTimeout(()=>ot.compositionend(i,e),20),!1};const Fm=new Set;function NM(i){Fm.has(i)||(Fm.add(i),i.addEventListener("copy",()=>{}),i.addEventListener("cut",()=>{}))}const Jm=["pre-wrap","normal","pre-line","break-spaces"];let B1=!1;function Rm(){B1=!1}class FM{constructor(e){this.lineWrapping=e,this.doc=ae.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let n=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(n+=Math.max(0,Math.ceil((t-e-n*this.lineLength*.5)/this.lineLength))),this.lineHeight*n}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return Jm.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let n=0;n-1,l=Math.abs(t-this.lineHeight)>.3||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=t,this.charWidth=n,this.textHeight=a,this.lineLength=s,l){this.heightSamples={};for(let u=0;u0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>Ja&&(B1=!0),this.height=e)}replace(e,t,n){return rt.of(n)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,n,a){let s=this,r=n.doc;for(let o=a.length-1;o>=0;o--){let{fromA:l,toA:u,fromB:m,toB:c}=a[o],d=s.lineAt(l,ge.ByPosNoHeight,n.setDoc(t),0,0),h=d.to>=u?d:s.lineAt(u,ge.ByPosNoHeight,n,0,0);for(c+=h.to-u,u=h.to;o>0&&d.from<=a[o-1].toA;)l=a[o-1].fromA,m=a[o-1].fromB,o--,ls*2){let o=e[t-1];o.break?e.splice(--t,1,o.left,null,o.right):e.splice(--t,1,o.left,o.right),n+=1+o.break,a-=o.size}else if(s>a*2){let o=e[n];o.break?e.splice(n,1,o.left,null,o.right):e.splice(n,1,o.left,o.right),n+=2+o.break,s-=o.size}else break;else if(a=s&&r(this.lineAt(0,ge.ByPos,n,a,s))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more&&this.setMeasuredHeight(a),this.outdated=!1,this}toString(){return`block(${this.length})`}}class xt extends pp{constructor(e,t,n){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=n}mainBlock(e,t){return new Ft(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,n){let a=n[0];return n.length==1&&(a instanceof xt||a instanceof Ne&&a.flags&4)&&Math.abs(this.length-a.length)<10?(a instanceof Ne?a=new xt(a.length,this.height,this.spaceAbove):a.height=this.height,this.outdated||(a.outdated=!1),a):rt.of(n)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more?this.setMeasuredHeight(a):(n||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class Ne extends rt{constructor(e){super(e,0)}heightMetrics(e,t){let n=e.doc.lineAt(t).number,a=e.doc.lineAt(t+this.length).number,s=a-n+1,r,o=0;if(e.lineWrapping){let l=Math.min(this.height,e.lineHeight*s);r=l/s,this.length>s+1&&(o=(this.height-l)/(this.length-s-1))}else r=this.height/s;return{firstLine:n,lastLine:a,perLine:r,perChar:o}}blockAt(e,t,n,a){let{firstLine:s,lastLine:r,perLine:o,perChar:l}=this.heightMetrics(t,a);if(t.lineWrapping){let u=a+(e0){let s=n[n.length-1];s instanceof Ne?n[n.length-1]=new Ne(s.length+a):n.push(null,new Ne(a-1))}if(e>0){let s=n[0];s instanceof Ne?n[0]=new Ne(e+s.length):n.unshift(new Ne(e-1),null)}return rt.of(n)}decomposeLeft(e,t){t.push(new Ne(e-1),null)}decomposeRight(e,t){t.push(null,new Ne(this.length-e-1))}updateHeight(e,t=0,n=!1,a){let s=t+this.length;if(a&&a.from<=t+this.length&&a.more){let r=[],o=Math.max(t,a.from),l=-1;for(a.from>t&&r.push(new Ne(a.from-t-1).updateHeight(e,t));o<=s&&a.more;){let m=e.doc.lineAt(o).length;r.length&&r.push(null);let c=a.heights[a.index++],d=0;c<0&&(d=-c,c=a.heights[a.index++]),l==-1?l=c:Math.abs(c-l)>=Ja&&(l=-2);let h=new xt(m,c,d);h.outdated=!1,r.push(h),o+=m+1}o<=s&&r.push(null,new Ne(s-o).updateHeight(e,o));let u=rt.of(r);return(l<0||Math.abs(u.height-this.height)>=Ja||Math.abs(l-this.heightMetrics(e,t).perLine)>=Ja)&&(B1=!0),zs(this,u)}else(n||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}}class GM extends rt{constructor(e,t,n){super(e.length+(t?1:0)+n.length,e.height+n.height,(t?1:0)|(e.outdated||n.outdated?2:0)),this.left=e,this.right=n,this.size=e.size+n.size}get break(){return this.flags&1}blockAt(e,t,n,a){let s=n+this.left.height;return eo))return u;let m=t==ge.ByPosNoHeight?ge.ByPosNoHeight:ge.ByPos;return l?u.join(this.right.lineAt(o,m,n,r,o)):this.left.lineAt(o,m,n,a,s).join(u)}forEachLine(e,t,n,a,s,r){let o=a+this.left.height,l=s+this.left.length+this.break;if(this.break)e=l&&this.right.forEachLine(e,t,n,o,l,r);else{let u=this.lineAt(l,ge.ByPos,n,a,s);e=e&&u.from<=t&&r(u),t>u.to&&this.right.forEachLine(Math.max(e,u.to+1),t,n,o,l,r)}}replace(e,t,n){let a=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-a,t-a,n));let s=[];e>0&&this.decomposeLeft(e,s);let r=s.length;for(let o of n)s.push(o);if(e>0&&Gm(s,r-1),t=n&&t.push(null)),e>n&&this.right.decomposeLeft(e-n,t)}decomposeRight(e,t){let n=this.left.length,a=n+this.break;if(e>=a)return this.right.decomposeRight(e-a,t);e2*t.size||t.size>2*e.size?rt.of(this.break?[e,null,t]:[e,t]):(this.left=zs(this.left,e),this.right=zs(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,n=!1,a){let{left:s,right:r}=this,o=t+s.length+this.break,l=null;return a&&a.from<=t+s.length&&a.more?l=s=s.updateHeight(e,t,n,a):s.updateHeight(e,t,n),a&&a.from<=o+r.length&&a.more?l=r=r.updateHeight(e,o,n,a):r.updateHeight(e,o,n),l?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function Gm(i,e){let t,n;i[e]==null&&(t=i[e-1])instanceof Ne&&(n=i[e+1])instanceof Ne&&i.splice(e-1,3,new Ne(t.length+1+n.length))}const HM=5;class w0{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let n=Math.min(t,this.lineEnd),a=this.nodes[this.nodes.length-1];a instanceof xt?a.length+=n-this.pos:(n>this.pos||!this.isCovered)&&this.nodes.push(new xt(n-this.pos,-1,0)),this.writtenTo=n,t>n&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,n){if(e=HM)&&this.addLineDeco(a,s,r)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new xt(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let n=new Ne(t-e);return this.oracle.doc.lineAt(e).to==t&&(n.flags|=4),n}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof xt)return e;let t=new xt(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,n){let a=this.ensureLine();a.length+=n,a.collapsed+=n,a.widgetHeight=Math.max(a.widgetHeight,e),a.breaks+=t,this.writtenTo=this.pos=this.pos+n}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof xt)&&!this.isCovered?this.nodes.push(new xt(0,-1,0)):(this.writtenTou.clientHeight||u.scrollWidth>u.clientWidth)&&m.overflow!="visible"){let c=u.getBoundingClientRect();s=Math.max(s,c.left),r=Math.min(r,c.right),o=Math.max(o,c.top),l=Math.min(u==i.parentNode?a.innerHeight:l,c.bottom)}u=m.position=="absolute"||m.position=="fixed"?u.offsetParent:u.parentNode}else if(u.nodeType==11)u=u.host;else break;return{left:s-t.left,right:Math.max(s,r)-t.left,top:o-(t.top+e),bottom:Math.max(o,l)-(t.top+e)}}function UM(i){let e=i.getBoundingClientRect(),t=i.ownerDocument.defaultView||window;return e.left0&&e.top0}function $M(i,e){let t=i.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}class jr{constructor(e,t,n,a){this.from=e,this.to=t,this.size=n,this.displaySize=a}static same(e,t){if(e.length!=t.length)return!1;for(let n=0;ntypeof a!="function"&&a.class=="cm-lineWrapping");this.heightOracle=new FM(n),this.stateDeco=Vm(t),this.heightMap=rt.empty().applyChanges(this.stateDeco,ae.empty,this.heightOracle.setDoc(t.doc),[new jt(0,0,0,t.doc.length)]);for(let a=0;a<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());a++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ue.set(this.lineGaps.map(a=>a.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let n=0;n<=1;n++){let a=n?t.head:t.anchor;if(!e.some(({from:s,to:r})=>a>=s&&a<=r)){let{from:s,to:r}=this.lineBlockAt(a);e.push(new fa(s,r))}}return this.viewports=e.sort((n,a)=>n.from-a.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?ll:Is.get(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(ei(e,this.scaler))})}update(e,t=null){this.state=e.state;let n=this.stateDeco;this.stateDeco=Vm(this.state);let a=e.changedRanges,s=jt.extendWithRanges(a,VM(n,this.stateDeco,e?e.changes:Me.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);Rm(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),s),(this.heightMap.height!=r||B1)&&(e.flags|=2),o?(this.scrollAnchorPos=e.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=r);let l=s.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.headl.to)||!this.viewportIsAppropriate(l))&&(l=this.getViewport(0,t));let u=l.from!=this.viewport.from||l.to!=this.viewport.to;this.viewport=l,e.flags|=this.updateForViewport(),(u||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(JZ)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,t=e.contentDOM,n=window.getComputedStyle(t),a=this.heightOracle,s=n.whiteSpace;this.defaultTextDirection=n.direction=="rtl"?de.RTL:de.LTR;let r=this.heightOracle.mustRefreshForWrapping(s)||this.mustMeasureContent==="refresh",o=t.getBoundingClientRect(),l=r||this.mustMeasureContent||this.contentDOMHeight!=o.height;this.contentDOMHeight=o.height,this.mustMeasureContent=!1;let u=0,m=0;if(o.width&&o.height){let{scaleX:z,scaleY:S}=Og(t,o);(z>.005&&Math.abs(this.scaleX-z)>.005||S>.005&&Math.abs(this.scaleY-S)>.005)&&(this.scaleX=z,this.scaleY=S,u|=16,r=l=!0)}let c=(parseInt(n.paddingTop)||0)*this.scaleY,d=(parseInt(n.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=d)&&(this.paddingTop=c,this.paddingBottom=d,u|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(a.lineWrapping&&(l=!0),this.editorWidth=e.scrollDOM.clientWidth,u|=16);let h=Ag(this.view.contentDOM,!1).y;h!=this.scrollParent&&(this.scrollParent=h,this.scrollAnchorHeight=-1,this.scrollOffset=0);let g=this.getScrollOffset();this.scrollOffset!=g&&(this.scrollAnchorHeight=-1,this.scrollOffset=g),this.scrolledToBottom=Bg(this.scrollParent||e.win);let f=(this.printing?$M:qM)(t,this.paddingTop),x=f.top-this.pixelViewport.top,b=f.bottom-this.pixelViewport.bottom;this.pixelViewport=f;let y=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(y!=this.inView&&(this.inView=y,y&&(l=!0)),!this.inView&&!this.scrollTarget&&!UM(e.dom))return 0;let w=o.width;if((this.contentDOMWidth!=w||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=o.width,this.editorHeight=e.scrollDOM.clientHeight,u|=16),l){let z=e.docView.measureVisibleLineHeights(this.viewport);if(a.mustRefreshForHeights(z)&&(r=!0),r||a.lineWrapping&&Math.abs(w-this.contentDOMWidth)>a.charWidth){let{lineHeight:S,charWidth:k,textHeight:T}=e.docView.measureTextSize();r=S>0&&a.refresh(s,S,k,T,Math.max(5,w/k),z),r&&(e.docView.minWidth=0,u|=16)}x>0&&b>0?m=Math.max(x,b):x<0&&b<0&&(m=Math.min(x,b)),Rm();for(let S of this.viewports){let k=S.from==this.viewport.from?z:e.docView.measureVisibleLineHeights(S);this.heightMap=(r?rt.empty().applyChanges(this.stateDeco,ae.empty,this.heightOracle,[new jt(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(a,0,r,new JM(S.from,k))}B1&&(u|=2)}let _=!this.viewportIsAppropriate(this.viewport,m)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return _&&(u&2&&(u|=this.updateScaler()),this.viewport=this.getViewport(m,this.scrollTarget),u|=this.updateForViewport()),(u&2||_)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(r?[]:this.lineGaps,e)),u|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),u}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let n=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),a=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,l=new fa(a.lineAt(r-n*1e3,ge.ByHeight,s,0,0).from,a.lineAt(o+(1-n)*1e3,ge.ByHeight,s,0,0).to);if(t){let{head:u}=t.range;if(ul.to){let m=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=a.lineAt(u,ge.ByPos,s,0,0),d;t.y=="center"?d=(c.top+c.bottom)/2-m/2:t.y=="start"||t.y=="nearest"&&u=o+Math.max(10,Math.min(n,250)))&&a>r-2*1e3&&s>1,r=a<<1;if(this.defaultTextDirection!=de.LTR&&!n)return[];let o=[],l=(m,c,d,h)=>{if(c-mm&&bb.from>=d.from&&b.to<=d.to&&Math.abs(b.from-m)b.fromy));if(!x){if(cw.from<=c&&w.to>=c)){let w=t.moveToLineBoundary(C.cursor(c),!1,!0).head;w>m&&(c=w)}let b=this.gapSize(d,m,c,h),y=n||b<2e6?b:2e6;x=new jr(m,c,b,y)}o.push(x)},u=m=>{if(m.length2e6)for(let S of e)S.from>=m.from&&S.fromm.from&&l(m.from,h,m,c),gt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let n=[];Y.spans(t,this.viewport.from,this.viewport.to,{span(s,r){n.push({from:s,to:r})},point(){}},20);let a=0;if(n.length!=this.visibleRanges.length)a=12;else for(let s=0;s=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||ei(this.heightMap.lineAt(e,ge.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||ei(this.heightMap.lineAt(this.scaler.fromDOM(e),ge.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop*this.scaleY:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+12-this.paddingTop);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return ei(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class fa{constructor(e,t){this.from=e,this.to=t}}function XM(i,e,t){let n=[],a=i,s=0;return Y.spans(t,i,e,{span(){},point(r,o){r>a&&(n.push({from:a,to:r}),s+=r-a),a=o}},20),a=1)return e[e.length-1].to;let n=Math.floor(i*t);for(let a=0;;a++){let{from:s,to:r}=e[a],o=r-s;if(n<=o)return s+n;n-=o}}function ba(i,e){let t=0;for(let{from:n,to:a}of i.ranges){if(e<=a){t+=e-n;break}t+=a-n}return t/i.total}function KM(i,e){for(let t of i)if(e(t))return t}const ll={toDOM(i){return i},fromDOM(i){return i},scale:1,eq(i){return i==this}};function Vm(i){let e=i.facet(Qs).filter(n=>typeof n!="function"),t=i.facet(b0).filter(n=>typeof n!="function");return t.length&&e.push(Y.join(t)),e}class Is{constructor(e,t){this.scale=e,this.viewports=t}static get(e,t,n){let a=0,s=0,r=0,o=n.map(({from:u,to:m})=>{let c=t.lineAt(u,ge.ByPos,e,0,0).top,d=t.lineAt(m,ge.ByPos,e,0,0).bottom;return a+=d-c,{from:u,to:m,top:c,bottom:d,domTop:0,domBottom:0}});if(t.height-a<10)return ll;let l=(7e6-a)/(t.height-a);for(let u of o)u.domTop=r+(u.top-s)*l,r=u.domBottom=u.domTop+(u.bottom-u.top),s=u.bottom;return new Is(l,o)}toDOM(e){for(let t=0,n=0,a=0;;t++){let s=tt.from==e.viewports[n].from&&t.to==e.viewports[n].to):!1}}function ei(i,e){if(e.scale==1)return i;let t=e.toDOM(i.top),n=e.toDOM(i.bottom);return new Ft(i.from,i.length,t,n-t,Array.isArray(i._content)?i._content.map(a=>ei(a,e)):i._content)}const ya=G.define({combine:i=>i.join(" ")}),ul=G.define({combine:i=>i.indexOf(!0)>-1}),ml=Bn.newName(),fp=Bn.newName(),xp=Bn.newName(),bp={"&light":"."+fp,"&dark":"."+xp};function cl(i,e,t){return new Bn(e,{finish(n){return/&/.test(n)?n.replace(/&\w*/,a=>{if(a=="&")return i;if(!t||!t[a])throw new RangeError(`Unsupported selector: ${a}`);return t[a]}):i+" "+n}})}const eL=cl("."+ml,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{userSelect:"none",position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},".cm-panels-top":{top:"0"},".cm-panels-bottom":{bottom:"0"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"baseline",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{background:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 0) no-repeat",backgroundSize:".4em",backgroundPosition:"calc(min(50%, 0px)) center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},bp),tL={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Cr=F.ie&&F.ie_version<=11;class nL{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new PZ,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let n of t)this.queue.push(n);(F.ie&&F.ie_version<=11||F.ios&&e.composing)&&t.some(n=>n.type=="childList"&&n.removedNodes.length||n.type=="characterData"&&n.oldValue.length>n.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&F.android&&e.constructor.EDIT_CONTEXT!==!1&&!(F.chrome&&F.chrome_version<126)&&(this.editContext=new aL(e),e.state.facet(mn)&&(e.contentDOM.editContext=this.editContext.editContext)),Cr&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(this.pendingRecords().length>0),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,n)=>t!=e[n]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:n}=this,a=this.selectionRange;if(n.state.facet(mn)?n.root.activeElement!=this.dom:!mi(this.dom,a))return;let s=a.anchorNode&&n.docView.tile.nearest(a.anchorNode);if(s&&s.isWidget()&&s.widget.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(F.ie&&F.ie_version<=11||F.android&&F.chrome)&&!n.state.selection.main.empty&&a.focusNode&&ci(a.focusNode,a.focusOffset,a.anchorNode,a.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=_i(e.root);if(!t)return!1;let n=F.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&iL(this.view,t)||t;if(!n||this.selectionRange.eq(n))return!1;let a=mi(this.dom,n);return a&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let s=this.delayedAndroidKey;s&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=s.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&s.force&&k1(this.dom,s.key,s.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(a)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,n=-1,a=!1;for(let s of e){let r=this.readMutation(s);r&&(r.typeOver&&(a=!0),t==-1?{from:t,to:n}=r:(t=Math.min(r.from,t),n=Math.max(r.to,n)))}return{from:t,to:n,typeOver:a}}readChange(){let{from:e,to:t,typeOver:n}=this.processRecords(),a=this.selectionChanged&&mi(this.dom,this.selectionRange);if(e<0&&!a)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new vM(this.view,e,t,n);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.selectionChanged,n=this.readChange();if(!n)return this.view.requestMeasure(),!1;let a=this.view.state,s=sp(this.view,n);return this.view.state==a&&(n.domChanged||t)&&this.view.update([]),s}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty(e.type=="attributes"),e.type=="childList"){let n=Qm(t,e.previousSibling||e.target.previousSibling,-1),a=Qm(t,e.nextSibling||e.target.nextSibling,1);return{from:n?t.posAfter(n):t.posAtStart,to:a?t.posBefore(a):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(mn)!=e.state.facet(mn)&&(e.view.contentDOM.editContext=e.state.facet(mn)?this.editContext.editContext:null))}destroy(){var e,t,n;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(n=this.resizeScroll)===null||n===void 0||n.disconnect();for(let a of this.scrollTargets)a.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function Qm(i,e,t){for(;e;){let n=Ie.get(e);if(n&&n.parent==i)return n;let a=e.parentNode;e=a!=i.dom?a:t>0?e.nextSibling:e.previousSibling}return null}function qm(i,e){let t=e.startContainer,n=e.startOffset,a=e.endContainer,s=e.endOffset,r=i.docView.domAtPos(i.state.selection.main.anchor,1);return ci(r.node,r.offset,a,s)&&([t,n,a,s]=[a,s,t,n]),{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}}function iL(i,e){if(e.getComposedRanges){let a=e.getComposedRanges(i.root)[0];if(a)return qm(i,a)}let t=null;function n(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}return i.contentDOM.addEventListener("beforeinput",n,!0),i.dom.ownerDocument.execCommand("indent"),i.contentDOM.removeEventListener("beforeinput",n,!0),t?qm(i,t):null}class aL{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=n=>{let a=e.state.selection.main,{anchor:s,head:r}=a,o=this.toEditorPos(n.updateRangeStart),l=this.toEditorPos(n.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:n.updateRangeStart,editorBase:o,drifted:!1});let u=l-o>n.text.length;o==this.from&&sthis.to&&(l=s);let m=rp(e.state.sliceDoc(o,l),n.text,(u?a.from:a.to)-o,u?"end":null);if(!m){let d=C.single(this.toEditorPos(n.selectionStart),this.toEditorPos(n.selectionEnd));rl(d,a)||e.dispatch({selection:d,userEvent:"select"});return}let c={from:m.from+o,to:m.toA+o,insert:ae.of(n.text.slice(m.from,m.toB).split(` -`))};if((F.mac||F.android)&&c.from==r-1&&/^\. ?$/.test(n.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(c={from:o,to:l,insert:ae.of([n.text.replace("."," ")])}),this.pendingContextChange=c,!e.state.readOnly){let d=this.to-this.from+(c.to-c.from+c.insert.length);v0(e,c,C.single(this.toEditorPos(n.selectionStart,d),this.toEditorPos(n.selectionEnd,d)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),c.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,n.updateRangeStart-1),Math.min(t.text.length,n.updateRangeStart+1)))&&this.handlers.compositionend(n)},this.handlers.characterboundsupdate=n=>{let a=[],s=null;for(let r=this.toEditorPos(n.rangeStart),o=this.toEditorPos(n.rangeEnd);r{let a=[];for(let s of n.getTextFormats()){let r=s.underlineStyle,o=s.underlineThickness;if(!/none/i.test(r)&&!/none/i.test(o)){let l=this.toEditorPos(s.rangeStart),u=this.toEditorPos(s.rangeEnd);if(l{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:n}=this.composing;this.composing=null,n&&this.reset(e.state)}};for(let n in this.handlers)t.addEventListener(n,this.handlers[n]);this.measureReq={read:n=>{let a=_i(n.root);a&&a.rangeCount&&this.editContext.updateSelectionBounds(a.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,n=!1,a=this.pendingContextChange;return e.changes.iterChanges((s,r,o,l,u)=>{if(n)return;let m=u.length-(r-s);if(a&&r>=a.to)if(a.from==s&&a.to==r&&a.insert.eq(u)){a=this.pendingContextChange=null,t+=m,this.to+=m;return}else a=null,this.revertPending(e.state);if(s+=t,r+=t,r<=this.from)this.from+=m,this.to+=m;else if(sthis.to||this.to-this.from+u.length>3e4){n=!0;return}this.editContext.updateText(this.toContextPos(s),this.toContextPos(r),u.toString()),this.to+=m}t+=m}),a&&!n&&this.revertPending(e.state),!n}update(e){let t=this.pendingContextChange,n=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(n.from,n.to)&&e.transactions.some(a=>!a.isUserEvent("input.type")&&a.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,n=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),a=this.toContextPos(t.head);(this.editContext.selectionStart!=n||this.editContext.selectionEnd!=a)&&this.editContext.updateSelection(n,a)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let n=this.composing;return n&&n.drifted?n.editorBase+(e-n.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}}class H{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.clearAnnouncement=-1,this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:n}=e;this.dispatchTransactions=e.dispatchTransactions||n&&(a=>a.forEach(s=>n(s,this)))||(a=>this.update(a)),this.dispatch=this.dispatch.bind(this),this._root=e.root||jZ(e.parent)||document,this.viewState=new Hm(this,e.state||ne.create(e)),e.scrollTo&&e.scrollTo.is(ha)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(x1).map(a=>new _r(a));for(let a of this.plugins)a.update(this);this.observer=new nL(this),this.inputState=new kM(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Cm(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...e){let t=e.length==1&&e[0]instanceof Re?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,n=!1,a,s=this.state;for(let d of e){if(d.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=d.state}if(this.destroyed){this.viewState.state=s;return}let r=this.hasFocus,o=0,l=null;e.some(d=>d.annotation(dp))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=hp(s,r),l||(o=1));let u=this.observer.delayedAndroidKey,m=null;if(u?(this.observer.clearDelayedAndroidKey(),m=this.observer.readChange(),(m&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(m=null)):this.observer.clear(),s.facet(ne.phrases)!=this.state.facet(ne.phrases))return this.setState(s);a=ys.create(this,s,e),a.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let d of e){if(c&&(c=c.map(d.changes)),d.scrollIntoView){let{main:h}=d.state.selection,{x:g,y:f}=this.state.facet(H.cursorScrollMargin);c=new S1(h.empty?h:C.cursor(h.head,h.head>h.anchor?-1:1),"nearest","nearest",f,g)}for(let h of d.effects)h.is(ha)&&(c=h.value.clip(this.state))}this.viewState.update(a,c),this.bidiCache=ks.update(this.bidiCache,a.changes),a.empty||(this.updatePlugins(a),this.inputState.update(a)),t=this.docView.update(a),this.state.facet(K1)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(a.startState.facet(ya)!=a.state.facet(ya)&&(this.viewState.mustMeasureContent=!0),(t||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!a.empty)for(let d of this.state.facet(nl))try{d(a)}catch(h){bt(this.state,h,"update listener")}(l||m)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),m&&!sp(this,m)&&u.force&&k1(this.contentDOM,u.key,u.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Hm(this,e),this.plugins=e.facet(x1).map(n=>new _r(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new Cm(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(x1),n=e.state.facet(x1);if(t!=n){let a=[];for(let s of n){let r=t.indexOf(s);if(r<0)a.push(new _r(s));else{let o=this.plugins[r];o.mustUpdate=e,a.push(o)}}for(let s of this.plugins)s.mustUpdate!=e&&s.destroy(this);this.plugins=a,this.pluginMap.clear()}else for(let a of this.plugins)a.mustUpdate=e;for(let a=0;a-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,n=this.viewState.scrollParent,a=this.viewState.getScrollOffset(),{scrollAnchorPos:s,scrollAnchorHeight:r,scaleY:o}=this.viewState;Math.abs(a-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(r<0){if(Bg(n||this.win))s=-1,r=this.viewState.heightMap.height/this.viewState.scaleY;else{let g=this.viewState.scrollAnchorAt(a);s=g.from,r=g.top}o=this.viewState.scaleY}this.updateState=1;let u=this.viewState.measure();if(!u&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let m=[];u&4||([this.measureRequests,m]=[m,this.measureRequests]);let c=m.map(g=>{try{return g.read(this)}catch(f){return bt(this.state,f),Um}}),d=ys.create(this,this.state,[]),h=!1;d.flags|=u,t?t.flags|=u:t=d,this.updateState=2,d.empty||(this.updatePlugins(d),this.inputState.update(d),this.updateAttrs(),h=this.docView.update(d),h&&this.docViewUpdate());for(let g=0;g1||f<-1)&&!(F.ios&&this.inputState.lastIOSMomentumScroll>Date.now()-100)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){a=a+f,n?s<0?n.scrollTop=n.scrollHeight:n.scrollTop+=f:this.win.scrollBy(0,f),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let l of this.state.facet(nl))l(t)}get themeClasses(){return ml+" "+(this.state.facet(ul)?xp:fp)+" "+this.state.facet(ya)}updateAttrs(){let e=$m(this,$g,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(mn)?"true":"false",class:"cm-content",style:`${F.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),$m(this,x0,t);let n=this.observer.ignore(()=>{let a=_m(this.contentDOM,this.contentAttrs,t),s=_m(this.dom,this.editorAttrs,e);return a||s});return this.editorAttrs=e,this.contentAttrs=t,n}showAnnouncements(e){let t=!0;for(let n of e)for(let a of n.effects)if(a.is(H.announce)){t&&(this.announceDOM.textContent="",this.win.clearTimeout(this.clearAnnouncement),this.clearAnnouncement=this.win.setTimeout(()=>{this.announceDOM.textContent=" "},200),t=!1);let s=this.announceDOM.appendChild(document.createElement("div"));s.textContent=a.value}}mountStyles(){this.styleModules=this.state.facet(K1);let e=this.state.facet(H.cspNonce);Bn.mount(this.root,this.styleModules.concat(eL).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;tn.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,n){return Pr(this,e,Bm(this,e,t,n))}moveByGroup(e,t){return Pr(this,e,Bm(this,e,t,n=>gM(this,e.head,n)))}visualLineSide(e,t){return t?C.cursor(e.to,1):C.cursor(e.from,-1)}moveToLineBoundary(e,t,n=!0){return hM(this,e,t,n)}moveVertically(e,t,n){return Pr(this,e,pM(this,e,t,n))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let n=sl(this,e,t);return n&&n.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),sl(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let n=this.state.doc.lineAt(e),a=this.bidiSpans(n),s=a[an.find(a,e-n.from,-1,t)];return n.length&&(e==n.from&&t<0||e==n.to&&t>0)&&s.dir!=this.textDirectionAt(n.from)&&(e==n.to?(e=n.from+s.from,t=1):(e=n.from+s.to,t=-1)),this.docView.coordsAt(e,t,s.dir==de.RTL)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(Qg)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>sL)return Eg(e.length);let t=this.textDirectionAt(e.from),n;for(let s of this.bidiCache)if(s.from==e.from&&s.dir==t&&(s.fresh||Wg(s.isolates,n=Am(this,e))))return s.order;n||(n=Am(this,e));let a=EZ(e.text,t,n);return this.bidiCache.push(new ks(e.from,e.to,t,n,!0,a)),a}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||F.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Cg(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.win.clearTimeout(this.clearAnnouncement),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){var n,a,s,r;return ha.of(new S1(typeof e=="number"?C.cursor(e):e,(n=t.y)!==null&&n!==void 0?n:"nearest",(a=t.x)!==null&&a!==void 0?a:"nearest",(s=t.yMargin)!==null&&s!==void 0?s:5,(r=t.xMargin)!==null&&r!==void 0?r:5))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,n=this.viewState.scrollAnchorAt(e);return ha.of(new S1(C.cursor(n.from),"start","start",n.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return Dt.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return Dt.define(()=>({}),{eventObservers:e})}static theme(e,t){let n=Bn.newName(),a=[ya.of(n),K1.of(cl(`.${n}`,e))];return t&&t.dark&&a.push(ul.of(!0)),a}static baseTheme(e){return r1.lowest(K1.of(cl("."+ml,e,bp)))}static findFromDOM(e){var t;let n=e.querySelector(".cm-content"),a=n&&Ie.get(n)||Ie.get(e);return((t=a==null?void 0:a.root)===null||t===void 0?void 0:t.view)||null}}H.styleModule=K1;H.inputHandler=Hg;H.clipboardInputFilter=p0;H.clipboardOutputFilter=f0;H.scrollHandler=qg;H.focusChangeEffect=Vg;H.perLineTextDirection=Qg;H.exceptionSink=Gg;H.updateListener=nl;H.editable=mn;H.mouseSelectionStyle=Rg;H.dragMovesSelection=Jg;H.clickAddsSelectionRange=Fg;H.decorations=Qs;H.blockWrappers=Yg;H.outerDecorations=b0;H.atomicRanges=Ji;H.bidiIsolatedRanges=Xg;H.cursorScrollMargin=G.define({combine:i=>{let e=5,t=5;for(let n of i)typeof n=="number"?e=t=n:{x:e,y:t}=n;return{x:e,y:t}}});H.scrollMargins=ep;H.darkTheme=ul;H.cspNonce=G.define({combine:i=>i.length?i[0]:""});H.contentAttributes=x0;H.editorAttributes=$g;H.lineWrapping=H.contentAttributes.of({class:"cm-lineWrapping"});H.announce=re.define();const sL=4096,Um={};class ks{constructor(e,t,n,a,s,r){this.from=e,this.to=t,this.dir=n,this.isolates=a,this.fresh=s,this.order=r}static update(e,t){if(t.empty&&!e.some(s=>s.fresh))return e;let n=[],a=e.length?e[e.length-1].dir:de.LTR;for(let s=Math.max(0,e.length-10);s=0;a--){let s=n[a],r=typeof s=="function"?s(i):s;r&&d0(r,t)}return t}const rL=F.mac?"mac":F.windows?"win":F.linux?"linux":"key";function oL(i,e){const t=i.split(/-(?!$)/);let n=t[t.length-1];n=="Space"&&(n=" ");let a,s,r,o;for(let l=0;ln.concat(a),[]))),t}let _n=null;const mL=4e3;function cL(i,e=rL){let t=Object.create(null),n=Object.create(null),a=(r,o)=>{let l=n[r];if(l==null)n[r]=o;else if(l!=o)throw new Error("Key binding "+r+" is used both as a regular binding and as a multi-stroke prefix")},s=(r,o,l,u,m)=>{var c,d;let h=t[r]||(t[r]=Object.create(null)),g=o.split(/ (?!$)/).map(b=>oL(b,e));for(let b=1;b{let _=_n={view:w,prefix:y,scope:r};return setTimeout(()=>{_n==_&&(_n=null)},mL),!0}]})}let f=g.join(" ");a(f,!1);let x=h[f]||(h[f]={preventDefault:!1,stopPropagation:!1,run:((d=(c=h._any)===null||c===void 0?void 0:c.run)===null||d===void 0?void 0:d.slice())||[]});l&&x.run.push(l),u&&(x.preventDefault=!0),m&&(x.stopPropagation=!0)};for(let r of i){let o=r.scope?r.scope.split(" "):["editor"];if(r.any)for(let u of o){let m=t[u]||(t[u]=Object.create(null));m._any||(m._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:c}=r;for(let d in m)m[d].run.push(h=>c(h,dl))}let l=r[e]||r.key;if(l)for(let u of o)s(u,l,r.run,r.preventDefault,r.stopPropagation),r.shift&&s(u,"Shift-"+l,r.shift,r.preventDefault,r.stopPropagation)}return t}let dl=null;function dL(i,e,t,n){dl=e;let a=kZ(e),s=_t(a,0),r=un(s)==a.length&&a!=" ",o="",l=!1,u=!1,m=!1;_n&&_n.view==t&&_n.scope==n&&(o=_n.prefix+" ",lp.indexOf(e.keyCode)<0&&(u=!0,_n=null));let c=new Set,d=x=>{if(x){for(let b of x.run)if(!c.has(b)&&(c.add(b),b(t)))return x.stopPropagation&&(m=!0),!0;x.preventDefault&&(x.stopPropagation&&(m=!0),u=!0)}return!1},h=i[n],g,f;return h&&(d(h[o+va(a,e,!r)])?l=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(F.windows&&e.ctrlKey&&e.altKey)&&!(F.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(g=Dn[e.keyCode])&&g!=a?(d(h[o+va(g,e,!0)])||e.shiftKey&&(f=ki[e.keyCode])!=a&&f!=g&&d(h[o+va(f,e,!1)]))&&(l=!0):r&&e.shiftKey&&d(h[o+va(a,e,!0)])&&(l=!0),!l&&d(h._any)&&(l=!0)),u&&(l=!0),l&&m&&e.stopPropagation(),dl=null,l}class Ys{constructor(e,t,n,a,s){this.className=e,this.left=t,this.top=n,this.width=a,this.height=s}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,n){if(n.empty){let a=e.coordsAtPos(n.head,n.assoc||1);if(!a)return[];let s=yp(e);return[new Ys(t,a.left-s.left,a.top-s.top,null,a.bottom-a.top)]}else return hL(e,t,n)}}function yp(i){let e=i.scrollDOM.getBoundingClientRect();return{left:(i.textDirection==de.LTR?e.left:e.right-i.scrollDOM.clientWidth*i.scaleX)-i.scrollDOM.scrollLeft*i.scaleX,top:e.top-i.scrollDOM.scrollTop*i.scaleY}}function Xm(i,e,t,n){let a=i.coordsAtPos(e,t*2);if(!a)return n;let s=i.dom.getBoundingClientRect(),r=(a.top+a.bottom)/2,o=i.posAtCoords({x:s.left+1,y:r}),l=i.posAtCoords({x:s.right-1,y:r});return o==null||l==null?n:{from:Math.max(n.from,Math.min(o,l)),to:Math.min(n.to,Math.max(o,l))}}function hL(i,e,t){if(t.to<=i.viewport.from||t.from>=i.viewport.to)return[];let n=Math.max(t.from,i.viewport.from),a=Math.min(t.to,i.viewport.to),s=i.textDirection==de.LTR,r=i.contentDOM,o=r.getBoundingClientRect(),l=yp(i),u=r.querySelector(".cm-line"),m=u&&window.getComputedStyle(u),c=o.left+(m?parseInt(m.paddingLeft)+Math.min(0,parseInt(m.textIndent)):0),d=o.right-(m?parseInt(m.paddingRight):0),h=al(i,n,1),g=al(i,a,-1),f=h.type==Ge.Text?h:null,x=g.type==Ge.Text?g:null;if(f&&(i.lineWrapping||h.widgetLineBreaks)&&(f=Xm(i,n,1,f)),x&&(i.lineWrapping||g.widgetLineBreaks)&&(x=Xm(i,a,-1,x)),f&&x&&f.from==x.from&&f.to==x.to)return y(w(t.from,t.to,f));{let z=f?w(t.from,null,f):_(h,!1),S=x?w(null,t.to,x):_(g,!0),k=[];return(f||h).to<(x||g).from-(f&&x?1:0)||h.widgetLineBreaks>1&&z.bottom+i.defaultLineHeight/2A&&J.from=ie)break;nt>U&&P(Math.max(ye,U),z==null&&ye<=A,Math.min(nt,ie),S==null&&nt>=W,He.dir)}if(U=je.to+1,U>=ie)break}return B.length==0&&P(A,z==null,W,S==null,i.textDirection),{top:T,bottom:j,horizontal:B}}function _(z,S){let k=o.top+(S?z.top:z.bottom);return{top:k,bottom:k,horizontal:[]}}}function gL(i,e){return i.constructor==e.constructor&&i.eq(e)}class pL{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(Ra)!=e.state.facet(Ra)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,n=e.facet(Ra);for(;t!gL(t,this.drawn[n]))){let t=this.dom.firstChild,n=0;for(let a of e)a.update&&t&&a.constructor&&this.drawn[n].constructor&&a.update(t,this.drawn[n])?(t=t.nextSibling,n++):this.dom.insertBefore(a.draw(),t);for(;t;){let a=t.nextSibling;t.remove(),t=a}this.drawn=e,F.webkit&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const Ra=G.define();function fL(i){return[Dt.define(e=>new pL(e,i)),Ra.of(i)]}const wa="-10000px";class xL{constructor(e,t,n,a){this.facet=t,this.createTooltipView=n,this.removeTooltipView=a,this.input=e.state.facet(t),this.tooltips=this.input.filter(r=>r);let s=null;this.tooltipViews=this.tooltips.map(r=>s=n(r,s))}update(e,t){var n;let a=e.state.facet(this.facet),s=a.filter(l=>l);if(a===this.input){for(let l of this.tooltipViews)l.update&&l.update(e);return!1}let r=[],o=t?[]:null;for(let l=0;lt[u]=l),t.length=o.length),this.input=a,this.tooltips=s,this.tooltipViews=r,!0}}function vp(i){let e=i.dom.ownerDocument.documentElement,t=e.clientWidth,n=getComputedStyle(e);if(!/stable/.test(n.scrollbarGutter||""))return{left:0,right:t};let a=e.getBoundingClientRect(),s=i.win.scrollX;return{left:Math.max(0,a.left+s-parseFloat(n.marginLeft)),right:Math.min(t,a.right+s+parseFloat(n.marginRight))}}function bL(i){let{left:e,right:t}=vp(i);return{top:0,left:e,right:t,bottom:i.dom.ownerDocument.documentElement.clientHeight}}const Br=G.define({combine:i=>{var e,t,n;return{position:F.ios?"absolute":((e=i.find(a=>a.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=i.find(a=>a.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((n=i.find(a=>a.tooltipSpace))===null||n===void 0?void 0:n.tooltipSpace)||bL}}}),Km=new WeakMap,wp=Dt.fromClass(class{constructor(i){this.view=i,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=i.state.facet(Br);this.position=e.position,this.parent=e.parent,this.classes=i.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new xL(i,zp,(t,n)=>this.createTooltip(t,n),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),i.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let i of this.manager.tooltipViews)this.intersectionObserver.observe(i.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(i){i.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(i,this.above);e&&this.observeIntersection();let t=e||i.geometryChanged,n=i.state.facet(Br);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let a of this.manager.tooltipViews)a.dom.style.position=this.position;t=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let a of this.manager.tooltipViews)this.container.appendChild(a.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(i,e){let t=i.create(this.view),n=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),i.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let a=document.createElement("div");a.className="cm-tooltip-arrow",t.dom.appendChild(a)}return t.dom.style.position=this.position,t.dom.style.top=wa,t.dom.style.left="0px",this.container.insertBefore(t.dom,n),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var i,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let n of this.manager.tooltipViews)n.dom.remove(),(i=n.destroy)===null||i===void 0||i.call(n);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let i=1,e=1,t=!1,n=0;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:r}=this.manager.tooltipViews[0];if(F.safari){let o=r.getBoundingClientRect();t=Math.abs(o.top+1e4)>1||Math.abs(o.left)>1}else t=!!r.offsetParent&&r.offsetParent!=this.container.ownerDocument.body}if(t||this.position=="absolute")if(this.parent){let r=this.parent.getBoundingClientRect();r.width&&r.height&&(i=r.width/this.parent.offsetWidth,e=r.height/this.parent.offsetHeight)}else({scaleX:i,scaleY:e}=this.view.viewState);else n=vp(this.view).left;let a=this.view.scrollDOM.getBoundingClientRect(),s=y0(this.view);return{visible:{left:a.left+s.left,top:a.top+s.top,right:a.right-s.right,bottom:a.bottom-s.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((r,o)=>{let l=this.manager.tooltipViews[o];return l.getCoords?l.getCoords(r.pos):this.view.coordsAtPos(r.pos)}),size:this.manager.tooltipViews.map(({dom:r})=>r.getBoundingClientRect()),space:this.view.state.facet(Br).tooltipSpace(this.view),scaleX:i,scaleY:e,makeAbsolute:t,fixedLeft:n}}writeMeasure(i){var e;if(i.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let o of this.manager.tooltipViews)o.dom.style.position="absolute"}let{visible:t,space:n,scaleX:a,scaleY:s}=i,r=[];for(let o=0;o=Math.min(t.bottom,n.bottom)||c.rightMath.min(t.right,n.right)+.1)){m.style.top=wa;continue}let h=l.arrow?u.dom.querySelector(".cm-tooltip-arrow"):null,g=h?7:0,f=d.right-d.left,x=(e=Km.get(u))!==null&&e!==void 0?e:d.bottom-d.top,b=u.offset||vL,y=this.view.textDirection==de.LTR,w=d.width>n.right-n.left?y?n.left:n.right-d.width:y?Math.max(n.left,Math.min(c.left-(h?14:0)+b.x,n.right-f)):Math.min(Math.max(n.left,c.left-f+(h?14:0)-b.x),n.right-f),_=this.above[o];!l.strictSide&&(_?c.top-x-g-b.yn.bottom)&&_==n.bottom-c.bottom>c.top-n.top&&(_=this.above[o]=!_);let z=(_?c.top-n.top:n.bottom-c.bottom)-g;if(zw&&T.topS&&(S=_?T.top-x-2-g:T.bottom+g+2);if(this.position=="absolute"?(m.style.top=(S-i.parent.top)/s+"px",ec(m,(w-i.parent.left)/a)):(m.style.top=S/s+"px",ec(m,(w-i.fixedLeft)/a)),h){let T=c.left+(y?b.x:-b.x)-(w+14-7);h.style.left=T/a+"px"}u.overlap!==!0&&r.push({left:w,top:S,right:k,bottom:S+x}),m.classList.toggle("cm-tooltip-above",_),m.classList.toggle("cm-tooltip-below",!_),u.positioned&&u.positioned(i.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let i of this.manager.tooltipViews)i.dom.style.top=wa}},{eventObservers:{scroll(){this.maybeMeasure()}}});function ec(i,e){let t=parseInt(i.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(i.style.left=e+"px")}const yL=H.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),vL={x:0,y:0},zp=G.define({enables:[wp,yL]});function Ip(i,e){let t=i.plugin(wp);if(!t)return null;let n=t.manager.tooltips.indexOf(e);return n<0?null:t.manager.tooltipViews[n]}class fn extends Cn{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}fn.prototype.elementClass="";fn.prototype.toDOM=void 0;fn.prototype.mapMode=Xe.TrackBefore;fn.prototype.startSide=fn.prototype.endSide=-1;fn.prototype.point=!0;const Ga=G.define(),wL=G.define(),zL={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Y.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},hi=G.define();function IL(i){return[kp(),hi.of({...zL,...i})]}const tc=G.define({combine:i=>i.some(e=>e)});function kp(i){return[kL]}const kL=Dt.fromClass(class{constructor(i){this.view=i,this.domAfter=null,this.prevViewport=i.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=i.state.facet(hi).map(e=>new ic(i,e)),this.fixed=!i.state.facet(tc);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),i.scrollDOM.insertBefore(this.dom,i.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(i){if(this.updateGutters(i)){let e=this.prevViewport,t=i.view.viewport,n=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(n<(t.to-t.from)*.8)}if(i.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(tc)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=i.view.viewport}syncGutters(i){let e=this.dom.nextSibling;i&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=Y.iter(this.view.state.facet(Ga),this.view.viewport.from),n=[],a=this.gutters.map(s=>new SL(s,this.view.viewport,-this.view.documentPadding.top));for(let s of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(s.type)){let r=!0;for(let o of s.type)if(o.type==Ge.Text&&r){hl(t,n,o.from);for(let l of a)l.line(this.view,o,n);r=!1}else if(o.widget)for(let l of a)l.widget(this.view,o)}else if(s.type==Ge.Text){hl(t,n,s.from);for(let r of a)r.line(this.view,s,n)}else if(s.widget)for(let r of a)r.widget(this.view,s);for(let s of a)s.finish();i&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(i){let e=i.startState.facet(hi),t=i.state.facet(hi),n=i.docChanged||i.heightChanged||i.viewportChanged||!Y.eq(i.startState.facet(Ga),i.state.facet(Ga),i.view.viewport.from,i.view.viewport.to);if(e==t)for(let a of this.gutters)a.update(i)&&(n=!0);else{n=!0;let a=[];for(let s of t){let r=e.indexOf(s);r<0?a.push(new ic(this.view,s)):(this.gutters[r].update(i),a.push(this.gutters[r]))}for(let s of this.gutters)s.dom.remove(),a.indexOf(s)<0&&s.destroy();for(let s of a)s.config.side=="after"?this.getDOMAfter().appendChild(s.dom):this.dom.appendChild(s.dom);this.gutters=a}return n}destroy(){for(let i of this.gutters)i.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:i=>H.scrollMargins.of(e=>{let t=e.plugin(i);if(!t||t.gutters.length==0||!t.fixed)return null;let n=t.dom.offsetWidth*e.scaleX,a=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==de.LTR?{left:n,right:a}:{right:n,left:a}})});function nc(i){return Array.isArray(i)?i:[i]}function hl(i,e,t){for(;i.value&&i.from<=t;)i.from==t&&e.push(i.value),i.next()}class SL{constructor(e,t,n){this.gutter=e,this.height=n,this.i=0,this.cursor=Y.iter(e.markers,t.from)}addElement(e,t,n){let{gutter:a}=this,s=(t.top-this.height)/e.scaleY,r=t.height/e.scaleY;if(this.i==a.elements.length){let o=new Sp(e,r,s,n);a.elements.push(o),a.dom.appendChild(o.dom)}else a.elements[this.i].update(e,r,s,n);this.height=t.bottom,this.i++}line(e,t,n){let a=[];hl(this.cursor,a,t.from),n.length&&(a=a.concat(n));let s=this.gutter.config.lineMarker(e,t,a);s&&a.unshift(s);let r=this.gutter;a.length==0&&!r.config.renderEmptyElements||this.addElement(e,t,a)}widget(e,t){let n=this.gutter.config.widgetMarker(e,t.widget,t),a=n?[n]:null;for(let s of e.state.facet(wL)){let r=s(e,t.widget,t);r&&(a||(a=[])).push(r)}a&&this.addElement(e,t,a)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class ic{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let n in t.domEventHandlers)this.dom.addEventListener(n,a=>{let s=a.target,r;if(s!=this.dom&&this.dom.contains(s)){for(;s.parentNode!=this.dom;)s=s.parentNode;let l=s.getBoundingClientRect();r=(l.top+l.bottom)/2}else r=a.clientY;let o=e.lineBlockAtHeight(r-e.documentTop);t.domEventHandlers[n](e,o,a)&&a.preventDefault()});this.markers=nc(t.markers(e)),t.initialSpacer&&(this.spacer=new Sp(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=nc(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let a=this.config.updateSpacer(this.spacer.markers[0],e);a!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[a])}let n=e.view.viewport;return!Y.eq(this.markers,t,n.from,n.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}}class Sp{constructor(e,t,n,a){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,n,a)}update(e,t,n,a){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),_L(this.markers,a)||this.setMarkers(e,a)}setMarkers(e,t){let n="cm-gutterElement",a=this.dom.firstChild;for(let s=0,r=0;;){let o=r,l=ss(o,l,u)||r(o,l,u):r}return n}})}});class Dr extends fn{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function Zr(i,e){return i.state.facet(b1).formatNumber(e,i.state)}const AL=hi.compute([b1],i=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(TL)},lineMarker(e,t,n){return n.some(a=>a.toDOM)?null:new Dr(Zr(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,n)=>{for(let a of e.state.facet(OL)){let s=a(e,t,n);if(s)return s}return null},lineMarkerChange:e=>e.startState.facet(b1)!=e.state.facet(b1),initialSpacer(e){return new Dr(Zr(e,ac(e.state.doc.lines)))},updateSpacer(e,t){let n=Zr(t.view,ac(t.view.state.doc.lines));return n==e.number?e:new Dr(n)},domEventHandlers:i.facet(b1).domEventHandlers,side:"before"}));function PL(i={}){return[b1.of(i),kp(),AL]}function ac(i){let e=9;for(;e{let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.head).from;a>t&&(t=a,e.push(jL.range(a)))}return Y.of(e)});function BL(){return CL}const _p=1024;let DL=0;class Mr{constructor(e,t){this.from=e,this.to=t}}class X{constructor(e={}){this.id=DL++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=dt.match(e)),t=>{let n=e(t);return n===void 0?null:[this,n]}}}X.closedBy=new X({deserialize:i=>i.split(" ")});X.openedBy=new X({deserialize:i=>i.split(" ")});X.group=new X({deserialize:i=>i.split(" ")});X.isolate=new X({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});X.contextHash=new X({perNode:!0});X.lookAhead=new X({perNode:!0});X.mounted=new X({perNode:!0});class gi{constructor(e,t,n,a=!1){this.tree=e,this.overlay=t,this.parser=n,this.bracketed=a}static get(e){return e&&e.props&&e.props[X.mounted.id]}}const ZL=Object.create(null);class dt{constructor(e,t,n,a=0){this.name=e,this.props=t,this.id=n,this.flags=a}static define(e){let t=e.props&&e.props.length?Object.create(null):ZL,n=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),a=new dt(e.name||"",t,e.id,n);if(e.props){for(let s of e.props)if(Array.isArray(s)||(s=s(a)),s){if(s[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[s[0].id]=s[1]}}return a}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(X.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let n in e)for(let a of n.split(" "))t[a]=e[n];return n=>{for(let a=n.prop(X.group),s=-1;s<(a?a.length:0);s++){let r=t[s<0?n.name:a[s]];if(r)return r}}}}dt.none=new dt("",Object.create(null),0,8);class z0{constructor(e){this.types=e;for(let t=0;t0;for(let l=this.cursor(r|ze.IncludeAnonymous);;){let u=!1;if(l.from<=s&&l.to>=a&&(!o&&l.type.isAnonymous||t(l)!==!1)){if(l.firstChild())continue;u=!0}for(;u&&n&&(o||!l.type.isAnonymous)&&n(l),!l.nextSibling();){if(!l.parent())return;u=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:S0(dt.none,this.children,this.positions,0,this.children.length,0,this.length,(t,n,a)=>new Ae(this.type,t,n,a,this.propValues),e.makeTree||((t,n,a)=>new Ae(dt.none,t,n,a)))}static build(e){return EL(e)}}Ae.empty=new Ae(dt.none,[],[],0);class I0{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new I0(this.buffer,this.index)}}class Mn{constructor(e,t,n){this.buffer=e,this.length=t,this.set=n}get type(){return dt.none}toString(){let e=[];for(let t=0;t0));l=r[l+3]);return o}slice(e,t,n){let a=this.buffer,s=new Uint16Array(t-e),r=0;for(let o=e,l=0;o=e&&te;case 1:return t<=e&&n>e;case 2:return n>e;case 4:return!0}}function Ai(i,e,t,n){for(var a;i.from==i.to||(t<1?i.from>=e:i.from>e)||(t>-1?i.to<=e:i.to0?o.length:-1;e!=u;e+=t){let m=o[e],c=l[e]+r.from,d;if(!(!(s&ze.EnterBracketed&&m instanceof Ae&&(d=gi.get(m))&&!d.overlay&&d.bracketed&&n>=c&&n<=c+m.length)&&!Tp(a,n,c,c+m.length))){if(m instanceof Mn){if(s&ze.ExcludeBuffers)continue;let h=m.findChild(0,m.buffer.length,t,n-c,a);if(h>-1)return new An(new ML(r,m,e,c),null,h)}else if(s&ze.IncludeAnonymous||!m.type.isAnonymous||k0(m)){let h;if(!(s&ze.IgnoreMounts)&&(h=gi.get(m))&&!h.overlay)return new Bt(h.tree,c,e,r);let g=new Bt(m,c,e,r);return s&ze.IncludeAnonymous||!g.type.isAnonymous?g:g.nextChild(t<0?m.children.length-1:0,t,n,a,s)}}}if(s&ze.IncludeAnonymous||!r.type.isAnonymous||(r.index>=0?e=r.index+t:e=t<0?-1:r._parent._tree.children.length,r=r._parent,!r))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,n=0){let a;if(!(n&ze.IgnoreOverlays)&&(a=gi.get(this._tree))&&a.overlay){let s=e-this.from,r=n&ze.EnterBracketed&&a.bracketed;for(let{from:o,to:l}of a.overlay)if((t>0||r?o<=s:o=s:l>s))return new Bt(a.tree,a.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,n)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function rc(i,e,t,n){let a=i.cursor(),s=[];if(!a.firstChild())return s;if(t!=null){for(let r=!1;!r;)if(r=a.type.is(t),!a.nextSibling())return s}for(;;){if(n!=null&&a.type.is(n))return s;if(a.type.is(e)&&s.push(a.node),!a.nextSibling())return n==null?s:[]}}function gl(i,e,t=e.length-1){for(let n=i;t>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[t]&&e[t]!=n.name)return!1;t--}}return!0}class ML{constructor(e,t,n,a){this.parent=e,this.buffer=t,this.index=n,this.start=a}}class An extends Op{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,n){super(),this.context=e,this._parent=t,this.index=n,this.type=e.buffer.set.types[e.buffer.buffer[n]]}child(e,t,n){let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.context.start,n);return s<0?null:new An(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,n=0){if(n&ze.ExcludeBuffers)return null;let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return s<0?null:new An(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new An(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new An(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:n}=this.context,a=this.index+4,s=n.buffer[this.index+3];if(s>a){let r=n.buffer[this.index+1];e.push(n.slice(a,s,r)),t.push(0)}return new Ae(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function Ap(i){if(!i.length)return null;let e=0,t=i[0];for(let s=1;st.from||r.to=e){let o=new Bt(r.tree,r.overlay[0].from+s.from,-1,s);(a||(a=[n])).push(Ai(o,e,t,!1))}}return a?Ap(a):n}class pl{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~ze.EnterBracketed,e instanceof Bt)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let n=e._parent;n;n=n._parent)this.stack.unshift(n.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:n,buffer:a}=this.buffer;return this.type=t||a.set.types[a.buffer[e]],this.from=n+a.buffer[e+1],this.to=n+a.buffer[e+2],!0}yield(e){return e?e instanceof Bt?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,n){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,n,this.mode));let{buffer:a}=this.buffer,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.buffer.start,n);return s<0?!1:(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,n=this.mode){return this.buffer?n&ze.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,n))}parent(){if(!this.buffer)return this.yieldNode(this.mode&ze.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&ze.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,n=this.stack.length-1;if(e<0){let a=n<0?0:this.stack[n]+4;if(this.index!=a)return this.yieldBuf(t.findChild(a,this.index,-1,0,4))}else{let a=t.buffer[this.index+3];if(a<(n<0?t.buffer.length:t.buffer[this.stack[n]+3]))return this.yieldBuf(a)}return n<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,n,{buffer:a}=this;if(a){if(e>0){if(this.index-1)for(let s=t+e,r=e<0?-1:n._tree.children.length;s!=r;s+=e){let o=n._tree.children[s];if(this.mode&ze.IncludeAnonymous||o instanceof Mn||!o.type.isAnonymous||k0(o))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==a){if(a==this.index)return r;t=r,n=s+1;break e}a=this.stack[--s]}for(let a=n;a=0;s--){if(s<0)return gl(this._tree,e,a);let r=n[t.buffer[this.stack[s]]];if(!r.isAnonymous){if(e[a]&&e[a]!=r.name)return!1;a--}}return!0}}function k0(i){return i.children.some(e=>e instanceof Mn||!e.type.isAnonymous||k0(e))}function EL(i){var e;let{buffer:t,nodeSet:n,maxBufferLength:a=_p,reused:s=[],minRepeatType:r=n.types.length}=i,o=Array.isArray(t)?new I0(t,t.length):t,l=n.types,u=0,m=0;function c(z,S,k,T,j,B){let{id:P,start:A,end:W,size:J}=o,U=m,ie=u;if(J<0)if(o.next(),J==-1){let D=s[P];k.push(D),T.push(A-z);return}else if(J==-3){u=P;return}else if(J==-4){m=P;return}else throw new RangeError(`Unrecognized record size: ${J}`);let je=l[P],He,ye,nt=A-z;if(W-A<=a&&(ye=x(o.pos-S,j))){let D=new Uint16Array(ye.size-ye.skip),$=o.pos-ye.size,oe=D.length;for(;o.pos>$;)oe=b(ye.start,D,oe);He=new Mn(D,W-ye.start,n),nt=ye.start-z}else{let D=o.pos-J;o.next();let $=[],oe=[],Ve=P>=r?P:-1,it=0,ee=W,be=U;for(;o.pos>D;)Ve>=0&&o.id==Ve&&o.size>=0?(o.end<=ee-a&&(g($,oe,A,it,o.end,ee,Ve,be,ie),it=$.length,ee=o.end,be=m),o.next()):B>2500?d(A,D,$,oe):c(A,D,$,oe,Ve,B+1);if(Ve>=0&&it>0&&it<$.length&&g($,oe,A,it,A,ee,Ve,be,ie),$.reverse(),oe.reverse(),Ve>-1&&it>0){let ke=h(je,ie);He=S0(je,$,oe,0,$.length,0,W-A,ke,ke)}else He=f(je,$,oe,W-A,U-W,ie)}k.push(He),T.push(nt)}function d(z,S,k,T){let j=[],B=0,P=-1;for(;o.pos>S;){let{id:A,start:W,end:J,size:U}=o;if(U>4)o.next();else{if(P>-1&&W=0;J-=3)A[U++]=j[J],A[U++]=j[J+1]-W,A[U++]=j[J+2]-W,A[U++]=U;k.push(new Mn(A,j[2]-W,n)),T.push(W-z)}}function h(z,S){return(k,T,j)=>{let B=0,P=k.length-1,A,W;if(P>=0&&(A=k[P])instanceof Ae){if(!P&&A.type==z&&A.length==j)return A;(W=A.prop(X.lookAhead))&&(B=T[P]+A.length+W-j)}return f(z,k,T,j,B,S)}}function g(z,S,k,T,j,B,P,A,W){let J=[],U=[];for(;z.length>T;)J.push(z.pop()),U.push(S.pop()+k-j);z.push(f(n.types[P],J,U,B-j,A-B,W)),S.push(j-k)}function f(z,S,k,T,j,B,P){if(B){let A=[X.contextHash,B];P=P?[A].concat(P):[A]}if(j>25){let A=[X.lookAhead,j];P=P?[A].concat(P):[A]}return new Ae(z,S,k,T,P)}function x(z,S){let k=o.fork(),T=0,j=0,B=0,P=k.end-a,A={size:0,start:0,skip:0};e:for(let W=k.pos-z;k.pos>W;){let J=k.size;if(k.id==S&&J>=0){A.size=T,A.start=j,A.skip=B,B+=4,T+=4,k.next();continue}let U=k.pos-J;if(J<0||U=r?4:0,je=k.start;for(k.next();k.pos>U;){if(k.size<0)if(k.size==-3||k.size==-4)ie+=4;else break e;else k.id>=r&&(ie+=4);k.next()}j=je,T+=J,B+=ie}return(S<0||T==z)&&(A.size=T,A.start=j,A.skip=B),A.size>4?A:void 0}function b(z,S,k){let{id:T,start:j,end:B,size:P}=o;if(o.next(),P>=0&&T4){let W=o.pos-(P-4);for(;o.pos>W;)k=b(z,S,k)}S[--k]=A,S[--k]=B-z,S[--k]=j-z,S[--k]=T}else P==-3?u=T:P==-4&&(m=T);return k}let y=[],w=[];for(;o.pos>0;)c(i.start||0,i.bufferStart||0,y,w,-1,0);let _=(e=i.length)!==null&&e!==void 0?e:y.length?w[0]+y[0].length:0;return new Ae(l[i.topID],y.reverse(),w.reverse(),_)}const oc=new WeakMap;function Ha(i,e){if(!i.isAnonymous||e instanceof Mn||e.type!=i)return 1;let t=oc.get(e);if(t==null){t=1;for(let n of e.children){if(n.type!=i||!(n instanceof Ae)){t=1;break}t+=Ha(i,n)}oc.set(e,t)}return t}function S0(i,e,t,n,a,s,r,o,l){let u=0;for(let g=n;g=m)break;S+=k}if(w==_+1){if(S>m){let k=g[_];h(k.children,k.positions,0,k.children.length,f[_]+y);continue}c.push(g[_])}else{let k=f[w-1]+g[w-1].length-z;c.push(S0(i,g,f,_,w,z,k,null,l))}d.push(z+y-s)}}return h(e,t,n,a,0),(o||l)(c,d,r)}class t1{constructor(e,t,n,a,s=!1,r=!1){this.from=e,this.to=t,this.tree=n,this.offset=a,this.open=(s?1:0)|(r?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],n=!1){let a=[new t1(0,e.length,e,0,!1,n)];for(let s of t)s.to>e.length&&a.push(s);return a}static applyChanges(e,t,n=128){if(!t.length)return e;let a=[],s=1,r=e.length?e[0]:null;for(let o=0,l=0,u=0;;o++){let m=o=n)for(;r&&r.from=d.from||c<=d.to||u){let h=Math.max(d.from,l)-u,g=Math.min(d.to,c)-u;d=h>=g?null:new t1(h,g,d.tree,d.offset+u,o>0,!!m)}if(d&&a.push(d),r.to>c)break;r=snew Mr(a.from,a.to)):[new Mr(0,0)]:[new Mr(0,e.length)],this.createParse(e,t||[],n)}parse(e,t,n){let a=this.startParse(e,t,n);for(;;){let s=a.advance();if(s)return s}}}class NL{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new X({perNode:!0});let FL=0;class Tt{constructor(e,t,n,a){this.name=e,this.set=t,this.base=n,this.modified=a,this.id=FL++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let n=typeof e=="string"?e:"?";if(e instanceof Tt&&(t=e),t!=null&&t.base)throw new Error("Can not derive from a modified tag");let a=new Tt(n,[],null,[]);if(a.set.push(a),t)for(let s of t.set)a.set.push(s);return a}static defineModifier(e){let t=new Ss(e);return n=>n.modified.indexOf(t)>-1?n:Ss.get(n.base||n,n.modified.concat(t).sort((a,s)=>a.id-s.id))}}let JL=0;class Ss{constructor(e){this.name=e,this.instances=[],this.id=JL++}static get(e,t){if(!t.length)return e;let n=t[0].instances.find(o=>o.base==e&&RL(t,o.modified));if(n)return n;let a=[],s=new Tt(e.name,a,e,t);for(let o of t)o.instances.push(s);let r=GL(t);for(let o of e.set)if(!o.modified.length)for(let l of r)a.push(Ss.get(o,l));return s}}function RL(i,e){return i.length==e.length&&i.every((t,n)=>t==e[n])}function GL(i){let e=[[]];for(let t=0;tn.length-t.length)}function jp(i){let e=Object.create(null);for(let t in i){let n=i[t];Array.isArray(n)||(n=[n]);for(let a of t.split(" "))if(a){let s=[],r=2,o=a;for(let c=0;;){if(o=="..."&&c>0&&c+3==a.length){r=1;break}let d=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(o);if(!d)throw new RangeError("Invalid path: "+a);if(s.push(d[0]=="*"?"":d[0][0]=='"'?JSON.parse(d[0]):d[0]),c+=d[0].length,c==a.length)break;let h=a[c++];if(c==a.length&&h=="!"){r=0;break}if(h!="/")throw new RangeError("Invalid path: "+a);o=a.slice(c)}let l=s.length-1,u=s[l];if(!u)throw new RangeError("Invalid path: "+a);let m=new Pi(n,r,l>0?s.slice(0,l):null);e[u]=m.sort(e[u])}}return Cp.add(e)}const Cp=new X({combine(i,e){let t,n,a;for(;i||e;){if(!i||e&&i.depth<=e.depth?(a=e,e=e.next):(a=i,i=i.next),t&&t.mode==a.mode&&!a.context&&!t.context)continue;let s=new Pi(a.tags,a.mode,a.context);t?t.next=s:n=s,t=s}return n}});class Pi{constructor(e,t,n,a){this.tags=e,this.mode=t,this.context=n,this.next=a}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let r=a;for(let o of s)for(let l of o.set){let u=t[l.id];if(u){r=r?r+" "+u:u;break}}return r},scope:n}}function HL(i,e){let t=null;for(let n of i){let a=n.style(e);a&&(t=t?t+" "+a:a)}return t}function VL(i,e,t,n=0,a=i.length){let s=new QL(n,Array.isArray(e)?e:[e],t);s.highlightRange(i.cursor(),n,a,"",s.highlighters),s.flush(a)}class QL{constructor(e,t,n){this.at=e,this.highlighters=t,this.span=n,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,n,a,s){let{type:r,from:o,to:l}=e;if(o>=n||l<=t)return;r.isTop&&(s=this.highlighters.filter(h=>!h.scope||h.scope(r)));let u=a,m=qL(e)||Pi.empty,c=HL(s,m.tags);if(c&&(u&&(u+=" "),u+=c,m.mode==1&&(a+=(a?" ":"")+c)),this.startSpan(Math.max(t,o),u),m.opaque)return;let d=e.tree&&e.tree.prop(X.mounted);if(d&&d.overlay){let h=e.node.enter(d.overlay[0].from+o,1),g=this.highlighters.filter(x=>!x.scope||x.scope(d.tree.type)),f=e.firstChild();for(let x=0,b=o;;x++){let y=x=w||!e.nextSibling())););if(!y||w>n)break;b=y.to+o,b>t&&(this.highlightRange(h.cursor(),Math.max(t,y.from+o),Math.min(n,b),"",g),this.startSpan(Math.min(n,b),u))}f&&e.parent()}else if(e.firstChild()){d&&(a="");do if(!(e.to<=t)){if(e.from>=n)break;this.highlightRange(e,t,n,a,s),this.startSpan(Math.min(n,e.to),u)}while(e.nextSibling());e.parent()}}}function qL(i){let e=i.type.prop(Cp);for(;e&&e.context&&!i.matchContext(e.context);)e=e.next;return e||null}const E=Tt.define,Ia=E(),zn=E(),lc=E(zn),uc=E(zn),In=E(),ka=E(In),Lr=E(In),Xt=E(),Fn=E(Xt),$t=E(),Yt=E(),fl=E(),H1=E(fl),Sa=E(),M={comment:Ia,lineComment:E(Ia),blockComment:E(Ia),docComment:E(Ia),name:zn,variableName:E(zn),typeName:lc,tagName:E(lc),propertyName:uc,attributeName:E(uc),className:E(zn),labelName:E(zn),namespace:E(zn),macroName:E(zn),literal:In,string:ka,docString:E(ka),character:E(ka),attributeValue:E(ka),number:Lr,integer:E(Lr),float:E(Lr),bool:E(In),regexp:E(In),escape:E(In),color:E(In),url:E(In),keyword:$t,self:E($t),null:E($t),atom:E($t),unit:E($t),modifier:E($t),operatorKeyword:E($t),controlKeyword:E($t),definitionKeyword:E($t),moduleKeyword:E($t),operator:Yt,derefOperator:E(Yt),arithmeticOperator:E(Yt),logicOperator:E(Yt),bitwiseOperator:E(Yt),compareOperator:E(Yt),updateOperator:E(Yt),definitionOperator:E(Yt),typeOperator:E(Yt),controlOperator:E(Yt),punctuation:fl,separator:E(fl),bracket:H1,angleBracket:E(H1),squareBracket:E(H1),paren:E(H1),brace:E(H1),content:Xt,heading:Fn,heading1:E(Fn),heading2:E(Fn),heading3:E(Fn),heading4:E(Fn),heading5:E(Fn),heading6:E(Fn),contentSeparator:E(Xt),list:E(Xt),quote:E(Xt),emphasis:E(Xt),strong:E(Xt),link:E(Xt),monospace:E(Xt),strikethrough:E(Xt),inserted:E(),deleted:E(),changed:E(),invalid:E(),meta:Sa,documentMeta:E(Sa),annotation:E(Sa),processingInstruction:E(Sa),definition:Tt.defineModifier("definition"),constant:Tt.defineModifier("constant"),function:Tt.defineModifier("function"),standard:Tt.defineModifier("standard"),local:Tt.defineModifier("local"),special:Tt.defineModifier("special")};for(let i in M){let e=M[i];e instanceof Tt&&(e.name=i)}Bp([{tag:M.link,class:"tok-link"},{tag:M.heading,class:"tok-heading"},{tag:M.emphasis,class:"tok-emphasis"},{tag:M.strong,class:"tok-strong"},{tag:M.keyword,class:"tok-keyword"},{tag:M.atom,class:"tok-atom"},{tag:M.bool,class:"tok-bool"},{tag:M.url,class:"tok-url"},{tag:M.labelName,class:"tok-labelName"},{tag:M.inserted,class:"tok-inserted"},{tag:M.deleted,class:"tok-deleted"},{tag:M.literal,class:"tok-literal"},{tag:M.string,class:"tok-string"},{tag:M.number,class:"tok-number"},{tag:[M.regexp,M.escape,M.special(M.string)],class:"tok-string2"},{tag:M.variableName,class:"tok-variableName"},{tag:M.local(M.variableName),class:"tok-variableName tok-local"},{tag:M.definition(M.variableName),class:"tok-variableName tok-definition"},{tag:M.special(M.variableName),class:"tok-variableName2"},{tag:M.definition(M.propertyName),class:"tok-propertyName tok-definition"},{tag:M.typeName,class:"tok-typeName"},{tag:M.namespace,class:"tok-namespace"},{tag:M.className,class:"tok-className"},{tag:M.macroName,class:"tok-macroName"},{tag:M.propertyName,class:"tok-propertyName"},{tag:M.operator,class:"tok-operator"},{tag:M.comment,class:"tok-comment"},{tag:M.meta,class:"tok-meta"},{tag:M.invalid,class:"tok-invalid"},{tag:M.punctuation,class:"tok-punctuation"}]);var Wr;const y1=new X;function UL(i){return G.define({combine:i?e=>e.concat(i):void 0})}const $L=new X;class Rt{constructor(e,t,n=[],a=""){this.data=e,this.name=a,ne.prototype.hasOwnProperty("tree")||Object.defineProperty(ne.prototype,"tree",{get(){return et(this)}}),this.parser=t,this.extension=[Z1.of(this),ne.languageData.of((s,r,o)=>{let l=mc(s,r,o),u=l.type.prop(y1);if(!u)return[];let m=s.facet(u),c=l.type.prop($L);if(c){let d=l.resolve(r-l.from,o);for(let h of c)if(h.test(d,s)){let g=s.facet(h.facet);return h.type=="replace"?g:g.concat(m)}}return m})].concat(n)}isActiveAt(e,t,n=-1){return mc(e,t,n).type.prop(y1)==this.data}findRegions(e){let t=e.facet(Z1);if((t==null?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],a=(s,r)=>{if(s.prop(y1)==this.data){n.push({from:r,to:r+s.length});return}let o=s.prop(X.mounted);if(o){if(o.tree.prop(y1)==this.data){if(o.overlay)for(let l of o.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+s.length});return}else if(o.overlay){let l=n.length;if(a(o.tree,o.overlay[0].from+r),n.length>l)return}}for(let l=0;ln.isTop?t:void 0)]}),e.name)}configure(e,t){return new _s(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function et(i){let e=i.field(Rt.state,!1);return e?e.tree:Ae.empty}class YL{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let n=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-n,t-n)}}let V1=null;class Ts{constructor(e,t,n=[],a,s,r,o,l){this.parser=e,this.state=t,this.fragments=n,this.tree=a,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(e,t,n){return new Ts(e,t,[],Ae.empty,0,n,[],null)}startParse(){return this.parser.startParse(new YL(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=Ae.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var n;if(typeof e=="number"){let a=Date.now()+e;e=()=>Date.now()>a}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(t1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=V1;V1=this;try{return e()}finally{V1=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=cc(e,t.from,t.to);return e}changes(e,t){let{fragments:n,tree:a,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!e.empty){let l=[];if(e.iterChangedRanges((u,m,c,d)=>l.push({fromA:u,toA:m,fromB:c,toB:d})),n=t1.applyChanges(n,l),a=Ae.empty,s=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){o=[];for(let u of this.skipped){let m=e.mapPos(u.from,1),c=e.mapPos(u.to,-1);me.from&&(this.fragments=cc(this.fragments,a,s),this.skipped.splice(n--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends Pp{createParse(t,n,a){let s=a[0].from,r=a[a.length-1].to;return{parsedPos:s,advance(){let l=V1;if(l){for(let u of a)l.tempSkipped.push(u);e&&(l.scheduleOn=l.scheduleOn?Promise.all([l.scheduleOn,e]):e)}return this.parsedPos=r,new Ae(dt.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return V1}}function cc(i,e,t){return t1.applyChanges(i,[{fromA:e,toA:t,fromB:e,toB:t}])}class D1{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),n=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,n)||t.takeTree(),new D1(t)}static init(e){let t=Math.min(3e3,e.doc.length),n=Ts.create(e.facet(Z1).parser,e,{from:0,to:t});return n.work(20,t)||n.takeTree(),new D1(n)}}Rt.state=Zt.define({create:D1.init,update(i,e){for(let t of e.effects)if(t.is(Rt.setState))return t.value;return e.startState.facet(Z1)!=e.state.facet(Z1)?D1.init(e.state):i.apply(e)}});let Dp=i=>{let e=setTimeout(()=>i(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Dp=i=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(i,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});const Er=typeof navigator<"u"&&(!((Wr=navigator.scheduling)===null||Wr===void 0)&&Wr.isInputPending)?()=>navigator.scheduling.isInputPending():null,XL=Dt.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Rt.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Rt.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=Dp(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEnda+1e3,l=s.context.work(()=>Er&&Er()||Date.now()>r,a+(o?0:1e5));this.chunkBudget-=Date.now()-t,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:Rt.setState.of(new D1(s.context))})),this.chunkBudget>0&&!(l&&!o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>bt(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Z1=G.define({combine(i){return i.length?i[0]:null},enables:i=>[Rt.state,XL,H.contentAttributes.compute([i],e=>{let t=e.facet(i);return t&&t.name?{"data-language":t.name}:{}})]});class KL{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const eW=G.define(),Ri=G.define({combine:i=>{if(!i.length)return" ";let e=i[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(i[0]));return e}});function Os(i){let e=i.facet(Ri);return e.charCodeAt(0)==9?i.tabSize*e.length:e.length}function ji(i,e){let t="",n=i.tabSize,a=i.facet(Ri)[0];if(a==" "){for(;e>=n;)t+=" ",e-=n;a=" "}for(let s=0;s=e?tW(i,t,e):null}class Xs{constructor(e,t={}){this.state=e,this.options=t,this.unit=Os(e)}lineAt(e,t=1){let n=this.state.doc.lineAt(e),{simulateBreak:a,simulateDoubleBreak:s}=this.options;return a!=null&&a>=n.from&&a<=n.to?s&&a==e?{text:"",from:e}:(t<0?a-1&&(s+=r-this.countColumn(n,n.search(/\S|$/))),s}countColumn(e,t=e.length){return Wi(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:n,from:a}=this.lineAt(e,t),s=this.options.overrideIndentation;if(s){let r=s(a);if(r>-1)return r}return this.countColumn(n,n.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Zp=new X;function tW(i,e,t){let n=e.resolveStack(t),a=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(a!=n.node){let s=[];for(let r=a;r&&!(r.fromn.node.to||r.from==n.node.from&&r.type==n.node.type);r=r.parent)s.push(r);for(let r=s.length-1;r>=0;r--)n={node:s[r],next:n}}return Mp(n,i,t)}function Mp(i,e,t){for(let n=i;n;n=n.next){let a=iW(n.node);if(a)return a(T0.create(e,t,n))}return 0}function nW(i){return i.pos==i.options.simulateBreak&&i.options.simulateDoubleBreak}function iW(i){let e=i.type.prop(Zp);if(e)return e;let t=i.firstChild,n;if(t&&(n=t.type.prop(X.closedBy))){let a=i.lastChild,s=a&&n.indexOf(a.name)>-1;return r=>Lp(r,!0,1,void 0,s&&!nW(r)?a.from:void 0)}return i.parent==null?aW:null}function aW(){return 0}class T0 extends Xs{constructor(e,t,n){super(e.state,e.options),this.base=e,this.pos=t,this.context=n}get node(){return this.context.node}static create(e,t,n){return new T0(e,t,n)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let n=e.resolve(t.from);for(;n.parent&&n.parent.from==n.from;)n=n.parent;if(sW(n,e))break;t=this.state.doc.lineAt(n.from)}return this.lineIndent(t.from)}continue(){return Mp(this.context.next,this.base,this.pos)}}function sW(i,e){for(let t=e;t;t=t.parent)if(i==t)return!0;return!1}function rW(i){let e=i.node,t=e.childAfter(e.from),n=e.lastChild;if(!t)return null;let a=i.options.simulateBreak,s=i.state.doc.lineAt(t.from),r=a==null||a<=s.from?s.to:Math.min(s.to,a);for(let o=t.to;;){let l=e.childAfter(o);if(!l||l==n)return null;if(!l.type.isSkipped){if(l.from>=r)return null;let u=/^ */.exec(s.text.slice(t.to-s.from))[0].length;return{from:t.from,to:t.to+u}}o=l.to}}function oW({closing:i,align:e=!0,units:t=1}){return n=>Lp(n,e,t,i)}function Lp(i,e,t,n,a){let s=i.textAfter,r=s.match(/^\s*/)[0].length,o=n&&s.slice(r,r+n.length)==n||a==i.pos+r,l=e?rW(i):null;return l?o?i.column(l.from):i.column(l.to):i.baseIndent+(o?0:i.unit*t)}const lW=i=>i.baseIndent;function Nr({except:i,units:e=1}={}){return t=>{let n=i&&i.test(t.textAfter);return t.baseIndent+(n?0:e*t.unit)}}const uW=200;function mW(){return ne.transactionFilter.of(i=>{if(!i.docChanged||!i.isUserEvent("input.type")&&!i.isUserEvent("input.complete"))return i;let e=i.startState.languageDataAt("indentOnInput",i.startState.selection.main.head);if(!e.length)return i;let t=i.newDoc,{head:n}=i.newSelection.main,a=t.lineAt(n);if(n>a.from+uW)return i;let s=t.sliceString(a.from,n);if(!e.some(u=>u.test(s)))return i;let{state:r}=i,o=-1,l=[];for(let{head:u}of r.selection.ranges){let m=r.doc.lineAt(u);if(m.from==o)continue;o=m.from;let c=_0(r,m.from);if(c==null)continue;let d=/^\s*/.exec(m.text)[0],h=ji(r,c);d!=h&&l.push({from:m.from,to:m.from+d.length,insert:h})}return l.length?[i,{changes:l,sequential:!0}]:i})}const cW=new X;function dW(i){let e=i.firstChild,t=i.lastChild;return e&&e.too.prop(y1)==r.data:r?o=>o==r:void 0,this.style=Bp(e.map(o=>({tag:o.tag,class:o.class||a(Object.assign({},o,{tag:null}))})),{all:s}).style,this.module=n?new Bn(n):null,this.themeType=t.themeType}static define(e,t){return new Ks(e,t||{})}}const xl=G.define(),hW=G.define({combine(i){return i.length?[i[0]]:null}});function Fr(i){let e=i.facet(xl);return e.length?e:i.facet(hW)}function gW(i,e){let t=[fW],n;return i instanceof Ks&&(i.module&&t.push(H.styleModule.of(i.module)),n=i.themeType),n?t.push(xl.computeN([H.darkTheme],a=>a.facet(H.darkTheme)==(n=="dark")?[i]:[])):t.push(xl.of(i)),t}class pW{constructor(e){this.markCache=Object.create(null),this.tree=et(e.state),this.decorations=this.buildDeco(e,Fr(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=et(e.state),n=Fr(e.state),a=n!=Fr(e.startState),{viewport:s}=e.view,r=e.changes.mapPos(this.decoratedTo,1);t.length=s.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=r):(t!=this.tree||e.viewportChanged||a)&&(this.tree=t,this.decorations=this.buildDeco(e.view,n),this.decoratedTo=s.to)}buildDeco(e,t){if(!t||!this.tree.length)return ue.none;let n=new e1;for(let{from:a,to:s}of e.visibleRanges)VL(this.tree,t,(r,o,l)=>{n.add(r,o,this.markCache[l]||(this.markCache[l]=ue.mark({class:l})))},a,s);return n.finish()}}const fW=r1.high(Dt.fromClass(pW,{decorations:i=>i.decorations})),xW=H.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Wp=1e4,Ep="()[]{}",Np=G.define({combine(i){return u0(i,{afterCursor:!0,brackets:Ep,maxScanDistance:Wp,renderMatch:vW})}}),bW=ue.mark({class:"cm-matchingBracket"}),yW=ue.mark({class:"cm-nonmatchingBracket"});function vW(i){let e=[],t=i.matched?bW:yW;return e.push(t.range(i.start.from,i.start.to)),i.end&&e.push(t.range(i.end.from,i.end.to)),e}function dc(i){let e=[],t=i.facet(Np);for(let n of i.selection.ranges){if(!n.empty)continue;let a=sn(i,n.head,-1,t)||n.head>0&&sn(i,n.head-1,1,t)||t.afterCursor&&(sn(i,n.head,1,t)||n.headi.decorations}),zW=[wW,xW];function IW(i={}){return[Np.of(i),zW]}const kW=new X;function bl(i,e,t){let n=i.prop(e<0?X.openedBy:X.closedBy);if(n)return n;if(i.name.length==1){let a=t.indexOf(i.name);if(a>-1&&a%2==(e<0?1:0))return[t[a+e]]}return null}function yl(i){let e=i.type.prop(kW);return e?e(i.node):i}function sn(i,e,t,n={}){let a=n.maxScanDistance||Wp,s=n.brackets||Ep,r=et(i),o=r.resolveInner(e,t);for(let l=o;l;l=l.parent){let u=bl(l.type,t,s);if(u&&l.from0?e>=m.from&&em.from&&e<=m.to))return SW(i,e,t,l,m,u,s)}}return _W(i,e,t,r,o.type,a,s)}function SW(i,e,t,n,a,s,r){let o=n.parent,l={from:a.from,to:a.to},u=0,m=o==null?void 0:o.cursor();if(m&&(t<0?m.childBefore(n.from):m.childAfter(n.to)))do if(t<0?m.to<=n.from:m.from>=n.to){if(u==0&&s.indexOf(m.type.name)>-1&&m.from0)return null;let u={from:t<0?e-1:e,to:t>0?e+1:e},m=i.doc.iterRange(e,t>0?i.doc.length:0),c=0;for(let d=0;!m.next().done&&d<=s;){let h=m.value;t<0&&(d+=h.length);let g=e+d*t;for(let f=t>0?0:h.length-1,x=t>0?h.length:-1;f!=x;f+=t){let b=r.indexOf(h[f]);if(!(b<0||n.resolveInner(g+f,1).type!=a))if(b%2==0==t>0)c++;else{if(c==1)return{start:u,end:{from:g+f,to:g+f+1},matched:b>>1==l>>1};c--}}t>0&&(d+=h.length)}return m.done?{start:u,matched:!1}:null}const TW=Object.create(null),hc=[dt.none],gc=[],pc=Object.create(null),OW=Object.create(null);for(let[i,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])OW[i]=AW(TW,e);function Jr(i,e){gc.indexOf(i)>-1||(gc.push(i),console.warn(e))}function AW(i,e){let t=[];for(let o of e.split(" ")){let l=[];for(let u of o.split(".")){let m=i[u]||M[u];m?typeof m=="function"?l.length?l=l.map(m):Jr(u,`Modifier ${u} used at start of tag`):l.length?Jr(u,`Tag ${u} used as modifier`):l=Array.isArray(m)?m:[m]:Jr(u,`Unknown highlighting tag ${u}`)}for(let u of l)t.push(u)}if(!t.length)return 0;let n=e.replace(/ /g,"_"),a=n+" "+t.map(o=>o.id),s=pc[a];if(s)return s.id;let r=pc[a]=dt.define({id:hc.length,name:n,props:[jp({[n]:t})]});return hc.push(r),r.id}de.RTL,de.LTR;class Fp{constructor(e,t,n,a){this.state=e,this.pos=t,this.explicit=n,this.view=a,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=et(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),n=Math.max(t.from,this.pos-250),a=t.text.slice(n-t.from,this.pos-t.from),s=a.search(Jp(e,!1));return s<0?null:{from:n+s,to:this.pos,text:a.slice(s)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,n){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),n&&n.onDocChange&&(this.abortOnDocChange=!0))}}function fc(i){let e=Object.keys(i).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function PW(i){let e=Object.create(null),t=Object.create(null);for(let{label:a}of i){e[a[0]]=!0;for(let s=1;stypeof a=="string"?{label:a}:a),[t,n]=e.every(a=>/^\w+$/.test(a.label))?[/\w*$/,/\w+$/]:PW(e);return a=>{let s=a.matchBefore(n);return s||a.explicit?{from:s?s.from:a.pos,options:e,validFor:t}:null}}class xc{constructor(e,t,n,a){this.completion=e,this.source=t,this.match=n,this.score=a}}function n1(i){return i.selection.main.from}function Jp(i,e){var t;let{source:n}=i,a=e&&n[0]!="^",s=n[n.length-1]!="$";return!a&&!s?i:new RegExp(`${a?"^":""}(?:${n})${s?"$":""}`,(t=i.flags)!==null&&t!==void 0?t:i.ignoreCase?"i":"")}const O0=Ln.define();function CW(i,e,t,n){let{main:a}=i.selection,s=t-a.from,r=n-a.from;return{...i.changeByRange(o=>{if(o!=a&&t!=n&&i.sliceDoc(o.from+s,o.from+r)!=i.sliceDoc(t,n))return{range:o};let l=i.toText(e);return{changes:{from:o.from+s,to:n==a.from?o.to:o.from+r,insert:l},range:C.cursor(o.from+s+l.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}const bc=new WeakMap;function BW(i){if(!Array.isArray(i))return i;let e=bc.get(i);return e||bc.set(i,e=jW(i)),e}const As=re.define(),Ci=re.define();class DW{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&z<=57||z>=97&&z<=122?2:z>=65&&z<=90?1:0:(S=dg(z))!=S.toLowerCase()?1:S!=S.toUpperCase()?2:0;(!y||k==1&&x||_==0&&k!=0)&&(t[c]==z||n[c]==z&&(d=!0)?r[c++]=y:r.length&&(b=!1)),_=k,y+=un(z)}return c==l&&r[0]==0&&b?this.result(-100+(d?-200:0),r,e):h==l&&g==0?this.ret(-200-e.length+(f==e.length?0:-100),[0,f]):o>-1?this.ret(-700-e.length,[o,o+this.pattern.length]):h==l?this.ret(-900-e.length,[g,f]):c==l?this.result(-100+(d?-200:0)+-700+(b?0:-1100),r,e):t.length==2?null:this.result((a[0]?-700:0)+-200+-1100,a,e)}result(e,t,n){let a=[],s=0;for(let r of t){let o=r+(this.astral?un(_t(n,r)):1);s&&a[s-1]==r?a[s-1]=o:(a[s++]=r,a[s++]=o)}return this.ret(e-n.length,a)}}class ZW{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:MW,filterStrict:!1,compareCompletions:(e,t)=>(e.sortText||e.label).localeCompare(t.sortText||t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>n=>yc(e(n),t(n)),optionClass:(e,t)=>n=>yc(e(n),t(n)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function yc(i,e){return i?e?i+" "+e:i:e}function MW(i,e,t,n,a,s){let r=i.textDirection==de.RTL,o=r,l=!1,u="top",m,c,d=e.left-a.left,h=a.right-e.right,g=n.right-n.left,f=n.bottom-n.top;if(o&&d=f||y>e.top?m=t.bottom-e.top:(u="bottom",m=e.bottom-t.top)}let x=(e.bottom-e.top)/s.offsetHeight,b=(e.right-e.left)/s.offsetWidth;return{style:`${u}: ${m/x}px; max-width: ${c/b}px`,class:"cm-completionInfo-"+(l?r?"left-narrow":"right-narrow":o?"left":"right")}}const A0=re.define();function LW(i){let e=i.addToOptions.slice();return i.icons&&e.push({render(t){let n=document.createElement("div");return n.classList.add("cm-completionIcon"),t.type&&n.classList.add(...t.type.split(/\s+/g).map(a=>"cm-completionIcon-"+a)),n.setAttribute("aria-hidden","true"),n},position:20}),e.push({render(t,n,a,s){let r=document.createElement("span");r.className="cm-completionLabel";let o=t.displayLabel||t.label,l=0;for(let u=0;ul&&r.appendChild(document.createTextNode(o.slice(l,m)));let d=r.appendChild(document.createElement("span"));d.appendChild(document.createTextNode(o.slice(m,c))),d.className="cm-completionMatchedText",l=c}return lt.position-n.position).map(t=>t.render)}function Rr(i,e,t){if(i<=t)return{from:0,to:i};if(e<0&&(e=0),e<=i>>1){let a=Math.floor(e/t);return{from:a*t,to:(a+1)*t}}let n=Math.ceil((i-e)/t);return{from:i-n*t,to:i-(n-1)*t}}class WW{constructor(e,t,n){this.view=e,this.stateField=t,this.applyCompletion=n,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:l=>this.placeInfo(l),key:this},this.space=null,this.currentClass="";let a=e.state.field(t),{options:s,selected:r}=a.open,o=e.state.facet(Le);this.optionContent=LW(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=Rr(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",l=>{let{options:u}=e.state.field(t).open;for(let m=l.target,c;m&&m!=this.dom;m=m.parentNode)if(m.nodeName=="LI"&&(c=/-(\d+)$/.exec(m.id))&&+c[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;m!=null&&(e.dispatch({effects:A0.of(m)}),l.preventDefault())}}),this.dom.addEventListener("focusout",l=>{let u=e.state.field(this.stateField,!1);u&&u.tooltip&&e.state.facet(Le).closeOnBlur&&l.relatedTarget!=e.contentDOM&&e.dispatch({effects:Ci.of(null)})}),this.showOptions(s,a.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let n=e.state.field(this.stateField),a=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),n!=a){let{options:s,selected:r,disabled:o}=n.open;(!a.open||a.open.options!=s)&&(this.range=Rr(s.length,r,e.state.facet(Le).maxRenderedOptions),this.showOptions(s,n.id)),this.updateSel(),o!=((t=a.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let n of this.currentClass.split(" "))n&&this.dom.classList.remove(n);for(let n of t.split(" "))n&&this.dom.classList.add(n);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.selected>-1&&t.selected=this.range.to)&&(this.range=Rr(t.options.length,t.selected,this.view.state.facet(Le).maxRenderedOptions),this.showOptions(t.options,e.id));let n=this.updateSelectedOption(t.selected);if(n){this.destroyInfo();let{completion:a}=t.options[t.selected],{info:s}=a;if(!s)return;let r=typeof s=="string"?document.createTextNode(s):s(a);if(!r)return;"then"in r?r.then(o=>{o&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(o,a)}).catch(o=>bt(this.view.state,o,"completion info")):(this.addInfoPane(r,a),n.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,t){this.destroyInfo();let n=this.info=document.createElement("div");if(n.className="cm-tooltip cm-completionInfo",n.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)n.appendChild(e),this.infoDestroy=null;else{let{dom:a,destroy:s}=e;n.appendChild(a),this.infoDestroy=s||null}this.dom.appendChild(n),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let n=this.list.firstChild,a=this.range.from;n;n=n.nextSibling,a++)n.nodeName!="LI"||!n.id?a--:a==e?n.hasAttribute("aria-selected")||(n.setAttribute("aria-selected","true"),t=n):n.hasAttribute("aria-selected")&&(n.removeAttribute("aria-selected"),n.removeAttribute("aria-describedby"));return t&&NW(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),n=this.info.getBoundingClientRect(),a=e.getBoundingClientRect(),s=this.space;if(!s){let r=this.dom.ownerDocument.documentElement;s={left:0,top:0,right:r.clientWidth,bottom:r.clientHeight}}return a.top>Math.min(s.bottom,t.bottom)-10||a.bottom{r.target==a&&r.preventDefault()});let s=null;for(let r=n.from;rn.from||n.from==0))if(s=d,typeof u!="string"&&u.header)a.appendChild(u.header(u));else{let h=a.appendChild(document.createElement("completion-section"));h.textContent=d}}const m=a.appendChild(document.createElement("li"));m.id=t+"-"+r,m.setAttribute("role","option");let c=this.optionClass(o);c&&(m.className=c);for(let d of this.optionContent){let h=d(o,this.view.state,this.view,l);h&&m.appendChild(h)}}return n.from&&a.classList.add("cm-completionListIncompleteTop"),n.tonew WW(t,i,e)}function NW(i,e){let t=i.getBoundingClientRect(),n=e.getBoundingClientRect(),a=t.height/i.offsetHeight;n.topt.bottom&&(i.scrollTop+=(n.bottom-t.bottom)/a)}function vc(i){return(i.boost||0)*100+(i.apply?10:0)+(i.info?5:0)+(i.type?1:0)}function FW(i,e){let t=[],n=null,a=null,s=m=>{t.push(m);let{section:c}=m.completion;if(c){n||(n=[]);let d=typeof c=="string"?c:c.name;n.some(h=>h.name==d)||n.push(typeof c=="string"?{name:d}:c)}},r=e.facet(Le);for(let m of i)if(m.hasResult()){let c=m.result.getMatch;if(m.result.filter===!1)for(let d of m.result.options)s(new xc(d,m.source,c?c(d):[],1e9-t.length));else{let d=e.sliceDoc(m.from,m.to),h,g=r.filterStrict?new ZW(d):new DW(d);for(let f of m.result.options)if(h=g.match(f.label)){let x=f.displayLabel?c?c(f,h.matched):[]:h.matched,b=h.score+(f.boost||0);if(s(new xc(f,m.source,x,b)),typeof f.section=="object"&&f.section.rank==="dynamic"){let{name:y}=f.section;a||(a=Object.create(null)),a[y]=Math.max(b,a[y]||-1e9)}}}}if(n){let m=Object.create(null),c=0,d=(h,g)=>(h.rank==="dynamic"&&g.rank==="dynamic"?a[g.name]-a[h.name]:0)||(typeof h.rank=="number"?h.rank:1e9)-(typeof g.rank=="number"?g.rank:1e9)||(h.named.score-c.score||u(c.completion,d.completion))){let c=m.completion;!l||l.label!=c.label||l.detail!=c.detail||l.type!=null&&c.type!=null&&l.type!=c.type||l.apply!=c.apply||l.boost!=c.boost?o.push(m):vc(m.completion)>vc(l)&&(o[o.length-1]=m),l=m.completion}return o}class v1{constructor(e,t,n,a,s,r){this.options=e,this.attrs=t,this.tooltip=n,this.timestamp=a,this.selected=s,this.disabled=r}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new v1(this.options,wc(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,n,a,s,r){if(a&&!r&&e.some(u=>u.isPending))return a.setDisabled();let o=FW(e,t);if(!o.length)return a&&e.some(u=>u.isPending)?a.setDisabled():null;let l=t.facet(Le).selectOnOpen?0:-1;if(a&&a.selected!=l&&a.selected!=-1){let u=a.options[a.selected].completion;for(let m=0;mm.hasResult()?Math.min(u,m.from):u,1e8),create:QW,above:s.aboveCursor},a?a.timestamp:Date.now(),l,!1)}map(e){return new v1(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new v1(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}}class Ps{constructor(e,t,n){this.active=e,this.id=t,this.open=n}static start(){return new Ps(HW,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,n=t.facet(Le),s=(n.override||t.languageDataAt("autocomplete",n1(t)).map(BW)).map(l=>(this.active.find(m=>m.source==l)||new Ct(l,this.active.some(m=>m.state!=0)?1:0)).update(e,n));s.length==this.active.length&&s.every((l,u)=>l==this.active[u])&&(s=this.active);let r=this.open,o=e.effects.some(l=>l.is(P0));r&&e.docChanged&&(r=r.map(e.changes)),e.selection||s.some(l=>l.hasResult()&&e.changes.touchesRange(l.from,l.to))||!JW(s,this.active)||o?r=v1.build(s,t,this.id,r,n,o):r&&r.disabled&&!s.some(l=>l.isPending)&&(r=null),!r&&s.every(l=>!l.isPending)&&s.some(l=>l.hasResult())&&(s=s.map(l=>l.hasResult()?new Ct(l.source,0):l));for(let l of e.effects)l.is(A0)&&(r=r&&r.setSelected(l.value,this.id));return s==this.active&&r==this.open?this:new Ps(s,this.id,r)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?RW:GW}}function JW(i,e){if(i==e)return!0;for(let t=0,n=0;;){for(;t-1&&(t["aria-activedescendant"]=i+"-"+e),t}const HW=[];function Rp(i,e){if(i.isUserEvent("input.complete")){let n=i.annotation(O0);if(n&&e.activateOnCompletion(n))return 12}let t=i.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:i.isUserEvent("delete.backward")?2:i.selection?8:i.docChanged?16:0}class Ct{constructor(e,t,n=!1){this.source=e,this.state=t,this.explicit=n}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let n=Rp(e,t),a=this;(n&8||n&16&&this.touches(e))&&(a=new Ct(a.source,0)),n&4&&a.state==0&&(a=new Ct(this.source,1)),a=a.updateFor(e,n);for(let s of e.effects)if(s.is(As))a=new Ct(a.source,1,s.value);else if(s.is(Ci))a=new Ct(a.source,0);else if(s.is(P0))for(let r of s.value)r.source==a.source&&(a=r);return a}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(n1(e.state))}}class _1 extends Ct{constructor(e,t,n,a,s,r){super(e,3,t),this.limit=n,this.result=a,this.from=s,this.to=r}hasResult(){return!0}updateFor(e,t){var n;if(!(t&3))return this.map(e.changes);let a=this.result;a.map&&!e.changes.empty&&(a=a.map(a,e.changes));let s=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),o=n1(e.state);if(o>r||!a||t&2&&(n1(e.startState)==this.from||ot.map(e))}}),mt=Zt.define({create(){return Ps.start()},update(i,e){return i.update(e)},provide:i=>[zp.from(i,e=>e.tooltip),H.contentAttributes.from(i,e=>e.attrs)]});function j0(i,e){const t=e.completion.apply||e.completion.label;let n=i.state.field(mt).active.find(a=>a.source==e.source);return n instanceof _1?(typeof t=="string"?i.dispatch({...CW(i.state,t,n.from,n.to),annotations:O0.of(e.completion)}):t(i,e.completion,n.from,n.to),!0):!1}const QW=EW(mt,j0);function _a(i,e="option"){return t=>{let n=t.state.field(mt,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+a*(i?1:-1):i?0:r-1;return o<0?o=e=="page"?0:r-1:o>=r&&(o=e=="page"?r-1:0),t.dispatch({effects:A0.of(o)}),!0}}const qW=i=>{let e=i.state.field(mt,!1);return i.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampi.state.field(mt,!1)?(i.dispatch({effects:As.of(!0)}),!0):!1,UW=i=>{let e=i.state.field(mt,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(i.dispatch({effects:Ci.of(null)}),!0)};class $W{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const YW=50,XW=1e3,KW=Dt.fromClass(class{constructor(i){this.view=i,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of i.state.field(mt).active)e.isPending&&this.startQuery(e)}update(i){let e=i.state.field(mt),t=i.state.facet(Le);if(!i.selectionSet&&!i.docChanged&&i.startState.field(mt)==e)return;let n=i.transactions.some(s=>{let r=Rp(s,t);return r&8||(s.selection||s.docChanged)&&!(r&3)});for(let s=0;sYW&&Date.now()-r.time>XW){for(let o of r.context.abortListeners)try{o()}catch(l){bt(this.view.state,l)}r.context.abortListeners=null,this.running.splice(s--,1)}else r.updates.push(...i.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),i.transactions.some(s=>s.effects.some(r=>r.is(As)))&&(this.pendingStart=!0);let a=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(s=>s.isPending&&!this.running.some(r=>r.active.source==s.source))?setTimeout(()=>this.startUpdate(),a):-1,this.composing!=0)for(let s of i.transactions)s.isUserEvent("input.type")?this.composing=2:this.composing==2&&s.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:i}=this.view,e=i.field(mt);for(let t of e.active)t.isPending&&!this.running.some(n=>n.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Le).updateSyncTime))}startQuery(i){let{state:e}=this.view,t=n1(e),n=new Fp(e,t,i.explicit,this.view),a=new $W(i,n);this.running.push(a),Promise.resolve(i.source(n)).then(s=>{a.context.aborted||(a.done=s||null,this.scheduleAccept())},s=>{this.view.dispatch({effects:Ci.of(null)}),bt(this.view.state,s)})}scheduleAccept(){this.running.every(i=>i.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(Le).updateSyncTime))}accept(){var i;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(Le),n=this.view.state.field(mt);for(let a=0;ao.source==s.active.source);if(r&&r.isPending)if(s.done==null){let o=new Ct(s.active.source,0);for(let l of s.updates)o=o.update(l,t);o.isPending||e.push(o)}else this.startQuery(r)}(e.length||n.open&&n.open.disabled)&&this.view.dispatch({effects:P0.of(e)})}},{eventHandlers:{blur(i){let e=this.view.state.field(mt,!1);if(e&&e.tooltip&&this.view.state.facet(Le).closeOnBlur){let t=e.open&&Ip(this.view,e.open.tooltip);(!t||!t.dom.contains(i.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:Ci.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:As.of(!1)}),20),this.composing=0}}}),eE=typeof navigator=="object"&&/Win/.test(navigator.platform),tE=r1.highest(H.domEventHandlers({keydown(i,e){let t=e.state.field(mt,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||!i.key||i.key.length>1||i.ctrlKey&&!(eE&&i.altKey)||i.metaKey)return!1;let n=t.open.options[t.open.selected],a=t.active.find(r=>r.source==n.source),s=n.completion.commitCharacters||a.result.commitCharacters;return s&&s.indexOf(i.key)>-1&&j0(e,n),!1}})),Gp=H.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center",cursor:"pointer"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class nE{constructor(e,t,n,a){this.field=e,this.line=t,this.from=n,this.to=a}}class C0{constructor(e,t,n){this.field=e,this.from=t,this.to=n}map(e){let t=e.mapPos(this.from,-1,Xe.TrackDel),n=e.mapPos(this.to,1,Xe.TrackDel);return t==null||n==null?null:new C0(this.field,t,n)}}class B0{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let n=[],a=[t],s=e.doc.lineAt(t),r=/^\s*/.exec(s.text)[0];for(let l of this.lines){if(n.length){let u=r,m=/^\t*/.exec(l)[0].length;for(let c=0;cnew C0(l.field,a[l.line]+l.from,a[l.line]+l.to));return{text:n,ranges:o}}static parse(e){let t=[],n=[],a=[],s;for(let r of e.split(/\r\n?|\n/)){for(;s=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(r);){let o=s[1]?+s[1]:null,l=s[2]||s[3]||"",u=-1;o===0&&(o=1e9);let m=l.replace(/\\[{}]/g,c=>c[1]);for(let c=0;c=u&&d.field++}for(let c of a)if(c.line==n.length&&c.from>s.index){let d=s[2]?3+(s[1]||"").length:2;c.from-=d,c.to-=d}a.push(new nE(u,n.length,s.index,s.index+m.length)),r=r.slice(0,s.index)+l+r.slice(s.index+s[0].length)}r=r.replace(/\\([{}])/g,(o,l,u)=>{for(let m of a)m.line==n.length&&m.from>u&&(m.from--,m.to--);return l}),n.push(r)}return new B0(n,a)}}let iE=ue.widget({widget:new class extends Ei{toDOM(){let i=document.createElement("span");return i.className="cm-snippetFieldPosition",i}ignoreEvent(){return!1}}}),aE=ue.mark({class:"cm-snippetField"});class M1{constructor(e,t){this.ranges=e,this.active=t,this.deco=ue.set(e.map(n=>(n.from==n.to?iE:aE).range(n.from,n.to)),!0)}map(e){let t=[];for(let n of this.ranges){let a=n.map(e);if(!a)return null;t.push(a)}return new M1(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(n=>n.field==this.active&&n.from<=t.from&&n.to>=t.to))}}const Gi=re.define({map(i,e){return i&&i.map(e)}}),sE=re.define(),Bi=Zt.define({create(){return null},update(i,e){for(let t of e.effects){if(t.is(Gi))return t.value;if(t.is(sE)&&i)return new M1(i.ranges,t.value)}return i&&e.docChanged&&(i=i.map(e.changes)),i&&e.selection&&!i.selectionInsideField(e.selection)&&(i=null),i},provide:i=>H.decorations.from(i,e=>e?e.deco:ue.none)});function D0(i,e){return C.create(i.filter(t=>t.field==e).map(t=>C.range(t.from,t.to)))}function rE(i){let e=B0.parse(i);return(t,n,a,s)=>{let{text:r,ranges:o}=e.instantiate(t.state,a),{main:l}=t.state.selection,u={changes:{from:a,to:s==l.from?l.to:s,insert:ae.of(r)},scrollIntoView:!0,annotations:n?[O0.of(n),Re.userEvent.of("input.complete")]:void 0};if(o.length&&(u.selection=D0(o,0)),o.some(m=>m.field>0)){let m=new M1(o,0),c=u.effects=[Gi.of(m)];t.state.field(Bi,!1)===void 0&&c.push(re.appendConfig.of([Bi,cE,dE,Gp]))}t.dispatch(t.state.update(u))}}function Hp(i){return({state:e,dispatch:t})=>{let n=e.field(Bi,!1);if(!n||i<0&&n.active==0)return!1;let a=n.active+i,s=i>0&&!n.ranges.some(r=>r.field==a+i);return t(e.update({selection:D0(n.ranges,a),effects:Gi.of(s?null:new M1(n.ranges,a)),scrollIntoView:!0})),!0}}const oE=({state:i,dispatch:e})=>i.field(Bi,!1)?(e(i.update({effects:Gi.of(null)})),!0):!1,lE=Hp(1),uE=Hp(-1),mE=[{key:"Tab",run:lE,shift:uE},{key:"Escape",run:oE}],zc=G.define({combine(i){return i.length?i[0]:mE}}),cE=r1.highest(Oi.compute([zc],i=>i.facet(zc)));function Z0(i,e){return{...e,apply:rE(i)}}const dE=H.domEventHandlers({mousedown(i,e){let t=e.state.field(Bi,!1),n;if(!t||(n=e.posAtCoords({x:i.clientX,y:i.clientY}))==null)return!1;let a=t.ranges.find(s=>s.from<=n&&s.to>=n);return!a||a.field==t.active?!1:(e.dispatch({selection:D0(t.ranges,a.field),effects:Gi.of(t.ranges.some(s=>s.field>a.field)?new M1(t.ranges,a.field):null),scrollIntoView:!0}),!0)}}),Di={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Un=re.define({map(i,e){let t=e.mapPos(i,-1,Xe.TrackAfter);return t??void 0}}),M0=new class extends Cn{};M0.startSide=1;M0.endSide=-1;const Vp=Zt.define({create(){return Y.empty},update(i,e){if(i=i.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);i=i.update({filter:n=>n>=t.from&&n<=t.to})}for(let t of e.effects)t.is(Un)&&(i=i.update({add:[M0.range(t.value,t.value+1)]}));return i}});function hE(){return[pE,Vp]}const Hr="()[]{}<>«»»«[]{}";function Qp(i){for(let e=0;e{if((gE?i.composing:i.compositionStarted)||i.state.readOnly)return!1;let a=i.state.selection.main;if(n.length>2||n.length==2&&un(_t(n,0))==1||e!=a.from||t!=a.to)return!1;let s=bE(i.state,n);return s?(i.dispatch(s),!0):!1}),fE=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let n=qp(i,i.selection.main.head).brackets||Di.brackets,a=null,s=i.changeByRange(r=>{if(r.empty){let o=yE(i.doc,r.head);for(let l of n)if(l==o&&er(i.doc,r.head)==Qp(_t(l,0)))return{changes:{from:r.head-l.length,to:r.head+l.length},range:C.cursor(r.head-l.length)}}return{range:a=r}});return a||e(i.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!a},xE=[{key:"Backspace",run:fE}];function bE(i,e){let t=qp(i,i.selection.main.head),n=t.brackets||Di.brackets;for(let a of n){let s=Qp(_t(a,0));if(e==a)return s==a?zE(i,a,n.indexOf(a+a+a)>-1,t):vE(i,a,s,t.before||Di.before);if(e==s&&Up(i,i.selection.main.from))return wE(i,a,s)}return null}function Up(i,e){let t=!1;return i.field(Vp).between(0,i.doc.length,n=>{n==e&&(t=!0)}),t}function er(i,e){let t=i.sliceString(e,e+2);return t.slice(0,un(_t(t,0)))}function yE(i,e){let t=i.sliceString(e-2,e);return un(_t(t,0))==t.length?t:t.slice(1)}function vE(i,e,t,n){let a=null,s=i.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:t,from:r.to}],effects:Un.of(r.to+e.length),range:C.range(r.anchor+e.length,r.head+e.length)};let o=er(i.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+t,from:r.head},effects:Un.of(r.head+e.length),range:C.cursor(r.head+e.length)}:{range:a=r}});return a?null:i.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function wE(i,e,t){let n=null,a=i.changeByRange(s=>s.empty&&er(i.doc,s.head)==t?{changes:{from:s.head,to:s.head+t.length,insert:t},range:C.cursor(s.head+t.length)}:n={range:s});return n?null:i.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function zE(i,e,t,n){let a=n.stringPrefixes||Di.stringPrefixes,s=null,r=i.changeByRange(o=>{if(!o.empty)return{changes:[{insert:e,from:o.from},{insert:e,from:o.to}],effects:Un.of(o.to+e.length),range:C.range(o.anchor+e.length,o.head+e.length)};let l=o.head,u=er(i.doc,l),m;if(u==e){if(Ic(i,l))return{changes:{insert:e+e,from:l},effects:Un.of(l+e.length),range:C.cursor(l+e.length)};if(Up(i,l)){let d=t&&i.sliceDoc(l,l+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:l,to:l+d.length,insert:d},range:C.cursor(l+d.length)}}}else{if(t&&i.sliceDoc(l-2*e.length,l)==e+e&&(m=kc(i,l-2*e.length,a))>-1&&Ic(i,m))return{changes:{insert:e+e+e+e,from:l},effects:Un.of(l+e.length),range:C.cursor(l+e.length)};if(i.charCategorizer(l)(u)!=Pt.Word&&kc(i,l,a)>-1&&!IE(i,l,e,a))return{changes:{insert:e+e,from:l},effects:Un.of(l+e.length),range:C.cursor(l+e.length)}}return{range:s=o}});return s?null:i.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Ic(i,e){let t=et(i).resolveInner(e+1);return t.parent&&t.from==e}function IE(i,e,t,n){let a=et(i).resolveInner(e,-1),s=n.reduce((r,o)=>Math.max(r,o.length),0);for(let r=0;r<5;r++){let o=i.sliceDoc(a.from,Math.min(a.to,a.from+t.length+s)),l=o.indexOf(t);if(!l||l>-1&&n.indexOf(o.slice(0,l))>-1){let m=a.firstChild;for(;m&&m.from==a.from&&m.to-m.from>t.length+l;){if(i.sliceDoc(m.to-t.length,m.to)==t)return!1;m=m.firstChild}return!0}let u=a.to==e&&a.parent;if(!u)break;a=u}return!1}function kc(i,e,t){let n=i.charCategorizer(e);if(n(i.sliceDoc(e-1,e))!=Pt.Word)return e;for(let a of t){let s=e-a.length;if(i.sliceDoc(s,e)==a&&n(i.sliceDoc(s-1,s))!=Pt.Word)return s}return-1}function kE(i={}){return[tE,mt,Le.of(i),KW,SE,Gp]}const $p=[{key:"Ctrl-Space",run:Gr},{mac:"Alt-`",run:Gr},{mac:"Alt-i",run:Gr},{key:"Escape",run:UW},{key:"ArrowDown",run:_a(!0)},{key:"ArrowUp",run:_a(!1)},{key:"PageDown",run:_a(!0,"page")},{key:"PageUp",run:_a(!1,"page")},{key:"Enter",run:qW}],SE=r1.highest(Oi.computeN([Le],i=>i.facet(Le).defaultKeymap?[$p]:[])),_E=i=>{let{state:e}=i,t=e.doc.lineAt(e.selection.main.from),n=W0(i.state,t.from);return n.line?TE(i):n.block?AE(i):!1};function L0(i,e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let a=i(e,t);return a?(n(t.update(a)),!0):!1}}const TE=L0(CE,0),OE=L0(Yp,0),AE=L0((i,e)=>Yp(i,e,jE(e)),0);function W0(i,e){let t=i.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}const Q1=50;function PE(i,{open:e,close:t},n,a){let s=i.sliceDoc(n-Q1,n),r=i.sliceDoc(a,a+Q1),o=/\s*$/.exec(s)[0].length,l=/^\s*/.exec(r)[0].length,u=s.length-o;if(s.slice(u-e.length,u)==e&&r.slice(l,l+t.length)==t)return{open:{pos:n-o,margin:o&&1},close:{pos:a+l,margin:l&&1}};let m,c;a-n<=2*Q1?m=c=i.sliceDoc(n,a):(m=i.sliceDoc(n,n+Q1),c=i.sliceDoc(a-Q1,a));let d=/^\s*/.exec(m)[0].length,h=/\s*$/.exec(c)[0].length,g=c.length-h-t.length;return m.slice(d,d+e.length)==e&&c.slice(g,g+t.length)==t?{open:{pos:n+d+e.length,margin:/\s/.test(m.charAt(d+e.length))?1:0},close:{pos:a-h-t.length,margin:/\s/.test(c.charAt(g-1))?1:0}}:null}function jE(i){let e=[];for(let t of i.selection.ranges){let n=i.doc.lineAt(t.from),a=t.to<=n.to?n:i.doc.lineAt(t.to);a.from>n.from&&a.from==t.to&&(a=t.to==n.to+1?n:i.doc.lineAt(t.to-1));let s=e.length-1;s>=0&&e[s].to>n.from?e[s].to=a.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:a.to})}return e}function Yp(i,e,t=e.selection.ranges){let n=t.map(s=>W0(e,s.from).block);if(!n.every(s=>s))return null;let a=t.map((s,r)=>PE(e,n[r],s.from,s.to));if(i!=2&&!a.every(s=>s))return{changes:e.changes(t.map((s,r)=>a[r]?[]:[{from:s.from,insert:n[r].open+" "},{from:s.to,insert:" "+n[r].close}]))};if(i!=1&&a.some(s=>s)){let s=[];for(let r=0,o;ra&&(s==r||r>c.from)){a=c.from;let d=/^\s*/.exec(c.text)[0].length,h=d==c.length,g=c.text.slice(d,d+u.length)==u?d:-1;ds.comment<0&&(!s.empty||s.single))){let s=[];for(let{line:o,token:l,indent:u,empty:m,single:c}of n)(c||!m)&&s.push({from:o.from+u,insert:l+" "});let r=e.changes(s);return{changes:r,selection:e.selection.map(r,1)}}else if(i!=1&&n.some(s=>s.comment>=0)){let s=[];for(let{line:r,comment:o,token:l}of n)if(o>=0){let u=r.from+o,m=u+l.length;r.text[m-r.from]==" "&&m++,s.push({from:u,to:m})}return{changes:s}}return null}function L1(i,e){return C.create(i.ranges.map(e),i.mainIndex)}function Vt(i,e){return i.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Qt({state:i,dispatch:e},t){let n=L1(i.selection,t);return n.eq(i.selection,!0)?!1:(e(Vt(i,n)),!0)}function tr(i,e){return C.cursor(e?i.to:i.from)}function Xp(i,e){return Qt(i,t=>t.empty?i.moveByChar(t,e):tr(t,e))}function tt(i){return i.textDirectionAt(i.state.selection.main.head)==de.LTR}const Kp=i=>Xp(i,!tt(i)),ef=i=>Xp(i,tt(i));function tf(i,e){return Qt(i,t=>t.empty?i.moveByGroup(t,e):tr(t,e))}const BE=i=>tf(i,!tt(i)),DE=i=>tf(i,tt(i));function ZE(i,e,t){if(e.type.prop(t))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(i.sliceDoc(e.from,e.to)))||e.firstChild}function nr(i,e,t){let n=et(i).resolveInner(e.head),a=t?X.closedBy:X.openedBy;for(let l=e.head;;){let u=t?n.childAfter(l):n.childBefore(l);if(!u)break;ZE(i,u,a)?n=u:l=t?u.to:u.from}let s=n.type.prop(a),r,o;return s&&(r=t?sn(i,n.from,1):sn(i,n.to,-1))&&r.matched?o=t?r.end.to:r.end.from:o=t?n.to:n.from,C.cursor(o,t?-1:1)}const ME=i=>Qt(i,e=>nr(i.state,e,!tt(i))),LE=i=>Qt(i,e=>nr(i.state,e,tt(i)));function nf(i,e){return Qt(i,t=>{if(!t.empty)return tr(t,e);let n=i.moveVertically(t,e);return n.head!=t.head?n:i.moveToLineBoundary(t,e)})}const af=i=>nf(i,!1),sf=i=>nf(i,!0);function rf(i){let e=i.scrollDOM.clientHeightr.empty?i.moveVertically(r,e,t.height):tr(r,e));if(a.eq(n.selection))return!1;let s;if(t.selfScroll){let r=i.coordsAtPos(n.selection.main.head),o=i.scrollDOM.getBoundingClientRect(),l=o.top+t.marginTop,u=o.bottom-t.marginBottom;r&&r.top>l&&r.bottomof(i,!1),vl=i=>of(i,!0);function Wn(i,e,t){let n=i.lineBlockAt(e.head),a=i.moveToLineBoundary(e,t);if(a.head==e.head&&a.head!=(t?n.to:n.from)&&(a=i.moveToLineBoundary(e,t,!1)),!t&&a.head==n.from&&n.length){let s=/^\s*/.exec(i.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;s&&e.head!=n.from+s&&(a=C.cursor(n.from+s))}return a}const WE=i=>Qt(i,e=>Wn(i,e,!0)),EE=i=>Qt(i,e=>Wn(i,e,!1)),NE=i=>Qt(i,e=>Wn(i,e,!tt(i))),FE=i=>Qt(i,e=>Wn(i,e,tt(i))),JE=i=>Qt(i,e=>i.moveToLineBoundary(e,!1,!1)),RE=i=>Qt(i,e=>i.moveToLineBoundary(e,!0,!1));function GE(i,e,t){let n=!1,a=L1(i.selection,s=>{let r=sn(i,s.head,-1)||sn(i,s.head,1)||s.head>0&&sn(i,s.head-1,1)||s.headGE(i,e);function Mt(i,e,t){let n=L1(i.state.selection,a=>{a.undirectional&&a.head>=a.anchor!=e&&(a=C.range(a.head,a.anchor));let s=t(a);return C.range(a.anchor,s.head,s.goalColumn,s.bidiLevel||void 0,s.assoc)});return n.eq(i.state.selection)?!1:(i.dispatch(Vt(i.state,n)),!0)}function lf(i,e){return Mt(i,e,t=>i.moveByChar(t,e))}const uf=i=>lf(i,!tt(i)),mf=i=>lf(i,tt(i));function cf(i,e){return Mt(i,e,t=>i.moveByGroup(t,e))}const VE=i=>cf(i,!tt(i)),QE=i=>cf(i,tt(i)),qE=i=>{let e=!tt(i);return Mt(i,e,t=>nr(i.state,t,e))},UE=i=>{let e=tt(i);return Mt(i,e,t=>nr(i.state,t,e))};function df(i,e){return Mt(i,e,t=>i.moveVertically(t,e))}const hf=i=>df(i,!1),gf=i=>df(i,!0);function pf(i,e){return Mt(i,e,t=>i.moveVertically(t,e,rf(i).height))}const _c=i=>pf(i,!1),Tc=i=>pf(i,!0),$E=i=>Mt(i,!0,e=>Wn(i,e,!0)),YE=i=>Mt(i,!1,e=>Wn(i,e,!1)),XE=i=>{let e=!tt(i);return Mt(i,e,t=>Wn(i,t,e))},KE=i=>{let e=tt(i);return Mt(i,e,t=>Wn(i,t,e))},eN=i=>Mt(i,!1,e=>C.cursor(i.lineBlockAt(e.head).from)),tN=i=>Mt(i,!0,e=>C.cursor(i.lineBlockAt(e.head).to)),Oc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:0})),!0),Ac=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.doc.length})),!0),Pc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.selection.main.anchor,head:0})),!0),jc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.selection.main.anchor,head:i.doc.length})),!0),nN=({state:i,dispatch:e})=>(e(i.update({selection:{anchor:0,head:i.doc.length},userEvent:"select"})),!0),iN=({state:i,dispatch:e})=>{let t=ir(i).map(({from:n,to:a})=>C.undirectionalRange(n,Math.min(a+1,i.doc.length)));return e(i.update({selection:C.create(t),userEvent:"select"})),!0},aN=({state:i,dispatch:e})=>{let t=L1(i.selection,n=>{let a=et(i),s=a.resolveStack(n.from,1);if(n.empty){let r=a.resolveStack(n.from,-1);r.node.from>=s.node.from&&r.node.to<=s.node.to&&(s=r)}for(let r=s;r;r=r.next){let{node:o}=r;if((o.from=n.to||o.to>n.to&&o.from<=n.from)&&r.next)return C.undirectionalRange(o.from,o.to)}return n});return t.eq(i.selection)?!1:(e(Vt(i,t)),!0)};function ff(i,e){let{state:t}=i,n=t.selection,a=t.selection.ranges.slice();for(let s of t.selection.ranges){let r=t.doc.lineAt(s.head);if(e?r.to0)for(let o=s;;){let l=i.moveVertically(o,e);if(l.headr.to){a.some(u=>u.head==l.head)||a.push(l);break}else{if(l.head==o.head)break;o=l}}}return a.length==n.ranges.length?!1:(i.dispatch(Vt(t,C.create(a,a.length-1))),!0)}const sN=i=>ff(i,!1),rN=i=>ff(i,!0),oN=({state:i,dispatch:e})=>{let t=i.selection,n=null;return t.ranges.length>1?n=C.create([t.main]):t.main.empty||(n=C.create([C.cursor(t.main.head)])),n?(e(Vt(i,n)),!0):!1};function Hi(i,e){if(i.state.readOnly)return!1;let t="delete.selection",{state:n}=i,a=n.changeByRange(s=>{let{from:r,to:o}=s;if(r==o){let l=e(s);lr&&(t="delete.forward",l=Ta(i,l,!0)),r=Math.min(r,l),o=Math.max(o,l)}else r=Ta(i,r,!1),o=Ta(i,o,!0);return r==o?{range:s}:{changes:{from:r,to:o},range:C.cursor(r,ra(i)))n.between(e,e,(a,s)=>{ae&&(e=t?s:a)});return e}const xf=(i,e,t)=>Hi(i,n=>{let a=n.from,{state:s}=i,r=s.doc.lineAt(a),o,l;if(t&&!e&&a>r.from&&axf(i,!1,!0),bf=i=>xf(i,!0,!1),yf=(i,e)=>Hi(i,t=>{let n=t.head,{state:a}=i,s=a.doc.lineAt(n),r=a.charCategorizer(n);for(let o=null;;){if(n==(e?s.to:s.from)){n==t.head&&s.number!=(e?a.doc.lines:1)&&(n+=e?1:-1);break}let l=Ke(s.text,n-s.from,e)+s.from,u=s.text.slice(Math.min(n,l)-s.from,Math.max(n,l)-s.from),m=r(u);if(o!=null&&m!=o)break;(u!=" "||n!=t.head)&&(o=m),n=l}return n}),vf=i=>yf(i,!1),lN=i=>yf(i,!0),uN=i=>Hi(i,e=>{let t=i.lineBlockAt(e.head).to;return e.headHi(i,e=>{let t=i.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),cN=i=>Hi(i,e=>{let t=i.moveToLineBoundary(e,!0).head;return e.head{if(i.readOnly)return!1;let t=i.changeByRange(n=>({changes:{from:n.from,to:n.to,insert:ae.of(["",""])},range:C.cursor(n.from)}));return e(i.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},hN=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=i.changeByRange(n=>{if(!n.empty||n.from==0||n.from==i.doc.length)return{range:n};let a=n.from,s=i.doc.lineAt(a),r=a==s.from?a-1:Ke(s.text,a-s.from,!1)+s.from,o=a==s.to?a+1:Ke(s.text,a-s.from,!0)+s.from;return{changes:{from:r,to:o,insert:i.doc.slice(a,o).append(i.doc.slice(r,a))},range:C.cursor(o)}});return t.changes.empty?!1:(e(i.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function ir(i){let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.from),s=i.doc.lineAt(n.to);if(!n.empty&&n.to==s.from&&(s=i.doc.lineAt(n.to-1)),t>=a.number){let r=e[e.length-1];r.to=s.to,r.ranges.push(n)}else e.push({from:a.from,to:s.to,ranges:[n]});t=s.number+1}return e}function wf(i,e,t){if(i.readOnly)return!1;let n=[],a=[];for(let s of ir(i)){if(t?s.to==i.doc.length:s.from==0)continue;let r=i.doc.lineAt(t?s.to+1:s.from-1),o=r.length+1;if(t){n.push({from:s.to,to:r.to},{from:s.from,insert:r.text+i.lineBreak});for(let l of s.ranges)a.push(C.range(Math.min(i.doc.length,l.anchor+o),Math.min(i.doc.length,l.head+o)))}else{n.push({from:r.from,to:s.from},{from:s.to,insert:i.lineBreak+r.text});for(let l of s.ranges)a.push(C.range(l.anchor-o,l.head-o))}}return n.length?(e(i.update({changes:n,scrollIntoView:!0,selection:C.create(a,i.selection.mainIndex),userEvent:"move.line"})),!0):!1}const gN=({state:i,dispatch:e})=>wf(i,e,!1),pN=({state:i,dispatch:e})=>wf(i,e,!0);function zf(i,e,t){if(i.readOnly)return!1;let n=[];for(let s of ir(i))t?n.push({from:s.from,insert:i.doc.slice(s.from,s.to)+i.lineBreak}):n.push({from:s.to,insert:i.lineBreak+i.doc.slice(s.from,s.to)});let a=i.changes(n);return e(i.update({changes:a,selection:i.selection.map(a,t?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}const fN=({state:i,dispatch:e})=>zf(i,e,!1),xN=({state:i,dispatch:e})=>zf(i,e,!0),bN=i=>{if(i.state.readOnly)return!1;let{state:e}=i,t=e.changes(ir(e).map(({from:a,to:s})=>(a>0?a--:s{let s;if(i.lineWrapping){let r=i.lineBlockAt(a.head),o=i.coordsAtPos(a.head,a.assoc||1);o&&(s=r.bottom+i.documentTop-o.bottom+i.defaultLineHeight/2)}return i.moveVertically(a,!0,s)}).map(t);return i.dispatch({changes:t,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0};function yN(i,e){if(/\(\)|\[\]|\{\}/.test(i.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=et(i).resolveInner(e),n=t.childBefore(e),a=t.childAfter(e),s;return n&&a&&n.to<=e&&a.from>=e&&(s=n.type.prop(X.closedBy))&&s.indexOf(a.name)>-1&&i.doc.lineAt(n.to).from==i.doc.lineAt(a.from).from&&!/\S/.test(i.sliceDoc(n.to,a.from))?{from:n.to,to:a.from}:null}const Cc=If(!1),vN=If(!0);function If(i){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(a=>{let{from:s,to:r}=a,o=e.doc.lineAt(s),l=!i&&s==r&&yN(e,s);i&&(s=r=(r<=o.to?o:e.doc.lineAt(r)).to);let u=new Xs(e,{simulateBreak:s,simulateDoubleBreak:!!l}),m=_0(u,s);for(m==null&&(m=Wi(/^\s*/.exec(e.doc.lineAt(s).text)[0],e.tabSize));ro.from&&s{let a=[];for(let r=n.from;r<=n.to;){let o=i.doc.lineAt(r);o.number>t&&(n.empty||n.to>o.from)&&(e(o,a,n),t=o.number),r=o.to+1}let s=i.changes(a);return{changes:a,range:C.range(s.mapPos(n.anchor,1),s.mapPos(n.head,1))}})}const wN=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=Object.create(null),n=new Xs(i,{overrideIndentation:s=>{let r=t[s];return r??-1}}),a=E0(i,(s,r,o)=>{let l=_0(n,s.from);if(l==null)return;/\S/.test(s.text)||(l=0);let u=/^\s*/.exec(s.text)[0],m=ji(i,l);(u!=m||o.fromi.readOnly?!1:(e(i.update(E0(i,(t,n)=>{n.push({from:t.from,insert:i.facet(Ri)})}),{userEvent:"input.indent"})),!0),Sf=({state:i,dispatch:e})=>i.readOnly?!1:(e(i.update(E0(i,(t,n)=>{let a=/^\s*/.exec(t.text)[0];if(!a)return;let s=Wi(a,i.tabSize),r=0,o=ji(i,Math.max(0,s-Os(i)));for(;r(i.setTabFocusMode(),!0),IN=[{key:"Ctrl-b",run:Kp,shift:uf,preventDefault:!0},{key:"Ctrl-f",run:ef,shift:mf},{key:"Ctrl-p",run:af,shift:hf},{key:"Ctrl-n",run:sf,shift:gf},{key:"Ctrl-a",run:JE,shift:eN},{key:"Ctrl-e",run:RE,shift:tN},{key:"Ctrl-d",run:bf},{key:"Ctrl-h",run:wl},{key:"Ctrl-k",run:uN},{key:"Ctrl-Alt-h",run:vf},{key:"Ctrl-o",run:dN},{key:"Ctrl-t",run:hN},{key:"Ctrl-v",run:vl}],kN=[{key:"ArrowLeft",run:Kp,shift:uf,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:BE,shift:VE,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:NE,shift:XE,preventDefault:!0},{key:"ArrowRight",run:ef,shift:mf,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:DE,shift:QE,preventDefault:!0},{mac:"Cmd-ArrowRight",run:FE,shift:KE,preventDefault:!0},{key:"ArrowUp",run:af,shift:hf,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Oc,shift:Pc},{mac:"Ctrl-ArrowUp",run:Sc,shift:_c},{key:"ArrowDown",run:sf,shift:gf,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Ac,shift:jc},{mac:"Ctrl-ArrowDown",run:vl,shift:Tc},{key:"PageUp",run:Sc,shift:_c},{key:"PageDown",run:vl,shift:Tc},{key:"Home",run:EE,shift:YE,preventDefault:!0},{key:"Mod-Home",run:Oc,shift:Pc},{key:"End",run:WE,shift:$E,preventDefault:!0},{key:"Mod-End",run:Ac,shift:jc},{key:"Enter",run:Cc,shift:Cc},{key:"Mod-a",run:nN},{key:"Backspace",run:wl,shift:wl,preventDefault:!0},{key:"Delete",run:bf,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:vf,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:lN,preventDefault:!0},{mac:"Mod-Backspace",run:mN,preventDefault:!0},{mac:"Mod-Delete",run:cN,preventDefault:!0}].concat(IN.map(i=>({mac:i.key,run:i.run,shift:i.shift}))),SN=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:ME,shift:qE},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:LE,shift:UE},{key:"Alt-ArrowUp",run:gN},{key:"Shift-Alt-ArrowUp",run:fN},{key:"Alt-ArrowDown",run:pN},{key:"Shift-Alt-ArrowDown",run:xN},{key:"Mod-Alt-ArrowUp",run:sN},{key:"Mod-Alt-ArrowDown",run:rN},{key:"Escape",run:oN},{key:"Mod-Enter",run:vN},{key:"Alt-l",mac:"Ctrl-l",run:iN},{key:"Mod-i",run:aN,preventDefault:!0},{key:"Mod-[",run:Sf},{key:"Mod-]",run:kf},{key:"Mod-Alt-\\",run:wN},{key:"Shift-Mod-k",run:bN},{key:"Shift-Mod-\\",run:HE},{key:"Mod-/",run:_E},{key:"Alt-A",mac:"Ctrl-A",run:OE},{key:"Ctrl-m",mac:"Shift-Alt-m",run:zN}].concat(kN),_N={key:"Tab",run:kf,shift:Sf};var Bc={};class js{constructor(e,t,n,a,s,r,o,l,u,m=0,c){this.p=e,this.stack=t,this.state=n,this.reducePos=a,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=l,this.curContext=u,this.lookAhead=m,this.parent=c}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,n=0){let a=e.parser.context;return new js(e,[],t,n,n,0,[],0,a?new Dc(a,a.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let n=e>>19,a=e&65535,{parser:s}=this.p,r=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[a])===null||t===void 0)&&t.isAnonymous)&&(u==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=m):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(a,u)}storeNode(e,t,n,a=4,s=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&this.buffer[r-4]==0&&this.buffer[r-1]>-1){if(t==n)return;if(this.buffer[r-2]>=t){this.buffer[r-2]=n;return}}}if(!s||this.pos==n)this.buffer.push(e,t,n,a);else{let r=this.buffer.length;if(r>0&&(this.buffer[r-4]!=0||this.buffer[r-1]<0)){let o=!1;for(let l=r;l>0&&this.buffer[l-2]>n;l-=4)if(this.buffer[l-1]>=0){o=!0;break}if(o)for(;r>0&&this.buffer[r-2]>n;)this.buffer[r]=this.buffer[r-4],this.buffer[r+1]=this.buffer[r-3],this.buffer[r+2]=this.buffer[r-2],this.buffer[r+3]=this.buffer[r-1],r-=4,a>4&&(a-=4)}this.buffer[r]=e,this.buffer[r+1]=t,this.buffer[r+2]=n,this.buffer[r+3]=a}}shift(e,t,n,a){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let s=e,{parser:r}=this.p;this.pos=a;let o=r.stateFlag(s,1);!o&&(a>n||t<=r.maxNode)&&(this.reducePos=a),this.pushState(s,o?n:Math.min(n,this.reducePos)),this.shiftContext(t,n),t<=r.maxNode&&this.buffer.push(t,n,a,4)}else this.pos=a,this.shiftContext(t,n),t<=this.p.parser.maxNode&&this.buffer.push(t,n,a,4)}apply(e,t,n,a){e&65536?this.reduce(e):this.shift(e,t,n,a)}useNode(e,t,n){let a=this.p.reused.length-1;(a<0||this.p.reused[a]!=e)&&(this.p.reused.push(e),a++);let s=this.reducePos=this.pos=n+e.length;this.pushState(t,n),this.buffer.push(a,n,s,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(t&&e.buffer[t-4]==0&&(t-=4);t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let n=e.buffer.slice(t),a=e.bufferBase+t;for(;e&&a==e.bufferBase;)e=e.parent;return new js(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,n,a,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let n=e<=this.p.parser.maxNode;n&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,n?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new TN(this);;){let n=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(n==0)return!1;if((n&65536)==0)return!0;t.reduce(n)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let a=[];for(let s=0,r;sl&1&&o==r)||a.push(t[s],r)}t=a}let n=[];for(let a=0;a>19,a=t&65535,s=this.stack.length-n*3;if(s<0||e.getGoto(this.stack[s],a,!1)<0){let r=this.findForcedReduction();if(r==null)return!1;t=r}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],n=(a,s)=>{if(!t.includes(a))return t.push(a),e.allActions(a,r=>{if(!(r&393216))if(r&65536){let o=(r>>19)-s;if(o>1){let l=r&65535,u=this.stack.length-o*3;if(u>=0&&e.getGoto(this.stack[u],l,!1)>=0)return o<<19|65536|l}}else{let o=n(r,s+1);if(o!=null)return o}})};return n(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}}class Dc{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class TN{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,n=e>>19;n==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(n-1)*3;let a=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=a}}class Cs{constructor(e,t,n){this.stack=e,this.pos=t,this.index=n,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new Cs(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new Cs(this.stack,this.pos,this.index)}}function Oa(i,e=Uint16Array){if(typeof i!="string")return i;let t=null;for(let n=0,a=0;n=92&&r--,r>=34&&r--;let l=r-32;if(l>=46&&(l-=46,o=!0),s+=l,o)break;s*=46}t?t[a++]=s:t=new e(s)}return t}class Va{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Zc=new Va;class ON{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Zc,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let n=this.range,a=this.rangeIndex,s=this.pos+e;for(;sn.to:s>=n.to;){if(a==this.ranges.length-1)return null;let r=this.ranges[++a];s+=r.from-n.to,n=r}return s}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,n,a;if(t>=0&&t=this.chunk2Pos&&no.to&&(this.chunk2=this.chunk2.slice(0,o.to-n)),a=this.chunk2.charCodeAt(0)}}return n>=this.token.lookAhead&&(this.token.lookAhead=n+1),a}acceptToken(e,t=0){let n=t?this.resolveOffset(t,-1):this.pos;if(n==null||n=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Zc,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let n="";for(let a of this.ranges){if(a.from>=t)break;a.to>e&&(n+=this.input.read(Math.max(a.from,e),Math.min(a.to,t)))}return n}}class T1{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:n}=t.p;AN(this.data,e,t,this.id,n.data,n.tokenPrecTable)}}T1.prototype.contextual=T1.prototype.fallback=T1.prototype.extend=!1;T1.prototype.fallback=T1.prototype.extend=!1;function AN(i,e,t,n,a,s){let r=0,o=1<0){let g=i[h];if(l.allows(g)&&(e.token.value==-1||e.token.value==g||PN(g,e.token.value,a,s))){e.acceptToken(g);break}}let m=e.next,c=0,d=i[r+2];if(e.next<0&&d>c&&i[u+d*3-3]==65535){r=i[u+d*3-1];continue e}for(;c>1,g=u+h+(h<<1),f=i[g],x=i[g+1]||65536;if(m=x)c=h+1;else{r=i[g+2],e.advance();continue e}}break}}function Mc(i,e,t){for(let n=e,a;(a=i[n])!=65535;n++)if(a==t)return n-e;return-1}function PN(i,e,t,n){let a=Mc(t,n,e);return a<0||Mc(t,n,i)e)&&!n.type.isError)return t<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(i.length,Math.max(n.from+1,e+25));if(t<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return t<0?0:i.length}}class jN{constructor(e,t){this.fragments=e,this.minRepeat=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.lastRepeat=null,this.lastRepeatPos=-1,this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?Lc(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?Lc(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(s instanceof Ae){let o=r>this.lastRepeatPos&&s.type.id>=this.minRepeat;if(r==e||o){let l=r+s.length,u;if(r>=this.safeFrom&&l<=this.safeTo&&(!(u=s.prop(X.lookAhead))||l+u=Math.max(this.safeFrom,e)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[t]++,this.nextStart=r+s.length}}}class CN{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(n=>new Va)}getActions(e){let t=0,n=null,{parser:a}=e.p,{tokenizers:s}=a,r=a.stateSlot(e.state,3),o=e.curContext?e.curContext.hash:0,l=0;for(let u=0;uc.end+25&&(l=Math.max(c.lookAhead,l)),c.value!=0)){let d=t;if(c.extended>-1&&(t=this.addActions(e,c.extended,c.end,t)),t=this.addActions(e,c.value,c.end,t),!m.extend&&(n=c,t>d))break}}for(;this.actions.length>t;)this.actions.pop();return l&&e.setLookAhead(l),!n&&e.pos==this.stream.end&&(n=new Va,n.value=e.p.parser.eofTerm,n.start=n.end=e.pos,t=this.addActions(e,n.value,n.end,t)),this.mainToken=n,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new Va,{pos:n,p:a}=e;return t.start=n,t.end=Math.min(n+1,a.stream.end),t.value=n==a.stream.end?a.parser.eofTerm:0,t}updateCachedToken(e,t,n){let a=this.stream.clipPos(n.pos);if(t.token(this.stream.reset(a,e),n),e.value>-1){let{parser:s}=n.p;for(let r=0;r=0&&n.p.parser.dialect.allows(o>>1)){(o&1)==0?e.value=o>>1:e.extended=o>>1;break}}}else e.value=0,e.end=this.stream.clipPos(a+1)}putAction(e,t,n,a){for(let s=0;se.bufferLength*4?new jN(n,e.minRepeatTerm):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,n=this.stacks=[],a,s;if(this.bigReductionCount>300&&e.length==1){let[r]=e;for(;r.forceReduce()&&r.stack.length&&r.stack[r.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rt)n.push(o);else{if(this.advanceStack(o,n,e))continue;{a||(a=[],s=[]),a.push(o);let l=this.tokens.getMainToken(o);s.push(l.value,l.end)}}break}}if(!n.length){let r=a&&ZN(a);if(r)return pt&&console.log("Finish with "+this.stackID(r)),this.stackToTree(r);if(this.parser.strict)throw pt&&a&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&a){let r=this.stoppedAt!=null&&a[0].pos>this.stoppedAt?a[0]:this.runRecovery(a,s,n);if(r)return pt&&console.log("Force-finish "+this.stackID(r)),this.stackToTree(r.forceAll())}if(this.recovering){let r=this.recovering==1?1:this.recovering*3;if(n.length>r)for(n.sort((o,l)=>l.score-o.score);n.length>r;)n.pop();n.some(o=>o.reducePos>t)&&this.recovering--}else if(n.length>1){e:for(let r=0;r500&&u.buffer.length>500)if((o.score-u.score||o.buffer.length-u.buffer.length)>0)n.splice(l--,1);else{n.splice(r--,1);continue e}}}n.length>12&&(n.sort((r,o)=>o.score-r.score),n.splice(12,n.length-12))}this.minStackPos=n[0].pos;for(let r=1;r-1&&n.length&&(!s||(n.prop(X.contextHash)||0)==r))return e.useNode(n,o,t),n;if(n.children.length==0||n.positions[0]>0)break;let l=n.children[0];if(l instanceof Ae&&(!a||l.type.id>=this.parser.minRepeatTerm))n=l;else break}return null}advanceStack(e,t,n){let a=e.pos,{parser:s}=this,r=pt?this.stackID(e)+" -> ":"";if(this.stoppedAt!=null&&a>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let u=e.reducePos0)return e.reduce(o),pt&&console.log(r+this.stackID(e)+` (via always-reduce ${s.getName(o&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let l=this.tokens.getActions(e);for(let u=0;ua?t.push(g):n.push(g)}return!1}advanceFully(e,t){let n=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>n)return Wc(e,t),!0}}runRecovery(e,t,n){let a=null,s=!1;for(let r=0;r ":"";if(o.deadEnd&&(s||(s=!0,o.restart(),pt&&console.log(m+this.stackID(o)+" (restarted)"),this.advanceFully(o,n))))continue;let c=o.split(),d=m;for(let h=0;h<10&&c.forceReduce()&&(pt&&console.log(d+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,n));h++)pt&&(d=this.stackID(c)+" -> ");for(let h of o.recoverByInsert(l))pt&&console.log(m+this.stackID(h)+" (via recover-insert)"),this.advanceFully(h,n);this.stream.end>o.pos?(u==o.pos&&(u++,l=0),o.recoverByDelete(l,u),pt&&console.log(m+this.stackID(o)+` (via recover-delete ${this.parser.getName(l)})`),Wc(o,n)):(!a||a.scoree.topRules[o][1]),a=[];for(let o=0;o=0)s(m,l,o[u++]);else{let c=o[u+-m];for(let d=-m;d>0;d--)s(o[u++],l,c);u++}}}this.nodeSet=new z0(t.map((o,l)=>dt.define({name:l>=this.minRepeatTerm?void 0:o,id:l,props:a[l],top:n.indexOf(l)>-1,error:l==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(l)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=_p;let r=Oa(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let o=0;otypeof o=="number"?new T1(r,o):o),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,n){let a=new BN(this,e,t,n);for(let s of this.wrappers)a=s(a,e,t,n);return a}getGoto(e,t,n=!1){let a=this.goto;if(t>=a[0])return-1;for(let s=a[t+1];;){let r=a[s++],o=r&1,l=a[s++];if(o&&n)return l;for(let u=s+(r>>1);s0}validAction(e,t){return!!this.allActions(e,n=>n==t?!0:null)}allActions(e,t){let n=this.stateSlot(e,4),a=n?t(n):void 0;for(let s=this.stateSlot(e,1);a==null;s+=3){if(this.data[s]==65535)if(this.data[s+1]==1)s=ln(this.data,s+2);else break;a=t(ln(this.data,s+1))}return a}nextStates(e){let t=[];for(let n=this.stateSlot(e,1);;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=ln(this.data,n+2);else break;if((this.data[n+2]&1)==0){let a=this.data[n+1];t.some((s,r)=>r&1&&s==a)||t.push(this.data[n],a)}}return t}configure(e){let t=Object.assign(Object.create(Bs.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let n=this.topRules[e.top];if(!n)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=n}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(n=>{let a=e.tokenizers.find(s=>s.from==n);return a?a.to:n})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((n,a)=>{let s=e.specializers.find(o=>o.from==n.external);if(!s)return n;let r=Object.assign(Object.assign({},n),{external:s.to});return t.specializers[a]=Ec(r),r})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),n=t.map(()=>!1);if(e)for(let s of e.split(" ")){let r=t.indexOf(s);r>=0&&(n[r]=!0)}let a=null;for(let s=0;sn)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scorei.external(t,n)<<1|e}return i.get}const MN=jp({null:M.null,instanceof:M.operatorKeyword,this:M.self,"new super assert open to with void":M.keyword,"class interface extends implements enum var":M.definitionKeyword,"module package import":M.moduleKeyword,"switch while for if else case default do break continue return try catch finally throw":M.controlKeyword,"requires exports opens uses provides public private protected static transitive abstract final strictfp synchronized native transient volatile throws":M.modifier,IntegerLiteral:M.integer,FloatingPointLiteral:M.float,"StringLiteral TextBlock":M.string,CharacterLiteral:M.character,LineComment:M.lineComment,BlockComment:M.blockComment,BooleanLiteral:M.bool,PrimitiveType:M.standard(M.typeName),TypeName:M.typeName,Identifier:M.variableName,"MethodName/Identifier":M.function(M.variableName),Definition:M.definition(M.variableName),ArithOp:M.arithmeticOperator,LogicOp:M.logicOperator,BitOp:M.bitwiseOperator,CompareOp:M.compareOperator,AssignOp:M.definitionOperator,UpdateOp:M.updateOperator,Asterisk:M.punctuation,Label:M.labelName,"( )":M.paren,"[ ]":M.squareBracket,"{ }":M.brace,".":M.derefOperator,", ;":M.separator}),LN={__proto__:null,void:34,byte:36,short:36,int:36,long:36,char:36,float:36,double:36,boolean:36,extends:50,super:52,this:64,public:70,protected:72,private:74,abstract:76,static:78,final:80,strictfp:82,default:84,synchronized:86,native:88,transient:90,volatile:92,sealed:95,non:97,instanceof:140,true:158,false:158,null:166,class:170,new:176,throws:196,implements:204,permits:211,record:215,interface:226,enum:236,open:289,module:291,requires:296,transitive:298,exports:300,to:302,opens:304,uses:306,provides:308,with:310,package:314,import:318,if:330,else:332,while:336,for:340,var:347,assert:354,switch:358,case:366,throw:370,do:374,break:378,continue:382,return:386,try:392,catch:396,finally:404},WN=Bs.deserialize({version:14,states:"#5QQ]QPOOQ%QQPOOO(wQQO'#HlO+OQQO'#CbOOQO'#Cb'#CbO+VQPO'#CaOOQO'#Co'#CoO,{QPO'#DOO-iQQO'#HvOOQO'#Hv'#HvO0^QQO'#HqO0eQQO'#HqOOQO'#Hq'#HqOOQO'#Hp'#HpOOQO'#Hz'#HzO0lQPO'#GwO2`QPO'#DOO2gQPO'#CkO4vQPO'#DfO4}QPO'#CiO6ZQQO'#FsO6bQPO'#DyO7rOSO'#EQOOQO'#IW'#IWO+VQPO'#EzO8iQPO'#EzOOQO'#EV'#EVO:QQQO'#ITOnQPO'#HzO>uQPO'#EcO>uQPO'#EjO>uQPO'#EuO>uQPO'#EpO>}QPO'#I[O?cQQO'#FRO+VQPO'#C`O?kQPO'#C`O+VQPO'#FnO?pQPO'#FpO@OQPO'#FvO@OQPO'#FyO>uQPO'#GOO@TQPO'#F{O6bQPO'#GSO6bQPO'#G[O@OQPO'#GUO]QPO'#G^O@YQPO'#G`O@eQPO'#GbO@pQPO'#GdO@wQPO'#GgOAeQQO'#CjOBTQQO'#CjOB_QPO'#I`OCzQPO'#DOODbQPO'#E]OBbQPO'#E^OESQPO'#I`OEeQPO'#E]OEmQPO'#IhOErQPO'#FOOOQO'#I^'#I^OOQO'#G}'#G}Q%QQPOOOGhQPO'#HzOOQO'#Hl'#HlOHZQQO,58{OOQO'#Hj'#HjOOQO'#Hr'#HrOJtQPO,59_OLSQPO,59jOOQO-E:r-E:rO+VQPO,58zOLyQPO,58zO+VQPO,5uQPO,5:}O>uQPO,5;UO>uQPO,5;aO>uQPO,5;[O>uQPO,5gO6bQPO'#EUO@zQPO,5=QO!0rQPO,5:}O!1TQPO,5;UO!1]QPO,5;aO!1eQPO,5;[O!-SQPO,5>vO!1sQPO,5>vO!-SQPO,5>vO!2OQPO,5;mO!2aQQO,58zO!2iQQO,5zOB_QPO,5:vO!;WQPO,5:wOErQPO,5;jO!;`QPO'#E_OBbQPO'#E_O!;kQPO'#IaO!;sQPO,5:xOB_QPO,5>zO!-SQPO,5>zOEmQPO,5?SOOQO,5:w,5:wO!+VQPO'#CkOOQO,5?S,5?SO!?pQPO'#FPOOQO,5;j,5;jO!?wQPO,5;jO!-SQPO'#EaOOQO-E:{-E:{OOQO,5;i,5;iO+VQPO,58}O!?|QPO'#ChOOQO1G.k1G.kO!2aQQO1G.fO+VQPO1G.fO!@WQQO1G1tOOQO,59f,59fO!@`QPO,59fOOQO-E:t-E:tO!@eQPO,5>iO!@|QPO,59zO>uQPO'#HOO!ATQPO,5>yOOQO1G2U1G2UOOQO1G0Y1G0YO!AnQPO'#CsO!B^QPO'#HvO!BkQPO'#CtO!ByQPO'#HuO!CRQPO,59^OOQO1G.v1G.vO!#aQPO1G.vO!CiQPO,59_O!CvQQO'#HlO!DXQQO'#CbO!DjQPO,59yOOQO,59i,59iO>uQPO,59yOOQO,59W,59WO!DuQQO,59WO!DzQPO,59iO!,oQPO'#GyO!E]QPO,5>eOOQO1G.q1G.qO!EeQPO'#C}O!EvQPO1G.qO>uQPO'#GzO!E{QPO,5>mOOQO1G/k1G/kOOQO1G0[1G0[O!-SQPO'#HPO!FTQPO1G1cO6bQPO1G1cOOQO1G/l1G/lO!F]QQO1G.oOOQO1G.o1G.oO!HZQQO1G/mO!IxQQO1G/mO!KgQQO1G/mO!KnQQO1G/mO!KuQQO1G/mO!MdQQO1G/mO!MkQQO1G/mO# YQQO1G/mO# aQQO1G/mO# kQQO1G/mO# rQQO1G/|O!)dQPO'#DOO# yQQO'#HvO!*jQPO'#DuOOQO1G/y1G/yO##`QQO1G1dOOOO-E:y-E:yOOQO1G0W1G0WO##vQPO'#E{OOQO1G1Q1G1QO#$jQPO1G2UO!-{QPO1G1QO!0rQPO1G0iO!1TQPO1G0pO!1]QPO1G0{O!1eQPO1G0vOOQO1G0]1G0]O#$oQQO1G1XO}QPO'#I[OOQO1G1X1G1XO#&iQQO1G1XO#&qQQO1G1YOOQO1G1]1G1]O#&xQPO1G1]O#'TQQO'#I]O#'bQPO,5:sOOQO1G1z1G1zOOQO1G4R1G4ROOQO1G2l1G2lO#'gQPO'#EYO!-SQPO'#EdO!-SQPO'#EeO!-SQPO'#EhOOQO1G0i1G0iO#'nQPO1G0iO#'sQPO1G0iO#'{QPO1G0iO#(WQPO1G0iO#(fQPO'#ElO#(|QPO1G0pO#)UQPO1G0pO#)ZQPO'#EwOOQO1G0{1G0{O#)nQPO1G0{O#)sQPO'#EsO!-SQPO'#ErOOQO1G0v1G0vO#*pQPO1G0vO#*uQPO1G0vO#*}QPO1G0vO!1sQPO1G4bO#+YQPO'#FXO#+aQPO'#FXOOQO'#HX'#HXO#+iQQO1G1^O#-fQQO1G4bO!-SQPO1G4bO|OOQO1G0b1G0bOOQO1G4f1G4fO#DXQPO1G0bOOQO1G0c1G0cOOQO1G1U1G1UO!?wQPO1G1UOOQO,5:y,5:yO!-SQPO'#E`O#D^QPO,5:yOBbQPO'#HQO#DiQPO,5>{OOQO1G0d1G0dOEmQPO'#IbO#DqQPO1G4fOB_QPO1G4fOOQO1G4n1G4nO!)tQPO'#C}O!)dQPO'#DOOOQO,5;k,5;kO#D|QPO,5;kO#ETQPO,5;kO#E[QQO'#ITO#EcQQO'#IVO#EjQQO'#FQO#EuQPO'#FQO#E}QPO'#IcOOQO,5:{,5:{OOQO1G.i1G.iO#F]QQO'#HnO#FmQQO'#FUO#HTQPO'#F`OOQO'#Hn'#HnO#H_QPO'#HnO#H|QPO'#IkO#IUQPO,59SOOQO7+$Q7+$QO!2aQQO7+$QOOQO7+'`7+'`OOQO1G/Q1G/QO#IZQPO'#DdO#IeQQO'#IPOOQO'#IP'#IPOOQO1G/f1G/fOOQO,5=j,5=jOOQO-E:|-E:|O#IuQWO,58{O#I|QPO,59`OOQO,59`,59`O!-SQPO'#HxO!!tQPO'#GuO#J[QPO,5>aOOQO1G.x1G.xOOQO7+$b7+$bOOQO1G.r1G.rO#JdQQO1G.rO>uQPO1G/eOOQO1G/e1G/eO#JiQPO1G.rO#JnQPO1G/eOOQO1G/T1G/TOOQO,5=e,5=eOOQO-E:w-E:wOOQO7+$]7+$]OOQO,5=f,5=fOOQO-E:x-E:xOOQO,5=k,5=kOOQO-E:}-E:}O6bQPO7+&}O#JyQQO7+&}O6bQPO7+%hO#LgQQO,59_OOQO,5:a,5:aOB_QPO,5:aO#MvQPO'#EtO#NUQPO'#EtOOQO'#HW'#HWO#NpQPO,5;gOOQO,5;g,5;gOOQO7+'p7+'pOOQO7+&l7+&lOOQO7+&T7+&TO#'nQPO7+&TO#'sQPO7+&TO#'{QPO7+&TO#(WQPO7+&TO#(|QPO7+&[O#)UQPO7+&[OOQO7+&g7+&gO#)nQPO7+&gOOQO7+&b7+&bO#*pQPO7+&bO#*uQPO7+&bO#*}QPO7+&bOOQO7+&u7+&uOOQO'#FU'#FUOvOvO$ dQPO7+&sO$ rQPO7+&wOOQO7+&t7+&tOOQO7+&w7+&wO6bQPO'#G|O$!QQPO,5>wOOQO1G0_1G0_O$!]QPO,5:tOOQO,5:t,5:tOOQO,5;O,5;OOOQO'#Eg'#EgOOQO,5;P,5;POOQO,5;S,5;SO$!dQPO'#EmO!*jQPO'#EmO$!uQPO'#IdO$!}QPO,5;WO$#SQPO'#EnOOQO7+&[7+&[O$#ZQPO7+&[O$#`QPO'#ExO>uQPO'#ExO$#qQPO'#IfO$#|QPO,5;cOB_QPO'#I`O!-SQPO'#I`O$$UQPO'#E]OOQO'#HU'#HUO$$]QPO,5;_OOQO,5;_,5;_OOQO,5;^,5;^O$%YQQO7+&xO$'VQQO7+)|O$)PQQO,5;sOOQO,5;s,5;sO$)WQPO,5;sOOQO-E;V-E;VOOQO7+&x7+&xOOQO7+)|7+)|O}O$4VQPO,5;{O$4^QPO'#IjO$4fQPO,5;zO+VQPO'#HZO$4kQPO,5?VOOQO1G.n1G.nOOQO<d,5>dOOQO,5=a,5=aOOQO-E:s-E:sO$5QQPO7+$^OOQO7+%P7+%POOQO7+$^7+$^O>uQPO7+%PO$5VQQO<uQPO,5;XOOQO,5;X,5;XO$;zQPO,5;XO!,oQPO'#HSO$<]QPO,5?OOOQO1G0r1G0rODbQPO'#E]O$WQPO'#EyOOQO1G0}1G0}O$>_QPO1G0}OB_QPO,5;`OOQO-E;S-E;SOOQO1G0y1G0yOOQO<dQQO1G1_O$>kQQO<uQPO,5=VO!*jQPO,5=VOOQO1G2o1G2oOOQO<lOOQO1G/j1G/jOOQO<uQPO1G0sOOQO1G0s1G0sO$HSQPO1G0sOOQO,5=n,5=nOOQO-E;Q-E;QO$uQPO1G2qOOQO<uQPO7+&_OOQO1G0u1G0uOOQO7+&j7+&jOOQO7+'V7+'VO+VQPO'#H^O$JtQPO,5?XO$J|QPO7+'VO$KRQQO'#InOOQOAN@yAN@yO$K^QQOAN@yOOQOAN@uAN@uO$KeQPOAN@uO$KjQQO<`!>cP!=^!>{!=^P!=^P!?O!?R!?VP!{#?U#?XP0oP#?]!)]PPP#Ae#Cm#C|#DY#Dr#ET#EW#Ed#El#Eo#EsP#EvP#FU#FX#F[#F`#Ff#FiwuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u)usOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%q%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h)r){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-[-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u/}0T0j0u1S1V1Z1]1^1j2Q2R2X2Z2[2e2i2k2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n$xlOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nv!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rQ$ShS&_#`)dQ'V$UU']$[$n-VQ'd$^W(w%U,n/i1]U)o%p(^,]Q)q%qS*[&W-RU+U'_.W/vQ+]'eQ-s*oQ.T+YQ.X+ZQ0Q-_Q0]-tR0g.Yw!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rT%r!s*R${rOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n$OcObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3n^!lP!h!p'k+a.p0u|#RW!Y#`$T$Z%{&]&`&d(d(u)d*]*o+g,`,m-l-t.a/n1aS#ea3mQ$g|Q$h}Q$i!OQ$j!PW%Y!f%]+r.sS%`!i)]Q%f!jQ'W$VQ'X$WQ'Y$XQ'Z$YQ)[%aS)`%d)bQ*e&fQ*m&|S+n'w.nQ-o*nS.f+k.iQ.m+oQ0i._Q0m.eQ1r0hQ2^1sw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nU%i!l.f0mS)R%Y)`Q)c%fw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3iV#da%h3m'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ&U#YQ*Y&VX/k,s/o1^2R'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/k,s/o1^2R'fZOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/l,s/o1^2RS#XY/kS$m!Q'`S'_$[$nQ'e$^S)l%j)hQ.W+YQ.Y+ZR/v-V%mXOabepy![!]!_!b#W#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|$]$_$b$e$t$u$v$w$x%U%j%m%q%z&j&l'l'm'n'{(R(f(k(m)Z)g)h)r){*U*V*i*k+^+},^,b,c,g,j,n-T-U-Y-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ&S#WR-g*V'c]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n!w#PW!f!v#Q#R#`$O$T%X%Y%]%d%y&Q&W&`&d&|(d(u)R)b)d*l*n*o+g+r,`,m,x-R-t.a.s/m1j2Q2X2[2e2kW#ba#d%h3mR*b&aviOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u[!hP!p'k+a.p0uY#aa#d%h&a3mQ&}#{Q(e$vW(y%U,n/i1]S*p'S*rS+h't.bS+o'w.nS+t'z+vS.e+k.iR/o,sh#TW!Y!f$T$Z%](d*o+r,`-t.sQ*P%{Q*^&]Q-j*]R0X-lU)}%z){0TQ,P(UR.v+y$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3ivwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uQ%V!cQ%g!kQ%o!qS&o#k2wQ'j$fQ)Q%WQ)V%^Q,u)OQ/p,tQ0n.fQ1W/^R1t0m${qOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n!^#od#g$y$z%S&n&p&r&s&t&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lg2y/b3U3V3X3Y3Z3[3]3a3e3f!Y#rd#g$y$z%S&n&r&s&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lc2|/b3U3X3Y3[3]3a3e3fR'O#{%TgOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%ToOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%SoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ$f{Q$t!WQ$u!XQ${!^R,k(oQ$`mS(V$l+XQ+T'^S+z(Q(XS-W)j)kQ.S+VQ.l+nQ.z,RQ/y-XQ0e.VQ0r.mQ1d/wQ1q0fR2V1cQ'o$gY*v'W'p'q'r'sQ,Q(VW-w*w*x*y*zQ.k+nQ.w+zU0^-x-y-zS0q.l.mQ0x.zS1m0_0`Q1u0rR2]1na!nP!p'k+a+k.i.p0u`!nP!p'k+a+k.i.p0uT+u'z+vd!jP!h!p'k+a+k.e.i.p0uQ's$gQ'v$hQ(P$jQ*z'WQ*|'XQ+S'ZV+s'z+t+vQ%b!iR,})]Q)Y%`R,|)[Q%l!mQ)T%[Q)X%_Q-P)aR/s-QvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uS*q'S*rT+u'z+vQ'r$gS*y'W'sR-z*zQ'q$gQ'y$iU*x'W'r'sQ+O'YQ+m'uS-y*y*zQ-|*{Q0`-zR0b-}Q+e'mQ+f'nR+x'{Q'p$gQ'}$jW*w'W'q'r'sU+Q'Z(O(PU-x*x*y*zS.Q+R+SS0_-y-zQ0d.RR1n0`Q'u$hS*{'X'vR-}*|Q+i'tR0k.bQ+l'uS-{*{+mS0a-|-}R1o0bT.g+k.iQ(O$jS+R'Z(PR.R+SQ'|$jW+P'Z'}(O(PU.P+Q+R+SS0c.Q.RR1p0dvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uT+u'z+vQ'x$iS*}'Y'yR.O+OQ+p'wR0s.nR.r+qQ'T$SR*u'VT*q'S*rQ%k!mS)W%_%lR,z)XQ)g%jR-U)h$zoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nX(x%U,n/i1]%SmOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nU'^$[$n-VS+V'_/vQ.V+YR0f.WX(T$l(Q(U+y_)s%q)r-[/}2Z2i2nQ)u%qR0R-_Q([$oQ)w%sR-b)xT,S(Z,TvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR1W/^wwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uvvOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uQ%P!`R%R!aR$w!ZvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR(f$vR$x!ZR(n${T,f(m,gT,e(m,gX({%V(|)Q,vR,t(}Q/n,sR1a/oQ)P%VQ,r(|Q,w)QR/q,vR%W!cQ(z%UV/g,n/i1]QyOQ#jbY$cy#j)h-T/uQ)h%jQ-T)gR/u-UvVOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uv!gP!p#d&a'S'k't'w'z*r+a+k+v,s.b.i.n.p0u|!xV!g#O#Z#_#}$k%a%e&P&V&Z&{(S(W)e*`+W.^0j2R3`!f#OW!f!v#R$O$T%Y%]%d%y&Q&W&|(d(u)R)b*l*n*o+r,`,m,x-R-t.s/m1j2Q2X2[2e2kQ#Z_S#_a3m$`#}ep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%m%q%z&j&l'l'm'n'{(R(f(k)Z)r){*U*i*k+^+},b,c,j-Y-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$k!QS%a!i)]S%e!j+sS&P#W*VQ&V#YU&Z#`&d)dQ&{#{W(S$l(Q(U+yQ(W$mQ)e%hQ*`&`Q+W'`Q.^+gQ0j.aQ2R1^Z3`$v%U,n/i1]Q*W&SR-h*W^#QW#`$O&|(d(u*l!Q%X!f!v$T%]%d&Q&W&`&d)b)d*n*o+g+r,`,m-R-t.a.s/m2Q2e[%x#Q%X%y,x2X2kS%y#R%YQ,x)RQ2X1jR2k2[#Q`OPaby!_!p#d#j#{$b$t$u$v$w$x%U%h%j&a'S'k't'w'z(m)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3m[!wV!g#_&{)e3`T#[`!wQ0U-cR1i0UQ&b#bR*c&bQ&g#eR*f&gQ$QfR'Q$QQ+_'fS.[+_1XR1X/bQ!pPU%n!p+a0uQ+a'kR0u.pQ%|#TR*Q%|Q&k#hU*h&k/r3kQ/r,{R3k3jQ)^%bR-O)^Q-Z)mR/{-ZQ.c+iR0l.cQ.i+kR0o.iQ+v'zR.t+vQ.o+pR0t.oQ*r'SR-u*rQ(U$lQ+y(QT,O(U+yQ0O-]R1g0OQ-`)uR0S-`Q,T(ZR.{,TQ/P,VR0{/PQ1x0|S2`1x2bR2b1zQ,g(mR/`,gQ(|%VS,q(|,vR,v)QQ1_/mR2S1_Q,o(zR/j,odxOby#j%j)g)h-T-U/uQ$|!_Q'h$bQ(b$tQ(c$uQ(h$wQ(i$xS,f(m,gR/V,^)ftOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u0T0j0u1S1V1Z1]1^1j2Q2R2X2[2e2k2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n_)t%q)r-[/}2Z2i2nQ!sTQ$o!SQ$p!UQ$q!VQ%s!yQ%u!{Q(`$rQ(a$sQ)x%tQ*R2rS.},V,XQ/R,WQ/S,YQ0z/PS0|/R1OQ1z1PR2_1w&{SOTabehpy!S!U!V![!]!_!b!y!{#`#j#k#n#o#p#q#r#s#t#u#v#w#x#|$U$[$]$^$_$b$e$n$r$s$t$u$v$w$x%U%j%p%q%t%z&W&l'_'e(R(^(f(k(m)d)g)h)r){*i*k*o+Y+Z+^+},V,W,X,Y,],^,b,c,g,j,n-R-T-U-V-[-_-t.W.Y/P/R/W/Y/^/e/i/u/v/}0T1O1P1S1V1Z1]1w2Z2i2n2r2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ)v%qQ-])rQ/|-[Q1f/}Q2j2ZQ2l2iR2p2nxdOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/^/uU#ga$e3mS#ye3hS$ap3iQ$y![Q$z!]Q%S!bQ&n#kQ&p#nQ&q#oQ&r#pQ&s#qQ&t#rQ&u#sQ&v#tQ&w#uS&x#v3QQ&y#wQ&z#xQ'P#|Q'c$]Y'f$_$v,b/Y1V^)p%q)r-[/}2Z2i2nU)|%z){0TS*j&l3TQ+{(RQ,a(fQ,d(kS-m*i3bQ-n*kQ.Z+^Q.y+}Q/[,cQ/b,jQ1R/WQ1Y/eQ1|1SQ2P1ZQ3U2wQ3V2xQ3W2yQ3X2zQ3Y2{Q3Z2|Q3[2}Q3]3OQ3^3PQ3_3RQ3a3SQ3e3cQ3f3dR3l3nvWOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!fP!p'k+a+k.i.p0uW!vV#}&P3`S#`a3m#|$Oep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%q%z&l(R(f(k)r){*i*k+^+},b,c,j-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$TiS%]!h.eS%d!j+sf&Q#W%m&j'l'm'n'{)Z*U*V-YQ&W#_Q&`#aS&d#d&aQ&|#{Q(d$vW(u%U,n/i1]Q)b%eQ)d%hQ*l&{Q*n&}S*o'S*rS+g't.bS+r'z+vQ,`(eQ,m(yQ-R)eQ-t*pQ.a+hQ.s+tS/m,s/oQ2Q1^R2e2R'b]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ$l!QQ(Q$kS(X$m+WQ+X'`R,R(W'sUOPVabeipy!Q![!]!_!b!h!j!p#W#Y#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&V&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nR&T#W%OnObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ#haQ&S#WQ'O#{W)m%m'm'n'{Q*g&jQ+c'lQ,{)ZQ-f*UQ-g*VQ/z-YR3j3mQ*T&RR-e*SU#ca%h3mR&e#d#c_OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3m#c^OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3ml#SW!Y!f$T$Z%]%{&]*]*o+r-l-t.sU&[#`&d)dQ*a&`Q,_(dQ,l(uQ.`+gQ/X,`Q/f,mQ0i.aQ1`/nR2U1aQ*O%zQ-c){R1h0TR-d){T#fa3m$vkOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%q%z&l(R(f(k(m)g)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nW(v%U,n/i1]T)i%j)h%SjOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nT'[$[-VQ'g$_Q(g$vQ/Z,bQ1T/YR2O1V[!oP!p'k+a.p0uT.g+k.iU#UW!Y(dQ%Z!fU'U$T$Z,`Q)U%]S-r*o+rT0[-t.sd!kP!p'k'z+a+k+v.i.p0uV%^!h+t.eR%c!iW%[!f%]+r.sQ)a%dR-Q)bQ)n%mV+d'm'n'{R+j'tT.h+k.iR+q'w`!mP!p'k+a+k.i.p0uT%_!h.eR-^)rR)v%qT/O,V/PQ0}/RR1y1OR1y1PR/c,j",nodeNames:"⚠ LineComment BlockComment Program ModuleDeclaration MarkerAnnotation Identifier ScopedIdentifier . Annotation ) ( AnnotationArgumentList LambdaExpression Definition FormalParameters ReceiverParameter void PrimitiveType TypeName ScopedTypeName GenericType TypeArguments AnnotatedType Wildcard extends super , ArrayType ] Dimension [ this FormalParameter Modifiers public protected private abstract static final strictfp default synchronized native transient volatile sealed non SpreadParameter VariableDeclarator AssignOp } { ArrayInitializer InferredParameters Block BinaryExpression CompareOp CompareOp CompareOp LogicOp LogicOp BitOp BitOp BitOp ArithOp ArithOp BitOp InstanceofExpression instanceof TypePattern TernaryExpression LogicOp : UpdateExpression UpdateOp IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral TextBlock null ClassLiteral class ParenthesizedExpression ObjectCreationExpression new ArgumentList ClassBody ; FieldDeclaration MethodDeclaration TypeParameters TypeParameter TypeBound Throws throws ClassDeclaration Superclass SuperInterfaces implements InterfaceTypeList Permits permits RecordDeclaration record RecordHeader RecordComponent RecordBody CompactConstructorDeclaration InterfaceDeclaration interface ExtendsInterfaces InterfaceBody ConstantDeclaration EnumDeclaration enum EnumBody EnumConstant EnumBodyDeclarations AnnotationTypeDeclaration AnnotationTypeBody AnnotationTypeElementDeclaration StaticInitializer ConstructorDeclaration ConstructorBody ExplicitConstructorInvocation FieldAccess ArrayAccess MethodInvocation MethodName MethodReference ArrayCreationExpression Dimension UnaryExpression LogicOp BitOp CastExpression AssignmentExpression AssignOp ElementValueArrayInitializer ElementValuePair open module ModuleBody ModuleDirective requires transitive exports to opens uses provides with PackageDeclaration package ImportDeclaration import Asterisk ExpressionStatement LabeledStatement Label IfStatement if else WhileStatement while ForStatement for ForSpec LocalVariableDeclaration var EnhancedForStatement ForSpec AssertStatement assert SwitchStatement switch SwitchBlock SwitchRule SwitchLabel case ThrowStatement throw DoStatement do BreakStatement break ContinueStatement continue ReturnStatement return SynchronizedStatement TryStatement try CatchClause catch CatchFormalParameter CatchType FinallyClause finally TryWithResourcesStatement ResourceSpecification Resource ClassContent",maxTerm:296,nodeProps:[["isolate",-4,1,2,80,81,""],["group",-27,4,56,91,99,106,112,117,122,156,158,161,162,164,167,169,172,174,176,178,184,186,188,190,192,194,195,203,"Statement",-25,6,13,32,57,69,72,75,77,78,79,80,81,82,83,84,86,87,129,130,131,133,134,136,139,140,"Expression",-7,17,18,19,20,21,23,28,"Type"],["openedBy",10,"(",52,"{"],["closedBy",11,")",53,"}"]],propSources:[MN],skippedNodes:[0,1,2],repeatNodeCount:30,tokenData:"#$g_R!_OX%QXY'fYZ)bZ^'f^p%Qpq'fqr*|rs,^st%Qtu2zuv4avw5qwx7Xxy?pyz@^z{@z{|Ap|}CW}!OCt!O!PEa!P!QNZ!Q!R!+P!R![!.k![!]!;T!]!^!osw<}wx9}x#O<}#O#P&Z#P;'S<};'S;=`?d<%lO<}P>rVOY>oZw>owx?Xx#O>o#P;'S>o;'S;=`?^<%lO>oP?^O!rPP?aP;=`<%l>oT?gP;=`<%l<}T?mP;=`<%l8P_?wVZZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV@eVYR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVATX$fP&}S!eQOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVAwZ!dR&}SOY%QYZ%lZr%Qrs%qs{%Q{|Bj|!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVBqV!nR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVC_VkR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_C}[&pW!dR&}SOY%QYZ%lZr%Qrs%qs}%Q}!OBj!O!_%Q!_!`5T!`!aDs!a;'S%Q;'S;=`&s<%lO%QVDzV&vR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_EhZWY&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PFZ!P!Q%Q!Q![Gi![;'S%Q;'S;=`&s<%lO%QVF`X&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PF{!P;'S%Q;'S;=`&s<%lO%QVGSV&rR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTGpc&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#R%Q#R#SMc#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTISV&}S!pPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTIn]&}SOY%QYZ%lZr%Qrs%qs{%Q{|Jg|}%Q}!OJg!O!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTJlX&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTK`c&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![!f%Q!f!gH{!g!h%Q!h!iH{!i#R%Q#R#SLk#S#W%Q#W#XH{#X#Y%Q#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTLpZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![#R%Q#R#SLk#S;'S%Q;'S;=`&s<%lO%QTMhZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![#R%Q#R#SMc#S;'S%Q;'S;=`&s<%lO%Q_Nb]&}S!eQOY%QYZ%lZr%Qrs%qsz%Qz{! Z{!P%Q!P!Q!'|!Q!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%Q_! `X&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!!QT&}SOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!dTOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!vVOz!!az{!!s{!P!!a!P!Q!#]!Q;'S!!a;'S;=`!#b<%lO!!aZ!#bOQZZ!#eP;=`<%l!!a_!#kXOY!$WYZ! {Zr!$Wrs!&bsz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!$ZXOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!${Z&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!%uV&}SQZOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!&_P;=`<%l! Z_!&eXOY!$WYZ! {Zr!$Wrs!!asz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!'TZOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!'yP;=`<%l!$W_!(TV&}SPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!(oVPZOY!)UYZ%lZr!)Urs!)vs;'S!)U;'S;=`!*y<%lO!)U_!)ZVPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!)sP;=`<%l!'|_!){VPZOY!)UYZ%lZr!)Urs!*bs;'S!)U;'S;=`!*y<%lO!)UZ!*gSPZOY!*bZ;'S!*b;'S;=`!*s<%lO!*bZ!*vP;=`<%l!*b_!*|P;=`<%l!)UT!+Wq&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!d%Q!d!e!1u!e!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o!z%Q!z!{!3s!{#R%Q#R#S!0}#S#U%Q#U#V!1u#V#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a#l%Q#l#m!3s#m;'S%Q;'S;=`&s<%lO%QT!-fa&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QT!.ri&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o#R%Q#R#S!0}#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!0hV&}S!oPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT!1SZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!.k![#R%Q#R#S!0}#S;'S%Q;'S;=`&s<%lO%QT!1zY&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S;'S%Q;'S;=`&s<%lO%QT!2q`&}S!oPOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S!n%Q!n!o!0a!o#R%Q#R#S!1u#S#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!3x_&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!P!4w!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QT!4|]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i#T%Q#T#Z!5u#Z;'S%Q;'S;=`&s<%lO%QT!5zc&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#R%Q#R#S!4w#S#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!7^i&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!8{!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i!n%Q!n!o!0a!o!r%Q!r!sIi!s#R%Q#R#S!:V#S#T%Q#T#Z!7V#Z#`%Q#`#a!0a#a#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!9Qa&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!:[]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QV!;[X!lR&}SOY%QYZ%lZr%Qrs%qs![%Q![!]!;w!];'S%Q;'S;=`&s<%lO%QV!l!`;'S%Q;'S;=`&s<%lO%QU!>PX!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QU!>sV!]Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!?aX!TR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QV!@TY&gR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`!>l!`!a!@s!a;'S%Q;'S;=`&s<%lO%QU!@zY!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`!a!=x!a;'S%Q;'S;=`&s<%lO%Q_!AsV&kX!kQ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!BaX&]Z&}SOY%QYZ%lZr%Qrs%qs#]%Q#]#^!B|#^;'S%Q;'S;=`&s<%lO%QV!CRX&}SOY%QYZ%lZr%Qrs%qs#b%Q#b#c!Cn#c;'S%Q;'S;=`&s<%lO%QV!CsX&}SOY%QYZ%lZr%Qrs%qs#h%Q#h#i!D`#i;'S%Q;'S;=`&s<%lO%QV!DeX&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!EQ#Y;'S%Q;'S;=`&s<%lO%QV!EVX&}SOY%QYZ%lZr%Qrs%qs#f%Q#f#g!Er#g;'S%Q;'S;=`&s<%lO%QV!EwX&}SOY%QYZ%lZr%Qrs%qs#Y%Q#Y#Z!Fd#Z;'S%Q;'S;=`&s<%lO%QV!FiX&}SOY%QYZ%lZr%Qrs%qs#T%Q#T#U!GU#U;'S%Q;'S;=`&s<%lO%QV!GZX&}SOY%QYZ%lZr%Qrs%qs#V%Q#V#W!Gv#W;'S%Q;'S;=`&s<%lO%QV!G{X&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!Hh#Y;'S%Q;'S;=`&s<%lO%QV!HoV'ZR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!I]b&aZ&}SOY%QYZ%lZr%Qrs%qst%Qtu!IUu!Q%Q!Q![!IU![!c%Q!c!}!IU!}#R%Q#R#S!IU#S#T%Q#T#o!IU#o$g%Q$g;'S!IU;'S;=`!Je<%lO!IU_!JhP;=`<%l!IU_!JrVoZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!K`VmR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QU!K|X!cQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QV!LpV!VR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!M`Z'dX!bQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`#p%Q#p#q!NR#q;'S%Q;'S;=`&s<%lO%QU!NYV!`Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!NvV!UR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT# dV$OP&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#!Su&}S&XZ&_ZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qst%Qtu2zu!Q%Q!Q![2z![!c%Q!c!}2z!}#R%Q#R#S2z#S#T%Q#T#o2z#o#y%Q#y#z'f#z$f%Q$f$g'f$g#BY2z#BY#BZ# y#BZ$IS2z$IS$I_# y$I_$I|2z$I|$JO# y$JO$JT2z$JT$JU# y$JU$KV2z$KV$KW# y$KW&FU2z&FU&FV# y&FV;'S2z;'S;=`4Z<%lO2z",tokenizers:[0,1,2,3],topRules:{Program:[0,3],ClassContent:[1,206]},dynamicPrecedences:{21:1,246:-1,252:-1},specialized:[{term:245,get:i=>LN[i]||-1}],tokenPrec:9164}),EN=_s.define({name:"java",parser:WN.configure({props:[Zp.add({IfStatement:Nr({except:/^\s*({|else\b)/}),TryStatement:Nr({except:/^\s*({|catch|finally)\b/}),LabeledStatement:lW,SwitchBlock:i=>{let e=i.textAfter,t=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return i.baseIndent+(t?0:n?1:2)*i.unit},Block:oW({closing:"}"}),BlockComment:()=>null,Statement:Nr({except:/^{/})}),cW.add({"Block SwitchBlock ClassBody ElementValueArrayInitializer ModuleBody EnumBody ConstructorBody InterfaceBody ArrayInitializer":dW,BlockComment(i){return{from:i.from+2,to:i.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/}});function NN(){return new KL(EN)}const FN=" ";function JN(i,e){let t="",n=e;for(let a=0;a{var x,b;const o=s.trim(),l=a,{chars:u,comment:m}=JN(s,a);a=m;const c=l?0:((x=/^[}\])\s]*/.exec(o)[0].match(/[}\])]/g))==null?void 0:x.length)??0,d=n.slice(0,Math.max(0,n.length-c));GN.test(o)&&((b=d.at(-1))!=null&&b.inCase)&&(d.at(-1).inCase=!1);const h=RN(d);for(const y of u)"{[(".includes(y)?n.push({line:r,char:y}):n.pop();const g=n.at(-1);(g==null?void 0:g.line)===r&&g.char==="{"&&/^switch\b/.test(o)&&(g.char="switch"),(g==null?void 0:g.char)==="switch"&&HN.test(o)&&(g.inCase=!0);const f=r+1;return ft||l&&!o.startsWith("*")?s:o===""?"":FN.repeat(h)+(l?" ":"")+o}).join(` -`)}const VN=[["nextInt","","int","Ganze Zahl einlesen","Read a whole number","Ler um número inteiro"],["nextDouble","","double","Kommazahl einlesen","Read a decimal number","Ler um número decimal"],["nextLine","","String","Ganze Zeile als Text einlesen","Read a whole line as text","Ler uma linha inteira como texto"],["next","","String","Ein Wort einlesen (bis zum Leerzeichen)","Read one word (up to a space)","Ler uma palavra (até ao espaço)"],["nextBoolean","","boolean","true oder false einlesen","Read true or false","Ler true ou false"],["nextLong","","long","Große ganze Zahl einlesen","Read a large whole number","Ler um número inteiro grande"],["hasNextInt","","boolean","Kommt als Nächstes eine ganze Zahl?","Is the next input a whole number?","A próxima entrada é um número inteiro?"],["hasNextDouble","","boolean","Kommt als Nächstes eine Kommazahl?","Is the next input a decimal number?","A próxima entrada é um número decimal?"],["hasNextLine","","boolean","Gibt es noch eine Zeile?","Is there another line?","Existe mais uma linha?"],["hasNext","","boolean","Gibt es noch ein Wort?","Is there another word?","Existe mais uma palavra?"],["close","","void","Eingabe schließen","Close the input","Fechar a entrada"]],QN=[["length","","int","Anzahl der Zeichen","Number of characters","Número de caracteres"],["charAt","index","char","Zeichen an Stelle index (ab 0)","Character at position index (from 0)","Carácter na posição index (a partir de 0)"],["equals","text","boolean","Gleicher Text? (statt ==)","Same text? (instead of ==)","Mesmo texto? (em vez de ==)"],["equalsIgnoreCase","text","boolean","Gleicher Text, groß/klein egal?","Same text, ignoring case?","Mesmo texto, ignorando maiúsculas?"],["compareTo","text","int","Alphabetisch vergleichen (<0, 0, >0)","Compare alphabetically (<0, 0, >0)","Comparar alfabeticamente (<0, 0, >0)"],["substring","von, bis","String","Teiltext von Stelle von bis vor bis","Part of the text from start up to before end","Parte do texto do início até antes do fim"],["indexOf","text","int","Erste Stelle des Textes (−1 = fehlt)","First position of the text (−1 = missing)","Primeira posição do texto (−1 = não existe)"],["lastIndexOf","text","int","Letzte Stelle des Textes (−1 = fehlt)","Last position of the text (−1 = missing)","Última posição do texto (−1 = não existe)"],["contains","text","boolean","Kommt der Text darin vor?","Does it contain the text?","Contém o texto?"],["startsWith","text","boolean","Fängt damit an?","Starts with it?","Começa com isto?"],["endsWith","text","boolean","Hört damit auf?","Ends with it?","Termina com isto?"],["toUpperCase","","String","In GROSSBUCHSTABEN","In UPPER CASE","Em MAIÚSCULAS"],["toLowerCase","","String","In kleinbuchstaben","In lower case","Em minúsculas"],["trim","","String","Leerzeichen vorn und hinten weg","Remove spaces at both ends","Remover espaços no início e no fim"],["replace","alt, neu","String","Text ersetzen","Replace text","Substituir texto"],["split","trenner","String[]",'In Teile zerlegen, z. B. split(";")','Split into parts, e.g. split(";")','Dividir em partes, p. ex. split(";")'],["isEmpty","","boolean","Leerer Text?","Empty text?","Texto vazio?"],["toCharArray","","char[]","Als Array von Zeichen","As an array of characters","Como array de caracteres"]],Tf=[["println","wert","void","Ausgeben, danach neue Zeile","Print, then a new line","Escrever e mudar de linha"],["print","wert","void","Ausgeben ohne neue Zeile","Print without a new line","Escrever sem mudar de linha"],["printf","format, werte","PrintStream",'Formatiert ausgeben, z. B. "%.2f"','Print formatted, e.g. "%.2f"','Escrever formatado, p. ex. "%.2f"']],qN=[...Tf,["close","","void","Datei speichern und schließen","Save and close the file","Guardar e fechar o ficheiro"]],UN=[["readLine","","String","Nächste Zeile lesen (null = Ende)","Read the next line (null = end)","Ler a próxima linha (null = fim)"],["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],$N=[["exists","","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"],["getName","","String","Name der Datei","Name of the file","Nome do ficheiro"],["length","","long","Größe in Bytes","Size in bytes","Tamanho em bytes"]],YN=[["getMessage","","String","Fehlermeldung als Text","Error message as text","Mensagem de erro como texto"],["printStackTrace","","void","Fehler mit Zeilen ausgeben","Print the error with its lines","Mostrar o erro com as linhas"]],XN=[["getSource","","Object","Welcher Knopf wurde geklickt?","Which button was clicked?","Que botão foi clicado?"],["getActionCommand","","String","Beschriftung des Knopfs","Label of the button","Texto do botão"]],KN=[["setBackground","farbe","void","Hintergrundfarbe, z. B. Color.RED","Background colour, e.g. Color.RED","Cor de fundo, p. ex. Color.RED"],["setForeground","farbe","void","Schriftfarbe","Text colour","Cor do texto"],["setFont","schrift","void",'Schrift, z. B. new Font("Arial", Font.BOLD, 24)','Font, e.g. new Font("Arial", Font.BOLD, 24)','Letra, p. ex. new Font("Arial", Font.BOLD, 24)'],["setVisible","true","void","Anzeigen (true) oder verstecken (false)","Show (true) or hide (false)","Mostrar (true) ou esconder (false)"],["setEnabled","true","void","Anklickbar (true) oder grau (false)","Clickable (true) or greyed out (false)","Clicável (true) ou cinzento (false)"],["setSize","breite, höhe","void","Größe in Pixeln","Size in pixels","Tamanho em píxeis"]],eF=[["add","baustein","Component","Baustein hinzufügen","Add a component","Adicionar um componente"],["setLayout","layout","void","Anordnung, z. B. new FlowLayout()","Layout, e.g. new FlowLayout()","Disposição, p. ex. new FlowLayout()"],["remove","baustein","void","Baustein entfernen","Remove a component","Remover um componente"]],tF=[["setTitle","text","void","Titel oben im Fenster","Title at the top of the window","Título no topo da janela"],["setDefaultCloseOperation","JFrame.EXIT_ON_CLOSE","void","Was beim Schließen passiert","What happens when closing","O que acontece ao fechar"],["setLocationRelativeTo","null","void","Mit null: Fenster in die Mitte","With null: centre the window","Com null: janela no centro"],["setResizable","false","void","Größe änderbar?","Can the size change?","Pode mudar de tamanho?"],["pack","","void","Größe passend zum Inhalt","Size to fit the content","Tamanho ajustado ao conteúdo"],["getContentPane","","JPanel","Inhaltsfläche des Fensters","Content area of the window","Área de conteúdo da janela"],["dispose","","void","Fenster schließen","Close the window","Fechar a janela"]],nF=[["setText","text","void","Text setzen","Set the text","Definir o texto"],["getText","","String","Text holen","Get the text","Obter o texto"]],iF=[["addActionListener","e -> { }","void","Was beim Klick passiert","What happens on click","O que acontece ao clicar"],["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setBorderPainted","false","void","Rahmen zeichnen?","Draw the border?","Desenhar a borda?"]],aF=[["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setHorizontalAlignment","JLabel.CENTER","void","Text links, mittig oder rechts","Text left, centre or right","Texto à esquerda, centro ou direita"]],sF=[["addActionListener","e -> { }","void","Was bei Enter passiert","What happens on Enter","O que acontece ao carregar em Enter"],["setEditable","false","void","Darf man hineinschreiben?","Can you type into it?","Pode-se escrever?"],["setColumns","anzahl","void","Breite in Zeichen","Width in characters","Largura em caracteres"],["requestFocus","","void","Cursor hineinsetzen","Put the cursor into it","Pôr o cursor no campo"]],rF=[["length",null,"int","Anzahl der Elemente (ohne Klammern)","Number of elements (no brackets)","Número de elementos (sem parênteses)"]],Qr=[["add","wert","boolean","Element hinten anhängen","Append an element at the end","Acrescentar um elemento no fim"],["get","index","E","Element an Stelle index holen (ab 0)","Get the element at index (from 0)","Obter o elemento na posição index (a partir de 0)"],["size","","int","Anzahl der Elemente","Number of elements","Número de elementos"],["set","index, wert","E","Element an Stelle index ersetzen","Replace the element at index","Substituir o elemento na posição index"],["remove","index","E","Element an Stelle index entfernen","Remove the element at index","Remover o elemento na posição index"],["contains","wert","boolean","Ist das Element in der Liste?","Is the element in the list?","O elemento está na lista?"],["indexOf","wert","int","Stelle des Elements (-1 = nicht da)","Position of the element (-1 = not found)","Posição do elemento (-1 = não existe)"],["isEmpty","","boolean","Ist die Liste leer?","Is the list empty?","A lista está vazia?"],["clear","","void","Alle Elemente entfernen","Remove all elements","Remover todos os elementos"]],qr={Scanner:VN,String:QN,PrintStream:Tf,PrintWriter:qN,BufferedReader:UN,FileReader:[["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],File:$N,Exception:YN,ActionEvent:XN,Component:KN,Container:eF,JFrame:tF,JPanel:[],JButton:iF,JLabel:aF,JTextField:sF,TextHolder:nF,ArrayList:Qr,List:Qr,LinkedList:Qr},oF={JFrame:["Container","Component"],JPanel:["Container","Component"],JButton:["TextHolder","Component"],JLabel:["TextHolder","Component"],JTextField:["TextHolder","Component"],PrintWriter:[]},Of={mbot:[["forward","cm","void","Geradeaus vorwärts fahren","Drive forward","Andar para a frente"],["backward","cm","void","Rückwärts fahren","Drive backward","Andar para trás"],["turnLeft","grad","void","Auf der Stelle nach links drehen","Turn left on the spot","Rodar para a esquerda"],["turnRight","grad","void","Auf der Stelle nach rechts drehen","Turn right on the spot","Rodar para a direita"],["stop","","void","Motoren anhalten","Stop the motors","Parar os motores"],["drive","links, rechts","void","Räder einzeln in Prozent (−100–100), fährt weiter bis stop()","Wheels separately in percent (−100–100), keeps going until stop()","Rodas separadas em percentagem (−100–100), continua até stop()"],["resetTimer","","void","Stoppuhr auf 0 setzen","Reset the stopwatch to 0","Pôr o cronómetro a 0"],["pause","ms","void","Millisekunden warten","Wait milliseconds","Esperar milissegundos"],["setLed","rot, gruen, blau","void","LEDs in einer Farbe (je 0–255)","LEDs in a colour (0–255 each)","LEDs numa cor (0–255 cada)"],["ledOff","","void","LEDs aus","LEDs off","Desligar LEDs"],["led","nr","LED",'Eine LED (0–4), dann .setColor("grün") oder .setColor("aus")','One LED (0–4), then .setColor("green") or .setColor("off")','Um LED (0–4), depois .setColor("green") ou .setColor("off")'],["showText",'"Hallo"',"void","Text auf dem Bildschirm zeigen","Show text on the screen","Mostrar texto no ecrã"],["emotion",'"smile"',"void","Gefühl zeigen: LEDs, Ton, Bewegung (smile, hello, sad …)","Show a feeling: LEDs, sound, motion (smile, hello, sad …)","Mostrar um sentimento: LEDs, som, movimento (smile, hello, sad …)"],["playTone","hz, ms","void","Ton spielen, z. B. playTone(440, 500)","Play a tone, e.g. playTone(440, 500)","Tocar um som, p. ex. playTone(440, 500)"],["getDistance","","int","Abstand vorn in cm (Ultraschall)","Distance ahead in cm (ultrasonic)","Distância à frente em cm (ultrassom)"],["getLine","","int","Liniensensor: 0 = keine Linie, 15 = alle vier auf der Linie","Line sensor: 0 = no line, 15 = all four on the line","Sensor de linha: 0 = sem linha, 15 = os quatro na linha"],["isLineLeft","","boolean","Linie unter dem linken mittleren Fühler","Line under the left middle probe","Linha sob a sonda central esquerda"],["isLineRight","","boolean","Linie unter dem rechten mittleren Fühler","Line under the right middle probe","Linha sob a sonda central direita"],["getBrightness","","int","Helligkeit 0–100","Brightness 0–100","Luminosidade 0–100"],["getLoudness","","int","Lautstärke 0–100","Loudness 0–100","Volume 0–100"],["getColor","","String",'Farbe unter dem mBot2, z. B. "rot"','Colour under the mBot2, e.g. "red"','Cor por baixo do mBot2, p. ex. "red"'],["isButtonA","","boolean","Taste A ist gedrückt","Button A is pressed","O botão A está premido"],["isButtonB","","boolean","Taste B ist gedrückt","Button B is pressed","O botão B está premido"],["isJoystickUp","","boolean","Joystick nach oben gedrückt","Joystick pushed up","Joystick para cima"],["isJoystickDown","","boolean","Joystick nach unten gedrückt","Joystick pushed down","Joystick para baixo"],["isJoystickLeft","","boolean","Joystick nach links gedrückt","Joystick pushed left","Joystick para a esquerda"],["isJoystickRight","","boolean","Joystick nach rechts gedrückt","Joystick pushed right","Joystick para a direita"],["getPitch","","int","Neigung nach vorn (+) oder hinten (−) in Grad","Tilt forward (+) or back (−) in degrees","Inclinação para a frente (+) ou trás (−) em graus"],["getRoll","","int","Neigung zur Seite in Grad","Tilt sideways in degrees","Inclinação lateral em graus"],["isShaken","","boolean","Der mBot2 wird geschüttelt","The mBot2 is being shaken","O mBot2 está a ser abanado"],["getTimer","","double","Stoppuhr in Sekunden","Stopwatch in seconds","Cronómetro em segundos"],["getBattery","","int","Akku in Prozent","Battery in percent","Bateria em percentagem"]],System:[["out",null,"PrintStream","Ausgabe in die Konsole","Output to the console","Saída para a consola"],["in",null,"InputStream","Eingabe von der Tastatur (für Scanner)","Keyboard input (for Scanner)","Entrada do teclado (para Scanner)"],["err",null,"PrintStream","Fehlerausgabe","Error output","Saída de erros"],["currentTimeMillis","","long","Uhrzeit in Millisekunden","Time in milliseconds","Hora em milissegundos"],["exit","0","void","Programm beenden","End the program","Terminar o programa"]],Math:[["random","","double","Zufallszahl von 0 bis unter 1","Random number from 0 to below 1","Número aleatório de 0 até menos de 1"],["abs","zahl","double","Betrag (ohne Minus)","Absolute value (no minus)","Valor absoluto (sem menos)"],["sqrt","zahl","double","Wurzel","Square root","Raiz quadrada"],["pow","basis, exponent","double","Hoch: pow(2, 3) = 8","Power: pow(2, 3) = 8","Potência: pow(2, 3) = 8"],["max","a, b","double","Größere von zwei Zahlen","Larger of two numbers","Maior de dois números"],["min","a, b","double","Kleinere von zwei Zahlen","Smaller of two numbers","Menor de dois números"],["round","zahl","long","Runden","Round","Arredondar"],["floor","zahl","double","Abrunden","Round down","Arredondar para baixo"],["ceil","zahl","double","Aufrunden","Round up","Arredondar para cima"],["PI",null,"double","Kreiszahl π = 3.14159…","Pi π = 3.14159…","Pi π = 3,14159…"]],Integer:[["parseInt","text","int","Text in ganze Zahl umwandeln","Turn text into a whole number","Converter texto em número inteiro"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"],["MAX_VALUE",null,"int","Größte int-Zahl","Largest int value","Maior valor int"],["MIN_VALUE",null,"int","Kleinste int-Zahl","Smallest int value","Menor valor int"]],Double:[["parseDouble","text","double","Text in Kommazahl umwandeln","Turn text into a decimal number","Converter texto em número decimal"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"]],String:[["valueOf","wert","String","Wert in Text umwandeln","Turn a value into text","Converter valor em texto"],["format","format, werte","String",'Formatierter Text, z. B. "%.2f"','Formatted text, e.g. "%.2f"','Texto formatado, p. ex. "%.2f"'],["join","trenner, teile","String","Teile mit Trenner verbinden","Join parts with a separator","Juntar partes com um separador"]],Character:[["isDigit","zeichen","boolean","Ist es eine Ziffer?","Is it a digit?","É um algarismo?"],["isLetter","zeichen","boolean","Ist es ein Buchstabe?","Is it a letter?","É uma letra?"],["isUpperCase","zeichen","boolean","Ist es ein Großbuchstabe?","Is it upper case?","É maiúscula?"],["toUpperCase","zeichen","char","In Großbuchstaben","To upper case","Para maiúscula"],["toLowerCase","zeichen","char","In Kleinbuchstaben","To lower case","Para minúscula"]],Files:[["readString",'Path.of("datei.txt")',"String","Ganze Datei als Text lesen","Read the whole file as text","Ler o ficheiro inteiro como texto"],["writeString","pfad, text","Path","Text in Datei schreiben","Write text to a file","Escrever texto num ficheiro"],["readAllLines","pfad","List","Alle Zeilen lesen","Read all lines","Ler todas as linhas"],["exists","pfad","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"]],Path:[["of",'"datei.txt"',"Path","Pfad zu einer Datei","Path to a file","Caminho para um ficheiro"]],JFrame:[["EXIT_ON_CLOSE",null,"int","Programm endet beim Schließen","Program ends when closed","O programa termina ao fechar"]],JLabel:[["CENTER",null,"int","Mittig","Centred","Ao centro"],["LEFT",null,"int","Links","Left","À esquerda"],["RIGHT",null,"int","Rechts","Right","À direita"]],Font:[["BOLD",null,"int","Fett","Bold","Negrito"],["PLAIN",null,"int","Normal","Plain","Normal"],["ITALIC",null,"int","Kursiv","Italic","Itálico"]],Color:[["RED","Rot","Red","Vermelho"],["GREEN","Grün","Green","Verde"],["BLUE","Blau","Blue","Azul"],["YELLOW","Gelb","Yellow","Amarelo"],["ORANGE","Orange","Orange","Laranja"],["WHITE","Weiß","White","Branco"],["BLACK","Schwarz","Black","Preto"],["GRAY","Grau","Grey","Cinzento"],["LIGHT_GRAY","Hellgrau","Light grey","Cinzento-claro"],["PINK","Rosa","Pink","Rosa"],["CYAN","Türkis","Cyan","Ciano"],["MAGENTA","Magenta","Magenta","Magenta"]].map(([i,e,t,n])=>[i,null,"Color",e,t,n])};function Af(i,e){const[t,n,a,s,r,o]=i;return{name:t,kind:n===null?"field":"method",params:!!n,returns:a,description:e==="de"?s:e==="pt"?o:r}}const zl=i=>i.replace(/<.*>$/,""),Pf=i=>{var e;return(e=/<\s*([^<>,]+?)\s*>$/.exec(i))==null?void 0:e[1]};function jf(i){if(/\[\]$/.test(i))return rF;if(i=zl(i),/Exception$|^Throwable$/.test(i))return qr.Exception;if(!qr[i])return;const t=new Set,n=[];for(const a of[i,...oF[i]??[]])for(const s of qr[a]??[])t.has(s[0])||(t.add(s[0]),n.push(s));return n}function LJ(i,e="de"){return(jf(i)??[]).map(t=>Af(t,e))}const lF="[A-Z]\\w*|int|long|double|float|boolean|char|byte|short|var";function uF(i,e){var a,s;const t=new RegExp(`(?:^|[^\\w.])(${lF})\\s*(?:<([^<>;]*)>)?((?:\\s*\\[\\s*\\])*)\\s+${e}\\s*(?:\\[\\s*\\])*\\s*(=\\s*([^;]*))?(?=[=;,):]|$)`,"gm");let n;for(const r of i.matchAll(t)){let o=r[1];if(o==="var"){const u=r[5]??"";if(o=((a=/^new\s+([A-Z]\w*)/.exec(u))==null?void 0:a[1])??(/^"/.test(u)?"String":""),!o)continue}if(/^(return|new|else|case|throw)$/.test(o))continue;const l=(s=r[2])==null?void 0:s.replace(/\s+/g,"");n=o+(l?`<${l}>`:"")+(r[3]??"").replace(/\s+/g,"")}return n}function mF(i){let e=0,t;const n=/^"(?:[^"\\]|\\.)*"/.exec(i);if(n)t='"',e=n[0].length;else{const r=/^[A-Za-z_]\w*/.exec(i);if(!r)return;t=r[0],e=r[0].length}const a=[{name:t,call:!1,indices:0}],s=(r,o)=>{let l=0;for(;e0;){const n=i[t-1];if(/[\w.]/.test(n))t--;else if(n===")"||n==="]"){const a=n===")"?"(":"[";let s=0,r=t-1;for(;r>=0;r--)if(i[r]===n)s++;else if(i[r]===a&&--s===0)break;if(r<0)return t;t=r}else if(n==='"'){const a=i.lastIndexOf('"',t-2);if(a<0)return t;t=a}else break}return t}const Nc=(i,e)=>i.slice(0,Math.max(0,i.length-2*e));function Cf(i,e,t,n){const a=e?t==null?void 0:t.statics(zl(i)):t==null?void 0:t.members(zl(i));if(a)return a;const s=e?Of[i]:jf(i);return s==null?void 0:s.map(r=>Af(r,n))}function dF(i,e,t,n){var s,r;const a=(r=(s=Cf(i,t,n,"en"))==null?void 0:s.find(o=>o.name===e))==null?void 0:r.returns;return a==="E"?Pf(i)??"Object":a}function hF(i,e,t){const n=mF(e);if(!n)return;const[a,...s]=n.links;let r,o=!1;if(n.head==='"')r="String";else if(a.name==="this"&&(t!=null&&t.thisType)&&!a.call&&!a.indices)r=t.thisType;else{if(r=uF(i,a.name),!r&&(Of[a.name]||t!=null&&t.statics(a.name))&&!a.call&&(r=a.name,o=!0),!r)return;a.indices&&(r=Nc(r,a.indices))}for(const l of s){const u=dF(r,l.name,o,t);if(!u)return;r=Nc(u,l.indices),o=!1}return{type:r,isStatic:o}}function gF(i,e,t="de",n){const a=i.lastIndexOf(` -`,e-1)+1,s=i.slice(a,e),r=/\.\s*(\w*)$/.exec(s);if(!r)return;const o=r.index,l=s.slice(cF(s,o),o);if(!l||/^\d/.test(l))return;const u=hF(i,l,n);if(!u)return;const m=Cf(u.type,u.isStatic,n,t);if(!m)return;const c=Pf(u.type)??"Object";return{from:e-r[1].length,members:m.map(d=>d.returns==="E"?{...d,returns:c}:d)}}const Fc=Ln.define(),N0=re.define(),pF=ue.mark({class:"cm-ph"}),fF=ue.mark({class:"cm-err"}),Jc=ue.line({class:"cm-debug-line"});function Rc(i,e){const t=i.doc.length,n=[];e.current!==void 0&&e.currentr===Jc;n.sort((r,o)=>r.from-o.from||Number(a(o.deco))-Number(a(r.deco))||r.to-o.to);const s=new e1;for(const r of n)s.add(r.from,r.to,r.deco);return s.finish()}const ar=Zt.define({create:()=>({marks:{placeholders:[],problems:[]},decorations:ue.none}),update(i,e){for(const a of e.effects)if(a.is(N0))return{marks:a.value,decorations:Rc(e.state,a.value)};if(!e.docChanged)return i;const t=a=>({from:e.changes.mapPos(a.from,1),to:e.changes.mapPos(a.to,-1)}),n={...i.marks,placeholders:i.marks.placeholders.map(t).filter(a=>a.fromH.decorations.from(i,e=>e.decorations)}),xF={ClassDeclaration:"class",InterfaceDeclaration:"class",EnumDeclaration:"class",MethodDeclaration:"method",ConstructorDeclaration:"method",ForStatement:"loop",EnhancedForStatement:"loop",WhileStatement:"loop",DoStatement:"loop",IfStatement:"if",SwitchStatement:"if",TryStatement:"try"};function bF(i){const{state:e}=i,t=e.doc,n=i.contentDOM.querySelector(".cm-line");if(!n)return[];const a=getComputedStyle(n),s=i.scrollDOM.getBoundingClientRect(),r=i.contentDOM.getBoundingClientRect(),o=s.left-i.scrollDOM.scrollLeft,l=s.top-i.scrollDOM.scrollTop,u=r.left-o+parseFloat(a.paddingLeft)+parseFloat(a.borderLeftWidth),m=r.right-o-6,c=i.documentTop-l,d=e.tabSize,h=i.defaultCharacterWidth,g=(b,y,w,_)=>{const z=t.line(y),S=Wi(/^\s*/.exec(z.text)[0],d),k=u+S*h-7,T=i.lineBlockAt(z.from).top+c+_,j=i.lineBlockAt(t.line(w).from).bottom+c-_;return new Ys(b,k,T,Math.max(m-k,20),Math.max(j-T,4))},f=[];et(e).iterate({from:i.viewport.from,to:i.viewport.to,enter:b=>{var w;const y=xF[b.name];y&&(b.name==="IfStatement"&&((w=b.node.parent)==null?void 0:w.name)==="IfStatement"||f.push(g(`cm-scope cm-scope-${y}`,t.lineAt(b.from).number,t.lineAt(b.to).number,1)))}});const x=e.field(ar).marks.lines;return x&&x.fromi.docChanged||i.viewportChanged||i.geometryChanged||et(i.state)!==et(i.startState)||i.transactions.some(e=>e.effects.some(t=>t.is(N0)))});class wF extends fn{toDOM(){const e=document.createElement("span");return e.className="cm-breakpoint",e}}const Il=new wF,Zf=re.define(),Mf=re.define(),kl=Zt.define({create:()=>Y.empty,update(i,e){i=i.map(e.changes);for(const t of e.effects){if(t.is(Mf)&&(i=Y.of(t.value.map(a=>Il.range(a)),!0)),!t.is(Zf))continue;let n=!1;i.between(t.value,t.value,()=>{n=!0}),i=n?i.update({filter:a=>a!==t.value}):i.update({add:[Il.range(t.value)]})}return i}});function zF(i){const t={mousedown:(n,a)=>{const s=i.breakpointLine(n.state.doc.lineAt(a.from).number-1);return s===void 0||s>=n.state.doc.lines?!1:(n.dispatch({effects:Zf.of(n.state.doc.line(s+1).from)}),queueMicrotask(()=>i.onBreakpoints()),!0)}};return[kl,IL({class:"cm-breakpoint-gutter",markers:n=>n.state.field(kl),initialSpacer:()=>Il,domEventHandlers:t}),PL({domEventHandlers:t})]}function F0(i,e){return i.field(ar).marks.placeholders.find(t=>e>=t.from&&e<=t.to)}const IF=H.inputHandler.of((i,e,t,n)=>{if(e!==t)return!1;const a=F0(i.state,e);return a?(i.dispatch({changes:{from:a.from,to:a.to,insert:n},selection:{anchor:a.from+n.length},userEvent:"input.type"}),!0):!1}),kF=ne.transactionFilter.of(i=>{if(!i.docChanged||!(i.isUserEvent("input.paste")||i.isUserEvent("input.drop")))return i;const e=[];if(i.changes.iterChanges((a,s,r,o,l)=>e.push({from:a,to:s,text:l.toString()})),e.length!==1||e[0].from!==e[0].to)return i;const t=F0(i.startState,e[0].from);if(!t)return i;const{text:n}=e[0];return{changes:{from:t.from,to:t.to,insert:n},selection:{anchor:t.from+n.length},userEvent:"input.paste",scrollIntoView:!0}}),Gc=i=>e=>{const t=e.state.selection.main;if(!t.empty)return!1;const n=F0(e.state,t.head);return!n||(i?t.head>=n.to:t.head<=n.from)?!1:(e.dispatch({changes:{from:n.from,to:n.to},selection:{anchor:n.from},userEvent:"delete"}),!0)},SF=H.updateListener.of(i=>{if(!i.selectionSet||i.docChanged||!i.transactions.some(n=>n.isUserEvent("select.pointer")))return;const e=i.state.selection.main;if(!e.empty)return;const t=i.state.field(ar).marks.placeholders.find(n=>e.head>n.from&&e.headi.view.dispatch({selection:C.range(t.from,t.to)}))}),_F=Ks.define([{tag:[M.keyword,M.controlKeyword,M.definitionKeyword,M.modifier,M.operatorKeyword,M.standard(M.typeName),M.bool,M.null],color:"var(--syn-keyword)",fontWeight:"600"},{tag:[M.string,M.character],color:"var(--syn-string)"},{tag:M.number,color:"var(--syn-number)"},{tag:[M.lineComment,M.blockComment],color:"var(--syn-comment)",fontStyle:"italic"}]);function TF(i){const e=i,t=`\${// ${e.code}}`,n=(a,s,r,o=0)=>Z0(s,{label:a,detail:r,type:"keyword",boost:o});return[n("if",`if (\${${e.condition}}) { +`),c=new Array(l.length).fill(-1);for(const y of mm(l,m,(w,S)=>wr(w)!==""&&wr(w)===wr(S)))y.kind==="keep"&&(c[y.a]=y.b);const d=[];let h=0,g="";const f=y=>{for(;hw===S))if(y.kind==="keep")c[y.a]>=0&&(f(c[y.a]+1),g="");else if(y.kind==="del"){const w=c[y.a];if(w<0)continue;f(w),g||(g=rg(m[w]).comment),h=w+1}else{const w=u[y.b];d.push(g&&w.trim()!==""?`${w} ${g}`:w),w.trim()!==""&&(g="")}f(m.length);const x=d.join(` +`),b=jo(x,n,a);return oi(Co(t,b),n,s)===r?x:r}function Co(i,e){let t=e.caption??(yt(i.caption)?"":i.caption);return!e.caption&&e.className&&Gs(t)!==e.className&&(t=e.className),{...i,caption:t,elements:Bo(i.elements,e.elements)}}function Bo(i,e){return e.map((t,n)=>{const a=i[n];if(!a||a.type!==t.type)return t;const s={...t,zoomX:a.zoomX,zoomY:a.zoomY};return a.textColor&&(s.textColor=a.textColor),a.backgroundColor&&(s.backgroundColor=a.backgroundColor),t.loopBody&&(s.loopBody=Bo(a.loopBody??[],t.loopBody)),t.cases&&(s.cases=t.cases.map((r,o)=>{var l,u;return{...r,elements:Bo(((u=(l=a.cases)==null?void 0:l[o])==null?void 0:u.elements)??[],r.elements)}})),s})}let Do=[],og=[];(()=>{let i="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5".split(",").map(e=>e?parseInt(e,36):1);for(let e=0,t=0;e>1;if(i=og[n])e=n+1;else return!0;if(e==t)return!1}}function dm(i){return i>=127462&&i<=127487}const hm=8205;function iZ(i,e,t=!0,n=!0){return(t?lg:aZ)(i,e,n)}function lg(i,e,t){if(e==i.length)return e;e&&ug(i.charCodeAt(e))&&mg(i.charCodeAt(e-1))&&e--;let n=zr(i,e);for(e+=gm(n);e=0&&dm(zr(i,r));)s++,r-=2;if(s%2==0)break;e+=2}else break}return e}function aZ(i,e,t){for(;e>1;){let n=lg(i,e-2,t);if(n=56320&&i<57344}function mg(i){return i>=55296&&i<56320}function gm(i){return i<65536?1:2}class ae{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=O1(this,e,t);let a=[];return this.decompose(0,e,a,2),n.length&&n.decompose(0,n.length,a,3),this.decompose(t,this.length,a,1),tn.from(a,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=O1(this,e,t);let n=[];return this.decompose(e,t,n,0),tn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),a=new li(this),s=new li(e);for(let r=t,o=t;;){if(a.next(r),s.next(r),r=0,a.lineBreak!=s.lineBreak||a.done!=s.done||a.value!=s.value)return!1;if(o+=a.value.length,a.done||o>=n)return!0}}iter(e=1){return new li(this,e)}iterRange(e,t=this.length){return new cg(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t==null&&(t=this.lines+1);let a=this.line(e).from;n=this.iterRange(a,Math.max(a,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new dg(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(e){if(e.length==0)throw new RangeError("A document must have at least one line");return e.length==1&&!e[0]?ae.empty:e.length<=32?new _e(e):tn.from(_e.split(e,[]))}}class _e extends ae{constructor(e,t=sZ(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.text[s],o=a+r.length;if((t?n:o)>=e)return new rZ(a,o,n,r);a=o+1,n++}}decompose(e,t,n,a){let s=e<=0&&t>=this.length?this:new _e(pm(this.text,e,t),Math.min(t,this.length)-Math.max(0,e));if(a&1){let r=n.pop(),o=Ea(s.text,r.text.slice(),0,s.length);if(o.length<=32)n.push(new _e(o,r.length+s.length));else{let l=o.length>>1;n.push(new _e(o.slice(0,l)),new _e(o.slice(l)))}}else n.push(s)}replace(e,t,n){if(!(n instanceof _e))return super.replace(e,t,n);[e,t]=O1(this,e,t);let a=Ea(this.text,Ea(n.text,pm(this.text,0,e)),t),s=this.length+n.length-(t-e);return a.length<=32?new _e(a,s):tn.from(_e.split(a,[]),s)}sliceString(e,t=this.length,n=` +`){[e,t]=O1(this,e,t);let a="";for(let s=0,r=0;s<=t&&re&&r&&(a+=n),es&&(a+=o.slice(Math.max(0,e-s),t-s)),s=l+1}return a}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,t){let n=[],a=-1;for(let s of e)n.push(s),a+=s.length+1,n.length==32&&(t.push(new _e(n,a)),n=[],a=-1);return a>-1&&t.push(new _e(n,a)),t}}class tn extends ae{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let n of e)this.lines+=n.lines}lineInner(e,t,n,a){for(let s=0;;s++){let r=this.children[s],o=a+r.length,l=n+r.lines-1;if((t?l:o)>=e)return r.lineInner(e,t,n,a);a=o+1,n=l+1}}decompose(e,t,n,a){for(let s=0,r=0;r<=t&&s=r){let u=a&((r<=e?1:0)|(l>=t?2:0));r>=e&&l<=t&&!u?n.push(o):o.decompose(e-r,t-r,n,u)}r=l+1}}replace(e,t,n){if([e,t]=O1(this,e,t),n.lines=s&&t<=o){let l=r.replace(e-s,t-s,n),u=this.lines-r.lines+l.lines;if(l.lines>4&&l.lines>u>>6){let m=this.children.slice();return m[a]=l,new tn(m,this.length-(t-e)+n.length)}return super.replace(s,o,l)}s=o+1}return super.replace(e,t,n)}sliceString(e,t=this.length,n=` +`){[e,t]=O1(this,e,t);let a="";for(let s=0,r=0;se&&s&&(a+=n),er&&(a+=o.sliceString(e-r,t-r,n)),r=l+1}return a}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof tn))return 0;let n=0,[a,s,r,o]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;a+=t,s+=t){if(a==r||s==o)return n;let l=this.children[a],u=e.children[s];if(l!=u)return n+l.scanIdentical(u,t);n+=l.length+1}}static from(e,t=e.reduce((n,a)=>n+a.length+1,-1)){let n=0;for(let h of e)n+=h.lines;if(n<32){let h=[];for(let g of e)g.flatten(h);return new _e(h,t)}let a=Math.max(32,n>>5),s=a<<1,r=a>>1,o=[],l=0,u=-1,m=[];function c(h){let g;if(h.lines>s&&h instanceof tn)for(let f of h.children)c(f);else h.lines>r&&(l>r||!l)?(d(),o.push(h)):h instanceof _e&&l&&(g=m[m.length-1])instanceof _e&&h.lines+g.lines<=32?(l+=h.lines,u+=h.length+1,m[m.length-1]=new _e(g.text.concat(h.text),g.length+1+h.length)):(l+h.lines>a&&d(),l+=h.lines,u+=h.length+1,m.push(h))}function d(){l!=0&&(o.push(m.length==1?m[0]:tn.from(m,u)),u=-1,l=m.length=0)}for(let h of e)c(h);return d(),o.length==1?o[0]:new tn(o,t)}}ae.empty=new _e([""],0);function sZ(i){let e=-1;for(let t of i)e+=t.length+1;return e}function Ea(i,e,t=0,n=1e9){for(let a=0,s=0,r=!0;s=t&&(l>n&&(o=o.slice(0,n-a)),a0?1:(e instanceof _e?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,a=this.nodes[n],s=this.offsets[n],r=s>>1,o=a instanceof _e?a.text.length:a.children.length;if(r==(t>0?o:0)){if(n==0)return this.done=!0,this.value="",this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((s&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=` +`,this;e--}else if(a instanceof _e){let l=a.text[r+(t<0?-1:0)];if(this.offsets[n]+=t,l.length>Math.max(0,e))return this.value=e==0?l:t>0?l.slice(e):l.slice(0,l.length-e),this;e-=l.length}else{let l=a.children[r+(t<0?-1:0)];e>l.length?(e-=l.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(l),this.offsets.push(t>0?1:(l instanceof _e?l.text.length:l.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class cg{constructor(e,t,n){this.value="",this.done=!1,this.cursor=new li(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:a}=this.cursor.next(e);return this.pos+=(a.length+e)*t,this.value=a.length<=n?a:t<0?a.slice(a.length-n):a.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=""}}class dg{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:n,value:a}=this.inner.next(e);return t&&this.afterBreak?(this.value="",this.afterBreak=!1):t?(this.done=!0,this.value=""):n?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=a,this.afterBreak=!1),this}get lineBreak(){return!1}}typeof Symbol<"u"&&(ae.prototype[Symbol.iterator]=function(){return this.iter()},li.prototype[Symbol.iterator]=cg.prototype[Symbol.iterator]=dg.prototype[Symbol.iterator]=function(){return this});class rZ{constructor(e,t,n,a){this.from=e,this.to=t,this.number=n,this.text=a}get length(){return this.to-this.from}}function O1(i,e,t){return e=Math.max(0,Math.min(i.length,e)),[e,Math.max(e,Math.min(i.length,t))]}function Ke(i,e,t=!0,n=!0){return iZ(i,e,t,n)}function oZ(i){return i>=56320&&i<57344}function lZ(i){return i>=55296&&i<56320}function _t(i,e){let t=i.charCodeAt(e);if(!lZ(t)||e+1==i.length)return t;let n=i.charCodeAt(e+1);return oZ(n)?(t-55296<<10)+(n-56320)+65536:t}function hg(i){return i<=65535?String.fromCharCode(i):(i-=65536,String.fromCharCode((i>>10)+55296,(i&1023)+56320))}function un(i){return i<65536?1:2}const Zo=/\r\n?|\n/;var Xe=(function(i){return i[i.Simple=0]="Simple",i[i.TrackDel=1]="TrackDel",i[i.TrackBefore=2]="TrackBefore",i[i.TrackAfter=3]="TrackAfter",i})(Xe||(Xe={}));class cn{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-a);s+=o}else{if(n!=Xe.Simple&&u>=e&&(n==Xe.TrackDel&&ae||n==Xe.TrackBefore&&ae))return null;if(u>e||u==e&&t<0&&!o)return e==a||t<0?s:s+l;s+=l}a=u}if(e>a)throw new RangeError(`Position ${e} is out of range for changeset of length ${a}`);return s}touchesRange(e,t=e){for(let n=0,a=0;n=0&&a<=t&&o>=e)return at?"cover":!0;a=o}return!1}toString(){let e="";for(let t=0;t=0?":"+a:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!="number"))throw new RangeError("Invalid JSON representation of ChangeDesc");return new cn(e)}static create(e){return new cn(e)}}class Le extends cn{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return Mo(this,(t,n,a,s,r)=>e=e.replace(a,a+(n-t),r),!1),e}mapDesc(e,t=!1){return Lo(this,e,t,!0)}invert(e){let t=this.sections.slice(),n=[];for(let a=0,s=0;a=0){t[a]=o,t[a+1]=r;let l=a>>1;for(;n.length0&&On(n,t,s.text),s.forward(m),o+=m}let u=e[r++];for(;o>1].toJSON()))}return e}static of(e,t,n){let a=[],s=[],r=0,o=null;function l(m=!1){if(!m&&!a.length)return;rd||c<0||d>t)throw new RangeError(`Invalid change range ${c} to ${d} (in doc of length ${t})`);let g=h?typeof h=="string"?ae.of(h.split(n||Zo)):h:ae.empty,f=g.length;if(c==d&&f==0)return;cr&&Ye(a,c-r,-1),Ye(a,d-c,f),On(s,a,g),r=d}}return u(e),l(!o),o}static empty(e){return new Le(e?[e,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let t=[],n=[];for(let a=0;ao&&typeof r!="string"))throw new RangeError("Invalid JSON representation of ChangeSet");if(s.length==1)t.push(s[0],0);else{for(;n.length=0&&t<=0&&t==i[a+1]?i[a]+=e:a>=0&&e==0&&i[a]==0?i[a+1]+=t:n?(i[a]+=e,i[a+1]+=t):i.push(e,t)}function On(i,e,t){if(t.length==0)return;let n=e.length-2>>1;if(n>1])),!(t||r==i.sections.length||i.sections[r+1]<0);)o=i.sections[r++],l=i.sections[r++];e(a,u,s,m,c),a=u,s=m}}}function Lo(i,e,t,n=!1){let a=[],s=n?[]:null,r=new zi(i),o=new zi(e);for(let l=-1;;){if(r.done&&o.len||o.done&&r.len)throw new Error("Mismatched change set lengths");if(r.ins==-1&&o.ins==-1){let u=Math.min(r.len,o.len);Ye(a,u,-1),r.forward(u),o.forward(u)}else if(o.ins>=0&&(r.ins<0||l==r.i||r.off==0&&(o.len=0&&l=0){let u=0,m=r.len;for(;m;)if(o.ins==-1){let c=Math.min(m,o.len);u+=c,m-=c,o.forward(c)}else if(o.ins==0&&o.lenl||r.ins>=0&&r.len>l)&&(o||n.length>u),s.forward2(l),r.forward(l)}}}}class zi{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return t>=e.length?ae.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?ae.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class Sn{constructor(e,t,n,a){this.from=e,this.to=t,this.flags=n,this.goalColumn=a}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(e,t=-1){let n,a;return this.empty?n=a=e.mapPos(this.from,t):(n=e.mapPos(this.from,1),a=e.mapPos(this.to,-1)),n==this.from&&a==this.to?this:new Sn(n,a,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return B.range(e,t,void 0,void 0,n);let a=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return B.range(this.anchor,a,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="number")throw new RangeError("Invalid JSON representation for SelectionRange");return B.range(e.anchor,e.head)}static create(e,t,n,a){return new Sn(e,t,n,a)}}class B{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:B.create(this.ranges.map(n=>n.map(e,t)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;ne.toJSON()),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="number"||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new B(e.ranges.map(t=>Sn.fromJSON(t)),e.main)}static single(e,t=e){return new B([B.range(e,t)],0)}static create(e,t=0){if(e.length==0)throw new RangeError("A selection needs at least one range");for(let n=0,a=0;aa.from-s.from),t=e.indexOf(n);for(let a=1;as.head?B.range(l,o):B.range(o,l))}}return new B(e,t)}}function pg(i,e){for(let t of i.ranges)if(t.to>e)throw new RangeError("Selection points outside of document")}let o0=0;class G{constructor(e,t,n,a,s){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=a,this.id=o0++,this.default=e([]),this.extensions=typeof s=="function"?s(this):s}get reader(){return this}static define(e={}){return new G(e.combine||(t=>t),e.compareInput||((t,n)=>t===n),e.compare||(e.combine?(t,n)=>t===n:l0),!!e.static,e.enables)}of(e){return new Na([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Na(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new Na(e,this,2,t)}from(e,t){return t||(t=n=>n),this.compute([e],n=>t(n.field(e)))}}function l0(i,e){return i==e||i.length==e.length&&i.every((t,n)=>t===e[n])}class Na{constructor(e,t,n,a){this.dependencies=e,this.facet=t,this.type=n,this.value=a,this.id=o0++}dynamicSlot(e){var t;let n=this.value,a=this.facet.compareInput,s=this.id,r=e[s]>>1,o=this.type==2,l=!1,u=!1,m=[];for(let c of this.dependencies)c=="doc"?l=!0:c=="selection"?u=!0:(((t=e[c.id])!==null&&t!==void 0?t:1)&1)==0&&m.push(e[c.id]);return{create(c){return c.values[r]=n(c),1},update(c,d){if(l&&d.docChanged||u&&(d.docChanged||d.selection)||Wo(c,m)){let h=n(c);if(o?!fm(h,c.values[r],a):!a(h,c.values[r]))return c.values[r]=h,1}return 0},reconfigure:(c,d)=>{let h,g=d.config.address[s];if(g!=null){let f=ps(d,g);if(this.dependencies.every(x=>x instanceof G?d.facet(x)===c.facet(x):x instanceof Zt?d.field(x,!1)==c.field(x,!1):!0)||(o?fm(h=n(c),f,a):a(h=n(c),f)))return c.values[r]=f,0}else h=n(c);return c.values[r]=h,1}}}get extension(){return this}}function fm(i,e,t){if(i.length!=e.length)return!1;for(let n=0;ni[l.id]),a=t.map(l=>l.type),s=n.filter(l=>!(l&1)),r=i[e.id]>>1;function o(l){let u=[];for(let m=0;mn===a),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(ma).find(n=>n.field==this);return((t==null?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:n=>(n.values[t]=this.create(n),1),update:(n,a)=>{let s=n.values[t],r=this.updateF(s,a);return this.compareF(s,r)?0:(n.values[t]=r,1)},reconfigure:(n,a)=>{let s=n.facet(ma),r=a.facet(ma),o;return(o=s.find(l=>l.field==this))&&o!=r.find(l=>l.field==this)?(n.values[t]=o.create(n),1):a.config.address[this.id]!=null?(n.values[t]=a.field(this),0):(n.values[t]=this.create(n),1)}}}init(e){return[this,ma.of({field:this,create:e})]}get extension(){return this}}const Hn={lowest:4,low:3,default:2,high:1,highest:0};function R1(i){return e=>new fg(e,i)}const r1={highest:R1(Hn.highest),high:R1(Hn.high),default:R1(Hn.default),low:R1(Hn.low),lowest:R1(Hn.lowest)};class fg{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}}class Li{of(e){return new Eo(this,e)}reconfigure(e){return Li.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class Eo{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}}class gs{constructor(e,t,n,a,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=a,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,n){let a=[],s=Object.create(null),r=new Map;for(let d of mZ(e,t,r))d instanceof Zt?a.push(d):(s[d.facet.id]||(s[d.facet.id]=[])).push(d);let o=Object.create(null),l=[],u=[];for(let d of a)o[d.id]=u.length<<1,u.push(h=>d.slot(h));let m=n==null?void 0:n.config.facets;for(let d in s){let h=s[d],g=h[0].facet,f=m&&m[d]||[];if(h.every(x=>x.type==0))if(o[g.id]=l.length<<1|1,l0(f,h))l.push(n.facet(g));else{let x=g.combine(h.map(b=>b.value));l.push(n&&g.compare(x,n.facet(g))?n.facet(g):x)}else{for(let x of h)x.type==0?(o[x.id]=l.length<<1|1,l.push(x.value)):(o[x.id]=u.length<<1,u.push(b=>x.dynamicSlot(b)));o[g.id]=u.length<<1,u.push(x=>uZ(x,g,h))}}let c=u.map(d=>d(o));return new gs(e,r,c,o,l,s)}}function mZ(i,e,t){let n=[[],[],[],[],[]],a=new Map;function s(r,o){let l=a.get(r);if(l!=null){if(l<=o)return;let u=n[l].indexOf(r);u>-1&&n[l].splice(u,1),r instanceof Eo&&t.delete(r.compartment)}if(a.set(r,o),Array.isArray(r))for(let u of r)s(u,o);else if(r instanceof Eo){if(t.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let u=e.get(r.compartment)||r.inner;t.set(r.compartment,u),s(u,o)}else if(r instanceof fg)s(r.inner,r.prec);else if(r instanceof Zt)n[o].push(r),r.provides&&s(r.provides,o);else if(r instanceof Na)n[o].push(r),r.facet.extensions&&s(r.facet.extensions,Hn.default);else{let u=r.extension;if(!u)throw new Error(`Unrecognized extension value in extension set (${r}).`);if(u==r)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);s(u,o)}}return s(i,Hn.default),n.reduce((r,o)=>r.concat(o))}function ui(i,e){if(e&1)return 2;let t=e>>1,n=i.status[t];if(n==4)throw new Error("Cyclic dependency between fields and/or facets");if(n&2)return n;i.status[t]=4;let a=i.computeSlot(i,i.config.dynamicSlots[t]);return i.status[t]=2|a}function ps(i,e){return e&1?i.config.staticValues[e>>1]:i.values[e>>1]}const xg=G.define(),No=G.define({combine:i=>i.some(e=>e),static:!0}),bg=G.define({combine:i=>i.length?i[0]:void 0,static:!0}),yg=G.define(),vg=G.define(),wg=G.define(),zg=G.define({combine:i=>i.length?i[0]:!1});class Ln{constructor(e,t){this.type=e,this.value=t}static define(){return new cZ}}class cZ{of(e){return new Ln(this,e)}}class dZ{constructor(e){this.map=e}of(e){return new re(this,e)}}class re{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==this.value?this:new re(this.type,t)}is(e){return this.type==e}static define(e={}){return new dZ(e.map||(t=>t))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let a of e){let s=a.map(t);s&&n.push(s)}return n}}re.reconfigure=re.define();re.appendConfig=re.define();class He{constructor(e,t,n,a,s,r){this.startState=e,this.changes=t,this.selection=n,this.effects=a,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,n&&pg(n,t.newLength),s.some(o=>o.type==He.time)||(this.annotations=s.concat(He.time.of(Date.now())))}static create(e,t,n,a,s,r){return new He(e,t,n,a,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(He.userEvent);return!!(t&&(t==e||t.length>e.length&&t.slice(0,e.length)==e&&t[e.length]=="."))}}He.time=Ln.define();He.userEvent=Ln.define();He.addToHistory=Ln.define();He.remote=Ln.define();function hZ(i,e){let t=[];for(let n=0,a=0;;){let s,r;if(n=i[n]))s=i[n++],r=i[n++];else if(a=0;a--){let s=n[a](i);s instanceof He?i=s:Array.isArray(s)&&s.length==1&&s[0]instanceof He?i=s[0]:i=kg(e,z1(s),!1)}return i}function pZ(i){let e=i.startState,t=e.facet(wg),n=i;for(let a=t.length-1;a>=0;a--){let s=t[a](i);s&&Object.keys(s).length&&(n=Ig(n,Fo(e,s,i.changes.newLength),!0))}return n==i?i:He.create(e,i.changes,i.selection,n.effects,n.annotations,n.scrollIntoView)}const fZ=[];function z1(i){return i==null?fZ:Array.isArray(i)?i:[i]}var Pt=(function(i){return i[i.Word=0]="Word",i[i.Space=1]="Space",i[i.Other=2]="Other",i})(Pt||(Pt={}));const xZ=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let Jo;try{Jo=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch{}function bZ(i){if(Jo)return Jo.test(i);for(let e=0;e"€"&&(t.toUpperCase()!=t.toLowerCase()||xZ.test(t)))return!0}return!1}function yZ(i){return e=>{if(!/\S/.test(e))return Pt.Space;if(bZ(e))return Pt.Word;for(let t=0;t-1)return Pt.Word;return Pt.Other}}class ie{constructor(e,t,n,a,s,r){this.config=e,this.doc=t,this.selection=n,this.values=a,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let o=0;oa.set(u,l)),t=null),a.set(o.value.compartment,o.value.extension)):o.is(re.reconfigure)?(t=null,n=o.value):o.is(re.appendConfig)&&(t=null,n=z1(n).concat(o.value));let s;t?s=e.startState.values.slice():(t=gs.resolve(n,a,this),s=new ie(t,this.doc,this.selection,t.dynamicSlots.map(()=>null),(l,u)=>u.reconfigure(l,this),null).values);let r=e.startState.facet(No)?e.newSelection:e.newSelection.asSingle();new ie(t,e.newDoc,r,s,(o,l)=>l.update(o,e),e)}replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:B.cursor(t.from+e.length,-1)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),a=this.changes(n.changes),s=[n.range],r=z1(n.effects);for(let o=1;or.spec.fromJSON(o,l)))}}return ie.create({doc:e.doc,selection:B.fromJSON(e.selection),extensions:t.extensions?a.concat([t.extensions]):a})}static create(e={}){let t=gs.resolve(e.extensions||[],new Map),n=e.doc instanceof ae?e.doc:ae.of((e.doc||"").split(t.staticFacet(ie.lineSeparator)||Zo)),a=e.selection?e.selection instanceof B?e.selection:B.single(e.selection.anchor,e.selection.head):B.single(0);return pg(a,n.length),t.staticFacet(No)||(a=a.asSingle()),new ie(t,n,a,t.dynamicSlots.map(()=>null),(s,r)=>r.create(s),null)}get tabSize(){return this.facet(ie.tabSize)}get lineBreak(){return this.facet(ie.lineSeparator)||` +`}get readOnly(){return this.facet(zg)}phrase(e,...t){for(let n of this.facet(ie.phrases))if(Object.prototype.hasOwnProperty.call(n,e)){e=n[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,(n,a)=>{if(a=="$")return"$";let s=+(a||1);return!s||s>t.length?n:t[s-1]})),e}languageDataAt(e,t,n=-1){let a=[];for(let s of this.facet(xg))for(let r of s(this,t,n))Object.prototype.hasOwnProperty.call(r,e)&&a.push(r[e]);return a}charCategorizer(e){let t=this.languageDataAt("wordChars",e);return yZ(t.length?t[0]:"")}wordAt(e){let{text:t,from:n,length:a}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-n,o=e-n;for(;r>0;){let l=Ke(t,r,!1);if(s(t.slice(l,r))!=Pt.Word)break;r=l}for(;oi.length?i[0]:4});ie.lineSeparator=bg;ie.readOnly=zg;ie.phrases=G.define({compare(i,e){let t=Object.keys(i),n=Object.keys(e);return t.length==n.length&&t.every(a=>i[a]==e[a])}});ie.languageData=xg;ie.changeFilter=yg;ie.transactionFilter=vg;ie.transactionExtender=wg;Li.reconfigure=re.define();function u0(i,e,t={}){let n={};for(let a of i)for(let s of Object.keys(a)){let r=a[s],o=n[s];if(o===void 0)n[s]=r;else if(!(o===r||r===void 0))if(Object.hasOwnProperty.call(t,s))n[s]=t[s](o,r);else throw new Error("Config merge conflict for field "+s)}for(let a in e)n[a]===void 0&&(n[a]=e[a]);return n}class Cn{eq(e){return this==e}range(e,t=e){return Ro.create(e,t,this)}}Cn.prototype.startSide=Cn.prototype.endSide=0;Cn.prototype.point=!1;Cn.prototype.mapMode=Xe.TrackDel;function m0(i,e){return i==e||i.constructor==e.constructor&&i.eq(e)}let Ro=class Sg{constructor(e,t,n){this.from=e,this.to=t,this.value=n}static create(e,t,n){return new Sg(e,t,n)}};function Go(i,e){return i.from-e.from||i.value.startSide-e.value.startSide}class c0{constructor(e,t,n,a){this.from=e,this.to=t,this.value=n,this.maxPoint=a}get length(){return h1(this.to)}findIndex(e,t,n,a=0){let s=n?this.to:this.from;for(let r=a,o=s.length;;){if(r==o)return r;let l=r+o>>1,u=s[l]-e||(n?this.value[l].endSide:this.value[l].startSide)-t;if(l==r)return u>=0?r:o;u>=0?o=l:r=l+1}}between(e,t,n,a){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(n,1e9,!1,s);sx||f==x&&d.startSide>0&&d.endSide<=0)continue;if(!((x-f||d.endSide-d.startSide)<0))if(u<0&&(u=f),d.point&&(m=Math.max(m,x-f)),(f-n||d.startSide-a)>=0)r.push(d),o.push(f-u),l.push(x-u),n=x,a=d.endSide;else{if(f==x)for(let b=r.length;b>0;b--){if((f-(l[b-1]+u)||d.startSide-r[b-1].endSide)>=0){r.splice(b,0,d),o.splice(b,0,f-u),l.splice(b,0,x-u);continue e}if((f-(o[b-1]+u)||d.endSide-r[b-1].startSide)>0)break}s(f,x,d)}}return{mapped:r.length?new c0(o,l,r,m):null,pos:u}}}class X{constructor(e,t,n,a){this.chunkPos=e,this.chunk=t,this.nextLayer=n,this.maxPoint=a}static create(e,t,n,a){return new X(e,t,n,a)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:n=!1,filterFrom:a=0,filterTo:s=this.length}=e,r=e.filter;if(t.length==0&&!r)return this;if(n&&(t=t.slice().sort(Go)),this.isEmpty)return t.length?X.of(t):this;let o=new _g(this,null,-1).goto(0),l=0,u=[],m=new e1;for(;o.value||l=0){let c=t[l++];m.addInner(c.from,c.to,c.value,!1)||u.push(c)}else o.rangeIndex==1&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s{s||(s=new e1),s.addRange(l,u,m,!1)};for(let l=0;l=s&&e<=s+r.length&&r.between(s,e-s,t-s,n)===!1)return}this.nextLayer.between(e,t,n)}}iter(e=0){return Ii.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Ii.from(e).goto(t)}static compare(e,t,n,a,s=-1){let r=e.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),o=t.filter(c=>c.maxPoint>0||!c.isEmpty&&c.maxPoint>=s),l=xm(r,o,n),u=new G1(r,l,s),m=new G1(o,l,s);n.iterGaps((c,d,h)=>bm(u,c,m,d,h,a)),n.empty&&n.length==0&&bm(u,0,m,0,0,a)}static eq(e,t,n=0,a){a==null&&(a=999999999);let s=e.filter(m=>!m.isEmpty&&t.indexOf(m)<0),r=t.filter(m=>!m.isEmpty&&e.indexOf(m)<0);if(s.length!=r.length)return!1;if(!s.length)return!0;let o=xm(s,r),l=new G1(s,o,0).goto(n),u=new G1(r,o,0).goto(n);for(;;){if(l.to!=u.to||!Ho(l.active,u.active)||l.point&&(!u.point||!m0(l.point,u.point)))return!1;if(l.to>a)return!0;l.next(),u.next()}}static spans(e,t,n,a,s=-1){let r=new G1(e,null,s).goto(t),o=t,l=r.openStart;for(;;){let u=Math.min(r.to,n);if(r.point){let m=r.activeForPoint(r.to),c=r.pointFromo&&(a.span(o,u,r.active,l),l=r.openEnd(u));if(r.to>n)return l+(r.point&&r.to>n?1:0);o=r.to,r.next()}}static of(e,t=!1){let n=new e1;for(let a of e instanceof Ro?[e]:t?vZ(e):e)n.add(a.from,a.to,a.value);return n.finish()}static join(e){if(!e.length)return X.empty;let t=h1(e);for(let n=e.length-2;n>=0;n--)for(let a=e[n];a!=X.empty;a=a.nextLayer)t=new X(a.chunkPos,a.chunk,t,Math.max(a.maxPoint,t.maxPoint));return t}}X.empty=new X([],[],null,-1);function h1(i){return i[i.length-1]}function vZ(i){if(i.length>1)for(let e=i[0],t=1;t0)return i.slice().sort(Go);e=n}return i}X.empty.nextLayer=X.empty;class e1{finishChunk(e){this.chunks.push(new c0(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,n){this.addRange(e,t,n,!0)}addRange(e,t,n,a){this.addInner(e,t,n,a)||(this.nextLayer||(this.nextLayer=new e1)).addRange(e,t,n,a)}addInner(e,t,n,a){let s=e-this.lastTo||n.startSide-this.last.endSide;if(a&&s<=0&&(e-this.lastFrom||n.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return s<0?!1:(this.from.length==250&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=n,this.lastFrom=e,this.lastTo=t,this.value.push(n),n.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),!0)}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let n=t.value.length-1;return this.last=t.value[n],this.lastFrom=t.from[n]+e,this.lastTo=t.to[n]+e,!0}finish(){return this.finishInner(X.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.length==0)return e;let t=X.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function xm(i,e,t){let n=new Map;for(let s of i)for(let r=0;r=this.minPoint)break}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=n&&a.push(new _g(r,t,n,s));return a.length==1?a[0]:new Ii(a)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let n of this.heap)n.goto(e,t);for(let n=this.heap.length>>1;n>=0;n--)Ir(this.heap,n);return this.next(),this}forward(e,t){for(let n of this.heap)n.forward(e,t);for(let n=this.heap.length>>1;n>=0;n--)Ir(this.heap,n);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Ir(this.heap,0)}}}function Ir(i,e){for(let t=i[e];;){let n=(e<<1)+1;if(n>=i.length)break;let a=i[n];if(n+1=0&&(a=i[n+1],n++),t.compare(a)<0)break;i[n]=t,i[e]=a,e=n}}class G1{constructor(e,t,n){this.minPoint=n,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Ii.from(e,t,n)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){ca(this.active,e),ca(this.activeTo,e),ca(this.activeRank,e),this.minActive=ym(this.active,this.activeTo)}addActive(e){let t=0,{value:n,to:a,rank:s}=this.cursor;for(;t0;)t++;da(this.active,t,n),da(this.activeTo,t,a),da(this.activeRank,t,s),e&&da(e,t,this.cursor.from),this.minActive=ym(this.active,this.activeTo)}next(){let e=this.to,t=this.point;this.point=null;let n=this.openStart<0?[]:null;for(;;){let a=this.minActive;if(a>-1&&(this.activeTo[a]-this.cursor.from||this.active[a].endSide-this.cursor.startSide)<0){if(this.activeTo[a]>e){this.to=this.activeTo[a],this.endSide=this.active[a].endSide;break}this.removeActive(a),n&&ca(n,a)}else if(this.cursor.value)if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}else{let s=this.cursor.value;if(!s.point)this.addActive(n),this.cursor.next();else if(t&&this.cursor.to==this.to&&this.cursor.from=0&&n[a]=0&&!(this.activeRank[n]e||this.activeTo[n]==e&&this.active[n].endSide>=this.point.endSide)&&t.push(this.active[n]);return t.reverse()}openEnd(e){let t=0;for(let n=this.activeTo.length-1;n>=0&&this.activeTo[n]>e;n--)t++;return t}}function bm(i,e,t,n,a,s){i.goto(e),t.goto(n);let r=n+a,o=n,l=n-e,u=!!s.boundChange;for(let m=!1;;){let c=i.to+l-t.to,d=c||i.endSide-t.endSide,h=d<0?i.to+l:t.to,g=Math.min(h,r);if(i.point||t.point?(i.point&&t.point&&m0(i.point,t.point)&&Ho(i.activeForPoint(i.to),t.activeForPoint(t.to))||s.comparePoint(o,g,i.point,t.point),m=!1):(m&&(s.boundChange(o),m=!1),g>o&&!Ho(i.active,t.active)&&s.compareRange(o,g,i.active,t.active),u&&gr)break;o=h,d<=0&&i.next(),d>=0&&t.next()}}function Ho(i,e){if(i.length!=e.length)return!1;for(let t=0;t=e;n--)i[n+1]=i[n];i[e]=t}function ym(i,e){let t=-1,n=1e9;for(let a=0;a=e)return a;if(a==i.length)break;s+=i.charCodeAt(a)==9?t-s%t:1,a=Ke(i,a)}return i.length}const Vo="ͼ",vm=typeof Symbol>"u"?"__"+Vo:Symbol.for(Vo),Qo=typeof Symbol>"u"?"__styleSet"+Math.floor(Math.random()*1e8):Symbol("styleSet"),wm=typeof globalThis<"u"?globalThis:typeof window<"u"?window:{};class Bn{constructor(e,t){this.rules=[];let{finish:n}=t||{};function a(r){return/^@/.test(r)?[r]:r.split(/,\s*/)}function s(r,o,l,u){let m=[],c=/^@(\w+)\b/.exec(r[0]),d=c&&c[1]=="keyframes";if(c&&o==null)return l.push(r[0]+";");for(let h in o){let g=o[h];if(/&/.test(h))s(h.split(/,\s*/).map(f=>r.map(x=>f.replace(/&/,x))).reduce((f,x)=>f.concat(x)),g,l);else if(g&&typeof g=="object"){if(!c)throw new RangeError("The value of a property ("+h+") should be a primitive value.");s(a(h),g,m,d)}else g!=null&&m.push(h.replace(/_.*/,"").replace(/[A-Z]/g,f=>"-"+f.toLowerCase())+": "+g+";")}(m.length||d)&&l.push((n&&!c&&!u?r.map(n):r).join(", ")+" {"+m.join(" ")+"}")}for(let r in e)s(a(r),e[r],this.rules)}getRules(){return this.rules.join(` +`)}static newName(){let e=wm[vm]||1;return wm[vm]=e+1,Vo+e.toString(36)}static mount(e,t,n){let a=e[Qo],s=n&&n.nonce;a?s&&a.setNonce(s):a=new zZ(e,s),a.mount(Array.isArray(t)?t:[t],e)}}let zm=new Map;class zZ{constructor(e,t){let n=e.ownerDocument||e,a=n.defaultView;if(!e.head&&e.adoptedStyleSheets&&a.CSSStyleSheet){let s=zm.get(n);if(s)return e[Qo]=s;this.sheet=new a.CSSStyleSheet,zm.set(n,this)}else this.styleTag=n.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);this.modules=[],e[Qo]=this}mount(e,t){let n=this.sheet,a=0,s=0,r=!1;for(let o=0;o-1&&(this.modules.splice(u,1),r=!0,s--,u=-1),u==-1){if(this.modules.splice(s++,0,l),r=!0,n)for(let m=0;m",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},IZ=typeof navigator<"u"&&/Mac/.test(navigator.platform),kZ=typeof navigator<"u"&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent);for(var Ge=0;Ge<10;Ge++)Dn[48+Ge]=Dn[96+Ge]=String(Ge);for(var Ge=1;Ge<=24;Ge++)Dn[Ge+111]="F"+Ge;for(var Ge=65;Ge<=90;Ge++)Dn[Ge]=String.fromCharCode(Ge+32),ki[Ge]=String.fromCharCode(Ge);for(var kr in Dn)ki.hasOwnProperty(kr)||(ki[kr]=Dn[kr]);function SZ(i){var e=IZ&&i.metaKey&&i.shiftKey&&!i.ctrlKey&&!i.altKey||kZ&&i.shiftKey&&i.key&&i.key.length==1||i.key=="Unidentified",t=!e&&i.key||(i.shiftKey?ki:Dn)[i.keyCode]||i.key||"Unidentified";return t=="Esc"&&(t="Escape"),t=="Del"&&(t="Delete"),t=="Left"&&(t="ArrowLeft"),t=="Up"&&(t="ArrowUp"),t=="Right"&&(t="ArrowRight"),t=="Down"&&(t="ArrowDown"),t}let st=typeof navigator<"u"?navigator:{userAgent:"",vendor:"",platform:""},qo=typeof document<"u"?document:{documentElement:{style:{}}};const Uo=/Edge\/(\d+)/.exec(st.userAgent),Tg=/MSIE \d/.test(st.userAgent),$o=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(st.userAgent),Vs=!!(Tg||$o||Uo),Im=!Vs&&/gecko\/(\d+)/i.test(st.userAgent),Sr=!Vs&&/Chrome\/(\d+)/.exec(st.userAgent),km="webkitFontSmoothing"in qo.documentElement.style,Yo=!Vs&&/Apple Computer/.test(st.vendor),Sm=Yo&&(/Mobile\/\w+/.test(st.userAgent)||st.maxTouchPoints>2);var J={mac:Sm||/Mac/.test(st.platform),windows:/Win/.test(st.platform),linux:/Linux|X11/.test(st.platform),ie:Vs,ie_version:Tg?qo.documentMode||6:$o?+$o[1]:Uo?+Uo[1]:0,gecko:Im,gecko_version:Im?+(/Firefox\/(\d+)/.exec(st.userAgent)||[0,0])[1]:0,chrome:!!Sr,chrome_version:Sr?+Sr[1]:0,ios:Sm,android:/Android\b/.test(st.userAgent),webkit:km,webkit_version:km?+(/\bAppleWebKit\/(\d+)/.exec(st.userAgent)||[0,0])[1]:0,safari:Yo,safari_version:Yo?+(/\bVersion\/(\d+(\.\d+)?)/.exec(st.userAgent)||[0,0])[1]:0,tabSize:qo.documentElement.style.tabSize!=null?"tab-size":"-moz-tab-size"};function d0(i,e){for(let t in i)t=="class"&&e.class?e.class+=" "+i.class:t=="style"&&e.style?e.style+=";"+i.style:e[t]=i[t];return e}const fs=Object.create(null);function h0(i,e,t){if(i==e)return!0;i||(i=fs),e||(e=fs);let n=Object.keys(i),a=Object.keys(e);if(n.length-0!=a.length-0)return!1;for(let s of n)if(s!=t&&(a.indexOf(s)==-1||i[s]!==e[s]))return!1;return!0}function _Z(i,e){for(let t=i.attributes.length-1;t>=0;t--){let n=i.attributes[t].name;e[n]==null&&i.removeAttribute(n)}for(let t in e){let n=e[t];t=="style"?i.style.cssText=n:i.getAttribute(t)!=n&&i.setAttribute(t,n)}}function _m(i,e,t){let n=!1;if(e)for(let a in e)t&&a in t||(n=!0,a=="style"?i.style.cssText="":i.removeAttribute(a));if(t)for(let a in t)e&&e[a]==t[a]||(n=!0,a=="style"?i.style.cssText=t[a]:i.setAttribute(a,t[a]));return n}function TZ(i){let e=Object.create(null);for(let t=0;t0?3e8:-4e8:t>0?1e8:-1e8,new a1(e,t,t,n,e.widget||null,!1)}static replace(e){let t=!!e.block,n,a;if(e.isBlockGap)n=-5e8,a=4e8;else{let{start:s,end:r}=Og(e,t);n=(s?t?-3e8:-1:5e8)-1,a=(r?t?2e8:1:-6e8)+1}return new a1(e,n,a,t,e.widget||null,!0)}static line(e){return new Fi(e)}static set(e,t=!1){return X.of(e,t)}hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}}ue.none=X.empty;class Ni extends ue{constructor(e){let{start:t,end:n}=Og(e);super(t?-1:5e8,n?1:-6e8,null,e),this.tagName=e.tagName||"span",this.attrs=e.class&&e.attributes?d0(e.attributes,{class:e.class}):e.class?{class:e.class}:e.attributes||fs}eq(e){return this==e||e instanceof Ni&&this.tagName==e.tagName&&h0(this.attrs,e.attrs)}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}Ni.prototype.point=!1;class Fi extends ue{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof Fi&&this.spec.class==e.spec.class&&h0(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}Fi.prototype.mapMode=Xe.TrackBefore;Fi.prototype.point=!0;class a1 extends ue{constructor(e,t,n,a,s,r){super(t,n,s,e),this.block=a,this.isReplace=r,this.mapMode=a?t<=0?Xe.TrackBefore:Xe.TrackAfter:Xe.TrackDel}get type(){return this.startSide!=this.endSide?Ve.WidgetRange:this.startSide<=0?Ve.WidgetBefore:Ve.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof a1&&OZ(this.widget,e.widget)&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}a1.prototype.point=!0;function Og(i,e=!1){let{inclusiveStart:t,inclusiveEnd:n}=i;return t==null&&(t=i.inclusive),n==null&&(n=i.inclusive),{start:t??e,end:n??e}}function OZ(i,e){return i==e||!!(i&&e&&i.compare(e))}function I1(i,e,t,n=0){let a=t.length-1;a>=0&&t[a]+n>=i?t[a]=Math.max(t[a],e):t.push(i,e)}class Si extends Cn{constructor(e,t,n){super(),this.tagName=e,this.attributes=t,this.rank=n}eq(e){return e==this||e instanceof Si&&this.tagName==e.tagName&&h0(this.attributes,e.attributes)}static create(e){return new Si(e.tagName,e.attributes||fs,e.rank==null?50:Math.max(0,Math.min(e.rank,100)))}static set(e,t=!1){return X.of(e,t)}}Si.prototype.startSide=Si.prototype.endSide=-1;const Ee=i=>i.nodeType==1,A1=i=>i.nodeType==3;function _i(i){let e;return i.nodeType==11?e=i.getSelection?i:i.ownerDocument:e=i,e.getSelection()}function Xo(i,e){return e?i==e||i.contains(e.nodeType!=1?e.parentNode:e):!1}function mi(i,e){if(!e.anchorNode)return!1;try{return Xo(i,e.anchorNode)}catch{return!1}}function Fa(i){return A1(i)?Ti(i,0,i.nodeValue.length).getClientRects():Ee(i)?i.getClientRects():[]}function ci(i,e,t,n){return t?Tm(i,e,t,n,-1)||Tm(i,e,t,n,1):!1}function Zn(i){for(var e=0;;e++)if(i=i.previousSibling,!i)return e}function xs(i){return Ee(i)&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(i.nodeName)}function Tm(i,e,t,n,a){for(;;){if(i==t&&e==n)return!0;if(e==(a<0?0:pn(i))){if(i.nodeName=="DIV")return!1;let s=i.parentNode;if(!s||!Ee(s))return!1;e=Zn(i)+(a<0?0:1),i=s}else if(Ee(i)){if(i=i.childNodes[e+(a<0?-1:0)],Ee(i)&&(i.nodeName=="IMG"||i.nodeName=="BR"||i.contentEditable=="false"))return!1;e=a<0?pn(i):0}else return!1}}function pn(i){return A1(i)?i.nodeValue.length:i.childNodes.length}function bs(i,e){let{left:t,right:n}=i;if(t==n)return i;let a=e?t:n;return{left:a,right:a,top:i.top,bottom:i.bottom}}function AZ(i){let e=i.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:i.innerWidth,top:0,bottom:i.innerHeight}}function Ag(i,e){let t=e.width/i.offsetWidth,n=e.height/i.offsetHeight;return(t>.995&&t<1.005||!isFinite(t)||Math.abs(e.width-i.offsetWidth)<1)&&(t=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-i.offsetHeight)<1)&&(n=1),{scaleX:t,scaleY:n}}function PZ(i,e,t,n,a,s,r,o){let l=i.ownerDocument,u=l.defaultView||window;for(let m=i,c=!1;m&&!c;)if(Ee(m)){let d,h=m==l.body,g=1,f=1,x=!0,b=!0;if(h)d=AZ(u);else{let S=getComputedStyle(m);if(/^(fixed|sticky)$/.test(S.position)&&(c=!0),(m.scrollHeight<=m.clientHeight||!/auto|scroll/.test(S.overflowY))&&(b=!1),(m.scrollWidth<=m.clientWidth||!/auto|scroll/.test(S.overflowX))&&(x=!1),!x&&!b){m=m.assignedSlot||m.parentNode;continue}let z=m.getBoundingClientRect();({scaleX:g,scaleY:f}=Ag(m,z)),d={left:z.left,right:z.left+m.clientWidth*g,top:z.top,bottom:z.top+m.clientHeight*f}}let y=0,w=0;if(b)if(a=="nearest")e.top0&&e.bottom>d.bottom+w&&(w=e.bottom-d.bottom+r)):e.bottom>d.bottom-r&&(w=e.bottom-d.bottom+r,t<0&&e.top-w0&&e.right>d.right+y&&(y=e.right-d.right+s)):e.right>d.right-s&&(y=e.right-d.right+s,t<0&&e.leftd.bottom||e.leftd.right)&&(e={left:Math.max(e.left,d.left),right:Math.min(e.right,d.right),top:Math.max(e.top,d.top),bottom:Math.min(e.bottom,d.bottom)}),m=m.assignedSlot||m.parentNode}else if(m.nodeType==11)m=m.host;else break}function Pg(i,e=!0){let t=i.ownerDocument,n=null,a=null;for(let s=i.parentNode;s&&!(s==t.body||(!e||n)&&a);)if(Ee(s))!a&&s.scrollHeight>s.clientHeight&&/scroll|auto/.test(getComputedStyle(s).overflowY)&&(a=s),e&&!n&&s.scrollWidth>s.clientWidth&&/scroll|auto/.test(getComputedStyle(s).overflowX)&&(n=s),s=s.assignedSlot||s.parentNode;else if(s.nodeType==11)s=s.host;else break;return{x:n,y:a}}class jZ{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:n}=e;this.set(t,Math.min(e.anchorOffset,t?pn(t):0),n,Math.min(e.focusOffset,n?pn(n):0))}set(e,t,n,a){this.anchorNode=e,this.anchorOffset=t,this.focusNode=n,this.focusOffset=a}}function jg(i){let e=[];for(let t=i;t;t=t.nodeType==11?t.host:t.parentNode)Ee(t)&&e.push({node:t,left:t.scrollLeft,top:t.scrollTop});return e}function Cg(i,e=!0){for(let{node:t,left:n,top:a}of i)e&&t.scrollTop!=a&&(t.scrollTop=a),t.scrollLeft!=n&&(t.scrollLeft=n)}let Gn=null;J.safari&&J.safari_version>=26&&(Gn=!1);function Bg(i){if(i.setActive)return i.setActive();if(Gn)return i.focus(Gn);let e=jg(i);i.focus(Gn==null?{get preventScroll(){return Gn={preventScroll:!0},!0}}:void 0),Gn||(Gn=!1,Cg(e))}let Om;function Ti(i,e,t=e){let n=Om||(Om=document.createRange());return n.setEnd(i,t),n.setStart(i,e),n}function k1(i,e,t,n){let a={key:e,code:e,keyCode:t,which:t,cancelable:!0};n&&({altKey:a.altKey,ctrlKey:a.ctrlKey,shiftKey:a.shiftKey,metaKey:a.metaKey}=n);let s=new KeyboardEvent("keydown",a);s.synthetic=!0,i.dispatchEvent(s);let r=new KeyboardEvent("keyup",a);return r.synthetic=!0,i.dispatchEvent(r),s.defaultPrevented||r.defaultPrevented}function CZ(i){for(;i;){if(i&&(i.nodeType==9||i.nodeType==11&&i.host))return i;i=i.assignedSlot||i.parentNode}return null}function BZ(i,e){let t=e.focusNode,n=e.focusOffset;if(!t||e.anchorNode!=t||e.anchorOffset!=n)return!1;for(n=Math.min(n,pn(t));;)if(n){if(!Ee(t))return!1;let a=t.childNodes[n-1];a.contentEditable=="false"?n--:(t=a,n=pn(t))}else{if(t==i)return!0;n=Zn(t),t=t.parentNode}}function Dg(i){return i instanceof Window?i.pageYOffset>Math.max(0,i.document.documentElement.scrollHeight-i.innerHeight-4):i.scrollTop>Math.max(1,i.scrollHeight-i.clientHeight-4)}function Zg(i,e){for(let t=i,n=e;;){if(A1(t)&&n>0)return{node:t,offset:n};if(Ee(t)&&n>0){if(t.contentEditable=="false")return null;t=t.childNodes[n-1],n=pn(t)}else if(t.parentNode&&!xs(t))n=Zn(t),t=t.parentNode;else return null}}function Mg(i,e){for(let t=i,n=e;;){if(A1(t)&&n=t){if(o.level==n)return r;(s<0||(a!=0?a<0?o.fromt:e[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function Eg(i,e){if(i.length!=e.length)return!1;for(let t=0;t=0;f-=3)if(Ut[f+1]==-h){let x=Ut[f+2],b=x&2?a:x&4?x&1?s:a:0;b&&(me[c]=me[Ut[f]]=b),o=f;break}}else{if(Ut.length==189)break;Ut[o++]=c,Ut[o++]=d,Ut[o++]=l}else if((g=me[c])==2||g==1){let f=g==a;l=f?0:1;for(let x=o-3;x>=0;x-=3){let b=Ut[x+2];if(b&2)break;if(f)Ut[x+2]|=2;else{if(b&4)break;Ut[x+2]|=4}}}}}function EZ(i,e,t,n){for(let a=0,s=n;a<=t.length;a++){let r=a?t[a-1].to:i,o=al;)g==x&&(g=t[--f].from,x=f?t[f-1].to:i),me[--g]=h;l=m}else s=u,l++}}}function el(i,e,t,n,a,s,r){let o=n%2?2:1;if(n%2==a%2)for(let l=e,u=0;ll&&r.push(new an(l,f.from,h));let x=f.direction==P1!=!(h%2);tl(i,x?n+1:n,a,f.inner,f.from,f.to,r),l=f.to}g=f.to}else{if(g==t||(m?me[g]!=o:me[g]==o))break;g++}d?el(i,l,g,n+1,a,d,r):le;){let m=!0,c=!1;if(!u||l>s[u-1].to){let f=me[l-1];f!=o&&(m=!1,c=f==16)}let d=!m&&o==1?[]:null,h=m?n:n+1,g=l;e:for(;;)if(u&&g==s[u-1].to){if(c)break e;let f=s[--u];if(!m)for(let x=f.from,b=u;;){if(x==e)break e;if(b&&s[b-1].to==x)x=s[--b].from;else{if(me[x-1]==o)break e;break}}if(d)d.push(f);else{f.tome.length;)me[me.length]=256;let n=[],a=e==P1?0:1;return tl(i,a,a,t,0,i.length,n),n}function Ng(i){return[new an(0,i,0)]}let Fg="";function FZ(i,e,t,n,a){var s;if(!i.length)return null;let r=n.head-i.from,o;if(n.head==i.from&&n.assoc<0){if(!a)return null;r=e[o=0].side(!1,t)}else if(n.head==i.to&&n.assoc>0){if(a)return null;r=e[o=e.length-1].side(!0,t)}else o=an.find(e,r,(s=n.bidiLevel)!==null&&s!==void 0?s:-1,n.assoc);let l=e[o],u=l.side(a,t);if(r==u){let d=o+=a?1:-1;if(d<0||d>=e.length)return null;l=e[o=d],r=l.side(!a,t),u=l.side(a,t)}let m=Ke(i.text,r,l.forward(a,t));(ml.to)&&(m=u),Fg=i.text.slice(Math.min(r,m),Math.max(r,m));let c=o==(a?e.length-1:0)?null:e[o+(a?1:-1)];if(m==u){if(!c)return a?B.cursor(i.to,1):B.cursor(i.from,-1);if(c.level+(a?0:1)i.some(e=>e)}),RZ=G.define({combine:i=>i.some(e=>e)}),Ug=G.define();class S1{constructor(e,t,n,a,s,r=!1){this.range=e,this.y=t,this.x=n,this.yMargin=a,this.xMargin=s,this.isSnapshot=r}map(e){return e.empty?this:new S1(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(e){return this.range.to<=e.doc.length?this:new S1(B.cursor(e.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const ha=re.define({map:(i,e)=>i.map(e)}),$g=re.define();function bt(i,e,t){let n=i.facet(Hg);n.length?n[0](e):window.onerror&&window.onerror(String(e),t,void 0,void 0,e)||(t?console.error(t+":",e):console.error(e))}const mn=G.define({combine:i=>i.length?i[0]:!0});let GZ=0;const x1=G.define({combine(i){return i.filter((e,t)=>{for(let n=0;n{let l=[];return r&&l.push(Qs.of(u=>{let m=u.plugin(o);return m?r(m):ue.none})),s&&l.push(s(o)),l})}static fromClass(e,t){return Dt.define((n,a)=>new e(n,a),t)}}class _r{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}get plugin(){return this.spec&&this.spec.plugin}update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(n){if(bt(t.state,n,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch{}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.plugin.create(e,this.spec.arg)}catch(t){bt(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{this.value.destroy()}catch(n){bt(e.state,n,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Yg=G.define(),x0=G.define(),Qs=G.define(),Xg=G.define(),b0=G.define(),Ji=G.define(),Kg=G.define();function Am(i,e){let t=i.state.facet(Kg);if(!t.length)return t;let n=t.map(s=>s instanceof Function?s(i):s),a=[];return X.spans(n,e.from,e.to,{point(){},span(s,r,o,l){let u=s-e.from,m=r-e.from,c=a;for(let d=o.length-1;d>=0;d--,l--){let h=o[d].spec.bidiIsolate,g;if(l>0&&c.length&&(g=c[c.length-1]).to==u&&g.direction==h)g.to=m,c=g.inner;else{let f={from:u,to:m,direction:h,inner:[]};c.push(f),c=f.inner}}}}),ep(e.text,a)}function ep(i,e){for(let t of e){if(t.direction==null){for(let n=t.from,a=0;n0;t--){let a=e[t-1];if(!(a.fromA>n.toA)){if(a.toAa.push(new jt(s,r,o,l))),this.changedRanges=a}static create(e,t,n){return new ys(e,t,n)}get viewportChanged(){return(this.flags&4)>0}get viewportMoved(){return(this.flags&8)>0}get heightChanged(){return(this.flags&2)>0}get geometryChanged(){return this.docChanged||(this.flags&18)>0}get focusChanged(){return(this.flags&1)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some(e=>e.selection)}get empty(){return this.flags==0&&this.transactions.length==0}}const HZ=[];class ke{constructor(e,t,n=0){this.dom=e,this.length=t,this.flags=n,this.parent=null,e.cmTile=this}get breakAfter(){return this.flags&1}get children(){return HZ}isWidget(){return!1}get isHidden(){return!1}isComposite(){return!1}isLine(){return!1}isText(){return!1}isBlock(){return!1}get domAttrs(){return null}sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttrs;t&&_Z(this.dom,t)}}toString(){return this.constructor.name+(this.children.length?`(${this.children})`:"")+(this.breakAfter?"#":"")}destroy(){this.parent=null}setDOM(e){this.dom=e,e.cmTile=this}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e,t=this.posAtStart){let n=t;for(let a of this.children){if(a==e)return n;n+=a.length+a.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}covers(e){return!0}coordsIn(e,t,n){return null}domPosFor(e,t){let n=Zn(this.dom),a=this.length?e>0:t>0;return new Jt(this.parent.dom,n+(a?1:0),e==0||e==this.length)}markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent.flags&2&&this.parent.markDirty(!1)}get overrideDOMText(){return null}get root(){for(let e=this;e;e=e.parent)if(e instanceof Us)return e;return null}static get(e){return e.cmTile}}class qs extends ke{constructor(e){super(e,0),this._children=[]}isComposite(){return!0}get children(){return this._children}get lastChild(){return this.children.length?this.children[this.children.length-1]:null}append(e){this.children.push(e),e.parent=this}sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,n=null,a,s=(e==null?void 0:e.node)==t?e:null,r=0;for(let o of this.children){if(o.sync(e),r+=o.length+o.breakAfter,a=n?n.nextSibling:t.firstChild,s&&a!=o.dom&&(s.written=!0),o.dom.parentNode==t)for(;a&&a!=o.dom;)a=Pm(a);else t.insertBefore(o.dom,a);n=o.dom}for(a=n?n.nextSibling:t.firstChild,s&&a&&(s.written=!0);a;)a=Pm(a);this.length=r}}function Pm(i){let e=i.nextSibling;return i.parentNode.removeChild(i),e}class Us extends qs{constructor(e,t){super(t),this.view=e}owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}isBlock(){return!0}nearest(e){for(;;){if(!e)return null;let t=ke.get(e);if(t&&this.owns(t))return t;e=e.parentNode}}blockTiles(e){for(let t=[],n=this,a=0,s=0;;)if(a==n.children.length){if(!t.length)return;n=n.parent,n.breakAfter&&s++,a=t.pop()}else{let r=n.children[a++];if(r instanceof dn)t.push(a),n=r,a=0;else{let o=s+r.length,l=e(r,s);if(l!==void 0)return l;s=o+r.breakAfter}}}resolveBlock(e,t){let n,a=-1,s,r=-1;if(this.blockTiles((o,l)=>{let u=l+o.length;if(e>=l&&e<=u){if(o.isWidget()&&t>=-1&&t<=1){if(o.flags&32)return!0;o.flags&16&&(n=void 0)}(le||e==l&&(t>1?o.length:o.covers(-1)))&&(!s||!o.isWidget()&&s.isWidget())&&(s=o,r=e-l)}}),!n&&!s)throw new Error("No tile at position "+e);return n&&t<0||!s?{tile:n,offset:a}:{tile:s,offset:r}}}class dn extends qs{constructor(e,t){super(e),this.wrapper=t}isBlock(){return!0}covers(e){return this.children.length?e<0?this.children[0].covers(-1):this.lastChild.covers(1):!1}get domAttrs(){return this.wrapper.attributes}static of(e,t){let n=new dn(t||document.createElement(e.tagName),e);return t||(n.flags|=4),n}}class j1 extends qs{constructor(e,t){super(e),this.attrs=t}isLine(){return!0}static start(e,t,n){let a=new j1(t||document.createElement("div"),e);return(!t||!n)&&(a.flags|=4),a}get domAttrs(){return this.attrs}resolveInline(e,t,n=!1){let a=null,s=-1,r=null,o=-1;function l(m,c){for(let d=0,h=0;d=c&&(g.isComposite()?l(g,c-h):(!r||n&&r.isHidden&&(t>0&&!(r.flags&32)||n&&QZ(r,g)))&&(f>c||g.flags&32&&t<=1)?(r=g,o=c-h):(h=-1)&&(a=g,s=c-h)),h=f}}l(this,e);let u=(t<0?a:r)||a||r;return u?{tile:u,offset:u==a?s:o}:null}coordsIn(e,t,n){let a=this.resolveInline(e,t,!0);return a?a.tile.coordsIn(Math.max(0,a.offset),t,n):VZ(this)}domIn(e,t){let n=this.resolveInline(e,t);if(n){let{tile:a,offset:s}=n;if(this.dom.contains(a.dom))return a.isText()?new Jt(a.dom,Math.min(a.dom.nodeValue.length,s)):a.domPosFor(s,a.flags&16?1:a.flags&32?-1:t);let r=n.tile.parent,o=!1;for(let l of r.children){if(o)return new Jt(l.dom,0);l==n.tile&&(o=!0)}}return new Jt(this.dom,0)}}function VZ(i){let e=i.dom.lastChild;if(!e)return i.dom.getBoundingClientRect();let t=Fa(e);return t[t.length-1]||null}function QZ(i,e){let t=i.coordsIn(0,1),n=e.coordsIn(0,1);return t&&n&&n.topa&&(e=a);let s=e,r=e,o=0;e==0&&t<0||e==a&&t>=0?J.chrome||J.gecko||(e?(s--,o=1):r=0)?0:l.length-1];return J.safari&&!o&&u.width==0&&(u=Array.prototype.find.call(l,m=>m.width)||u),n==null?u:bs(u,(o?o>0:t<0)==n)}static of(e,t){let n=new qn(t||document.createTextNode(e),e);return t||(n.flags|=2),n}}class s1 extends ke{constructor(e,t,n,a){super(e,t,a),this.widget=n}isWidget(){return!0}get isHidden(){return this.widget.isHidden}covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}coordsIn(e,t){return this.coordsInWidget(e,t,!1)}coordsInWidget(e,t,n){let a=this.widget.coordsAt(this.dom,e,t);if(a)return a;if(n)return bs(this.dom.getBoundingClientRect(),this.length?e==0:t<=0);{let s=this.dom.getClientRects(),r=null;if(!s.length)return null;let o=this.flags&16?!0:this.flags&32?!1:e>0;for(let l=o?s.length-1:0;r=s[l],!(e>0?l==0:l==s.length-1||r.top0==n)}}class qZ{constructor(e){this.index=0,this.beforeBreak=!1,this.parents=[],this.tile=e}advance(e,t,n){let{tile:a,index:s,beforeBreak:r,parents:o}=this;for(;e||t>0;)if(a.isComposite())if(r){if(!e)break;n&&n.break(),e--,r=!1}else if(s==a.children.length){if(!e&&!o.length)break;n&&n.leave(a),r=!!a.breakAfter,{tile:a,index:s}=o.pop(),s++}else{let l=a.children[s],u=l.breakAfter;(t>0?l.length<=e:l.length=0;o--){let l=t.marks[o],u=a.lastChild;if(u instanceof ct&&u.mark.eq(l.mark))u.dom!=l.dom&&u.setDOM(Tr(l.dom)),a=u;else{let{dom:m}=l;this.cache.reused.get(l)&&ke.get(l.dom)&&(m=Tr(l.dom));let c=ct.of(l.mark,m);a.append(c),a=c}this.cache.reused.set(l,2)}let s=ke.get(e.text);s&&this.cache.reused.set(s,2);let r=new qn(e.text,e.text.nodeValue);r.flags|=8,this.pos=e.range.toB,a.append(r)}addInlineWidget(e,t,n){let a=this.afterWidget&&e.flags&48&&(this.afterWidget.flags&48)==(e.flags&48);a||this.flushBuffer();let s=this.ensureMarks(t,n);!a&&!(e.flags&16)&&s.append(this.getBuffer(1)),s.append(e),this.pos+=e.length,this.afterWidget=e}addMark(e,t,n){this.flushBuffer(),this.ensureMarks(t,n).append(e),this.pos+=e.length,this.afterWidget=null}addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,this.pos+=e}addLineStart(e,t){var n;e||(e=np);let a=j1.start(e,t||((n=this.cache.find(j1))===null||n===void 0?void 0:n.dom),!!t);this.getBlockPos().append(this.lastBlock=this.curLine=a)}addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBlock=e,this.endLine()}addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}ensureLine(e){this.curLine||this.addLineStart(e)}ensureMarks(e,t){var n;let a=this.curLine;for(let s=e.length-1;s>=0;s--){let r=e[s],o;if(t>0&&(o=a.lastChild)&&o instanceof ct&&o.mark.eq(r))a=o,t--;else{let l=ct.of(r,(n=this.cache.find(ct,u=>u.mark.eq(r)))===null||n===void 0?void 0:n.dom);a.append(l),a=l,t=0}}return a}endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChild;(!e||!jm(this.curLine,!1)||e.dom.nodeName!="BR"&&e.isWidget()&&!(J.ios&&jm(this.curLine,!0)))&&this.curLine.append(this.cache.findWidget(Or,0,32)||new s1(Or.toDOM(),0,Or,32)),this.curLine=this.afterWidget=null}}updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers.goto(this.pos),this.wrappers.length=0);for(let e=this.wrappers.length-1;e>=0;e--)this.wrappers[e].to=this.pos){let t=e.rank*102+e.value.rank,n=new UZ(e.from,e.to,e.value,t),a=this.wrappers.length;for(;a>0&&(this.wrappers[a-1].rank-n.rank||this.wrappers[a-1].to-n.to)<0;)a--;this.wrappers.splice(a,0,n)}this.wrapperPos=this.pos}getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let n of this.wrappers){let a=t.lastChild;if(n.fromr.wrapper.eq(n.wrapper)))===null||e===void 0?void 0:e.dom);t.append(s),t=s}}return t}blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!e.isWidget()||(e.flags&160)>0)}getBuffer(e){let t=2|(e<0?16:32),n=this.cache.find(vs,void 0,1);return n&&(n.flags=t),n||new vs(t)}flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afterWidget.parent.append(this.getBuffer(-1)),this.afterWidget=null)}}class YZ{constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=e.iter()}skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount+=e-(this.text.length-this.textOff),this.text="",this.textOff=0)}next(e){if(this.textOff==this.text.length){let{value:a,lineBreak:s,done:r}=this.cursor.next(this.skipCount);if(this.skipCount=0,r)throw new Error("Ran out of text content when drawing inline views");this.text=a;let o=this.textOff=Math.min(e,a.length);return s?null:a.slice(0,o)}let t=Math.min(this.text.length,this.textOff+e),n=this.text.slice(this.textOff,t);return this.textOff=t,n}}const ws=[s1,j1,qn,ct,vs,dn,Us];for(let i=0;i[]),this.index=ws.map(()=>0),this.reused=new Map}add(e){let t=e.constructor.bucket,n=this.buckets[t];n.length<6?n.push(e):n[this.index[t]=(this.index[t]+1)%6]=e}find(e,t,n=2){let a=e.bucket,s=this.buckets[a],r=this.index[a];for(let o=0;o{if(this.cache.add(r),r.isComposite())return!1},enter:r=>this.cache.add(r),leave:()=>{},break:()=>{}}}run(e,t){let n=t&&this.getCompositionContext(t.text);for(let a=0,s=0,r=0;;){let o=ra){let u=l-a;this.preserve(u,!r,!o),a=l,s+=u}if(!o)break;t&&o.fromA<=t.range.fromA&&o.toA>=t.range.toA?(this.forward(o.fromA,t.range.fromA,t.range.fromA{if(r.isWidget())if(this.openWidget)this.builder.continueWidget(l-o);else{let u=l>0||o{r.isLine()?this.builder.addLineStart(r.attrs,this.cache.maybeReuse(r)):(this.cache.add(r),r instanceof ct&&a.unshift(r.mark)),this.openWidget=!1},leave:r=>{r.isLine()?a.length&&(a.length=s=0):r instanceof ct&&(a.shift(),s=Math.min(s,a.length))},break:()=>{this.builder.addBreak(),this.openWidget=!1}}),this.text.skip(e)}emit(e,t){let n=null,a=this.builder,s=-1,r=X.spans(this.decorations,e,t,{point:(o,l,u,m,c,d)=>{if(u instanceof a1){if(this.disallowBlockEffectsFor[d]){if(u.block)throw new RangeError("Block decorations may not be specified via plugins");if(l>this.view.state.doc.lineAt(o).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}if(s=m.length,c>m.length)a.continueWidget(l-o);else{let h=u.widget||(u.block?C1.block:C1.inline),g=eM(u),f=this.cache.findWidget(h,l-o,g)||s1.of(h,this.view,l-o,g);u.block?(u.startSide>0&&a.addLineStartIfNotCovered(n),a.addBlockWidget(f)):(a.ensureLine(n),a.addInlineWidget(f,m,c))}n=null}else n=tM(n,u);l>o&&this.text.skip(l-o)},span:(o,l,u,m)=>{for(let c=o;c-1&&(this.openWidget=r>s),this.openWidget||a.addLineStartIfNotCovered(n),this.openMarks=r}forward(e,t,n=1){t-e<=10?this.old.advance(t-e,n,this.reuseWalker):(this.old.advance(5,-1,this.reuseWalker),this.old.advance(t-e-10,-1),this.old.advance(5,n,this.reuseWalker))}getCompositionContext(e){let t=[],n=null;for(let a=e.parentNode;;a=a.parentNode){let s=ke.get(a);if(a==this.view.contentDOM)break;s instanceof ct?t.push(s):s!=null&&s.isLine()?n=s:s instanceof dn||(a.nodeName=="DIV"&&!n?n=new j1(a,np):n||t.push(ct.of(new Ni({tagName:a.nodeName.toLowerCase(),attributes:TZ(a)}),a)))}return n?{line:n,marks:t}:null}}function jm(i,e){let t=n=>{for(let a of n.children)if((e?a.isText():a.length)||t(a))return!0;return!1};return t(i)}function eM(i){let e=i.isReplace?(i.startSide<0?64:0)|(i.endSide>0?128:0):i.startSide>0?32:16;return i.block&&(e|=256),e}const np={class:"cm-line"};function tM(i,e){let t=e.spec.attributes,n=e.spec.class;return!t&&!n||(i||(i={class:"cm-line"}),t&&d0(t,i),n&&(i.class+=" "+n)),i}function nM(i){let e=[];for(let t=i.parents.length;t>1;t--){let n=t==i.parents.length?i.tile:i.parents[t].tile;n instanceof ct&&e.push(n.mark)}return e}function Tr(i){let e=ke.get(i);return e&&e.setDOM(i.cloneNode()),i}class C1 extends Ei{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}C1.inline=new C1("span");C1.block=new C1("div");const Or=new class extends Ei{toDOM(){return document.createElement("br")}get isHidden(){return!0}get editable(){return!0}};class Cm{constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.editContextFormatting=ue.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.updateDeco(),this.tile=new Us(e,e.contentDOM),this.updateInner([new jt(0,0,0,e.state.doc.length)],null)}update(e){var t;let n=e.changedRanges;this.minWidth>0&&n.length&&(n.every(({fromA:m,toA:c})=>cthis.minWidthTo)?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(e);let a=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&(!((t=this.domChanged)===null||t===void 0)&&t.newSel?a=this.domChanged.newSel.head:!cM(e.changes,this.hasComposition)&&!e.selectionSet&&(a=e.state.selection.main.head));let s=a>-1?aM(this.view,e.changes,a):null;if(this.domChanged=null,this.hasComposition){let{from:m,to:c}=this.hasComposition;n=new jt(m,c,e.changes.mapPos(m,-1),e.changes.mapPos(c,1)).addToSet(n.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(J.ie||J.chrome)&&!s&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=this.decorations,o=this.blockWrappers;this.updateDeco();let l=oM(r,this.decorations,e.changes);l.length&&(n=jt.extendWithRanges(n,l));let u=uM(o,this.blockWrappers,e.changes);return u.length&&(n=jt.extendWithRanges(n,u)),s&&!n.some(m=>m.fromA<=s.range.fromA&&m.toA>=s.range.toA)&&(n=s.range.addToSet(n.slice())),this.tile.flags&2&&n.length==0?!1:(this.updateInner(n,s),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:n}=this.view;n.ignore(()=>{if(t||e.length){let r=this.tile,o=new KZ(this.view,r,this.blockWrappers,this.decorations,this.dynamicDecorationMap);t&&ke.get(t.text)&&o.cache.reused.set(ke.get(t.text),2),this.tile=o.run(e,t),il(r,o.cache.reused)}this.tile.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.tile.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let s=J.chrome||J.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.tile.sync(s),s&&(s.written||n.selectionRange.focusNode!=s.node||!this.tile.dom.contains(s.node))&&(this.forceSelection=!0),this.tile.dom.style.height=""});let a=[];if(this.view.viewport.from||this.view.viewport.to-1)&&mi(n,this.view.observer.selectionRange)&&!(a&&n.contains(a));if(!(s||t||r))return;let o=this.forceSelection;this.forceSelection=!1;let l=this.view.state.selection.main,u,m;if(l.empty?m=u=this.inlineDOMNearPos(l.anchor,l.assoc||1):(m=this.inlineDOMNearPos(l.head,l.head==l.from?1:-1),u=this.inlineDOMNearPos(l.anchor,l.anchor==l.from?1:-1)),J.gecko&&l.empty&&!this.hasComposition&&iM(u)){let d=document.createTextNode("");this.view.observer.ignore(()=>u.node.insertBefore(d,u.node.childNodes[u.offset]||null)),u=m=new Jt(d,0),o=!0}let c=this.view.observer.selectionRange;(o||!c.focusNode||(!ci(u.node,u.offset,c.anchorNode,c.anchorOffset)||!ci(m.node,m.offset,c.focusNode,c.focusOffset))&&!this.suppressWidgetCursorChange(c,l))&&(this.view.observer.ignore(()=>{J.android&&J.chrome&&n.contains(c.focusNode)&&mM(c.focusNode,n)&&(n.blur(),n.focus({preventScroll:!0}));let d=_i(this.view.root);if(d)if(l.empty){if(J.gecko){let h=sM(u.node,u.offset);if(h&&h!=3){let g=(h==1?Zg:Mg)(u.node,u.offset);g&&(u=new Jt(g.node,g.offset))}}d.collapse(u.node,u.offset),l.bidiLevel!=null&&d.caretBidiLevel!==void 0&&(d.caretBidiLevel=l.bidiLevel)}else if(d.extend){d.collapse(u.node,u.offset);try{d.extend(m.node,m.offset)}catch{}}else{let h=document.createRange();l.anchor>l.head&&([u,m]=[m,u]),h.setEnd(m.node,m.offset),h.setStart(u.node,u.offset),d.removeAllRanges(),d.addRange(h)}r&&this.view.root.activeElement==n&&(n.blur(),a&&a.focus())}),this.view.observer.setSelectionRange(u,m)),this.impreciseAnchor=u.precise?null:new Jt(c.anchorNode,c.anchorOffset),this.impreciseHead=m.precise?null:new Jt(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&ci(e.focusNode,e.focusOffset,e.anchorNode,e.anchorOffset)&&this.posFromDOM(e.focusNode,e.focusOffset)==t.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,n=_i(e.root),{anchorNode:a,anchorOffset:s}=e.observer.selectionRange;if(!n||!t.empty||!t.assoc||!n.modify)return;let r=this.lineAt(t.head,t.assoc);if(!r)return;let o=r.posAtStart;if(t.head==o||t.head==o+r.length)return;let l=this.coordsAt(t.head,-1),u=this.coordsAt(t.head,1);if(!l||!u||l.bottom>u.top)return;let m=this.domAtPos(t.head+t.assoc,t.assoc);n.collapse(m.node,m.offset),n.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let c=e.observer.selectionRange;e.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=t.from&&n.collapse(a,s)}posFromDOM(e,t){let n=this.tile.nearest(e);if(!n)return this.tile.dom.compareDocumentPosition(e)&2?0:this.view.state.doc.length;let a=n.posAtStart;if(n.isComposite()){let s;if(e==n.dom)s=n.dom.childNodes[t];else{let r=pn(e)==0?0:t==0?-1:1;for(;;){let o=e.parentNode;if(o==n.dom)break;r==0&&o.firstChild!=o.lastChild&&(e==o.firstChild?r=-1:r=1),e=o}r<0?s=e:s=e.nextSibling}if(s==n.dom.firstChild)return a;for(;s&&!ke.get(s);)s=s.nextSibling;if(!s)return a+n.length;for(let r=0,o=a;;r++){let l=n.children[r];if(l.dom==s)return o;o+=l.length+l.breakAfter}}else return n.isText()?e==n.dom?a+t:a+(t?n.length:0):a}domAtPos(e,t){let{tile:n,offset:a}=this.tile.resolveBlock(e,t);return n.isWidget()?n.domPosFor(a,t):n.domIn(a,t)}inlineDOMNearPos(e,t){let n,a=-1,s=!1,r,o=-1,l=!1;return this.tile.blockTiles((u,m)=>{if(u.isWidget()){if(u.flags&32&&m>=e)return!0;u.flags&16&&(s=!0)}else{let c=m+u.length;if(m<=e&&(n=u,a=e-m,s=c=e&&!r&&(r=u,o=e-m,l=m>e),m>e&&r)return!0}}),!n&&!r?this.domAtPos(e,t):(s&&r?n=null:l&&n&&(r=null),n&&t<0||!r?n.domIn(a,t):r.domIn(o,t))}coordsAt(e,t,n){let{tile:a,offset:s}=this.tile.resolveBlock(e,t);return a.isWidget()?a.widget instanceof Ar?null:a.coordsInWidget(s,t,!0):a.coordsIn(s,t,n)}lineAt(e,t){let{tile:n}=this.tile.resolveBlock(e,t);return n.isLine()?n:null}coordsForChar(e){let{tile:t,offset:n}=this.tile.resolveBlock(e,1);if(!t.isLine())return null;function a(s,r){if(s.isComposite())for(let o of s.children){if(o.length>=r){let l=a(o,r);if(l)return l}if(r-=o.length,r<0)break}else if(s.isText()&&rMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,l=this.view.textDirection==de.LTR,u=0,m=(c,d,h)=>{for(let g=0;ga);g++){let f=c.children[g],x=d+f.length,b=f.dom.getBoundingClientRect(),{height:y}=b;if(h&&!g&&(u+=b.top-h.top),f instanceof dn)x>n&&m(f,d,b);else if(d>=n&&(u>0&&t.push(-u),t.push(y+u),u=0,r)){let w=f.dom.lastChild,S=w?Fa(w):[];if(S.length){let z=S[S.length-1],k=l?z.right-b.left:b.right-z.left;k>o&&(o=k,this.minWidth=s,this.minWidthFrom=d,this.minWidthTo=x)}}h&&g==c.children.length-1&&(u+=h.bottom-b.bottom),d=x+f.breakAfter}};return m(this.tile,0,null),t}textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getComputedStyle(t.dom).direction=="rtl"?de.RTL:de.LTR}measureTextSize(){let e=this.tile.blockTiles(r=>{if(r.isLine()&&r.children.length&&r.length<=20){let o=0,l;for(let u of r.children){if(!u.isText()||/[^ -~]/.test(u.text))return;let m=Fa(u.dom);if(m.length!=1)return;o+=m[0].width,l=m[0].height}if(o)return{lineHeight:r.dom.getBoundingClientRect().height,charWidth:o/r.length,textHeight:l}}});if(e)return e;let t=document.createElement("div"),n,a,s;return t.className="cm-line",t.style.width="99999px",t.style.position="absolute",t.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore(()=>{this.tile.dom.appendChild(t);let r=Fa(t.firstChild)[0];n=t.getBoundingClientRect().height,a=r&&r.width?r.width/27:7,s=r&&r.height?r.height:n,t.remove()}),{lineHeight:n,charWidth:a,textHeight:s}}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let n=0,a=0;;a++){let s=a==t.viewports.length?null:t.viewports[a],r=s?s.from-1:this.view.state.doc.length;if(r>n){let o=(t.lineBlockAt(r).bottom-t.lineBlockAt(n).top)/this.view.scaleY;e.push(ue.replace({widget:new Ar(o),block:!0,inclusive:!0,isBlockGap:!0}).range(n,r))}if(!s)break;n=s.to+1}return ue.set(e)}updateDeco(){let e=1,t=this.view.state.facet(Qs).map(s=>(this.dynamicDecorationMap[e++]=typeof s=="function")?s(this.view):s),n=!1,a=this.view.state.facet(b0).map((s,r)=>{let o=typeof s=="function";return o&&(n=!0),o?s(this.view):s});for(a.length&&(this.dynamicDecorationMap[e++]=n,t.push(X.join(a))),this.decorations=[this.editContextFormatting,...t,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];etypeof s=="function"?s(this.view):s)}scrollIntoView(e){if(e.isSnapshot){let u=this.view.viewState.lineBlockAt(e.range.head);this.view.scrollDOM.scrollTop=u.top-e.yMargin,this.view.scrollDOM.scrollLeft=e.xMargin;return}for(let u of this.view.state.facet(Ug))try{if(u(this.view,e.range,e))return!0}catch(m){bt(this.view.state,m,"scroll handler")}let{range:t}=e,n=this.coordsAt(t.head,t.assoc||(t.head>t.anchor?-1:1)),a;if(!n)return;!t.empty&&(a=this.coordsAt(t.anchor,t.anchor>t.head?-1:1))&&(n={left:Math.min(n.left,a.left),top:Math.min(n.top,a.top),right:Math.max(n.right,a.right),bottom:Math.max(n.bottom,a.bottom)});let s=y0(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:l}=this.view.scrollDOM;if(PZ(this.view.scrollDOM,r,t.head1&&(n.top>window.visualViewport.offsetTop+window.visualViewport.height||n.bottomn.isWidget()||n.children.some(t);return t(this.tile.resolveBlock(e,1).tile)}destroy(){il(this.tile)}}function il(i,e){let t=e==null?void 0:e.get(i);if(t!=1){t==null&&i.destroy();for(let n of i.children)il(n,e)}}function iM(i){return Ee(i.node)&&i.node.firstChild&&(i.offset==0||i.node.childNodes[i.offset-1].contentEditable=="false")&&(i.offset==i.node.childNodes.length||i.node.childNodes[i.offset].contentEditable=="false")}function ip(i,e){let t=i.observer.selectionRange;if(!t.focusNode)return null;let n=Zg(t.focusNode,t.focusOffset),a=Mg(t.focusNode,t.focusOffset),s=n||a;if(a&&n&&a.node!=n.node){let o=ke.get(a.node);if(!o||o.isText()&&o.text!=a.node.nodeValue)s=a;else if(i.docView.lastCompositionAfterCursor){let l=ke.get(n.node);!l||l.isText()&&l.text!=n.node.nodeValue||(s=a)}}if(i.docView.lastCompositionAfterCursor=s!=n,!s)return null;let r=e-s.offset;return{from:r,to:r+s.node.nodeValue.length,node:s.node}}function aM(i,e,t){let n=ip(i,t);if(!n)return null;let{node:a,from:s,to:r}=n,o=a.nodeValue;if(/[\n\r]/.test(o)||i.state.doc.sliceString(n.from,n.to)!=o)return null;let l=e.invertedDesc;return{range:new jt(l.mapPos(s),l.mapPos(r),s,r),text:a}}function sM(i,e){return Ee(i)?(e&&i.childNodes[e-1].contentEditable=="false"?1:0)|(e{ne.from&&(t=!0)}),t}class Ar extends Ei{constructor(e){super(),this.height=e}toDOM(){let e=document.createElement("div");return e.className="cm-gap",this.updateDOM(e),e}eq(e){return e.height==this.height}updateDOM(e){return e.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}function dM(i,e,t=1){let n=i.charCategorizer(e),a=i.doc.lineAt(e),s=e-a.from;if(a.length==0)return B.cursor(e);s==0?t=1:s==a.length&&(t=-1);let r=s,o=s;t<0?r=Ke(a.text,s,!1):o=Ke(a.text,s);let l=n(a.text.slice(r,o));for(;r>0;){let u=Ke(a.text,r,!1);if(n(a.text.slice(u,r))!=l)break;r=u}for(;oi.defaultLineHeight*1.5){let o=i.viewState.heightOracle.textHeight,l=Math.floor((a-t.top-(i.defaultLineHeight-o)*.5)/o);s+=l*i.viewState.heightOracle.lineLength}let r=i.state.sliceDoc(t.from,t.to);return t.from+wZ(r,s,i.state.tabSize)}function al(i,e,t){let n=i.lineBlockAt(e);if(Array.isArray(n.type)){let a;for(let s of n.type){if(s.from>e)break;if(!(s.toe)return s;(!a||s.type==Ve.Text&&(a.type!=s.type||(t<0?s.frome)))&&(a=s)}}return a||n}return n}function gM(i,e,t,n){let a=al(i,e.head,e.assoc||-1),s=!n||a.type!=Ve.Text||!(i.lineWrapping||a.widgetLineBreaks)?null:i.coordsAtPos(e.assoc<0&&e.head>a.from?e.head-1:e.head);if(s){let r=i.dom.getBoundingClientRect(),o=i.textDirectionAt(a.from),l=i.posAndSideAtCoords({x:t==(o==de.LTR)?r.right-1:r.left+1,y:(s.top+s.bottom)/2});if(l)return B.cursor(l.pos,l.assoc)}return B.cursor(t?a.to:a.from,t?1:-1)}function Bm(i,e,t,n){let a=i.state.doc.lineAt(e.head),s=i.bidiSpans(a),r=i.textDirectionAt(a.from);for(let o=e,l=null;;){let u=FZ(a,s,r,o,t),m=Fg;if(!u){if(a.number==(t?i.state.doc.lines:1))return o;m=` +`,a=i.state.doc.line(a.number+(t?1:-1)),s=i.bidiSpans(a),u=t?B.cursor(a.from,-1):B.cursor(a.to,1)}if(l){if(!l(m))return o}else{if(!n)return u;l=n(m)}o=u}}function pM(i,e,t){let n=i.state.charCategorizer(e),a=n(t);return s=>{let r=n(s);return a==Pt.Space&&(a=r),a==r}}function fM(i,e,t,n){let a=e.head,s=t?1:-1;if(a==(t?i.state.doc.length:0))return B.cursor(a,e.assoc);let r=e.goalColumn,o,l=i.contentDOM.getBoundingClientRect(),u=i.coordsAtPos(a,e.assoc||((e.empty?t:e.head==e.from)?1:-1)),m=i.documentTop;if(u)r==null&&(r=u.left-l.left),o=s<0?u.top:u.bottom;else{let g=i.viewState.lineBlockAt(a);r==null&&(r=Math.min(l.right-l.left,i.defaultCharacterWidth*(a-g.from))),o=(s<0?g.top:g.bottom)+m}let c=l.left+r,d=i.viewState.heightOracle.textHeight>>1,h=n??d;for(let g=0;;g+=d){let f=o+(h+g)*s,x=sl(i,{x:c,y:f},!1,s);if(t?f>l.bottom:fo:y{if(e>s&&ea(i)),t.from,e.head>t.from?-1:1);return n==t.from?t:B.cursor(n,ni.viewState.docHeight)return new nn(i.state.doc.length,-1);if(u=i.elementAtHeight(l),n==null)break;if(u.type==Ve.Text){if(n<0?u.toi.viewport.to)break;let d=i.docView.coordsAt(n<0?u.from:u.to,n>0?-1:1);if(d&&(n<0?d.top<=l+s:d.bottom>=l+s))break}let c=i.viewState.heightOracle.textHeight/2;l=n>0?u.bottom+c:u.top-c}if(i.viewport.from>=u.to||i.viewport.to<=u.from){if(t)return null;if(u.type==Ve.Text){let c=hM(i,a,u,r,o);return new nn(c,c==u.from?1:-1)}}if(u.type!=Ve.Text)return l<(u.top+u.bottom)/2?new nn(u.from,1):new nn(u.to,-1);let m=i.docView.lineAt(u.from,2);return(!m||m.length!=u.length)&&(m=i.docView.lineAt(u.from,-2)),new xM(i,r,o,i.textDirectionAt(u.from)).scanTile(m,u.from)}class xM{constructor(e,t,n,a){this.view=e,this.x=t,this.y=n,this.baseDir=a,this.line=null,this.spans=null}bidiSpansAt(e){return(!this.line||this.line.from>e||this.line.to1||n.length&&(n[0].level!=this.baseDir||n[0].to+a.from>1;t:if(r.has(f)){for(let y=1;y=s&&(w-=g),!r.has(w)){f=w;break t}}break e}r.add(f);let x=t(f),b=0;if(x)for(let y=0;y1))if(w.bottomthis.y)(!u||u.top>w.top)&&(u=w),b=-1;else{let S=w.left>this.x?this.x-w.left:w.right(g+g+f)/3)return this.y=l.bottom-1,this.scan(e,t,!0);if(u&&u.top<(g+f+f)/3)return this.y=u.top+1,this.scan(e,t,!0)}let h=(o?this.dirAt(e[m],1):this.baseDir)==de.LTR;return{i:m,after:this.x>(d.left+d.right)/2==h}}scanText(e,t){let n=[];for(let s=0;s{let r=n[s]-t,o=n[s+1]-t;return Ti(e.dom,r,o).getClientRects()});return a.after?new nn(n[a.i+1],-1):new nn(n[a.i],1)}scanTile(e,t){if(!e.length)return new nn(t,1);if(e.children.length==1){let o=e.children[0];if(o.isText())return this.scanText(o,t);if(o.isComposite())return this.scanTile(o,t)}let n=[t];for(let o=0,l=t;o{let l=e.children[o];return l.flags&48?null:(Ee(l.dom)?l.dom:Ti(l.dom,0,l.length)).getClientRects()}),s=e.children[a.i],r=n[a.i];return s.isText()?this.scanText(s,r):s.isComposite()?this.scanTile(s,r):a.after?new nn(n[a.i+1],-1):new nn(r,1)}}const g1="￿";class bM{constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparator=t.state.facet(ie.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=g1}readRange(e,t){if(!e)return this;let n=e.parentNode;for(let a=e;;){this.findPointBefore(n,a);let s=this.text.length;this.readNode(a);let r=ke.get(a),o=a.nextSibling;if(o==t){r!=null&&r.breakAfter&&!o&&n!=this.view.contentDOM&&this.lineBreak();break}let l=ke.get(o);(r&&l?r.breakAfter:(r?r.breakAfter:xs(a))||xs(o)&&(a.nodeName!="BR"||r!=null&&r.isWidget())&&this.text.length>s)&&!vM(o,t)&&this.lineBreak(),a=o}return this.findPointBefore(n,t),this}readTextNode(e){let t=e.nodeValue;for(let n of this.points)n.node==e&&(n.pos=this.text.length+Math.min(n.offset,t.length));for(let n=0,a=this.lineSeparator?null:/\r\n?|\n/g;;){let s=-1,r=1,o;if(this.lineSeparator?(s=t.indexOf(this.lineSeparator,n),r=this.lineSeparator.length):(o=a.exec(t))&&(s=o.index,r=o[0].length),this.append(t.slice(n,s<0?t.length:s)),s<0)break;if(this.lineBreak(),r>1)for(let l of this.points)l.node==e&&l.pos>this.text.length&&(l.pos-=r-1);n=s+r}}readNode(e){let t=ke.get(e),n=t&&t.overrideDOMText;if(n!=null){this.findPointInside(e,n.length);for(let a=n.iter();!a.next().done;)a.lineBreak?this.lineBreak():this.append(a.value)}else A1(e)?this.readTextNode(e):e.nodeName=="BR"?e.nextSibling&&this.lineBreak():Ee(e)&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let n of this.points)n.node==e&&e.childNodes[n.offset]==t&&(n.pos=this.text.length)}findPointInside(e,t){for(let n of this.points)(A1(e)?n.node==e:e.contains(n.node))&&(n.pos=this.text.length+(yM(e,n.node,n.offset)?t:0))}}function yM(i,e,t){for(;;){if(!e||t-1;let{impreciseHead:s,impreciseAnchor:r}=e.docView,o=e.state.selection;if(e.state.readOnly&&t>-1)this.newSel=null;else if(t>-1&&(this.bounds=sp(e.docView.tile,t,n,0))){let l=s||r?[]:IM(e),u=new bM(l,e);u.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=u.text,this.newSel=kM(l,this.bounds.from)}else{let l=e.observer.selectionRange,u=s&&s.node==l.focusNode&&s.offset==l.focusOffset||!Xo(e.contentDOM,l.focusNode)?o.main.head:e.docView.posFromDOM(l.focusNode,l.focusOffset),m=r&&r.node==l.anchorNode&&r.offset==l.anchorOffset||!Xo(e.contentDOM,l.anchorNode)?o.main.anchor:e.docView.posFromDOM(l.anchorNode,l.anchorOffset),c=e.viewport;if((J.ios||J.chrome)&&u!=m&&Math.min(u,m)<=o.main.from&&Math.max(u,m)>=o.main.to&&(c.from>0||c.to-1&&o.ranges.length>1)this.newSel=o.replaceRange(B.range(m,u));else if(e.lineWrapping&&m==u&&!(o.main.empty&&o.main.head==u)&&e.inputState.lastTouchTime>Date.now()-100){let d=e.coordsAtPos(u,-1),h=0;d&&(h=e.inputState.lastTouchY<=d.bottom?-1:1),this.newSel=B.create([B.cursor(u,h)])}else this.newSel=B.single(m,u)}}}function sp(i,e,t,n){if(i.isComposite()){let a=-1,s=-1,r=-1,o=-1;for(let l=0,u=n,m=n;lt)return sp(c,e,t,u);if(d>=e&&a==-1&&(a=l,s=u),u>t&&c.dom.parentNode==i.dom){r=l,o=m;break}m=d,u=d+c.breakAfter}return{from:s,to:o<0?n+i.length:o,startDOM:(a?i.children[a-1].dom.nextSibling:null)||i.dom.firstChild,endDOM:r=0?i.children[r].dom:null}}else return i.isText()?{from:n,to:n+i.length,startDOM:i.dom,endDOM:i.dom.nextSibling}:null}function rp(i,e){let t,{newSel:n}=e,{state:a}=i,s=a.selection.main,r=i.inputState.lastKeyTime>Date.now()-100?i.inputState.lastKeyCode:-1;if(e.bounds){let{from:o,to:l}=e.bounds,u=s.from,m=null;(r===8||J.android&&e.text.length=o&&s.to<=l&&(e.typeOver||c!=e.text)&&c.slice(0,s.from-o)==e.text.slice(0,s.from-o)&&c.slice(s.to-o)==e.text.slice(d=e.text.length-(c.length-(s.to-o)))?t={from:s.from,to:s.to,insert:ae.of(e.text.slice(s.from-o,d).split(g1))}:(h=op(c,e.text,u-o,m))&&(J.chrome&&r==13&&h.toB==h.from+2&&e.text.slice(h.from,h.toB)==g1+g1&&h.toB--,t={from:o+h.from,to:o+h.toA,insert:ae.of(e.text.slice(h.from,h.toB).split(g1))})}else n&&(!i.hasFocus&&a.facet(mn)||rl(n,s))&&(n=null);if(!t&&!n)return!1;if((J.mac||J.android)&&t&&t.from==t.to&&t.from==s.head-1&&/^\. ?$/.test(t.insert.toString())&&i.contentDOM.getAttribute("autocorrect")=="off"?(n&&t.insert.length==2&&(n=B.single(n.main.anchor-1,n.main.head-1)),t={from:t.from,to:t.to,insert:ae.of([t.insert.toString().replace("."," ")])}):a.doc.lineAt(s.from).toDate.now()-50?t={from:s.from,to:s.to,insert:a.toText(i.inputState.insertingText)}:J.chrome&&t&&t.from==t.to&&t.from==s.head&&t.insert.toString()==` + `&&i.lineWrapping&&(n&&(n=B.single(n.main.anchor-1,n.main.head-1)),t={from:s.from,to:s.to,insert:ae.of([" "])}),t)return v0(i,t,n,r);if(n&&!rl(n,s)){let o=!1,l="select";return i.inputState.lastSelectionTime>Date.now()-50&&(i.inputState.lastSelectionOrigin=="select"&&(o=!0),l=i.inputState.lastSelectionOrigin,l=="select.pointer"&&(n=ap(a.facet(Ji).map(u=>u(i)),n))),i.dispatch({selection:n,scrollIntoView:o,userEvent:l}),!0}else return!1}function v0(i,e,t,n=-1){if(J.ios&&i.inputState.flushIOSKey(e))return!0;let a=i.state.selection.main;if(J.android&&(e.to==a.to&&(e.from==a.from||e.from==a.from-1&&i.state.sliceDoc(e.from,a.from)==" ")&&e.insert.length==1&&e.insert.lines==2&&k1(i.contentDOM,"Enter",13)||(e.from==a.from-1&&e.to==a.to&&e.insert.length==0||n==8&&e.insert.lengtha.head)&&k1(i.contentDOM,"Backspace",8)||e.from==a.from&&e.to==a.to+1&&e.insert.length==0&&k1(i.contentDOM,"Delete",46)))return!0;let s=e.insert.toString();i.inputState.composing>=0&&i.inputState.composing++;let r,o=()=>r||(r=zM(i,e,t));return i.state.facet(Vg).some(l=>l(i,e.from,e.to,s,o))||i.dispatch(o()),!0}function zM(i,e,t){let n,a=i.state,s=a.selection.main,r=-1;if(e.from==e.to&&e.froms.to){let l=e.fromc(i)),u,l);e.from==m&&(r=m)}if(r>-1)n={changes:e,selection:B.cursor(e.from+e.insert.length,-1)};else if(e.from>=s.from&&e.to<=s.to&&e.to-e.from>=(s.to-s.from)/3&&(!t||t.main.empty&&t.main.from==e.from+e.insert.length)&&i.inputState.composing<0){let l=s.frome.to?a.sliceDoc(e.to,s.to):"";n=a.replaceSelection(i.state.toText(l+e.insert.sliceString(0,void 0,i.state.lineBreak)+u))}else{let l=a.changes(e),u=t&&t.main.to<=l.newLength?t.main:void 0;if(a.selection.ranges.length>1&&(i.inputState.composing>=0||i.inputState.compositionPendingChange)&&e.to<=s.to+10&&e.to>=s.to-10){let m=i.state.sliceDoc(e.from,e.to),c,d=t&&ip(i,t.main.head);if(d){let g=e.insert.length-(e.to-e.from);c={from:d.from,to:d.to-g}}else c=i.state.doc.lineAt(s.head);let h=s.to-e.to;n=a.changeByRange(g=>{if(g.from==s.from&&g.to==s.to)return{changes:l,range:u||g.map(l)};let f=g.to-h,x=f-m.length;if(i.state.sliceDoc(x,f)!=m||f>=c.from&&x<=c.to)return{range:g};let b=a.changes({from:x,to:f,insert:e.insert}),y=g.to-s.to;return{changes:b,range:u?B.range(Math.max(0,u.anchor+y),Math.max(0,u.head+y)):g.map(b)}})}else n={changes:l,selection:u&&a.selection.replaceRange(u)}}let o="input.type";return(i.composing||i.inputState.compositionPendingChange&&i.inputState.compositionEndedAt>Date.now()-50)&&(i.inputState.compositionPendingChange=!1,o+=".compose",i.inputState.compositionFirstChange&&(o+=".start",i.inputState.compositionFirstChange=!1)),a.update(n,{userEvent:o,scrollIntoView:!0})}function op(i,e,t,n){let a=Math.min(i.length,e.length),s=0;for(;s0&&o>0&&i.charCodeAt(r-1)==e.charCodeAt(o-1);)r--,o--;if(n=="end"){let l=Math.max(0,s-Math.min(r,o));t-=r+l-s}if(r=r?s-t:0;s-=l,o=s+(o-r),r=s}else if(o=o?s-t:0;s-=l,r=s+(r-o),o=s}return{from:s,toA:r,toB:o}}function IM(i){let e=[];if(i.root.activeElement!=i.contentDOM)return e;let{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}=i.observer.selectionRange;return t&&(e.push(new Dm(t,n)),(a!=t||s!=n)&&e.push(new Dm(a,s))),e}function kM(i,e){if(i.length==0)return null;let t=i[0].pos,n=i.length==2?i[1].pos:t;return t<0||n<0?null:t==n?B.create([B.cursor(n+e,-1)]):B.single(t+e,n+e)}function rl(i,e){return e.head==i.main.head&&e.anchor==i.main.anchor}class SM{setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=Date.now()}constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.touchActive=!1,this.lastTouchTime=0,this.lastTouchX=0,this.lastTouchY=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.lastWheelEvent=0,this.pendingIOSKey=void 0,this.lastIOSMomentumScroll=0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.insertingText="",this.insertingTextAt=0,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=e.hasFocus,J.safari&&e.contentDOM.addEventListener("input",()=>null),J.gecko&&FM(e.contentDOM.ownerDocument)}handleEvent(e){!DM(this.view,e)||this.ignoreDuringComposition(e)||e.type=="keydown"&&this.keydown(e)||(this.view.updateState!=0?Promise.resolve().then(()=>this.runHandlers(e.type,e)):this.runHandlers(e.type,e))}runHandlers(e,t){let n=this.handlers[e];if(n){for(let a of n.observers)a(this.view,t);for(let a of n.handlers){if(t.defaultPrevented)break;if(a(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=TM(e),n=this.handlers,a=this.view.contentDOM;for(let s in t)if(s!="scroll"){let r=!t[s].handlers.length,o=n[s];o&&r!=!o.handlers.length&&(a.removeEventListener(s,this.handleEvent),o=null),o||a.addEventListener(s,this.handleEvent,{passive:r})}for(let s in n)s!="scroll"&&!t[s]&&a.removeEventListener(s,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.keyCode==9&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&e.keyCode!=27&&up.indexOf(e.keyCode)<0&&(this.tabFocusMode=-1),J.android&&J.chrome&&!e.synthetic&&(e.keyCode==13||e.keyCode==8))return this.view.observer.delayAndroidKey(e.key,e.keyCode),!0;if(J.ios&&!e.synthetic&&!e.altKey&&!e.metaKey&&(lp.some(t=>t.keyCode==e.keyCode)&&!e.ctrlKey||OM.indexOf(e.key)>-1&&e.ctrlKey)){let t={ctrlKey:e.ctrlKey,altKey:e.altKey,metaKey:e.metaKey,shiftKey:e.shiftKey};t.shiftKey&&J.ios&&!/^(off|none)$/.test(this.view.contentDOM.autocapitalize)&&_M(this.view.win)&&(t.shiftKey=!1);let n=this.pendingIOSKey={key:e.key,keyCode:e.keyCode,mods:t};return setTimeout(()=>{this.pendingIOSKey==n&&this.flushIOSKey()},50),!0}return e.keyCode!=229&&this.view.observer.forceFlush(),!1}flushIOSKey(e){let t=this.pendingIOSKey;return!t||this.view.observer.pendingRecords().length||t.key=="Enter"&&e&&e.from0?!0:J.safari&&!J.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100?(this.compositionPendingKey=!1,!0):!1}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSelection.update(e),this.draggedContent&&e.docChanged&&(this.draggedContent=this.draggedContent.map(e.changes)),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function _M(i){return i.visualViewport?i.visualViewport.height*i.visualViewport.scale/i.document.documentElement.clientHeight<.85:!1}function Zm(i,e){return(t,n)=>{try{return e.call(i,n,t)}catch(a){bt(t.state,a)}}}function TM(i){let e=Object.create(null);function t(n){return e[n]||(e[n]={observers:[],handlers:[]})}for(let n of i){let a=n.spec,s=a&&a.plugin.domEventHandlers,r=a&&a.plugin.domEventObservers;if(s)for(let o in s){let l=s[o];l&&t(o).handlers.push(Zm(n.value,l))}if(r)for(let o in r){let l=r[o];l&&t(o).observers.push(Zm(n.value,l))}}for(let n in Gt)t(n).handlers.push(Gt[n]);for(let n in ot)t(n).observers.push(ot[n]);return e}const lp=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],OM="dthko",up=[16,17,18,20,91,92,224,225],ga=6;function pa(i){return Math.max(0,i)*.7+8}function AM(i,e){return Math.max(Math.abs(i.clientX-e.clientX),Math.abs(i.clientY-e.clientY))}class PM{constructor(e,t,n,a){this.view=e,this.startEvent=t,this.style=n,this.mustSelect=a,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParents=Pg(e.contentDOM),this.atoms=e.state.facet(Ji).map(r=>r(e));let s=e.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(ie.allowMultipleSelections)&&jM(e,t),this.dragging=BM(e,t)&&dp(t)==1?null:!1}start(e){this.dragging===!1&&this.select(e)}move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dragging==null&&AM(this.startEvent,e)<10)return;this.select(this.lastEvent=e);let t=0,n=0,a=0,s=0,r=this.view.win.innerWidth,o=this.view.win.innerHeight;this.scrollParents.x&&({left:a,right:r}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:s,bottom:o}=this.scrollParents.y.getBoundingClientRect());let l=y0(this.view);e.clientX-l.left<=a+ga?t=-pa(a-e.clientX):e.clientX+l.right>=r-ga&&(t=pa(e.clientX-r)),e.clientY-l.top<=s+ga?n=-pa(s-e.clientY):e.clientY+l.bottom>=o-ga&&(n=pa(e.clientY-o)),this.setScrollSpeed(t,n)}up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval(()=>this.scroll(),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=e,e=0),t&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=t,t=0),(e||t)&&this.view.win.scrollBy(e,t),this.dragging===!1&&this.select(this.lastEvent)}select(e){let{view:t}=this,n=ap(this.atoms,this.style.get(e,this.extend,this.multiple));(this.mustSelect||!n.eq(t.state.selection,this.dragging===!1))&&this.view.dispatch({selection:n,userEvent:"select.pointer"}),this.mustSelect=!1}update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destroy():this.style.update(e)&&setTimeout(()=>this.select(this.lastEvent),20)}}function jM(i,e){let t=i.state.facet(Jg);return t.length?t[0](e):J.mac?e.metaKey:e.ctrlKey}function CM(i,e){let t=i.state.facet(Rg);return t.length?t[0](e):J.mac?!e.altKey:!e.ctrlKey}function BM(i,e){let{main:t}=i.state.selection;if(t.empty)return!1;let n=_i(i.root);if(!n||n.rangeCount==0)return!0;let a=n.getRangeAt(0).getClientRects();for(let s=0;s=e.clientX&&r.top<=e.clientY&&r.bottom>=e.clientY)return!0}return!1}function DM(i,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let t=e.target,n;t!=i.contentDOM;t=t.parentNode)if(!t||t.nodeType==11||(n=ke.get(t))&&n.isWidget()&&!n.isHidden&&n.widget.ignoreEvent(e))return!1;return!0}const Gt=Object.create(null),ot=Object.create(null),mp=J.ie&&J.ie_version<15||J.ios&&J.webkit_version<604;function ZM(i){let e=i.dom.parentNode;if(!e)return;let t=e.appendChild(document.createElement("textarea"));t.style.cssText="position: fixed; left: -10000px; top: 10px",t.focus(),setTimeout(()=>{i.focus(),t.remove(),cp(i,t.value)},50)}function $s(i,e,t){for(let n of i.facet(e))t=n(t,i);return t}function cp(i,e){e=$s(i.state,p0,e);let{state:t}=i,n,a=1,s=t.toText(e),r=s.lines==t.selection.ranges.length;if(ol!=null&&t.selection.ranges.every(l=>l.empty)&&ol==s.toString()){let l=-1;n=t.changeByRange(u=>{let m=t.doc.lineAt(u.from);if(m.from==l)return{range:u};l=m.from;let c=t.toText((r?s.line(a++).text:e)+t.lineBreak);return{changes:{from:m.from,insert:c},range:B.cursor(u.from+c.length,-1)}})}else r?n=t.changeByRange(l=>{let u=s.line(a++);return{changes:{from:l.from,to:l.to,insert:u.text},range:B.cursor(l.from+u.length,-1)}}):n=t.replaceSelection(s);i.dispatch(n,{userEvent:"input.paste",scrollIntoView:!0})}ot.scroll=i=>{let e=i.inputState;e.lastScrollTop=i.scrollDOM.scrollTop,e.lastScrollLeft=i.scrollDOM.scrollLeft,J.ios&&!e.touchActive&&(e.lastIOSMomentumScroll=Date.now())};ot.wheel=ot.mousewheel=i=>{i.inputState.lastWheelEvent=Date.now()};Gt.keydown=(i,e)=>(i.inputState.setSelectionOrigin("select"),e.keyCode==27&&i.inputState.tabFocusMode!=0&&(i.inputState.tabFocusMode=Date.now()+2e3),!1);ot.touchstart=(i,e)=>{let t=i.inputState,n=e.targetTouches[0];t.touchActive=!0,t.lastTouchTime=Date.now(),n&&(t.lastTouchX=n.clientX,t.lastTouchY=n.clientY),t.setSelectionOrigin("select.pointer")};ot.touchmove=i=>{i.inputState.setSelectionOrigin("select.pointer")};ot.touchend=(i,e)=>{i.inputState.touchActive=!1};Gt.mousedown=(i,e)=>{if(i.observer.flush(),i.inputState.lastTouchTime>Date.now()-2e3)return!1;let t=null;for(let n of i.state.facet(Gg))if(t=n(i,e),t)break;if(!t&&e.button==0&&(t=LM(i,e)),t){let n=!i.hasFocus;i.inputState.startMouseSelection(new PM(i,e,t,n)),n&&i.observer.ignore(()=>{Bg(i.contentDOM);let s=i.root.activeElement;s&&!s.contains(i.contentDOM)&&s.blur()});let a=i.inputState.mouseSelection;if(a)return a.start(e),a.dragging===!1}else i.inputState.setSelectionOrigin("select.pointer");return!1};function Mm(i,e,t,n){if(n==1)return B.cursor(e,t);if(n==2)return dM(i.state,e,t);{let a=i.docView.lineAt(e,t),s=i.state.doc.lineAt(a?a.posAtEnd:e),r=a?a.posAtStart:s.from,o=a?a.posAtEnd:s.to;return oDate.now()-400&&Math.abs(e.clientX-i.clientX)<2&&Math.abs(e.clientY-i.clientY)<2?(Wm+1)%3:1}function LM(i,e){let t=i.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1),n=dp(e),a=i.state.selection;return{update(s){s.docChanged&&(t.pos=s.changes.mapPos(t.pos),a=a.map(s.changes))},get(s,r,o){let l=i.posAndSideAtCoords({x:s.clientX,y:s.clientY},!1),u,m=Mm(i,l.pos,l.assoc,n);if(t.pos!=l.pos&&!r){let c=Mm(i,t.pos,t.assoc,n),d=Math.min(c.from,m.from),h=Math.max(c.to,m.to);m=d1&&(u=WM(a,l.pos))?u:o?a.addRange(m):B.create([m])}}}function WM(i,e){for(let t=0;t=e)return B.create(i.ranges.slice(0,t).concat(i.ranges.slice(t+1)),i.mainIndex==t?0:i.mainIndex-(i.mainIndex>t?1:0))}return null}Gt.dragstart=(i,e)=>{let{selection:{main:t}}=i.state;if(e.target.draggable){let a=i.docView.tile.nearest(e.target);if(a&&a.isWidget()){let s=a.posAtStart,r=s+a.length;(s>=t.to||r<=t.from)&&(t=B.undirectionalRange(s,r))}}let{inputState:n}=i;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=t,e.dataTransfer&&(e.dataTransfer.setData("Text",$s(i.state,f0,i.state.sliceDoc(t.from,t.to))),e.dataTransfer.effectAllowed="copyMove"),!1};Gt.dragend=i=>(i.inputState.draggedContent=null,!1);function Nm(i,e,t,n){if(t=$s(i.state,p0,t),!t)return;let a=i.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:s}=i.inputState,r=n&&s&&CM(i,e)?{from:s.from,to:s.to}:null,o={from:a,insert:t},l=i.state.changes(r?[r,o]:o);i.focus(),i.dispatch({changes:l,selection:{anchor:l.mapPos(a,-1),head:l.mapPos(a,1)},userEvent:r?"move.drop":"input.drop"}),i.inputState.draggedContent=null}Gt.drop=(i,e)=>{if(!e.dataTransfer)return!1;if(i.state.readOnly)return!0;let t=e.dataTransfer.files;if(t&&t.length){let n=Array(t.length),a=0,s=()=>{++a==t.length&&Nm(i,e,n.filter(r=>r!=null).join(i.state.lineBreak),!1)};for(let r=0;r{/[\x00-\x08\x0e-\x1f]{2}/.test(o.result)||(n[r]=o.result),s()},o.readAsText(t[r])}return!0}else{let n=e.dataTransfer.getData("Text");if(n)return Nm(i,e,n,!0),!0}return!1};Gt.paste=(i,e)=>{if(i.state.readOnly)return!0;i.observer.flush();let t=mp?null:e.clipboardData;return t?(cp(i,t.getData("text/plain")||t.getData("text/uri-list")),!0):(ZM(i),!1)};function EM(i,e){let t=i.dom.parentNode;if(!t)return;let n=t.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout(()=>{n.remove(),i.focus()},50)}function NM(i){let e=[],t=[],n=!1;for(let a of i.selection.ranges)a.empty||(e.push(i.sliceDoc(a.from,a.to)),t.push(a));if(!e.length){let a=-1;for(let{from:s}of i.selection.ranges){let r=i.doc.lineAt(s);r.number>a&&(e.push(r.text),t.push({from:r.from,to:Math.min(i.doc.length,r.to+1)})),a=r.number}n=!0}return{text:$s(i,f0,e.join(i.lineBreak)),ranges:t,linewise:n}}let ol=null;Gt.copy=Gt.cut=(i,e)=>{if(!mi(i.contentDOM,i.observer.selectionRange))return!1;let{text:t,ranges:n,linewise:a}=NM(i.state);if(!t&&!a)return!1;ol=a?t:null,e.type=="cut"&&!i.state.readOnly&&i.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let s=mp?null:e.clipboardData;return s?(s.clearData(),s.setData("text/plain",t),!0):(EM(i,t),!1)};const hp=Ln.define();function gp(i,e){let t=[];for(let n of i.facet(Qg)){let a=n(i,e);a&&t.push(a)}return t.length?i.update({effects:t,annotations:hp.of(!0)}):null}function pp(i){setTimeout(()=>{let e=i.hasFocus;if(e!=i.inputState.notifiedFocused){let t=gp(i.state,e);t?i.dispatch(t):i.update([])}},10)}ot.focus=i=>{i.inputState.lastFocusTime=Date.now(),!i.scrollDOM.scrollTop&&(i.inputState.lastScrollTop||i.inputState.lastScrollLeft)&&(i.scrollDOM.scrollTop=i.inputState.lastScrollTop,i.scrollDOM.scrollLeft=i.inputState.lastScrollLeft),pp(i)};ot.blur=i=>{i.observer.clearSelectionRange(),pp(i)};ot.compositionstart=ot.compositionupdate=(i,e)=>{if(!i.observer.editContext&&(i.inputState.compositionFirstChange==null&&(i.inputState.compositionFirstChange=!0),i.inputState.composing<0)){let{main:t}=i.state.selection;!t.empty&&i.lineBlockAt(t.from).from!=i.lineBlockAt(t.to).from&&!i.state.readOnly&&i.dispatch({changes:i.state.selection.ranges.filter(n=>!n.empty).map(n=>({from:n.from,to:n.to})),userEvent:"input"}),i.inputState.composing=0}};ot.compositionend=i=>{i.observer.editContext||(i.inputState.composing=-1,i.inputState.compositionEndedAt=Date.now(),i.inputState.compositionPendingKey=!0,i.inputState.compositionPendingChange=i.observer.pendingRecords().length>0,i.inputState.compositionFirstChange=null,J.chrome&&J.android?i.observer.flushSoon():i.inputState.compositionPendingChange?Promise.resolve().then(()=>i.observer.flush()):setTimeout(()=>{i.inputState.composing<0&&i.docView.hasComposition&&i.update([])},50))};ot.contextmenu=i=>{i.inputState.lastContextMenu=Date.now()};Gt.beforeinput=(i,e)=>{var t,n;if((e.inputType=="insertText"||e.inputType=="insertCompositionText")&&(i.inputState.insertingText=e.data,i.inputState.insertingTextAt=Date.now()),e.inputType=="insertReplacementText"&&i.observer.editContext){let s=(t=e.dataTransfer)===null||t===void 0?void 0:t.getData("text/plain"),r=e.getTargetRanges();if(s&&r.length){let o=r[0],l=i.posAtDOM(o.startContainer,o.startOffset),u=i.posAtDOM(o.endContainer,o.endOffset);return v0(i,{from:l,to:u,insert:i.state.toText(s)},null),!0}}let a;if(J.chrome&&J.android&&(a=lp.find(s=>s.inputType==e.inputType))&&(i.observer.delayAndroidKey(a.key,a.keyCode),a.key=="Backspace"||a.key=="Delete")){let s=((n=window.visualViewport)===null||n===void 0?void 0:n.height)||0;setTimeout(()=>{var r;(((r=window.visualViewport)===null||r===void 0?void 0:r.height)||0)>s+10&&i.hasFocus&&(i.contentDOM.blur(),i.focus())},100)}return J.ios&&e.inputType=="deleteContentForward"&&i.observer.flushSoon(),J.safari&&e.inputType=="insertText"&&i.inputState.composing>=0&&setTimeout(()=>ot.compositionend(i,e),20),!1};const Fm=new Set;function FM(i){Fm.has(i)||(Fm.add(i),i.addEventListener("copy",()=>{}),i.addEventListener("cut",()=>{}))}const Jm=["pre-wrap","normal","pre-line","break-spaces"];let B1=!1;function Rm(){B1=!1}class JM{constructor(e){this.lineWrapping=e,this.doc=ae.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(e,t){let n=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(n+=Math.max(0,Math.ceil((t-e-n*this.lineLength*.5)/this.lineLength))),this.lineHeight*n}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/Math.max(1,this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return Jm.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let n=0;n-1,l=Math.abs(t-this.lineHeight)>.3||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=t,this.charWidth=n,this.textHeight=a,this.lineLength=s,l){this.heightSamples={};for(let u=0;u0}set outdated(e){this.flags=(e?2:0)|this.flags&-3}setHeight(e){this.height!=e&&(Math.abs(this.height-e)>Ja&&(B1=!0),this.height=e)}replace(e,t,n){return rt.of(n)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,n,a){let s=this,r=n.doc;for(let o=a.length-1;o>=0;o--){let{fromA:l,toA:u,fromB:m,toB:c}=a[o],d=s.lineAt(l,pe.ByPosNoHeight,n.setDoc(t),0,0),h=d.to>=u?d:s.lineAt(u,pe.ByPosNoHeight,n,0,0);for(c+=h.to-u,u=h.to;o>0&&d.from<=a[o-1].toA;)l=a[o-1].fromA,m=a[o-1].fromB,o--,ls*2){let o=e[t-1];o.break?e.splice(--t,1,o.left,null,o.right):e.splice(--t,1,o.left,o.right),n+=1+o.break,a-=o.size}else if(s>a*2){let o=e[n];o.break?e.splice(n,1,o.left,null,o.right):e.splice(n,1,o.left,o.right),n+=2+o.break,s-=o.size}else break;else if(a=s&&r(this.lineAt(0,pe.ByPos,n,a,s))}setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,t=e.heights[e.index++]):this.spaceAbove=0,this.setHeight(t)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more&&this.setMeasuredHeight(a),this.outdated=!1,this}toString(){return`block(${this.length})`}}class xt extends fp{constructor(e,t,n){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0,this.spaceAbove=n}mainBlock(e,t){return new Ft(t,this.length,e+this.spaceAbove,this.height-this.spaceAbove,this.breaks)}replace(e,t,n){let a=n[0];return n.length==1&&(a instanceof xt||a instanceof Je&&a.flags&4)&&Math.abs(this.length-a.length)<10?(a instanceof Je?a=new xt(a.length,this.height,this.spaceAbove):a.height=this.height,this.outdated||(a.outdated=!1),a):rt.of(n)}updateHeight(e,t=0,n=!1,a){return a&&a.from<=t&&a.more?this.setMeasuredHeight(a):(n||this.outdated)&&(this.spaceAbove=0,this.setHeight(Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight)),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class Je extends rt{constructor(e){super(e,0)}heightMetrics(e,t){let n=e.doc.lineAt(t).number,a=e.doc.lineAt(t+this.length).number,s=a-n+1,r,o=0;if(e.lineWrapping){let l=Math.min(this.height,e.lineHeight*s);r=l/s,this.length>s+1&&(o=(this.height-l)/(this.length-s-1))}else r=this.height/s;return{firstLine:n,lastLine:a,perLine:r,perChar:o}}blockAt(e,t,n,a){let{firstLine:s,lastLine:r,perLine:o,perChar:l}=this.heightMetrics(t,a);if(t.lineWrapping){let u=a+(e0){let s=n[n.length-1];s instanceof Je?n[n.length-1]=new Je(s.length+a):n.push(null,new Je(a-1))}if(e>0){let s=n[0];s instanceof Je?n[0]=new Je(e+s.length):n.unshift(new Je(e-1),null)}return rt.of(n)}decomposeLeft(e,t){t.push(new Je(e-1),null)}decomposeRight(e,t){t.push(null,new Je(this.length-e-1))}updateHeight(e,t=0,n=!1,a){let s=t+this.length;if(a&&a.from<=t+this.length&&a.more){let r=[],o=Math.max(t,a.from),l=-1;for(a.from>t&&r.push(new Je(a.from-t-1).updateHeight(e,t));o<=s&&a.more;){let m=e.doc.lineAt(o).length;r.length&&r.push(null);let c=a.heights[a.index++],d=0;c<0&&(d=-c,c=a.heights[a.index++]),l==-1?l=c:Math.abs(c-l)>=Ja&&(l=-2);let h=new xt(m,c,d);h.outdated=!1,r.push(h),o+=m+1}o<=s&&r.push(null,new Je(s-o).updateHeight(e,o));let u=rt.of(r);return(l<0||Math.abs(u.height-this.height)>=Ja||Math.abs(l-this.heightMetrics(e,t).perLine)>=Ja)&&(B1=!0),zs(this,u)}else(n||this.outdated)&&(this.setHeight(e.heightForGap(t,t+this.length)),this.outdated=!1);return this}toString(){return`gap(${this.length})`}}class HM extends rt{constructor(e,t,n){super(e.length+(t?1:0)+n.length,e.height+n.height,(t?1:0)|(e.outdated||n.outdated?2:0)),this.left=e,this.right=n,this.size=e.size+n.size}get break(){return this.flags&1}blockAt(e,t,n,a){let s=n+this.left.height;return eo))return u;let m=t==pe.ByPosNoHeight?pe.ByPosNoHeight:pe.ByPos;return l?u.join(this.right.lineAt(o,m,n,r,o)):this.left.lineAt(o,m,n,a,s).join(u)}forEachLine(e,t,n,a,s,r){let o=a+this.left.height,l=s+this.left.length+this.break;if(this.break)e=l&&this.right.forEachLine(e,t,n,o,l,r);else{let u=this.lineAt(l,pe.ByPos,n,a,s);e=e&&u.from<=t&&r(u),t>u.to&&this.right.forEachLine(Math.max(e,u.to+1),t,n,o,l,r)}}replace(e,t,n){let a=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-a,t-a,n));let s=[];e>0&&this.decomposeLeft(e,s);let r=s.length;for(let o of n)s.push(o);if(e>0&&Gm(s,r-1),t=n&&t.push(null)),e>n&&this.right.decomposeLeft(e-n,t)}decomposeRight(e,t){let n=this.left.length,a=n+this.break;if(e>=a)return this.right.decomposeRight(e-a,t);e2*t.size||t.size>2*e.size?rt.of(this.break?[e,null,t]:[e,t]):(this.left=zs(this.left,e),this.right=zs(this.right,t),this.setHeight(e.height+t.height),this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,n=!1,a){let{left:s,right:r}=this,o=t+s.length+this.break,l=null;return a&&a.from<=t+s.length&&a.more?l=s=s.updateHeight(e,t,n,a):s.updateHeight(e,t,n),a&&a.from<=o+r.length&&a.more?l=r=r.updateHeight(e,o,n,a):r.updateHeight(e,o,n),l?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function Gm(i,e){let t,n;i[e]==null&&(t=i[e-1])instanceof Je&&(n=i[e+1])instanceof Je&&i.splice(e-1,3,new Je(t.length+1+n.length))}const VM=5;class w0{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let n=Math.min(t,this.lineEnd),a=this.nodes[this.nodes.length-1];a instanceof xt?a.length+=n-this.pos:(n>this.pos||!this.isCovered)&&this.nodes.push(new xt(n-this.pos,-1,0)),this.writtenTo=n,t>n&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,n){if(e=VM)&&this.addLineDeco(a,s,r)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new xt(this.pos-e,-1,0)),this.writtenTo=this.pos}blankContent(e,t){let n=new Je(t-e);return this.oracle.doc.lineAt(e).to==t&&(n.flags|=4),n}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof xt)return e;let t=new xt(0,-1,0);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,n){let a=this.ensureLine();a.length+=n,a.collapsed+=n,a.widgetHeight=Math.max(a.widgetHeight,e),a.breaks+=t,this.writtenTo=this.pos=this.pos+n}finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1];this.lineStart>-1&&!(t instanceof xt)&&!this.isCovered?this.nodes.push(new xt(0,-1,0)):(this.writtenTou.clientHeight||u.scrollWidth>u.clientWidth)&&m.overflow!="visible"){let c=u.getBoundingClientRect();s=Math.max(s,c.left),r=Math.min(r,c.right),o=Math.max(o,c.top),l=Math.min(u==i.parentNode?a.innerHeight:l,c.bottom)}u=m.position=="absolute"||m.position=="fixed"?u.offsetParent:u.parentNode}else if(u.nodeType==11)u=u.host;else break;return{left:s-t.left,right:Math.max(s,r)-t.left,top:o-(t.top+e),bottom:Math.max(o,l)-(t.top+e)}}function $M(i){let e=i.getBoundingClientRect(),t=i.ownerDocument.defaultView||window;return e.left0&&e.top0}function YM(i,e){let t=i.getBoundingClientRect();return{left:0,right:t.right-t.left,top:e,bottom:t.bottom-(t.top+e)}}class jr{constructor(e,t,n,a){this.from=e,this.to=t,this.size=n,this.displaySize=a}static same(e,t){if(e.length!=t.length)return!1;for(let n=0;ntypeof a!="function"&&a.class=="cm-lineWrapping");this.heightOracle=new JM(n),this.stateDeco=Vm(t),this.heightMap=rt.empty().applyChanges(this.stateDeco,ae.empty,this.heightOracle.setDoc(t.doc),[new jt(0,0,0,t.doc.length)]);for(let a=0;a<2&&(this.viewport=this.getViewport(0,null),!!this.updateForViewport());a++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ue.set(this.lineGaps.map(a=>a.draw(this,!1))),this.scrollParent=e.scrollDOM,this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let n=0;n<=1;n++){let a=n?t.head:t.anchor;if(!e.some(({from:s,to:r})=>a>=s&&a<=r)){let{from:s,to:r}=this.lineBlockAt(a);e.push(new fa(s,r))}}return this.viewports=e.sort((n,a)=>n.from-a.from),this.updateScaler()}updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.height<=7e6?ll:Is.get(this.heightOracle,this.heightMap,this.viewports),e.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,e=>{this.viewportLines.push(ei(e,this.scaler))})}update(e,t=null){this.state=e.state;let n=this.stateDeco;this.stateDeco=Vm(this.state);let a=e.changedRanges,s=jt.extendWithRanges(a,QM(n,this.stateDeco,e?e.changes:Le.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollOffset);Rm(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),s),(this.heightMap.height!=r||B1)&&(e.flags|=2),o?(this.scrollAnchorPos=e.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=r);let l=s.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.headl.to)||!this.viewportIsAppropriate(l))&&(l=this.getViewport(0,t));let u=l.from!=this.viewport.from||l.to!=this.viewport.to;this.viewport=l,e.flags|=this.updateForViewport(),(u||!e.changes.empty||e.flags&2)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(e.changes),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&(e.selectionSet||e.focusChanged)&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(RZ)&&(this.mustEnforceCursorAssoc=!0)}measure(){let{view:e}=this,t=e.contentDOM,n=window.getComputedStyle(t),a=this.heightOracle,s=n.whiteSpace;this.defaultTextDirection=n.direction=="rtl"?de.RTL:de.LTR;let r=this.heightOracle.mustRefreshForWrapping(s)||this.mustMeasureContent==="refresh",o=t.getBoundingClientRect(),l=r||this.mustMeasureContent||this.contentDOMHeight!=o.height;this.contentDOMHeight=o.height,this.mustMeasureContent=!1;let u=0,m=0;if(o.width&&o.height){let{scaleX:z,scaleY:k}=Ag(t,o);(z>.005&&Math.abs(this.scaleX-z)>.005||k>.005&&Math.abs(this.scaleY-k)>.005)&&(this.scaleX=z,this.scaleY=k,u|=16,r=l=!0)}let c=(parseInt(n.paddingTop)||0)*this.scaleY,d=(parseInt(n.paddingBottom)||0)*this.scaleY;(this.paddingTop!=c||this.paddingBottom!=d)&&(this.paddingTop=c,this.paddingBottom=d,u|=18),this.editorWidth!=e.scrollDOM.clientWidth&&(a.lineWrapping&&(l=!0),this.editorWidth=e.scrollDOM.clientWidth,u|=16);let h=Pg(this.view.contentDOM,!1).y;h!=this.scrollParent&&(this.scrollParent=h,this.scrollAnchorHeight=-1,this.scrollOffset=0);let g=this.getScrollOffset();this.scrollOffset!=g&&(this.scrollAnchorHeight=-1,this.scrollOffset=g),this.scrolledToBottom=Dg(this.scrollParent||e.win);let f=(this.printing?YM:UM)(t,this.paddingTop),x=f.top-this.pixelViewport.top,b=f.bottom-this.pixelViewport.bottom;this.pixelViewport=f;let y=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(y!=this.inView&&(this.inView=y,y&&(l=!0)),!this.inView&&!this.scrollTarget&&!$M(e.dom))return 0;let w=o.width;if((this.contentDOMWidth!=w||this.editorHeight!=e.scrollDOM.clientHeight)&&(this.contentDOMWidth=o.width,this.editorHeight=e.scrollDOM.clientHeight,u|=16),l){let z=e.docView.measureVisibleLineHeights(this.viewport);if(a.mustRefreshForHeights(z)&&(r=!0),r||a.lineWrapping&&Math.abs(w-this.contentDOMWidth)>a.charWidth){let{lineHeight:k,charWidth:_,textHeight:T}=e.docView.measureTextSize();r=k>0&&a.refresh(s,k,_,T,Math.max(5,w/_),z),r&&(e.docView.minWidth=0,u|=16)}x>0&&b>0?m=Math.max(x,b):x<0&&b<0&&(m=Math.min(x,b)),Rm();for(let k of this.viewports){let _=k.from==this.viewport.from?z:e.docView.measureVisibleLineHeights(k);this.heightMap=(r?rt.empty().applyChanges(this.stateDeco,ae.empty,this.heightOracle,[new jt(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(a,0,r,new RM(k.from,_))}B1&&(u|=2)}let S=!this.viewportIsAppropriate(this.viewport,m)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return S&&(u&2&&(u|=this.updateScaler()),this.viewport=this.getViewport(m,this.scrollTarget),u|=this.updateForViewport()),(u&2||S)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(r?[]:this.lineGaps,e)),u|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),u}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let n=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),a=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,l=new fa(a.lineAt(r-n*1e3,pe.ByHeight,s,0,0).from,a.lineAt(o+(1-n)*1e3,pe.ByHeight,s,0,0).to);if(t){let{head:u}=t.range;if(ul.to){let m=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),c=a.lineAt(u,pe.ByPos,s,0,0),d;t.y=="center"?d=(c.top+c.bottom)/2-m/2:t.y=="start"||t.y=="nearest"&&u=o+Math.max(10,Math.min(n,250)))&&a>r-2*1e3&&s>1,r=a<<1;if(this.defaultTextDirection!=de.LTR&&!n)return[];let o=[],l=(m,c,d,h)=>{if(c-mm&&bb.from>=d.from&&b.to<=d.to&&Math.abs(b.from-m)b.fromy));if(!x){if(cw.from<=c&&w.to>=c)){let w=t.moveToLineBoundary(B.cursor(c),!1,!0).head;w>m&&(c=w)}let b=this.gapSize(d,m,c,h),y=n||b<2e6?b:2e6;x=new jr(m,c,b,y)}o.push(x)},u=m=>{if(m.length2e6)for(let k of e)k.from>=m.from&&k.fromm.from&&l(m.from,h,m,c),gt.draw(this,this.heightOracle.lineWrapping))))}computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let n=[];X.spans(t,this.viewport.from,this.viewport.to,{span(s,r){n.push({from:s,to:r})},point(){}},20);let a=0;if(n.length!=this.visibleRanges.length)a=12;else for(let s=0;s=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find(t=>t.from<=e&&t.to>=e)||ei(this.heightMap.lineAt(e,pe.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find(t=>t.top<=e&&t.bottom>=e)||ei(this.heightMap.lineAt(this.scaler.fromDOM(e),pe.ByHeight,this.heightOracle,0,0),this.scaler)}getScrollOffset(){return this.scrollParent==this.view.scrollDOM?this.scrollParent.scrollTop*this.scaleY:(this.scrollParent?this.scrollParent.getBoundingClientRect().top:0)-this.view.contentDOM.getBoundingClientRect().top}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+12-this.paddingTop);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return ei(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class fa{constructor(e,t){this.from=e,this.to=t}}function KM(i,e,t){let n=[],a=i,s=0;return X.spans(t,i,e,{span(){},point(r,o){r>a&&(n.push({from:a,to:r}),s+=r-a),a=o}},20),a=1)return e[e.length-1].to;let n=Math.floor(i*t);for(let a=0;;a++){let{from:s,to:r}=e[a],o=r-s;if(n<=o)return s+n;n-=o}}function ba(i,e){let t=0;for(let{from:n,to:a}of i.ranges){if(e<=a){t+=e-n;break}t+=a-n}return t/i.total}function eL(i,e){for(let t of i)if(e(t))return t}const ll={toDOM(i){return i},fromDOM(i){return i},scale:1,eq(i){return i==this}};function Vm(i){let e=i.facet(Qs).filter(n=>typeof n!="function"),t=i.facet(b0).filter(n=>typeof n!="function");return t.length&&e.push(X.join(t)),e}class Is{constructor(e,t){this.scale=e,this.viewports=t}static get(e,t,n){let a=0,s=0,r=0,o=n.map(({from:u,to:m})=>{let c=t.lineAt(u,pe.ByPos,e,0,0).top,d=t.lineAt(m,pe.ByPos,e,0,0).bottom;return a+=d-c,{from:u,to:m,top:c,bottom:d,domTop:0,domBottom:0}});if(t.height-a<10)return ll;let l=(7e6-a)/(t.height-a);for(let u of o)u.domTop=r+(u.top-s)*l,r=u.domBottom=u.domTop+(u.bottom-u.top),s=u.bottom;return new Is(l,o)}toDOM(e){for(let t=0,n=0,a=0;;t++){let s=tt.from==e.viewports[n].from&&t.to==e.viewports[n].to):!1}}function ei(i,e){if(e.scale==1)return i;let t=e.toDOM(i.top),n=e.toDOM(i.bottom);return new Ft(i.from,i.length,t,n-t,Array.isArray(i._content)?i._content.map(a=>ei(a,e)):i._content)}const ya=G.define({combine:i=>i.join(" ")}),ul=G.define({combine:i=>i.indexOf(!0)>-1}),ml=Bn.newName(),xp=Bn.newName(),bp=Bn.newName(),yp={"&light":"."+xp,"&dark":"."+bp};function cl(i,e,t){return new Bn(e,{finish(n){return/&/.test(n)?n.replace(/&\w*/,a=>{if(a=="&")return i;if(!t||!t[a])throw new RangeError(`Unsupported selector: ${a}`);return t[a]}):i+" "+n}})}const tL=cl("."+ml,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{userSelect:"none",position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#ddd"},".cm-selectionHandle":{backgroundColor:"currentColor",width:"1.5px"},".cm-selectionHandle-start::before, .cm-selectionHandle-end::before":{content:'""',backgroundColor:"inherit",borderRadius:"50%",width:"8px",height:"8px",position:"absolute",left:"-3.25px"},".cm-selectionHandle-start::before":{top:"-8px"},".cm-selectionHandle-end::before":{bottom:"-8px"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",zIndex:200},".cm-gutters-before":{insetInlineStart:0},".cm-gutters-after":{insetInlineEnd:0},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",border:"0px solid #ddd","&.cm-gutters-before":{borderRightWidth:"1px"},"&.cm-gutters-after":{borderLeftWidth:"1px"}},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},".cm-panels-top":{top:"0"},".cm-panels-bottom":{bottom:"0"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-dialog":{padding:"2px 19px 4px 6px",position:"relative","& label":{fontSize:"80%"}},".cm-dialog-close":{position:"absolute",top:"3px",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",fontSize:"14px",padding:"0"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"baseline",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top",userSelect:"none"},".cm-highlightSpace":{background:"radial-gradient(circle at 50% 55%, #aaa 20%, transparent 0) no-repeat",backgroundSize:".4em",backgroundPosition:"calc(min(50%, 0px)) center"},".cm-highlightTab":{backgroundImage:`url('data:image/svg+xml,')`,backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},yp),nL={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Cr=J.ie&&J.ie_version<=11;class iL{constructor(e){this.view=e,this.active=!1,this.editContext=null,this.selectionRange=new jZ,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver(t=>{for(let n of t)this.queue.push(n);(J.ie&&J.ie_version<=11||J.ios&&e.composing)&&t.some(n=>n.type=="childList"&&n.removedNodes.length||n.type=="characterData"&&n.oldValue.length>n.target.nodeValue.length)?this.flushSoon():this.flush()}),window.EditContext&&J.android&&e.constructor.EDIT_CONTEXT!==!1&&!(J.chrome&&J.chrome_version<126)&&(this.editContext=new sL(e),e.state.facet(mn)&&(e.contentDOM.editContext=this.editContext.editContext)),Cr&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),typeof ResizeObserver=="function"&&(this.resizeScroll=new ResizeObserver(()=>{var t;((t=this.view.docView)===null||t===void 0?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))},{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver(t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))},{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(this.pendingRecords().length>0),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{this.resizeTimeout=-1,this.view.requestMeasure()},50))}onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState.printing=!0,this.view.measure(),setTimeout(()=>{this.view.viewState.printing=!1,this.view.requestMeasure()},500))}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some((t,n)=>t!=e[n]))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:n}=this,a=this.selectionRange;if(n.state.facet(mn)?n.root.activeElement!=this.dom:!mi(this.dom,a))return;let s=a.anchorNode&&n.docView.tile.nearest(a.anchorNode);if(s&&s.isWidget()&&s.widget.ignoreEvent(e)){t||(this.selectionChanged=!1);return}(J.ie&&J.ie_version<=11||J.android&&J.chrome)&&!n.state.selection.main.empty&&a.focusNode&&ci(a.focusNode,a.focusOffset,a.anchorNode,a.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=_i(e.root);if(!t)return!1;let n=J.safari&&e.root.nodeType==11&&e.root.activeElement==this.dom&&aL(this.view,t)||t;if(!n||this.selectionRange.eq(n))return!1;let a=mi(this.dom,n);return a&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let s=this.delayedAndroidKey;s&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=s.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&s.force&&k1(this.dom,s.key,s.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(a)}(!this.delayedAndroidKey||e=="Enter")&&(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()}))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,n=-1,a=!1;for(let s of e){let r=this.readMutation(s);r&&(r.typeOver&&(a=!0),t==-1?{from:t,to:n}=r:(t=Math.min(r.from,t),n=Math.max(r.to,n)))}return{from:t,to:n,typeOver:a}}readChange(){let{from:e,to:t,typeOver:n}=this.processRecords(),a=this.selectionChanged&&mi(this.dom,this.selectionRange);if(e<0&&!a)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new wM(this.view,e,t,n);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.selectionChanged,n=this.readChange();if(!n)return this.view.requestMeasure(),!1;let a=this.view.state,s=rp(this.view,n);return this.view.state==a&&(n.domChanged||t)&&this.view.update([]),s}readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t.isWidget())return null;if(t.markDirty(e.type=="attributes"),e.type=="childList"){let n=Qm(t,e.previousSibling||e.target.previousSibling,-1),a=Qm(t,e.nextSibling||e.target.nextSibling,1);return{from:n?t.posAfter(n):t.posAtStart,to:a?t.posBefore(a):t.posAtEnd,typeOver:!1}}else return e.type=="characterData"?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}update(e){this.editContext&&(this.editContext.update(e),e.startState.facet(mn)!=e.state.facet(mn)&&(e.view.contentDOM.editContext=e.state.facet(mn)?this.editContext.editContext:null))}destroy(){var e,t,n;this.stop(),(e=this.intersection)===null||e===void 0||e.disconnect(),(t=this.gapIntersection)===null||t===void 0||t.disconnect(),(n=this.resizeScroll)===null||n===void 0||n.disconnect();for(let a of this.scrollTargets)a.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function Qm(i,e,t){for(;e;){let n=ke.get(e);if(n&&n.parent==i)return n;let a=e.parentNode;e=a!=i.dom?a:t>0?e.nextSibling:e.previousSibling}return null}function qm(i,e){let t=e.startContainer,n=e.startOffset,a=e.endContainer,s=e.endOffset,r=i.docView.domAtPos(i.state.selection.main.anchor,1);return ci(r.node,r.offset,a,s)&&([t,n,a,s]=[a,s,t,n]),{anchorNode:t,anchorOffset:n,focusNode:a,focusOffset:s}}function aL(i,e){if(e.getComposedRanges){let a=e.getComposedRanges(i.root)[0];if(a)return qm(i,a)}let t=null;function n(a){a.preventDefault(),a.stopImmediatePropagation(),t=a.getTargetRanges()[0]}return i.contentDOM.addEventListener("beforeinput",n,!0),i.dom.ownerDocument.execCommand("indent"),i.contentDOM.removeEventListener("beforeinput",n,!0),t?qm(i,t):null}class sL{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.composing=null,this.resetRange(e.state);let t=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=n=>{let a=e.state.selection.main,{anchor:s,head:r}=a,o=this.toEditorPos(n.updateRangeStart),l=this.toEditorPos(n.updateRangeEnd);e.inputState.composing>=0&&!this.composing&&(this.composing={contextBase:n.updateRangeStart,editorBase:o,drifted:!1});let u=l-o>n.text.length;o==this.from&&sthis.to&&(l=s);let m=op(e.state.sliceDoc(o,l),n.text,(u?a.from:a.to)-o,u?"end":null);if(!m){let d=B.single(this.toEditorPos(n.selectionStart),this.toEditorPos(n.selectionEnd));rl(d,a)||e.dispatch({selection:d,userEvent:"select"});return}let c={from:m.from+o,to:m.toA+o,insert:ae.of(n.text.slice(m.from,m.toB).split(` +`))};if((J.mac||J.android)&&c.from==r-1&&/^\. ?$/.test(n.text)&&e.contentDOM.getAttribute("autocorrect")=="off"&&(c={from:o,to:l,insert:ae.of([n.text.replace("."," ")])}),this.pendingContextChange=c,!e.state.readOnly){let d=this.to-this.from+(c.to-c.from+c.insert.length);v0(e,c,B.single(this.toEditorPos(n.selectionStart,d),this.toEditorPos(n.selectionEnd,d)))}this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)),c.from=0&&!/[\\p{Alphabetic}\\p{Number}_]/.test(t.text.slice(Math.max(0,n.updateRangeStart-1),Math.min(t.text.length,n.updateRangeStart+1)))&&this.handlers.compositionend(n)},this.handlers.characterboundsupdate=n=>{let a=[],s=null;for(let r=this.toEditorPos(n.rangeStart),o=this.toEditorPos(n.rangeEnd);r{let a=[];for(let s of n.getTextFormats()){let r=s.underlineStyle,o=s.underlineThickness;if(!/none/i.test(r)&&!/none/i.test(o)){let l=this.toEditorPos(s.rangeStart),u=this.toEditorPos(s.rangeEnd);if(l{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{if(e.inputState.composing=-1,e.inputState.compositionFirstChange=null,this.composing){let{drifted:n}=this.composing;this.composing=null,n&&this.reset(e.state)}};for(let n in this.handlers)t.addEventListener(n,this.handlers[n]);this.measureReq={read:n=>{let a=_i(n.root);a&&a.rangeCount&&this.editContext.updateSelectionBounds(a.getRangeAt(0).getBoundingClientRect())}}}applyEdits(e){let t=0,n=!1,a=this.pendingContextChange;return e.changes.iterChanges((s,r,o,l,u)=>{if(n)return;let m=u.length-(r-s);if(a&&r>=a.to)if(a.from==s&&a.to==r&&a.insert.eq(u)){a=this.pendingContextChange=null,t+=m,this.to+=m;return}else a=null,this.revertPending(e.state);if(s+=t,r+=t,r<=this.from)this.from+=m,this.to+=m;else if(sthis.to||this.to-this.from+u.length>3e4){n=!0;return}this.editContext.updateText(this.toContextPos(s),this.toContextPos(r),u.toString()),this.to+=m}t+=m}),a&&!n&&this.revertPending(e.state),!n}update(e){let t=this.pendingContextChange,n=e.startState.selection.main;this.composing&&(this.composing.drifted||!e.changes.touchesRange(n.from,n.to)&&e.transactions.some(a=>!a.isUserEvent("input.type")&&a.changes.touchesRange(this.from,this.to)))?(this.composing.drifted=!0,this.composing.editorBase=e.changes.mapPos(this.composing.editorBase)):!this.applyEdits(e)||!this.rangeIsValid(e.state)?(this.pendingContextChange=null,this.reset(e.state)):(e.docChanged||e.selectionSet||t)&&this.setSelection(e.state),(e.geometryChanged||e.docChanged||e.selectionSet)&&e.view.requestMeasure(this.measureReq)}resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),this.to=Math.min(e.doc.length,t+1e4)}reset(e){this.resetRange(e),this.editContext.updateText(0,this.editContext.text.length,e.doc.sliceString(this.from,this.to)),this.setSelection(e)}revertPending(e){let t=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(t.from),this.toContextPos(t.from+t.insert.length),e.doc.sliceString(t.from,t.to))}setSelection(e){let{main:t}=e.selection,n=this.toContextPos(Math.max(this.from,Math.min(this.to,t.anchor))),a=this.toContextPos(t.head);(this.editContext.selectionStart!=n||this.editContext.selectionEnd!=a)&&this.editContext.updateSelection(n,a)}rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this.from<500||this.to1e4*3)}toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let n=this.composing;return n&&n.drifted?n.editorBase+(e-n.contextBase):e+this.from}toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(e-t.editorBase):e-this.from}destroy(){for(let e in this.handlers)this.editContext.removeEventListener(e,this.handlers[e])}}class H{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return!!this.inputState&&this.inputState.composing>0}get compositionStarted(){return!!this.inputState&&this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.clearAnnouncement=-1,this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),e.parent&&e.parent.appendChild(this.dom);let{dispatch:n}=e;this.dispatchTransactions=e.dispatchTransactions||n&&(a=>a.forEach(s=>n(s,this)))||(a=>this.update(a)),this.dispatch=this.dispatch.bind(this),this._root=e.root||CZ(e.parent)||document,this.viewState=new Hm(this,e.state||ie.create(e)),e.scrollTo&&e.scrollTo.is(ha)&&(this.viewState.scrollTarget=e.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(x1).map(a=>new _r(a));for(let a of this.plugins)a.update(this);this.observer=new iL(this),this.inputState=new SM(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Cm(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),!((t=document.fonts)===null||t===void 0)&&t.ready&&document.fonts.ready.then(()=>{this.viewState.mustMeasureContent="refresh",this.requestMeasure()})}dispatch(...e){let t=e.length==1&&e[0]instanceof He?e:e.length==1&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t=!1,n=!1,a,s=this.state;for(let d of e){if(d.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=d.state}if(this.destroyed){this.viewState.state=s;return}let r=this.hasFocus,o=0,l=null;e.some(d=>d.annotation(hp))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=gp(s,r),l||(o=1));let u=this.observer.delayedAndroidKey,m=null;if(u?(this.observer.clearDelayedAndroidKey(),m=this.observer.readChange(),(m&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(m=null)):this.observer.clear(),s.facet(ie.phrases)!=this.state.facet(ie.phrases))return this.setState(s);a=ys.create(this,s,e),a.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let d of e){if(c&&(c=c.map(d.changes)),d.scrollIntoView){let{main:h}=d.state.selection,{x:g,y:f}=this.state.facet(H.cursorScrollMargin);c=new S1(h.empty?h:B.cursor(h.head,h.head>h.anchor?-1:1),"nearest","nearest",f,g)}for(let h of d.effects)h.is(ha)&&(c=h.value.clip(this.state))}this.viewState.update(a,c),this.bidiCache=ks.update(this.bidiCache,a.changes),a.empty||(this.updatePlugins(a),this.inputState.update(a)),t=this.docView.update(a),this.state.facet(K1)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(t,e.some(d=>d.isUserEvent("select.pointer")))}finally{this.updateState=0}if(a.startState.facet(ya)!=a.state.facet(ya)&&(this.viewState.mustMeasureContent=!0),(t||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),t&&this.docViewUpdate(),!a.empty)for(let d of this.state.facet(nl))try{d(a)}catch(h){bt(this.state,h,"update listener")}(l||m)&&Promise.resolve().then(()=>{l&&this.state==l.startState&&this.dispatch(l),m&&!rp(this,m)&&u.force&&k1(this.contentDOM,u.key,u.keyCode)})}setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed){this.viewState.state=e;return}this.updateState=2;let t=this.hasFocus;try{for(let n of this.plugins)n.destroy(this);this.viewState=new Hm(this,e),this.plugins=e.facet(x1).map(n=>new _r(n)),this.pluginMap.clear();for(let n of this.plugins)n.update(this);this.docView.destroy(),this.docView=new Cm(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(x1),n=e.state.facet(x1);if(t!=n){let a=[];for(let s of n){let r=t.indexOf(s);if(r<0)a.push(new _r(s));else{let o=this.plugins[r];o.mustUpdate=e,a.push(o)}}for(let s of this.plugins)s.mustUpdate!=e&&s.destroy(this);this.plugins=a,this.pluginMap.clear()}else for(let a of this.plugins)a.mustUpdate=e;for(let a=0;a-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey){this.measureScheduled=-1,this.requestMeasure();return}this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,n=this.viewState.scrollParent,a=this.viewState.getScrollOffset(),{scrollAnchorPos:s,scrollAnchorHeight:r,scaleY:o}=this.viewState;Math.abs(a-this.viewState.scrollOffset)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let l=0;;l++){if(r<0){if(Dg(n||this.win))s=-1,r=this.viewState.heightMap.height/this.viewState.scaleY;else{let g=this.viewState.scrollAnchorAt(a);s=g.from,r=g.top}o=this.viewState.scaleY}this.updateState=1;let u=this.viewState.measure();if(!u&&!this.measureRequests.length&&this.viewState.scrollTarget==null)break;if(l>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let m=[];u&4||([this.measureRequests,m]=[m,this.measureRequests]);let c=m.map(g=>{try{return g.read(this)}catch(f){return bt(this.state,f),Um}}),d=ys.create(this,this.state,[]),h=!1;d.flags|=u,t?t.flags|=u:t=d,this.updateState=2,d.empty||(this.updatePlugins(d),this.inputState.update(d),this.updateAttrs(),h=this.docView.update(d),h&&this.docViewUpdate());for(let g=0;g1||f<-1)&&!(J.ios&&this.inputState.lastIOSMomentumScroll>Date.now()-100)&&(n==this.scrollDOM||this.hasFocus||Math.max(this.inputState.lastWheelEvent,this.inputState.lastTouchTime)>Date.now()-100)){a=a+f,n?s<0?n.scrollTop=n.scrollHeight:n.scrollTop+=f:this.win.scrollBy(0,f),r=-1;continue}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let l of this.state.facet(nl))l(t)}get themeClasses(){return ml+" "+(this.state.facet(ul)?bp:xp)+" "+this.state.facet(ya)}updateAttrs(){let e=$m(this,Yg,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",writingsuggestions:"false",translate:"no",contenteditable:this.state.facet(mn)?"true":"false",class:"cm-content",style:`${J.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),$m(this,x0,t);let n=this.observer.ignore(()=>{let a=_m(this.contentDOM,this.contentAttrs,t),s=_m(this.dom,this.editorAttrs,e);return a||s});return this.editorAttrs=e,this.contentAttrs=t,n}showAnnouncements(e){let t=!0;for(let n of e)for(let a of n.effects)if(a.is(H.announce)){t&&(this.announceDOM.textContent="",this.win.clearTimeout(this.clearAnnouncement),this.clearAnnouncement=this.win.setTimeout(()=>{this.announceDOM.textContent=" "},200),t=!1);let s=this.announceDOM.appendChild(document.createElement("div"));s.textContent=a.value}}mountStyles(){this.styleModules=this.state.facet(K1);let e=this.state.facet(H.cspNonce);Bn.mount(this.root,this.styleModules.concat(tL).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(this.updateState==2)throw new Error("Reading the editor layout isn't allowed during an update");this.updateState==0&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame(()=>this.measure())),e){if(this.measureRequests.indexOf(e)>-1)return;if(e.key!=null){for(let t=0;tn.plugin==e)||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,n){return Pr(this,e,Bm(this,e,t,n))}moveByGroup(e,t){return Pr(this,e,Bm(this,e,t,n=>pM(this,e.head,n)))}visualLineSide(e,t){return t?B.cursor(e.to,1):B.cursor(e.from,-1)}moveToLineBoundary(e,t,n=!0){return gM(this,e,t,n)}moveVertically(e,t,n){return Pr(this,e,fM(this,e,t,n))}domAtPos(e,t=1){return this.docView.domAtPos(e,t)}posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}posAtCoords(e,t=!0){this.readMeasured();let n=sl(this,e,t);return n&&n.pos}posAndSideAtCoords(e,t=!0){return this.readMeasured(),sl(this,e,t)}coordsAtPos(e,t=1){this.readMeasured();let n=this.state.doc.lineAt(e),a=this.bidiSpans(n),s=a[an.find(a,e-n.from,-1,t)];return n.length&&(e==n.from&&t<0||e==n.to&&t>0)&&s.dir!=this.textDirectionAt(n.from)&&(e==n.to?(e=n.from+s.from,t=1):(e=n.from+s.to,t=-1)),this.docView.coordsAt(e,t,s.dir==de.RTL)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(qg)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>rL)return Ng(e.length);let t=this.textDirectionAt(e.from),n;for(let s of this.bidiCache)if(s.from==e.from&&s.dir==t&&(s.fresh||Eg(s.isolates,n=Am(this,e))))return s.order;n||(n=Am(this,e));let a=NZ(e.text,t,n);return this.bidiCache.push(new ks(e.from,e.to,t,n,!0,a)),a}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||J.safari&&((e=this.inputState)===null||e===void 0?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore(()=>{Bg(this.contentDOM),this.docView.updateSelection()})}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeType==9?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.win.clearTimeout(this.clearAnnouncement),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){var n,a,s,r;return ha.of(new S1(typeof e=="number"?B.cursor(e):e,(n=t.y)!==null&&n!==void 0?n:"nearest",(a=t.x)!==null&&a!==void 0?a:"nearest",(s=t.yMargin)!==null&&s!==void 0?s:5,(r=t.xMargin)!==null&&r!==void 0?r:5))}scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,n=this.viewState.scrollAnchorAt(e);return ha.of(new S1(B.cursor(n.from),"start","start",n.top-e,t,!0))}setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:typeof e=="boolean"?this.inputState.tabFocusMode=e?0:-1:this.inputState.tabFocusMode!=0&&(this.inputState.tabFocusMode=Date.now()+e)}static domEventHandlers(e){return Dt.define(()=>({}),{eventHandlers:e})}static domEventObservers(e){return Dt.define(()=>({}),{eventObservers:e})}static theme(e,t){let n=Bn.newName(),a=[ya.of(n),K1.of(cl(`.${n}`,e))];return t&&t.dark&&a.push(ul.of(!0)),a}static baseTheme(e){return r1.lowest(K1.of(cl("."+ml,e,yp)))}static findFromDOM(e){var t;let n=e.querySelector(".cm-content"),a=n&&ke.get(n)||ke.get(e);return((t=a==null?void 0:a.root)===null||t===void 0?void 0:t.view)||null}}H.styleModule=K1;H.inputHandler=Vg;H.clipboardInputFilter=p0;H.clipboardOutputFilter=f0;H.scrollHandler=Ug;H.focusChangeEffect=Qg;H.perLineTextDirection=qg;H.exceptionSink=Hg;H.updateListener=nl;H.editable=mn;H.mouseSelectionStyle=Gg;H.dragMovesSelection=Rg;H.clickAddsSelectionRange=Jg;H.decorations=Qs;H.blockWrappers=Xg;H.outerDecorations=b0;H.atomicRanges=Ji;H.bidiIsolatedRanges=Kg;H.cursorScrollMargin=G.define({combine:i=>{let e=5,t=5;for(let n of i)typeof n=="number"?e=t=n:{x:e,y:t}=n;return{x:e,y:t}}});H.scrollMargins=tp;H.darkTheme=ul;H.cspNonce=G.define({combine:i=>i.length?i[0]:""});H.contentAttributes=x0;H.editorAttributes=Yg;H.lineWrapping=H.contentAttributes.of({class:"cm-lineWrapping"});H.announce=re.define();const rL=4096,Um={};class ks{constructor(e,t,n,a,s,r){this.from=e,this.to=t,this.dir=n,this.isolates=a,this.fresh=s,this.order=r}static update(e,t){if(t.empty&&!e.some(s=>s.fresh))return e;let n=[],a=e.length?e[e.length-1].dir:de.LTR;for(let s=Math.max(0,e.length-10);s=0;a--){let s=n[a],r=typeof s=="function"?s(i):s;r&&d0(r,t)}return t}const oL=J.mac?"mac":J.windows?"win":J.linux?"linux":"key";function lL(i,e){const t=i.split(/-(?!$)/);let n=t[t.length-1];n=="Space"&&(n=" ");let a,s,r,o;for(let l=0;ln.concat(a),[]))),t}let _n=null;const cL=4e3;function dL(i,e=oL){let t=Object.create(null),n=Object.create(null),a=(r,o)=>{let l=n[r];if(l==null)n[r]=o;else if(l!=o)throw new Error("Key binding "+r+" is used both as a regular binding and as a multi-stroke prefix")},s=(r,o,l,u,m)=>{var c,d;let h=t[r]||(t[r]=Object.create(null)),g=o.split(/ (?!$)/).map(b=>lL(b,e));for(let b=1;b{let S=_n={view:w,prefix:y,scope:r};return setTimeout(()=>{_n==S&&(_n=null)},cL),!0}]})}let f=g.join(" ");a(f,!1);let x=h[f]||(h[f]={preventDefault:!1,stopPropagation:!1,run:((d=(c=h._any)===null||c===void 0?void 0:c.run)===null||d===void 0?void 0:d.slice())||[]});l&&x.run.push(l),u&&(x.preventDefault=!0),m&&(x.stopPropagation=!0)};for(let r of i){let o=r.scope?r.scope.split(" "):["editor"];if(r.any)for(let u of o){let m=t[u]||(t[u]=Object.create(null));m._any||(m._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:c}=r;for(let d in m)m[d].run.push(h=>c(h,dl))}let l=r[e]||r.key;if(l)for(let u of o)s(u,l,r.run,r.preventDefault,r.stopPropagation),r.shift&&s(u,"Shift-"+l,r.shift,r.preventDefault,r.stopPropagation)}return t}let dl=null;function hL(i,e,t,n){dl=e;let a=SZ(e),s=_t(a,0),r=un(s)==a.length&&a!=" ",o="",l=!1,u=!1,m=!1;_n&&_n.view==t&&_n.scope==n&&(o=_n.prefix+" ",up.indexOf(e.keyCode)<0&&(u=!0,_n=null));let c=new Set,d=x=>{if(x){for(let b of x.run)if(!c.has(b)&&(c.add(b),b(t)))return x.stopPropagation&&(m=!0),!0;x.preventDefault&&(x.stopPropagation&&(m=!0),u=!0)}return!1},h=i[n],g,f;return h&&(d(h[o+va(a,e,!r)])?l=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(J.windows&&e.ctrlKey&&e.altKey)&&!(J.mac&&e.altKey&&!(e.ctrlKey||e.metaKey))&&(g=Dn[e.keyCode])&&g!=a?(d(h[o+va(g,e,!0)])||e.shiftKey&&(f=ki[e.keyCode])!=a&&f!=g&&d(h[o+va(f,e,!1)]))&&(l=!0):r&&e.shiftKey&&d(h[o+va(a,e,!0)])&&(l=!0),!l&&d(h._any)&&(l=!0)),u&&(l=!0),l&&m&&e.stopPropagation(),dl=null,l}class Ys{constructor(e,t,n,a,s){this.className=e,this.left=t,this.top=n,this.width=a,this.height=s}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.width!=null&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,n){if(n.empty){let a=e.coordsAtPos(n.head,n.assoc||1);if(!a)return[];let s=vp(e);return[new Ys(t,a.left-s.left,a.top-s.top,null,a.bottom-a.top)]}else return gL(e,t,n)}}function vp(i){let e=i.scrollDOM.getBoundingClientRect();return{left:(i.textDirection==de.LTR?e.left:e.right-i.scrollDOM.clientWidth*i.scaleX)-i.scrollDOM.scrollLeft*i.scaleX,top:e.top-i.scrollDOM.scrollTop*i.scaleY}}function Xm(i,e,t,n){let a=i.coordsAtPos(e,t*2);if(!a)return n;let s=i.dom.getBoundingClientRect(),r=(a.top+a.bottom)/2,o=i.posAtCoords({x:s.left+1,y:r}),l=i.posAtCoords({x:s.right-1,y:r});return o==null||l==null?n:{from:Math.max(n.from,Math.min(o,l)),to:Math.min(n.to,Math.max(o,l))}}function gL(i,e,t){if(t.to<=i.viewport.from||t.from>=i.viewport.to)return[];let n=Math.max(t.from,i.viewport.from),a=Math.min(t.to,i.viewport.to),s=i.textDirection==de.LTR,r=i.contentDOM,o=r.getBoundingClientRect(),l=vp(i),u=r.querySelector(".cm-line"),m=u&&window.getComputedStyle(u),c=o.left+(m?parseInt(m.paddingLeft)+Math.min(0,parseInt(m.textIndent)):0),d=o.right-(m?parseInt(m.paddingRight):0),h=al(i,n,1),g=al(i,a,-1),f=h.type==Ve.Text?h:null,x=g.type==Ve.Text?g:null;if(f&&(i.lineWrapping||h.widgetLineBreaks)&&(f=Xm(i,n,1,f)),x&&(i.lineWrapping||g.widgetLineBreaks)&&(x=Xm(i,a,-1,x)),f&&x&&f.from==x.from&&f.to==x.to)return y(w(t.from,t.to,f));{let z=f?w(t.from,null,f):S(h,!1),k=x?w(null,t.to,x):S(g,!0),_=[];return(f||h).to<(x||g).from-(f&&x?1:0)||h.widgetLineBreaks>1&&z.bottom+i.defaultLineHeight/2O&&E.from=$)break;nt>Q&&P(Math.max(xe,Q),z==null&&xe<=O,Math.min(nt,$),k==null&&nt>=L,Te.dir)}if(Q=he.to+1,Q>=$)break}return C.length==0&&P(O,z==null,L,k==null,i.textDirection),{top:T,bottom:j,horizontal:C}}function S(z,k){let _=o.top+(k?z.top:z.bottom);return{top:_,bottom:_,horizontal:[]}}}function pL(i,e){return i.constructor==e.constructor&&i.eq(e)}class fL{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(Ra)!=e.state.facet(Ra)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure(this.measureReq)}setOrder(e){let t=0,n=e.facet(Ra);for(;t!pL(t,this.drawn[n]))){let t=this.dom.firstChild,n=0;for(let a of e)a.update&&t&&a.constructor&&this.drawn[n].constructor&&a.update(t,this.drawn[n])?(t=t.nextSibling,n++):this.dom.insertBefore(a.draw(),t);for(;t;){let a=t.nextSibling;t.remove(),t=a}this.drawn=e,J.webkit&&(this.dom.style.display=this.dom.firstChild?"":"none")}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const Ra=G.define();function xL(i){return[Dt.define(e=>new fL(e,i)),Ra.of(i)]}const wa="-10000px";class bL{constructor(e,t,n,a){this.facet=t,this.createTooltipView=n,this.removeTooltipView=a,this.input=e.state.facet(t),this.tooltips=this.input.filter(r=>r);let s=null;this.tooltipViews=this.tooltips.map(r=>s=n(r,s))}update(e,t){var n;let a=e.state.facet(this.facet),s=a.filter(l=>l);if(a===this.input){for(let l of this.tooltipViews)l.update&&l.update(e);return!1}let r=[],o=t?[]:null;for(let l=0;lt[u]=l),t.length=o.length),this.input=a,this.tooltips=s,this.tooltipViews=r,!0}}function wp(i){let e=i.dom.ownerDocument.documentElement,t=e.clientWidth,n=getComputedStyle(e);if(!/stable/.test(n.scrollbarGutter||""))return{left:0,right:t};let a=e.getBoundingClientRect(),s=i.win.scrollX;return{left:Math.max(0,a.left+s-parseFloat(n.marginLeft)),right:Math.min(t,a.right+s+parseFloat(n.marginRight))}}function yL(i){let{left:e,right:t}=wp(i);return{top:0,left:e,right:t,bottom:i.dom.ownerDocument.documentElement.clientHeight}}const Br=G.define({combine:i=>{var e,t,n;return{position:J.ios?"absolute":((e=i.find(a=>a.position))===null||e===void 0?void 0:e.position)||"fixed",parent:((t=i.find(a=>a.parent))===null||t===void 0?void 0:t.parent)||null,tooltipSpace:((n=i.find(a=>a.tooltipSpace))===null||n===void 0?void 0:n.tooltipSpace)||yL}}}),Km=new WeakMap,zp=Dt.fromClass(class{constructor(i){this.view=i,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=i.state.facet(Br);this.position=e.position,this.parent=e.parent,this.classes=i.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver=typeof ResizeObserver=="function"?new ResizeObserver(()=>this.measureSoon()):null,this.manager=new bL(i,Ip,(t,n)=>this.createTooltip(t,n),t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()}),this.above=this.manager.tooltips.map(t=>!!t.above),this.intersectionObserver=typeof IntersectionObserver=="function"?new IntersectionObserver(t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()},{threshold:[1]}):null,this.observeIntersection(),i.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let i of this.manager.tooltipViews)this.intersectionObserver.observe(i.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=>{this.measureTimeout=-1,this.maybeMeasure()},50))}update(i){i.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(i,this.above);e&&this.observeIntersection();let t=e||i.geometryChanged,n=i.state.facet(Br);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let a of this.manager.tooltipViews)a.dom.style.position=this.position;t=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let a of this.manager.tooltipViews)this.container.appendChild(a.dom);t=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);t&&this.maybeMeasure()}createTooltip(i,e){let t=i.create(this.view),n=e?e.dom:null;if(t.dom.classList.add("cm-tooltip"),i.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let a=document.createElement("div");a.className="cm-tooltip-arrow",t.dom.appendChild(a)}return t.dom.style.position=this.position,t.dom.style.top=wa,t.dom.style.left="0px",this.container.insertBefore(t.dom,n),t.mount&&t.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(t.dom),t}destroy(){var i,e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let n of this.manager.tooltipViews)n.dom.remove(),(i=n.destroy)===null||i===void 0||i.call(n);this.parent&&this.container.remove(),(e=this.resizeObserver)===null||e===void 0||e.disconnect(),(t=this.intersectionObserver)===null||t===void 0||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let i=1,e=1,t=!1,n=0;if(this.position=="fixed"&&this.manager.tooltipViews.length){let{dom:r}=this.manager.tooltipViews[0];if(J.safari){let o=r.getBoundingClientRect();t=Math.abs(o.top+1e4)>1||Math.abs(o.left)>1}else t=!!r.offsetParent&&r.offsetParent!=this.container.ownerDocument.body}if(t||this.position=="absolute")if(this.parent){let r=this.parent.getBoundingClientRect();r.width&&r.height&&(i=r.width/this.parent.offsetWidth,e=r.height/this.parent.offsetHeight)}else({scaleX:i,scaleY:e}=this.view.viewState);else n=wp(this.view).left;let a=this.view.scrollDOM.getBoundingClientRect(),s=y0(this.view);return{visible:{left:a.left+s.left,top:a.top+s.top,right:a.right-s.right,bottom:a.bottom-s.bottom},parent:this.parent?this.container.getBoundingClientRect():this.view.dom.getBoundingClientRect(),pos:this.manager.tooltips.map((r,o)=>{let l=this.manager.tooltipViews[o];return l.getCoords?l.getCoords(r.pos):this.view.coordsAtPos(r.pos)}),size:this.manager.tooltipViews.map(({dom:r})=>r.getBoundingClientRect()),space:this.view.state.facet(Br).tooltipSpace(this.view),scaleX:i,scaleY:e,makeAbsolute:t,fixedLeft:n}}writeMeasure(i){var e;if(i.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let o of this.manager.tooltipViews)o.dom.style.position="absolute"}let{visible:t,space:n,scaleX:a,scaleY:s}=i,r=[];for(let o=0;o=Math.min(t.bottom,n.bottom)||c.rightMath.min(t.right,n.right)+.1)){m.style.top=wa;continue}let h=l.arrow?u.dom.querySelector(".cm-tooltip-arrow"):null,g=h?7:0,f=d.right-d.left,x=(e=Km.get(u))!==null&&e!==void 0?e:d.bottom-d.top,b=u.offset||wL,y=this.view.textDirection==de.LTR,w=d.width>n.right-n.left?y?n.left:n.right-d.width:y?Math.max(n.left,Math.min(c.left-(h?14:0)+b.x,n.right-f)):Math.min(Math.max(n.left,c.left-f+(h?14:0)-b.x),n.right-f),S=this.above[o];!l.strictSide&&(S?c.top-x-g-b.yn.bottom)&&S==n.bottom-c.bottom>c.top-n.top&&(S=this.above[o]=!S);let z=(S?c.top-n.top:n.bottom-c.bottom)-g;if(zw&&T.topk&&(k=S?T.top-x-2-g:T.bottom+g+2);if(this.position=="absolute"?(m.style.top=(k-i.parent.top)/s+"px",ec(m,(w-i.parent.left)/a)):(m.style.top=k/s+"px",ec(m,(w-i.fixedLeft)/a)),h){let T=c.left+(y?b.x:-b.x)-(w+14-7);h.style.left=T/a+"px"}u.overlap!==!0&&r.push({left:w,top:k,right:_,bottom:k+x}),m.classList.toggle("cm-tooltip-above",S),m.classList.toggle("cm-tooltip-below",!S),u.positioned&&u.positioned(i.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let i of this.manager.tooltipViews)i.dom.style.top=wa}},{eventObservers:{scroll(){this.maybeMeasure()}}});function ec(i,e){let t=parseInt(i.style.left,10);(isNaN(t)||Math.abs(e-t)>1)&&(i.style.left=e+"px")}const vL=H.baseTheme({".cm-tooltip":{zIndex:500,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),wL={x:0,y:0},Ip=G.define({enables:[zp,vL]});function kp(i,e){let t=i.plugin(zp);if(!t)return null;let n=t.manager.tooltips.indexOf(e);return n<0?null:t.manager.tooltipViews[n]}class fn extends Cn{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}fn.prototype.elementClass="";fn.prototype.toDOM=void 0;fn.prototype.mapMode=Xe.TrackBefore;fn.prototype.startSide=fn.prototype.endSide=-1;fn.prototype.point=!0;const Ga=G.define(),zL=G.define(),IL={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>X.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{},side:"before"},hi=G.define();function kL(i){return[Sp(),hi.of({...IL,...i})]}const tc=G.define({combine:i=>i.some(e=>e)});function Sp(i){return[SL]}const SL=Dt.fromClass(class{constructor(i){this.view=i,this.domAfter=null,this.prevViewport=i.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters cm-gutters-before",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=i.state.facet(hi).map(e=>new ic(i,e)),this.fixed=!i.state.facet(tc);for(let e of this.gutters)e.config.side=="after"?this.getDOMAfter().appendChild(e.dom):this.dom.appendChild(e.dom);this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),i.scrollDOM.insertBefore(this.dom,i.contentDOM)}getDOMAfter(){return this.domAfter||(this.domAfter=document.createElement("div"),this.domAfter.className="cm-gutters cm-gutters-after",this.domAfter.setAttribute("aria-hidden","true"),this.domAfter.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.domAfter.style.position=this.fixed?"sticky":"",this.view.scrollDOM.appendChild(this.domAfter)),this.domAfter}update(i){if(this.updateGutters(i)){let e=this.prevViewport,t=i.view.viewport,n=Math.min(e.to,t.to)-Math.max(e.from,t.from);this.syncGutters(n<(t.to-t.from)*.8)}if(i.geometryChanged){let e=this.view.contentHeight/this.view.scaleY+"px";this.dom.style.minHeight=e,this.domAfter&&(this.domAfter.style.minHeight=e)}this.view.state.facet(tc)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":"",this.domAfter&&(this.domAfter.style.position=this.fixed?"sticky":"")),this.prevViewport=i.view.viewport}syncGutters(i){let e=this.dom.nextSibling;i&&(this.dom.remove(),this.domAfter&&this.domAfter.remove());let t=X.iter(this.view.state.facet(Ga),this.view.viewport.from),n=[],a=this.gutters.map(s=>new _L(s,this.view.viewport,-this.view.documentPadding.top));for(let s of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(s.type)){let r=!0;for(let o of s.type)if(o.type==Ve.Text&&r){hl(t,n,o.from);for(let l of a)l.line(this.view,o,n);r=!1}else if(o.widget)for(let l of a)l.widget(this.view,o)}else if(s.type==Ve.Text){hl(t,n,s.from);for(let r of a)r.line(this.view,s,n)}else if(s.widget)for(let r of a)r.widget(this.view,s);for(let s of a)s.finish();i&&(this.view.scrollDOM.insertBefore(this.dom,e),this.domAfter&&this.view.scrollDOM.appendChild(this.domAfter))}updateGutters(i){let e=i.startState.facet(hi),t=i.state.facet(hi),n=i.docChanged||i.heightChanged||i.viewportChanged||!X.eq(i.startState.facet(Ga),i.state.facet(Ga),i.view.viewport.from,i.view.viewport.to);if(e==t)for(let a of this.gutters)a.update(i)&&(n=!0);else{n=!0;let a=[];for(let s of t){let r=e.indexOf(s);r<0?a.push(new ic(this.view,s)):(this.gutters[r].update(i),a.push(this.gutters[r]))}for(let s of this.gutters)s.dom.remove(),a.indexOf(s)<0&&s.destroy();for(let s of a)s.config.side=="after"?this.getDOMAfter().appendChild(s.dom):this.dom.appendChild(s.dom);this.gutters=a}return n}destroy(){for(let i of this.gutters)i.destroy();this.dom.remove(),this.domAfter&&this.domAfter.remove()}},{provide:i=>H.scrollMargins.of(e=>{let t=e.plugin(i);if(!t||t.gutters.length==0||!t.fixed)return null;let n=t.dom.offsetWidth*e.scaleX,a=t.domAfter?t.domAfter.offsetWidth*e.scaleX:0;return e.textDirection==de.LTR?{left:n,right:a}:{right:n,left:a}})});function nc(i){return Array.isArray(i)?i:[i]}function hl(i,e,t){for(;i.value&&i.from<=t;)i.from==t&&e.push(i.value),i.next()}class _L{constructor(e,t,n){this.gutter=e,this.height=n,this.i=0,this.cursor=X.iter(e.markers,t.from)}addElement(e,t,n){let{gutter:a}=this,s=(t.top-this.height)/e.scaleY,r=t.height/e.scaleY;if(this.i==a.elements.length){let o=new _p(e,r,s,n);a.elements.push(o),a.dom.appendChild(o.dom)}else a.elements[this.i].update(e,r,s,n);this.height=t.bottom,this.i++}line(e,t,n){let a=[];hl(this.cursor,a,t.from),n.length&&(a=a.concat(n));let s=this.gutter.config.lineMarker(e,t,a);s&&a.unshift(s);let r=this.gutter;a.length==0&&!r.config.renderEmptyElements||this.addElement(e,t,a)}widget(e,t){let n=this.gutter.config.widgetMarker(e,t.widget,t),a=n?[n]:null;for(let s of e.state.facet(zL)){let r=s(e,t.widget,t);r&&(a||(a=[])).push(r)}a&&this.addElement(e,t,a)}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class ic{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let n in t.domEventHandlers)this.dom.addEventListener(n,a=>{let s=a.target,r;if(s!=this.dom&&this.dom.contains(s)){for(;s.parentNode!=this.dom;)s=s.parentNode;let l=s.getBoundingClientRect();r=(l.top+l.bottom)/2}else r=a.clientY;let o=e.lineBlockAtHeight(r-e.documentTop);t.domEventHandlers[n](e,o,a)&&a.preventDefault()});this.markers=nc(t.markers(e)),t.initialSpacer&&(this.spacer=new _p(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=nc(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let a=this.config.updateSpacer(this.spacer.markers[0],e);a!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[a])}let n=e.view.viewport;return!X.eq(this.markers,t,n.from,n.to)||(this.config.lineMarkerChange?this.config.lineMarkerChange(e):!1)}destroy(){for(let e of this.elements)e.destroy()}}class _p{constructor(e,t,n,a){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,n,a)}update(e,t,n,a){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=n&&(this.dom.style.marginTop=(this.above=n)?n+"px":""),TL(this.markers,a)||this.setMarkers(e,a)}setMarkers(e,t){let n="cm-gutterElement",a=this.dom.firstChild;for(let s=0,r=0;;){let o=r,l=ss(o,l,u)||r(o,l,u):r}return n}})}});class Dr extends fn{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function Zr(i,e){return i.state.facet(b1).formatNumber(e,i.state)}const PL=hi.compute([b1],i=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers(e){return e.state.facet(OL)},lineMarker(e,t,n){return n.some(a=>a.toDOM)?null:new Dr(Zr(e,e.state.doc.lineAt(t.from).number))},widgetMarker:(e,t,n)=>{for(let a of e.state.facet(AL)){let s=a(e,t,n);if(s)return s}return null},lineMarkerChange:e=>e.startState.facet(b1)!=e.state.facet(b1),initialSpacer(e){return new Dr(Zr(e,ac(e.state.doc.lines)))},updateSpacer(e,t){let n=Zr(t.view,ac(t.view.state.doc.lines));return n==e.number?e:new Dr(n)},domEventHandlers:i.facet(b1).domEventHandlers,side:"before"}));function jL(i={}){return[b1.of(i),Sp(),PL]}function ac(i){let e=9;for(;e{let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.head).from;a>t&&(t=a,e.push(CL.range(a)))}return X.of(e)});function DL(){return BL}const Tp=1024;let ZL=0;class Mr{constructor(e,t){this.from=e,this.to=t}}class K{constructor(e={}){this.id=ZL++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")}),this.combine=e.combine||null}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return typeof e!="function"&&(e=dt.match(e)),t=>{let n=e(t);return n===void 0?null:[this,n]}}}K.closedBy=new K({deserialize:i=>i.split(" ")});K.openedBy=new K({deserialize:i=>i.split(" ")});K.group=new K({deserialize:i=>i.split(" ")});K.isolate=new K({deserialize:i=>{if(i&&i!="rtl"&&i!="ltr"&&i!="auto")throw new RangeError("Invalid value for isolate: "+i);return i||"auto"}});K.contextHash=new K({perNode:!0});K.lookAhead=new K({perNode:!0});K.mounted=new K({perNode:!0});class gi{constructor(e,t,n,a=!1){this.tree=e,this.overlay=t,this.parser=n,this.bracketed=a}static get(e){return e&&e.props&&e.props[K.mounted.id]}}const ML=Object.create(null);class dt{constructor(e,t,n,a=0){this.name=e,this.props=t,this.id=n,this.flags=a}static define(e){let t=e.props&&e.props.length?Object.create(null):ML,n=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(e.name==null?8:0),a=new dt(e.name||"",t,e.id,n);if(e.props){for(let s of e.props)if(Array.isArray(s)||(s=s(a)),s){if(s[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[s[0].id]=s[1]}}return a}prop(e){return this.props[e.id]}get isTop(){return(this.flags&1)>0}get isSkipped(){return(this.flags&2)>0}get isError(){return(this.flags&4)>0}get isAnonymous(){return(this.flags&8)>0}is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(K.group);return t?t.indexOf(e)>-1:!1}return this.id==e}static match(e){let t=Object.create(null);for(let n in e)for(let a of n.split(" "))t[a]=e[n];return n=>{for(let a=n.prop(K.group),s=-1;s<(a?a.length:0);s++){let r=t[s<0?n.name:a[s]];if(r)return r}}}}dt.none=new dt("",Object.create(null),0,8);class z0{constructor(e){this.types=e;for(let t=0;t0;for(let l=this.cursor(r|Ie.IncludeAnonymous);;){let u=!1;if(l.from<=s&&l.to>=a&&(!o&&l.type.isAnonymous||t(l)!==!1)){if(l.firstChild())continue;u=!0}for(;u&&n&&(o||!l.type.isAnonymous)&&n(l),!l.nextSibling();){if(!l.parent())return;u=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:S0(dt.none,this.children,this.positions,0,this.children.length,0,this.length,(t,n,a)=>new je(this.type,t,n,a,this.propValues),e.makeTree||((t,n,a)=>new je(dt.none,t,n,a)))}static build(e){return NL(e)}}je.empty=new je(dt.none,[],[],0);class I0{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new I0(this.buffer,this.index)}}class Mn{constructor(e,t,n){this.buffer=e,this.length=t,this.set=n}get type(){return dt.none}toString(){let e=[];for(let t=0;t0));l=r[l+3]);return o}slice(e,t,n){let a=this.buffer,s=new Uint16Array(t-e),r=0;for(let o=e,l=0;o=e&&te;case 1:return t<=e&&n>e;case 2:return n>e;case 4:return!0}}function Ai(i,e,t,n){for(var a;i.from==i.to||(t<1?i.from>=e:i.from>e)||(t>-1?i.to<=e:i.to0?o.length:-1;e!=u;e+=t){let m=o[e],c=l[e]+r.from,d;if(!(!(s&Ie.EnterBracketed&&m instanceof je&&(d=gi.get(m))&&!d.overlay&&d.bracketed&&n>=c&&n<=c+m.length)&&!Op(a,n,c,c+m.length))){if(m instanceof Mn){if(s&Ie.ExcludeBuffers)continue;let h=m.findChild(0,m.buffer.length,t,n-c,a);if(h>-1)return new An(new LL(r,m,e,c),null,h)}else if(s&Ie.IncludeAnonymous||!m.type.isAnonymous||k0(m)){let h;if(!(s&Ie.IgnoreMounts)&&(h=gi.get(m))&&!h.overlay)return new Bt(h.tree,c,e,r);let g=new Bt(m,c,e,r);return s&Ie.IncludeAnonymous||!g.type.isAnonymous?g:g.nextChild(t<0?m.children.length-1:0,t,n,a,s)}}}if(s&Ie.IncludeAnonymous||!r.type.isAnonymous||(r.index>=0?e=r.index+t:e=t<0?-1:r._parent._tree.children.length,r=r._parent,!r))return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}prop(e){return this._tree.prop(e)}enter(e,t,n=0){let a;if(!(n&Ie.IgnoreOverlays)&&(a=gi.get(this._tree))&&a.overlay){let s=e-this.from,r=n&Ie.EnterBracketed&&a.bracketed;for(let{from:o,to:l}of a.overlay)if((t>0||r?o<=s:o=s:l>s))return new Bt(a.tree,a.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,n)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function rc(i,e,t,n){let a=i.cursor(),s=[];if(!a.firstChild())return s;if(t!=null){for(let r=!1;!r;)if(r=a.type.is(t),!a.nextSibling())return s}for(;;){if(n!=null&&a.type.is(n))return s;if(a.type.is(e)&&s.push(a.node),!a.nextSibling())return n==null?s:[]}}function gl(i,e,t=e.length-1){for(let n=i;t>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[t]&&e[t]!=n.name)return!1;t--}}return!0}class LL{constructor(e,t,n,a){this.parent=e,this.buffer=t,this.index=n,this.start=a}}class An extends Ap{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,n){super(),this.context=e,this._parent=t,this.index=n,this.type=e.buffer.set.types[e.buffer.buffer[n]]}child(e,t,n){let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.context.start,n);return s<0?null:new An(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}prop(e){return this.type.prop(e)}enter(e,t,n=0){if(n&Ie.ExcludeBuffers)return null;let{buffer:a}=this.context,s=a.findChild(this.index+4,a.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return s<0?null:new An(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new An(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new An(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:n}=this.context,a=this.index+4,s=n.buffer[this.index+3];if(s>a){let r=n.buffer[this.index+1];e.push(n.slice(a,s,r)),t.push(0)}return new je(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function Pp(i){if(!i.length)return null;let e=0,t=i[0];for(let s=1;st.from||r.to=e){let o=new Bt(r.tree,r.overlay[0].from+s.from,-1,s);(a||(a=[n])).push(Ai(o,e,t,!1))}}return a?Pp(a):n}class pl{get name(){return this.type.name}constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.bufferNode=null,this.mode=t&~Ie.EnterBracketed,e instanceof Bt)this.yieldNode(e);else{this._tree=e.context.parent,this.buffer=e.context;for(let n=e._parent;n;n=n._parent)this.stack.unshift(n.index);this.bufferNode=e,this.yieldBuf(e.index)}}yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,this.to=e.to,!0):!1}yieldBuf(e,t){this.index=e;let{start:n,buffer:a}=this.buffer;return this.type=t||a.set.types[a.buffer[e]],this.from=n+a.buffer[e+1],this.to=n+a.buffer[e+2],!0}yield(e){return e?e instanceof Bt?(this.buffer=null,this.yieldNode(e)):(this.buffer=e.context,this.yieldBuf(e.index,e.type)):!1}toString(){return this.buffer?this.buffer.buffer.childString(this.index):this._tree.toString()}enterChild(e,t,n){if(!this.buffer)return this.yield(this._tree.nextChild(e<0?this._tree._tree.children.length-1:0,e,t,n,this.mode));let{buffer:a}=this.buffer,s=a.findChild(this.index+4,a.buffer[this.index+3],e,t-this.buffer.start,n);return s<0?!1:(this.stack.push(this.index),this.yieldBuf(s))}firstChild(){return this.enterChild(1,0,4)}lastChild(){return this.enterChild(-1,0,4)}childAfter(e){return this.enterChild(1,e,2)}childBefore(e){return this.enterChild(-1,e,-2)}enter(e,t,n=this.mode){return this.buffer?n&Ie.ExcludeBuffers?!1:this.enterChild(1,e,t):this.yield(this._tree.enter(e,t,n))}parent(){if(!this.buffer)return this.yieldNode(this.mode&Ie.IncludeAnonymous?this._tree._parent:this._tree.parent);if(this.stack.length)return this.yieldBuf(this.stack.pop());let e=this.mode&Ie.IncludeAnonymous?this.buffer.parent:this.buffer.parent.nextSignificantParent();return this.buffer=null,this.yieldNode(e)}sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tree.index<0?null:this._tree._parent.nextChild(this._tree.index+e,e,0,4,this.mode)):!1;let{buffer:t}=this.buffer,n=this.stack.length-1;if(e<0){let a=n<0?0:this.stack[n]+4;if(this.index!=a)return this.yieldBuf(t.findChild(a,this.index,-1,0,4))}else{let a=t.buffer[this.index+3];if(a<(n<0?t.buffer.length:t.buffer[this.stack[n]+3]))return this.yieldBuf(a)}return n<0?this.yield(this.buffer.parent.nextChild(this.buffer.index+e,e,0,4,this.mode)):!1}nextSibling(){return this.sibling(1)}prevSibling(){return this.sibling(-1)}atLastNode(e){let t,n,{buffer:a}=this;if(a){if(e>0){if(this.index-1)for(let s=t+e,r=e<0?-1:n._tree.children.length;s!=r;s+=e){let o=n._tree.children[s];if(this.mode&Ie.IncludeAnonymous||o instanceof Mn||!o.type.isAnonymous||k0(o))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==a){if(a==this.index)return r;t=r,n=s+1;break e}a=this.stack[--s]}for(let a=n;a=0;s--){if(s<0)return gl(this._tree,e,a);let r=n[t.buffer[this.stack[s]]];if(!r.isAnonymous){if(e[a]&&e[a]!=r.name)return!1;a--}}return!0}}function k0(i){return i.children.some(e=>e instanceof Mn||!e.type.isAnonymous||k0(e))}function NL(i){var e;let{buffer:t,nodeSet:n,maxBufferLength:a=Tp,reused:s=[],minRepeatType:r=n.types.length}=i,o=Array.isArray(t)?new I0(t,t.length):t,l=n.types,u=0,m=0;function c(z,k,_,T,j,C){let{id:P,start:O,end:L,size:E}=o,Q=m,$=u;if(E<0)if(o.next(),E==-1){let D=s[P];_.push(D),T.push(O-z);return}else if(E==-3){u=P;return}else if(E==-4){m=P;return}else throw new RangeError(`Unrecognized record size: ${E}`);let he=l[P],Te,xe,nt=O-z;if(L-O<=a&&(xe=x(o.pos-k,j))){let D=new Uint16Array(xe.size-xe.skip),Y=o.pos-xe.size,oe=D.length;for(;o.pos>Y;)oe=b(xe.start,D,oe);Te=new Mn(D,L-xe.start,n),nt=xe.start-z}else{let D=o.pos-E;o.next();let Y=[],oe=[],Ne=P>=r?P:-1,it=0,ee=L,ve=Q;for(;o.pos>D;)Ne>=0&&o.id==Ne&&o.size>=0?(o.end<=ee-a&&(g(Y,oe,O,it,o.end,ee,Ne,ve,$),it=Y.length,ee=o.end,ve=m),o.next()):C>2500?d(O,D,Y,oe):c(O,D,Y,oe,Ne,C+1);if(Ne>=0&&it>0&&it-1&&it>0){let Se=h(he,$);Te=S0(he,Y,oe,0,Y.length,0,L-O,Se,Se)}else Te=f(he,Y,oe,L-O,Q-L,$)}_.push(Te),T.push(nt)}function d(z,k,_,T){let j=[],C=0,P=-1;for(;o.pos>k;){let{id:O,start:L,end:E,size:Q}=o;if(Q>4)o.next();else{if(P>-1&&L=0;E-=3)O[Q++]=j[E],O[Q++]=j[E+1]-L,O[Q++]=j[E+2]-L,O[Q++]=Q;_.push(new Mn(O,j[2]-L,n)),T.push(L-z)}}function h(z,k){return(_,T,j)=>{let C=0,P=_.length-1,O,L;if(P>=0&&(O=_[P])instanceof je){if(!P&&O.type==z&&O.length==j)return O;(L=O.prop(K.lookAhead))&&(C=T[P]+O.length+L-j)}return f(z,_,T,j,C,k)}}function g(z,k,_,T,j,C,P,O,L){let E=[],Q=[];for(;z.length>T;)E.push(z.pop()),Q.push(k.pop()+_-j);z.push(f(n.types[P],E,Q,C-j,O-C,L)),k.push(j-_)}function f(z,k,_,T,j,C,P){if(C){let O=[K.contextHash,C];P=P?[O].concat(P):[O]}if(j>25){let O=[K.lookAhead,j];P=P?[O].concat(P):[O]}return new je(z,k,_,T,P)}function x(z,k){let _=o.fork(),T=0,j=0,C=0,P=_.end-a,O={size:0,start:0,skip:0};e:for(let L=_.pos-z;_.pos>L;){let E=_.size;if(_.id==k&&E>=0){O.size=T,O.start=j,O.skip=C,C+=4,T+=4,_.next();continue}let Q=_.pos-E;if(E<0||Q=r?4:0,he=_.start;for(_.next();_.pos>Q;){if(_.size<0)if(_.size==-3||_.size==-4)$+=4;else break e;else _.id>=r&&($+=4);_.next()}j=he,T+=E,C+=$}return(k<0||T==z)&&(O.size=T,O.start=j,O.skip=C),O.size>4?O:void 0}function b(z,k,_){let{id:T,start:j,end:C,size:P}=o;if(o.next(),P>=0&&T4){let L=o.pos-(P-4);for(;o.pos>L;)_=b(z,k,_)}k[--_]=O,k[--_]=C-z,k[--_]=j-z,k[--_]=T}else P==-3?u=T:P==-4&&(m=T);return _}let y=[],w=[];for(;o.pos>0;)c(i.start||0,i.bufferStart||0,y,w,-1,0);let S=(e=i.length)!==null&&e!==void 0?e:y.length?w[0]+y[0].length:0;return new je(l[i.topID],y.reverse(),w.reverse(),S)}const oc=new WeakMap;function Ha(i,e){if(!i.isAnonymous||e instanceof Mn||e.type!=i)return 1;let t=oc.get(e);if(t==null){t=1;for(let n of e.children){if(n.type!=i||!(n instanceof je)){t=1;break}t+=Ha(i,n)}oc.set(e,t)}return t}function S0(i,e,t,n,a,s,r,o,l){let u=0;for(let g=n;g=m)break;k+=_}if(w==S+1){if(k>m){let _=g[S];h(_.children,_.positions,0,_.children.length,f[S]+y);continue}c.push(g[S])}else{let _=f[w-1]+g[w-1].length-z;c.push(S0(i,g,f,S,w,z,_,null,l))}d.push(z+y-s)}}return h(e,t,n,a,0),(o||l)(c,d,r)}class t1{constructor(e,t,n,a,s=!1,r=!1){this.from=e,this.to=t,this.tree=n,this.offset=a,this.open=(s?1:0)|(r?2:0)}get openStart(){return(this.open&1)>0}get openEnd(){return(this.open&2)>0}static addTree(e,t=[],n=!1){let a=[new t1(0,e.length,e,0,!1,n)];for(let s of t)s.to>e.length&&a.push(s);return a}static applyChanges(e,t,n=128){if(!t.length)return e;let a=[],s=1,r=e.length?e[0]:null;for(let o=0,l=0,u=0;;o++){let m=o=n)for(;r&&r.from=d.from||c<=d.to||u){let h=Math.max(d.from,l)-u,g=Math.min(d.to,c)-u;d=h>=g?null:new t1(h,g,d.tree,d.offset+u,o>0,!!m)}if(d&&a.push(d),r.to>c)break;r=snew Mr(a.from,a.to)):[new Mr(0,0)]:[new Mr(0,e.length)],this.createParse(e,t||[],n)}parse(e,t,n){let a=this.startParse(e,t,n);for(;;){let s=a.advance();if(s)return s}}}class FL{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new K({perNode:!0});let JL=0;class Tt{constructor(e,t,n,a){this.name=e,this.set=t,this.base=n,this.modified=a,this.id=JL++}toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.name}(${e})`);return e}static define(e,t){let n=typeof e=="string"?e:"?";if(e instanceof Tt&&(t=e),t!=null&&t.base)throw new Error("Can not derive from a modified tag");let a=new Tt(n,[],null,[]);if(a.set.push(a),t)for(let s of t.set)a.set.push(s);return a}static defineModifier(e){let t=new Ss(e);return n=>n.modified.indexOf(t)>-1?n:Ss.get(n.base||n,n.modified.concat(t).sort((a,s)=>a.id-s.id))}}let RL=0;class Ss{constructor(e){this.name=e,this.instances=[],this.id=RL++}static get(e,t){if(!t.length)return e;let n=t[0].instances.find(o=>o.base==e&&GL(t,o.modified));if(n)return n;let a=[],s=new Tt(e.name,a,e,t);for(let o of t)o.instances.push(s);let r=HL(t);for(let o of e.set)if(!o.modified.length)for(let l of r)a.push(Ss.get(o,l));return s}}function GL(i,e){return i.length==e.length&&i.every((t,n)=>t==e[n])}function HL(i){let e=[[]];for(let t=0;tn.length-t.length)}function Cp(i){let e=Object.create(null);for(let t in i){let n=i[t];Array.isArray(n)||(n=[n]);for(let a of t.split(" "))if(a){let s=[],r=2,o=a;for(let c=0;;){if(o=="..."&&c>0&&c+3==a.length){r=1;break}let d=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(o);if(!d)throw new RangeError("Invalid path: "+a);if(s.push(d[0]=="*"?"":d[0][0]=='"'?JSON.parse(d[0]):d[0]),c+=d[0].length,c==a.length)break;let h=a[c++];if(c==a.length&&h=="!"){r=0;break}if(h!="/")throw new RangeError("Invalid path: "+a);o=a.slice(c)}let l=s.length-1,u=s[l];if(!u)throw new RangeError("Invalid path: "+a);let m=new Pi(n,r,l>0?s.slice(0,l):null);e[u]=m.sort(e[u])}}return Bp.add(e)}const Bp=new K({combine(i,e){let t,n,a;for(;i||e;){if(!i||e&&i.depth<=e.depth?(a=e,e=e.next):(a=i,i=i.next),t&&t.mode==a.mode&&!a.context&&!t.context)continue;let s=new Pi(a.tags,a.mode,a.context);t?t.next=s:n=s,t=s}return n}});class Pi{constructor(e,t,n,a){this.tags=e,this.mode=t,this.context=n,this.next=a}get opaque(){return this.mode==0}get inherit(){return this.mode==1}sort(e){return!e||e.depth{let r=a;for(let o of s)for(let l of o.set){let u=t[l.id];if(u){r=r?r+" "+u:u;break}}return r},scope:n}}function VL(i,e){let t=null;for(let n of i){let a=n.style(e);a&&(t=t?t+" "+a:a)}return t}function QL(i,e,t,n=0,a=i.length){let s=new qL(n,Array.isArray(e)?e:[e],t);s.highlightRange(i.cursor(),n,a,"",s.highlighters),s.flush(a)}class qL{constructor(e,t,n){this.at=e,this.highlighters=t,this.span=n,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,n,a,s){let{type:r,from:o,to:l}=e;if(o>=n||l<=t)return;r.isTop&&(s=this.highlighters.filter(h=>!h.scope||h.scope(r)));let u=a,m=UL(e)||Pi.empty,c=VL(s,m.tags);if(c&&(u&&(u+=" "),u+=c,m.mode==1&&(a+=(a?" ":"")+c)),this.startSpan(Math.max(t,o),u),m.opaque)return;let d=e.tree&&e.tree.prop(K.mounted);if(d&&d.overlay){let h=e.node.enter(d.overlay[0].from+o,1),g=this.highlighters.filter(x=>!x.scope||x.scope(d.tree.type)),f=e.firstChild();for(let x=0,b=o;;x++){let y=x=w||!e.nextSibling())););if(!y||w>n)break;b=y.to+o,b>t&&(this.highlightRange(h.cursor(),Math.max(t,y.from+o),Math.min(n,b),"",g),this.startSpan(Math.min(n,b),u))}f&&e.parent()}else if(e.firstChild()){d&&(a="");do if(!(e.to<=t)){if(e.from>=n)break;this.highlightRange(e,t,n,a,s),this.startSpan(Math.min(n,e.to),u)}while(e.nextSibling());e.parent()}}}function UL(i){let e=i.type.prop(Bp);for(;e&&e.context&&!i.matchContext(e.context);)e=e.next;return e||null}const N=Tt.define,Ia=N(),zn=N(),lc=N(zn),uc=N(zn),In=N(),ka=N(In),Lr=N(In),Xt=N(),Fn=N(Xt),$t=N(),Yt=N(),fl=N(),H1=N(fl),Sa=N(),M={comment:Ia,lineComment:N(Ia),blockComment:N(Ia),docComment:N(Ia),name:zn,variableName:N(zn),typeName:lc,tagName:N(lc),propertyName:uc,attributeName:N(uc),className:N(zn),labelName:N(zn),namespace:N(zn),macroName:N(zn),literal:In,string:ka,docString:N(ka),character:N(ka),attributeValue:N(ka),number:Lr,integer:N(Lr),float:N(Lr),bool:N(In),regexp:N(In),escape:N(In),color:N(In),url:N(In),keyword:$t,self:N($t),null:N($t),atom:N($t),unit:N($t),modifier:N($t),operatorKeyword:N($t),controlKeyword:N($t),definitionKeyword:N($t),moduleKeyword:N($t),operator:Yt,derefOperator:N(Yt),arithmeticOperator:N(Yt),logicOperator:N(Yt),bitwiseOperator:N(Yt),compareOperator:N(Yt),updateOperator:N(Yt),definitionOperator:N(Yt),typeOperator:N(Yt),controlOperator:N(Yt),punctuation:fl,separator:N(fl),bracket:H1,angleBracket:N(H1),squareBracket:N(H1),paren:N(H1),brace:N(H1),content:Xt,heading:Fn,heading1:N(Fn),heading2:N(Fn),heading3:N(Fn),heading4:N(Fn),heading5:N(Fn),heading6:N(Fn),contentSeparator:N(Xt),list:N(Xt),quote:N(Xt),emphasis:N(Xt),strong:N(Xt),link:N(Xt),monospace:N(Xt),strikethrough:N(Xt),inserted:N(),deleted:N(),changed:N(),invalid:N(),meta:Sa,documentMeta:N(Sa),annotation:N(Sa),processingInstruction:N(Sa),definition:Tt.defineModifier("definition"),constant:Tt.defineModifier("constant"),function:Tt.defineModifier("function"),standard:Tt.defineModifier("standard"),local:Tt.defineModifier("local"),special:Tt.defineModifier("special")};for(let i in M){let e=M[i];e instanceof Tt&&(e.name=i)}Dp([{tag:M.link,class:"tok-link"},{tag:M.heading,class:"tok-heading"},{tag:M.emphasis,class:"tok-emphasis"},{tag:M.strong,class:"tok-strong"},{tag:M.keyword,class:"tok-keyword"},{tag:M.atom,class:"tok-atom"},{tag:M.bool,class:"tok-bool"},{tag:M.url,class:"tok-url"},{tag:M.labelName,class:"tok-labelName"},{tag:M.inserted,class:"tok-inserted"},{tag:M.deleted,class:"tok-deleted"},{tag:M.literal,class:"tok-literal"},{tag:M.string,class:"tok-string"},{tag:M.number,class:"tok-number"},{tag:[M.regexp,M.escape,M.special(M.string)],class:"tok-string2"},{tag:M.variableName,class:"tok-variableName"},{tag:M.local(M.variableName),class:"tok-variableName tok-local"},{tag:M.definition(M.variableName),class:"tok-variableName tok-definition"},{tag:M.special(M.variableName),class:"tok-variableName2"},{tag:M.definition(M.propertyName),class:"tok-propertyName tok-definition"},{tag:M.typeName,class:"tok-typeName"},{tag:M.namespace,class:"tok-namespace"},{tag:M.className,class:"tok-className"},{tag:M.macroName,class:"tok-macroName"},{tag:M.propertyName,class:"tok-propertyName"},{tag:M.operator,class:"tok-operator"},{tag:M.comment,class:"tok-comment"},{tag:M.meta,class:"tok-meta"},{tag:M.invalid,class:"tok-invalid"},{tag:M.punctuation,class:"tok-punctuation"}]);var Wr;const y1=new K;function $L(i){return G.define({combine:i?e=>e.concat(i):void 0})}const YL=new K;class Rt{constructor(e,t,n=[],a=""){this.data=e,this.name=a,ie.prototype.hasOwnProperty("tree")||Object.defineProperty(ie.prototype,"tree",{get(){return et(this)}}),this.parser=t,this.extension=[Z1.of(this),ie.languageData.of((s,r,o)=>{let l=mc(s,r,o),u=l.type.prop(y1);if(!u)return[];let m=s.facet(u),c=l.type.prop(YL);if(c){let d=l.resolve(r-l.from,o);for(let h of c)if(h.test(d,s)){let g=s.facet(h.facet);return h.type=="replace"?g:g.concat(m)}}return m})].concat(n)}isActiveAt(e,t,n=-1){return mc(e,t,n).type.prop(y1)==this.data}findRegions(e){let t=e.facet(Z1);if((t==null?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let n=[],a=(s,r)=>{if(s.prop(y1)==this.data){n.push({from:r,to:r+s.length});return}let o=s.prop(K.mounted);if(o){if(o.tree.prop(y1)==this.data){if(o.overlay)for(let l of o.overlay)n.push({from:l.from+r,to:l.to+r});else n.push({from:r,to:r+s.length});return}else if(o.overlay){let l=n.length;if(a(o.tree,o.overlay[0].from+r),n.length>l)return}}for(let l=0;ln.isTop?t:void 0)]}),e.name)}configure(e,t){return new _s(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function et(i){let e=i.field(Rt.state,!1);return e?e.tree:je.empty}class XL{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let n=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-n,t-n)}}let V1=null;class Ts{constructor(e,t,n=[],a,s,r,o,l){this.parser=e,this.state=t,this.fragments=n,this.tree=a,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(e,t,n){return new Ts(e,t,[],je.empty,0,n,[],null)}startParse(){return this.parser.startParse(new XL(this.state.doc),this.fragments)}work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree!=je.empty&&this.isDone(t??this.state.doc.length)?(this.takeTree(),!0):this.withContext(()=>{var n;if(typeof e=="number"){let a=Date.now()+e;e=()=>Date.now()>a}for(this.parse||(this.parse=this.startParse()),t!=null&&(this.parse.stoppedAt==null||this.parse.stoppedAt>t)&&t=this.treeLen&&((this.parse.stoppedAt==null||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext(()=>{for(;!(t=this.parse.advance()););}),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(t1.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=V1;V1=this;try{return e()}finally{V1=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=cc(e,t.from,t.to);return e}changes(e,t){let{fragments:n,tree:a,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!e.empty){let l=[];if(e.iterChangedRanges((u,m,c,d)=>l.push({fromA:u,toA:m,fromB:c,toB:d})),n=t1.applyChanges(n,l),a=je.empty,s=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){o=[];for(let u of this.skipped){let m=e.mapPos(u.from,1),c=e.mapPos(u.to,-1);me.from&&(this.fragments=cc(this.fragments,a,s),this.skipped.splice(n--,1))}return this.skipped.length>=t?!1:(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends jp{createParse(t,n,a){let s=a[0].from,r=a[a.length-1].to;return{parsedPos:s,advance(){let l=V1;if(l){for(let u of a)l.tempSkipped.push(u);e&&(l.scheduleOn=l.scheduleOn?Promise.all([l.scheduleOn,e]):e)}return this.parsedPos=r,new je(dt.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&t[0].from==0&&t[0].to>=e}static get(){return V1}}function cc(i,e,t){return t1.applyChanges(i,[{fromA:e,toA:t,fromB:e,toB:t}])}class D1{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),n=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,n)||t.takeTree(),new D1(t)}static init(e){let t=Math.min(3e3,e.doc.length),n=Ts.create(e.facet(Z1).parser,e,{from:0,to:t});return n.work(20,t)||n.takeTree(),new D1(n)}}Rt.state=Zt.define({create:D1.init,update(i,e){for(let t of e.effects)if(t.is(Rt.setState))return t.value;return e.startState.facet(Z1)!=e.state.facet(Z1)?D1.init(e.state):i.apply(e)}});let Zp=i=>{let e=setTimeout(()=>i(),500);return()=>clearTimeout(e)};typeof requestIdleCallback<"u"&&(Zp=i=>{let e=-1,t=setTimeout(()=>{e=requestIdleCallback(i,{timeout:400})},100);return()=>e<0?clearTimeout(t):cancelIdleCallback(e)});const Er=typeof navigator<"u"&&(!((Wr=navigator.scheduling)===null||Wr===void 0)&&Wr.isInputPending)?()=>navigator.scheduling.isInputPending():null,KL=Dt.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Rt.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Rt.state);(t.tree!=t.context.tree||!t.context.isDone(e.doc.length))&&(this.working=Zp(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEnda+1e3,l=s.context.work(()=>Er&&Er()||Date.now()>r,a+(o?0:1e5));this.chunkBudget-=Date.now()-t,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:Rt.setState.of(new D1(s.context))})),this.chunkBudget>0&&!(l&&!o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then(()=>this.scheduleWork()).catch(t=>bt(this.view.state,t)).then(()=>this.workScheduled--),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),Z1=G.define({combine(i){return i.length?i[0]:null},enables:i=>[Rt.state,KL,H.contentAttributes.compute([i],e=>{let t=e.facet(i);return t&&t.name?{"data-language":t.name}:{}})]});class eW{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const tW=G.define(),Ri=G.define({combine:i=>{if(!i.length)return" ";let e=i[0];if(!e||/\S/.test(e)||Array.from(e).some(t=>t!=e[0]))throw new Error("Invalid indent unit: "+JSON.stringify(i[0]));return e}});function Os(i){let e=i.facet(Ri);return e.charCodeAt(0)==9?i.tabSize*e.length:e.length}function ji(i,e){let t="",n=i.tabSize,a=i.facet(Ri)[0];if(a==" "){for(;e>=n;)t+=" ",e-=n;a=" "}for(let s=0;s=e?nW(i,t,e):null}class Xs{constructor(e,t={}){this.state=e,this.options=t,this.unit=Os(e)}lineAt(e,t=1){let n=this.state.doc.lineAt(e),{simulateBreak:a,simulateDoubleBreak:s}=this.options;return a!=null&&a>=n.from&&a<=n.to?s&&a==e?{text:"",from:e}:(t<0?a-1&&(s+=r-this.countColumn(n,n.search(/\S|$/))),s}countColumn(e,t=e.length){return Wi(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:n,from:a}=this.lineAt(e,t),s=this.options.overrideIndentation;if(s){let r=s(a);if(r>-1)return r}return this.countColumn(n,n.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Mp=new K;function nW(i,e,t){let n=e.resolveStack(t),a=e.resolveInner(t,-1).resolve(t,0).enterUnfinishedNodesBefore(t);if(a!=n.node){let s=[];for(let r=a;r&&!(r.fromn.node.to||r.from==n.node.from&&r.type==n.node.type);r=r.parent)s.push(r);for(let r=s.length-1;r>=0;r--)n={node:s[r],next:n}}return Lp(n,i,t)}function Lp(i,e,t){for(let n=i;n;n=n.next){let a=aW(n.node);if(a)return a(T0.create(e,t,n))}return 0}function iW(i){return i.pos==i.options.simulateBreak&&i.options.simulateDoubleBreak}function aW(i){let e=i.type.prop(Mp);if(e)return e;let t=i.firstChild,n;if(t&&(n=t.type.prop(K.closedBy))){let a=i.lastChild,s=a&&n.indexOf(a.name)>-1;return r=>Wp(r,!0,1,void 0,s&&!iW(r)?a.from:void 0)}return i.parent==null?sW:null}function sW(){return 0}class T0 extends Xs{constructor(e,t,n){super(e.state,e.options),this.base=e,this.pos=t,this.context=n}get node(){return this.context.node}static create(e,t,n){return new T0(e,t,n)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let n=e.resolve(t.from);for(;n.parent&&n.parent.from==n.from;)n=n.parent;if(rW(n,e))break;t=this.state.doc.lineAt(n.from)}return this.lineIndent(t.from)}continue(){return Lp(this.context.next,this.base,this.pos)}}function rW(i,e){for(let t=e;t;t=t.parent)if(i==t)return!0;return!1}function oW(i){let e=i.node,t=e.childAfter(e.from),n=e.lastChild;if(!t)return null;let a=i.options.simulateBreak,s=i.state.doc.lineAt(t.from),r=a==null||a<=s.from?s.to:Math.min(s.to,a);for(let o=t.to;;){let l=e.childAfter(o);if(!l||l==n)return null;if(!l.type.isSkipped){if(l.from>=r)return null;let u=/^ */.exec(s.text.slice(t.to-s.from))[0].length;return{from:t.from,to:t.to+u}}o=l.to}}function lW({closing:i,align:e=!0,units:t=1}){return n=>Wp(n,e,t,i)}function Wp(i,e,t,n,a){let s=i.textAfter,r=s.match(/^\s*/)[0].length,o=n&&s.slice(r,r+n.length)==n||a==i.pos+r,l=e?oW(i):null;return l?o?i.column(l.from):i.column(l.to):i.baseIndent+(o?0:i.unit*t)}const uW=i=>i.baseIndent;function Nr({except:i,units:e=1}={}){return t=>{let n=i&&i.test(t.textAfter);return t.baseIndent+(n?0:e*t.unit)}}const mW=200;function cW(){return ie.transactionFilter.of(i=>{if(!i.docChanged||!i.isUserEvent("input.type")&&!i.isUserEvent("input.complete"))return i;let e=i.startState.languageDataAt("indentOnInput",i.startState.selection.main.head);if(!e.length)return i;let t=i.newDoc,{head:n}=i.newSelection.main,a=t.lineAt(n);if(n>a.from+mW)return i;let s=t.sliceString(a.from,n);if(!e.some(u=>u.test(s)))return i;let{state:r}=i,o=-1,l=[];for(let{head:u}of r.selection.ranges){let m=r.doc.lineAt(u);if(m.from==o)continue;o=m.from;let c=_0(r,m.from);if(c==null)continue;let d=/^\s*/.exec(m.text)[0],h=ji(r,c);d!=h&&l.push({from:m.from,to:m.from+d.length,insert:h})}return l.length?[i,{changes:l,sequential:!0}]:i})}const dW=new K;function hW(i){let e=i.firstChild,t=i.lastChild;return e&&e.too.prop(y1)==r.data:r?o=>o==r:void 0,this.style=Dp(e.map(o=>({tag:o.tag,class:o.class||a(Object.assign({},o,{tag:null}))})),{all:s}).style,this.module=n?new Bn(n):null,this.themeType=t.themeType}static define(e,t){return new Ks(e,t||{})}}const xl=G.define(),gW=G.define({combine(i){return i.length?[i[0]]:null}});function Fr(i){let e=i.facet(xl);return e.length?e:i.facet(gW)}function pW(i,e){let t=[xW],n;return i instanceof Ks&&(i.module&&t.push(H.styleModule.of(i.module)),n=i.themeType),n?t.push(xl.computeN([H.darkTheme],a=>a.facet(H.darkTheme)==(n=="dark")?[i]:[])):t.push(xl.of(i)),t}class fW{constructor(e){this.markCache=Object.create(null),this.tree=et(e.state),this.decorations=this.buildDeco(e,Fr(e.state)),this.decoratedTo=e.viewport.to}update(e){let t=et(e.state),n=Fr(e.state),a=n!=Fr(e.startState),{viewport:s}=e.view,r=e.changes.mapPos(this.decoratedTo,1);t.length=s.to?(this.decorations=this.decorations.map(e.changes),this.decoratedTo=r):(t!=this.tree||e.viewportChanged||a)&&(this.tree=t,this.decorations=this.buildDeco(e.view,n),this.decoratedTo=s.to)}buildDeco(e,t){if(!t||!this.tree.length)return ue.none;let n=new e1;for(let{from:a,to:s}of e.visibleRanges)QL(this.tree,t,(r,o,l)=>{n.add(r,o,this.markCache[l]||(this.markCache[l]=ue.mark({class:l})))},a,s);return n.finish()}}const xW=r1.high(Dt.fromClass(fW,{decorations:i=>i.decorations})),bW=H.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Ep=1e4,Np="()[]{}",Fp=G.define({combine(i){return u0(i,{afterCursor:!0,brackets:Np,maxScanDistance:Ep,renderMatch:wW})}}),yW=ue.mark({class:"cm-matchingBracket"}),vW=ue.mark({class:"cm-nonmatchingBracket"});function wW(i){let e=[],t=i.matched?yW:vW;return e.push(t.range(i.start.from,i.start.to)),i.end&&e.push(t.range(i.end.from,i.end.to)),e}function dc(i){let e=[],t=i.facet(Fp);for(let n of i.selection.ranges){if(!n.empty)continue;let a=sn(i,n.head,-1,t)||n.head>0&&sn(i,n.head-1,1,t)||t.afterCursor&&(sn(i,n.head,1,t)||n.headi.decorations}),IW=[zW,bW];function kW(i={}){return[Fp.of(i),IW]}const SW=new K;function bl(i,e,t){let n=i.prop(e<0?K.openedBy:K.closedBy);if(n)return n;if(i.name.length==1){let a=t.indexOf(i.name);if(a>-1&&a%2==(e<0?1:0))return[t[a+e]]}return null}function yl(i){let e=i.type.prop(SW);return e?e(i.node):i}function sn(i,e,t,n={}){let a=n.maxScanDistance||Ep,s=n.brackets||Np,r=et(i),o=r.resolveInner(e,t);for(let l=o;l;l=l.parent){let u=bl(l.type,t,s);if(u&&l.from0?e>=m.from&&em.from&&e<=m.to))return _W(i,e,t,l,m,u,s)}}return TW(i,e,t,r,o.type,a,s)}function _W(i,e,t,n,a,s,r){let o=n.parent,l={from:a.from,to:a.to},u=0,m=o==null?void 0:o.cursor();if(m&&(t<0?m.childBefore(n.from):m.childAfter(n.to)))do if(t<0?m.to<=n.from:m.from>=n.to){if(u==0&&s.indexOf(m.type.name)>-1&&m.from0)return null;let u={from:t<0?e-1:e,to:t>0?e+1:e},m=i.doc.iterRange(e,t>0?i.doc.length:0),c=0;for(let d=0;!m.next().done&&d<=s;){let h=m.value;t<0&&(d+=h.length);let g=e+d*t;for(let f=t>0?0:h.length-1,x=t>0?h.length:-1;f!=x;f+=t){let b=r.indexOf(h[f]);if(!(b<0||n.resolveInner(g+f,1).type!=a))if(b%2==0==t>0)c++;else{if(c==1)return{start:u,end:{from:g+f,to:g+f+1},matched:b>>1==l>>1};c--}}t>0&&(d+=h.length)}return m.done?{start:u,matched:!1}:null}const OW=Object.create(null),hc=[dt.none],gc=[],pc=Object.create(null),AW=Object.create(null);for(let[i,e]of[["variable","variableName"],["variable-2","variableName.special"],["string-2","string.special"],["def","variableName.definition"],["tag","tagName"],["attribute","attributeName"],["type","typeName"],["builtin","variableName.standard"],["qualifier","modifier"],["error","invalid"],["header","heading"],["property","propertyName"]])AW[i]=PW(OW,e);function Jr(i,e){gc.indexOf(i)>-1||(gc.push(i),console.warn(e))}function PW(i,e){let t=[];for(let o of e.split(" ")){let l=[];for(let u of o.split(".")){let m=i[u]||M[u];m?typeof m=="function"?l.length?l=l.map(m):Jr(u,`Modifier ${u} used at start of tag`):l.length?Jr(u,`Tag ${u} used as modifier`):l=Array.isArray(m)?m:[m]:Jr(u,`Unknown highlighting tag ${u}`)}for(let u of l)t.push(u)}if(!t.length)return 0;let n=e.replace(/ /g,"_"),a=n+" "+t.map(o=>o.id),s=pc[a];if(s)return s.id;let r=pc[a]=dt.define({id:hc.length,name:n,props:[Cp({[n]:t})]});return hc.push(r),r.id}de.RTL,de.LTR;class Jp{constructor(e,t,n,a){this.state=e,this.pos=t,this.explicit=n,this.view=a,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(e){let t=et(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),n=Math.max(t.from,this.pos-250),a=t.text.slice(n-t.from,this.pos-t.from),s=a.search(Rp(e,!1));return s<0?null:{from:n+s,to:this.pos,text:a.slice(s)}}get aborted(){return this.abortListeners==null}addEventListener(e,t,n){e=="abort"&&this.abortListeners&&(this.abortListeners.push(t),n&&n.onDocChange&&(this.abortOnDocChange=!0))}}function fc(i){let e=Object.keys(i).join(""),t=/\w/.test(e);return t&&(e=e.replace(/\w/g,"")),`[${t?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function jW(i){let e=Object.create(null),t=Object.create(null);for(let{label:a}of i){e[a[0]]=!0;for(let s=1;stypeof a=="string"?{label:a}:a),[t,n]=e.every(a=>/^\w+$/.test(a.label))?[/\w*$/,/\w+$/]:jW(e);return a=>{let s=a.matchBefore(n);return s||a.explicit?{from:s?s.from:a.pos,options:e,validFor:t}:null}}class xc{constructor(e,t,n,a){this.completion=e,this.source=t,this.match=n,this.score=a}}function n1(i){return i.selection.main.from}function Rp(i,e){var t;let{source:n}=i,a=e&&n[0]!="^",s=n[n.length-1]!="$";return!a&&!s?i:new RegExp(`${a?"^":""}(?:${n})${s?"$":""}`,(t=i.flags)!==null&&t!==void 0?t:i.ignoreCase?"i":"")}const O0=Ln.define();function BW(i,e,t,n){let{main:a}=i.selection,s=t-a.from,r=n-a.from;return{...i.changeByRange(o=>{if(o!=a&&t!=n&&i.sliceDoc(o.from+s,o.from+r)!=i.sliceDoc(t,n))return{range:o};let l=i.toText(e);return{changes:{from:o.from+s,to:n==a.from?o.to:o.from+r,insert:l},range:B.cursor(o.from+s+l.length)}}),scrollIntoView:!0,userEvent:"input.complete"}}const bc=new WeakMap;function DW(i){if(!Array.isArray(i))return i;let e=bc.get(i);return e||bc.set(i,e=CW(i)),e}const As=re.define(),Ci=re.define();class ZW{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&z<=57||z>=97&&z<=122?2:z>=65&&z<=90?1:0:(k=hg(z))!=k.toLowerCase()?1:k!=k.toUpperCase()?2:0;(!y||_==1&&x||S==0&&_!=0)&&(t[c]==z||n[c]==z&&(d=!0)?r[c++]=y:r.length&&(b=!1)),S=_,y+=un(z)}return c==l&&r[0]==0&&b?this.result(-100+(d?-200:0),r,e):h==l&&g==0?this.ret(-200-e.length+(f==e.length?0:-100),[0,f]):o>-1?this.ret(-700-e.length,[o,o+this.pattern.length]):h==l?this.ret(-900-e.length,[g,f]):c==l?this.result(-100+(d?-200:0)+-700+(b?0:-1100),r,e):t.length==2?null:this.result((a[0]?-700:0)+-200+-1100,a,e)}result(e,t,n){let a=[],s=0;for(let r of t){let o=r+(this.astral?un(_t(n,r)):1);s&&a[s-1]==r?a[s-1]=o:(a[s++]=r,a[s++]=o)}return this.ret(e-n.length,a)}}class MW{constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e.toLowerCase()}match(e){if(e.length!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:LW,filterStrict:!1,compareCompletions:(e,t)=>(e.sortText||e.label).localeCompare(t.sortText||t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>n=>yc(e(n),t(n)),optionClass:(e,t)=>n=>yc(e(n),t(n)),addToOptions:(e,t)=>e.concat(t),filterStrict:(e,t)=>e||t})}});function yc(i,e){return i?e?i+" "+e:i:e}function LW(i,e,t,n,a,s){let r=i.textDirection==de.RTL,o=r,l=!1,u="top",m,c,d=e.left-a.left,h=a.right-e.right,g=n.right-n.left,f=n.bottom-n.top;if(o&&d=f||y>e.top?m=t.bottom-e.top:(u="bottom",m=e.bottom-t.top)}let x=(e.bottom-e.top)/s.offsetHeight,b=(e.right-e.left)/s.offsetWidth;return{style:`${u}: ${m/x}px; max-width: ${c/b}px`,class:"cm-completionInfo-"+(l?r?"left-narrow":"right-narrow":o?"left":"right")}}const A0=re.define();function WW(i){let e=i.addToOptions.slice();return i.icons&&e.push({render(t){let n=document.createElement("div");return n.classList.add("cm-completionIcon"),t.type&&n.classList.add(...t.type.split(/\s+/g).map(a=>"cm-completionIcon-"+a)),n.setAttribute("aria-hidden","true"),n},position:20}),e.push({render(t,n,a,s){let r=document.createElement("span");r.className="cm-completionLabel";let o=t.displayLabel||t.label,l=0;for(let u=0;ul&&r.appendChild(document.createTextNode(o.slice(l,m)));let d=r.appendChild(document.createElement("span"));d.appendChild(document.createTextNode(o.slice(m,c))),d.className="cm-completionMatchedText",l=c}return lt.position-n.position).map(t=>t.render)}function Rr(i,e,t){if(i<=t)return{from:0,to:i};if(e<0&&(e=0),e<=i>>1){let a=Math.floor(e/t);return{from:a*t,to:(a+1)*t}}let n=Math.ceil((i-e)/t);return{from:i-n*t,to:i-(n-1)*t}}class EW{constructor(e,t,n){this.view=e,this.stateField=t,this.applyCompletion=n,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:l=>this.placeInfo(l),key:this},this.space=null,this.currentClass="";let a=e.state.field(t),{options:s,selected:r}=a.open,o=e.state.facet(We);this.optionContent=WW(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=Rr(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",l=>{let{options:u}=e.state.field(t).open;for(let m=l.target,c;m&&m!=this.dom;m=m.parentNode)if(m.nodeName=="LI"&&(c=/-(\d+)$/.exec(m.id))&&+c[1]this.list.lastChild.getBoundingClientRect().bottom?this.range.to:null;m!=null&&(e.dispatch({effects:A0.of(m)}),l.preventDefault())}}),this.dom.addEventListener("focusout",l=>{let u=e.state.field(this.stateField,!1);u&&u.tooltip&&e.state.facet(We).closeOnBlur&&l.relatedTarget!=e.contentDOM&&e.dispatch({effects:Ci.of(null)})}),this.showOptions(s,a.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)})}update(e){var t;let n=e.state.field(this.stateField),a=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),n!=a){let{options:s,selected:r,disabled:o}=n.open;(!a.open||a.open.options!=s)&&(this.range=Rr(s.length,r,e.state.facet(We).maxRenderedOptions),this.showOptions(s,n.id)),this.updateSel(),o!=((t=a.open)===null||t===void 0?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let n of this.currentClass.split(" "))n&&this.dom.classList.remove(n);for(let n of t.split(" "))n&&this.dom.classList.add(n);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.selected>-1&&t.selected=this.range.to)&&(this.range=Rr(t.options.length,t.selected,this.view.state.facet(We).maxRenderedOptions),this.showOptions(t.options,e.id));let n=this.updateSelectedOption(t.selected);if(n){this.destroyInfo();let{completion:a}=t.options[t.selected],{info:s}=a;if(!s)return;let r=typeof s=="string"?document.createTextNode(s):s(a);if(!r)return;"then"in r?r.then(o=>{o&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(o,a)}).catch(o=>bt(this.view.state,o,"completion info")):(this.addInfoPane(r,a),n.setAttribute("aria-describedby",this.info.id))}}addInfoPane(e,t){this.destroyInfo();let n=this.info=document.createElement("div");if(n.className="cm-tooltip cm-completionInfo",n.id="cm-completionInfo-"+Math.floor(Math.random()*65535).toString(16),e.nodeType!=null)n.appendChild(e),this.infoDestroy=null;else{let{dom:a,destroy:s}=e;n.appendChild(a),this.infoDestroy=s||null}this.dom.appendChild(n),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let n=this.list.firstChild,a=this.range.from;n;n=n.nextSibling,a++)n.nodeName!="LI"||!n.id?a--:a==e?n.hasAttribute("aria-selected")||(n.setAttribute("aria-selected","true"),t=n):n.hasAttribute("aria-selected")&&(n.removeAttribute("aria-selected"),n.removeAttribute("aria-describedby"));return t&&FW(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),n=this.info.getBoundingClientRect(),a=e.getBoundingClientRect(),s=this.space;if(!s){let r=this.dom.ownerDocument.documentElement;s={left:0,top:0,right:r.clientWidth,bottom:r.clientHeight}}return a.top>Math.min(s.bottom,t.bottom)-10||a.bottom{r.target==a&&r.preventDefault()});let s=null;for(let r=n.from;rn.from||n.from==0))if(s=d,typeof u!="string"&&u.header)a.appendChild(u.header(u));else{let h=a.appendChild(document.createElement("completion-section"));h.textContent=d}}const m=a.appendChild(document.createElement("li"));m.id=t+"-"+r,m.setAttribute("role","option");let c=this.optionClass(o);c&&(m.className=c);for(let d of this.optionContent){let h=d(o,this.view.state,this.view,l);h&&m.appendChild(h)}}return n.from&&a.classList.add("cm-completionListIncompleteTop"),n.tonew EW(t,i,e)}function FW(i,e){let t=i.getBoundingClientRect(),n=e.getBoundingClientRect(),a=t.height/i.offsetHeight;n.topt.bottom&&(i.scrollTop+=(n.bottom-t.bottom)/a)}function vc(i){return(i.boost||0)*100+(i.apply?10:0)+(i.info?5:0)+(i.type?1:0)}function JW(i,e){let t=[],n=null,a=null,s=m=>{t.push(m);let{section:c}=m.completion;if(c){n||(n=[]);let d=typeof c=="string"?c:c.name;n.some(h=>h.name==d)||n.push(typeof c=="string"?{name:d}:c)}},r=e.facet(We);for(let m of i)if(m.hasResult()){let c=m.result.getMatch;if(m.result.filter===!1)for(let d of m.result.options)s(new xc(d,m.source,c?c(d):[],1e9-t.length));else{let d=e.sliceDoc(m.from,m.to),h,g=r.filterStrict?new MW(d):new ZW(d);for(let f of m.result.options)if(h=g.match(f.label)){let x=f.displayLabel?c?c(f,h.matched):[]:h.matched,b=h.score+(f.boost||0);if(s(new xc(f,m.source,x,b)),typeof f.section=="object"&&f.section.rank==="dynamic"){let{name:y}=f.section;a||(a=Object.create(null)),a[y]=Math.max(b,a[y]||-1e9)}}}}if(n){let m=Object.create(null),c=0,d=(h,g)=>(h.rank==="dynamic"&&g.rank==="dynamic"?a[g.name]-a[h.name]:0)||(typeof h.rank=="number"?h.rank:1e9)-(typeof g.rank=="number"?g.rank:1e9)||(h.named.score-c.score||u(c.completion,d.completion))){let c=m.completion;!l||l.label!=c.label||l.detail!=c.detail||l.type!=null&&c.type!=null&&l.type!=c.type||l.apply!=c.apply||l.boost!=c.boost?o.push(m):vc(m.completion)>vc(l)&&(o[o.length-1]=m),l=m.completion}return o}class v1{constructor(e,t,n,a,s,r){this.options=e,this.attrs=t,this.tooltip=n,this.timestamp=a,this.selected=s,this.disabled=r}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new v1(this.options,wc(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,n,a,s,r){if(a&&!r&&e.some(u=>u.isPending))return a.setDisabled();let o=JW(e,t);if(!o.length)return a&&e.some(u=>u.isPending)?a.setDisabled():null;let l=t.facet(We).selectOnOpen?0:-1;if(a&&a.selected!=l&&a.selected!=-1){let u=a.options[a.selected].completion;for(let m=0;mm.hasResult()?Math.min(u,m.from):u,1e8),create:qW,above:s.aboveCursor},a?a.timestamp:Date.now(),l,!1)}map(e){return new v1(this.options,this.attrs,{...this.tooltip,pos:e.mapPos(this.tooltip.pos)},this.timestamp,this.selected,this.disabled)}setDisabled(){return new v1(this.options,this.attrs,this.tooltip,this.timestamp,this.selected,!0)}}class Ps{constructor(e,t,n){this.active=e,this.id=t,this.open=n}static start(){return new Ps(VW,"cm-ac-"+Math.floor(Math.random()*2e6).toString(36),null)}update(e){let{state:t}=e,n=t.facet(We),s=(n.override||t.languageDataAt("autocomplete",n1(t)).map(DW)).map(l=>(this.active.find(m=>m.source==l)||new Ct(l,this.active.some(m=>m.state!=0)?1:0)).update(e,n));s.length==this.active.length&&s.every((l,u)=>l==this.active[u])&&(s=this.active);let r=this.open,o=e.effects.some(l=>l.is(P0));r&&e.docChanged&&(r=r.map(e.changes)),e.selection||s.some(l=>l.hasResult()&&e.changes.touchesRange(l.from,l.to))||!RW(s,this.active)||o?r=v1.build(s,t,this.id,r,n,o):r&&r.disabled&&!s.some(l=>l.isPending)&&(r=null),!r&&s.every(l=>!l.isPending)&&s.some(l=>l.hasResult())&&(s=s.map(l=>l.hasResult()?new Ct(l.source,0):l));for(let l of e.effects)l.is(A0)&&(r=r&&r.setSelected(l.value,this.id));return s==this.active&&r==this.open?this:new Ps(s,this.id,r)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?GW:HW}}function RW(i,e){if(i==e)return!0;for(let t=0,n=0;;){for(;t-1&&(t["aria-activedescendant"]=i+"-"+e),t}const VW=[];function Gp(i,e){if(i.isUserEvent("input.complete")){let n=i.annotation(O0);if(n&&e.activateOnCompletion(n))return 12}let t=i.isUserEvent("input.type");return t&&e.activateOnTyping?5:t?1:i.isUserEvent("delete.backward")?2:i.selection?8:i.docChanged?16:0}class Ct{constructor(e,t,n=!1){this.source=e,this.state=t,this.explicit=n}hasResult(){return!1}get isPending(){return this.state==1}update(e,t){let n=Gp(e,t),a=this;(n&8||n&16&&this.touches(e))&&(a=new Ct(a.source,0)),n&4&&a.state==0&&(a=new Ct(this.source,1)),a=a.updateFor(e,n);for(let s of e.effects)if(s.is(As))a=new Ct(a.source,1,s.value);else if(s.is(Ci))a=new Ct(a.source,0);else if(s.is(P0))for(let r of s.value)r.source==a.source&&(a=r);return a}updateFor(e,t){return this.map(e.changes)}map(e){return this}touches(e){return e.changes.touchesRange(n1(e.state))}}class _1 extends Ct{constructor(e,t,n,a,s,r){super(e,3,t),this.limit=n,this.result=a,this.from=s,this.to=r}hasResult(){return!0}updateFor(e,t){var n;if(!(t&3))return this.map(e.changes);let a=this.result;a.map&&!e.changes.empty&&(a=a.map(a,e.changes));let s=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),o=n1(e.state);if(o>r||!a||t&2&&(n1(e.startState)==this.from||ot.map(e))}}),mt=Zt.define({create(){return Ps.start()},update(i,e){return i.update(e)},provide:i=>[Ip.from(i,e=>e.tooltip),H.contentAttributes.from(i,e=>e.attrs)]});function j0(i,e){const t=e.completion.apply||e.completion.label;let n=i.state.field(mt).active.find(a=>a.source==e.source);return n instanceof _1?(typeof t=="string"?i.dispatch({...BW(i.state,t,n.from,n.to),annotations:O0.of(e.completion)}):t(i,e.completion,n.from,n.to),!0):!1}const qW=NW(mt,j0);function _a(i,e="option"){return t=>{let n=t.state.field(mt,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+a*(i?1:-1):i?0:r-1;return o<0?o=e=="page"?0:r-1:o>=r&&(o=e=="page"?r-1:0),t.dispatch({effects:A0.of(o)}),!0}}const UW=i=>{let e=i.state.field(mt,!1);return i.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampi.state.field(mt,!1)?(i.dispatch({effects:As.of(!0)}),!0):!1,$W=i=>{let e=i.state.field(mt,!1);return!e||!e.active.some(t=>t.state!=0)?!1:(i.dispatch({effects:Ci.of(null)}),!0)};class YW{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const XW=50,KW=1e3,eE=Dt.fromClass(class{constructor(i){this.view=i,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of i.state.field(mt).active)e.isPending&&this.startQuery(e)}update(i){let e=i.state.field(mt),t=i.state.facet(We);if(!i.selectionSet&&!i.docChanged&&i.startState.field(mt)==e)return;let n=i.transactions.some(s=>{let r=Gp(s,t);return r&8||(s.selection||s.docChanged)&&!(r&3)});for(let s=0;sXW&&Date.now()-r.time>KW){for(let o of r.context.abortListeners)try{o()}catch(l){bt(this.view.state,l)}r.context.abortListeners=null,this.running.splice(s--,1)}else r.updates.push(...i.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),i.transactions.some(s=>s.effects.some(r=>r.is(As)))&&(this.pendingStart=!0);let a=this.pendingStart?50:t.activateOnTypingDelay;if(this.debounceUpdate=e.active.some(s=>s.isPending&&!this.running.some(r=>r.active.source==s.source))?setTimeout(()=>this.startUpdate(),a):-1,this.composing!=0)for(let s of i.transactions)s.isUserEvent("input.type")?this.composing=2:this.composing==2&&s.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:i}=this.view,e=i.field(mt);for(let t of e.active)t.isPending&&!this.running.some(n=>n.active.source==t.source)&&this.startQuery(t);this.running.length&&e.open&&e.open.disabled&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(We).updateSyncTime))}startQuery(i){let{state:e}=this.view,t=n1(e),n=new Jp(e,t,i.explicit,this.view),a=new YW(i,n);this.running.push(a),Promise.resolve(i.source(n)).then(s=>{a.context.aborted||(a.done=s||null,this.scheduleAccept())},s=>{this.view.dispatch({effects:Ci.of(null)}),bt(this.view.state,s)})}scheduleAccept(){this.running.every(i=>i.done!==void 0)?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout(()=>this.accept(),this.view.state.facet(We).updateSyncTime))}accept(){var i;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],t=this.view.state.facet(We),n=this.view.state.field(mt);for(let a=0;ao.source==s.active.source);if(r&&r.isPending)if(s.done==null){let o=new Ct(s.active.source,0);for(let l of s.updates)o=o.update(l,t);o.isPending||e.push(o)}else this.startQuery(r)}(e.length||n.open&&n.open.disabled)&&this.view.dispatch({effects:P0.of(e)})}},{eventHandlers:{blur(i){let e=this.view.state.field(mt,!1);if(e&&e.tooltip&&this.view.state.facet(We).closeOnBlur){let t=e.open&&kp(this.view,e.open.tooltip);(!t||!t.dom.contains(i.relatedTarget))&&setTimeout(()=>this.view.dispatch({effects:Ci.of(null)}),10)}},compositionstart(){this.composing=1},compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({effects:As.of(!1)}),20),this.composing=0}}}),tE=typeof navigator=="object"&&/Win/.test(navigator.platform),nE=r1.highest(H.domEventHandlers({keydown(i,e){let t=e.state.field(mt,!1);if(!t||!t.open||t.open.disabled||t.open.selected<0||!i.key||i.key.length>1||i.ctrlKey&&!(tE&&i.altKey)||i.metaKey)return!1;let n=t.open.options[t.open.selected],a=t.active.find(r=>r.source==n.source),s=n.completion.commitCharacters||a.result.commitCharacters;return s&&s.indexOf(i.key)>-1&&j0(e,n),!1}})),Hp=H.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center",cursor:"pointer"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class iE{constructor(e,t,n,a){this.field=e,this.line=t,this.from=n,this.to=a}}class C0{constructor(e,t,n){this.field=e,this.from=t,this.to=n}map(e){let t=e.mapPos(this.from,-1,Xe.TrackDel),n=e.mapPos(this.to,1,Xe.TrackDel);return t==null||n==null?null:new C0(this.field,t,n)}}class B0{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let n=[],a=[t],s=e.doc.lineAt(t),r=/^\s*/.exec(s.text)[0];for(let l of this.lines){if(n.length){let u=r,m=/^\t*/.exec(l)[0].length;for(let c=0;cnew C0(l.field,a[l.line]+l.from,a[l.line]+l.to));return{text:n,ranges:o}}static parse(e){let t=[],n=[],a=[],s;for(let r of e.split(/\r\n?|\n/)){for(;s=/[#$]\{(?:(\d+)(?::([^{}]*))?|((?:\\[{}]|[^{}])*))\}/.exec(r);){let o=s[1]?+s[1]:null,l=s[2]||s[3]||"",u=-1;o===0&&(o=1e9);let m=l.replace(/\\[{}]/g,c=>c[1]);for(let c=0;c=u&&d.field++}for(let c of a)if(c.line==n.length&&c.from>s.index){let d=s[2]?3+(s[1]||"").length:2;c.from-=d,c.to-=d}a.push(new iE(u,n.length,s.index,s.index+m.length)),r=r.slice(0,s.index)+l+r.slice(s.index+s[0].length)}r=r.replace(/\\([{}])/g,(o,l,u)=>{for(let m of a)m.line==n.length&&m.from>u&&(m.from--,m.to--);return l}),n.push(r)}return new B0(n,a)}}let aE=ue.widget({widget:new class extends Ei{toDOM(){let i=document.createElement("span");return i.className="cm-snippetFieldPosition",i}ignoreEvent(){return!1}}}),sE=ue.mark({class:"cm-snippetField"});class M1{constructor(e,t){this.ranges=e,this.active=t,this.deco=ue.set(e.map(n=>(n.from==n.to?aE:sE).range(n.from,n.to)),!0)}map(e){let t=[];for(let n of this.ranges){let a=n.map(e);if(!a)return null;t.push(a)}return new M1(t,this.active)}selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(n=>n.field==this.active&&n.from<=t.from&&n.to>=t.to))}}const Gi=re.define({map(i,e){return i&&i.map(e)}}),rE=re.define(),Bi=Zt.define({create(){return null},update(i,e){for(let t of e.effects){if(t.is(Gi))return t.value;if(t.is(rE)&&i)return new M1(i.ranges,t.value)}return i&&e.docChanged&&(i=i.map(e.changes)),i&&e.selection&&!i.selectionInsideField(e.selection)&&(i=null),i},provide:i=>H.decorations.from(i,e=>e?e.deco:ue.none)});function D0(i,e){return B.create(i.filter(t=>t.field==e).map(t=>B.range(t.from,t.to)))}function oE(i){let e=B0.parse(i);return(t,n,a,s)=>{let{text:r,ranges:o}=e.instantiate(t.state,a),{main:l}=t.state.selection,u={changes:{from:a,to:s==l.from?l.to:s,insert:ae.of(r)},scrollIntoView:!0,annotations:n?[O0.of(n),He.userEvent.of("input.complete")]:void 0};if(o.length&&(u.selection=D0(o,0)),o.some(m=>m.field>0)){let m=new M1(o,0),c=u.effects=[Gi.of(m)];t.state.field(Bi,!1)===void 0&&c.push(re.appendConfig.of([Bi,dE,hE,Hp]))}t.dispatch(t.state.update(u))}}function Vp(i){return({state:e,dispatch:t})=>{let n=e.field(Bi,!1);if(!n||i<0&&n.active==0)return!1;let a=n.active+i,s=i>0&&!n.ranges.some(r=>r.field==a+i);return t(e.update({selection:D0(n.ranges,a),effects:Gi.of(s?null:new M1(n.ranges,a)),scrollIntoView:!0})),!0}}const lE=({state:i,dispatch:e})=>i.field(Bi,!1)?(e(i.update({effects:Gi.of(null)})),!0):!1,uE=Vp(1),mE=Vp(-1),cE=[{key:"Tab",run:uE,shift:mE},{key:"Escape",run:lE}],zc=G.define({combine(i){return i.length?i[0]:cE}}),dE=r1.highest(Oi.compute([zc],i=>i.facet(zc)));function Z0(i,e){return{...e,apply:oE(i)}}const hE=H.domEventHandlers({mousedown(i,e){let t=e.state.field(Bi,!1),n;if(!t||(n=e.posAtCoords({x:i.clientX,y:i.clientY}))==null)return!1;let a=t.ranges.find(s=>s.from<=n&&s.to>=n);return!a||a.field==t.active?!1:(e.dispatch({selection:D0(t.ranges,a.field),effects:Gi.of(t.ranges.some(s=>s.field>a.field)?new M1(t.ranges,a.field):null),scrollIntoView:!0}),!0)}}),Di={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Un=re.define({map(i,e){let t=e.mapPos(i,-1,Xe.TrackAfter);return t??void 0}}),M0=new class extends Cn{};M0.startSide=1;M0.endSide=-1;const Qp=Zt.define({create(){return X.empty},update(i,e){if(i=i.map(e.changes),e.selection){let t=e.state.doc.lineAt(e.selection.main.head);i=i.update({filter:n=>n>=t.from&&n<=t.to})}for(let t of e.effects)t.is(Un)&&(i=i.update({add:[M0.range(t.value,t.value+1)]}));return i}});function gE(){return[fE,Qp]}const Hr="()[]{}<>«»»«[]{}";function qp(i){for(let e=0;e{if((pE?i.composing:i.compositionStarted)||i.state.readOnly)return!1;let a=i.state.selection.main;if(n.length>2||n.length==2&&un(_t(n,0))==1||e!=a.from||t!=a.to)return!1;let s=yE(i.state,n);return s?(i.dispatch(s),!0):!1}),xE=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let n=Up(i,i.selection.main.head).brackets||Di.brackets,a=null,s=i.changeByRange(r=>{if(r.empty){let o=vE(i.doc,r.head);for(let l of n)if(l==o&&er(i.doc,r.head)==qp(_t(l,0)))return{changes:{from:r.head-l.length,to:r.head+l.length},range:B.cursor(r.head-l.length)}}return{range:a=r}});return a||e(i.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!a},bE=[{key:"Backspace",run:xE}];function yE(i,e){let t=Up(i,i.selection.main.head),n=t.brackets||Di.brackets;for(let a of n){let s=qp(_t(a,0));if(e==a)return s==a?IE(i,a,n.indexOf(a+a+a)>-1,t):wE(i,a,s,t.before||Di.before);if(e==s&&$p(i,i.selection.main.from))return zE(i,a,s)}return null}function $p(i,e){let t=!1;return i.field(Qp).between(0,i.doc.length,n=>{n==e&&(t=!0)}),t}function er(i,e){let t=i.sliceString(e,e+2);return t.slice(0,un(_t(t,0)))}function vE(i,e){let t=i.sliceString(e-2,e);return un(_t(t,0))==t.length?t:t.slice(1)}function wE(i,e,t,n){let a=null,s=i.changeByRange(r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:t,from:r.to}],effects:Un.of(r.to+e.length),range:B.range(r.anchor+e.length,r.head+e.length)};let o=er(i.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+t,from:r.head},effects:Un.of(r.head+e.length),range:B.cursor(r.head+e.length)}:{range:a=r}});return a?null:i.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function zE(i,e,t){let n=null,a=i.changeByRange(s=>s.empty&&er(i.doc,s.head)==t?{changes:{from:s.head,to:s.head+t.length,insert:t},range:B.cursor(s.head+t.length)}:n={range:s});return n?null:i.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function IE(i,e,t,n){let a=n.stringPrefixes||Di.stringPrefixes,s=null,r=i.changeByRange(o=>{if(!o.empty)return{changes:[{insert:e,from:o.from},{insert:e,from:o.to}],effects:Un.of(o.to+e.length),range:B.range(o.anchor+e.length,o.head+e.length)};let l=o.head,u=er(i.doc,l),m;if(u==e){if(Ic(i,l))return{changes:{insert:e+e,from:l},effects:Un.of(l+e.length),range:B.cursor(l+e.length)};if($p(i,l)){let d=t&&i.sliceDoc(l,l+e.length*3)==e+e+e?e+e+e:e;return{changes:{from:l,to:l+d.length,insert:d},range:B.cursor(l+d.length)}}}else{if(t&&i.sliceDoc(l-2*e.length,l)==e+e&&(m=kc(i,l-2*e.length,a))>-1&&Ic(i,m))return{changes:{insert:e+e+e+e,from:l},effects:Un.of(l+e.length),range:B.cursor(l+e.length)};if(i.charCategorizer(l)(u)!=Pt.Word&&kc(i,l,a)>-1&&!kE(i,l,e,a))return{changes:{insert:e+e,from:l},effects:Un.of(l+e.length),range:B.cursor(l+e.length)}}return{range:s=o}});return s?null:i.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Ic(i,e){let t=et(i).resolveInner(e+1);return t.parent&&t.from==e}function kE(i,e,t,n){let a=et(i).resolveInner(e,-1),s=n.reduce((r,o)=>Math.max(r,o.length),0);for(let r=0;r<5;r++){let o=i.sliceDoc(a.from,Math.min(a.to,a.from+t.length+s)),l=o.indexOf(t);if(!l||l>-1&&n.indexOf(o.slice(0,l))>-1){let m=a.firstChild;for(;m&&m.from==a.from&&m.to-m.from>t.length+l;){if(i.sliceDoc(m.to-t.length,m.to)==t)return!1;m=m.firstChild}return!0}let u=a.to==e&&a.parent;if(!u)break;a=u}return!1}function kc(i,e,t){let n=i.charCategorizer(e);if(n(i.sliceDoc(e-1,e))!=Pt.Word)return e;for(let a of t){let s=e-a.length;if(i.sliceDoc(s,e)==a&&n(i.sliceDoc(s-1,s))!=Pt.Word)return s}return-1}function SE(i={}){return[nE,mt,We.of(i),eE,_E,Hp]}const Yp=[{key:"Ctrl-Space",run:Gr},{mac:"Alt-`",run:Gr},{mac:"Alt-i",run:Gr},{key:"Escape",run:$W},{key:"ArrowDown",run:_a(!0)},{key:"ArrowUp",run:_a(!1)},{key:"PageDown",run:_a(!0,"page")},{key:"PageUp",run:_a(!1,"page")},{key:"Enter",run:UW}],_E=r1.highest(Oi.computeN([We],i=>i.facet(We).defaultKeymap?[Yp]:[])),TE=i=>{let{state:e}=i,t=e.doc.lineAt(e.selection.main.from),n=W0(i.state,t.from);return n.line?OE(i):n.block?PE(i):!1};function L0(i,e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let a=i(e,t);return a?(n(t.update(a)),!0):!1}}const OE=L0(BE,0),AE=L0(Xp,0),PE=L0((i,e)=>Xp(i,e,CE(e)),0);function W0(i,e){let t=i.languageDataAt("commentTokens",e,1);return t.length?t[0]:{}}const Q1=50;function jE(i,{open:e,close:t},n,a){let s=i.sliceDoc(n-Q1,n),r=i.sliceDoc(a,a+Q1),o=/\s*$/.exec(s)[0].length,l=/^\s*/.exec(r)[0].length,u=s.length-o;if(s.slice(u-e.length,u)==e&&r.slice(l,l+t.length)==t)return{open:{pos:n-o,margin:o&&1},close:{pos:a+l,margin:l&&1}};let m,c;a-n<=2*Q1?m=c=i.sliceDoc(n,a):(m=i.sliceDoc(n,n+Q1),c=i.sliceDoc(a-Q1,a));let d=/^\s*/.exec(m)[0].length,h=/\s*$/.exec(c)[0].length,g=c.length-h-t.length;return m.slice(d,d+e.length)==e&&c.slice(g,g+t.length)==t?{open:{pos:n+d+e.length,margin:/\s/.test(m.charAt(d+e.length))?1:0},close:{pos:a-h-t.length,margin:/\s/.test(c.charAt(g-1))?1:0}}:null}function CE(i){let e=[];for(let t of i.selection.ranges){let n=i.doc.lineAt(t.from),a=t.to<=n.to?n:i.doc.lineAt(t.to);a.from>n.from&&a.from==t.to&&(a=t.to==n.to+1?n:i.doc.lineAt(t.to-1));let s=e.length-1;s>=0&&e[s].to>n.from?e[s].to=a.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:a.to})}return e}function Xp(i,e,t=e.selection.ranges){let n=t.map(s=>W0(e,s.from).block);if(!n.every(s=>s))return null;let a=t.map((s,r)=>jE(e,n[r],s.from,s.to));if(i!=2&&!a.every(s=>s))return{changes:e.changes(t.map((s,r)=>a[r]?[]:[{from:s.from,insert:n[r].open+" "},{from:s.to,insert:" "+n[r].close}]))};if(i!=1&&a.some(s=>s)){let s=[];for(let r=0,o;ra&&(s==r||r>c.from)){a=c.from;let d=/^\s*/.exec(c.text)[0].length,h=d==c.length,g=c.text.slice(d,d+u.length)==u?d:-1;ds.comment<0&&(!s.empty||s.single))){let s=[];for(let{line:o,token:l,indent:u,empty:m,single:c}of n)(c||!m)&&s.push({from:o.from+u,insert:l+" "});let r=e.changes(s);return{changes:r,selection:e.selection.map(r,1)}}else if(i!=1&&n.some(s=>s.comment>=0)){let s=[];for(let{line:r,comment:o,token:l}of n)if(o>=0){let u=r.from+o,m=u+l.length;r.text[m-r.from]==" "&&m++,s.push({from:u,to:m})}return{changes:s}}return null}function L1(i,e){return B.create(i.ranges.map(e),i.mainIndex)}function Vt(i,e){return i.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function Qt({state:i,dispatch:e},t){let n=L1(i.selection,t);return n.eq(i.selection,!0)?!1:(e(Vt(i,n)),!0)}function tr(i,e){return B.cursor(e?i.to:i.from)}function Kp(i,e){return Qt(i,t=>t.empty?i.moveByChar(t,e):tr(t,e))}function tt(i){return i.textDirectionAt(i.state.selection.main.head)==de.LTR}const ef=i=>Kp(i,!tt(i)),tf=i=>Kp(i,tt(i));function nf(i,e){return Qt(i,t=>t.empty?i.moveByGroup(t,e):tr(t,e))}const DE=i=>nf(i,!tt(i)),ZE=i=>nf(i,tt(i));function ME(i,e,t){if(e.type.prop(t))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(i.sliceDoc(e.from,e.to)))||e.firstChild}function nr(i,e,t){let n=et(i).resolveInner(e.head),a=t?K.closedBy:K.openedBy;for(let l=e.head;;){let u=t?n.childAfter(l):n.childBefore(l);if(!u)break;ME(i,u,a)?n=u:l=t?u.to:u.from}let s=n.type.prop(a),r,o;return s&&(r=t?sn(i,n.from,1):sn(i,n.to,-1))&&r.matched?o=t?r.end.to:r.end.from:o=t?n.to:n.from,B.cursor(o,t?-1:1)}const LE=i=>Qt(i,e=>nr(i.state,e,!tt(i))),WE=i=>Qt(i,e=>nr(i.state,e,tt(i)));function af(i,e){return Qt(i,t=>{if(!t.empty)return tr(t,e);let n=i.moveVertically(t,e);return n.head!=t.head?n:i.moveToLineBoundary(t,e)})}const sf=i=>af(i,!1),rf=i=>af(i,!0);function of(i){let e=i.scrollDOM.clientHeightr.empty?i.moveVertically(r,e,t.height):tr(r,e));if(a.eq(n.selection))return!1;let s;if(t.selfScroll){let r=i.coordsAtPos(n.selection.main.head),o=i.scrollDOM.getBoundingClientRect(),l=o.top+t.marginTop,u=o.bottom-t.marginBottom;r&&r.top>l&&r.bottomlf(i,!1),vl=i=>lf(i,!0);function Wn(i,e,t){let n=i.lineBlockAt(e.head),a=i.moveToLineBoundary(e,t);if(a.head==e.head&&a.head!=(t?n.to:n.from)&&(a=i.moveToLineBoundary(e,t,!1)),!t&&a.head==n.from&&n.length){let s=/^\s*/.exec(i.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;s&&e.head!=n.from+s&&(a=B.cursor(n.from+s))}return a}const EE=i=>Qt(i,e=>Wn(i,e,!0)),NE=i=>Qt(i,e=>Wn(i,e,!1)),FE=i=>Qt(i,e=>Wn(i,e,!tt(i))),JE=i=>Qt(i,e=>Wn(i,e,tt(i))),RE=i=>Qt(i,e=>i.moveToLineBoundary(e,!1,!1)),GE=i=>Qt(i,e=>i.moveToLineBoundary(e,!0,!1));function HE(i,e,t){let n=!1,a=L1(i.selection,s=>{let r=sn(i,s.head,-1)||sn(i,s.head,1)||s.head>0&&sn(i,s.head-1,1)||s.headHE(i,e);function Mt(i,e,t){let n=L1(i.state.selection,a=>{a.undirectional&&a.head>=a.anchor!=e&&(a=B.range(a.head,a.anchor));let s=t(a);return B.range(a.anchor,s.head,s.goalColumn,s.bidiLevel||void 0,s.assoc)});return n.eq(i.state.selection)?!1:(i.dispatch(Vt(i.state,n)),!0)}function uf(i,e){return Mt(i,e,t=>i.moveByChar(t,e))}const mf=i=>uf(i,!tt(i)),cf=i=>uf(i,tt(i));function df(i,e){return Mt(i,e,t=>i.moveByGroup(t,e))}const QE=i=>df(i,!tt(i)),qE=i=>df(i,tt(i)),UE=i=>{let e=!tt(i);return Mt(i,e,t=>nr(i.state,t,e))},$E=i=>{let e=tt(i);return Mt(i,e,t=>nr(i.state,t,e))};function hf(i,e){return Mt(i,e,t=>i.moveVertically(t,e))}const gf=i=>hf(i,!1),pf=i=>hf(i,!0);function ff(i,e){return Mt(i,e,t=>i.moveVertically(t,e,of(i).height))}const _c=i=>ff(i,!1),Tc=i=>ff(i,!0),YE=i=>Mt(i,!0,e=>Wn(i,e,!0)),XE=i=>Mt(i,!1,e=>Wn(i,e,!1)),KE=i=>{let e=!tt(i);return Mt(i,e,t=>Wn(i,t,e))},eN=i=>{let e=tt(i);return Mt(i,e,t=>Wn(i,t,e))},tN=i=>Mt(i,!1,e=>B.cursor(i.lineBlockAt(e.head).from)),nN=i=>Mt(i,!0,e=>B.cursor(i.lineBlockAt(e.head).to)),Oc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:0})),!0),Ac=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.doc.length})),!0),Pc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.selection.main.anchor,head:0})),!0),jc=({state:i,dispatch:e})=>(e(Vt(i,{anchor:i.selection.main.anchor,head:i.doc.length})),!0),iN=({state:i,dispatch:e})=>(e(i.update({selection:{anchor:0,head:i.doc.length},userEvent:"select"})),!0),aN=({state:i,dispatch:e})=>{let t=ir(i).map(({from:n,to:a})=>B.undirectionalRange(n,Math.min(a+1,i.doc.length)));return e(i.update({selection:B.create(t),userEvent:"select"})),!0},sN=({state:i,dispatch:e})=>{let t=L1(i.selection,n=>{let a=et(i),s=a.resolveStack(n.from,1);if(n.empty){let r=a.resolveStack(n.from,-1);r.node.from>=s.node.from&&r.node.to<=s.node.to&&(s=r)}for(let r=s;r;r=r.next){let{node:o}=r;if((o.from=n.to||o.to>n.to&&o.from<=n.from)&&r.next)return B.undirectionalRange(o.from,o.to)}return n});return t.eq(i.selection)?!1:(e(Vt(i,t)),!0)};function xf(i,e){let{state:t}=i,n=t.selection,a=t.selection.ranges.slice();for(let s of t.selection.ranges){let r=t.doc.lineAt(s.head);if(e?r.to0)for(let o=s;;){let l=i.moveVertically(o,e);if(l.headr.to){a.some(u=>u.head==l.head)||a.push(l);break}else{if(l.head==o.head)break;o=l}}}return a.length==n.ranges.length?!1:(i.dispatch(Vt(t,B.create(a,a.length-1))),!0)}const rN=i=>xf(i,!1),oN=i=>xf(i,!0),lN=({state:i,dispatch:e})=>{let t=i.selection,n=null;return t.ranges.length>1?n=B.create([t.main]):t.main.empty||(n=B.create([B.cursor(t.main.head)])),n?(e(Vt(i,n)),!0):!1};function Hi(i,e){if(i.state.readOnly)return!1;let t="delete.selection",{state:n}=i,a=n.changeByRange(s=>{let{from:r,to:o}=s;if(r==o){let l=e(s);lr&&(t="delete.forward",l=Ta(i,l,!0)),r=Math.min(r,l),o=Math.max(o,l)}else r=Ta(i,r,!1),o=Ta(i,o,!0);return r==o?{range:s}:{changes:{from:r,to:o},range:B.cursor(r,ra(i)))n.between(e,e,(a,s)=>{ae&&(e=t?s:a)});return e}const bf=(i,e,t)=>Hi(i,n=>{let a=n.from,{state:s}=i,r=s.doc.lineAt(a),o,l;if(t&&!e&&a>r.from&&abf(i,!1,!0),yf=i=>bf(i,!0,!1),vf=(i,e)=>Hi(i,t=>{let n=t.head,{state:a}=i,s=a.doc.lineAt(n),r=a.charCategorizer(n);for(let o=null;;){if(n==(e?s.to:s.from)){n==t.head&&s.number!=(e?a.doc.lines:1)&&(n+=e?1:-1);break}let l=Ke(s.text,n-s.from,e)+s.from,u=s.text.slice(Math.min(n,l)-s.from,Math.max(n,l)-s.from),m=r(u);if(o!=null&&m!=o)break;(u!=" "||n!=t.head)&&(o=m),n=l}return n}),wf=i=>vf(i,!1),uN=i=>vf(i,!0),mN=i=>Hi(i,e=>{let t=i.lineBlockAt(e.head).to;return e.headHi(i,e=>{let t=i.moveToLineBoundary(e,!1).head;return e.head>t?t:Math.max(0,e.head-1)}),dN=i=>Hi(i,e=>{let t=i.moveToLineBoundary(e,!0).head;return e.head{if(i.readOnly)return!1;let t=i.changeByRange(n=>({changes:{from:n.from,to:n.to,insert:ae.of(["",""])},range:B.cursor(n.from)}));return e(i.update(t,{scrollIntoView:!0,userEvent:"input"})),!0},gN=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=i.changeByRange(n=>{if(!n.empty||n.from==0||n.from==i.doc.length)return{range:n};let a=n.from,s=i.doc.lineAt(a),r=a==s.from?a-1:Ke(s.text,a-s.from,!1)+s.from,o=a==s.to?a+1:Ke(s.text,a-s.from,!0)+s.from;return{changes:{from:r,to:o,insert:i.doc.slice(a,o).append(i.doc.slice(r,a))},range:B.cursor(o)}});return t.changes.empty?!1:(e(i.update(t,{scrollIntoView:!0,userEvent:"move.character"})),!0)};function ir(i){let e=[],t=-1;for(let n of i.selection.ranges){let a=i.doc.lineAt(n.from),s=i.doc.lineAt(n.to);if(!n.empty&&n.to==s.from&&(s=i.doc.lineAt(n.to-1)),t>=a.number){let r=e[e.length-1];r.to=s.to,r.ranges.push(n)}else e.push({from:a.from,to:s.to,ranges:[n]});t=s.number+1}return e}function zf(i,e,t){if(i.readOnly)return!1;let n=[],a=[];for(let s of ir(i)){if(t?s.to==i.doc.length:s.from==0)continue;let r=i.doc.lineAt(t?s.to+1:s.from-1),o=r.length+1;if(t){n.push({from:s.to,to:r.to},{from:s.from,insert:r.text+i.lineBreak});for(let l of s.ranges)a.push(B.range(Math.min(i.doc.length,l.anchor+o),Math.min(i.doc.length,l.head+o)))}else{n.push({from:r.from,to:s.from},{from:s.to,insert:i.lineBreak+r.text});for(let l of s.ranges)a.push(B.range(l.anchor-o,l.head-o))}}return n.length?(e(i.update({changes:n,scrollIntoView:!0,selection:B.create(a,i.selection.mainIndex),userEvent:"move.line"})),!0):!1}const pN=({state:i,dispatch:e})=>zf(i,e,!1),fN=({state:i,dispatch:e})=>zf(i,e,!0);function If(i,e,t){if(i.readOnly)return!1;let n=[];for(let s of ir(i))t?n.push({from:s.from,insert:i.doc.slice(s.from,s.to)+i.lineBreak}):n.push({from:s.to,insert:i.lineBreak+i.doc.slice(s.from,s.to)});let a=i.changes(n);return e(i.update({changes:a,selection:i.selection.map(a,t?1:-1),scrollIntoView:!0,userEvent:"input.copyline"})),!0}const xN=({state:i,dispatch:e})=>If(i,e,!1),bN=({state:i,dispatch:e})=>If(i,e,!0),yN=i=>{if(i.state.readOnly)return!1;let{state:e}=i,t=e.changes(ir(e).map(({from:a,to:s})=>(a>0?a--:s{let s;if(i.lineWrapping){let r=i.lineBlockAt(a.head),o=i.coordsAtPos(a.head,a.assoc||1);o&&(s=r.bottom+i.documentTop-o.bottom+i.defaultLineHeight/2)}return i.moveVertically(a,!0,s)}).map(t);return i.dispatch({changes:t,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0};function vN(i,e){if(/\(\)|\[\]|\{\}/.test(i.sliceDoc(e-1,e+1)))return{from:e,to:e};let t=et(i).resolveInner(e),n=t.childBefore(e),a=t.childAfter(e),s;return n&&a&&n.to<=e&&a.from>=e&&(s=n.type.prop(K.closedBy))&&s.indexOf(a.name)>-1&&i.doc.lineAt(n.to).from==i.doc.lineAt(a.from).from&&!/\S/.test(i.sliceDoc(n.to,a.from))?{from:n.to,to:a.from}:null}const Cc=kf(!1),wN=kf(!0);function kf(i){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(a=>{let{from:s,to:r}=a,o=e.doc.lineAt(s),l=!i&&s==r&&vN(e,s);i&&(s=r=(r<=o.to?o:e.doc.lineAt(r)).to);let u=new Xs(e,{simulateBreak:s,simulateDoubleBreak:!!l}),m=_0(u,s);for(m==null&&(m=Wi(/^\s*/.exec(e.doc.lineAt(s).text)[0],e.tabSize));ro.from&&s{let a=[];for(let r=n.from;r<=n.to;){let o=i.doc.lineAt(r);o.number>t&&(n.empty||n.to>o.from)&&(e(o,a,n),t=o.number),r=o.to+1}let s=i.changes(a);return{changes:a,range:B.range(s.mapPos(n.anchor,1),s.mapPos(n.head,1))}})}const zN=({state:i,dispatch:e})=>{if(i.readOnly)return!1;let t=Object.create(null),n=new Xs(i,{overrideIndentation:s=>{let r=t[s];return r??-1}}),a=E0(i,(s,r,o)=>{let l=_0(n,s.from);if(l==null)return;/\S/.test(s.text)||(l=0);let u=/^\s*/.exec(s.text)[0],m=ji(i,l);(u!=m||o.fromi.readOnly?!1:(e(i.update(E0(i,(t,n)=>{n.push({from:t.from,insert:i.facet(Ri)})}),{userEvent:"input.indent"})),!0),_f=({state:i,dispatch:e})=>i.readOnly?!1:(e(i.update(E0(i,(t,n)=>{let a=/^\s*/.exec(t.text)[0];if(!a)return;let s=Wi(a,i.tabSize),r=0,o=ji(i,Math.max(0,s-Os(i)));for(;r(i.setTabFocusMode(),!0),kN=[{key:"Ctrl-b",run:ef,shift:mf,preventDefault:!0},{key:"Ctrl-f",run:tf,shift:cf},{key:"Ctrl-p",run:sf,shift:gf},{key:"Ctrl-n",run:rf,shift:pf},{key:"Ctrl-a",run:RE,shift:tN},{key:"Ctrl-e",run:GE,shift:nN},{key:"Ctrl-d",run:yf},{key:"Ctrl-h",run:wl},{key:"Ctrl-k",run:mN},{key:"Ctrl-Alt-h",run:wf},{key:"Ctrl-o",run:hN},{key:"Ctrl-t",run:gN},{key:"Ctrl-v",run:vl}],SN=[{key:"ArrowLeft",run:ef,shift:mf,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:DE,shift:QE,preventDefault:!0},{mac:"Cmd-ArrowLeft",run:FE,shift:KE,preventDefault:!0},{key:"ArrowRight",run:tf,shift:cf,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:ZE,shift:qE,preventDefault:!0},{mac:"Cmd-ArrowRight",run:JE,shift:eN,preventDefault:!0},{key:"ArrowUp",run:sf,shift:gf,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Oc,shift:Pc},{mac:"Ctrl-ArrowUp",run:Sc,shift:_c},{key:"ArrowDown",run:rf,shift:pf,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Ac,shift:jc},{mac:"Ctrl-ArrowDown",run:vl,shift:Tc},{key:"PageUp",run:Sc,shift:_c},{key:"PageDown",run:vl,shift:Tc},{key:"Home",run:NE,shift:XE,preventDefault:!0},{key:"Mod-Home",run:Oc,shift:Pc},{key:"End",run:EE,shift:YE,preventDefault:!0},{key:"Mod-End",run:Ac,shift:jc},{key:"Enter",run:Cc,shift:Cc},{key:"Mod-a",run:iN},{key:"Backspace",run:wl,shift:wl,preventDefault:!0},{key:"Delete",run:yf,preventDefault:!0},{key:"Mod-Backspace",mac:"Alt-Backspace",run:wf,preventDefault:!0},{key:"Mod-Delete",mac:"Alt-Delete",run:uN,preventDefault:!0},{mac:"Mod-Backspace",run:cN,preventDefault:!0},{mac:"Mod-Delete",run:dN,preventDefault:!0}].concat(kN.map(i=>({mac:i.key,run:i.run,shift:i.shift}))),_N=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:LE,shift:UE},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:WE,shift:$E},{key:"Alt-ArrowUp",run:pN},{key:"Shift-Alt-ArrowUp",run:xN},{key:"Alt-ArrowDown",run:fN},{key:"Shift-Alt-ArrowDown",run:bN},{key:"Mod-Alt-ArrowUp",run:rN},{key:"Mod-Alt-ArrowDown",run:oN},{key:"Escape",run:lN},{key:"Mod-Enter",run:wN},{key:"Alt-l",mac:"Ctrl-l",run:aN},{key:"Mod-i",run:sN,preventDefault:!0},{key:"Mod-[",run:_f},{key:"Mod-]",run:Sf},{key:"Mod-Alt-\\",run:zN},{key:"Shift-Mod-k",run:yN},{key:"Shift-Mod-\\",run:VE},{key:"Mod-/",run:TE},{key:"Alt-A",mac:"Ctrl-A",run:AE},{key:"Ctrl-m",mac:"Shift-Alt-m",run:IN}].concat(SN),TN={key:"Tab",run:Sf,shift:_f};var Bc={};class js{constructor(e,t,n,a,s,r,o,l,u,m=0,c){this.p=e,this.stack=t,this.state=n,this.reducePos=a,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=l,this.curContext=u,this.lookAhead=m,this.parent=c}toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,n=0){let a=e.parser.context;return new js(e,[],t,n,n,0,[],0,a?new Dc(a,a.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let n=e>>19,a=e&65535,{parser:s}=this.p,r=this.reducePos=2e3&&!(!((t=this.p.parser.nodeSet.types[a])===null||t===void 0)&&t.isAnonymous)&&(u==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=m):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(a,u)}storeNode(e,t,n,a=4,s=!1){if(e==0&&(!this.stack.length||this.stack[this.stack.length-1]0&&this.buffer[r-4]==0&&this.buffer[r-1]>-1){if(t==n)return;if(this.buffer[r-2]>=t){this.buffer[r-2]=n;return}}}if(!s||this.pos==n)this.buffer.push(e,t,n,a);else{let r=this.buffer.length;if(r>0&&(this.buffer[r-4]!=0||this.buffer[r-1]<0)){let o=!1;for(let l=r;l>0&&this.buffer[l-2]>n;l-=4)if(this.buffer[l-1]>=0){o=!0;break}if(o)for(;r>0&&this.buffer[r-2]>n;)this.buffer[r]=this.buffer[r-4],this.buffer[r+1]=this.buffer[r-3],this.buffer[r+2]=this.buffer[r-2],this.buffer[r+3]=this.buffer[r-1],r-=4,a>4&&(a-=4)}this.buffer[r]=e,this.buffer[r+1]=t,this.buffer[r+2]=n,this.buffer[r+3]=a}}shift(e,t,n,a){if(e&131072)this.pushState(e&65535,this.pos);else if((e&262144)==0){let s=e,{parser:r}=this.p;this.pos=a;let o=r.stateFlag(s,1);!o&&(a>n||t<=r.maxNode)&&(this.reducePos=a),this.pushState(s,o?n:Math.min(n,this.reducePos)),this.shiftContext(t,n),t<=r.maxNode&&this.buffer.push(t,n,a,4)}else this.pos=a,this.shiftContext(t,n),t<=this.p.parser.maxNode&&this.buffer.push(t,n,a,4)}apply(e,t,n,a){e&65536?this.reduce(e):this.shift(e,t,n,a)}useNode(e,t,n){let a=this.p.reused.length-1;(a<0||this.p.reused[a]!=e)&&(this.p.reused.push(e),a++);let s=this.reducePos=this.pos=n+e.length;this.pushState(t,n),this.buffer.push(a,n,s,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(t&&e.buffer[t-4]==0&&(t-=4);t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let n=e.buffer.slice(t),a=e.bufferBase+t;for(;e&&a==e.bufferBase;)e=e.parent;return new js(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,n,a,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let n=e<=this.p.parser.maxNode;n&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,n?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new ON(this);;){let n=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(n==0)return!1;if((n&65536)==0)return!0;t.reduce(n)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let a=[];for(let s=0,r;sl&1&&o==r)||a.push(t[s],r)}t=a}let n=[];for(let a=0;a>19,a=t&65535,s=this.stack.length-n*3;if(s<0||e.getGoto(this.stack[s],a,!1)<0){let r=this.findForcedReduction();if(r==null)return!1;t=r}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],n=(a,s)=>{if(!t.includes(a))return t.push(a),e.allActions(a,r=>{if(!(r&393216))if(r&65536){let o=(r>>19)-s;if(o>1){let l=r&65535,u=this.stack.length-o*3;if(u>=0&&e.getGoto(this.stack[u],l,!1)>=0)return o<<19|65536|l}}else{let o=n(r,s+1);if(o!=null)return o}})};return n(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;return e.data[e.stateSlot(this.state,1)]==65535&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;t0&&this.emitLookAhead()}}class Dc{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class ON{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=e&65535,n=e>>19;n==0?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=(n-1)*3;let a=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=a}}class Cs{constructor(e,t,n){this.stack=e,this.pos=t,this.index=n,this.buffer=e.buffer,this.index==0&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new Cs(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}fork(){return new Cs(this.stack,this.pos,this.index)}}function Oa(i,e=Uint16Array){if(typeof i!="string")return i;let t=null;for(let n=0,a=0;n=92&&r--,r>=34&&r--;let l=r-32;if(l>=46&&(l-=46,o=!0),s+=l,o)break;s*=46}t?t[a++]=s:t=new e(s)}return t}class Va{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Zc=new Va;class AN{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Zc,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let n=this.range,a=this.rangeIndex,s=this.pos+e;for(;sn.to:s>=n.to;){if(a==this.ranges.length-1)return null;let r=this.ranges[++a];s+=r.from-n.to,n=r}return s}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t=this.chunkOff+e,n,a;if(t>=0&&t=this.chunk2Pos&&no.to&&(this.chunk2=this.chunk2.slice(0,o.to-n)),a=this.chunk2.charCodeAt(0)}}return n>=this.token.lookAhead&&(this.token.lookAhead=n+1),a}acceptToken(e,t=0){let n=t?this.resolveOffset(t,-1):this.pos;if(n==null||n=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Zc,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let n="";for(let a of this.ranges){if(a.from>=t)break;a.to>e&&(n+=this.input.read(Math.max(a.from,e),Math.min(a.to,t)))}return n}}class T1{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:n}=t.p;PN(this.data,e,t,this.id,n.data,n.tokenPrecTable)}}T1.prototype.contextual=T1.prototype.fallback=T1.prototype.extend=!1;T1.prototype.fallback=T1.prototype.extend=!1;function PN(i,e,t,n,a,s){let r=0,o=1<0){let g=i[h];if(l.allows(g)&&(e.token.value==-1||e.token.value==g||jN(g,e.token.value,a,s))){e.acceptToken(g);break}}let m=e.next,c=0,d=i[r+2];if(e.next<0&&d>c&&i[u+d*3-3]==65535){r=i[u+d*3-1];continue e}for(;c>1,g=u+h+(h<<1),f=i[g],x=i[g+1]||65536;if(m=x)c=h+1;else{r=i[g+2],e.advance();continue e}}break}}function Mc(i,e,t){for(let n=e,a;(a=i[n])!=65535;n++)if(a==t)return n-e;return-1}function jN(i,e,t,n){let a=Mc(t,n,e);return a<0||Mc(t,n,i)e)&&!n.type.isError)return t<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(i.length,Math.max(n.from+1,e+25));if(t<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return t<0?0:i.length}}class CN{constructor(e,t){this.fragments=e,this.minRepeat=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.lastRepeat=null,this.lastRepeatPos=-1,this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?Lc(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?Lc(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(s instanceof je){let o=r>this.lastRepeatPos&&s.type.id>=this.minRepeat;if(r==e||o){let l=r+s.length,u;if(r>=this.safeFrom&&l<=this.safeTo&&(!(u=s.prop(K.lookAhead))||l+u=Math.max(this.safeFrom,e)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[t]++,this.nextStart=r+s.length}}}class BN{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map(n=>new Va)}getActions(e){let t=0,n=null,{parser:a}=e.p,{tokenizers:s}=a,r=a.stateSlot(e.state,3),o=e.curContext?e.curContext.hash:0,l=0;for(let u=0;uc.end+25&&(l=Math.max(c.lookAhead,l)),c.value!=0)){let d=t;if(c.extended>-1&&(t=this.addActions(e,c.extended,c.end,t)),t=this.addActions(e,c.value,c.end,t),!m.extend&&(n=c,t>d))break}}for(;this.actions.length>t;)this.actions.pop();return l&&e.setLookAhead(l),!n&&e.pos==this.stream.end&&(n=new Va,n.value=e.p.parser.eofTerm,n.start=n.end=e.pos,t=this.addActions(e,n.value,n.end,t)),this.mainToken=n,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new Va,{pos:n,p:a}=e;return t.start=n,t.end=Math.min(n+1,a.stream.end),t.value=n==a.stream.end?a.parser.eofTerm:0,t}updateCachedToken(e,t,n){let a=this.stream.clipPos(n.pos);if(t.token(this.stream.reset(a,e),n),e.value>-1){let{parser:s}=n.p;for(let r=0;r=0&&n.p.parser.dialect.allows(o>>1)){(o&1)==0?e.value=o>>1:e.extended=o>>1;break}}}else e.value=0,e.end=this.stream.clipPos(a+1)}putAction(e,t,n,a){for(let s=0;se.bufferLength*4?new CN(n,e.minRepeatTerm):null}get parsedPos(){return this.minStackPos}advance(){let e=this.stacks,t=this.minStackPos,n=this.stacks=[],a,s;if(this.bigReductionCount>300&&e.length==1){let[r]=e;for(;r.forceReduce()&&r.stack.length&&r.stack[r.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rt)n.push(o);else{if(this.advanceStack(o,n,e))continue;{a||(a=[],s=[]),a.push(o);let l=this.tokens.getMainToken(o);s.push(l.value,l.end)}}break}}if(!n.length){let r=a&&MN(a);if(r)return pt&&console.log("Finish with "+this.stackID(r)),this.stackToTree(r);if(this.parser.strict)throw pt&&a&&console.log("Stuck with token "+(this.tokens.mainToken?this.parser.getName(this.tokens.mainToken.value):"none")),new SyntaxError("No parse at "+t);this.recovering||(this.recovering=5)}if(this.recovering&&a){let r=this.stoppedAt!=null&&a[0].pos>this.stoppedAt?a[0]:this.runRecovery(a,s,n);if(r)return pt&&console.log("Force-finish "+this.stackID(r)),this.stackToTree(r.forceAll())}if(this.recovering){let r=this.recovering==1?1:this.recovering*3;if(n.length>r)for(n.sort((o,l)=>l.score-o.score);n.length>r;)n.pop();n.some(o=>o.reducePos>t)&&this.recovering--}else if(n.length>1){e:for(let r=0;r500&&u.buffer.length>500)if((o.score-u.score||o.buffer.length-u.buffer.length)>0)n.splice(l--,1);else{n.splice(r--,1);continue e}}}n.length>12&&(n.sort((r,o)=>o.score-r.score),n.splice(12,n.length-12))}this.minStackPos=n[0].pos;for(let r=1;r-1&&n.length&&(!s||(n.prop(K.contextHash)||0)==r))return e.useNode(n,o,t),n;if(n.children.length==0||n.positions[0]>0)break;let l=n.children[0];if(l instanceof je&&(!a||l.type.id>=this.parser.minRepeatTerm))n=l;else break}return null}advanceStack(e,t,n){let a=e.pos,{parser:s}=this,r=pt?this.stackID(e)+" -> ":"";if(this.stoppedAt!=null&&a>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let u=e.reducePos0)return e.reduce(o),pt&&console.log(r+this.stackID(e)+` (via always-reduce ${s.getName(o&65535)})`),!0;if(e.stack.length>=8400)for(;e.stack.length>6e3&&e.forceReduce(););let l=this.tokens.getActions(e);for(let u=0;ua?t.push(g):n.push(g)}return!1}advanceFully(e,t){let n=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>n)return Wc(e,t),!0}}runRecovery(e,t,n){let a=null,s=!1;for(let r=0;r ":"";if(o.deadEnd&&(s||(s=!0,o.restart(),pt&&console.log(m+this.stackID(o)+" (restarted)"),this.advanceFully(o,n))))continue;let c=o.split(),d=m;for(let h=0;h<10&&c.forceReduce()&&(pt&&console.log(d+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,n));h++)pt&&(d=this.stackID(c)+" -> ");for(let h of o.recoverByInsert(l))pt&&console.log(m+this.stackID(h)+" (via recover-insert)"),this.advanceFully(h,n);this.stream.end>o.pos?(u==o.pos&&(u++,l=0),o.recoverByDelete(l,u),pt&&console.log(m+this.stackID(o)+` (via recover-delete ${this.parser.getName(l)})`),Wc(o,n)):(!a||a.scoree.topRules[o][1]),a=[];for(let o=0;o=0)s(m,l,o[u++]);else{let c=o[u+-m];for(let d=-m;d>0;d--)s(o[u++],l,c);u++}}}this.nodeSet=new z0(t.map((o,l)=>dt.define({name:l>=this.minRepeatTerm?void 0:o,id:l,props:a[l],top:n.indexOf(l)>-1,error:l==0,skipped:e.skippedNodes&&e.skippedNodes.indexOf(l)>-1}))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=Tp;let r=Oa(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let o=0;otypeof o=="number"?new T1(r,o):o),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,n){let a=new DN(this,e,t,n);for(let s of this.wrappers)a=s(a,e,t,n);return a}getGoto(e,t,n=!1){let a=this.goto;if(t>=a[0])return-1;for(let s=a[t+1];;){let r=a[s++],o=r&1,l=a[s++];if(o&&n)return l;for(let u=s+(r>>1);s0}validAction(e,t){return!!this.allActions(e,n=>n==t?!0:null)}allActions(e,t){let n=this.stateSlot(e,4),a=n?t(n):void 0;for(let s=this.stateSlot(e,1);a==null;s+=3){if(this.data[s]==65535)if(this.data[s+1]==1)s=ln(this.data,s+2);else break;a=t(ln(this.data,s+1))}return a}nextStates(e){let t=[];for(let n=this.stateSlot(e,1);;n+=3){if(this.data[n]==65535)if(this.data[n+1]==1)n=ln(this.data,n+2);else break;if((this.data[n+2]&1)==0){let a=this.data[n+1];t.some((s,r)=>r&1&&s==a)||t.push(this.data[n],a)}}return t}configure(e){let t=Object.assign(Object.create(Bs.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let n=this.topRules[e.top];if(!n)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=n}return e.tokenizers&&(t.tokenizers=this.tokenizers.map(n=>{let a=e.tokenizers.find(s=>s.from==n);return a?a.to:n})),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map((n,a)=>{let s=e.specializers.find(o=>o.from==n.external);if(!s)return n;let r=Object.assign(Object.assign({},n),{external:s.to});return t.specializers[a]=Ec(r),r})),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),e.strict!=null&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),e.bufferLength!=null&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return t==null?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),n=t.map(()=>!1);if(e)for(let s of e.split(" ")){let r=t.indexOf(s);r>=0&&(n[r]=!0)}let a=null;for(let s=0;sn)&&t.p.parser.stateFlag(t.state,2)&&(!e||e.scorei.external(t,n)<<1|e}return i.get}const LN=Cp({null:M.null,instanceof:M.operatorKeyword,this:M.self,"new super assert open to with void":M.keyword,"class interface extends implements enum var":M.definitionKeyword,"module package import":M.moduleKeyword,"switch while for if else case default do break continue return try catch finally throw":M.controlKeyword,"requires exports opens uses provides public private protected static transitive abstract final strictfp synchronized native transient volatile throws":M.modifier,IntegerLiteral:M.integer,FloatingPointLiteral:M.float,"StringLiteral TextBlock":M.string,CharacterLiteral:M.character,LineComment:M.lineComment,BlockComment:M.blockComment,BooleanLiteral:M.bool,PrimitiveType:M.standard(M.typeName),TypeName:M.typeName,Identifier:M.variableName,"MethodName/Identifier":M.function(M.variableName),Definition:M.definition(M.variableName),ArithOp:M.arithmeticOperator,LogicOp:M.logicOperator,BitOp:M.bitwiseOperator,CompareOp:M.compareOperator,AssignOp:M.definitionOperator,UpdateOp:M.updateOperator,Asterisk:M.punctuation,Label:M.labelName,"( )":M.paren,"[ ]":M.squareBracket,"{ }":M.brace,".":M.derefOperator,", ;":M.separator}),WN={__proto__:null,void:34,byte:36,short:36,int:36,long:36,char:36,float:36,double:36,boolean:36,extends:50,super:52,this:64,public:70,protected:72,private:74,abstract:76,static:78,final:80,strictfp:82,default:84,synchronized:86,native:88,transient:90,volatile:92,sealed:95,non:97,instanceof:140,true:158,false:158,null:166,class:170,new:176,throws:196,implements:204,permits:211,record:215,interface:226,enum:236,open:289,module:291,requires:296,transitive:298,exports:300,to:302,opens:304,uses:306,provides:308,with:310,package:314,import:318,if:330,else:332,while:336,for:340,var:347,assert:354,switch:358,case:366,throw:370,do:374,break:378,continue:382,return:386,try:392,catch:396,finally:404},EN=Bs.deserialize({version:14,states:"#5QQ]QPOOQ%QQPOOO(wQQO'#HlO+OQQO'#CbOOQO'#Cb'#CbO+VQPO'#CaOOQO'#Co'#CoO,{QPO'#DOO-iQQO'#HvOOQO'#Hv'#HvO0^QQO'#HqO0eQQO'#HqOOQO'#Hq'#HqOOQO'#Hp'#HpOOQO'#Hz'#HzO0lQPO'#GwO2`QPO'#DOO2gQPO'#CkO4vQPO'#DfO4}QPO'#CiO6ZQQO'#FsO6bQPO'#DyO7rOSO'#EQOOQO'#IW'#IWO+VQPO'#EzO8iQPO'#EzOOQO'#EV'#EVO:QQQO'#ITOnQPO'#HzO>uQPO'#EcO>uQPO'#EjO>uQPO'#EuO>uQPO'#EpO>}QPO'#I[O?cQQO'#FRO+VQPO'#C`O?kQPO'#C`O+VQPO'#FnO?pQPO'#FpO@OQPO'#FvO@OQPO'#FyO>uQPO'#GOO@TQPO'#F{O6bQPO'#GSO6bQPO'#G[O@OQPO'#GUO]QPO'#G^O@YQPO'#G`O@eQPO'#GbO@pQPO'#GdO@wQPO'#GgOAeQQO'#CjOBTQQO'#CjOB_QPO'#I`OCzQPO'#DOODbQPO'#E]OBbQPO'#E^OESQPO'#I`OEeQPO'#E]OEmQPO'#IhOErQPO'#FOOOQO'#I^'#I^OOQO'#G}'#G}Q%QQPOOOGhQPO'#HzOOQO'#Hl'#HlOHZQQO,58{OOQO'#Hj'#HjOOQO'#Hr'#HrOJtQPO,59_OLSQPO,59jOOQO-E:r-E:rO+VQPO,58zOLyQPO,58zO+VQPO,5uQPO,5:}O>uQPO,5;UO>uQPO,5;aO>uQPO,5;[O>uQPO,5gO6bQPO'#EUO@zQPO,5=QO!0rQPO,5:}O!1TQPO,5;UO!1]QPO,5;aO!1eQPO,5;[O!-SQPO,5>vO!1sQPO,5>vO!-SQPO,5>vO!2OQPO,5;mO!2aQQO,58zO!2iQQO,5zOB_QPO,5:vO!;WQPO,5:wOErQPO,5;jO!;`QPO'#E_OBbQPO'#E_O!;kQPO'#IaO!;sQPO,5:xOB_QPO,5>zO!-SQPO,5>zOEmQPO,5?SOOQO,5:w,5:wO!+VQPO'#CkOOQO,5?S,5?SO!?pQPO'#FPOOQO,5;j,5;jO!?wQPO,5;jO!-SQPO'#EaOOQO-E:{-E:{OOQO,5;i,5;iO+VQPO,58}O!?|QPO'#ChOOQO1G.k1G.kO!2aQQO1G.fO+VQPO1G.fO!@WQQO1G1tOOQO,59f,59fO!@`QPO,59fOOQO-E:t-E:tO!@eQPO,5>iO!@|QPO,59zO>uQPO'#HOO!ATQPO,5>yOOQO1G2U1G2UOOQO1G0Y1G0YO!AnQPO'#CsO!B^QPO'#HvO!BkQPO'#CtO!ByQPO'#HuO!CRQPO,59^OOQO1G.v1G.vO!#aQPO1G.vO!CiQPO,59_O!CvQQO'#HlO!DXQQO'#CbO!DjQPO,59yOOQO,59i,59iO>uQPO,59yOOQO,59W,59WO!DuQQO,59WO!DzQPO,59iO!,oQPO'#GyO!E]QPO,5>eOOQO1G.q1G.qO!EeQPO'#C}O!EvQPO1G.qO>uQPO'#GzO!E{QPO,5>mOOQO1G/k1G/kOOQO1G0[1G0[O!-SQPO'#HPO!FTQPO1G1cO6bQPO1G1cOOQO1G/l1G/lO!F]QQO1G.oOOQO1G.o1G.oO!HZQQO1G/mO!IxQQO1G/mO!KgQQO1G/mO!KnQQO1G/mO!KuQQO1G/mO!MdQQO1G/mO!MkQQO1G/mO# YQQO1G/mO# aQQO1G/mO# kQQO1G/mO# rQQO1G/|O!)dQPO'#DOO# yQQO'#HvO!*jQPO'#DuOOQO1G/y1G/yO##`QQO1G1dOOOO-E:y-E:yOOQO1G0W1G0WO##vQPO'#E{OOQO1G1Q1G1QO#$jQPO1G2UO!-{QPO1G1QO!0rQPO1G0iO!1TQPO1G0pO!1]QPO1G0{O!1eQPO1G0vOOQO1G0]1G0]O#$oQQO1G1XO}QPO'#I[OOQO1G1X1G1XO#&iQQO1G1XO#&qQQO1G1YOOQO1G1]1G1]O#&xQPO1G1]O#'TQQO'#I]O#'bQPO,5:sOOQO1G1z1G1zOOQO1G4R1G4ROOQO1G2l1G2lO#'gQPO'#EYO!-SQPO'#EdO!-SQPO'#EeO!-SQPO'#EhOOQO1G0i1G0iO#'nQPO1G0iO#'sQPO1G0iO#'{QPO1G0iO#(WQPO1G0iO#(fQPO'#ElO#(|QPO1G0pO#)UQPO1G0pO#)ZQPO'#EwOOQO1G0{1G0{O#)nQPO1G0{O#)sQPO'#EsO!-SQPO'#ErOOQO1G0v1G0vO#*pQPO1G0vO#*uQPO1G0vO#*}QPO1G0vO!1sQPO1G4bO#+YQPO'#FXO#+aQPO'#FXOOQO'#HX'#HXO#+iQQO1G1^O#-fQQO1G4bO!-SQPO1G4bO|OOQO1G0b1G0bOOQO1G4f1G4fO#DXQPO1G0bOOQO1G0c1G0cOOQO1G1U1G1UO!?wQPO1G1UOOQO,5:y,5:yO!-SQPO'#E`O#D^QPO,5:yOBbQPO'#HQO#DiQPO,5>{OOQO1G0d1G0dOEmQPO'#IbO#DqQPO1G4fOB_QPO1G4fOOQO1G4n1G4nO!)tQPO'#C}O!)dQPO'#DOOOQO,5;k,5;kO#D|QPO,5;kO#ETQPO,5;kO#E[QQO'#ITO#EcQQO'#IVO#EjQQO'#FQO#EuQPO'#FQO#E}QPO'#IcOOQO,5:{,5:{OOQO1G.i1G.iO#F]QQO'#HnO#FmQQO'#FUO#HTQPO'#F`OOQO'#Hn'#HnO#H_QPO'#HnO#H|QPO'#IkO#IUQPO,59SOOQO7+$Q7+$QO!2aQQO7+$QOOQO7+'`7+'`OOQO1G/Q1G/QO#IZQPO'#DdO#IeQQO'#IPOOQO'#IP'#IPOOQO1G/f1G/fOOQO,5=j,5=jOOQO-E:|-E:|O#IuQWO,58{O#I|QPO,59`OOQO,59`,59`O!-SQPO'#HxO!!tQPO'#GuO#J[QPO,5>aOOQO1G.x1G.xOOQO7+$b7+$bOOQO1G.r1G.rO#JdQQO1G.rO>uQPO1G/eOOQO1G/e1G/eO#JiQPO1G.rO#JnQPO1G/eOOQO1G/T1G/TOOQO,5=e,5=eOOQO-E:w-E:wOOQO7+$]7+$]OOQO,5=f,5=fOOQO-E:x-E:xOOQO,5=k,5=kOOQO-E:}-E:}O6bQPO7+&}O#JyQQO7+&}O6bQPO7+%hO#LgQQO,59_OOQO,5:a,5:aOB_QPO,5:aO#MvQPO'#EtO#NUQPO'#EtOOQO'#HW'#HWO#NpQPO,5;gOOQO,5;g,5;gOOQO7+'p7+'pOOQO7+&l7+&lOOQO7+&T7+&TO#'nQPO7+&TO#'sQPO7+&TO#'{QPO7+&TO#(WQPO7+&TO#(|QPO7+&[O#)UQPO7+&[OOQO7+&g7+&gO#)nQPO7+&gOOQO7+&b7+&bO#*pQPO7+&bO#*uQPO7+&bO#*}QPO7+&bOOQO7+&u7+&uOOQO'#FU'#FUOvOvO$ dQPO7+&sO$ rQPO7+&wOOQO7+&t7+&tOOQO7+&w7+&wO6bQPO'#G|O$!QQPO,5>wOOQO1G0_1G0_O$!]QPO,5:tOOQO,5:t,5:tOOQO,5;O,5;OOOQO'#Eg'#EgOOQO,5;P,5;POOQO,5;S,5;SO$!dQPO'#EmO!*jQPO'#EmO$!uQPO'#IdO$!}QPO,5;WO$#SQPO'#EnOOQO7+&[7+&[O$#ZQPO7+&[O$#`QPO'#ExO>uQPO'#ExO$#qQPO'#IfO$#|QPO,5;cOB_QPO'#I`O!-SQPO'#I`O$$UQPO'#E]OOQO'#HU'#HUO$$]QPO,5;_OOQO,5;_,5;_OOQO,5;^,5;^O$%YQQO7+&xO$'VQQO7+)|O$)PQQO,5;sOOQO,5;s,5;sO$)WQPO,5;sOOQO-E;V-E;VOOQO7+&x7+&xOOQO7+)|7+)|O}O$4VQPO,5;{O$4^QPO'#IjO$4fQPO,5;zO+VQPO'#HZO$4kQPO,5?VOOQO1G.n1G.nOOQO<d,5>dOOQO,5=a,5=aOOQO-E:s-E:sO$5QQPO7+$^OOQO7+%P7+%POOQO7+$^7+$^O>uQPO7+%PO$5VQQO<uQPO,5;XOOQO,5;X,5;XO$;zQPO,5;XO!,oQPO'#HSO$<]QPO,5?OOOQO1G0r1G0rODbQPO'#E]O$WQPO'#EyOOQO1G0}1G0}O$>_QPO1G0}OB_QPO,5;`OOQO-E;S-E;SOOQO1G0y1G0yOOQO<dQQO1G1_O$>kQQO<uQPO,5=VO!*jQPO,5=VOOQO1G2o1G2oOOQO<lOOQO1G/j1G/jOOQO<uQPO1G0sOOQO1G0s1G0sO$HSQPO1G0sOOQO,5=n,5=nOOQO-E;Q-E;QO$uQPO1G2qOOQO<uQPO7+&_OOQO1G0u1G0uOOQO7+&j7+&jOOQO7+'V7+'VO+VQPO'#H^O$JtQPO,5?XO$J|QPO7+'VO$KRQQO'#InOOQOAN@yAN@yO$K^QQOAN@yOOQOAN@uAN@uO$KeQPOAN@uO$KjQQO<`!>cP!=^!>{!=^P!=^P!?O!?R!?VP!{#?U#?XP0oP#?]!)]PPP#Ae#Cm#C|#DY#Dr#ET#EW#Ed#El#Eo#EsP#EvP#FU#FX#F[#F`#Ff#FiwuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u)usOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%q%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h)r){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-[-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u/}0T0j0u1S1V1Z1]1^1j2Q2R2X2Z2[2e2i2k2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n$xlOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nv!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rQ$ShS&_#`)dQ'V$UU']$[$n-VQ'd$^W(w%U,n/i1]U)o%p(^,]Q)q%qS*[&W-RU+U'_.W/vQ+]'eQ-s*oQ.T+YQ.X+ZQ0Q-_Q0]-tR0g.Yw!tT!S!U!V!y!{$r$s%t,V,W,X,Y/P/R1O1P1w2rT%r!s*R${rOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n$OcObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3n^!lP!h!p'k+a.p0u|#RW!Y#`$T$Z%{&]&`&d(d(u)d*]*o+g,`,m-l-t.a/n1aS#ea3mQ$g|Q$h}Q$i!OQ$j!PW%Y!f%]+r.sS%`!i)]Q%f!jQ'W$VQ'X$WQ'Y$XQ'Z$YQ)[%aS)`%d)bQ*e&fQ*m&|S+n'w.nQ-o*nS.f+k.iQ.m+oQ0i._Q0m.eQ1r0hQ2^1sw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nU%i!l.f0mS)R%Y)`Q)c%fw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3iV#da%h3m'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ&U#YQ*Y&VX/k,s/o1^2R'fYOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/k,s/o1^2R'fZOPVabeipy!Q![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n-T-U-Y-[.b.e.i.p/W/Y/^/e/i/u/}0T0u1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nX/l,s/o1^2RS#XY/kS$m!Q'`S'_$[$nQ'e$^S)l%j)hQ.W+YQ.Y+ZR/v-V%mXOabepy![!]!_!b#W#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|$]$_$b$e$t$u$v$w$x%U%j%m%q%z&j&l'l'm'n'{(R(f(k(m)Z)g)h)r){*U*V*i*k+^+},^,b,c,g,j,n-T-U-Y-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ&S#WR-g*V'c]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n!w#PW!f!v#Q#R#`$O$T%X%Y%]%d%y&Q&W&`&d&|(d(u)R)b)d*l*n*o+g+r,`,m,x-R-t.a.s/m1j2Q2X2[2e2kW#ba#d%h3mR*b&aviOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u[!hP!p'k+a.p0uY#aa#d%h&a3mQ&}#{Q(e$vW(y%U,n/i1]S*p'S*rS+h't.bS+o'w.nS+t'z+vS.e+k.iR/o,sh#TW!Y!f$T$Z%](d*o+r,`-t.sQ*P%{Q*^&]Q-j*]R0X-lU)}%z){0TQ,P(UR.v+y$ScOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n3m3nw3g,j2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3ivwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uQ%V!cQ%g!kQ%o!qS&o#k2wQ'j$fQ)Q%WQ)V%^Q,u)OQ/p,tQ0n.fQ1W/^R1t0m${qOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n!^#od#g$y$z%S&n&p&r&s&t&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lg2y/b3U3V3X3Y3Z3[3]3a3e3f!Y#rd#g$y$z%S&n&r&s&u&v&z'P'c'f)p)|+{,a,d-n.Z.y/[1R1Y1|2P3lc2|/b3U3X3Y3[3]3a3e3fR'O#{%TgOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%ToOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3n%SoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ$f{Q$t!WQ$u!XQ${!^R,k(oQ$`mS(V$l+XQ+T'^S+z(Q(XS-W)j)kQ.S+VQ.l+nQ.z,RQ/y-XQ0e.VQ0r.mQ1d/wQ1q0fR2V1cQ'o$gY*v'W'p'q'r'sQ,Q(VW-w*w*x*y*zQ.k+nQ.w+zU0^-x-y-zS0q.l.mQ0x.zS1m0_0`Q1u0rR2]1na!nP!p'k+a+k.i.p0u`!nP!p'k+a+k.i.p0uT+u'z+vd!jP!h!p'k+a+k.e.i.p0uQ's$gQ'v$hQ(P$jQ*z'WQ*|'XQ+S'ZV+s'z+t+vQ%b!iR,})]Q)Y%`R,|)[Q%l!mQ)T%[Q)X%_Q-P)aR/s-QvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uS*q'S*rT+u'z+vQ'r$gS*y'W'sR-z*zQ'q$gQ'y$iU*x'W'r'sQ+O'YQ+m'uS-y*y*zQ-|*{Q0`-zR0b-}Q+e'mQ+f'nR+x'{Q'p$gQ'}$jW*w'W'q'r'sU+Q'Z(O(PU-x*x*y*zS.Q+R+SS0_-y-zQ0d.RR1n0`Q'u$hS*{'X'vR-}*|Q+i'tR0k.bQ+l'uS-{*{+mS0a-|-}R1o0bT.g+k.iQ(O$jS+R'Z(PR.R+SQ'|$jW+P'Z'}(O(PU.P+Q+R+SS0c.Q.RR1p0dvuOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!nP!p'k+a+k.i.p0uT+u'z+vQ'x$iS*}'Y'yR.O+OQ+p'wR0s.nR.r+qQ'T$SR*u'VT*q'S*rQ%k!mS)W%_%lR,z)XQ)g%jR-U)h$zoOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nX(x%U,n/i1]%SmOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nU'^$[$n-VS+V'_/vQ.V+YR0f.WX(T$l(Q(U+y_)s%q)r-[/}2Z2i2nQ)u%qR0R-_Q([$oQ)w%sR-b)xT,S(Z,TvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR1W/^wwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uvvOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uQ%P!`R%R!aR$w!ZvwOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uR(f$vR$x!ZR(n${T,f(m,gT,e(m,gX({%V(|)Q,vR,t(}Q/n,sR1a/oQ)P%VQ,r(|Q,w)QR/q,vR%W!cQ(z%UV/g,n/i1]QyOQ#jbY$cy#j)h-T/uQ)h%jQ-T)gR/u-UvVOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/uv!gP!p#d&a'S'k't'w'z*r+a+k+v,s.b.i.n.p0u|!xV!g#O#Z#_#}$k%a%e&P&V&Z&{(S(W)e*`+W.^0j2R3`!f#OW!f!v#R$O$T%Y%]%d%y&Q&W&|(d(u)R)b*l*n*o+r,`,m,x-R-t.s/m1j2Q2X2[2e2kQ#Z_S#_a3m$`#}ep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%m%q%z&j&l'l'm'n'{(R(f(k)Z)r){*U*i*k+^+},b,c,j-Y-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$k!QS%a!i)]S%e!j+sS&P#W*VQ&V#YU&Z#`&d)dQ&{#{W(S$l(Q(U+yQ(W$mQ)e%hQ*`&`Q+W'`Q.^+gQ0j.aQ2R1^Z3`$v%U,n/i1]Q*W&SR-h*W^#QW#`$O&|(d(u*l!Q%X!f!v$T%]%d&Q&W&`&d)b)d*n*o+g+r,`,m-R-t.a.s/m2Q2e[%x#Q%X%y,x2X2kS%y#R%YQ,x)RQ2X1jR2k2[#Q`OPaby!_!p#d#j#{$b$t$u$v$w$x%U%h%j&a'S'k't'w'z(m)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3m[!wV!g#_&{)e3`T#[`!wQ0U-cR1i0UQ&b#bR*c&bQ&g#eR*f&gQ$QfR'Q$QQ+_'fS.[+_1XR1X/bQ!pPU%n!p+a0uQ+a'kR0u.pQ%|#TR*Q%|Q&k#hU*h&k/r3kQ/r,{R3k3jQ)^%bR-O)^Q-Z)mR/{-ZQ.c+iR0l.cQ.i+kR0o.iQ+v'zR.t+vQ.o+pR0t.oQ*r'SR-u*rQ(U$lQ+y(QT,O(U+yQ0O-]R1g0OQ-`)uR0S-`Q,T(ZR.{,TQ/P,VR0{/PQ1x0|S2`1x2bR2b1zQ,g(mR/`,gQ(|%VS,q(|,vR,v)QQ1_/mR2S1_Q,o(zR/j,odxOby#j%j)g)h-T-U/uQ$|!_Q'h$bQ(b$tQ(c$uQ(h$wQ(i$xS,f(m,gR/V,^)ftOPVW_abepy!Q![!]!_!b!f!g!i!j!p!v#O#R#W#Y#Z#_#`#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$O$T$]$_$b$e$k$l$m$t$u$v$w$x%U%Y%]%a%d%e%h%j%m%y%z&P&Q&V&W&Z&`&a&d&j&l&{&|'S'`'k'l'm'n't'w'z'{(Q(R(S(U(W(d(f(k(m(u)R)Z)])b)d)e)g)h){*U*V*`*i*k*l*n*o*r+W+^+a+g+k+r+s+v+y+},^,`,b,c,g,j,m,n,s,x-R-T-U-Y-t.^.a.b.i.n.p.s/W/Y/^/e/i/m/u0T0j0u1S1V1Z1]1^1j2Q2R2X2[2e2k2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3n_)t%q)r-[/}2Z2i2nQ!sTQ$o!SQ$p!UQ$q!VQ%s!yQ%u!{Q(`$rQ(a$sQ)x%tQ*R2rS.},V,XQ/R,WQ/S,YQ0z/PS0|/R1OQ1z1PR2_1w&{SOTabehpy!S!U!V![!]!_!b!y!{#`#j#k#n#o#p#q#r#s#t#u#v#w#x#|$U$[$]$^$_$b$e$n$r$s$t$u$v$w$x%U%j%p%q%t%z&W&l'_'e(R(^(f(k(m)d)g)h)r){*i*k*o+Y+Z+^+},V,W,X,Y,],^,b,c,g,j,n-R-T-U-V-[-_-t.W.Y/P/R/W/Y/^/e/i/u/v/}0T1O1P1S1V1Z1]1w2Z2i2n2r2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nQ)v%qQ-])rQ/|-[Q1f/}Q2j2ZQ2l2iR2p2nxdOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/^/uU#ga$e3mS#ye3hS$ap3iQ$y![Q$z!]Q%S!bQ&n#kQ&p#nQ&q#oQ&r#pQ&s#qQ&t#rQ&u#sQ&v#tQ&w#uS&x#v3QQ&y#wQ&z#xQ'P#|Q'c$]Y'f$_$v,b/Y1V^)p%q)r-[/}2Z2i2nU)|%z){0TS*j&l3TQ+{(RQ,a(fQ,d(kS-m*i3bQ-n*kQ.Z+^Q.y+}Q/[,cQ/b,jQ1R/WQ1Y/eQ1|1SQ2P1ZQ3U2wQ3V2xQ3W2yQ3X2zQ3Y2{Q3Z2|Q3[2}Q3]3OQ3^3PQ3_3RQ3a3SQ3e3cQ3f3dR3l3nvWOby!_#j$b$t$u$w$x%j(m)g)h,^,g-T-U/u`!fP!p'k+a+k.i.p0uW!vV#}&P3`S#`a3m#|$Oep![!]!b#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$e%q%z&l(R(f(k)r){*i*k+^+},b,c,j-[/W/Y/^/e/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ$TiS%]!h.eS%d!j+sf&Q#W%m&j'l'm'n'{)Z*U*V-YQ&W#_Q&`#aS&d#d&aQ&|#{Q(d$vW(u%U,n/i1]Q)b%eQ)d%hQ*l&{Q*n&}S*o'S*rS+g't.bS+r'z+vQ,`(eQ,m(yQ-R)eQ-t*pQ.a+hQ.s+tS/m,s/oQ2Q1^R2e2R'b]OPVabeipy![!]!_!b!h!j!p#W#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$t$u$v$w$x%U%e%h%j%m%q%z&P&a&j&l&{&}'S'k'l'm'n't'z'{(R(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nQ$l!QQ(Q$kS(X$m+WQ+X'`R,R(W'sUOPVabeipy!Q![!]!_!b!h!j!p#W#Y#_#a#d#j#k#n#o#p#q#r#s#t#u#v#w#x#{#|#}$]$_$b$e$k$m$t$u$v$w$x%U%e%h%j%m%q%z&P&V&a&j&l&{&}'S'`'k'l'm'n't'z'{(R(W(e(f(k(m(y)Z)e)g)h)r){*U*V*i*k*p*r+W+^+a+h+k+s+t+v+},^,b,c,g,j,n,s-T-U-Y-[.b.e.i.p/W/Y/^/e/i/o/u/}0T0u1S1V1Z1]1^2R2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3`3b3c3d3h3i3m3nR&T#W%OnObepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3nQ#haQ&S#WQ'O#{W)m%m'm'n'{Q*g&jQ+c'lQ,{)ZQ-f*UQ-g*VQ/z-YR3j3mQ*T&RR-e*SU#ca%h3mR&e#d#c_OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3m#c^OPV`aby!_!g!p!w#_#d#j#{$b$t$u$v$w$x%U%h%j&a&{'S'k't'w'z(m)e)g)h*r+a+k+v,^,g,n,s-T-U.b.i.n.p/i/u0u1]3`3ml#SW!Y!f$T$Z%]%{&]*]*o+r-l-t.sU&[#`&d)dQ*a&`Q,_(dQ,l(uQ.`+gQ/X,`Q/f,mQ0i.aQ1`/nR2U1aQ*O%zQ-c){R1h0TR-d){T#fa3m$vkOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%q%z&l(R(f(k(m)g)r){*i*k+^+},^,b,c,g,j-T-U-[/W/Y/^/e/u/}0T1S1V1Z2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nW(v%U,n/i1]T)i%j)h%SjOabepy![!]!_!b#j#k#n#o#p#q#r#s#t#u#v#w#x#|$]$_$b$e$t$u$v$w$x%U%j%q%z&l(R(f(k(m)g)h)r){*i*k+^+},^,b,c,g,j,n-T-U-[/W/Y/^/e/i/u/}0T1S1V1Z1]2Z2i2n2w2x2y2z2{2|2}3O3P3Q3R3S3T3b3c3d3h3i3m3nT'[$[-VQ'g$_Q(g$vQ/Z,bQ1T/YR2O1V[!oP!p'k+a.p0uT.g+k.iU#UW!Y(dQ%Z!fU'U$T$Z,`Q)U%]S-r*o+rT0[-t.sd!kP!p'k'z+a+k+v.i.p0uV%^!h+t.eR%c!iW%[!f%]+r.sQ)a%dR-Q)bQ)n%mV+d'm'n'{R+j'tT.h+k.iR+q'w`!mP!p'k+a+k.i.p0uT%_!h.eR-^)rR)v%qT/O,V/PQ0}/RR1y1OR1y1PR/c,j",nodeNames:"⚠ LineComment BlockComment Program ModuleDeclaration MarkerAnnotation Identifier ScopedIdentifier . Annotation ) ( AnnotationArgumentList LambdaExpression Definition FormalParameters ReceiverParameter void PrimitiveType TypeName ScopedTypeName GenericType TypeArguments AnnotatedType Wildcard extends super , ArrayType ] Dimension [ this FormalParameter Modifiers public protected private abstract static final strictfp default synchronized native transient volatile sealed non SpreadParameter VariableDeclarator AssignOp } { ArrayInitializer InferredParameters Block BinaryExpression CompareOp CompareOp CompareOp LogicOp LogicOp BitOp BitOp BitOp ArithOp ArithOp BitOp InstanceofExpression instanceof TypePattern TernaryExpression LogicOp : UpdateExpression UpdateOp IntegerLiteral FloatingPointLiteral BooleanLiteral CharacterLiteral StringLiteral TextBlock null ClassLiteral class ParenthesizedExpression ObjectCreationExpression new ArgumentList ClassBody ; FieldDeclaration MethodDeclaration TypeParameters TypeParameter TypeBound Throws throws ClassDeclaration Superclass SuperInterfaces implements InterfaceTypeList Permits permits RecordDeclaration record RecordHeader RecordComponent RecordBody CompactConstructorDeclaration InterfaceDeclaration interface ExtendsInterfaces InterfaceBody ConstantDeclaration EnumDeclaration enum EnumBody EnumConstant EnumBodyDeclarations AnnotationTypeDeclaration AnnotationTypeBody AnnotationTypeElementDeclaration StaticInitializer ConstructorDeclaration ConstructorBody ExplicitConstructorInvocation FieldAccess ArrayAccess MethodInvocation MethodName MethodReference ArrayCreationExpression Dimension UnaryExpression LogicOp BitOp CastExpression AssignmentExpression AssignOp ElementValueArrayInitializer ElementValuePair open module ModuleBody ModuleDirective requires transitive exports to opens uses provides with PackageDeclaration package ImportDeclaration import Asterisk ExpressionStatement LabeledStatement Label IfStatement if else WhileStatement while ForStatement for ForSpec LocalVariableDeclaration var EnhancedForStatement ForSpec AssertStatement assert SwitchStatement switch SwitchBlock SwitchRule SwitchLabel case ThrowStatement throw DoStatement do BreakStatement break ContinueStatement continue ReturnStatement return SynchronizedStatement TryStatement try CatchClause catch CatchFormalParameter CatchType FinallyClause finally TryWithResourcesStatement ResourceSpecification Resource ClassContent",maxTerm:296,nodeProps:[["isolate",-4,1,2,80,81,""],["group",-27,4,56,91,99,106,112,117,122,156,158,161,162,164,167,169,172,174,176,178,184,186,188,190,192,194,195,203,"Statement",-25,6,13,32,57,69,72,75,77,78,79,80,81,82,83,84,86,87,129,130,131,133,134,136,139,140,"Expression",-7,17,18,19,20,21,23,28,"Type"],["openedBy",10,"(",52,"{"],["closedBy",11,")",53,"}"]],propSources:[LN],skippedNodes:[0,1,2],repeatNodeCount:30,tokenData:"#$g_R!_OX%QXY'fYZ)bZ^'f^p%Qpq'fqr*|rs,^st%Qtu2zuv4avw5qwx7Xxy?pyz@^z{@z{|Ap|}CW}!OCt!O!PEa!P!QNZ!Q!R!+P!R![!.k![!]!;T!]!^!osw<}wx9}x#O<}#O#P&Z#P;'S<};'S;=`?d<%lO<}P>rVOY>oZw>owx?Xx#O>o#P;'S>o;'S;=`?^<%lO>oP?^O!rPP?aP;=`<%l>oT?gP;=`<%l<}T?mP;=`<%l8P_?wVZZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV@eVYR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVATX$fP&}S!eQOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVAwZ!dR&}SOY%QYZ%lZr%Qrs%qs{%Q{|Bj|!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QVBqV!nR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QVC_VkR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_C}[&pW!dR&}SOY%QYZ%lZr%Qrs%qs}%Q}!OBj!O!_%Q!_!`5T!`!aDs!a;'S%Q;'S;=`&s<%lO%QVDzV&vR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_EhZWY&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PFZ!P!Q%Q!Q![Gi![;'S%Q;'S;=`&s<%lO%QVF`X&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!PF{!P;'S%Q;'S;=`&s<%lO%QVGSV&rR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTGpc&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#R%Q#R#SMc#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTISV&}S!pPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QTIn]&}SOY%QYZ%lZr%Qrs%qs{%Q{|Jg|}%Q}!OJg!O!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTJlX&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![;'S%Q;'S;=`&s<%lO%QTK`c&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![!f%Q!f!gH{!g!h%Q!h!iH{!i#R%Q#R#SLk#S#W%Q#W#XH{#X#Y%Q#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QTLpZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![KX![#R%Q#R#SLk#S;'S%Q;'S;=`&s<%lO%QTMhZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![#R%Q#R#SMc#S;'S%Q;'S;=`&s<%lO%Q_Nb]&}S!eQOY%QYZ%lZr%Qrs%qsz%Qz{! Z{!P%Q!P!Q!'|!Q!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%Q_! `X&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!!QT&}SOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!dTOz!!az{!!s{;'S!!a;'S;=`!#b<%lO!!aZ!!vVOz!!az{!!s{!P!!a!P!Q!#]!Q;'S!!a;'S;=`!#b<%lO!!aZ!#bOQZZ!#eP;=`<%l!!a_!#kXOY!$WYZ! {Zr!$Wrs!&bsz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!$ZXOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{;'S! Z;'S;=`!&[<%lO! Z_!${Z&}SOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!%uV&}SQZOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!&_P;=`<%l! Z_!&eXOY!$WYZ! {Zr!$Wrs!!asz!$Wz{!'Q{;'S!$W;'S;=`!'v<%lO!$W_!'TZOY! ZYZ! {Zr! Zrs!#hsz! Zz{!$v{!P! Z!P!Q!%n!Q;'S! Z;'S;=`!&[<%lO! Z_!'yP;=`<%l!$W_!(TV&}SPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!(oVPZOY!)UYZ%lZr!)Urs!)vs;'S!)U;'S;=`!*y<%lO!)U_!)ZVPZOY!'|YZ%lZr!'|rs!(js;'S!'|;'S;=`!)p<%lO!'|_!)sP;=`<%l!'|_!){VPZOY!)UYZ%lZr!)Urs!*bs;'S!)U;'S;=`!*y<%lO!)UZ!*gSPZOY!*bZ;'S!*b;'S;=`!*s<%lO!*bZ!*vP;=`<%l!*b_!*|P;=`<%l!)UT!+Wq&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!d%Q!d!e!1u!e!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o!z%Q!z!{!3s!{#R%Q#R#S!0}#S#U%Q#U#V!1u#V#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a#l%Q#l#m!3s#m;'S%Q;'S;=`&s<%lO%QT!-fa&}S!pPOY%QYZ%lZr%Qrs%qs!Q%Q!Q![Gi![!f%Q!f!gH{!g!hIi!h!iH{!i#W%Q#W#XH{#X#YIi#Y#ZH{#Z;'S%Q;'S;=`&s<%lO%QT!.ri&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!-_!P!Q%Q!Q![!.k![!f%Q!f!gH{!g!hIi!h!iH{!i!n%Q!n!o!0a!o#R%Q#R#S!0}#S#W%Q#W#XH{#X#YIi#Y#ZH{#Z#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!0hV&}S!oPOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT!1SZ&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!.k![#R%Q#R#S!0}#S;'S%Q;'S;=`&s<%lO%QT!1zY&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S;'S%Q;'S;=`&s<%lO%QT!2q`&}S!oPOY%QYZ%lZr%Qrs%qs!Q%Q!Q!R!2j!R!S!2j!S!n%Q!n!o!0a!o#R%Q#R#S!1u#S#`%Q#`#a!0a#a;'S%Q;'S;=`&s<%lO%QT!3x_&}SOY%QYZ%lZr%Qrs%qs!O%Q!O!P!4w!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QT!4|]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i#T%Q#T#Z!5u#Z;'S%Q;'S;=`&s<%lO%QT!5zc&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#R%Q#R#S!4w#S#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!7^i&}S!oPOY%QYZ%lZr%Qrs%qs!O%Q!O!P!8{!P!Q%Q!Q![!7V![!c%Q!c!i!7V!i!n%Q!n!o!0a!o!r%Q!r!sIi!s#R%Q#R#S!:V#S#T%Q#T#Z!7V#Z#`%Q#`#a!0a#a#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!9Qa&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!5u![!c%Q!c!i!5u!i!r%Q!r!sIi!s#T%Q#T#Z!5u#Z#d%Q#d#eIi#e;'S%Q;'S;=`&s<%lO%QT!:[]&}SOY%QYZ%lZr%Qrs%qs!Q%Q!Q![!7V![!c%Q!c!i!7V!i#T%Q#T#Z!7V#Z;'S%Q;'S;=`&s<%lO%QV!;[X!lR&}SOY%QYZ%lZr%Qrs%qs![%Q![!]!;w!];'S%Q;'S;=`&s<%lO%QV!l!`;'S%Q;'S;=`&s<%lO%QU!>PX!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QU!>sV!]Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!?aX!TR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`+p!`;'S%Q;'S;=`&s<%lO%QV!@TY&gR&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`!>l!`!a!@s!a;'S%Q;'S;=`&s<%lO%QU!@zY!fQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`!a!=x!a;'S%Q;'S;=`&s<%lO%Q_!AsV&kX!kQ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!BaX&]Z&}SOY%QYZ%lZr%Qrs%qs#]%Q#]#^!B|#^;'S%Q;'S;=`&s<%lO%QV!CRX&}SOY%QYZ%lZr%Qrs%qs#b%Q#b#c!Cn#c;'S%Q;'S;=`&s<%lO%QV!CsX&}SOY%QYZ%lZr%Qrs%qs#h%Q#h#i!D`#i;'S%Q;'S;=`&s<%lO%QV!DeX&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!EQ#Y;'S%Q;'S;=`&s<%lO%QV!EVX&}SOY%QYZ%lZr%Qrs%qs#f%Q#f#g!Er#g;'S%Q;'S;=`&s<%lO%QV!EwX&}SOY%QYZ%lZr%Qrs%qs#Y%Q#Y#Z!Fd#Z;'S%Q;'S;=`&s<%lO%QV!FiX&}SOY%QYZ%lZr%Qrs%qs#T%Q#T#U!GU#U;'S%Q;'S;=`&s<%lO%QV!GZX&}SOY%QYZ%lZr%Qrs%qs#V%Q#V#W!Gv#W;'S%Q;'S;=`&s<%lO%QV!G{X&}SOY%QYZ%lZr%Qrs%qs#X%Q#X#Y!Hh#Y;'S%Q;'S;=`&s<%lO%QV!HoV'ZR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!I]b&aZ&}SOY%QYZ%lZr%Qrs%qst%Qtu!IUu!Q%Q!Q![!IU![!c%Q!c!}!IU!}#R%Q#R#S!IU#S#T%Q#T#o!IU#o$g%Q$g;'S!IU;'S;=`!Je<%lO!IU_!JhP;=`<%l!IU_!JrVoZ&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!K`VmR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QU!K|X!cQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`;'S%Q;'S;=`&s<%lO%QV!LpV!VR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_!M`Z'dX!bQ&}SOY%QYZ%lZr%Qrs%qs!_%Q!_!`5T!`#p%Q#p#q!NR#q;'S%Q;'S;=`&s<%lO%QU!NYV!`Q&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QV!NvV!UR&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%QT# dV$OP&}SOY%QYZ%lZr%Qrs%qs;'S%Q;'S;=`&s<%lO%Q_#!Su&}S&XZ&_ZOX%QXY'fYZ)bZ^'f^p%Qpq'fqr%Qrs%qst%Qtu2zu!Q%Q!Q![2z![!c%Q!c!}2z!}#R%Q#R#S2z#S#T%Q#T#o2z#o#y%Q#y#z'f#z$f%Q$f$g'f$g#BY2z#BY#BZ# y#BZ$IS2z$IS$I_# y$I_$I|2z$I|$JO# y$JO$JT2z$JT$JU# y$JU$KV2z$KV$KW# y$KW&FU2z&FU&FV# y&FV;'S2z;'S;=`4Z<%lO2z",tokenizers:[0,1,2,3],topRules:{Program:[0,3],ClassContent:[1,206]},dynamicPrecedences:{21:1,246:-1,252:-1},specialized:[{term:245,get:i=>WN[i]||-1}],tokenPrec:9164}),NN=_s.define({name:"java",parser:EN.configure({props:[Mp.add({IfStatement:Nr({except:/^\s*({|else\b)/}),TryStatement:Nr({except:/^\s*({|catch|finally)\b/}),LabeledStatement:uW,SwitchBlock:i=>{let e=i.textAfter,t=/^\s*\}/.test(e),n=/^\s*(case|default)\b/.test(e);return i.baseIndent+(t?0:n?1:2)*i.unit},Block:lW({closing:"}"}),BlockComment:()=>null,Statement:Nr({except:/^{/})}),dW.add({"Block SwitchBlock ClassBody ElementValueArrayInitializer ModuleBody EnumBody ConstructorBody InterfaceBody ArrayInitializer":hW,BlockComment(i){return{from:i.from+2,to:i.to-2}}})]}),languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},indentOnInput:/^\s*(?:case |default:|\{|\})$/}});function FN(){return new eW(NN)}const JN=" ";function RN(i,e){let t="",n=e;for(let a=0;a{var x,b;const o=s.trim(),l=a,{chars:u,comment:m}=RN(s,a);a=m;const c=l?0:((x=/^[}\])\s]*/.exec(o)[0].match(/[}\])]/g))==null?void 0:x.length)??0,d=n.slice(0,Math.max(0,n.length-c));HN.test(o)&&((b=d.at(-1))!=null&&b.inCase)&&(d.at(-1).inCase=!1);const h=GN(d);for(const y of u)"{[(".includes(y)?n.push({line:r,char:y}):n.pop();const g=n.at(-1);(g==null?void 0:g.line)===r&&g.char==="{"&&/^switch\b/.test(o)&&(g.char="switch"),(g==null?void 0:g.char)==="switch"&&VN.test(o)&&(g.inCase=!0);const f=r+1;return ft||l&&!o.startsWith("*")?s:o===""?"":JN.repeat(h)+(l?" ":"")+o}).join(` +`)}const QN=[["nextInt","","int","Ganze Zahl einlesen","Read a whole number","Ler um número inteiro"],["nextDouble","","double","Kommazahl einlesen","Read a decimal number","Ler um número decimal"],["nextLine","","String","Ganze Zeile als Text einlesen","Read a whole line as text","Ler uma linha inteira como texto"],["next","","String","Ein Wort einlesen (bis zum Leerzeichen)","Read one word (up to a space)","Ler uma palavra (até ao espaço)"],["nextBoolean","","boolean","true oder false einlesen","Read true or false","Ler true ou false"],["nextLong","","long","Große ganze Zahl einlesen","Read a large whole number","Ler um número inteiro grande"],["hasNextInt","","boolean","Kommt als Nächstes eine ganze Zahl?","Is the next input a whole number?","A próxima entrada é um número inteiro?"],["hasNextDouble","","boolean","Kommt als Nächstes eine Kommazahl?","Is the next input a decimal number?","A próxima entrada é um número decimal?"],["hasNextLine","","boolean","Gibt es noch eine Zeile?","Is there another line?","Existe mais uma linha?"],["hasNext","","boolean","Gibt es noch ein Wort?","Is there another word?","Existe mais uma palavra?"],["close","","void","Eingabe schließen","Close the input","Fechar a entrada"]],qN=[["length","","int","Anzahl der Zeichen","Number of characters","Número de caracteres"],["charAt","index","char","Zeichen an Stelle index (ab 0)","Character at position index (from 0)","Carácter na posição index (a partir de 0)"],["equals","text","boolean","Gleicher Text? (statt ==)","Same text? (instead of ==)","Mesmo texto? (em vez de ==)"],["equalsIgnoreCase","text","boolean","Gleicher Text, groß/klein egal?","Same text, ignoring case?","Mesmo texto, ignorando maiúsculas?"],["compareTo","text","int","Alphabetisch vergleichen (<0, 0, >0)","Compare alphabetically (<0, 0, >0)","Comparar alfabeticamente (<0, 0, >0)"],["substring","von, bis","String","Teiltext von Stelle von bis vor bis","Part of the text from start up to before end","Parte do texto do início até antes do fim"],["indexOf","text","int","Erste Stelle des Textes (−1 = fehlt)","First position of the text (−1 = missing)","Primeira posição do texto (−1 = não existe)"],["lastIndexOf","text","int","Letzte Stelle des Textes (−1 = fehlt)","Last position of the text (−1 = missing)","Última posição do texto (−1 = não existe)"],["contains","text","boolean","Kommt der Text darin vor?","Does it contain the text?","Contém o texto?"],["startsWith","text","boolean","Fängt damit an?","Starts with it?","Começa com isto?"],["endsWith","text","boolean","Hört damit auf?","Ends with it?","Termina com isto?"],["toUpperCase","","String","In GROSSBUCHSTABEN","In UPPER CASE","Em MAIÚSCULAS"],["toLowerCase","","String","In kleinbuchstaben","In lower case","Em minúsculas"],["trim","","String","Leerzeichen vorn und hinten weg","Remove spaces at both ends","Remover espaços no início e no fim"],["replace","alt, neu","String","Text ersetzen","Replace text","Substituir texto"],["split","trenner","String[]",'In Teile zerlegen, z. B. split(";")','Split into parts, e.g. split(";")','Dividir em partes, p. ex. split(";")'],["isEmpty","","boolean","Leerer Text?","Empty text?","Texto vazio?"],["toCharArray","","char[]","Als Array von Zeichen","As an array of characters","Como array de caracteres"]],Of=[["println","wert","void","Ausgeben, danach neue Zeile","Print, then a new line","Escrever e mudar de linha"],["print","wert","void","Ausgeben ohne neue Zeile","Print without a new line","Escrever sem mudar de linha"],["printf","format, werte","PrintStream",'Formatiert ausgeben, z. B. "%.2f"','Print formatted, e.g. "%.2f"','Escrever formatado, p. ex. "%.2f"']],UN=[...Of,["close","","void","Datei speichern und schließen","Save and close the file","Guardar e fechar o ficheiro"]],$N=[["readLine","","String","Nächste Zeile lesen (null = Ende)","Read the next line (null = end)","Ler a próxima linha (null = fim)"],["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],YN=[["exists","","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"],["getName","","String","Name der Datei","Name of the file","Nome do ficheiro"],["length","","long","Größe in Bytes","Size in bytes","Tamanho em bytes"]],XN=[["getMessage","","String","Fehlermeldung als Text","Error message as text","Mensagem de erro como texto"],["printStackTrace","","void","Fehler mit Zeilen ausgeben","Print the error with its lines","Mostrar o erro com as linhas"]],KN=[["getSource","","Object","Welcher Knopf wurde geklickt?","Which button was clicked?","Que botão foi clicado?"],["getActionCommand","","String","Beschriftung des Knopfs","Label of the button","Texto do botão"]],eF=[["setBackground","farbe","void","Hintergrundfarbe, z. B. Color.RED","Background colour, e.g. Color.RED","Cor de fundo, p. ex. Color.RED"],["setForeground","farbe","void","Schriftfarbe","Text colour","Cor do texto"],["setFont","schrift","void",'Schrift, z. B. new Font("Arial", Font.BOLD, 24)','Font, e.g. new Font("Arial", Font.BOLD, 24)','Letra, p. ex. new Font("Arial", Font.BOLD, 24)'],["setVisible","true","void","Anzeigen (true) oder verstecken (false)","Show (true) or hide (false)","Mostrar (true) ou esconder (false)"],["setEnabled","true","void","Anklickbar (true) oder grau (false)","Clickable (true) or greyed out (false)","Clicável (true) ou cinzento (false)"],["setSize","breite, höhe","void","Größe in Pixeln","Size in pixels","Tamanho em píxeis"]],tF=[["add","baustein","Component","Baustein hinzufügen","Add a component","Adicionar um componente"],["setLayout","layout","void","Anordnung, z. B. new FlowLayout()","Layout, e.g. new FlowLayout()","Disposição, p. ex. new FlowLayout()"],["remove","baustein","void","Baustein entfernen","Remove a component","Remover um componente"]],nF=[["setTitle","text","void","Titel oben im Fenster","Title at the top of the window","Título no topo da janela"],["setDefaultCloseOperation","JFrame.EXIT_ON_CLOSE","void","Was beim Schließen passiert","What happens when closing","O que acontece ao fechar"],["setLocationRelativeTo","null","void","Mit null: Fenster in die Mitte","With null: centre the window","Com null: janela no centro"],["setResizable","false","void","Größe änderbar?","Can the size change?","Pode mudar de tamanho?"],["pack","","void","Größe passend zum Inhalt","Size to fit the content","Tamanho ajustado ao conteúdo"],["getContentPane","","JPanel","Inhaltsfläche des Fensters","Content area of the window","Área de conteúdo da janela"],["dispose","","void","Fenster schließen","Close the window","Fechar a janela"]],iF=[["setText","text","void","Text setzen","Set the text","Definir o texto"],["getText","","String","Text holen","Get the text","Obter o texto"]],aF=[["addActionListener","e -> { }","void","Was beim Klick passiert","What happens on click","O que acontece ao clicar"],["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setBorderPainted","false","void","Rahmen zeichnen?","Draw the border?","Desenhar a borda?"]],sF=[["setOpaque","true","void","Hintergrund sichtbar (für Farben)","Show the background (for colours)","Mostrar o fundo (para cores)"],["setHorizontalAlignment","JLabel.CENTER","void","Text links, mittig oder rechts","Text left, centre or right","Texto à esquerda, centro ou direita"]],rF=[["addActionListener","e -> { }","void","Was bei Enter passiert","What happens on Enter","O que acontece ao carregar em Enter"],["setEditable","false","void","Darf man hineinschreiben?","Can you type into it?","Pode-se escrever?"],["setColumns","anzahl","void","Breite in Zeichen","Width in characters","Largura em caracteres"],["requestFocus","","void","Cursor hineinsetzen","Put the cursor into it","Pôr o cursor no campo"]],oF=[["length",null,"int","Anzahl der Elemente (ohne Klammern)","Number of elements (no brackets)","Número de elementos (sem parênteses)"]],Qr=[["add","wert","boolean","Element hinten anhängen","Append an element at the end","Acrescentar um elemento no fim"],["get","index","E","Element an Stelle index holen (ab 0)","Get the element at index (from 0)","Obter o elemento na posição index (a partir de 0)"],["size","","int","Anzahl der Elemente","Number of elements","Número de elementos"],["set","index, wert","E","Element an Stelle index ersetzen","Replace the element at index","Substituir o elemento na posição index"],["remove","index","E","Element an Stelle index entfernen","Remove the element at index","Remover o elemento na posição index"],["contains","wert","boolean","Ist das Element in der Liste?","Is the element in the list?","O elemento está na lista?"],["indexOf","wert","int","Stelle des Elements (-1 = nicht da)","Position of the element (-1 = not found)","Posição do elemento (-1 = não existe)"],["isEmpty","","boolean","Ist die Liste leer?","Is the list empty?","A lista está vazia?"],["clear","","void","Alle Elemente entfernen","Remove all elements","Remover todos os elementos"]],qr={Scanner:QN,String:qN,PrintStream:Of,PrintWriter:UN,BufferedReader:$N,FileReader:[["close","","void","Datei schließen","Close the file","Fechar o ficheiro"]],File:YN,Exception:XN,ActionEvent:KN,Component:eF,Container:tF,JFrame:nF,JPanel:[],JButton:aF,JLabel:sF,JTextField:rF,TextHolder:iF,ArrayList:Qr,List:Qr,LinkedList:Qr},lF={JFrame:["Container","Component"],JPanel:["Container","Component"],JButton:["TextHolder","Component"],JLabel:["TextHolder","Component"],JTextField:["TextHolder","Component"],PrintWriter:[]},Af={mbot:[["forward","cm","void","Geradeaus vorwärts fahren","Drive forward","Andar para a frente"],["backward","cm","void","Rückwärts fahren","Drive backward","Andar para trás"],["turnLeft","grad","void","Auf der Stelle nach links drehen","Turn left on the spot","Rodar para a esquerda"],["turnRight","grad","void","Auf der Stelle nach rechts drehen","Turn right on the spot","Rodar para a direita"],["stop","","void","Motoren anhalten","Stop the motors","Parar os motores"],["drive","links, rechts","void","Räder einzeln in Prozent (−100–100), fährt weiter bis stop()","Wheels separately in percent (−100–100), keeps going until stop()","Rodas separadas em percentagem (−100–100), continua até stop()"],["resetTimer","","void","Stoppuhr auf 0 setzen","Reset the stopwatch to 0","Pôr o cronómetro a 0"],["pause","ms","void","Millisekunden warten","Wait milliseconds","Esperar milissegundos"],["setLed","rot, gruen, blau","void","LEDs in einer Farbe (je 0–255)","LEDs in a colour (0–255 each)","LEDs numa cor (0–255 cada)"],["ledOff","","void","LEDs aus","LEDs off","Desligar LEDs"],["led","nr","LED",'Eine LED (0–4), dann .setColor("grün") oder .setColor("aus")','One LED (0–4), then .setColor("green") or .setColor("off")','Um LED (0–4), depois .setColor("green") ou .setColor("off")'],["showText",'"Hallo"',"void","Text auf dem Bildschirm zeigen","Show text on the screen","Mostrar texto no ecrã"],["emotion",'"smile"',"void","Gefühl zeigen: LEDs, Ton, Bewegung (smile, hello, sad …)","Show a feeling: LEDs, sound, motion (smile, hello, sad …)","Mostrar um sentimento: LEDs, som, movimento (smile, hello, sad …)"],["playTone","hz, ms","void","Ton spielen, z. B. playTone(440, 500)","Play a tone, e.g. playTone(440, 500)","Tocar um som, p. ex. playTone(440, 500)"],["getDistance","","int","Abstand vorn in cm (Ultraschall)","Distance ahead in cm (ultrasonic)","Distância à frente em cm (ultrassom)"],["getLine","","int","Liniensensor: 0 = keine Linie, 15 = alle vier auf der Linie","Line sensor: 0 = no line, 15 = all four on the line","Sensor de linha: 0 = sem linha, 15 = os quatro na linha"],["isLineLeft","","boolean","Linie unter dem linken mittleren Fühler","Line under the left middle probe","Linha sob a sonda central esquerda"],["isLineRight","","boolean","Linie unter dem rechten mittleren Fühler","Line under the right middle probe","Linha sob a sonda central direita"],["getBrightness","","int","Helligkeit 0–100","Brightness 0–100","Luminosidade 0–100"],["getLoudness","","int","Lautstärke 0–100","Loudness 0–100","Volume 0–100"],["getColor","","String",'Farbe unter dem mBot2, z. B. "rot"','Colour under the mBot2, e.g. "red"','Cor por baixo do mBot2, p. ex. "red"'],["isButtonA","","boolean","Taste A ist gedrückt","Button A is pressed","O botão A está premido"],["isButtonB","","boolean","Taste B ist gedrückt","Button B is pressed","O botão B está premido"],["isJoystickUp","","boolean","Joystick nach oben gedrückt","Joystick pushed up","Joystick para cima"],["isJoystickDown","","boolean","Joystick nach unten gedrückt","Joystick pushed down","Joystick para baixo"],["isJoystickLeft","","boolean","Joystick nach links gedrückt","Joystick pushed left","Joystick para a esquerda"],["isJoystickRight","","boolean","Joystick nach rechts gedrückt","Joystick pushed right","Joystick para a direita"],["getPitch","","int","Neigung nach vorn (+) oder hinten (−) in Grad","Tilt forward (+) or back (−) in degrees","Inclinação para a frente (+) ou trás (−) em graus"],["getRoll","","int","Neigung zur Seite in Grad","Tilt sideways in degrees","Inclinação lateral em graus"],["isShaken","","boolean","Der mBot2 wird geschüttelt","The mBot2 is being shaken","O mBot2 está a ser abanado"],["getTimer","","double","Stoppuhr in Sekunden","Stopwatch in seconds","Cronómetro em segundos"],["getBattery","","int","Akku in Prozent","Battery in percent","Bateria em percentagem"]],System:[["out",null,"PrintStream","Ausgabe in die Konsole","Output to the console","Saída para a consola"],["in",null,"InputStream","Eingabe von der Tastatur (für Scanner)","Keyboard input (for Scanner)","Entrada do teclado (para Scanner)"],["err",null,"PrintStream","Fehlerausgabe","Error output","Saída de erros"],["currentTimeMillis","","long","Uhrzeit in Millisekunden","Time in milliseconds","Hora em milissegundos"],["exit","0","void","Programm beenden","End the program","Terminar o programa"]],Math:[["random","","double","Zufallszahl von 0 bis unter 1","Random number from 0 to below 1","Número aleatório de 0 até menos de 1"],["abs","zahl","double","Betrag (ohne Minus)","Absolute value (no minus)","Valor absoluto (sem menos)"],["sqrt","zahl","double","Wurzel","Square root","Raiz quadrada"],["pow","basis, exponent","double","Hoch: pow(2, 3) = 8","Power: pow(2, 3) = 8","Potência: pow(2, 3) = 8"],["max","a, b","double","Größere von zwei Zahlen","Larger of two numbers","Maior de dois números"],["min","a, b","double","Kleinere von zwei Zahlen","Smaller of two numbers","Menor de dois números"],["round","zahl","long","Runden","Round","Arredondar"],["floor","zahl","double","Abrunden","Round down","Arredondar para baixo"],["ceil","zahl","double","Aufrunden","Round up","Arredondar para cima"],["PI",null,"double","Kreiszahl π = 3.14159…","Pi π = 3.14159…","Pi π = 3,14159…"]],Integer:[["parseInt","text","int","Text in ganze Zahl umwandeln","Turn text into a whole number","Converter texto em número inteiro"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"],["MAX_VALUE",null,"int","Größte int-Zahl","Largest int value","Maior valor int"],["MIN_VALUE",null,"int","Kleinste int-Zahl","Smallest int value","Menor valor int"]],Double:[["parseDouble","text","double","Text in Kommazahl umwandeln","Turn text into a decimal number","Converter texto em número decimal"],["toString","zahl","String","Zahl in Text umwandeln","Turn a number into text","Converter número em texto"]],String:[["valueOf","wert","String","Wert in Text umwandeln","Turn a value into text","Converter valor em texto"],["format","format, werte","String",'Formatierter Text, z. B. "%.2f"','Formatted text, e.g. "%.2f"','Texto formatado, p. ex. "%.2f"'],["join","trenner, teile","String","Teile mit Trenner verbinden","Join parts with a separator","Juntar partes com um separador"]],Character:[["isDigit","zeichen","boolean","Ist es eine Ziffer?","Is it a digit?","É um algarismo?"],["isLetter","zeichen","boolean","Ist es ein Buchstabe?","Is it a letter?","É uma letra?"],["isUpperCase","zeichen","boolean","Ist es ein Großbuchstabe?","Is it upper case?","É maiúscula?"],["toUpperCase","zeichen","char","In Großbuchstaben","To upper case","Para maiúscula"],["toLowerCase","zeichen","char","In Kleinbuchstaben","To lower case","Para minúscula"]],Files:[["readString",'Path.of("datei.txt")',"String","Ganze Datei als Text lesen","Read the whole file as text","Ler o ficheiro inteiro como texto"],["writeString","pfad, text","Path","Text in Datei schreiben","Write text to a file","Escrever texto num ficheiro"],["readAllLines","pfad","List","Alle Zeilen lesen","Read all lines","Ler todas as linhas"],["exists","pfad","boolean","Gibt es die Datei?","Does the file exist?","O ficheiro existe?"]],Path:[["of",'"datei.txt"',"Path","Pfad zu einer Datei","Path to a file","Caminho para um ficheiro"]],JFrame:[["EXIT_ON_CLOSE",null,"int","Programm endet beim Schließen","Program ends when closed","O programa termina ao fechar"]],JLabel:[["CENTER",null,"int","Mittig","Centred","Ao centro"],["LEFT",null,"int","Links","Left","À esquerda"],["RIGHT",null,"int","Rechts","Right","À direita"]],Font:[["BOLD",null,"int","Fett","Bold","Negrito"],["PLAIN",null,"int","Normal","Plain","Normal"],["ITALIC",null,"int","Kursiv","Italic","Itálico"]],Color:[["RED","Rot","Red","Vermelho"],["GREEN","Grün","Green","Verde"],["BLUE","Blau","Blue","Azul"],["YELLOW","Gelb","Yellow","Amarelo"],["ORANGE","Orange","Orange","Laranja"],["WHITE","Weiß","White","Branco"],["BLACK","Schwarz","Black","Preto"],["GRAY","Grau","Grey","Cinzento"],["LIGHT_GRAY","Hellgrau","Light grey","Cinzento-claro"],["PINK","Rosa","Pink","Rosa"],["CYAN","Türkis","Cyan","Ciano"],["MAGENTA","Magenta","Magenta","Magenta"]].map(([i,e,t,n])=>[i,null,"Color",e,t,n])};function Pf(i,e){const[t,n,a,s,r,o]=i;return{name:t,kind:n===null?"field":"method",params:!!n,returns:a,description:e==="de"?s:e==="pt"?o:r}}const zl=i=>i.replace(/<.*>$/,""),jf=i=>{var e;return(e=/<\s*([^<>,]+?)\s*>$/.exec(i))==null?void 0:e[1]};function Cf(i){if(/\[\]$/.test(i))return oF;if(i=zl(i),/Exception$|^Throwable$/.test(i))return qr.Exception;if(!qr[i])return;const t=new Set,n=[];for(const a of[i,...lF[i]??[]])for(const s of qr[a]??[])t.has(s[0])||(t.add(s[0]),n.push(s));return n}function WJ(i,e="de"){return(Cf(i)??[]).map(t=>Pf(t,e))}const uF="[A-Z]\\w*|int|long|double|float|boolean|char|byte|short|var";function mF(i,e){var a,s;const t=new RegExp(`(?:^|[^\\w.])(${uF})\\s*(?:<([^<>;]*)>)?((?:\\s*\\[\\s*\\])*)\\s+${e}\\s*(?:\\[\\s*\\])*\\s*(=\\s*([^;]*))?(?=[=;,):]|$)`,"gm");let n;for(const r of i.matchAll(t)){let o=r[1];if(o==="var"){const u=r[5]??"";if(o=((a=/^new\s+([A-Z]\w*)/.exec(u))==null?void 0:a[1])??(/^"/.test(u)?"String":""),!o)continue}if(/^(return|new|else|case|throw)$/.test(o))continue;const l=(s=r[2])==null?void 0:s.replace(/\s+/g,"");n=o+(l?`<${l}>`:"")+(r[3]??"").replace(/\s+/g,"")}return n}function cF(i){let e=0,t;const n=/^"(?:[^"\\]|\\.)*"/.exec(i);if(n)t='"',e=n[0].length;else{const r=/^[A-Za-z_]\w*/.exec(i);if(!r)return;t=r[0],e=r[0].length}const a=[{name:t,call:!1,indices:0}],s=(r,o)=>{let l=0;for(;e0;){const n=i[t-1];if(/[\w.]/.test(n))t--;else if(n===")"||n==="]"){const a=n===")"?"(":"[";let s=0,r=t-1;for(;r>=0;r--)if(i[r]===n)s++;else if(i[r]===a&&--s===0)break;if(r<0)return t;t=r}else if(n==='"'){const a=i.lastIndexOf('"',t-2);if(a<0)return t;t=a}else break}return t}const Nc=(i,e)=>i.slice(0,Math.max(0,i.length-2*e));function Bf(i,e,t,n){const a=e?t==null?void 0:t.statics(zl(i)):t==null?void 0:t.members(zl(i));if(a)return a;const s=e?Af[i]:Cf(i);return s==null?void 0:s.map(r=>Pf(r,n))}function hF(i,e,t,n){var s,r;const a=(r=(s=Bf(i,t,n,"en"))==null?void 0:s.find(o=>o.name===e))==null?void 0:r.returns;return a==="E"?jf(i)??"Object":a}function gF(i,e,t){const n=cF(e);if(!n)return;const[a,...s]=n.links;let r,o=!1;if(n.head==='"')r="String";else if(a.name==="this"&&(t!=null&&t.thisType)&&!a.call&&!a.indices)r=t.thisType;else{if(r=mF(i,a.name),!r&&(Af[a.name]||t!=null&&t.statics(a.name))&&!a.call&&(r=a.name,o=!0),!r)return;a.indices&&(r=Nc(r,a.indices))}for(const l of s){const u=hF(r,l.name,o,t);if(!u)return;r=Nc(u,l.indices),o=!1}return{type:r,isStatic:o}}function pF(i,e,t="de",n){const a=i.lastIndexOf(` +`,e-1)+1,s=i.slice(a,e),r=/\.\s*(\w*)$/.exec(s);if(!r)return;const o=r.index,l=s.slice(dF(s,o),o);if(!l||/^\d/.test(l))return;const u=gF(i,l,n);if(!u)return;const m=Bf(u.type,u.isStatic,n,t);if(!m)return;const c=jf(u.type)??"Object";return{from:e-r[1].length,members:m.map(d=>d.returns==="E"?{...d,returns:c}:d)}}const Fc=Ln.define(),N0=re.define(),fF=ue.mark({class:"cm-ph"}),xF=ue.mark({class:"cm-err"}),Jc=ue.line({class:"cm-debug-line"});function Rc(i,e){const t=i.doc.length,n=[];e.current!==void 0&&e.currentr===Jc;n.sort((r,o)=>r.from-o.from||Number(a(o.deco))-Number(a(r.deco))||r.to-o.to);const s=new e1;for(const r of n)s.add(r.from,r.to,r.deco);return s.finish()}const ar=Zt.define({create:()=>({marks:{placeholders:[],problems:[]},decorations:ue.none}),update(i,e){for(const a of e.effects)if(a.is(N0))return{marks:a.value,decorations:Rc(e.state,a.value)};if(!e.docChanged)return i;const t=a=>({from:e.changes.mapPos(a.from,1),to:e.changes.mapPos(a.to,-1)}),n={...i.marks,placeholders:i.marks.placeholders.map(t).filter(a=>a.fromH.decorations.from(i,e=>e.decorations)}),bF={ClassDeclaration:"class",InterfaceDeclaration:"class",EnumDeclaration:"class",MethodDeclaration:"method",ConstructorDeclaration:"method",ForStatement:"loop",EnhancedForStatement:"loop",WhileStatement:"loop",DoStatement:"loop",IfStatement:"if",SwitchStatement:"if",TryStatement:"try"};function yF(i){const{state:e}=i,t=e.doc,n=i.contentDOM.querySelector(".cm-line");if(!n)return[];const a=getComputedStyle(n),s=i.scrollDOM.getBoundingClientRect(),r=i.contentDOM.getBoundingClientRect(),o=s.left-i.scrollDOM.scrollLeft,l=s.top-i.scrollDOM.scrollTop,u=r.left-o+parseFloat(a.paddingLeft)+parseFloat(a.borderLeftWidth),m=r.right-o-6,c=i.documentTop-l,d=e.tabSize,h=i.defaultCharacterWidth,g=(b,y,w,S)=>{const z=t.line(y),k=Wi(/^\s*/.exec(z.text)[0],d),_=u+k*h-7,T=i.lineBlockAt(z.from).top+c+S,j=i.lineBlockAt(t.line(w).from).bottom+c-S;return new Ys(b,_,T,Math.max(m-_,20),Math.max(j-T,4))},f=[];et(e).iterate({from:i.viewport.from,to:i.viewport.to,enter:b=>{var w;const y=bF[b.name];y&&(b.name==="IfStatement"&&((w=b.node.parent)==null?void 0:w.name)==="IfStatement"||f.push(g(`cm-scope cm-scope-${y}`,t.lineAt(b.from).number,t.lineAt(b.to).number,1)))}});const x=e.field(ar).marks.lines;return x&&x.fromi.docChanged||i.viewportChanged||i.geometryChanged||et(i.state)!==et(i.startState)||i.transactions.some(e=>e.effects.some(t=>t.is(N0)))});class zF extends fn{toDOM(){const e=document.createElement("span");return e.className="cm-breakpoint",e}}const Il=new zF,Mf=re.define(),Lf=re.define(),kl=Zt.define({create:()=>X.empty,update(i,e){i=i.map(e.changes);for(const t of e.effects){if(t.is(Lf)&&(i=X.of(t.value.map(a=>Il.range(a)),!0)),!t.is(Mf))continue;let n=!1;i.between(t.value,t.value,()=>{n=!0}),i=n?i.update({filter:a=>a!==t.value}):i.update({add:[Il.range(t.value)]})}return i}});function IF(i){const t={mousedown:(n,a)=>{const s=i.breakpointLine(n.state.doc.lineAt(a.from).number-1);return s===void 0||s>=n.state.doc.lines?!1:(n.dispatch({effects:Mf.of(n.state.doc.line(s+1).from)}),queueMicrotask(()=>i.onBreakpoints()),!0)}};return[kl,kL({class:"cm-breakpoint-gutter",markers:n=>n.state.field(kl),initialSpacer:()=>Il,domEventHandlers:t}),jL({domEventHandlers:t})]}function F0(i,e){return i.field(ar).marks.placeholders.find(t=>e>=t.from&&e<=t.to)}const kF=H.inputHandler.of((i,e,t,n)=>{if(e!==t)return!1;const a=F0(i.state,e);return a?(i.dispatch({changes:{from:a.from,to:a.to,insert:n},selection:{anchor:a.from+n.length},userEvent:"input.type"}),!0):!1}),SF=ie.transactionFilter.of(i=>{if(!i.docChanged||!(i.isUserEvent("input.paste")||i.isUserEvent("input.drop")))return i;const e=[];if(i.changes.iterChanges((a,s,r,o,l)=>e.push({from:a,to:s,text:l.toString()})),e.length!==1||e[0].from!==e[0].to)return i;const t=F0(i.startState,e[0].from);if(!t)return i;const{text:n}=e[0];return{changes:{from:t.from,to:t.to,insert:n},selection:{anchor:t.from+n.length},userEvent:"input.paste",scrollIntoView:!0}}),Gc=i=>e=>{const t=e.state.selection.main;if(!t.empty)return!1;const n=F0(e.state,t.head);return!n||(i?t.head>=n.to:t.head<=n.from)?!1:(e.dispatch({changes:{from:n.from,to:n.to},selection:{anchor:n.from},userEvent:"delete"}),!0)},_F=H.updateListener.of(i=>{if(!i.selectionSet||i.docChanged||!i.transactions.some(n=>n.isUserEvent("select.pointer")))return;const e=i.state.selection.main;if(!e.empty)return;const t=i.state.field(ar).marks.placeholders.find(n=>e.head>n.from&&e.headi.view.dispatch({selection:B.range(t.from,t.to)}))}),TF=Ks.define([{tag:[M.keyword,M.controlKeyword,M.definitionKeyword,M.modifier,M.operatorKeyword,M.standard(M.typeName),M.bool,M.null],color:"var(--syn-keyword)",fontWeight:"600"},{tag:[M.string,M.character],color:"var(--syn-string)"},{tag:M.number,color:"var(--syn-number)"},{tag:[M.lineComment,M.blockComment],color:"var(--syn-comment)",fontStyle:"italic"}]);function OF(i){const e=i,t=`\${// ${e.code}}`,n=(a,s,r,o=0)=>Z0(s,{label:a,detail:r,type:"keyword",boost:o});return[n("if",`if (\${${e.condition}}) { ${t} }`,e.branch,2),n("if … else",`if (\${${e.condition}}) { ${t} @@ -60428,16 +60428,16 @@ ${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="vis } }`,e.switchCase,1),n("System.out.println","System.out.println(${});",e.output,3),...["syso","sysout","sout"].map(a=>n(a,"System.out.println(${});",`System.out.println · ${e.output}`,2)),...["main","psvm"].map(a=>n(a,`public static void main(String[] args) { ${t} -}`,"public static void main(String[] args)",2)),AF(e.input),n("scanner.nextInt","int ${zahl} = scanner.nextInt();",e.input,1),n("scanner.next","String ${text} = scanner.next();",e.input),n("scanner.nextDouble","double ${wert} = scanner.nextDouble();",e.input),n("try … catch",`try { +}`,"public static void main(String[] args)",2)),PF(e.input),n("scanner.nextInt","int ${zahl} = scanner.nextInt();",e.input,1),n("scanner.next","String ${text} = scanner.next();",e.input),n("scanner.nextDouble","double ${wert} = scanner.nextDouble();",e.input),n("try … catch",`try { ${t} } catch (\${Exception} e) { \${// ${e.code}} }`,"try … catch",1),n("public class",`public class \${Main} { ${t} -}`,"public class",-2),...["import java.util.Scanner;","import javax.swing.*;","import java.awt.*;","import java.awt.event.*;"].map((a,s)=>n(a,a,"import",1-s)),...["int","double","String","boolean","char","long","final","break;","continue;","return","true","false","else","null","new","public","private","static","void","class","extends","implements","interface","this"].map(a=>({label:a,type:"keyword",boost:-1})),...["Math","JFrame","JButton","JLabel","JTextField","ActionListener","ActionEvent","Color","FlowLayout","GridLayout","BorderLayout"].map(a=>({label:a,type:"type",boost:-2})),...["Math.random()","Math.abs(","Math.sqrt(","Math.max(","Math.min(",".length()",".equals("].map(a=>({label:a,type:"function",boost:-2}))]}function OF(i){if(/^\s*import\s+java\.util\.(?:Scanner|\*)\s*;/m.test(i))return;const e=/^\s*package\s+[\w.]+\s*;[^\n]*\n?/.exec(i),t=e?e[0].length:0,n=i.slice(t).replace(/^\s*\n/,"");return{from:t,insert:`import java.util.Scanner; +}`,"public class",-2),...["import java.util.Scanner;","import javax.swing.*;","import java.awt.*;","import java.awt.event.*;"].map((a,s)=>n(a,a,"import",1-s)),...["int","double","String","boolean","char","long","final","break;","continue;","return","true","false","else","null","new","public","private","static","void","class","extends","implements","interface","this"].map(a=>({label:a,type:"keyword",boost:-1})),...["Math","JFrame","JButton","JLabel","JTextField","ActionListener","ActionEvent","Color","FlowLayout","GridLayout","BorderLayout"].map(a=>({label:a,type:"type",boost:-2})),...["Math.random()","Math.abs(","Math.sqrt(","Math.max(","Math.min(",".length()",".equals("].map(a=>({label:a,type:"function",boost:-2}))]}function AF(i){if(/^\s*import\s+java\.util\.(?:Scanner|\*)\s*;/m.test(i))return;const e=/^\s*package\s+[\w.]+\s*;[^\n]*\n?/.exec(i),t=e?e[0].length:0,n=i.slice(t).replace(/^\s*\n/,"");return{from:t,insert:`import java.util.Scanner; ${/^\s*import\b/.test(n)?"":` -`}`}}function AF(i){const e=Z0("Scanner ${scanner} = new Scanner(System.in);",{label:"Scanner scanner = new Scanner(System.in);",detail:i,type:"keyword",boost:3}),t=e.apply;return{...e,apply(n,a,s,r){const o=OF(n.state.doc.toString());if(!o)return t(n,a,s,r);const l=n.state.changes(o);n.dispatch({changes:l,userEvent:"input.complete"}),t(n,a,l.mapPos(s),l.mapPos(r,1))}}}function PF(i){const t={label:i.kind==="field"?i.name:`${i.name}(${i.params?"…":""})`,detail:i.returns==="void"||!i.returns?i.description:i.description?`${i.returns} · ${i.description}`:i.returns,type:i.kind==="field"?"property":"method"};return i.kind==="field"?{...t,apply:i.name}:i.params?Z0(`${i.name}(\${})`,t):{...t,apply:`${i.name}()`}}function jF(){const i=i1();return i==="de"?"de":i==="pt-PT"?"pt":"en"}function CF(i){const e=new Set;for(const t of i.matchAll(/\b(?:int|long|double|float|boolean|char|String|Scanner)(?:\s*\[\s*\])*\s+([A-Za-z_]\w*)/g))e.add(t[1]);return[...e].map(t=>({label:t,type:"variable",boost:1}))}class BF{constructor(e,t,n){v(this,"view");v(this,"readOnly",new Li);const a=r=>{var h,g;const o=r.matchBefore(/[\w.]+/);if(!o||o.from===o.to&&!r.explicit)return null;const l=r.state.doc.lineAt(r.pos),u=l.text.slice(0,r.pos-l.from);if(/\/\//.test(u)||(((h=u.match(/"/g))==null?void 0:h.length)??0)%2===1)return null;const m=gF(r.state.doc.toString(),r.pos,jF(),(g=t.ownTypes)==null?void 0:g.call(t,r.pos));if(m)return{from:m.from,options:m.members.map((f,x)=>({...PF(f),boost:50-x})),validFor:/^\w*$/};const c=/\bvoid\s+[\w.]*$/.test(u),d=TF(t.words()).filter(f=>!(c&&(f.label==="main"||f.label==="psvm")));return{from:o.from,options:[...d,...CF(r.state.doc.toString())],validFor:/^\w*$/}},s=[zF(t),BL(),NN(),gW(_F),Ri.of(" "),ne.tabSize.of(4),mW(),IW(),hE(),ar,vF,IF,kF,SF,this.readOnly.of(ne.readOnly.of(!1)),kE({override:[a],icons:!1}),r1.highest(Oi.of([{key:"Mod-z",run:()=>(t.onUndo(!1),!0),preventDefault:!0},{key:"Mod-Shift-z",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Mod-y",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Backspace",run:Gc(!1)},{key:"Delete",run:Gc(!0)}])),Oi.of([...xE,...$p,_N,...SN]),H.contentAttributes.of({"aria-label":n,autocapitalize:"off",autocorrect:"off",spellcheck:"false"}),H.updateListener.of(r=>{r.docChanged&&!r.transactions.some(o=>o.annotation(Fc))?queueMicrotask(()=>t.onChange()):r.selectionSet&&!r.docChanged&&queueMicrotask(()=>t.onCaret())})];this.view=new H({parent:e,state:ne.create({doc:"",extensions:s})})}get text(){return this.view.state.doc.toString()}get caret(){return this.view.state.selection.main.head}get hasFocus(){return this.view.hasFocus}get breakpoints(){const e=new Set,t=this.view.state.doc;return this.view.state.field(kl).between(0,t.length,n=>{e.add(t.lineAt(n).number-1)}),e}setBreakpoints(e){const t=this.view.state.doc,n=[...new Set(e)].filter(a=>a>=0&&at.line(a+1).from);this.view.dispatch({effects:Mf.of(n)})}lineAt(e){return this.view.state.doc.lineAt(Math.min(e,this.view.state.doc.length)).number-1}setText(e){const t=Math.min(this.caret,e.length),n=this.text;let a=0;for(;a{const l=e.line(o+1),u=/^\s*/.exec(l.text)[0],m=/^\s*/.exec(r)[0];u!==m&&s.push({from:l.from,to:l.from+u.length,insert:m})}),s.length>0&&this.view.dispatch({changes:s,userEvent:"input.indent"}),this.view.focus()}setMarks(e,t){const n=[N0.of(e)];e.current!==void 0&&e.current({label:t,type:"variable",boost:1}))}class DF{constructor(e,t,n){v(this,"view");v(this,"readOnly",new Li);const a=r=>{var h,g;const o=r.matchBefore(/[\w.]+/);if(!o||o.from===o.to&&!r.explicit)return null;const l=r.state.doc.lineAt(r.pos),u=l.text.slice(0,r.pos-l.from);if(/\/\//.test(u)||(((h=u.match(/"/g))==null?void 0:h.length)??0)%2===1)return null;const m=pF(r.state.doc.toString(),r.pos,CF(),(g=t.ownTypes)==null?void 0:g.call(t,r.pos));if(m)return{from:m.from,options:m.members.map((f,x)=>({...jF(f),boost:50-x})),validFor:/^\w*$/};const c=/\bvoid\s+[\w.]*$/.test(u),d=OF(t.words()).filter(f=>!(c&&(f.label==="main"||f.label==="psvm")));return{from:o.from,options:[...d,...BF(r.state.doc.toString())],validFor:/^\w*$/}},s=[IF(t),DL(),FN(),pW(TF),Ri.of(" "),ie.tabSize.of(4),cW(),kW(),gE(),ar,wF,kF,SF,_F,this.readOnly.of(ie.readOnly.of(!1)),SE({override:[a],icons:!1}),r1.highest(Oi.of([{key:"Mod-z",run:()=>(t.onUndo(!1),!0),preventDefault:!0},{key:"Mod-Shift-z",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Mod-y",run:()=>(t.onUndo(!0),!0),preventDefault:!0},{key:"Backspace",run:Gc(!1)},{key:"Delete",run:Gc(!0)}])),Oi.of([...bE,...Yp,TN,..._N]),H.contentAttributes.of({"aria-label":n,autocapitalize:"off",autocorrect:"off",spellcheck:"false"}),H.updateListener.of(r=>{r.docChanged&&!r.transactions.some(o=>o.annotation(Fc))?queueMicrotask(()=>t.onChange()):r.selectionSet&&!r.docChanged&&queueMicrotask(()=>t.onCaret())})];this.view=new H({parent:e,state:ie.create({doc:"",extensions:s})})}get text(){return this.view.state.doc.toString()}get caret(){return this.view.state.selection.main.head}get hasFocus(){return this.view.hasFocus}get breakpoints(){const e=new Set,t=this.view.state.doc;return this.view.state.field(kl).between(0,t.length,n=>{e.add(t.lineAt(n).number-1)}),e}setBreakpoints(e){const t=this.view.state.doc,n=[...new Set(e)].filter(a=>a>=0&&at.line(a+1).from);this.view.dispatch({effects:Lf.of(n)})}lineAt(e){return this.view.state.doc.lineAt(Math.min(e,this.view.state.doc.length)).number-1}setText(e){const t=Math.min(this.caret,e.length),n=this.text;let a=0;for(;a{const l=e.line(o+1),u=/^\s*/.exec(l.text)[0],m=/^\s*/.exec(r)[0];u!==m&&s.push({from:l.from,to:l.from+u.length,insert:m})}),s.length>0&&this.view.dispatch({changes:s,userEvent:"input.indent"}),this.view.focus()}setMarks(e,t){const n=[N0.of(e)];e.current!==void 0&&e.current{const n=document.createElement("script");n.src=i,n.onload=()=>e(),n.onerror=()=>t(new Error(i)),document.head.append(n)})}function LF(i){return rn??(rn=(async()=>{await MF(DF),await cheerpjInit({status:"none"}),cheerpjCreateDisplay(-1,-1,i);const e=await fetch(Hc);if(!e.ok)throw new Error(Hc);if(cheerpOSAddStringFile(Ds,new Uint8Array(await e.arrayBuffer())),cheerpOSAddStringFile("/str/VisuStructRunner.java",ZF),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,"/str/VisuStructRunner.java","-d","/files/")!==0)throw new Error("javac");return await(await cheerpjRunLibrary("/files/")).VisuStructRunner})()),rn.catch(()=>rn=void 0),rn}function WF(i){const e=i.match(/public\s+(?:final\s+)?class\s+(\w+)/)??i.match(/\bclass\s+(\w+)/);return e?e[1]:"Main"}function EF(i){return/\bFiles\s*\.\s*\w+\s*\(|\bnew\s+(?:File|FileReader|FileWriter|PrintWriter|BufferedReader)\s*\(/.test(i)}function NF(i,e){return i.replace(/"([\w.-]+\.(?:txt|csv|json))"/g,`"${e}$1"`)}function Lf(i){i=i.replace(/\bFiles\s*\.\s*readString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g,'new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get($1)), "UTF-8")');const e=/\bFiles\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,/g;let t="",n=0;for(let a=e.exec(i);a;a=e.exec(i)){let s=1,r=a.index+a[0].length,o=!1;for(;r0;r++){const u=i[r];o?u==="\\"?r++:u==='"'&&(o=!1):u==='"'?o=!0:u==="("?s++:u===")"&&s--}if(s>0)break;const l=i.slice(a.index+a[0].length,r-1).trim();t+=i.slice(n,a.index)+`java.nio.file.Files.write(java.nio.file.Paths.get(${a[1]}), (${l}).getBytes("UTF-8"))`,n=r,e.lastIndex=r}return t+i.slice(n)}function FF(i){if(/\bclass\s+\w+/.test(i))return i;const e=[];i=i.replace(/^[ \t]*import\s+[\w.]+(?:\.\*)?\s*;[ \t]*$/gm,a=>(e.push(a.trim()),""));const t=[...e,"import java.util.*;","import java.awt.*;","import java.awt.event.*;","import javax.swing.*;"].join(` +`;let rn,Zs=0;function LF(i){return new Promise((e,t)=>{const n=document.createElement("script");n.src=i,n.onload=()=>e(),n.onerror=()=>t(new Error(i)),document.head.append(n)})}function WF(i){return rn??(rn=(async()=>{await LF(ZF),await cheerpjInit({status:"none"}),cheerpjCreateDisplay(-1,-1,i);const e=await fetch(Hc);if(!e.ok)throw new Error(Hc);if(cheerpOSAddStringFile(Ds,new Uint8Array(await e.arrayBuffer())),cheerpOSAddStringFile("/str/VisuStructRunner.java",MF),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,"/str/VisuStructRunner.java","-d","/files/")!==0)throw new Error("javac");return await(await cheerpjRunLibrary("/files/")).VisuStructRunner})()),rn.catch(()=>rn=void 0),rn}function EF(i){const e=i.match(/public\s+(?:final\s+)?class\s+(\w+)/)??i.match(/\bclass\s+(\w+)/);return e?e[1]:"Main"}function NF(i){return/\bFiles\s*\.\s*\w+\s*\(|\bnew\s+(?:File|FileReader|FileWriter|PrintWriter|BufferedReader)\s*\(/.test(i)}function FF(i,e){return i.replace(/"([\w.-]+\.(?:txt|csv|json))"/g,`"${e}$1"`)}function Wf(i){i=i.replace(/\bFiles\s*\.\s*readString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*\)/g,'new String(java.nio.file.Files.readAllBytes(java.nio.file.Paths.get($1)), "UTF-8")');const e=/\bFiles\s*\.\s*writeString\s*\(\s*(?:Path\s*\.\s*of|Paths\s*\.\s*get)\s*\(\s*("(?:[^"\\]|\\.)*")\s*\)\s*,/g;let t="",n=0;for(let a=e.exec(i);a;a=e.exec(i)){let s=1,r=a.index+a[0].length,o=!1;for(;r0;r++){const u=i[r];o?u==="\\"?r++:u==='"'&&(o=!1):u==='"'?o=!0:u==="("?s++:u===")"&&s--}if(s>0)break;const l=i.slice(a.index+a[0].length,r-1).trim();t+=i.slice(n,a.index)+`java.nio.file.Files.write(java.nio.file.Paths.get(${a[1]}), (${l}).getBytes("UTF-8"))`,n=r,e.lastIndex=r}return t+i.slice(n)}function JF(i){if(/\bclass\s+\w+/.test(i))return i;const e=[];i=i.replace(/^[ \t]*import\s+[\w.]+(?:\.\*)?\s*;[ \t]*$/gm,a=>(e.push(a.trim()),""));const t=[...e,"import java.util.*;","import java.awt.*;","import java.awt.event.*;","import javax.swing.*;"].join(` `)+` `;if(/\bstatic\s+void\s+main\s*\(/.test(i))return`${t}public class Main { ${i} } -`;const n=EF(i)?" throws Exception":"";return`${t}public class Main { +`;const n=NF(i)?" throws Exception":"";return`${t}public class Main { public static void main(String[] args)${n} { ${i} } } -`}async function JF(){rn&&await(await rn).closeAll()}async function Wf(i,e,t){const n=new Map;for(const a of(await i.list(e)).split(` -`).filter(Boolean)){const s=await i.read(e+a);t.get(a)!==s&&n.set(a,s)}return n}function RF(i,e){const t=Zs,n=`/files/run${t}/data/`,a=new Map([...ah(),...i]);let s=!1;const r=async()=>{if(!(s||Zs!==t||!rn)){try{const l=await rn,u=await Wf(l,n,a);for(const[m,c]of u)a.set(m,c);if(u.size&&e(u),await l.openWindows()===0)return}catch{return}o=window.setTimeout(r,1500)}};let o=window.setTimeout(r,1500);return()=>{s=!0,window.clearTimeout(o)}}async function GF(i,e){const t=await rn,n=`/files/run${++Zs}/`;await t.mkdirs(n);const a=`${n}data/`,s=new Map(ah());await t.mkdirs(a);for(const[u,m]of s)cheerpOSAddStringFile(`/str/${u}`,m),await t.copy(`/str/${u}`,a+u);const r=FF(Lf(NF(i,a))),o=WF(r);if(cheerpOSAddStringFile(`/str/${o}.java`,r),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,`/str/${o}.java`,"-d",n,"-encoding","UTF-8")!==0)return{result:"compile-error",files:new Map};e(),await t.run(n,o);const l=await Wf(t,a,s);return await t.openWindows()>0?{result:"windows",files:l}:(await new Promise(u=>setTimeout(u,500)),{result:await t.openWindows()>0?"windows":"finished",files:l})}async function WJ(i,e,t){const n=await rn,a=`/files/run${++Zs}/`,s=`${a}src/`,r=[];for(const l of i){const u=`${s}${l.pkg?l.pkg.replace(/\./g,"/")+"/":""}${l.name}.java`;await n.write(u,Lf(l.text)),r.push(u)}const o=`${a}classes/`;return await n.mkdirs(o),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,...r,"-d",o,"-encoding","UTF-8")!==0?{result:"compile-error",files:new Map}:(t(),await n.run(o,e),await n.openWindows()>0?{result:"windows",files:new Map}:(await new Promise(l=>setTimeout(l,500)),{result:await n.openWindows()>0?"windows":"finished",files:new Map}))}const Ef="visustruct.live.target",Vc="visustruct.live.javaClass",Qc="visustruct.live.javaMain",qc="visustruct.live.swing",Uc="visustruct.console.height",$c=150;function Ur(i){try{return localStorage.getItem(i)==="1"}catch{return!1}}function HF(i){try{return localStorage.getItem(i)}catch{return null}}function VF(i,e){try{localStorage.setItem(i,e)}catch{}}function QF(){try{const i=localStorage.getItem(Ef);return i==="javascript"||i==="python"?i:"java"}catch{return"java"}}const pe=i=>i.replace(/&/g,"&").replace(//g,">");function qF(i){let e="",t=i;for(;;){const n=t.indexOf(Mi);if(n<0)break;const a=t.indexOf(ql,n);if(a<0)break;e+=pe(t.slice(0,n))+`${pe(t.slice(n+1,a))}`,t=t.slice(a+1)}return e+pe(t)}const q1=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function Aa(i,e){let t;for(const n of i)en.to||(!t||n.to-n.fromt.path.length)&&(t=n);return t}const UF=900,$F=2e3;class YF{constructor(e,t,n,a){v(this,"element");v(this,"view");v(this,"editor");v(this,"code");v(this,"problemLine");v(this,"hint");v(this,"spans",[]);v(this,"highlighted");v(this,"html","");v(this,"target",QF());v(this,"last");v(this,"textFor",new WeakMap);v(this,"form",{asClass:Ur(Vc),withMain:Ur(Qc)});v(this,"shown",new WeakMap);v(this,"parsed");v(this,"placeholders",[]);v(this,"problems",[]);v(this,"problemTimer");v(this,"showProblems",!0);v(this,"run");v(this,"debugLine");v(this,"breakpoints",new Set);v(this,"swing",Ur(qc));v(this,"swingElement");v(this,"swingDisplay");v(this,"stopWatchingFiles");v(this,"runButton");v(this,"stepButton");v(this,"stopButton");v(this,"indentButton");v(this,"debugPanel");v(this,"debugVars");v(this,"consoleElement");v(this,"consoleResizer");v(this,"consoleLines");v(this,"consoleForm");v(this,"consoleNotice");v(this,"onRobotRun");v(this,"onReference");v(this,"onSwap");this.onHide=e,this.onSelect=t,this.onCode=n,this.onUndo=a,this.element=document.createElement("aside"),this.element.className="livecode",this.consoleElement=document.createElement("section"),this.consoleElement.className="console",this.consoleElement.hidden=!0,this.consoleResizer=this.makeConsoleResizer(),this.swingElement=document.createElement("section"),this.swingElement.className="console livecode-swing",this.swingElement.hidden=!0,this.swingDisplay=document.createElement("div"),this.swingDisplay.className="livecode-swing-display",this.build()}get labels(){return{condition:p("canvas_stub_condition"),selector:p("web_live_ph_selector"),code:p("web_live_ph_code"),start:p("inspector_for_init"),step:p("inspector_for_step"),end:p("web_live_ph_end")}}build(){this.run&&window.clearTimeout(this.run.timer),this.element.innerHTML=` +`}async function RF(){rn&&await(await rn).closeAll()}async function Ef(i,e,t){const n=new Map;for(const a of(await i.list(e)).split(` +`).filter(Boolean)){const s=await i.read(e+a);t.get(a)!==s&&n.set(a,s)}return n}function GF(i,e){const t=Zs,n=`/files/run${t}/data/`,a=new Map([...sh(),...i]);let s=!1;const r=async()=>{if(!(s||Zs!==t||!rn)){try{const l=await rn,u=await Ef(l,n,a);for(const[m,c]of u)a.set(m,c);if(u.size&&e(u),await l.openWindows()===0)return}catch{return}o=window.setTimeout(r,1500)}};let o=window.setTimeout(r,1500);return()=>{s=!0,window.clearTimeout(o)}}async function HF(i,e){const t=await rn,n=`/files/run${++Zs}/`;await t.mkdirs(n);const a=`${n}data/`,s=new Map(sh());await t.mkdirs(a);for(const[u,m]of s)cheerpOSAddStringFile(`/str/${u}`,m),await t.copy(`/str/${u}`,a+u);const r=JF(Wf(FF(i,a))),o=EF(r);if(cheerpOSAddStringFile(`/str/${o}.java`,r),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,`/str/${o}.java`,"-d",n,"-encoding","UTF-8")!==0)return{result:"compile-error",files:new Map};e(),await t.run(n,o);const l=await Ef(t,a,s);return await t.openWindows()>0?{result:"windows",files:l}:(await new Promise(u=>setTimeout(u,500)),{result:await t.openWindows()>0?"windows":"finished",files:l})}async function EJ(i,e,t){const n=await rn,a=`/files/run${++Zs}/`,s=`${a}src/`,r=[];for(const l of i){const u=`${s}${l.pkg?l.pkg.replace(/\./g,"/")+"/":""}${l.name}.java`;await n.write(u,Wf(l.text)),r.push(u)}const o=`${a}classes/`;return await n.mkdirs(o),await cheerpjRunMain("com.sun.tools.javac.Main",Ds,...r,"-d",o,"-encoding","UTF-8")!==0?{result:"compile-error",files:new Map}:(t(),await n.run(o,e),await n.openWindows()>0?{result:"windows",files:new Map}:(await new Promise(l=>setTimeout(l,500)),{result:await n.openWindows()>0?"windows":"finished",files:new Map}))}const Nf="visustruct.live.target",Vc="visustruct.live.javaClass",Qc="visustruct.live.javaMain",qc="visustruct.live.swing",Uc="visustruct.console.height",$c=150;function Ur(i){try{return localStorage.getItem(i)==="1"}catch{return!1}}function VF(i){try{return localStorage.getItem(i)}catch{return null}}function QF(i,e){try{localStorage.setItem(i,e)}catch{}}function qF(){try{const i=localStorage.getItem(Nf);return i==="javascript"||i==="python"?i:"java"}catch{return"java"}}const fe=i=>i.replace(/&/g,"&").replace(//g,">");function UF(i){let e="",t=i;for(;;){const n=t.indexOf(Mi);if(n<0)break;const a=t.indexOf(ql,n);if(a<0)break;e+=fe(t.slice(0,n))+`${fe(t.slice(n+1,a))}`,t=t.slice(a+1)}return e+fe(t)}const q1=(i,e)=>i.length===e.length&&i.every((t,n)=>t===e[n]);function Aa(i,e){let t;for(const n of i)en.to||(!t||n.to-n.fromt.path.length)&&(t=n);return t}const $F=900,YF=2e3;class XF{constructor(e,t,n,a){v(this,"element");v(this,"view");v(this,"editor");v(this,"code");v(this,"problemLine");v(this,"hint");v(this,"spans",[]);v(this,"highlighted");v(this,"html","");v(this,"target",qF());v(this,"last");v(this,"textFor",new WeakMap);v(this,"form",{asClass:Ur(Vc),withMain:Ur(Qc)});v(this,"shown",new WeakMap);v(this,"parsed");v(this,"placeholders",[]);v(this,"problems",[]);v(this,"problemTimer");v(this,"showProblems",!0);v(this,"run");v(this,"debugLine");v(this,"breakpoints",new Set);v(this,"swing",Ur(qc));v(this,"swingElement");v(this,"swingDisplay");v(this,"stopWatchingFiles");v(this,"runButton");v(this,"stepButton");v(this,"stopButton");v(this,"indentButton");v(this,"debugPanel");v(this,"debugVars");v(this,"consoleElement");v(this,"consoleResizer");v(this,"consoleLines");v(this,"consoleForm");v(this,"consoleNotice");v(this,"onRobotRun");v(this,"onReference");v(this,"onSwap");this.onHide=e,this.onSelect=t,this.onCode=n,this.onUndo=a,this.element=document.createElement("aside"),this.element.className="livecode",this.consoleElement=document.createElement("section"),this.consoleElement.className="console",this.consoleElement.hidden=!0,this.consoleResizer=this.makeConsoleResizer(),this.swingElement=document.createElement("section"),this.swingElement.className="console livecode-swing",this.swingElement.hidden=!0,this.swingDisplay=document.createElement("div"),this.swingDisplay.className="livecode-swing-display",this.build()}get labels(){return{condition:p("canvas_stub_condition"),selector:p("web_live_ph_selector"),code:p("web_live_ph_code"),start:p("inspector_for_init"),step:p("inspector_for_step"),end:p("web_live_ph_end")}}build(){this.run&&window.clearTimeout(this.run.timer),this.element.innerHTML=`
-

${pe(p("web_live_title"))}

+

${fe(p("web_live_title"))}

- - - - + + + + - - + +


       

`,this.consoleElement.innerHTML=`
-

${pe(p("web_console"))}

- +

${fe(p("web_console"))}

+

`,this.view=this.element.querySelector(".livecode-view"),this.editor=this.element.querySelector(".livecode-editor"),this.problemLine=this.element.querySelector(".livecode-problem"),this.hint=this.element.querySelector(".hint"),this.element.querySelector(".learn-hide").addEventListener("click",()=>this.onHide()),this.element.querySelector(".livecode-reference").addEventListener("click",()=>{var t;return(t=this.onReference)==null?void 0:t.call(this)}),this.element.querySelector(".livecode-swap").addEventListener("click",()=>{var t;return(t=this.onSwap)==null?void 0:t.call(this)}),this.runButton=this.element.querySelector("[data-run=play]"),this.stepButton=this.element.querySelector("[data-run=step]"),this.stopButton=this.element.querySelector("[data-run=stop]"),this.indentButton=this.element.querySelector(".livecode-indent"),this.indentButton.addEventListener("click",()=>this.code.indent()),this.debugPanel=this.element.querySelector(".livecode-debug"),this.debugVars=this.element.querySelector(".livecode-vars"),this.swingElement.innerHTML=`
-

${pe(p("web_live_swing_windows"))}

- +

${fe(p("web_live_swing_windows"))}

+
- `,this.swingElement.append(this.swingDisplay),this.swingElement.querySelector(".console-hide").addEventListener("click",()=>{this.swingElement.hidden=!0,JF()});const e=this.consoleElement;this.consoleResizer.title=p("web_console_resize"),this.element.append(this.swingElement,this.consoleResizer,e),this.consoleLines=e.querySelector(".livecode-console-lines"),this.consoleForm=e.querySelector(".livecode-console-input"),this.consoleNotice=e.querySelector(".livecode-console-notice"),e.querySelector(".console-hide").addEventListener("click",()=>this.hideConsole()),this.runButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.resume():this.startRun(!1)}),this.stepButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.stepOnce():this.startRun(!0)}),this.stopButton.addEventListener("click",()=>this.stopRun(!0)),this.consoleForm.addEventListener("submit",t=>{t.preventDefault(),this.submitInput()}),this.run=void 0,this.view.addEventListener("click",t=>{const n=t.target.closest(".ln");if(!n||!this.view.classList.contains("selectable"))return;const a=Aa(this.spans,Number(n.dataset.line));a&&this.onSelect(a.path)}),this.code=new BF(this.editor,{onChange:()=>this.codeChanged(),onCaret:()=>this.caretMoved(),onUndo:t=>this.onUndo(t),words:()=>this.snippetWords,breakpointLine:t=>{var n;return(n=Aa(this.spans,t))==null?void 0:n.from},onBreakpoints:()=>this.breakpoints=this.code.breakpoints},p("web_live_edit_label")),this.editor.querySelector(".cm-gutters").title=p("web_debug_gutter_title"),this.breakpoints=new Set,this.debugLine=void 0,this.highlighted=void 0,this.html="",this.parsed=void 0,this.showMode()}javaFor(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t);return a?cm(a.text,a.doc,e,this.labels,{},this.form):oi(e,this.labels,this.form)}adoptJava(e,t){this.textFor.set(e,t),this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}documentFromJavaText(e){return Co({caption:"",elements:[]},jo(e,this.labels))}get javaForm(){return this.form}setJavaForm(e){this.form=e;try{localStorage.setItem(Vc,e.asClass?"1":"0"),localStorage.setItem(Qc,e.withMain?"1":"0")}catch{}this.textFor=new WeakMap,this.shown=new WeakMap,this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}get swingSupport(){return this.swing}setSwingSupport(e){this.swing=e;try{localStorage.setItem(qc,e?"1":"0")}catch{}e||(this.swingElement.hidden=!0)}get language(){return this.target}setTarget(e){this.target=e;try{localStorage.setItem(Ef,e)}catch{}this.showMode(),this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}showMode(){const e=this.target==="java";this.view.hidden=e,this.editor.hidden=!e,this.problemLine.hidden=!e,this.indentButton.hidden=!e,this.hint.textContent=p(e?"web_live_hint_edit":"web_live_hint"),this.element.querySelector(".livecode-lang").textContent={java:"Java",javascript:"JavaScript",python:"Python"}[this.target]}refresh(e,t,n){this.last={doc:e,highlight:t,context:n},this.target==="java"?this.refreshEditor(e,t,n):this.refreshView(e,t,n.editable)}refreshView(e,t,n){var l;const a=Sh(e,this.target,this.labels);this.spans=a.spans;const s=t&&a.spans.find(u=>q1(u.path,t));this.view.classList.toggle("selectable",n);const r=a.text.split(` -`).map((u,m)=>`
${qF(u)||" "}
`).join("");r!==this.html&&(this.view.innerHTML=r),this.html=r;const o=s?`${s.from}-${s.to}`:void 0;o&&o!==this.highlighted&&((l=this.view.querySelector(`.ln[data-line="${s.from}"]`))==null||l.scrollIntoView({block:"nearest"})),this.highlighted=o}startRun(e){var a,s;if((a=this.onRobotRun)!=null&&a.call(this,e))return;const t=["web_parse_missing_import","web_parse_missing_scanner","web_parse_unknown_type"],n=this.target==="java"?this.problems.find(r=>t.includes(r.key)):void 0;if(n){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent=p("web_parse_line_fmt",this.code.lineAt(n.from)+1,p(n.key,n.arg??"")),this.consoleNotice.classList.add("error"),this.showProblems=!0,this.drawMarks((s=this.last)==null?void 0:s.highlight);return}if(this.swing&&this.target==="java"&&!e&&this.code.breakpoints.size===0)return void this.startJavaRun();this.last&&(this.stopRun(!1),this.run={engine:new bi(this.last.doc,this.last.context.resolve),doc:this.last.doc,printed:0,paused:!1,stepping:e,debugged:!1},this.breakpoints=this.code.breakpoints,this.debugPanel.hidden=!0,this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent="",this.consoleNotice.classList.remove("error"),this.setRunning(!0),e?this.pause():this.continueRun(!1))}async startJavaRun(){var e;this.stopRun(!1),(e=this.stopWatchingFiles)==null||e.call(this),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleLines.id="console",this.consoleForm.hidden=!0,this.consoleNotice.classList.remove("error"),this.runButton.disabled=this.stepButton.disabled=!0;try{this.consoleNotice.textContent=p("web_live_swing_loading"),await LF(this.swingDisplay),this.consoleNotice.textContent=p("web_live_swing_compiling");const{result:t,files:n}=await GF(this.code.text,()=>this.swingElement.hidden=!1);this.showWrittenFiles(n),this.consoleNotice.textContent=p({"compile-error":"web_live_swing_compile_failed",windows:"web_live_swing_running",finished:"web_live_run_finished"}[t]),this.consoleNotice.classList.toggle("error",t==="compile-error"),this.swingElement.hidden=t!=="windows",t==="windows"&&(this.stopWatchingFiles=RF(n,a=>this.showWrittenFiles(a)))}catch{this.consoleNotice.textContent=p("web_live_swing_failed"),this.consoleNotice.classList.add("error")}this.runButton.disabled=this.stepButton.disabled=!1}continueRun(e){const t=this.run;if(!t)return;const{engine:n}=t;for(let a=0;a<$F&&n.canStep;a++){if(!(e&&a===0)&&this.atBreakpoint(n.steps[n.state.stepIndex]))return this.printNewLines(),this.pause();n.step()}this.afterSteps()||(t.timer=window.setTimeout(()=>this.continueRun(!1),0))}afterSteps(){const e=this.run,t=e.engine.state;return this.printNewLines(),t.inputRequest?(this.askInput(),!0):t.isHalted||!e.engine.canStep?(this.showWrittenFiles(t.files),this.finishRun(t.isHalted&&t.notice?Kn(t.notice):p("web_live_run_finished"),t.isHalted),!0):!1}atBreakpoint(e){if(!e||e.callPath||e.kind==="forLoopIncrement"||e.kind==="forLoopStart"||e.kind==="callEnd")return!1;const t=this.lineOf(e.path);return t!==void 0&&this.breakpoints.has(t)}lineOf(e){var t;return e&&((t=this.spans.find(n=>q1(n.path,e)))==null?void 0:t.from)}pause(){var a,s;const e=this.run;e.paused=!0,e.debugged=!0;const t=e.engine.currentStepPath;this.debugLine=this.lineOf(t),this.consoleNotice.classList.remove("error"),this.consoleNotice.textContent=this.debugLine===void 0?"":p("web_debug_paused_fmt",this.debugLine+1),this.showVariables(),this.setRunning(!0);const n=(a=this.last)==null?void 0:a.highlight;t&&!(n&&q1(n,t))?this.onSelect(t):this.drawMarks((s=this.last)==null?void 0:s.highlight)}resume(){const e=this.run;e!=null&&e.paused&&(e.paused=!1,e.stepping=!1,this.leavePause(),this.continueRun(!0))}stepOnce(){var a,s;const e=this.run;if(!(e!=null&&e.paused))return;e.paused=!1,e.stepping=!0,this.leavePause();const{engine:t}=e,n=(a=t.steps[t.state.stepIndex])==null?void 0:a.kind;t.step(),(n==="forLoopStart"||n==="forLoopIncrement")&&t.canStep&&((s=t.steps[t.state.stepIndex])==null?void 0:s.kind)==="forLoopCondition"&&t.step(),this.afterSteps()||this.pause()}leavePause(){var e;this.debugLine=void 0,this.consoleNotice.textContent="",this.setRunning(!0),this.drawMarks((e=this.last)==null?void 0:e.highlight)}showVariables(){const e=this.run,t=e.engine.state.variables;this.debugPanel.hidden=!1;const n=[...t.keys()].sort((a,s)=>a.localeCompare(s));if(n.length===0)this.debugVars.innerHTML=`

${pe(p("simulation_variables_placeholder"))}

`;else{const a=document.createElement("table");for(const s of n){const r=t.get(s),o=ve(r),l=a.insertRow();l.insertCell().textContent=s;const u=l.insertCell();r.kind==="grid"?u.append(Qh(r)):u.textContent=o,e.values&&e.values.get(s)!==o&&l.classList.add("changed")}this.debugVars.replaceChildren(a)}e.values=new Map(n.map(a=>[a,ve(t.get(a))]))}printNewLines(e){const t=this.run;if(!t)return;const n=t.engine.state.outputLines;for(;t.printeds.focus())}submitInput(){const e=this.run;if(!(e!=null&&e.engine.state.inputRequest))return;const t=this.consoleForm.querySelector("input"),{prompt:n}=e.engine.state.inputRequest;if(e.engine.provideInput(t.value),e.engine.state.inputRequest)return this.askInput();const a=e.heldLine;if(e.heldLine=void 0,this.printNewLines({prompt:n,value:t.value,heldLine:a}),t.value="",this.consoleForm.hidden=!0,!e.stepping)return this.continueRun(!1);this.afterSteps()||this.pause()}stopRun(e){var t;this.run&&(window.clearTimeout(this.run.timer),this.run.heldLine!==void 0&&this.consoleLine(this.run.heldLine),e&&this.finishRun(p("web_live_run_stopped"),!1),this.run=void 0,this.debugLine=void 0,this.debugPanel.hidden=!0,this.setRunning(!1),this.drawMarks((t=this.last)==null?void 0:t.highlight))}finishRun(e,t){var n,a;this.run&&window.clearTimeout(this.run.timer),this.consoleForm.hidden=!0,this.consoleNotice.textContent=e,this.consoleNotice.classList.toggle("error",t),(n=this.run)!=null&&n.debugged?this.showVariables():this.debugPanel.hidden=!0,this.run=void 0,this.debugLine=void 0,this.setRunning(!1),this.drawMarks((a=this.last)==null?void 0:a.highlight)}showTranscript(e){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleForm.hidden=!0,this.consoleLines.replaceChildren();for(const t of e.lines){const n=this.consoleLine(t.text);if(t.typed!==void 0){const a=document.createElement("span");a.className="typed",a.textContent=t.typed,n.append(a)}}e.pending!==void 0&&this.consoleLine(e.pending).classList.add("pending"),this.consoleLines.scrollTop=this.consoleLines.scrollHeight,this.consoleNotice.textContent=e.notice??"",this.consoleNotice.classList.toggle("error",e.error)}hideConsole(){this.stopRun(!1),this.setConsoleVisible(!1)}setConsoleVisible(e){this.consoleElement.hidden!==!e&&(this.consoleElement.hidden=!e,this.consoleResizer.hidden=!e)}makeConsoleResizer(){const e=document.createElement("div");e.className="console-resizer",e.hidden=!0,e.tabIndex=0,e.setAttribute("role","separator"),e.setAttribute("aria-orientation","horizontal");const t=this.consoleElement,n=r=>Math.round(Math.max($c,Math.min(r,this.element.getBoundingClientRect().height-160))),a=(r,o)=>{t.style.height=r===void 0?"":`${n(r)}px`,o&&VF(Uc,r===void 0?"":String(n(r)))},s=Number(HF(Uc));return s>0&&(t.style.height=`${Math.max($c,s)}px`),e.addEventListener("pointerdown",r=>{if(r.button!==0)return;r.preventDefault(),e.setPointerCapture(r.pointerId);const o=r.clientY,l=t.getBoundingClientRect().height;e.classList.add("dragging");const u=c=>a(l-(c.clientY-o),!1),m=c=>{e.removeEventListener("pointermove",u),e.removeEventListener("pointerup",m),e.removeEventListener("pointercancel",m),e.classList.remove("dragging"),a(l-(c.clientY-o),!0)};e.addEventListener("pointermove",u),e.addEventListener("pointerup",m),e.addEventListener("pointercancel",m)}),e.addEventListener("dblclick",()=>a(void 0,!0)),e.addEventListener("keydown",r=>{const o=r.key==="ArrowUp"?20:r.key==="ArrowDown"?-20:0;o&&(r.preventDefault(),a(t.getBoundingClientRect().height+o,!0))}),e}setRunning(e){var a,s;const t=!!((a=this.run)!=null&&a.paused);this.runButton.disabled=e&&!t,this.stepButton.disabled=e&&!t,this.stopButton.disabled=!e,this.indentButton.disabled=e;const n=p(t?"web_debug_continue":"web_live_run_title");this.runButton.dataset.tip=n,this.runButton.setAttribute("aria-label",t?n:p("web_live_run")),this.element.classList.toggle("running",e&&!t),this.element.classList.toggle("debugging",t),this.code.setReadOnly(e||!((s=this.last)!=null&&s.context.editable))}textForDocument(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t.owner);return a?XF(a.text,cm(a.text,a.doc,e,this.labels,{subprograms:t.subprograms},this.form)):oi(e,this.labels,this.form)}refreshEditor(e,t,n){var r;const a=this.textForDocument(e,n);this.textFor.set(e,a),this.shown.set(n.owner,{doc:e,text:a}),this.run&&this.run.doc!==e&&this.stopRun(!1),this.code.setReadOnly(!n.editable||!!this.run),this.code.text!==a?(this.code.setText(a),this.analyze(a,n)):this.parsed||this.analyze(a,n);const s=ag(e,this.labels,this.form);this.spans=a===s.text?s.spans:((r=this.parsed)==null?void 0:r.spans)??[],this.drawMarks(t)}analyze(e,t){this.parsed=jo(e,this.labels,{subprograms:t.subprograms}),this.placeholders=this.parsed.placeholders,this.problems=this.parsed.problems}drawMarks(e){var r;const t=e&&this.spans.find(o=>q1(o.path,e)),n=t?`${t.from}-${t.to}`:void 0,a=((r=this.last)==null?void 0:r.context.editable)===!1&&t?t.from:void 0;this.code.setMarks({placeholders:this.placeholders,problems:this.showProblems?this.problems:[],lines:t&&a===void 0?{from:t.from,to:t.to}:void 0,current:this.debugLine??a},n!==void 0&&n!==this.highlighted&&!this.code.hasFocus);const s=this.showProblems?this.problems[0]:void 0;this.problemLine.textContent=s?p("web_parse_line_fmt",this.code.lineAt(s.from)+1,p(s.key,s.arg??"")):"",this.highlighted=n}codeChanged(){var u,m,c,d;const e=(u=this.last)==null?void 0:u.context,t=(m=this.last)==null?void 0:m.doc;if(!e||!t)return;const n=this.code.text;this.analyze(n,e);const a=Co(t,this.parsed),s=JSON.stringify([a.caption,a.elements])===JSON.stringify([t.caption,t.elements]),r=s?t:a;this.textFor.set(r,n),this.shown.set(e.owner,{doc:r,text:n}),this.showProblems=!1,window.clearTimeout(this.problemTimer),this.problemTimer=window.setTimeout(()=>{var h;this.showProblems=!0,this.drawMarks((h=this.last)==null?void 0:h.highlight)},UF);const o=this.code.lineAt(this.code.caret),l=(c=Aa(this.parsed.spans,o))==null?void 0:c.path;s?(this.spans=this.parsed.spans,this.drawMarks((d=this.last)==null?void 0:d.highlight),l&&this.onSelect(l)):this.onCode(r,l)}caretMoved(){var n,a;const e=Aa(this.spans,this.code.lineAt(this.code.caret)),t=(n=this.last)==null?void 0:n.highlight;e&&((a=this.last)!=null&&a.context.editable)&&!(t&&q1(t,e.path))&&this.onSelect(e.path)}get snippetWords(){const e=this.labels;return{condition:e.condition,selector:e.selector,code:e.code,start:e.start,step:e.step,branch:p("element_verzweigung"),branchElse:p("element_verzweigung"),switchCase:p("element_fallauswahl"),forLoop:p("element_forSchleife"),whileLoop:p("element_whileSchleife"),doLoop:p("element_doUntilSchleife"),output:p("inspector_io_mode_output"),input:p("inspector_io_mode_input")}}}function XF(i,e){const t=i.split(` + `,this.swingElement.append(this.swingDisplay),this.swingElement.querySelector(".console-hide").addEventListener("click",()=>{this.swingElement.hidden=!0,RF()});const e=this.consoleElement;this.consoleResizer.title=p("web_console_resize"),this.element.append(this.swingElement,this.consoleResizer,e),this.consoleLines=e.querySelector(".livecode-console-lines"),this.consoleForm=e.querySelector(".livecode-console-input"),this.consoleNotice=e.querySelector(".livecode-console-notice"),e.querySelector(".console-hide").addEventListener("click",()=>this.hideConsole()),this.runButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.resume():this.startRun(!1)}),this.stepButton.addEventListener("click",()=>{var t;return(t=this.run)!=null&&t.paused?this.stepOnce():this.startRun(!0)}),this.stopButton.addEventListener("click",()=>this.stopRun(!0)),this.consoleForm.addEventListener("submit",t=>{t.preventDefault(),this.submitInput()}),this.run=void 0,this.view.addEventListener("click",t=>{const n=t.target.closest(".ln");if(!n||!this.view.classList.contains("selectable"))return;const a=Aa(this.spans,Number(n.dataset.line));a&&this.onSelect(a.path)}),this.code=new DF(this.editor,{onChange:()=>this.codeChanged(),onCaret:()=>this.caretMoved(),onUndo:t=>this.onUndo(t),words:()=>this.snippetWords,breakpointLine:t=>{var n;return(n=Aa(this.spans,t))==null?void 0:n.from},onBreakpoints:()=>this.breakpoints=this.code.breakpoints},p("web_live_edit_label")),this.editor.querySelector(".cm-gutters").title=p("web_debug_gutter_title"),this.breakpoints=new Set,this.debugLine=void 0,this.highlighted=void 0,this.html="",this.parsed=void 0,this.showMode()}javaFor(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t);return a?cm(a.text,a.doc,e,this.labels,{},this.form):oi(e,this.labels,this.form)}adoptJava(e,t){this.textFor.set(e,t),this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}documentFromJavaText(e){return Co({caption:"",elements:[]},jo(e,this.labels))}get javaForm(){return this.form}setJavaForm(e){this.form=e;try{localStorage.setItem(Vc,e.asClass?"1":"0"),localStorage.setItem(Qc,e.withMain?"1":"0")}catch{}this.textFor=new WeakMap,this.shown=new WeakMap,this.parsed=void 0,this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}get swingSupport(){return this.swing}setSwingSupport(e){this.swing=e;try{localStorage.setItem(qc,e?"1":"0")}catch{}e||(this.swingElement.hidden=!0)}get language(){return this.target}setTarget(e){this.target=e;try{localStorage.setItem(Nf,e)}catch{}this.showMode(),this.last&&this.refresh(this.last.doc,this.last.highlight,this.last.context)}showMode(){const e=this.target==="java";this.view.hidden=e,this.editor.hidden=!e,this.problemLine.hidden=!e,this.indentButton.hidden=!e,this.hint.textContent=p(e?"web_live_hint_edit":"web_live_hint"),this.element.querySelector(".livecode-lang").textContent={java:"Java",javascript:"JavaScript",python:"Python"}[this.target]}refresh(e,t,n){this.last={doc:e,highlight:t,context:n},this.target==="java"?this.refreshEditor(e,t,n):this.refreshView(e,t,n.editable)}refreshView(e,t,n){var l;const a=_h(e,this.target,this.labels);this.spans=a.spans;const s=t&&a.spans.find(u=>q1(u.path,t));this.view.classList.toggle("selectable",n);const r=a.text.split(` +`).map((u,m)=>`
${UF(u)||" "}
`).join("");r!==this.html&&(this.view.innerHTML=r),this.html=r;const o=s?`${s.from}-${s.to}`:void 0;o&&o!==this.highlighted&&((l=this.view.querySelector(`.ln[data-line="${s.from}"]`))==null||l.scrollIntoView({block:"nearest"})),this.highlighted=o}startRun(e){var a,s;if((a=this.onRobotRun)!=null&&a.call(this,e))return;const t=["web_parse_missing_import","web_parse_missing_scanner","web_parse_unknown_type"],n=this.target==="java"?this.problems.find(r=>t.includes(r.key)):void 0;if(n){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent=p("web_parse_line_fmt",this.code.lineAt(n.from)+1,p(n.key,n.arg??"")),this.consoleNotice.classList.add("error"),this.showProblems=!0,this.drawMarks((s=this.last)==null?void 0:s.highlight);return}if(this.swing&&this.target==="java"&&!e&&this.code.breakpoints.size===0)return void this.startJavaRun();this.last&&(this.stopRun(!1),this.run={engine:new bi(this.last.doc,this.last.context.resolve),doc:this.last.doc,printed:0,paused:!1,stepping:e,debugged:!1},this.breakpoints=this.code.breakpoints,this.debugPanel.hidden=!0,this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleNotice.textContent="",this.consoleNotice.classList.remove("error"),this.setRunning(!0),e?this.pause():this.continueRun(!1))}async startJavaRun(){var e;this.stopRun(!1),(e=this.stopWatchingFiles)==null||e.call(this),this.setConsoleVisible(!0),this.consoleLines.replaceChildren(),this.consoleLines.id="console",this.consoleForm.hidden=!0,this.consoleNotice.classList.remove("error"),this.runButton.disabled=this.stepButton.disabled=!0;try{this.consoleNotice.textContent=p("web_live_swing_loading"),await WF(this.swingDisplay),this.consoleNotice.textContent=p("web_live_swing_compiling");const{result:t,files:n}=await HF(this.code.text,()=>this.swingElement.hidden=!1);this.showWrittenFiles(n),this.consoleNotice.textContent=p({"compile-error":"web_live_swing_compile_failed",windows:"web_live_swing_running",finished:"web_live_run_finished"}[t]),this.consoleNotice.classList.toggle("error",t==="compile-error"),this.swingElement.hidden=t!=="windows",t==="windows"&&(this.stopWatchingFiles=GF(n,a=>this.showWrittenFiles(a)))}catch{this.consoleNotice.textContent=p("web_live_swing_failed"),this.consoleNotice.classList.add("error")}this.runButton.disabled=this.stepButton.disabled=!1}continueRun(e){const t=this.run;if(!t)return;const{engine:n}=t;for(let a=0;athis.continueRun(!1),0))}afterSteps(){const e=this.run,t=e.engine.state;return this.printNewLines(),t.inputRequest?(this.askInput(),!0):t.isHalted||!e.engine.canStep?(this.showWrittenFiles(t.files),this.finishRun(t.isHalted&&t.notice?Kn(t.notice):p("web_live_run_finished"),t.isHalted),!0):!1}atBreakpoint(e){if(!e||e.callPath||e.kind==="forLoopIncrement"||e.kind==="forLoopStart"||e.kind==="callEnd")return!1;const t=this.lineOf(e.path);return t!==void 0&&this.breakpoints.has(t)}lineOf(e){var t;return e&&((t=this.spans.find(n=>q1(n.path,e)))==null?void 0:t.from)}pause(){var a,s;const e=this.run;e.paused=!0,e.debugged=!0;const t=e.engine.currentStepPath;this.debugLine=this.lineOf(t),this.consoleNotice.classList.remove("error"),this.consoleNotice.textContent=this.debugLine===void 0?"":p("web_debug_paused_fmt",this.debugLine+1),this.showVariables(),this.setRunning(!0);const n=(a=this.last)==null?void 0:a.highlight;t&&!(n&&q1(n,t))?this.onSelect(t):this.drawMarks((s=this.last)==null?void 0:s.highlight)}resume(){const e=this.run;e!=null&&e.paused&&(e.paused=!1,e.stepping=!1,this.leavePause(),this.continueRun(!0))}stepOnce(){var a,s;const e=this.run;if(!(e!=null&&e.paused))return;e.paused=!1,e.stepping=!0,this.leavePause();const{engine:t}=e,n=(a=t.steps[t.state.stepIndex])==null?void 0:a.kind;t.step(),(n==="forLoopStart"||n==="forLoopIncrement")&&t.canStep&&((s=t.steps[t.state.stepIndex])==null?void 0:s.kind)==="forLoopCondition"&&t.step(),this.afterSteps()||this.pause()}leavePause(){var e;this.debugLine=void 0,this.consoleNotice.textContent="",this.setRunning(!0),this.drawMarks((e=this.last)==null?void 0:e.highlight)}showVariables(){const e=this.run,t=e.engine.state.variables;this.debugPanel.hidden=!1;const n=[...t.keys()].sort((a,s)=>a.localeCompare(s));if(n.length===0)this.debugVars.innerHTML=`

${fe(p("simulation_variables_placeholder"))}

`;else{const a=document.createElement("table");for(const s of n){const r=t.get(s),o=we(r),l=a.insertRow();l.insertCell().textContent=s;const u=l.insertCell();r.kind==="grid"?u.append(qh(r)):u.textContent=o,e.values&&e.values.get(s)!==o&&l.classList.add("changed")}this.debugVars.replaceChildren(a)}e.values=new Map(n.map(a=>[a,we(t.get(a))]))}printNewLines(e){const t=this.run;if(!t)return;const n=t.engine.state.outputLines;for(;t.printeds.focus())}submitInput(){const e=this.run;if(!(e!=null&&e.engine.state.inputRequest))return;const t=this.consoleForm.querySelector("input"),{prompt:n}=e.engine.state.inputRequest;if(e.engine.provideInput(t.value),e.engine.state.inputRequest)return this.askInput();const a=e.heldLine;if(e.heldLine=void 0,this.printNewLines({prompt:n,value:t.value,heldLine:a}),t.value="",this.consoleForm.hidden=!0,!e.stepping)return this.continueRun(!1);this.afterSteps()||this.pause()}stopRun(e){var t;this.run&&(window.clearTimeout(this.run.timer),this.run.heldLine!==void 0&&this.consoleLine(this.run.heldLine),e&&this.finishRun(p("web_live_run_stopped"),!1),this.run=void 0,this.debugLine=void 0,this.debugPanel.hidden=!0,this.setRunning(!1),this.drawMarks((t=this.last)==null?void 0:t.highlight))}finishRun(e,t){var n,a;this.run&&window.clearTimeout(this.run.timer),this.consoleForm.hidden=!0,this.consoleNotice.textContent=e,this.consoleNotice.classList.toggle("error",t),(n=this.run)!=null&&n.debugged?this.showVariables():this.debugPanel.hidden=!0,this.run=void 0,this.debugLine=void 0,this.setRunning(!1),this.drawMarks((a=this.last)==null?void 0:a.highlight)}showTranscript(e){this.stopRun(!1),this.setConsoleVisible(!0),this.consoleForm.hidden=!0,this.consoleLines.replaceChildren();for(const t of e.lines){const n=this.consoleLine(t.text);if(t.typed!==void 0){const a=document.createElement("span");a.className="typed",a.textContent=t.typed,n.append(a)}}e.pending!==void 0&&this.consoleLine(e.pending).classList.add("pending"),this.consoleLines.scrollTop=this.consoleLines.scrollHeight,this.consoleNotice.textContent=e.notice??"",this.consoleNotice.classList.toggle("error",e.error)}hideConsole(){this.stopRun(!1),this.setConsoleVisible(!1)}setConsoleVisible(e){this.consoleElement.hidden!==!e&&(this.consoleElement.hidden=!e,this.consoleResizer.hidden=!e)}makeConsoleResizer(){const e=document.createElement("div");e.className="console-resizer",e.hidden=!0,e.tabIndex=0,e.setAttribute("role","separator"),e.setAttribute("aria-orientation","horizontal");const t=this.consoleElement,n=r=>Math.round(Math.max($c,Math.min(r,this.element.getBoundingClientRect().height-160))),a=(r,o)=>{t.style.height=r===void 0?"":`${n(r)}px`,o&&QF(Uc,r===void 0?"":String(n(r)))},s=Number(VF(Uc));return s>0&&(t.style.height=`${Math.max($c,s)}px`),e.addEventListener("pointerdown",r=>{if(r.button!==0)return;r.preventDefault(),e.setPointerCapture(r.pointerId);const o=r.clientY,l=t.getBoundingClientRect().height;e.classList.add("dragging");const u=c=>a(l-(c.clientY-o),!1),m=c=>{e.removeEventListener("pointermove",u),e.removeEventListener("pointerup",m),e.removeEventListener("pointercancel",m),e.classList.remove("dragging"),a(l-(c.clientY-o),!0)};e.addEventListener("pointermove",u),e.addEventListener("pointerup",m),e.addEventListener("pointercancel",m)}),e.addEventListener("dblclick",()=>a(void 0,!0)),e.addEventListener("keydown",r=>{const o=r.key==="ArrowUp"?20:r.key==="ArrowDown"?-20:0;o&&(r.preventDefault(),a(t.getBoundingClientRect().height+o,!0))}),e}setRunning(e){var a,s;const t=!!((a=this.run)!=null&&a.paused);this.runButton.disabled=e&&!t,this.stepButton.disabled=e&&!t,this.stopButton.disabled=!e,this.indentButton.disabled=e;const n=p(t?"web_debug_continue":"web_live_run_title");this.runButton.dataset.tip=n,this.runButton.setAttribute("aria-label",t?n:p("web_live_run")),this.element.classList.toggle("running",e&&!t),this.element.classList.toggle("debugging",t),this.code.setReadOnly(e||!((s=this.last)!=null&&s.context.editable))}textForDocument(e,t){const n=this.textFor.get(e);if(n!==void 0)return n;const a=this.shown.get(t.owner);return a?KF(a.text,cm(a.text,a.doc,e,this.labels,{subprograms:t.subprograms},this.form)):oi(e,this.labels,this.form)}refreshEditor(e,t,n){var r;const a=this.textForDocument(e,n);this.textFor.set(e,a),this.shown.set(n.owner,{doc:e,text:a}),this.run&&this.run.doc!==e&&this.stopRun(!1),this.code.setReadOnly(!n.editable||!!this.run),this.code.text!==a?(this.code.setText(a),this.analyze(a,n)):this.parsed||this.analyze(a,n);const s=sg(e,this.labels,this.form);this.spans=a===s.text?s.spans:((r=this.parsed)==null?void 0:r.spans)??[],this.drawMarks(t)}analyze(e,t){this.parsed=jo(e,this.labels,{subprograms:t.subprograms}),this.placeholders=this.parsed.placeholders,this.problems=this.parsed.problems}drawMarks(e){var r;const t=e&&this.spans.find(o=>q1(o.path,e)),n=t?`${t.from}-${t.to}`:void 0,a=((r=this.last)==null?void 0:r.context.editable)===!1&&t?t.from:void 0;this.code.setMarks({placeholders:this.placeholders,problems:this.showProblems?this.problems:[],lines:t&&a===void 0?{from:t.from,to:t.to}:void 0,current:this.debugLine??a},n!==void 0&&n!==this.highlighted&&!this.code.hasFocus);const s=this.showProblems?this.problems[0]:void 0;this.problemLine.textContent=s?p("web_parse_line_fmt",this.code.lineAt(s.from)+1,p(s.key,s.arg??"")):"",this.highlighted=n}codeChanged(){var u,m,c,d;const e=(u=this.last)==null?void 0:u.context,t=(m=this.last)==null?void 0:m.doc;if(!e||!t)return;const n=this.code.text;this.analyze(n,e);const a=Co(t,this.parsed),s=JSON.stringify([a.caption,a.elements])===JSON.stringify([t.caption,t.elements]),r=s?t:a;this.textFor.set(r,n),this.shown.set(e.owner,{doc:r,text:n}),this.showProblems=!1,window.clearTimeout(this.problemTimer),this.problemTimer=window.setTimeout(()=>{var h;this.showProblems=!0,this.drawMarks((h=this.last)==null?void 0:h.highlight)},$F);const o=this.code.lineAt(this.code.caret),l=(c=Aa(this.parsed.spans,o))==null?void 0:c.path;s?(this.spans=this.parsed.spans,this.drawMarks((d=this.last)==null?void 0:d.highlight),l&&this.onSelect(l)):this.onCode(r,l)}caretMoved(){var n,a;const e=Aa(this.spans,this.code.lineAt(this.code.caret)),t=(n=this.last)==null?void 0:n.highlight;e&&((a=this.last)!=null&&a.context.editable)&&!(t&&q1(t,e.path))&&this.onSelect(e.path)}get snippetWords(){const e=this.labels;return{condition:e.condition,selector:e.selector,code:e.code,start:e.start,step:e.step,branch:p("element_verzweigung"),branchElse:p("element_verzweigung"),switchCase:p("element_fallauswahl"),forLoop:p("element_forSchleife"),whileLoop:p("element_whileSchleife"),doLoop:p("element_doUntilSchleife"),output:p("inspector_io_mode_output"),input:p("inspector_io_mode_input")}}}function KF(i,e){const t=i.split(` `),n=e.split(` -`);let a=0;for(;aa?_f(e,a+1,n.length-s):e}const KF=5e3;function eJ(i,e,t,n={}){const a=new bi(i,e),s=new us(t),r=m=>({pose:{...s.pose},trail:s.trail.map(c=>({...c})),leds:[...s.leds],screen:s.screen,tone:m}),o=[r()];let l=0;const u=(m,c)=>({frames:o,stop:m,notice:c,bumps:s.bumps,distance:Math.round(s.trail.slice(1).reduce((d,h,g)=>d+Math.hypot(h.x-s.trail[g].x,h.y-s.trail[g].y),0))});for(let m=0;mh!==0);s.tick(Xl),d&&o.push(r())}return u("limit")}const bn=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),$r=300;class tJ{constructor(){v(this,"element");v(this,"rail");v(this,"heightBar");v(this,"onHide",()=>{});v(this,"onToggleStacked",()=>{});v(this,"stage");v(this,"status");v(this,"picker");v(this,"playButton");v(this,"stackButton");v(this,"view");v(this,"loading");v(this,"worlds",[]);v(this,"worldsKey");v(this,"setup",vi);v(this,"result");v(this,"lastKey");v(this,"pending");v(this,"playTimer");v(this,"input");v(this,"simulation");this.element=document.createElement("aside"),this.element.className="robotpreview",this.element.innerHTML=` +`);let a=0;for(;aa?Tf(e,a+1,n.length-s):e}const eJ=5e3;function tJ(i,e,t,n={}){const a=new bi(i,e),s=new us(t),r=m=>({pose:{...s.pose},trail:s.trail.map(c=>({...c})),leds:[...s.leds],screen:s.screen,tone:m}),o=[r()];let l=0;const u=(m,c)=>({frames:o,stop:m,notice:c,bumps:s.bumps,distance:Math.round(s.trail.slice(1).reduce((d,h,g)=>d+Math.hypot(h.x-s.trail[g].x,h.y-s.trail[g].y),0))});for(let m=0;mh!==0);s.tick(Xl),d&&o.push(r())}return u("limit")}const bn=i=>i.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),$r=300;class nJ{constructor(){v(this,"element");v(this,"rail");v(this,"heightBar");v(this,"onHide",()=>{});v(this,"onToggleStacked",()=>{});v(this,"stage");v(this,"status");v(this,"picker");v(this,"playButton");v(this,"stackButton");v(this,"view");v(this,"loading");v(this,"worlds",[]);v(this,"worldsKey");v(this,"setup",vi);v(this,"result");v(this,"lastKey");v(this,"pending");v(this,"playTimer");v(this,"input");v(this,"simulation");this.element=document.createElement("aside"),this.element.className="robotpreview",this.element.innerHTML=`

🤖 ${bn(p("web_visubot_preview_title"))}

- +

${bn(p("web_visubot_preview_hint"))}

-

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=Q(async()=>{const{Robot3D:e}=await import("./robot3d-AYD_3VhA.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` -`+JSON.stringify(e);r!==this.lastKey&&(this.lastKey=r,window.clearTimeout(this.pending),this.pending=window.setTimeout(()=>this.recompute(),120))}setWorlds(e){this.worlds=e,this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t)),this.picker.append(a)}),this.useWorld(e[0]??vi)}useWorld(e){var t;this.worlds.forEach((n,a)=>{var s;return(s=this.picker.children[a])==null?void 0:s.classList.toggle("active",n===e)}),!(e===this.setup&&this.result)&&(this.setup=e,(t=this.view)==null||t.setWorld(e),this.recompute())}recompute(){var e;if(this.pending=void 0,this.stopPlaying(!1),!!this.input){try{this.result=eJ(this.input.doc,this.input.resolve,this.setup)}catch{this.result=void 0}this.showFrame((e=this.result)==null?void 0:e.frames.at(-1)),this.updateStatus()}}showFrame(e,t=0){if(!this.view)return;const n=e??{pose:{...this.setup.start},trail:[{x:this.setup.start.x,y:this.setup.start.y}],leds:Array(5).fill(void 0),screen:void 0};t>0?this.view.moveTo(n.pose,n.trail,t):this.view.place(n.pose,n.trail),this.view.setLeds(n.leds),this.view.setScreen(n.screen)}play(){var a;const e=(a=this.result)==null?void 0:a.frames;if(!e||e.length<2||!this.view)return;this.stopPlaying(!1);let t=0;this.showFrame(e[0]),this.playButton.innerHTML=te.stop,this.playButton.dataset.tip=p("web_visubot_preview_stop"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_stop"));const n=()=>{if(t++,t>=e.length){this.stopPlaying(!1);return}const s=e[t];s.tone&&Kh(s.tone[0],s.tone[1]),this.showFrame(s,$r-30),this.playTimer=window.setTimeout(n,$r)};this.playTimer=window.setTimeout(n,$r)}stopPlaying(e){var t;this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.playButton.innerHTML=te.play,this.playButton.dataset.tip=p("web_visubot_preview_play"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_play")),e&&this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}updateStatus(){const e=this.result;if(this.playButton.disabled=!e||e.frames.length<2,!e){this.status.textContent="";return}const t=[p("web_visubot_preview_distance_fmt",e.distance)];e.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${e.bumps}`),e.stop==="input"?t.push(p("web_visubot_preview_input")):e.stop==="limit"?t.push(p("web_visubot_preview_limit")):e.stop==="error"&&e.notice&&t.push(`⚠︎ ${Kn(e.notice)}`),this.status.textContent=t.join(" · ")}pause(){window.clearTimeout(this.pending),this.pending=void 0,this.lastKey=void 0,this.stopPlaying(!1)}}const nJ={left:12,top:10},iJ=8,Ms=8e3,pi=16,Yr=12,Nf="#fafafa";function Ff(i){const e=i.caption.trim();return e===""?p("diagram_title_placeholder"):e}function Yc(i){let e=i.trim().replace(/\.visustruct$/i,"");if(e==="")return"";for(e=e.replace(/\s/g,"-").replace(/[/:\\*?"<>|]/g,"-");e.includes("--");)e=e.replace(/--/g,"-");return e=e.replace(/^-+|-+$/g,""),e.length>120&&(e=e.slice(0,120).replace(/^-+|-+$/g,"")),e}function Xc(i,e){return Yc(i.caption)||Yc(e)||"VisuStruct"}function aJ(i,e,t){const n=i.split(/\s+/),a=[];let s="";for(const r of n){const o=s?`${s} ${r}`:r;s&&t(o,pi,"bold")>e?(a.push(s),s=r):s=o}if(s&&a.push(s),a.length>2){let r=a.slice(1).join(" ");for(;r.length>1&&t(r+"…",pi,"bold")>e;)r=r.slice(0,-1);return[a[0],r+"…"]}return a}function Kc(i,e,t,n=320){const a={...i,elements:i.elements.map(Ua)},s=new Md(e,t).layout(a,nJ),r=Math.min(Ms,Math.max(n,s.canvasSize.width)),o=Math.min(Ms,Math.max(n,s.canvasSize.height));if(r<=2||o<=2)return;const l=aJ(Ff(i),r-2*Yr,t),u=Math.ceil(pi*1.2),m=Math.min(56,l.length*u+2),c=m+o,d=new Ed(e,t).render(s,{width:r,height:o},void 0,iJ);d.setAttribute("y",String(m)),d.removeAttribute("class");const h=xe("svg",{xmlns:"http://www.w3.org/2000/svg",width:r,height:c,viewBox:`0 0 ${r} ${c}`});h.append(xe("rect",{x:0,y:0,width:r,height:c,fill:Nf}));const g=xe("text",{x:Yr,y:0,"font-family":Ls,"font-size":pi,"font-weight":600,fill:"black"});return l.forEach((f,x)=>{const b=xe("tspan",{x:Yr,y:x*u+pi});b.textContent=f,g.append(b)}),h.append(g,d),{svg:h,width:r,height:c}}function Jf(i){return` -`+new XMLSerializer().serializeToString(i.svg)}async function ed(i,e){const t=Math.max(1,Math.min(e,Ms/i.width,Ms/i.height)),n=URL.createObjectURL(new Blob([Jf(i)],{type:"image/svg+xml"}));try{const a=new Image;a.src=n,await a.decode();const s=document.createElement("canvas");s.width=Math.round(i.width*t),s.height=Math.round(i.height*t);const r=s.getContext("2d");return r.fillStyle=Nf,r.fillRect(0,0,s.width,s.height),r.drawImage(a,0,0,s.width,s.height),s}finally{URL.revokeObjectURL(n)}}function sJ(i){return new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new Error("PNG konnte nicht erzeugt werden.")),"image/png"))}function rJ(i,e){const a=Math.max(1,i),s=Math.max(1,e),r=f=>{const x=f.width-64,b=f.height-64;return{s:Math.min(x/a,b/s)*.98,cw:x,ch:b}},o={width:595,height:842},l={width:842,height:595},u=r(o),m=r(l),[c,d]=m.s>u.s?[l,m]:[o,u],h=a*d.s,g=s*d.s;return{page:c,draw:{x:32+(d.cw-h)/2,y:32+(d.ch-g)/2,width:h,height:g}}}async function oJ(i){const e=new Blob([i]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(e).arrayBuffer())}function td(i){let e="FEFF";for(let t=0;t`}async function lJ(i,e,t,n,a){const{page:s,draw:r}=rJ(n.width,n.height),o=await oJ(i),l=b=>(Math.round(b*100)/100).toString(),u=`q ${l(r.width)} 0 0 ${l(r.height)} ${l(r.x)} ${l(s.height-r.y-r.height)} cm /Im0 Do Q`,m=new TextEncoder,c=[["<< /Type /Catalog /Pages 2 0 R >>"],["<< /Type /Pages /Kids [3 0 R] /Count 1 >>"],[`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${s.width} ${s.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`],[`<< /Type /XObject /Subtype /Image /Width ${e} /Height ${t} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${o.length} >> +

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` +`+JSON.stringify(e);r!==this.lastKey&&(this.lastKey=r,window.clearTimeout(this.pending),this.pending=window.setTimeout(()=>this.recompute(),120))}setWorlds(e){this.worlds=e,this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t)),this.picker.append(a)}),this.useWorld(e[0]??vi)}useWorld(e){var t;this.worlds.forEach((n,a)=>{var s;return(s=this.picker.children[a])==null?void 0:s.classList.toggle("active",n===e)}),!(e===this.setup&&this.result)&&(this.setup=e,(t=this.view)==null||t.setWorld(e),this.recompute())}recompute(){var e;if(this.pending=void 0,this.stopPlaying(!1),!!this.input){try{this.result=tJ(this.input.doc,this.input.resolve,this.setup)}catch{this.result=void 0}this.showFrame((e=this.result)==null?void 0:e.frames.at(-1)),this.updateStatus()}}showFrame(e,t=0){if(!this.view)return;const n=e??{pose:{...this.setup.start},trail:[{x:this.setup.start.x,y:this.setup.start.y}],leds:Array(5).fill(void 0),screen:void 0};t>0?this.view.moveTo(n.pose,n.trail,t):this.view.place(n.pose,n.trail),this.view.setLeds(n.leds),this.view.setScreen(n.screen)}play(){var a;const e=(a=this.result)==null?void 0:a.frames;if(!e||e.length<2||!this.view)return;this.stopPlaying(!1);let t=0;this.showFrame(e[0]),this.playButton.innerHTML=ne.stop,this.playButton.dataset.tip=p("web_visubot_preview_stop"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_stop"));const n=()=>{if(t++,t>=e.length){this.stopPlaying(!1);return}const s=e[t];s.tone&&eg(s.tone[0],s.tone[1]),this.showFrame(s,$r-30),this.playTimer=window.setTimeout(n,$r)};this.playTimer=window.setTimeout(n,$r)}stopPlaying(e){var t;this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.playButton.innerHTML=ne.play,this.playButton.dataset.tip=p("web_visubot_preview_play"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_play")),e&&this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}updateStatus(){const e=this.result;if(this.playButton.disabled=!e||e.frames.length<2,!e){this.status.textContent="";return}const t=[p("web_visubot_preview_distance_fmt",e.distance)];e.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${e.bumps}`),e.stop==="input"?t.push(p("web_visubot_preview_input")):e.stop==="limit"?t.push(p("web_visubot_preview_limit")):e.stop==="error"&&e.notice&&t.push(`⚠︎ ${Kn(e.notice)}`),this.status.textContent=t.join(" · ")}pause(){window.clearTimeout(this.pending),this.pending=void 0,this.lastKey=void 0,this.stopPlaying(!1)}}const iJ={left:12,top:10},aJ=8,Ms=8e3,pi=16,Yr=12,Ff="#fafafa";function Jf(i){const e=i.caption.trim();return e===""?p("diagram_title_placeholder"):e}function Yc(i){let e=i.trim().replace(/\.visustruct$/i,"");if(e==="")return"";for(e=e.replace(/\s/g,"-").replace(/[/:\\*?"<>|]/g,"-");e.includes("--");)e=e.replace(/--/g,"-");return e=e.replace(/^-+|-+$/g,""),e.length>120&&(e=e.slice(0,120).replace(/^-+|-+$/g,"")),e}function Xc(i,e){return Yc(i.caption)||Yc(e)||"VisuStruct"}function sJ(i,e,t){const n=i.split(/\s+/),a=[];let s="";for(const r of n){const o=s?`${s} ${r}`:r;s&&t(o,pi,"bold")>e?(a.push(s),s=r):s=o}if(s&&a.push(s),a.length>2){let r=a.slice(1).join(" ");for(;r.length>1&&t(r+"…",pi,"bold")>e;)r=r.slice(0,-1);return[a[0],r+"…"]}return a}function Kc(i,e,t,n=320){const a={...i,elements:i.elements.map(Ua)},s=new Md(e,t).layout(a,iJ),r=Math.min(Ms,Math.max(n,s.canvasSize.width)),o=Math.min(Ms,Math.max(n,s.canvasSize.height));if(r<=2||o<=2)return;const l=sJ(Jf(i),r-2*Yr,t),u=Math.ceil(pi*1.2),m=Math.min(56,l.length*u+2),c=m+o,d=new Nd(e,t).render(s,{width:r,height:o},void 0,aJ);d.setAttribute("y",String(m)),d.removeAttribute("class");const h=ye("svg",{xmlns:"http://www.w3.org/2000/svg",width:r,height:c,viewBox:`0 0 ${r} ${c}`});h.append(ye("rect",{x:0,y:0,width:r,height:c,fill:Ff}));const g=ye("text",{x:Yr,y:0,"font-family":Ls,"font-size":pi,"font-weight":600,fill:"black"});return l.forEach((f,x)=>{const b=ye("tspan",{x:Yr,y:x*u+pi});b.textContent=f,g.append(b)}),h.append(g,d),{svg:h,width:r,height:c}}function Rf(i){return` +`+new XMLSerializer().serializeToString(i.svg)}async function ed(i,e){const t=Math.max(1,Math.min(e,Ms/i.width,Ms/i.height)),n=URL.createObjectURL(new Blob([Rf(i)],{type:"image/svg+xml"}));try{const a=new Image;a.src=n,await a.decode();const s=document.createElement("canvas");s.width=Math.round(i.width*t),s.height=Math.round(i.height*t);const r=s.getContext("2d");return r.fillStyle=Ff,r.fillRect(0,0,s.width,s.height),r.drawImage(a,0,0,s.width,s.height),s}finally{URL.revokeObjectURL(n)}}function rJ(i){return new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new Error("PNG konnte nicht erzeugt werden.")),"image/png"))}function oJ(i,e){const a=Math.max(1,i),s=Math.max(1,e),r=f=>{const x=f.width-64,b=f.height-64;return{s:Math.min(x/a,b/s)*.98,cw:x,ch:b}},o={width:595,height:842},l={width:842,height:595},u=r(o),m=r(l),[c,d]=m.s>u.s?[l,m]:[o,u],h=a*d.s,g=s*d.s;return{page:c,draw:{x:32+(d.cw-h)/2,y:32+(d.ch-g)/2,width:h,height:g}}}async function lJ(i){const e=new Blob([i]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(e).arrayBuffer())}function td(i){let e="FEFF";for(let t=0;t`}async function uJ(i,e,t,n,a){const{page:s,draw:r}=oJ(n.width,n.height),o=await lJ(i),l=b=>(Math.round(b*100)/100).toString(),u=`q ${l(r.width)} 0 0 ${l(r.height)} ${l(r.x)} ${l(s.height-r.y-r.height)} cm /Im0 Do Q`,m=new TextEncoder,c=[["<< /Type /Catalog /Pages 2 0 R >>"],["<< /Type /Pages /Kids [3 0 R] /Count 1 >>"],[`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${s.width} ${s.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`],[`<< /Type /XObject /Subtype /Image /Width ${e} /Height ${t} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${o.length} >> stream `,o,` endstream`],[`<< /Length ${u.length} >> @@ -60577,14 +60577,14 @@ endobj startxref ${x} %%EOF -`),new Blob(d,{type:"application/pdf"})}function uJ(i){const{data:e}=i.getContext("2d").getImageData(0,0,i.width,i.height),t=new Uint8Array(i.width*i.height*3);for(let n=0,a=0;nObject.entries(St).map(([i,e])=>{if(i==="getColor")return` def ${i}(self): +`),new Blob(d,{type:"application/pdf"})}function mJ(i){const{data:e}=i.getContext("2d").getImageData(0,0,i.width,i.height),t=new Uint8Array(i.width*i.height*3);for(let n=0,a=0;nObject.entries(St).map(([i,e])=>{if(i==="getColor")return` def ${i}(self): farbe = ${e.python} return FARBNAMEN.get(farbe, farbe) `;const t=typeof e.simulated=="boolean"?`bool(${e.python})`:e.python;return` def ${i}(self): return ${t} `}).join(` -`);function dJ(i){const e=Object.entries(Xa).map(([n,a])=>` ${JSON.stringify(n)}: (${a.join(", ")}), -`).join(""),t=Object.entries(mJ).map(([n,a])=>` ${JSON.stringify(n)}: ${JSON.stringify(i==="de"?a:n)}, +`);function hJ(i){const e=Object.entries(Xa).map(([n,a])=>` ${JSON.stringify(n)}: (${a.join(", ")}), +`).join(""),t=Object.entries(cJ).map(([n,a])=>` ${JSON.stringify(n)}: ${JSON.stringify(i==="de"?a:n)}, `).join("");return`import event, time, cyberpi, mbot2, mbuild FARBEN = { @@ -60647,10 +60647,10 @@ class MBot: cyberpi.display.clear() cyberpi.display.show_label(str(text), 24, "center") -${cJ()} +${dJ()} mbot = MBot() -`}const hJ=i=>` +`}const gJ=i=>` laeuft = False @@ -60672,13 +60672,13 @@ def taste_a(): finally: mbot.stop() laeuft = False -`;function gJ(i,e,t,n="A = Start"){const a={pythonWithoutMatch:!0},s=nd(ss(i,"python",a)),r=e.filter(h=>h!==i&&yt(h.caption)).map(h=>nd(ss(h,"python",a))),o=[s,...r].join(` +`;function pJ(i,e,t,n="A = Start"){const a={pythonWithoutMatch:!0},s=nd(ss(i,"python",a)),r=e.filter(h=>h!==i&&yt(h.caption)).map(h=>nd(ss(h,"python",a))),o=[s,...r].join(` `);if(/\binput\(/u.test(o))return{error:"input"};if(/\bopen\(|\bos\.path\b/u.test(o))return{error:"files"};const l=new Set,u=h=>h.split(` `).filter(g=>(/^import \w+$/u.test(g)&&l.add(g),!/^import \w+$/u.test(g))).join(` `).trim(),m=u(s);if(m===""||/^#[^\n]*$/u.test(m))return{error:"empty"};const c=m.split(` `).map(h=>h.trim()===""?"":" "+h).join(` `);return{source:`# VisuStruct VisuBot -${dJ(t)}${[...l].join(` +${hJ(t)}${[...l].join(` `)} `+r.map(h=>u(h)+` @@ -60686,9 +60686,9 @@ ${dJ(t)}${[...l].join(` `).join("")+`def programm(): ${c} -`+hJ(n)}}function nd(i){return i.split(` -`).map(e=>{const t=/^(\s*)(.*)$/u.exec(e);return t[2].startsWith("#")?e:t[1]+Rf(t[2])}).join(` -`)}const pJ=/^(==|!=|<=|>=|\+=|-=|\*=|\/=|=|<|>|,|:)/u,fJ=/^(and|or|not|in|if|elif|while|return|for|else)\b/u;function Rf(i){let e="",t="",n=0;for(let a=0;a0)){if(h==="+"&&e.trim()!==""&&!/[-+*/%(,=<>]\s*$/u.test(e)){t.push(e),e="";continue}e+=h}}if(n>0&&(e+=i.slice(a)),t.push(e),t.length<2)return t[0];const s=/^\s*/u.exec(t[0])[0],r=/\s*$/u.exec(t[t.length-1])[0],o=t.map(d=>d.trim()),l=d=>d.startsWith('"')||d.startsWith("'")||d.startsWith("str("),u=o.findIndex(l);if(u<0)return i;const m=u>0?[`str(${o.slice(0,u).join(" + ")})`]:[],c=o.slice(u).map(d=>l(d)?d:`str(${d})`);return s+[...m,...c].join(" + ")+r}const c1=i=>i.replace(/&/g,"&").replace(//g,">");function xJ(i,e){const t=document.createElement("dialog");t.className="about mbot-upload",t.setAttribute("aria-labelledby","mbot-upload-title"),t.innerHTML=` +`+gJ(n)}}function nd(i){return i.split(` +`).map(e=>{const t=/^(\s*)(.*)$/u.exec(e);return t[2].startsWith("#")?e:t[1]+Gf(t[2])}).join(` +`)}const fJ=/^(==|!=|<=|>=|\+=|-=|\*=|\/=|=|<|>|,|:)/u,xJ=/^(and|or|not|in|if|elif|while|return|for|else)\b/u;function Gf(i){let e="",t="",n=0;for(let a=0;a0)){if(h==="+"&&e.trim()!==""&&!/[-+*/%(,=<>]\s*$/u.test(e)){t.push(e),e="";continue}e+=h}}if(n>0&&(e+=i.slice(a)),t.push(e),t.length<2)return t[0];const s=/^\s*/u.exec(t[0])[0],r=/\s*$/u.exec(t[t.length-1])[0],o=t.map(d=>d.trim()),l=d=>d.startsWith('"')||d.startsWith("'")||d.startsWith("str("),u=o.findIndex(l);if(u<0)return i;const m=u>0?[`str(${o.slice(0,u).join(" + ")})`]:[],c=o.slice(u).map(d=>l(d)?d:`str(${d})`);return s+[...m,...c].join(" + ")+r}const c1=i=>i.replace(/&/g,"&").replace(//g,">");function bJ(i,e){const t=document.createElement("dialog");t.className="about mbot-upload",t.setAttribute("aria-labelledby","mbot-upload-title"),t.innerHTML=`

⬆ ${c1(p("web_visubot_upload_title"))}

@@ -60702,21 +60702,21 @@ ${c}

- `;const n=t.querySelector(".mbot-upload-status"),a=t.querySelector("progress"),s=t.querySelector("[data-action=upload-start]");let r=!1;const o=()=>!r&&t.close();t.querySelector("[data-action=upload-close]").addEventListener("click",o),t.addEventListener("cancel",u=>r&&u.preventDefault()),t.addEventListener("click",u=>u.target===t&&o()),t.addEventListener("close",()=>t.remove());const l=gJ(i,e,e3(),p("web_visubot_upload_label"));"error"in l&&(n.textContent=`⚠︎ ${p(`web_visubot_upload_error_${l.error}`)}`,s.hidden=!0),s.addEventListener("click",async()=>{if("source"in l){r=!0,s.disabled=!0,a.hidden=!1,a.value=0,n.textContent=p("web_visubot_upload_busy");try{await le.upload(l.source,(u,m)=>a.value=u/m),a.value=1,n.textContent=`✓ ${p("web_visubot_upload_done")}`,n.classList.add("done")}catch(u){const m=u;n.textContent=m.name==="NotFoundError"?"":`⚠︎ ${p("web_visubot_upload_failed")} (${m.message})`,a.hidden=!0,await le.disconnect(m.name==="NotFoundError"?void 0:m.message).catch(()=>{})}finally{r=!1,s.disabled=!1}}}),document.body.append(t),t.showModal()}const ad=[I.verzweigung,I.whileSchleife,I.doUntilSchleife,I.anweisung],sd=()=>[{description:p("web_file_type"),accept:{"application/xml":[".visustruct",".strk"]}}],Xr=i=>p(`element_${I[i]}`),bJ={[I.verzweigung]:"age >= 18",[I.whileSchleife]:"i < 10",[I.doUntilSchleife]:"again == 1",[I.fallauswahl]:"day"},yJ={statement:'int number = 5 | double x = 1.5 | String text = "Your text" | boolean ok = true | const double PI = 3.14',input:'input: int age "Enter age" | input: double price "Enter price" | input: String name "Enter name"',output:'output: number | output: "Your text" | output: "Your age: " + age'};function rd(i){switch(i.type){case I.anweisung:{const e=Qa(i.textLines.join(` -`));return e==="input"?"input:":e==="output"?"output:":void 0}case I.verzweigung:return"if";case I.whileSchleife:case I.doUntilSchleife:return"while";case I.fallauswahl:return"switch";default:return}}function vJ(i){switch(i.type){case I.anweisung:{const e=Qa(i.textLines.join(` -`));return e==="input"?'int age "Enter age"':e==="output"?'"Your age: " + age':p("inspector_placeholder_statement")}case I.verzweigung:case I.whileSchleife:case I.doUntilSchleife:case I.endlosschleife:return p("inspector_placeholder_condition");case I.fallauswahl:return p("inspector_placeholder_selector");case I.aufruf:return p("inspector_placeholder_call");case I.aussprung:return p("inspector_placeholder_break");default:return""}}function se(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}const wJ=760,od=[{value:1,label:"settings_ui_scale_small"},{value:1.22,label:"settings_ui_scale_medium"},{value:1.5,label:"settings_ui_scale_large"},{value:1.82,label:"settings_ui_scale_extra_large"}],Kr=[{value:14,label:"settings_ui_scale_small"},{value:17,label:"settings_ui_scale_medium"},{value:20,label:"settings_ui_scale_large"},{value:24,label:"settings_ui_scale_extra_large"}];function ld(i){document.documentElement.style.setProperty("--code-size",`${i}px`)}const zJ=/Mac|iPhone|iPad/.test(navigator.platform);function Pa(i){const e=i1(),t=e==="pt-PT"?"pt":e==="de"?"de":"en",n=/\/app\/(index\.html)?$/.test(location.pathname)?"../":"https://visustruct.org/",a=Rn()?"visubot":"index";return`${n}${t}/${a}.html${i?`#${i}`:""}`}function Wt(i,e,t,n){const a=n?`${e} (${n})`:e;return``}function yn(i,e=!1){return zJ?`${e?"⇧":""}⌘${i}`:[p("web_key_ctrl"),...e?[p("web_key_shift")]:[],i].join("+")}const L=AJ,ud="visustruct.ui.scale.canvas",md="visustruct.ui.scale.code",cd="visustruct.learn.open",dd="visustruct.files.open",hd="visustruct.files.width",gd="visustruct.learn.width",pd="visustruct.live.open",IJ="visustruct.live.width",fd="visustruct.robotPreview.open",xd="visustruct.codeMain",bd="visustruct.palette.width",kJ="visustruct.editor.width",yd="visustruct.visubot.collapsedGroups",vd="visustruct.robotPreview.stacked",wd="visustruct.robotPreview.width",zd="visustruct.robotPreview.height",Id="visustruct.editor.hidden",eo="visustruct.palette.compact",kd="visustruct.palette.hidden",SJ='',_J=80;class TJ{constructor(e){v(this,"tabs",[]);v(this,"tabIndex",0);v(this,"nextTabSerial",1);v(this,"clipboard");v(this,"zoom",1);v(this,"simulating",!1);v(this,"exportButton");v(this,"closeExport");v(this,"learn");v(this,"shell");v(this,"railButton");v(this,"liveRailButton");v(this,"editorRailButton");v(this,"topbar",se("div",{class:"topbar"}));v(this,"bottombar",se("div",{class:"bottombar"}));v(this,"editorHidden",!1);v(this,"files");v(this,"filesRailButton");v(this,"closeSettings");v(this,"escapeSettings");v(this,"exerciseSaveTimer");v(this,"paletteObserver");v(this,"resizeObserver");v(this,"renderedHostSize",{width:-1,height:-1});v(this,"simPath");v(this,"sim");v(this,"simButton");v(this,"coding",!1);v(this,"code");v(this,"codeButton");v(this,"liveCoding",!1);v(this,"codeTyping");v(this,"live");v(this,"preview",new tJ);v(this,"previewOpen",!1);v(this,"previewOpenedForSim",!1);v(this,"codeMain",!1);v(this,"previewStacked",!1);v(this,"previewResizer");v(this,"measure",y2());v(this,"metrics",v2());v(this,"engine",new Md(this.metrics,this.measure));v(this,"renderer",new Ed(this.metrics,this.measure));v(this,"layout");v(this,"flat",[]);v(this,"canvasHost");v(this,"svg");v(this,"overlay");v(this,"inspector");v(this,"captionInput");v(this,"undoButton");v(this,"redoButton");v(this,"deleteButton");v(this,"statusLine");v(this,"drag");v(this,"downloads",null);v(this,"inViewer","claude"in window);v(this,"visuBot");v(this,"stopLinkListener");v(this,"tabStrip");this.root=e,this.tabs.push(this.makeTab());const t=new URLSearchParams(location.search);t.has("visubot")?br("on"):t.has("visustruct")&&br("off"),Lu(ri()),this.learn=new CD(this.learnHost()),this.shell=document.createElement("div"),this.shell.className="shell",e.replaceWith(this.shell),this.live=new YF(()=>this.setLiveCoding(!1),l=>{this.selected=l,this.render()},(l,u)=>this.commitFromCode(l,u),l=>l?this.redo():this.undo()),this.live.onRobotRun=l=>this.runRobot(l),this.live.onSwap=()=>this.setCodeMain(!this.codeMain),this.live.onReference=()=>{this.learn.showReference(),this.setLearning(!0)},this.files=new QD({open:(l,u,m)=>this.openFromWorkspace(l,u,m),hide:()=>this.setFilesOpen(!1),message:l=>this.showMessage(l),progressLoaded:()=>this.learn.restore(),chooseWorld:l=>this.chooseWorld(l,!1)});const n=se("div",{class:"columns"});n.append(this.filesRail(),this.files.element,this.panelResizer(this.files.element,"files-resizer",hd,p("web_files_resize"),1),this.learnRail(),this.learn.element,this.learnResizer(),this.editorRail(),e,this.panelResizer(e,"editor-resizer",kJ,p("web_editor_resize"),()=>this.codeMain?-1:1,()=>this.live.element),this.liveResizer(),this.live.element,this.liveRail(),this.previewResizer=this.panelResizer(this.preview.element,"preview-resizer",wd,p("web_visubot_preview_resize"),-1),this.preview.element,this.preview.rail),this.setupPreview(),this.shell.append(this.topbar,n,this.bottombar);const a=Ue(cd),s=new URLSearchParams(location.search).has("learn");this.showWorldInURL(),this.setLearning(s||(a===null?window.innerWidth>1100:a==="1"),s),this.setFilesOpen(Ue(dd)==="1");const r=Number(Ue(ud));od.some(l=>l.value===r)&&(this.zoom=r),this.setLiveCoding(Ue(pd)==="1"),this.setEditorHidden(Ue(Id)==="1"),this.buildUI(),this.setCodeMain(Ue(xd)==="1"),this.render(),window.addEventListener("pointermove",l=>this.onPointerMove(l)),window.addEventListener("pointerup",l=>this.onPointerUp(l)),window.addEventListener("pointercancel",()=>this.endDrag()),window.addEventListener("keydown",l=>this.onKeyDown(l)),window.addEventListener("beforeunload",l=>{(this.tabs.some(u=>u.dirty&&!u.exerciseId)||!this.files.ready&&he.hasContent())&&l.preventDefault()}),this.setupFileDrop();const o=window.claude;typeof(o==null?void 0:o.use)=="function"&&o.use("downloads").then(l=>this.downloads=l).catch(()=>{})}get tab(){return this.tabs[this.tabIndex]}get doc(){return this.tab.doc}set doc(e){this.tab.doc=e}get fileName(){return this.tab.fileName??`${on(this.tab)}.visustruct`}get fileHandle(){return this.tab.fileHandle}set fileHandle(e){this.tab.fileHandle=e}get dirty(){return this.tab.dirty}set dirty(e){this.tab.dirty=e}get undoStack(){return this.tab.undoStack}get redoStack(){return this.tab.redoStack}get selected(){return this.tab.selected}set selected(e){this.tab.selected=e}buildUI(){var je,He,ye,nt;this.root.className="app",this.root.innerHTML=` + `;const n=t.querySelector(".mbot-upload-status"),a=t.querySelector("progress"),s=t.querySelector("[data-action=upload-start]");let r=!1;const o=()=>!r&&t.close();t.querySelector("[data-action=upload-close]").addEventListener("click",o),t.addEventListener("cancel",u=>r&&u.preventDefault()),t.addEventListener("click",u=>u.target===t&&o()),t.addEventListener("close",()=>t.remove());const l=pJ(i,e,t3(),p("web_visubot_upload_label"));"error"in l&&(n.textContent=`⚠︎ ${p(`web_visubot_upload_error_${l.error}`)}`,s.hidden=!0),s.addEventListener("click",async()=>{if("source"in l){r=!0,s.disabled=!0,a.hidden=!1,a.value=0,n.textContent=p("web_visubot_upload_busy");try{await le.upload(l.source,(u,m)=>a.value=u/m),a.value=1,n.textContent=`✓ ${p("web_visubot_upload_done")}`,n.classList.add("done")}catch(u){const m=u;n.textContent=m.name==="NotFoundError"?"":`⚠︎ ${p("web_visubot_upload_failed")} (${m.message})`,a.hidden=!0,await le.disconnect(m.name==="NotFoundError"?void 0:m.message).catch(()=>{})}finally{r=!1,s.disabled=!1}}}),document.body.append(t),t.showModal()}const ad=[I.verzweigung,I.whileSchleife,I.doUntilSchleife,I.anweisung],sd=()=>[{description:p("web_file_type"),accept:{"application/xml":[".visustruct",".strk"]}}],Xr=i=>p(`element_${I[i]}`),yJ={[I.verzweigung]:"age >= 18",[I.whileSchleife]:"i < 10",[I.doUntilSchleife]:"again == 1",[I.fallauswahl]:"day"},vJ={statement:'int number = 5 | double x = 1.5 | String text = "Your text" | boolean ok = true | const double PI = 3.14',input:'input: int age "Enter age" | input: double price "Enter price" | input: String name "Enter name"',output:'output: number | output: "Your text" | output: "Your age: " + age'};function rd(i){switch(i.type){case I.anweisung:{const e=Qa(i.textLines.join(` +`));return e==="input"?"input:":e==="output"?"output:":void 0}case I.verzweigung:return"if";case I.whileSchleife:case I.doUntilSchleife:return"while";case I.fallauswahl:return"switch";default:return}}function wJ(i){switch(i.type){case I.anweisung:{const e=Qa(i.textLines.join(` +`));return e==="input"?'int age "Enter age"':e==="output"?'"Your age: " + age':p("inspector_placeholder_statement")}case I.verzweigung:case I.whileSchleife:case I.doUntilSchleife:case I.endlosschleife:return p("inspector_placeholder_condition");case I.fallauswahl:return p("inspector_placeholder_selector");case I.aufruf:return p("inspector_placeholder_call");case I.aussprung:return p("inspector_placeholder_break");default:return""}}function se(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}const zJ=760,od=[{value:1,label:"settings_ui_scale_small"},{value:1.22,label:"settings_ui_scale_medium"},{value:1.5,label:"settings_ui_scale_large"},{value:1.82,label:"settings_ui_scale_extra_large"}],Kr=[{value:14,label:"settings_ui_scale_small"},{value:17,label:"settings_ui_scale_medium"},{value:20,label:"settings_ui_scale_large"},{value:24,label:"settings_ui_scale_extra_large"}];function ld(i){document.documentElement.style.setProperty("--code-size",`${i}px`)}const IJ=/Mac|iPhone|iPad/.test(navigator.platform);function Pa(i){const e=i1(),t=e==="pt-PT"?"pt":e==="de"?"de":"en",n=/\/app\/(index\.html)?$/.test(location.pathname)?"../":"https://visustruct.org/",a=Rn()?"visubot":"index";return`${n}${t}/${a}.html${i?`#${i}`:""}`}function Wt(i,e,t,n){const a=n?`${e} (${n})`:e;return``}function yn(i,e=!1){return IJ?`${e?"⇧":""}⌘${i}`:[p("web_key_ctrl"),...e?[p("web_key_shift")]:[],i].join("+")}const W=PJ,ud="visustruct.ui.scale.canvas",md="visustruct.ui.scale.code",cd="visustruct.learn.open",dd="visustruct.files.open",hd="visustruct.files.width",gd="visustruct.learn.width",pd="visustruct.live.open",kJ="visustruct.live.width",fd="visustruct.robotPreview.open",xd="visustruct.codeMain",bd="visustruct.palette.width",SJ="visustruct.editor.width",yd="visustruct.visubot.collapsedGroups",vd="visustruct.robotPreview.stacked",wd="visustruct.robotPreview.width",zd="visustruct.robotPreview.height",Id="visustruct.editor.hidden",eo="visustruct.palette.compact",kd="visustruct.palette.hidden",_J='',TJ=80;class OJ{constructor(e){v(this,"tabs",[]);v(this,"tabIndex",0);v(this,"nextTabSerial",1);v(this,"clipboard");v(this,"zoom",1);v(this,"simulating",!1);v(this,"exportButton");v(this,"closeExport");v(this,"learn");v(this,"shell");v(this,"railButton");v(this,"liveRailButton");v(this,"editorRailButton");v(this,"topbar",se("div",{class:"topbar"}));v(this,"bottombar",se("div",{class:"bottombar"}));v(this,"editorHidden",!1);v(this,"files");v(this,"filesRailButton");v(this,"closeSettings");v(this,"escapeSettings");v(this,"exerciseSaveTimer");v(this,"paletteObserver");v(this,"resizeObserver");v(this,"renderedHostSize",{width:-1,height:-1});v(this,"simPath");v(this,"sim");v(this,"simButton");v(this,"coding",!1);v(this,"code");v(this,"codeButton");v(this,"liveCoding",!1);v(this,"codeTyping");v(this,"live");v(this,"preview",new nJ);v(this,"previewOpen",!1);v(this,"previewOpenedForSim",!1);v(this,"codeMain",!1);v(this,"previewStacked",!1);v(this,"previewResizer");v(this,"measure",v2());v(this,"metrics",w2());v(this,"engine",new Md(this.metrics,this.measure));v(this,"renderer",new Nd(this.metrics,this.measure));v(this,"layout");v(this,"flat",[]);v(this,"canvasHost");v(this,"svg");v(this,"overlay");v(this,"inspector");v(this,"captionInput");v(this,"undoButton");v(this,"redoButton");v(this,"deleteButton");v(this,"statusLine");v(this,"drag");v(this,"downloads",null);v(this,"inViewer","claude"in window);v(this,"visuBot");v(this,"stopLinkListener");v(this,"tabStrip");this.root=e,this.tabs.push(this.makeTab());const t=new URLSearchParams(location.search);t.has("visubot")?br("on"):t.has("visustruct")&&br("off"),Lu(ri()),this.learn=new BD(this.learnHost()),this.shell=document.createElement("div"),this.shell.className="shell",e.replaceWith(this.shell),this.live=new XF(()=>this.setLiveCoding(!1),l=>{this.selected=l,this.render()},(l,u)=>this.commitFromCode(l,u),l=>l?this.redo():this.undo()),this.live.onRobotRun=l=>this.runRobot(l),this.live.onSwap=()=>this.setCodeMain(!this.codeMain),this.live.onReference=()=>{this.learn.showReference(),this.setLearning(!0)},this.files=new qD({open:(l,u,m)=>this.openFromWorkspace(l,u,m),hide:()=>this.setFilesOpen(!1),message:l=>this.showMessage(l),progressLoaded:()=>this.learn.restore(),chooseWorld:l=>this.chooseWorld(l,!1)});const n=se("div",{class:"columns"});n.append(this.filesRail(),this.files.element,this.panelResizer(this.files.element,"files-resizer",hd,p("web_files_resize"),1),this.learnRail(),this.learn.element,this.learnResizer(),this.editorRail(),e,this.panelResizer(e,"editor-resizer",SJ,p("web_editor_resize"),()=>this.codeMain?-1:1,()=>this.live.element),this.liveResizer(),this.live.element,this.liveRail(),this.previewResizer=this.panelResizer(this.preview.element,"preview-resizer",wd,p("web_visubot_preview_resize"),-1),this.preview.element,this.preview.rail),this.setupPreview(),this.shell.append(this.topbar,n,this.bottombar);const a=Ue(cd),s=new URLSearchParams(location.search).has("learn");this.showWorldInURL(),this.setLearning(s||(a===null?window.innerWidth>1100:a==="1"),s),this.setFilesOpen(Ue(dd)==="1");const r=Number(Ue(ud));od.some(l=>l.value===r)&&(this.zoom=r),this.setLiveCoding(Ue(pd)==="1"),this.setEditorHidden(Ue(Id)==="1"),this.buildUI(),this.setCodeMain(Ue(xd)==="1"),this.render(),window.addEventListener("pointermove",l=>this.onPointerMove(l)),window.addEventListener("pointerup",l=>this.onPointerUp(l)),window.addEventListener("pointercancel",()=>this.endDrag()),window.addEventListener("keydown",l=>this.onKeyDown(l)),window.addEventListener("beforeunload",l=>{(this.tabs.some(u=>u.dirty&&!u.exerciseId)||!this.files.ready&&ge.hasContent())&&l.preventDefault()}),this.setupFileDrop();const o=window.claude;typeof(o==null?void 0:o.use)=="function"&&o.use("downloads").then(l=>this.downloads=l).catch(()=>{})}get tab(){return this.tabs[this.tabIndex]}get doc(){return this.tab.doc}set doc(e){this.tab.doc=e}get fileName(){return this.tab.fileName??`${on(this.tab)}.visustruct`}get fileHandle(){return this.tab.fileHandle}set fileHandle(e){this.tab.fileHandle=e}get dirty(){return this.tab.dirty}set dirty(e){this.tab.dirty=e}get undoStack(){return this.tab.undoStack}get redoStack(){return this.tab.redoStack}get selected(){return this.tab.selected}set selected(e){this.tab.selected=e}buildUI(){var he,Te,xe,nt;this.root.className="app",this.root.innerHTML=`
- ${Rn()?ZD:'VisuStruct'} ${L(p("web_brand_suffix"))} + ${Rn()?MD:'VisuStruct'} ${W(p("web_brand_suffix"))}
- ${Wt("new",p("toolbar_new"),te.newFile)} - ${Wt("open",p("menu_open"),te.open,yn("O"))} - ${Wt("save",p("menu_save"),te.save,yn("S"))} + ${Wt("new",p("toolbar_new"),ne.newFile)} + ${Wt("open",p("menu_open"),ne.open,yn("O"))} + ${Wt("save",p("menu_save"),ne.save,yn("S"))}
- -
- - + + - `,t.querySelector("[data-action=about-done]").addEventListener("click",()=>t.close()),t.addEventListener("click",n=>n.target===t&&t.close()),t.addEventListener("close",()=>t.remove()),document.body.append(t),t.showModal()}setupSettingsMenu(e,t){const n=a=>{t.hidden=!a,e.setAttribute("aria-expanded",String(a))};e.addEventListener("click",()=>n(t.hidden)),this.closeSettings&&document.removeEventListener("pointerdown",this.closeSettings),this.escapeSettings&&document.removeEventListener("keydown",this.escapeSettings),this.closeSettings=a=>{!t.hidden&&!e.parentElement.contains(a.target)&&n(!1)},document.addEventListener("pointerdown",this.closeSettings),this.escapeSettings=a=>{a.key!=="Escape"||t.hidden||(n(!1),e.focus())},document.addEventListener("keydown",this.escapeSettings)}learnRail(){return this.railButton=se("button",{class:"learn-rail"}),this.labelLearnRail(),this.railButton.addEventListener("click",()=>this.setLearning(!0)),this.railButton}liveRail(){return this.liveRailButton=se("button",{class:"learn-rail live-rail"}),this.labelLiveRail(),this.liveRailButton.addEventListener("click",()=>this.setLiveCoding(!0)),this.liveRailButton}labelLiveRail(){this.liveRailButton&&(this.liveRailButton.title=p("web_live_show"),this.liveRailButton.innerHTML=`${kt}</> ${W(p("web_live_title"))}`)}labelLearnRail(){this.railButton&&(this.railButton.title=p("web_learn_show"),this.railButton.innerHTML=`${kt}🎓 ${W(p("web_learn_title"))}`)}learnHost(){return{collapse:()=>this.setLearning(!1),showEditor:()=>{this.editorHidden&&this.setEditorHidden(!1)},showLiveCode:()=>{this.liveCoding||this.setLiveCoding(!0)},showJava:()=>this.openJavaColumn(),showFiles:()=>{this.shell.classList.contains("files-open")||this.setFilesOpen(!0)},openExercise:(e,t)=>{e.code==="java"?this.openJavaColumn():this.setEditorHidden(!1);const n=this.tabs.findIndex(s=>s.exerciseId===e.id);if(n>=0){this.switchTab(n),this.setSimulating(!1);return}const a=this.makeTab();a.doc=t,a.exerciseId=e.id,a.selected=t.elements.length>0?[0]:void 0,this.isPristine(this.tab)?this.tabs[this.tabIndex]=a:this.tabs.push(a),this.tabIndex=this.tabs.indexOf(a),this.setSimulating(!1),this.render()},openDiagram:(e,t)=>{this.setEditorHidden(!1),this.loadXML(o1(e),e.caption.trim()?`${e.caption.trim()}.visustruct`:t)},exerciseDocument:e=>{const t=this.tabs.find(a=>a.exerciseId===e);if(t)return t.doc;const n=this.tab;if(!(n.exerciseId||this.isPristine(n)))return n.exerciseId=e,ge.updateExercise(e,{xml:o1(n.doc)}),n.doc},subprogramsFor:e=>{const t=this.tabs.find(n=>n.exerciseId===e);return n=>this.findSubprogram(n,t)},stopSimulation:()=>this.setSimulating(!1),resetExercise:(e,t)=>{const n=this.tabs.find(a=>a.exerciseId===e);n&&(n.undoStack.push(n.doc),n.doc=t,n.redoStack=[],n.selected=[0],n===this.tab&&this.render())},preview:e=>{const t=Kc(e,this.metrics,this.measure,0);if(!t)return;const n=t.svg.getAttribute("width");return n&&(t.svg.style.maxWidth=`${n}px`),t.svg.removeAttribute("width"),t.svg.removeAttribute("height"),t.svg}}}isPristine(e){return!e.dirty&&!e.fileName&&!e.exerciseId&&e.undoStack.length===0}rememberExercise(){const e=this.tab;e.exerciseId&&(clearTimeout(this.exerciseSaveTimer),this.exerciseSaveTimer=window.setTimeout(()=>{e.exerciseId&&ge.updateExercise(e.exerciseId,{xml:o1(e.doc)})},300))}paletteIcon(e){const t=ye("svg",{viewBox:"0 0 28 20",width:28,height:20,class:"icon"}),n={fill:"none",stroke:"currentColor","stroke-width":1.5};t.append(ye("rect",{x:1,y:1,width:26,height:18,...n}));const a=s=>t.append(ye("path",{d:s,...n}));switch(e){case"verzweigung":a("M1 1 L14 10 L27 1 M14 10 V19");break;case"fallauswahl":a("M1 1 L20 10 L27 1 M1 10 H27 M10 10 V19 M20 10 V19");break;case"forZaehlSchleife":case"whileSchleife":a("M7 7 H27 M7 7 V19");break;case"doUntilSchleife":a("M7 1 V13 H27");break;case"endlosschleife":a("M7 6 H27 M7 6 V14 H27");break;case"aufruf":a("M5 1 V19 M23 1 V19");break;case"aussprung":a("M6 1 L1 10 L6 19");break}return t}render(){const e={...this.doc,elements:this.doc.elements.map(Ua)};this.layout=this.engine.layout(e),this.flat=O2(this.layout.elements),this.selected&&!Nt(this.doc,this.selected)&&(this.selected=void 0);const t=this.zoom,n=this.canvasHost;this.renderedHostSize={width:n.clientWidth,height:n.clientHeight};const a={width:Math.max(320,this.layout.canvasSize.width,Math.floor(n.clientWidth/t)),height:Math.max(240,this.layout.canvasSize.height+60,Math.floor(n.clientHeight/t))};this.renderer.usesSimulationHighlight=this.simulating,this.renderer.fillsSelection=this.liveCoding,this.svg=this.renderer.render(this.layout,a,this.simulating?this.simPath:this.selected),this.svg.setAttribute("width",String(Math.floor(a.width*t))),this.svg.setAttribute("height",String(Math.floor(a.height*t))),this.overlay=ye("g",{class:"drop-overlay"}),this.svg.append(this.overlay),this.canvasHost.replaceChildren(this.svg),document.activeElement!==this.captionInput&&(this.captionInput.value=this.doc.caption),this.undoButton.disabled=this.simulating||this.undoStack.length===0,this.redoButton.disabled=this.simulating||this.redoStack.length===0,this.deleteButton.disabled=this.simulating||!this.selected||!rr(this.doc,this.selected),this.captionInput.readOnly=this.simulating,this.codeButton.disabled=this.simulating,this.exportButton.disabled=this.simulating,this.coding&&this.code.refresh(),this.refreshLive(),this.refreshPreview(),this.renderTabs(),this.renderInspector(),this.updateStatus()}refreshLive(){this.liveCoding&&this.live.refresh(this.doc,this.simulating?this.simPath:this.selected,{owner:this.tab,subprograms:new Set(this.tabs.filter(e=>e!==this.tab).flatMap(e=>{var t;return((t=yt(e.doc.caption))==null?void 0:t.name)??[]})),editable:!this.simulating,resolve:e=>this.findSubprogram(e)})}updateStatus(){this.rememberExercise(),document.title=`${this.dirty?"• ":""}${this.fileName} – VisuStruct Web`,this.statusLine.textContent=`${this.fileName}${this.dirty?` (${p("web_status_modified")})`:""}`}renderInspector(){const e=this.selected,t=e?Nt(this.doc,e):void 0,n=this.inspector;if(!e||!t){n.replaceChildren(se("h2",{},p("web_inspector_title")),se("p",{class:"hint"},p("inspector_no_selection")),se("p",{class:"hint"},p("web_inspector_help_drop")),se("p",{class:"hint"},p("web_inspector_help_files")));return}if(n.replaceChildren(se("h2",{},`${p("web_inspector_title")} · ${Xr(t.type)}`)),t.type===I.anweisung){const a=Qa(t.textLines.join(` `)),s=se("div",{class:"segmented",role:"group","aria-label":p("inspector_io_mode_title")});for(const[r,o]of[["statement",p("inspector_io_mode_statement")],["input",p("inspector_io_mode_input")],["output",p("inspector_io_mode_output")]]){const l=se("button",{"aria-pressed":String(r===a)},o);l.addEventListener("click",()=>{var c,d;const u=((c=Nt(this.doc,e))==null?void 0:c.textLines.join(` -`))??"";if(r===Qa(u))return;const m=h2(r,u);this.commit(Qi(this.doc,e,m.split(` -`))),(d=this.inspector.querySelector("textarea"))==null||d.focus()}),s.append(l)}n.append(s,se("p",{class:"hint mono-hint"},yJ[a]))}if(t.type===I.forSchleife){const a=se("div",{class:"for-fields"}),s=Q0(t.textLines);[[p("inspector_for_init"),p("inspector_for_placeholder_init")],[p("inspector_for_condition"),p("inspector_for_placeholder_condition")],[p("inspector_for_step"),p("inspector_for_placeholder_step")]].forEach(([o,l],u)=>{const m=se("input",{placeholder:l,spellcheck:"false",autocomplete:"off"});m.value=s[u],this.liveEdit(m,c=>{const d=Nt(this.doc,e);if(!d)return;const h=Q0(d.textLines);return h[u]=f2(c),Qi(this.doc,e,h)}),a.append(se("label",{},o,m))}),n.append(a)}else if(t.type!==I.leerElement){const a=bJ[t.type];a&&n.append(se("p",{class:"hint mono-hint"},a));const s=rd(t),r=se("textarea",{rows:"3",spellcheck:"false"}),o=t.textLines.join(` -`);r.value=s?V0(s,o):o,r.placeholder=vJ(t),r.addEventListener("focus",()=>{r.value.trim()==="ø"&&r.select()}),this.liveEdit(r,u=>{const m=rd(Nt(this.doc,e)??t),c=m?p2(m,V0(m,u)):u;return Qi(this.doc,e,c.split(` -`))});const l=se("div",{class:"editor-row"});s&&l.append(se("span",{class:"fixed-prefix"},s)),l.append(r),n.append(l)}this.renderCaseControls(e)}renderCaseControls(e){var l;const t=m2(e,this.doc);if(!t)return;const n=((l=Nt(this.doc,t))==null?void 0:l.cases)??[],a=c2(e,t),s=se("div",{class:"case-controls"});if(a!==void 0&&n[a]){const u=se("input",{placeholder:p("web_case_name_placeholder"),spellcheck:"false",autocomplete:"off"});u.value=n[a].name,this.liveEdit(u,m=>m.trim()===""?void 0:u2(this.doc,t,a,m)),s.append(se("label",{},p("web_case_name"),u))}const r=se("button",{},`+ ${p("inspector_add_case")}`);r.addEventListener("click",()=>{const u=o2(this.doc,t);this.commit(u.doc,u.path)});const o=se("button",{class:"danger-text"},`- ${p("inspector_remove_case")}`);o.disabled=n.length<=2||a===void 0,o.addEventListener("click",()=>{if(a===void 0)return;const u=l2(this.doc,t,a);this.commit(u.doc,u.path)}),s.append(se("div",{class:"group"},r,o)),this.inspector.append(s)}liveEdit(e,t){let n;e.addEventListener("focus",()=>n=this.doc),e.addEventListener("input",()=>{const a=jd(e.value);if(a!==e.value){const r=e.selectionStart;e.value=a,e.setSelectionRange(r,r)}const s=t(a);s&&(this.doc=s,this.dirty=!0,this.renderDiagramOnly())}),e.addEventListener("blur",()=>{n&&n!==this.doc&&this.pushUndo(n),n=void 0,this.renderDiagramOnly()})}renderDiagramOnly(){const e=this.selected,t=this.inspector,n=document.createElement("aside");this.inspector=n,this.render(),this.inspector=t,this.selected=e}setSimulating(e){var t;e!==this.simulating&&(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.endDrag(),this.simulating=e,this.root.classList.toggle("simulating",e),this.simButton.setAttribute("aria-pressed",String(e)),this.simButton.innerHTML=`${e?te.stop:te.play}${L(p(e?"web_simulation_end":"web_simulation_start"))}`,this.simButton.dataset.tip=p(e?"web_simulation_end_title":"web_simulation_start_title"),this.simButton.setAttribute("aria-label",p(e?"web_simulation_end":"web_simulation_start")),e?(this.setCoding(!1),this.setEditorHidden(!1),(t=this.visuBot)==null||t.setWorlds(Sd(this.tab.exerciseId)),this.visuBot&&!this.previewOpen&&(this.setPreviewOpen(!0),this.previewOpenedForSim=!0),this.placeSimulationRobot(),this.sim.begin()):(this.sim.end(),this.placeSimulationRobot(),this.previewOpenedForSim&&this.setPreviewOpen(!1),this.simPath=void 0,!this.selected&&this.doc.elements.length>0&&(this.selected=[0])),this.render())}runRobot(e){return!this.visuBot||!/\bmbot\s*\./u.test(JSON.stringify(this.tabs.map(t=>t.doc)))?!1:(this.simulating?this.sim.reset():this.setSimulating(!0),e?this.sim.step():this.sim.play(),!0)}setCoding(e){e!==this.coding&&(e&&(this.setLiveCoding(!1),this.setEditorHidden(!1)),this.coding=e,this.root.classList.toggle("coding",e),this.codeButton.setAttribute("aria-pressed",String(e)),e?this.code.refresh():this.code.close(),this.renderDiagramOnly())}openJavaColumn(){if(this.live.language!=="java"){const e="[data-action=live-language]",t=this.topbar.querySelector(e)??this.root.querySelector(e);t?(t.value="java",t.dispatchEvent(new Event("change"))):this.live.setTarget("java")}this.liveCoding||this.setLiveCoding(!0)}setCodeMain(e){this.codeMain=e,Ee(xd,e?"1":"0"),e&&!this.liveCoding&&this.setLiveCoding(!0),e&&this.editorHidden&&this.setEditorHidden(!1),this.shell.classList.toggle("code-main",e),this.labelSwap(),this.canvasHost&&this.render()}labelSwap(){const e=p(this.codeMain?"web_swap_to_editor":"web_swap_to_code");for(const t of this.shell.querySelectorAll("[data-action=swap-main]"))t.dataset.tip=e,t.setAttribute("aria-label",e),t.setAttribute("aria-pressed",String(this.codeMain))}setupPreview(){const e=o=>{this.previewOpenedForSim=!1,this.setPreviewOpen(o)};this.preview.onHide=()=>e(!1),this.preview.rail.addEventListener("click",()=>e(!0)),this.preview.onToggleStacked=()=>{this.previewStacked=!this.previewStacked,Ee(vd,this.previewStacked?"1":"0"),this.previewStacked&&!this.liveCoding&&this.setLiveCoding(!0),this.placePreview()},this.previewStacked=Ue(vd)==="1";const t=Ue(fd);this.previewOpen=t===null||t==="1";const n=this.preview.heightBar,a=this.preview.element,s=(o,l)=>{var c;const u=Math.max(160,(((c=a.parentElement)==null?void 0:c.getBoundingClientRect().height)??600)-120),m=o===void 0?void 0:Math.round(Math.max(160,Math.min(o,u)));a.style.height=m===void 0?"":`${m}px`,l&&Ee(zd,m===void 0?"":String(m))},r=Number(Ue(zd));r>0&&(a.style.height=`${r}px`),n.addEventListener("pointerdown",o=>{if(o.button!==0)return;o.preventDefault(),n.setPointerCapture(o.pointerId);const l=o.clientY,u=a.getBoundingClientRect().height;this.shell.classList.add("resizing");const m=d=>s(u-(d.clientY-l),!1),c=d=>{n.removeEventListener("pointermove",m),n.removeEventListener("pointerup",c),n.removeEventListener("pointercancel",c),this.shell.classList.remove("resizing"),s(u-(d.clientY-l),!0)};n.addEventListener("pointermove",m),n.addEventListener("pointerup",c),n.addEventListener("pointercancel",c)}),n.addEventListener("dblclick",()=>s(void 0,!0)),n.addEventListener("keydown",o=>{const l=o.key==="ArrowUp"?20:o.key==="ArrowDown"?-20:0;l&&(o.preventDefault(),s(a.getBoundingClientRect().height+l,!0))}),this.placePreview()}setPreviewOpen(e){this.previewOpen=e,Ee(fd,e?"1":"0"),e||this.preview.pause(),this.placePreview(),this.placeSimulationRobot(),this.canvasHost&&this.render()}placeSimulationRobot(){const e=this.visuBot,t=!!e&&this.simulating&&this.previewOpen;this.preview.hostSimulation(t?e.viewport:void 0),t||e==null||e.restoreViewport()}placePreview(){const e=this.previewStacked&&this.liveCoding;this.preview.setStacked(this.previewStacked),this.shell.classList.toggle("preview",this.previewOpen),this.shell.classList.toggle("preview-stacked",e),e?this.preview.element.parentElement!==this.live.element&&this.live.element.append(this.preview.element):this.preview.element.previousElementSibling!==this.previewResizer&&this.previewResizer.after(this.preview.element)}refreshPreview(){!this.previewOpen||!Rn()||this.preview.update(this.doc,e=>this.findSubprogram(e),Sd(this.tab.exerciseId),this.tab.exerciseId??"",this.tabs.map(e=>e.doc))}setLiveCoding(e){e&&this.coding&&this.setCoding(!1),this.liveCoding=e,this.shell.classList.toggle("live",e),this.placePreview(),e||this.live.hideConsole(),Ee(pd,e?"1":"0"),this.keepAColumnOpen(),this.canvasHost&&this.render()}learnResizer(){return this.panelResizer(this.learn.element,"learn-resizer",gd,p("web_learn_resize"),1)}liveResizer(){return this.panelResizer(this.live.element,"live-resizer",IJ,p("web_live_resize"),-1,()=>this.root)}yieldingPanels(){return[{panel:this.preview.element,key:wd},{panel:this.learn.element,key:gd},{panel:this.files.element,key:hd}].filter(({panel:e})=>e.offsetParent!==null&&e.parentElement===this.live.element.parentElement)}panelResizer(e,t,n,a,s,r){const o=se("div",{class:t,role:"separator","aria-orientation":"vertical",tabindex:"0",title:a}),l=d=>{var x;const h=((x=e.parentElement)==null?void 0:x.getBoundingClientRect().width)??0;if(h===0)return OJ(d);const g=[this.files.element,this.learn.element,this.live.element,this.preview.element].filter(b=>b!==e&&b.offsetParent!==null&&getComputedStyle(b).flexGrow==="0").reduce((b,y)=>b+y.getBoundingClientRect().width,0),f=parseFloat(getComputedStyle(e).minWidth)||200;return Math.round(Math.max(f,Math.min(d,h-g-240)))},u=(d,h)=>{e.style.width=d===void 0?"":`${l(d)}px`,h&&Ee(n,d===void 0?"":String(l(d)))},m=Number(Ue(n));m>0&&u(m,!1);const c=()=>{const d=typeof s=="function"?s():s;return getComputedStyle(this.shell).direction==="rtl"?-d:d};return o.addEventListener("pointerdown",d=>{if(d.button!==0)return;d.preventDefault(),o.setPointerCapture(d.pointerId);const h=d.clientX,g=e.getBoundingClientRect().width,f=c();this.shell.classList.add("resizing");const x=r?this.pushResize(e,n,r(),g):void 0,b=(_,z)=>(x??u)(g+f*(_.clientX-h),z),y=_=>b(_,!1),w=_=>{o.removeEventListener("pointermove",y),o.removeEventListener("pointerup",w),o.removeEventListener("pointercancel",w),this.shell.classList.remove("resizing"),b(_,!0)};o.addEventListener("pointermove",y),o.addEventListener("pointerup",w),o.addEventListener("pointercancel",w)}),o.addEventListener("dblclick",()=>u(void 0,!0)),o.addEventListener("keydown",d=>{const h=d.key==="ArrowRight"?20:d.key==="ArrowLeft"?-20:0;h&&(d.preventDefault(),u(e.getBoundingClientRect().width+c()*h,!0))}),o}pushResize(e,t,n,a){const s=(m,c)=>Math.max(parseFloat(getComputedStyle(m).minWidth)||0,c),r=s(e,200),o=Math.max(0,n.getBoundingClientRect().width-s(n,240)),l=this.yieldingPanels().map(m=>({...m,start:m.panel.getBoundingClientRect().width,min:s(m.panel,200),changed:!1})),u=l.reduce((m,c)=>m+Math.max(0,c.start-c.min),0);return(m,c)=>{const d=Math.round(Math.max(r,Math.min(m,a+o+u)));let h=Math.max(0,d-a-o,r-m);for(const g of l){const f=Math.min(h,Math.max(0,g.start-g.min));h-=f,g.changed||(g.changed=f>0),g.changed&&(g.panel.style.width=`${Math.round(g.start-f)}px`,c&&Ee(g.key,String(Math.round(g.start-f))))}e.style.width=`${d}px`,c&&Ee(t,String(d))}}findSubprogram(e,t=this.tab){const n=to(e);if(n==="")return;const a=this.tabs.find(s=>s!==t&&(to(s.doc.caption)===n||to(on(s))===n));return a==null?void 0:a.doc}scrollToSimPath(){const e=this.simPath;if(!this.simulating||!e)return;const t=this.flat.find(o=>lo(o.idPath,e));if(!t)return;const n=this.canvasHost,a=this.zoom,s={x:t.frame.x*a,y:t.frame.y*a,width:t.frame.width*a,height:t.frame.height*a},r=24;s.yn.scrollTop+n.clientHeight&&(n.scrollTop=s.y-r),(s.xn.scrollLeft+n.clientWidth-r)&&(n.scrollLeft=Math.max(0,s.x-r))}commit(e,t){this.codeTyping=void 0,this.pushUndo(this.doc),this.doc=e,this.dirty=!0,t&&(this.selected=t),this.render()}commitFromCode(e,t){const n=Date.now(),a=this.codeTyping;!a||a.tab!==this.tab||n-a.last>1e3||n-a.start>5e3?(this.pushUndo(this.doc),this.codeTyping={tab:this.tab,start:n,last:n}):a.last=n,this.doc=e,this.dirty=!0,this.selected=or(t??this.selected,e),this.render()}pushUndo(e){for(this.undoStack.push(e);this.undoStack.length>_J;)this.undoStack.shift();this.tab.redoStack=[]}undo(){const e=this.undoStack.pop();e&&(this.codeTyping=void 0,this.redoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=or(this.selected,this.doc),this.render())}redo(){const e=this.redoStack.pop();e&&(this.codeTyping=void 0,this.undoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=or(this.selected,this.doc),this.render())}resetHistory(){this.setSimulating(!1),this.tab.undoStack=[],this.tab.redoStack=[],this.selected=void 0,this.dirty=!1,this.render()}makeTab(){return{doc:i2(),serial:this.nextTabSerial++,dirty:!1,undoStack:[],redoStack:[],selected:[0]}}addTab(e=this.makeTab()){this.setSimulating(!1),this.tabs.push(e),this.tabIndex=this.tabs.length-1,this.render()}switchTab(e){e===this.tabIndex||!this.tabs[e]||(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.setSimulating(!1),this.tabIndex=e,this.render())}async closeTab(e){if(this.tabs.length<=1)return;const t=this.tabs[e];t.dirty&&!t.exerciseId&&(this.switchTab(e),!await this.confirmDiscard())||(this.setSimulating(!1),this.tabs.splice(e,1),(this.tabIndex>e||this.tabIndex>=this.tabs.length)&&(this.tabIndex=Math.max(0,this.tabIndex-1)),this.render())}renderTabs(){const e=this.tabStrip;e.replaceChildren(),this.tabs.forEach((n,a)=>{const s=document.createElement("div");s.className="tab"+(a===this.tabIndex?" active":""),s.setAttribute("role","tab"),s.setAttribute("aria-selected",String(a===this.tabIndex));const r=document.createElement("button");r.className="tab-label",r.textContent=on(n),r.title=n.fileName??on(n),r.addEventListener("click",()=>this.switchTab(a)),s.append(r);const o=n.dirty&&!n.exerciseId;if(this.tabs.length>1){const l=document.createElement("button");l.className="tab-close"+(o?" unsaved":""),l.innerHTML='✕',l.title=p("a11y_close_tab"),l.setAttribute("aria-label",`${p("a11y_close_tab")}: ${on(n)}`),l.addEventListener("click",()=>this.closeTab(a)),s.append(l)}else o&&s.append(Object.assign(document.createElement("span"),{className:"tab-close unsaved",innerHTML:'●'}));o&&r.setAttribute("aria-label",`${on(n)} (${p("web_status_modified")})`),e.append(s)});const t=document.createElement("button");t.className="tab-add",t.textContent="+",t.title=p("a11y_new_diagram_tab"),t.setAttribute("aria-label",p("a11y_new_diagram_tab")),t.addEventListener("click",()=>this.addTab()),e.append(t)}copySelection(){const e=this.selected&&Nt(this.doc,this.selected);return e?(this.clipboard=structuredClone(e),this.showMessage(p("web_copied")),!0):!1}cutSelection(){this.selected&&rr(this.doc,this.selected)&&this.copySelection()&&this.deleteSelection()}paste(){this.clipboard&&this.insertNearSelection(structuredClone(this.clipboard))}deleteSelection(){!this.selected||!rr(this.doc,this.selected)||(this.commit(fi(this.doc,this.selected)),this.selected=void 0,this.render())}insertSensor(e,t=this.selected){if(!t||wn(this.doc,t))return;const n=At(this.doc,t);if(!ad.includes(n.type))return;const a=(n.textLines??[]).join(" ").trim();this.commit(Qi(this.doc,t,[a?`${a} ${e}`:e]),t);const s=this.inspector.querySelector("textarea");s&&(s.focus(),s.setSelectionRange(s.value.length,s.value.length))}insertNearSelection(e){const t=this.selected;if(t&&wn(this.doc,t))return this.commit(Pn(this.doc,t,e),t);if(t){const n=[...t.slice(0,-1),t[t.length-1]+1];return this.commit(io(this.doc,e,t),n)}if(this.doc.elements.length===1&&wn(this.doc,[0]))return this.commit(Pn(this.doc,[0],e),[0]);this.commit(ti(this.doc,[],this.doc.elements.length,e),[this.doc.elements.length])}confirmDiscard(){return this.dirty?new Promise(e=>{const t=document.createElement("div");t.className="confirm",t.innerHTML=`
-

${L(p("close_unsaved_title"))}

-

${L(p("web_discard_message_fmt",this.fileName))}

-
-
`,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:sd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:sd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Xc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=Kc(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Xc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Jf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await ed(t,a);await this.offerDownload(`${n}.png`,await sJ(s));break}case"pdf":{const s=await ed(t,Math.max(a,3)),r=await lJ(uJ(s),s.width,s.height,t,Ff(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:ad.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function Sd(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function _d(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>_d(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&_d(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function Vf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function jJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{Vf()&&i.preventDefault()});const CJ=Z2();Promise.all([Qd(CJ,!1),Vd(B2(),!1)]).then(()=>{Hf(),PJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&Xh();const e=document.getElementById("app");if(Yh()&&!i.has("visustruct")&&!i.has("visubot"))return Q(async()=>{const{ObjectApp:t}=await import("./objectApp-BRLr8JxR.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new TJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&Vf()||jJ(i)});export{Vn as C,BF as J,Px as L,Q as _,yF as a,JF as b,Df as c,WJ as d,br as e,sa as f,SJ as g,GD as h,te as i,RD as j,i1 as k,LJ as m,LF as p,am as r,UD as s,p as t,Po as w}; +`))??"";if(r===Qa(u))return;const m=g2(r,u);this.commit(Qi(this.doc,e,m.split(` +`))),(d=this.inspector.querySelector("textarea"))==null||d.focus()}),s.append(l)}n.append(s,se("p",{class:"hint mono-hint"},vJ[a]))}if(t.type===I.forSchleife){const a=se("div",{class:"for-fields"}),s=Q0(t.textLines);[[p("inspector_for_init"),p("inspector_for_placeholder_init")],[p("inspector_for_condition"),p("inspector_for_placeholder_condition")],[p("inspector_for_step"),p("inspector_for_placeholder_step")]].forEach(([o,l],u)=>{const m=se("input",{placeholder:l,spellcheck:"false",autocomplete:"off"});m.value=s[u],this.liveEdit(m,c=>{const d=Nt(this.doc,e);if(!d)return;const h=Q0(d.textLines);return h[u]=x2(c),Qi(this.doc,e,h)}),a.append(se("label",{},o,m))}),n.append(a)}else if(t.type!==I.leerElement){const a=yJ[t.type];a&&n.append(se("p",{class:"hint mono-hint"},a));const s=rd(t),r=se("textarea",{rows:"3",spellcheck:"false"}),o=t.textLines.join(` +`);r.value=s?V0(s,o):o,r.placeholder=wJ(t),r.addEventListener("focus",()=>{r.value.trim()==="ø"&&r.select()}),this.liveEdit(r,u=>{const m=rd(Nt(this.doc,e)??t),c=m?f2(m,V0(m,u)):u;return Qi(this.doc,e,c.split(` +`))});const l=se("div",{class:"editor-row"});s&&l.append(se("span",{class:"fixed-prefix"},s)),l.append(r),n.append(l)}this.renderCaseControls(e)}renderCaseControls(e){var l;const t=c2(e,this.doc);if(!t)return;const n=((l=Nt(this.doc,t))==null?void 0:l.cases)??[],a=d2(e,t),s=se("div",{class:"case-controls"});if(a!==void 0&&n[a]){const u=se("input",{placeholder:p("web_case_name_placeholder"),spellcheck:"false",autocomplete:"off"});u.value=n[a].name,this.liveEdit(u,m=>m.trim()===""?void 0:m2(this.doc,t,a,m)),s.append(se("label",{},p("web_case_name"),u))}const r=se("button",{},`+ ${p("inspector_add_case")}`);r.addEventListener("click",()=>{const u=l2(this.doc,t);this.commit(u.doc,u.path)});const o=se("button",{class:"danger-text"},`- ${p("inspector_remove_case")}`);o.disabled=n.length<=2||a===void 0,o.addEventListener("click",()=>{if(a===void 0)return;const u=u2(this.doc,t,a);this.commit(u.doc,u.path)}),s.append(se("div",{class:"group"},r,o)),this.inspector.append(s)}liveEdit(e,t){let n;e.addEventListener("focus",()=>n=this.doc),e.addEventListener("input",()=>{const a=jd(e.value);if(a!==e.value){const r=e.selectionStart;e.value=a,e.setSelectionRange(r,r)}const s=t(a);s&&(this.doc=s,this.dirty=!0,this.renderDiagramOnly())}),e.addEventListener("blur",()=>{n&&n!==this.doc&&this.pushUndo(n),n=void 0,this.renderDiagramOnly()})}renderDiagramOnly(){const e=this.selected,t=this.inspector,n=document.createElement("aside");this.inspector=n,this.render(),this.inspector=t,this.selected=e}setSimulating(e){var t;e!==this.simulating&&(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.endDrag(),this.simulating=e,this.root.classList.toggle("simulating",e),this.simButton.setAttribute("aria-pressed",String(e)),this.simButton.innerHTML=`${e?ne.stop:ne.play}${W(p(e?"web_simulation_end":"web_simulation_start"))}`,this.simButton.dataset.tip=p(e?"web_simulation_end_title":"web_simulation_start_title"),this.simButton.setAttribute("aria-label",p(e?"web_simulation_end":"web_simulation_start")),e?(this.setCoding(!1),this.setEditorHidden(!1),(t=this.visuBot)==null||t.setWorlds(Sd(this.tab.exerciseId)),this.visuBot&&!this.previewOpen&&(this.setPreviewOpen(!0),this.previewOpenedForSim=!0),this.placeSimulationRobot(),this.sim.begin()):(this.sim.end(),this.placeSimulationRobot(),this.previewOpenedForSim&&this.setPreviewOpen(!1),this.simPath=void 0,!this.selected&&this.doc.elements.length>0&&(this.selected=[0])),this.render())}runRobot(e){return!this.visuBot||!/\bmbot\s*\./u.test(JSON.stringify(this.tabs.map(t=>t.doc)))?!1:(this.simulating?this.sim.reset():this.setSimulating(!0),e?this.sim.step():this.sim.play(),!0)}setCoding(e){e!==this.coding&&(e&&(this.setLiveCoding(!1),this.setEditorHidden(!1)),this.coding=e,this.root.classList.toggle("coding",e),this.codeButton.setAttribute("aria-pressed",String(e)),e?this.code.refresh():this.code.close(),this.renderDiagramOnly())}openJavaColumn(){if(this.live.language!=="java"){const e="[data-action=live-language]",t=this.topbar.querySelector(e)??this.root.querySelector(e);t?(t.value="java",t.dispatchEvent(new Event("change"))):this.live.setTarget("java")}this.liveCoding||this.setLiveCoding(!0)}setCodeMain(e){this.codeMain=e,Fe(xd,e?"1":"0"),e&&!this.liveCoding&&this.setLiveCoding(!0),e&&this.editorHidden&&this.setEditorHidden(!1),this.shell.classList.toggle("code-main",e),this.labelSwap(),this.canvasHost&&this.render()}labelSwap(){const e=p(this.codeMain?"web_swap_to_editor":"web_swap_to_code");for(const t of this.shell.querySelectorAll("[data-action=swap-main]"))t.dataset.tip=e,t.setAttribute("aria-label",e),t.setAttribute("aria-pressed",String(this.codeMain))}setupPreview(){const e=o=>{this.previewOpenedForSim=!1,this.setPreviewOpen(o)};this.preview.onHide=()=>e(!1),this.preview.rail.addEventListener("click",()=>e(!0)),this.preview.onToggleStacked=()=>{this.previewStacked=!this.previewStacked,Fe(vd,this.previewStacked?"1":"0"),this.previewStacked&&!this.liveCoding&&this.setLiveCoding(!0),this.placePreview()},this.previewStacked=Ue(vd)==="1";const t=Ue(fd);this.previewOpen=t===null||t==="1";const n=this.preview.heightBar,a=this.preview.element,s=(o,l)=>{var c;const u=Math.max(160,(((c=a.parentElement)==null?void 0:c.getBoundingClientRect().height)??600)-120),m=o===void 0?void 0:Math.round(Math.max(160,Math.min(o,u)));a.style.height=m===void 0?"":`${m}px`,l&&Fe(zd,m===void 0?"":String(m))},r=Number(Ue(zd));r>0&&(a.style.height=`${r}px`),n.addEventListener("pointerdown",o=>{if(o.button!==0)return;o.preventDefault(),n.setPointerCapture(o.pointerId);const l=o.clientY,u=a.getBoundingClientRect().height;this.shell.classList.add("resizing");const m=d=>s(u-(d.clientY-l),!1),c=d=>{n.removeEventListener("pointermove",m),n.removeEventListener("pointerup",c),n.removeEventListener("pointercancel",c),this.shell.classList.remove("resizing"),s(u-(d.clientY-l),!0)};n.addEventListener("pointermove",m),n.addEventListener("pointerup",c),n.addEventListener("pointercancel",c)}),n.addEventListener("dblclick",()=>s(void 0,!0)),n.addEventListener("keydown",o=>{const l=o.key==="ArrowUp"?20:o.key==="ArrowDown"?-20:0;l&&(o.preventDefault(),s(a.getBoundingClientRect().height+l,!0))}),this.placePreview()}setPreviewOpen(e){this.previewOpen=e,Fe(fd,e?"1":"0"),e||this.preview.pause(),this.placePreview(),this.placeSimulationRobot(),this.canvasHost&&this.render()}placeSimulationRobot(){const e=this.visuBot,t=!!e&&this.simulating&&this.previewOpen;this.preview.hostSimulation(t?e.viewport:void 0),t||e==null||e.restoreViewport()}placePreview(){const e=this.previewStacked&&this.liveCoding;this.preview.setStacked(this.previewStacked),this.shell.classList.toggle("preview",this.previewOpen),this.shell.classList.toggle("preview-stacked",e),e?this.preview.element.parentElement!==this.live.element&&this.live.element.append(this.preview.element):this.preview.element.previousElementSibling!==this.previewResizer&&this.previewResizer.after(this.preview.element)}refreshPreview(){!this.previewOpen||!Rn()||this.preview.update(this.doc,e=>this.findSubprogram(e),Sd(this.tab.exerciseId),this.tab.exerciseId??"",this.tabs.map(e=>e.doc))}setLiveCoding(e){e&&this.coding&&this.setCoding(!1),this.liveCoding=e,this.shell.classList.toggle("live",e),this.placePreview(),e||this.live.hideConsole(),Fe(pd,e?"1":"0"),this.keepAColumnOpen(),this.canvasHost&&this.render()}learnResizer(){return this.panelResizer(this.learn.element,"learn-resizer",gd,p("web_learn_resize"),1)}liveResizer(){return this.panelResizer(this.live.element,"live-resizer",kJ,p("web_live_resize"),-1,()=>this.root)}yieldingPanels(){return[{panel:this.preview.element,key:wd},{panel:this.learn.element,key:gd},{panel:this.files.element,key:hd}].filter(({panel:e})=>e.offsetParent!==null&&e.parentElement===this.live.element.parentElement)}panelResizer(e,t,n,a,s,r){const o=se("div",{class:t,role:"separator","aria-orientation":"vertical",tabindex:"0",title:a}),l=d=>{var x;const h=((x=e.parentElement)==null?void 0:x.getBoundingClientRect().width)??0;if(h===0)return AJ(d);const g=[this.files.element,this.learn.element,this.live.element,this.preview.element].filter(b=>b!==e&&b.offsetParent!==null&&getComputedStyle(b).flexGrow==="0").reduce((b,y)=>b+y.getBoundingClientRect().width,0),f=parseFloat(getComputedStyle(e).minWidth)||200;return Math.round(Math.max(f,Math.min(d,h-g-240)))},u=(d,h)=>{e.style.width=d===void 0?"":`${l(d)}px`,h&&Fe(n,d===void 0?"":String(l(d)))},m=Number(Ue(n));m>0&&u(m,!1);const c=()=>{const d=typeof s=="function"?s():s;return getComputedStyle(this.shell).direction==="rtl"?-d:d};return o.addEventListener("pointerdown",d=>{if(d.button!==0)return;d.preventDefault(),o.setPointerCapture(d.pointerId);const h=d.clientX,g=e.getBoundingClientRect().width,f=c();this.shell.classList.add("resizing");const x=r?this.pushResize(e,n,r(),g):void 0,b=(S,z)=>(x??u)(g+f*(S.clientX-h),z),y=S=>b(S,!1),w=S=>{o.removeEventListener("pointermove",y),o.removeEventListener("pointerup",w),o.removeEventListener("pointercancel",w),this.shell.classList.remove("resizing"),b(S,!0)};o.addEventListener("pointermove",y),o.addEventListener("pointerup",w),o.addEventListener("pointercancel",w)}),o.addEventListener("dblclick",()=>u(void 0,!0)),o.addEventListener("keydown",d=>{const h=d.key==="ArrowRight"?20:d.key==="ArrowLeft"?-20:0;h&&(d.preventDefault(),u(e.getBoundingClientRect().width+c()*h,!0))}),o}pushResize(e,t,n,a){const s=(m,c)=>Math.max(parseFloat(getComputedStyle(m).minWidth)||0,c),r=s(e,200),o=Math.max(0,n.getBoundingClientRect().width-s(n,240)),l=this.yieldingPanels().map(m=>({...m,start:m.panel.getBoundingClientRect().width,min:s(m.panel,200),changed:!1})),u=l.reduce((m,c)=>m+Math.max(0,c.start-c.min),0);return(m,c)=>{const d=Math.round(Math.max(r,Math.min(m,a+o+u)));let h=Math.max(0,d-a-o,r-m);for(const g of l){const f=Math.min(h,Math.max(0,g.start-g.min));h-=f,g.changed||(g.changed=f>0),g.changed&&(g.panel.style.width=`${Math.round(g.start-f)}px`,c&&Fe(g.key,String(Math.round(g.start-f))))}e.style.width=`${d}px`,c&&Fe(t,String(d))}}findSubprogram(e,t=this.tab){const n=to(e);if(n==="")return;const a=this.tabs.find(s=>s!==t&&(to(s.doc.caption)===n||to(on(s))===n));return a==null?void 0:a.doc}scrollToSimPath(){const e=this.simPath;if(!this.simulating||!e)return;const t=this.flat.find(o=>lo(o.idPath,e));if(!t)return;const n=this.canvasHost,a=this.zoom,s={x:t.frame.x*a,y:t.frame.y*a,width:t.frame.width*a,height:t.frame.height*a},r=24;s.yn.scrollTop+n.clientHeight&&(n.scrollTop=s.y-r),(s.xn.scrollLeft+n.clientWidth-r)&&(n.scrollLeft=Math.max(0,s.x-r))}commit(e,t){this.codeTyping=void 0,this.pushUndo(this.doc),this.doc=e,this.dirty=!0,t&&(this.selected=t),this.render()}commitFromCode(e,t){const n=Date.now(),a=this.codeTyping;!a||a.tab!==this.tab||n-a.last>1e3||n-a.start>5e3?(this.pushUndo(this.doc),this.codeTyping={tab:this.tab,start:n,last:n}):a.last=n,this.doc=e,this.dirty=!0,this.selected=or(t??this.selected,e),this.render()}pushUndo(e){for(this.undoStack.push(e);this.undoStack.length>TJ;)this.undoStack.shift();this.tab.redoStack=[]}undo(){const e=this.undoStack.pop();e&&(this.codeTyping=void 0,this.redoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=or(this.selected,this.doc),this.render())}redo(){const e=this.redoStack.pop();e&&(this.codeTyping=void 0,this.undoStack.push(this.doc),this.doc=e,this.dirty=!0,this.selected=or(this.selected,this.doc),this.render())}resetHistory(){this.setSimulating(!1),this.tab.undoStack=[],this.tab.redoStack=[],this.selected=void 0,this.dirty=!1,this.render()}makeTab(){return{doc:a2(),serial:this.nextTabSerial++,dirty:!1,undoStack:[],redoStack:[],selected:[0]}}addTab(e=this.makeTab()){this.setSimulating(!1),this.tabs.push(e),this.tabIndex=this.tabs.length-1,this.render()}switchTab(e){e===this.tabIndex||!this.tabs[e]||(document.activeElement instanceof HTMLElement&&document.activeElement.blur(),this.setSimulating(!1),this.tabIndex=e,this.render())}async closeTab(e){if(this.tabs.length<=1)return;const t=this.tabs[e];t.dirty&&!t.exerciseId&&(this.switchTab(e),!await this.confirmDiscard())||(this.setSimulating(!1),this.tabs.splice(e,1),(this.tabIndex>e||this.tabIndex>=this.tabs.length)&&(this.tabIndex=Math.max(0,this.tabIndex-1)),this.render())}renderTabs(){const e=this.tabStrip;e.replaceChildren(),this.tabs.forEach((n,a)=>{const s=document.createElement("div");s.className="tab"+(a===this.tabIndex?" active":""),s.setAttribute("role","tab"),s.setAttribute("aria-selected",String(a===this.tabIndex));const r=document.createElement("button");r.className="tab-label",r.textContent=on(n),r.title=n.fileName??on(n),r.addEventListener("click",()=>this.switchTab(a)),s.append(r);const o=n.dirty&&!n.exerciseId;if(this.tabs.length>1){const l=document.createElement("button");l.className="tab-close"+(o?" unsaved":""),l.innerHTML='✕',l.title=p("a11y_close_tab"),l.setAttribute("aria-label",`${p("a11y_close_tab")}: ${on(n)}`),l.addEventListener("click",()=>this.closeTab(a)),s.append(l)}else o&&s.append(Object.assign(document.createElement("span"),{className:"tab-close unsaved",innerHTML:'●'}));o&&r.setAttribute("aria-label",`${on(n)} (${p("web_status_modified")})`),e.append(s)});const t=document.createElement("button");t.className="tab-add",t.textContent="+",t.title=p("a11y_new_diagram_tab"),t.setAttribute("aria-label",p("a11y_new_diagram_tab")),t.addEventListener("click",()=>this.addTab()),e.append(t)}copySelection(){const e=this.selected&&Nt(this.doc,this.selected);return e?(this.clipboard=structuredClone(e),this.showMessage(p("web_copied")),!0):!1}cutSelection(){this.selected&&rr(this.doc,this.selected)&&this.copySelection()&&this.deleteSelection()}paste(){this.clipboard&&this.insertNearSelection(structuredClone(this.clipboard))}deleteSelection(){!this.selected||!rr(this.doc,this.selected)||(this.commit(fi(this.doc,this.selected)),this.selected=void 0,this.render())}insertSensor(e,t=this.selected){if(!t||wn(this.doc,t))return;const n=At(this.doc,t);if(!ad.includes(n.type))return;const a=(n.textLines??[]).join(" ").trim();this.commit(Qi(this.doc,t,[a?`${a} ${e}`:e]),t);const s=this.inspector.querySelector("textarea");s&&(s.focus(),s.setSelectionRange(s.value.length,s.value.length))}insertNearSelection(e){const t=this.selected;if(t&&wn(this.doc,t))return this.commit(Pn(this.doc,t,e),t);if(t){const n=[...t.slice(0,-1),t[t.length-1]+1];return this.commit(io(this.doc,e,t),n)}if(this.doc.elements.length===1&&wn(this.doc,[0]))return this.commit(Pn(this.doc,[0],e),[0]);this.commit(ti(this.doc,[],this.doc.elements.length,e),[this.doc.elements.length])}confirmDiscard(){return this.dirty?new Promise(e=>{const t=document.createElement("div");t.className="confirm",t.innerHTML=`
+

${W(p("close_unsaved_title"))}

+

${W(p("web_discard_message_fmt",this.fileName))}

+
+
`,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:sd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:sd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Xc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=Kc(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Xc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Rf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await ed(t,a);await this.offerDownload(`${n}.png`,await rJ(s));break}case"pdf":{const s=await ed(t,Math.max(a,3)),r=await uJ(mJ(s),s.width,s.height,t,Jf(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:ad.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function Sd(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function _d(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>_d(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&_d(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function Qf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function CJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{Qf()&&i.preventDefault()});const BJ=M2();Promise.all([qd(BJ,!1),Qd(D2(),!1)]).then(()=>{Vf(),jJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&Kh();const e=document.getElementById("app");if(Xh()&&!i.has("visustruct")&&!i.has("visubot"))return q(async()=>{const{ObjectApp:t}=await import("./objectApp-70d7xQix.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new OJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&Qf()||CJ(i)});export{Vn as C,DF as J,jx as L,q as _,vF as a,RF as b,Zf as c,EJ as d,br as e,sa as f,_J as g,HD as h,ne as i,GD as j,i1 as k,WJ as m,WF as p,am as r,$D as s,p as t,Po as w}; diff --git a/website/app/assets/index-Bd1TBhw7.css b/website/app/assets/index-Bd1TBhw7.css deleted file mode 100644 index 79abf134..00000000 --- a/website/app/assets/index-Bd1TBhw7.css +++ /dev/null @@ -1 +0,0 @@ -:root{--bg: #f2f2f7;--panel: #ffffff;--text: #1c1c1e;--muted: #6e6e73;--border: #d1d1d6;--accent: #007aff;--accent-soft: rgba(0, 122, 255, .18);--accent-faint: rgba(0, 122, 255, .08);--accent-glow: rgba(0, 122, 255, .35);color-scheme:light}:root.visubot-theme{--bg: #f1f0f8;--text: #2f3454;--muted: #6a6890;--border: #d6d3e8;--accent: #e07000;--accent-soft: rgba(253, 161, 21, .24);--accent-faint: rgba(253, 161, 21, .1);--accent-glow: rgba(224, 112, 0, .35)}:root.visubot-theme .selection-frame{stroke:#e07000e6}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font:14px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.app{display:grid;grid-template:"tools tools" auto "pal work" 1fr "pal insp" auto / var(--palette-width, 210px) minmax(0,1fr);height:100%;flex:1;min-width:0}.shell{display:flex;flex-direction:column;height:100vh;height:100dvh}.columns{display:flex;flex:1;min-height:0}.columns>.app{min-width:240px}.toolbar{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;padding:8px 12px;background:var(--panel);border-bottom:1px solid var(--border)}button.icon{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:32px;padding:0 7px}button.icon svg{display:block}.tooltip{position:fixed;z-index:1000;max-width:260px;padding:4px 8px;border-radius:6px;background:#1c1c1e;color:#fff;font-size:12px;line-height:1.35;pointer-events:none;box-shadow:0 2px 8px #0003}.tooltip[hidden]{display:none}.diagram-tools{grid-area:tools;display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:5px 8px;background:var(--panel);border-bottom:1px solid var(--border)}.diagram-tools button.icon{min-width:30px;height:30px;padding:0 5px}.diagram-tools .sim-toggle{margin-inline-start:auto;display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools{container-type:inline-size}@container (max-width: 520px){.diagram-tools .sim-toggle span{display:none}}.diagram-tools .sep{width:1px;height:20px;margin-inline:3px;background:var(--border)}.menu-host{position:relative}.export-menu{position:absolute;top:calc(100% + 4px);inset-inline-end:0;z-index:30;display:grid;min-width:180px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.export-menu[hidden]{display:none}.export-menu button{border:none;background:none;text-align:start;padding:7px 10px;border-radius:6px}.export-menu button:hover,.export-menu button:focus-visible{background:var(--accent-soft)}.settings{position:relative;margin-inline-start:auto}.settings>button{display:inline-flex;align-items:center;padding:6px 8px}.settings-menu{position:absolute;top:calc(100% + 6px);inset-inline-end:0;z-index:30;display:grid;width:290px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 80px);overflow-y:auto;padding:4px 0;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.settings-menu[hidden]{display:none}.settings-menu section,.settings-menu footer{display:grid;gap:10px;padding:10px 14px 12px}.settings-menu section+section,.settings-menu footer{border-top:1px solid var(--border)}.settings-menu footer{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-version{font-size:12px;color:var(--muted)}.settings-menu section[hidden]{display:none}.settings-menu h3{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.settings-menu label{display:grid;gap:4px;font-size:13px;font-weight:600;color:var(--muted)}.settings-menu select{width:100%;max-width:none}.settings-menu label.check{grid-template-columns:auto 1fr;align-items:start;gap:8px;font-weight:500;color:var(--text);cursor:pointer}.settings-menu label.check input{margin:2px 0 0}.settings-menu label small,.settings-menu label.check small{display:block;font-weight:400;color:var(--muted)}.settings-menu .about-button{justify-self:start;padding:6px 10px;font-size:13px}dialog.about{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;color:var(--text);background:var(--panel);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 40px #00000040}dialog.about::backdrop{background:#00000059}dialog.about header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border)}dialog.about h2{margin:0;font-size:16px}.about-body{padding:20px 24px 24px;font-size:14px;line-height:1.5}.about-body p{margin:0 0 8px;color:var(--muted)}.about-head{display:flex;gap:16px;padding-bottom:16px;margin-bottom:8px;border-bottom:1px solid var(--border)}.about-head .logo{flex:none;width:40px;height:40px;color:var(--accent)}.about-head h3{margin:0 0 6px;font-size:20px}.about-head h3 small{font-weight:400;color:var(--muted)}.about-body .about-version{font-variant-numeric:tabular-nums}.about-body .about-author{color:var(--text);font-weight:600}.about-link{margin:0 0 2px}.about-body h4{margin:16px 0 6px;font-size:15px}.about-body code{font-weight:600;color:var(--text)}.about-body .about-copy{margin-top:16px}.brand{font-weight:700;font-size:16px;display:flex;align-items:center;gap:8px}.visubot-logo{width:auto;height:30px;margin:-4px 0}.visubot-bot{color:#f08a00;margin-left:-8px}.brand small{font-weight:500;color:var(--muted);font-size:12px}.logo{width:20px;height:20px;border:2px solid currentColor;background:linear-gradient(to bottom right,transparent 47%,currentColor 47% 53%,transparent 53%) left / 50% 60% no-repeat,linear-gradient(to bottom left,transparent 47%,currentColor 47% 53%,transparent 53%) right / 50% 60% no-repeat}.group{display:flex;flex-wrap:wrap;gap:6px}button,select{font:inherit;padding:6px 12px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);cursor:pointer;min-height:34px}select{max-width:180px}button:hover:not(:disabled),select:hover{border-color:var(--accent)}button:disabled{opacity:.4;cursor:default}.palette,.inspector{background:var(--panel);padding:12px;overflow-y:auto}.palette{grid-area:pal;border-inline-end:1px solid var(--border)}.inspector{grid-area:insp;border-top:1px solid var(--border);max-height:34vh}h2{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:0 0 4px}.hint{color:var(--muted);font-size:12px;margin:0 0 10px}.palette ul{list-style:none;margin:0;padding:0;display:grid;gap:6px}.palette-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;cursor:grab;line-height:1.25;user-select:none;-webkit-user-select:none;touch-action:none}.palette-item:hover,.palette-item:focus-visible{border-color:var(--accent);outline:none}.palette-item .icon{flex:none;color:var(--text)}.workspace{grid-area:work;display:flex;flex-direction:column;min-width:0;min-height:0}.caption{font:600 18px system-ui,-apple-system,sans-serif;border:none;border-bottom:1px solid var(--border);padding:10px 16px;background:var(--panel);outline:none}.canvas{flex:1;overflow:auto;scrollbar-gutter:stable;background:#fafafa}.canvas svg{display:block;user-select:none;-webkit-user-select:none}.dragging,.dragging *{cursor:grabbing!important}.drop-line{fill:var(--accent)}.drop-replace{fill:var(--accent-soft);stroke:var(--accent);stroke-width:3}.drag-ghost{position:fixed;left:0;top:0;z-index:10;pointer-events:none;padding:6px 10px;border-radius:8px;background:var(--accent);color:#fff;font-weight:600;box-shadow:0 4px 14px #0003;white-space:nowrap;max-width:260px;overflow:hidden;text-overflow:ellipsis}.inspector label{display:block;font-weight:600;margin:8px 0 4px}.inspector textarea{width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:8px;border:1px solid var(--border);border-radius:8px;resize:vertical}.statusbar{display:flex;flex-wrap:wrap;gap:2px 16px;align-items:baseline;padding:4px 12px;font-size:12px;color:var(--muted);background:var(--panel);border-top:1px solid var(--border)}.status{flex:1 1 auto;min-width:0}.site-links{display:flex;gap:12px;margin-inline-start:auto}.site-links a{color:inherit}.site-links a:hover,.site-links a:focus-visible{color:var(--accent)}a.brand{color:inherit;text-decoration:none}.file-drag .canvas{outline:3px dashed var(--accent);outline-offset:-8px}@media(min-width:821px){.app.compact-palette{--palette-width: 100px}.app.compact-palette .palette{padding:8px 6px}.app.compact-palette .palette h2{font-size:10px;letter-spacing:0;text-align:center}.app.compact-palette .palette .hint{display:none}.app.compact-palette .palette-item{flex-direction:column;gap:3px;padding:6px 2px;font-size:10.5px;line-height:1.15;text-align:center;overflow-wrap:break-word}}@media(max-width:820px){.app{grid-template:"tools" auto "pal" auto "work" 1fr "insp" auto / minmax(0,1fr)}.palette,.inspector{min-width:0}.palette{border-inline-end:none;border-bottom:1px solid var(--border);padding:8px}.palette .hint,.palette h2{display:none}.palette ul{display:flex;overflow-x:auto;overflow-y:hidden}.palette-item{white-space:nowrap}.inspector{max-height:30vh}}.status.message{color:var(--text);font-weight:600}.confirm{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#00000040;padding:16px}.confirm-card{background:var(--panel);border-radius:12px;padding:16px 18px;max-width:360px;box-shadow:0 10px 30px #0003}.confirm-card p{margin:0 0 8px}.confirm-card .group{justify-content:flex-end;margin-top:12px}.files-ask{width:min(360px,100%)}.files-ask input{width:100%;box-sizing:border-box;margin-top:4px}.files-choices{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 10px}.files-choice{display:inline-flex;align-items:center;gap:6px}.files-choice svg{width:16px;height:16px}button.danger{background:#d70015;border-color:#d70015;color:#fff}.simpanel{display:none;grid-area:insp;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto}.app.simulating{grid-template:"tools tools" auto "work insp" 1fr / minmax(0,1fr) 320px}.app.simulating.visubot-mode{grid-template:"tools tools" auto "work insp" 1fr / minmax(0,1fr) min(440px,45%)}.app.simulating .palette,.app.simulating .inspector{display:none}.app.simulating .simpanel{display:block}.app.simulating .caption{cursor:default}button.sim-toggle{font-weight:600}button.sim-toggle{background:var(--accent);border-color:var(--accent);color:#fff}.simpanel section{margin-bottom:14px}.sim-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:6px 0 10px}.sim-option{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px;font-size:13px}.mono,.sim-vars td{font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace}.sim-trace,.sim-output,.sim-vars{background:var(--bg);border-radius:8px;padding:8px 10px;overflow-wrap:anywhere}.sim-output{max-height:220px;overflow-y:auto;white-space:pre-wrap}.sim-vars table{border-collapse:collapse;width:100%}.sim-vars td{padding:2px 0;vertical-align:top}.sim-vars td:first-child{color:var(--muted);padding-inline-end:12px;width:1%;white-space:nowrap}.sim-vars table.sim-grid{width:auto}.sim-vars .sim-grid td,.sim-vars .sim-grid td:first-child{border:1px solid var(--border);color:inherit;font-size:11px;padding:0 4px;text-align:center;width:auto}.sim-vars .sim-grid td.sim-grid-true{font-weight:700}.simpanel .placeholder{color:var(--muted);font:13px system-ui,-apple-system,sans-serif;margin:0}.sim-notice{margin:0 0 14px;padding:8px 10px;border-radius:8px;background:#34c75926;font-weight:600}.sim-edit{width:100%;margin:-6px 0 14px}.sim-notice.error{background:#ff3b3026;color:#b0000f}.sim-input.active{padding:8px 10px;margin-left:-10px;margin-right:-10px;border-radius:10px;background:var(--accent-faint);outline:2px solid var(--accent)}.sim-prompt{margin:4px 0 6px;font-weight:600}.sim-input-row{display:flex;gap:6px}.sim-input-row input{flex:1;min-width:0;font:inherit;padding:6px 10px;border:1px solid var(--border);border-radius:8px}.sim-input-error{color:#b0000f;margin:6px 0 0;font-size:13px}@media(max-width:820px){.app.simulating{grid-template:"tools" auto "work" minmax(200px,1fr) "insp" auto / minmax(0,1fr)}.simpanel{border-inline-start:none;border-top:1px solid var(--border);max-height:48vh}}.codepanel{display:none;grid-area:code;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto;min-height:0}.app.coding{grid-template:"tools tools tools" auto "pal work code" 1fr "pal insp code" auto / var(--palette-width, 210px) minmax(0,1fr) 400px}.app.coding .codepanel{display:block}.app.coding .inspector{max-height:34vh}button[data-action=code][aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.code-head,.runner-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.code-close{min-height:28px;padding:2px 10px}.segmented{display:flex;margin-bottom:8px}.segmented button{flex:1;border-radius:0;min-height:30px;padding:4px 8px}.segmented button:first-child{border-radius:8px 0 0 8px}.segmented button:last-child{border-radius:0 8px 8px 0}.segmented button+button{border-inline-start:none}.segmented button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.segmented[hidden]{display:none}.check{display:flex;gap:8px;align-items:center;font-size:13px;margin-bottom:4px}.code-actions{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}.code-actions [hidden]{display:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.code-view,.runner-out{margin:0;padding:10px 12px;border-radius:10px;background:var(--bg);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow:auto;white-space:pre;-moz-tab-size:4;tab-size:4}.runner{margin:12px 0}.runner-out{background:#0b1220;color:#e5e7eb;min-height:3em;max-height:240px;white-space:pre-wrap}.runner-out.error{outline:2px solid #ff453a}.runner-input{margin-top:8px}.runner-input label{display:block;font-weight:600;margin-bottom:4px}@media(max-width:820px){.app.coding{grid-template:"tools" auto "pal" auto "work" minmax(240px,1fr) "insp" auto "code" auto / minmax(0,1fr)}.codepanel{border-inline-start:none;border-top:1px solid var(--border);max-height:50vh}}.tabs{display:flex;align-items:flex-end;gap:2px;padding:6px 8px 0;background:var(--bg);border-bottom:1px solid var(--border);overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.tab{display:flex;align-items:center;max-width:220px;border:1px solid var(--border);border-bottom:none;border-radius:8px 8px 0 0;background:#ffffff80}.tab.active{background:var(--panel);margin-bottom:-1px;padding-bottom:1px}.tab button{border:none;background:none;min-height:30px;border-radius:8px 8px 0 0}.tab-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:4px 6px 4px 12px}.tab.active .tab-label{font-weight:600}.tab-close{padding:2px 8px;color:var(--muted);font-size:11px}.tab-close:hover{color:var(--text)}.tab-dot,.tab-close.unsaved .tab-x{display:none}.tab-close.unsaved .tab-dot{display:inline;color:var(--text);font-size:10px}.tab-close.unsaved:hover .tab-dot{display:none}button.tab-close.unsaved:hover .tab-x{display:inline}span.tab-close{padding:2px 10px 2px 4px}.tab-add{min-height:28px;padding:2px 10px;margin:0 0 3px 4px;border-radius:8px}.inspector .segmented{margin:6px 0 4px;max-width:420px}.mono-hint{font:11px/1.45 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow-wrap:anywhere}.editor-row{display:flex;gap:8px;align-items:flex-start}.editor-row textarea{flex:1;min-width:0}.fixed-prefix{font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;color:var(--muted);padding-top:9px}.inspector input:not([type]){width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:7px 8px;border:1px solid var(--border);border-radius:8px}.for-fields{display:grid;gap:4px}.for-fields label,.case-controls label{margin:4px 0 0;font-size:12px;color:var(--muted);font-weight:600}.case-controls{margin-top:12px;padding-top:10px;border-top:1px solid var(--border)}.case-controls .group{margin-top:8px}button.danger-text:not(:disabled){color:#d70015}.print-sheet{display:none}.files{display:none;flex:0 1 auto;flex-direction:column;width:260px;min-width:200px;min-height:0;background:var(--panel);border-inline-end:1px solid var(--border)}.shell.files-open .files{display:flex}.shell.files-open .files-rail{display:none}.files-head{display:flex;align-items:center;gap:4px;margin:10px 12px 6px}.files-head h2{flex:1;margin:0;font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.files-head button.icon{min-width:30px;height:30px;padding:0 5px}.files-head [hidden]{display:none}.files-body{flex:1;min-height:0;overflow:auto;padding:0 8px 12px;font-size:14px}.files-where{margin:0 4px 6px;font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-hint,.files-empty{margin:8px 4px;font-size:13px;color:var(--muted)}.start-ask .files-start{margin-bottom:2px}.start-ask .hint{font-size:13px;color:var(--muted)}.start-without{display:block;margin:12px auto 0;border:none;background:none;color:var(--accent);text-decoration:underline}.start-without+.hint{text-align:center}.files-start{display:flex;align-items:center;gap:6px;width:100%;margin:8px 0;justify-content:center}.files-row{display:flex;align-items:center;border-radius:6px}.files-row:hover,.files-row:focus-within{background:var(--accent-soft)}.files-row.current>.files-name{font-weight:600}.files-name{flex:1;min-width:0;display:flex;align-items:center;gap:6px;padding:4px 6px 4px calc(6px + var(--depth) * 16px);border:none;background:none;text-align:start;font:inherit;color:var(--text);cursor:pointer}.files-name:disabled{cursor:default;color:var(--muted)}.files-name svg{flex:none;width:16px;height:16px;color:var(--muted)}.files-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-name small{margin-inline-start:auto;padding:0 6px;border-radius:6px;background:var(--accent);color:#fff;font-size:11px;font-weight:600}.files-row .files-delete{visibility:hidden;min-width:26px;height:26px;padding:0 4px;border:none;background:none;color:var(--muted)}.files-row:hover .files-delete,.files-row:focus-within .files-delete{visibility:visible}.files-error{color:#c62828}.files-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.files-open .files-resizer{display:block}.files-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px}.files-resizer:hover:after,.files-resizer:focus-visible:after{background:var(--accent)}.learn{display:none;flex:0 1 auto;width:400px;min-width:280px;flex-direction:column;background:var(--panel);border-inline-end:1px solid var(--border);min-height:0}.shell.learning .learn{display:flex}.learn-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.learning .learn-resizer{display:block}.learn-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.learn-resizer:hover:after,.learn-resizer:focus-visible:after,.shell.resizing .learn-resizer:after{background:var(--accent)}.learn-resizer:focus-visible{outline:none}.shell.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.learn-head{display:flex;align-items:flex-start;gap:6px;margin:10px 12px 0}.learn-tabs{flex:1;min-width:0}.learn-hide{flex:none;min-height:30px;padding:4px 7px;display:inline-flex;align-items:center;color:var(--muted)}.learn-rail{flex:none;display:flex;flex-direction:column;align-items:center;gap:10px;width:36px;padding:10px 0;border:none;border-radius:0;border-inline-end:1px solid var(--border);background:var(--panel);cursor:pointer}.learn-rail:hover{background:var(--accent-soft)}.learn-rail span{writing-mode:vertical-rl;white-space:nowrap}.shell.learning .learn-rail:not(.live-rail):not(.editor-rail):not(.files-rail):not(.robotpreview-rail):not(.palette-rail){display:none}.live-rail{border-inline-end:none;border-inline-start:1px solid var(--border)}.live-rail svg{transform:scaleX(-1)}.shell.live .live-rail{display:none}.editor-rail{display:none;border-inline-start:1px solid var(--border)}.shell.editor-hidden .editor-rail{display:flex}.shell.editor-hidden .app,.shell.editor-hidden .live-resizer,.shell.editor-hidden:not(.live) .learn-resizer{display:none}.shell.editor-hidden .livecode,.shell.editor-hidden:not(.live) .learn{flex:1 1 0;width:auto!important;min-width:0}.learn-body{overflow-y:auto;scrollbar-gutter:stable;padding:4px 16px 24px;flex:1;min-height:0;line-height:1.5}.learn-body h2.learn-title{display:flex;align-items:center;gap:8px;font-size:20px;text-transform:none;letter-spacing:0;color:var(--text);margin:2px 0 10px}.learn-section{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:18px 0 6px}.learn-list{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-item{display:flex;align-items:center;gap:10px;width:100%;text-align:start;padding:8px 10px}.learn-item.done{border-color:#34c759}.learn-num{flex:none;min-width:28px;height:28px;border-radius:14px;background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-weight:700;font-size:12px;padding:0 6px}.learn-item.done .learn-num{background:#34c7592e;color:#248a3d}.learn-item-text{flex:1;display:grid;min-width:0}.learn-item-text small{color:var(--muted)}.learn-status{flex:none;color:var(--muted);font-size:12px}.learn-item.done .learn-status{color:#248a3d;font-weight:700}.learn-back,.link-button{border:none;background:none;padding:6px 0;min-height:0;color:var(--accent)}.link-button{padding:0;text-align:start}.learn-kicker{margin:4px 0 0;color:var(--muted);font-size:12px}.learn-progress{display:flex;gap:4px;margin-bottom:14px}.learn-progress button{flex:1 1 0;min-width:0;padding:3px 0;font-size:13px;font-variant-numeric:tabular-nums;border-radius:6px}.learn-progress button.past{border-color:var(--accent);color:var(--accent)}.learn-progress button.current{border-color:var(--accent);background:var(--accent);color:#fff;font-weight:600}.learn-progress button.robot-step:not(.current){border-color:#0fa3c6;background:#0fa3c61f}.learn-progress button.robot-step.current{border-color:#0fa3c6;background:#0fa3c6}.learn-step-title{font-size:16px;margin:0 0 6px}.learn-text p,.learn-text ul,.learn-text ol{margin:0 0 10px}.learn-text ul,.learn-text ol{padding-inline-start:22px}.learn-text code,.learn-tests code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;background:var(--bg);border-radius:4px;padding:1px 4px}.learn-text h3{font-size:15px;margin:18px 0 4px}.reference-group{border:1px solid var(--border);border-radius:8px;margin:0 0 8px;padding:0 12px}.reference-group summary{cursor:pointer;font-weight:600;padding:9px 0}.reference-group[open] summary{border-bottom:1px solid var(--border)}.reference-group>h3:first-of-type{margin-top:10px}.lesson-code{background:var(--bg);border-radius:8px;padding:8px 10px;margin:0 0 10px;overflow-x:auto;overflow-y:hidden;font-size:12.5px}.lesson-code code{background:none;padding:0}.lesson-note{border-inline-start:3px solid var(--accent);background:var(--accent-soft);border-radius:6px;padding:8px 10px;margin:0 0 10px}.lesson-note p:last-child{margin-bottom:0}.learn-images{display:flex;gap:8px;flex-wrap:wrap}.learn-images img{width:150px;height:200px;object-fit:cover;border-radius:8px}.learn-file{margin:0 0 14px;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--panel)}.learn-file figcaption{display:flex;align-items:center;gap:6px;padding:6px 10px;background:var(--bg);border-bottom:1px solid var(--border);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;font-weight:600}.learn-file-text{margin:0;padding:8px 10px;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;white-space:pre}.learn-file.written{margin:8px 0;border-color:#15803d}.learn-file.written figcaption{background:#dcfce7}.learn-file-text .ln{display:inline-block;min-width:2ch;margin-inline-end:10px;color:var(--muted);text-align:end;-webkit-user-select:none;user-select:none}.learn-brag{display:grid;grid-template-columns:48px minmax(0,1fr);gap:10px;align-items:start;border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:0 0 14px;background:var(--accent-soft)}.learn-brag img{width:48px;height:48px;border-radius:50%}.learn-brag-title{margin:0 0 4px;font-weight:700}.learn-brag .learn-text p:last-child{margin-bottom:0}.learn-game{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-game-head{display:flex;align-items:center;gap:10px;font-size:1.05em}.learn-game-head img{width:40px;height:40px;border-radius:50%}.learn-game-status{margin:6px 0;color:var(--muted);font-size:.9em}.learn-game-values{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.learn-game-values code{background:var(--accent-soft);border-radius:6px;padding:2px 8px}.learn-game-condition{font-size:1.15em;font-weight:600;padding:10px 12px;border-radius:8px;background:var(--bg, #f2f2f7);margin-bottom:10px;overflow-wrap:anywhere}.learn-game-answers button{flex:1;font-weight:600;padding-block:10px}.learn-game-true:not(:disabled){border-color:#15803d;color:#15803d}.learn-game-false:not(:disabled){border-color:#b91c1c;color:#b91c1c}.learn-game-feedback:empty{display:none}.learn-game-feedback{margin-top:10px;padding:10px 12px;border-radius:8px}.learn-game-feedback.right{background:#dcfce7}.learn-game-feedback.wrong{background:#fee2e2}.learn-game-feedback p{margin:0 0 6px;font-weight:700}.learn-game-steps{margin-bottom:10px;line-height:1.6}.learn-game-result{font-size:1.2em;font-weight:700}.learn-game-question{font-weight:600;margin:10px 0 8px}.learn-game-code{margin:0 0 8px;padding:8px 0;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.5;overflow-x:auto}.learn-game-code .ln{padding:0 10px 0 calc(10px + 2ch);text-indent:-2ch;border-inline-start:3px solid transparent;white-space:pre-wrap;overflow-wrap:anywhere;transition:background .2s}.learn-game-code .ln.hit{background:#fef3c7;border-inline-start-color:#d97706}.learn-bomb{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-weight:700}.learn-bomb-icon{font-size:28px;line-height:1}.learn-bomb.hurry .learn-bomb-icon{animation:learn-bomb-shake .25s infinite alternate}.learn-bomb.boom .learn-bomb-icon{animation:learn-bomb-boom .5s ease-out}@keyframes learn-bomb-shake{0%{transform:rotate(-8deg)}to{transform:rotate(8deg)}}@keyframes learn-bomb-boom{0%{transform:scale(.6)}60%{transform:scale(1.5)}to{transform:scale(1)}}.learn-bomb-time{min-width:7ch;font-variant-numeric:tabular-nums}.learn-bomb-fuse{flex:1;height:8px;border-radius:4px;background:#e5e7eb;overflow:hidden}.learn-bomb-fuse span{display:block;height:100%;background:#f59e0b;transition:width .2s linear}.learn-bomb.hurry .learn-bomb-fuse span{background:#dc2626}.learn-bomb.defused .learn-bomb-fuse span{background:#15803d}.learn-bomb-code .ln{display:block;width:100%;margin:0;border-radius:0;border-block:0;border-inline-end:0;background:none;color:inherit;font:inherit;line-height:inherit;min-height:0;height:auto;padding-block:1px;text-align:start;cursor:pointer}.learn-bomb-code .ln:not(:disabled):hover{background:#fef3c7}.learn-bomb-code .ln:disabled{cursor:default;opacity:1}.learn-bomb-code .ln.right,.learn-bomb-code .ln.right:hover{background:#dcfce7;border-inline-start-color:#15803d}.learn-bomb-code .ln.wrong,.learn-bomb-code .ln.wrong:hover{background:#fee2e2;border-inline-start-color:#b91c1c}.learn-bomb-fix code{white-space:pre-wrap}.learn-game-options{display:grid;gap:6px}.learn-game-options button{text-align:start;padding:8px 12px}.learn-game-options.pictures{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.learn-game-options.pictures button{padding:6px}.learn-game-options button.right{border-color:#15803d;background:#dcfce7;color:inherit;opacity:1}.learn-game-options button.wrong{border-color:#b91c1c;background:#fee2e2;color:inherit;opacity:1}.learn-order-hint{margin:0 0 6px;font-size:13px;opacity:.75}.learn-order button{display:flex;align-items:center;gap:10px}.learn-order-badge{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;border:1.5px solid currentColor;font-size:13px;font-weight:700;opacity:.5}.learn-order button.right .learn-order-badge,.learn-order button:disabled .learn-order-badge:not(:empty){opacity:1}.learn-game-file{margin:0;padding:2px 0;font-size:13px;line-height:1.45;white-space:pre;background:none}.learn-game-explain{margin-bottom:10px}.learn-swing-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;align-items:start}.learn-swing-window{border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-swing-title{padding:3px 8px;font-size:12px;text-align:center;background:#e5e5ea;border-bottom:1px solid #d1d1d6;min-height:1.4em}.learn-swing-body{display:grid;gap:6px;padding:10px}.learn-swing-label{padding:4px 2px;min-height:1.4em}.learn-swing-label.changed,.learn-swing-button.changed{animation:swing-changed 1s ease-out}@keyframes swing-changed{0%{background:#ffd60acc}}.learn-swing-button{padding:6px 10px;background:#fff;color:#1c1c1e;border:1px solid #a1a1aa;border-radius:6px}.learn-swing-button:disabled{opacity:1;cursor:default}.learn-swing-button.pressed{background:var(--accent);border-color:var(--accent);color:#fff;transform:scale(.96)}.learn-swing-event{margin:0;padding:0 10px 8px;font-size:12px;min-height:1.4em}.learn-swing-event.heard{color:#b45309;font-weight:600}.learn-swing-event.nobody{color:#6b7280;font-style:italic}.learn-swing-console{margin:0 10px 10px;padding:6px 8px;border-radius:6px;background:#1c1c1e;color:#f2f2f7;font-size:12px}.learn-swing-console[hidden]{display:none}.learn-swing-clicks{margin:8px 0 0}.learn-swing-try{font-weight:400!important;font-style:italic}.learn-layout-window{width:100%;border:1px solid #a1a1aa;border-radius:6px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-layout-title{height:10px;background:#e5e5ea;border-bottom:1px solid #d1d1d6}.learn-layout-body{height:80px;padding:3px;gap:3px;font-size:12px}.learn-layout-body.grid{display:grid;grid-auto-rows:1fr}.learn-layout-body.flow{display:flex;flex-direction:column;gap:3px}.learn-layout-row{display:flex;justify-content:center;gap:3px}.learn-layout-body.border{display:grid;grid-template:"N N N" auto "W C E" 1fr "S S S" auto / auto 1fr auto}.learn-layout-cell{display:flex;align-items:center;justify-content:center;min-width:22px;padding:2px 6px;border:1px solid #a1a1aa;border-radius:4px;background:#f4f4f5;font-weight:600}.learn-figure{margin:0 0 14px;display:grid;gap:6px;justify-items:start}.learn-preview{width:100%;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#fafafa}.learn-preview>svg{display:block;width:100%;margin:0 auto;height:auto}.learn-figure figcaption{color:var(--muted);font-size:13px}.learn-exercise{border:1px solid var(--accent);border-radius:10px;padding:10px 12px;margin:0 0 14px;display:grid;gap:8px}.learn-exercise h4{margin:0;font-size:15px;display:flex;gap:8px;align-items:center}.learn-badge{font-size:12px;color:#248a3d;background:#34c7592e;border-radius:10px;padding:1px 8px}.learn-exercise .learn-text p:last-child{margin-bottom:0}.learn-result:empty{display:none}.learn-result{border-radius:8px;padding:8px 10px}.learn-result.ok{background:#34c75924}.learn-result.fail{background:#ff950024}.learn-result.info{background:var(--bg)}.learn-result-head{margin:0 0 6px;font-weight:600}.learn-tests{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-test-detail{display:grid;padding-inline-start:16px;font-size:13px}.learn-error{color:#c4291c}.learn-solution summary{cursor:pointer;color:var(--accent)}.learn-solution[open]{display:grid;gap:6px;justify-items:start}.learn-checklist{list-style:none;padding:0;margin:0 0 14px;display:grid;gap:6px}.learn-checklist li{display:flex;gap:8px;align-items:baseline;justify-content:space-between}.learn-checklist label{display:flex;gap:8px;align-items:baseline}.learn-return{width:100%;margin:0 0 12px;border-color:var(--accent);background:var(--accent-soft)}.learn-nav+.learn-return{margin:12px 0 0}.learn-check-link{flex:none;font-size:13px}.learn-quiz fieldset{border:1px solid var(--border);border-radius:10px;padding:8px 12px 10px;margin:0 0 10px;display:grid;gap:6px}.learn-quiz legend{font-weight:600;padding:0 4px}.learn-option{text-align:start}.learn-option.right{border-color:#34c759;background:#34c75924}.learn-option.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-match{display:grid;gap:6px}.learn-match-left{display:grid;grid-template-columns:8.5em minmax(0,1fr);align-items:center;gap:8px}.learn-match-select{min-width:0;width:100%;max-width:none}.learn-match-select.right{border-color:#34c759;background:#34c75924}.learn-match-select.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-explanation{margin:0;color:var(--muted);font-size:13px}.learn-score{font-weight:600}.learn-nav{display:flex;justify-content:space-between;gap:8px;margin-top:18px}@media(max-width:1100px){.learn{width:340px}}@media(max-width:900px){.learn{width:300px}}.livecode{display:none;flex:0 1 auto;width:420px;min-width:200px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0}.shell.live .livecode{display:flex}.livecode-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px}.livecode-head h2{margin:0;font-size:16px}.livecode-lang{margin-inline-start:auto;padding:2px 8px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:12px;font-weight:600}.livecode .learn-hide svg{transform:scaleX(-1)}.livecode .hint{margin:0}.livecode-view{flex:1;min-height:0;padding:10px 0;font-size:var(--code-size, 14px)}.livecode-view .ln{padding:0 12px;min-height:1.5em;border-inline-start:3px solid transparent}.livecode-view.selectable .ln{cursor:pointer}.livecode-view .ln.sel{background:var(--accent-soft);border-inline-start-color:var(--accent)}.livecode-view .ph{color:var(--muted);font-style:italic}.livecode-editor{flex:1;min-height:0;padding:0;font-size:var(--code-size, 14px);white-space:normal;overflow:hidden;--syn-keyword: #7f0055;--syn-string: #2a00ff;--syn-number: #986801;--syn-comment: #3f7f5f}.livecode-editor[hidden],.livecode-view[hidden],.livecode-problem[hidden]{display:none}.livecode-editor .cm-editor{height:100%;background:transparent}.livecode-editor .cm-editor.cm-focused{outline:2px solid var(--accent-soft);outline-offset:-2px;border-radius:10px}.livecode-editor .cm-scroller{font:inherit;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.5}.livecode-editor .cm-gutters{background:transparent;border-inline-end:1px solid var(--border);color:var(--muted)}.livecode-editor .cm-lineNumbers .cm-gutterElement{padding:0 8px 0 10px;min-width:2ch}.livecode-editor .cm-activeLineGutter{background:transparent;color:var(--text)}.livecode-editor .cm-content{padding:10px 0;caret-color:var(--text)}.livecode-editor .cm-line{padding:0 12px;border-inline-start:3px solid transparent}.livecode-editor .cm-scopeLayer .cm-scope{border:1px solid color-mix(in srgb,var(--scope) 28%,transparent);border-left:3px solid var(--scope);border-radius:8px;background:color-mix(in srgb,var(--scope) 9%,#fff)}.livecode-editor .cm-scopeLayer .cm-scope-class{--scope: #34c47c}.livecode-editor .cm-scopeLayer .cm-scope-method{--scope: #f2b100}.livecode-editor .cm-scopeLayer .cm-scope-loop{--scope: #ec5fa6}.livecode-editor .cm-scopeLayer .cm-scope-if{--scope: #3b9cf0}.livecode-editor .cm-scopeLayer .cm-scope-try{--scope: #9a7cf0}:root.no-code-scopes .livecode-editor .cm-scopeLayer .cm-scope:not(.cm-scope-sel){display:none}.livecode-editor .cm-scopeLayer .cm-scope-sel{background:transparent;border:2px solid var(--accent);box-shadow:0 0 0 3px var(--accent-faint)}.livecode-editor .cm-line.cm-debug-line{background:#ffd60a59;border-inline-start-color:#e0a800}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement,.livecode-editor .cm-lineNumbers .cm-gutterElement{cursor:pointer}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement{display:flex;align-items:center;justify-content:center;width:14px;padding-inline-start:4px}.livecode-editor .cm-breakpoint{display:inline-block;width:10px;height:10px;border-radius:50%;background:#d33}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement:not(:has(.cm-breakpoint)):hover:before{content:"";width:10px;height:10px;border-radius:50%;background:#dd33334d}.livecode-debug{flex:none;max-height:30%;overflow-y:auto}.livecode-debug[hidden]{display:none}.livecode-debug h2{margin:0 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.livecode-vars tr.changed td{animation:var-changed 1.6s ease-out;font-weight:700}@keyframes var-changed{0%{background:#ffd60ab3}to{background:transparent}}.livecode-editor .cm-ph,.livecode-editor .cm-ph *{color:var(--muted)!important;font-style:italic;font-weight:400!important}.livecode-editor .cm-err{text-decoration:underline wavy #d33;text-decoration-skip-ink:none;text-underline-offset:3px}.livecode-editor .cm-selectionBackground,.livecode-editor .cm-focused .cm-selectionBackground{background:color-mix(in srgb,var(--accent) 25%,transparent)!important}.livecode-editor .cm-matchingBracket{background:color-mix(in srgb,var(--accent) 20%,transparent);outline:1px solid color-mix(in srgb,var(--accent) 50%,transparent)}.cm-tooltip.cm-tooltip-autocomplete{border:1px solid var(--border);border-radius:8px;background:var(--panel);box-shadow:0 4px 16px #0000001f;overflow:hidden}.cm-tooltip.cm-tooltip-autocomplete>ul{font:14px/1.4 ui-monospace,SF Mono,Menlo,Consolas,monospace;max-height:16em}.cm-tooltip.cm-tooltip-autocomplete>ul>li{padding:4px 10px}.cm-tooltip.cm-tooltip-autocomplete>ul>li[aria-selected]{background:var(--accent);color:#fff}.cm-tooltip-autocomplete .cm-completionDetail{margin-inline-start:12px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:normal;color:var(--muted)}.cm-tooltip-autocomplete li[aria-selected] .cm-completionDetail{color:#ffffffd9}.livecode-run{padding:3px 10px;font-size:13px;margin-inline-start:6px}.console{display:flex;flex:none;flex-direction:column;gap:6px;height:180px;min-height:80px;padding:6px 10px 8px;background:var(--bg);border:1px solid var(--border);border-radius:8px}.console[hidden],.console-resizer[hidden]{display:none}.console-head{display:flex;align-items:center;gap:8px}.console-head h2{margin:0;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.console-hide{margin-inline-start:auto;padding:0 8px;font-size:14px}.console-resizer{flex:none;height:10px;margin-block:-5px;cursor:row-resize;touch-action:none;position:relative}.console-resizer:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px}.console-resizer:hover:after,.console-resizer:focus-visible:after,.console-resizer.dragging:after{background:var(--accent)}.console-resizer:focus-visible{outline:none}.livecode-console-lines{flex:1;min-height:0;overflow:auto;font-size:var(--code-size, 14px);white-space:pre-wrap}.livecode-console-lines .typed{color:var(--accent)}.livecode-console-lines .pending:after{content:"▌";color:var(--accent);animation:blink 1s steps(1) infinite}@keyframes blink{50%{opacity:0}}.livecode-console-input{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.livecode-console-input[hidden]{display:none}.livecode-console-input label{display:flex;flex:1;align-items:center;gap:6px;min-width:0;font-size:var(--code-size, 14px)}.livecode-console-input input{flex:1;min-width:60px;padding:4px 8px;font:inherit}.livecode-console-error,.livecode-console-notice{margin:0;font-size:13px;color:var(--muted)}.livecode-console-error{flex-basis:100%;color:#c62828}.livecode-console-notice.error{color:#c62828}.livecode-problem{margin:0;min-height:1.4em;font-size:13px;color:#c62828}.live-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.live .live-resizer{display:block}.live-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.live-resizer:hover:after,.live-resizer:focus-visible:after,.shell.resizing .live-resizer:after{background:var(--accent)}.live-resizer:focus-visible{outline:none}@media(max-width:1100px){.livecode{width:340px}}@media(max-width:700px){.shell.learning .learn-resizer,.shell.live .live-resizer,.shell.files-open .files-resizer{display:none}.shell .files{width:auto!important;max-height:40vh;border-inline-end:none;border-bottom:1px solid var(--border)}.shell .learn,.shell .livecode,.columns>.app{width:auto!important;min-width:0}.livecode{height:40vh;height:40dvh;border-inline-start:none;border-top:1px solid var(--border)}.learn-rail{flex-direction:row;justify-content:center;width:auto;padding:4px 0;border-inline-end:none;border-bottom:1px solid var(--border)}.learn-rail span{writing-mode:horizontal-tb}.live-rail{border-inline-start:none;border-bottom:none;border-top:1px solid var(--border)}.columns{flex-direction:column}.editor-rail{border-inline-start:none;border-bottom:1px solid var(--border)}.learn{width:auto;height:45vh;height:45dvh;border-inline-end:none;border-bottom:1px solid var(--border)}.columns>.app,.shell.editor-hidden .livecode{flex:1;min-height:0;height:auto}}@media print{@page{margin:12mm}body>*:not(.print-sheet){display:none!important}body{background:#fff!important}.print-sheet{display:block}.print-sheet svg{display:block;width:100%;height:auto;max-height:100vh}}.learn .term{text-decoration:underline dotted var(--accent);text-decoration-thickness:2px;text-underline-offset:3px;cursor:help;border-radius:3px}.learn .term:focus-visible,.learn .term[aria-expanded=true]{outline:none;background:var(--accent-soft)}.term-tip{position:fixed;z-index:1000;max-width:min(300px,calc(100vw - 16px));padding:8px 10px;background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px #0000002e;font-size:14px;line-height:1.4}.term-tip[hidden]{display:none}.learn .ui-pointer{color:var(--accent);font-weight:600;border-bottom:2px solid var(--accent-soft);cursor:pointer;border-radius:3px}.learn .ui-pointer:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.ui-spot{outline:3px solid var(--accent)!important;outline-offset:-3px;box-shadow:inset 0 0 0 9999px var(--accent-faint);animation:ui-spot-pulse 1.2s ease-in-out infinite}@keyframes ui-spot-pulse{50%{outline-color:var(--accent-glow)}}@media(prefers-reduced-motion:reduce){.ui-spot{animation:none}}.learn-graphic{display:block;width:100%;max-width:440px;height:auto;margin:0 auto;border-radius:8px;border:1px solid var(--border)}.lesson-table{overflow-x:auto;margin:8px 0}.lesson-table table{border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.lesson-table th,.lesson-table td{border:1px solid var(--border);padding:3px 8px;text-align:start;white-space:nowrap}.lesson-table th{background:var(--bg)}.learn-hints .lesson-note{margin-top:8px}.learn-teacher{margin-top:24px;border-top:1px solid var(--border);padding-top:12px}.learn-teacher summary{cursor:pointer;color:var(--muted)}.learn-teacher input{flex:1;min-width:0}.shell.editor-hidden:not(.live):not(.learning) .files{flex:1 1 0;width:auto!important}.livecode-swing{height:380px}.livecode-swing[hidden]{display:none}.livecode-swing-display{position:relative;flex:1;min-height:0;overflow:hidden;border-radius:6px;background:#e9ecf0}.learn-caesar-stage{display:flex;flex-direction:column;align-items:center;gap:8px}.learn-caesar-disc{width:min(100%,320px);touch-action:none;user-select:none;-webkit-user-select:none}.learn-caesar-disc text{font:600 19px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.learn-caesar-disc .outer-disc{fill:#f3e6c8;stroke:#8a6d3b;stroke-width:3}.learn-caesar-disc .outer-letters text{fill:#3d2f14;cursor:pointer}.learn-caesar-disc .inner{cursor:grab;transition:transform .25s ease}.learn-caesar-disc .inner.dragging{cursor:grabbing;transition:none}.learn-caesar-disc .inner-disc{fill:#6b4f2a;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .inner-letters text{fill:#fff8e8}.learn-caesar-disc .tick{stroke:#8a6d3b;stroke-width:1;opacity:.6}.learn-caesar-disc .hub{fill:#f3e6c8;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .window{fill:var(--accent-soft);stroke:var(--accent);stroke-width:2.5}.learn-caesar-disc .marked text{fill:var(--accent);font-size:23px}.learn-caesar-disc .inner-letters .marked text{fill:#ffd54a}.learn-caesar-disc .key{font-size:40px;font-weight:700;fill:#3d2f14}.learn-caesar-disc .key-label{font-size:15px;fill:#6e5a33}.learn-caesar-controls,.learn-caesar-mode{display:flex;justify-content:center;gap:8px}.learn-caesar-controls button{min-width:56px;font-size:1.05em}.learn-caesar-mode{margin:10px 0 6px}.learn-caesar-mode button.active{background:var(--accent);border-color:var(--accent);color:#fff}.learn-caesar-fields{display:grid;gap:8px}.learn-caesar-fields label,.learn-caesar-fields>div{display:grid;gap:3px;color:var(--muted);font-size:.9em}.learn-caesar-fields input,.learn-caesar-output{font:600 1.15em ui-monospace,Menlo,Consolas,monospace;letter-spacing:.08em;padding:6px 8px;border:1px solid var(--border);border-radius:8px;color:var(--text);background:var(--panel);overflow-wrap:anywhere}.learn-caesar-output{background:var(--bg)}.learn-rescue-path{display:flex;align-items:center;gap:6px;margin:8px 0 2px}.learn-rescue-ludwig{width:32px;height:32px;border-radius:50%;flex:none}.learn-rescue-dot{flex:1;height:6px;max-width:48px;border-radius:3px;background:var(--border);transition:background .3s}.learn-rescue-dot.done{background:#15803d}.learn-rescue-tower{position:relative;font-size:34px;line-height:1;margin-inline-start:auto}.learn-rescue-zora,.learn-rescue-fox{position:absolute;font-size:15px}.learn-rescue-zora{top:-4px;left:50%;transform:translate(-50%)}.learn-rescue-fox{bottom:-2px;right:-12px;transition:transform .8s,opacity .8s}.learn-rescue.freed .learn-rescue-fox{transform:translate(60px);opacity:0}.learn-rescue.freed .learn-rescue-zora{display:none}.learn-rescue-free{font-size:24px;line-height:1;animation:learn-rescue-jump .6s ease-out 3}@keyframes learn-rescue-jump{50%{transform:translateY(-12px)}}.learn-rescue-answer{display:flex;gap:8px;align-items:center}.learn-rescue-number{width:6ch;font-size:1.1em;padding:6px 8px;text-align:center}.learn-rescue-label{margin:14px 0 4px;color:var(--muted);font-size:.9em}.learn-rescue-alphabet{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:12px}.learn-rescue-letter{display:inline-flex;flex-direction:column;align-items:center;min-width:22px;padding:2px 0;border-radius:4px;background:var(--bg)}.learn-rescue-letter small{font-size:10px;color:var(--muted)}.learn-rescue-letter.hit{background:#fde68a;outline:2px solid #d97706}.learn-rescue-charat{font-weight:600}.learn-rescue-moved{font-weight:400!important}.learn-rescue-word{font:inherit;padding:1px 4px;border:1px solid var(--accent);border-radius:4px}.learn-rescue-gate{padding:8px 0;margin-bottom:8px}.learn-cw{--cw-cell: 30px;display:flex;flex-wrap:wrap;gap:12px 20px;margin-bottom:10px}.learn-cw-grid{display:grid;gap:2px}.learn-cw-cell{position:relative;width:var(--cw-cell);height:var(--cw-cell)}.learn-cw-cell input{width:100%;height:100%;box-sizing:border-box;padding:0;border:1px solid #6e6e73;border-radius:3px;background:#fff;color:#1c1c1e;text-align:center;font:600 16px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase}.learn-cw-cell input:disabled{opacity:1;-webkit-text-fill-color:#1c1c1e}.learn-cw-cell.key input{background:#fde68a}.learn-cw-cell.given input{color:#1d4ed8;-webkit-text-fill-color:#1d4ed8}.learn-cw-cell.arrived input{animation:learn-cw-arrive .6s ease-out}.learn-cw-cell input.wrong{border-color:#b91c1c;background:#fee2e2}@keyframes learn-cw-arrive{0%{transform:scale(1.6)}}.learn-cw-number,.learn-cw-keyindex{position:absolute;font-size:8px;line-height:1;pointer-events:none;color:#6e6e73;z-index:1}.learn-cw-number{top:2px;left:2px}.learn-cw-keyindex{bottom:2px;right:2px;color:#b45309}.learn-cw-keyword{margin:8px 0 0;font-weight:600}.learn-cw-keybox{display:inline-block;width:22px;height:24px;margin-inline-end:2px;border-bottom:2px solid #d97706;background:#fef3c7;text-align:center;line-height:24px;white-space:pre}.learn-cw-cluebox{flex:1;min-width:200px}.learn-cw-clues{margin:4px 0 10px;padding-inline-start:24px}.learn-cw-clues li{cursor:pointer}@media(max-width:380px){.learn-cw{--cw-cell: 28px}}.learn-cloze{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-cloze-title{display:block;font-size:1.05em;margin-bottom:4px}.learn-cloze p{margin:0 0 8px}.learn-cloze-hint{color:var(--muted);font-size:.9em}.learn-cloze-code{margin:0 0 10px;padding:8px 10px;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.9;overflow-x:auto}.learn-cloze-code .ln{white-space:pre;min-height:1.9em}.learn-cloze-gap{font-size:13px;padding:1px 3px;margin:0 1px;min-width:0;max-width:none;border:1px solid #8e8e93;border-bottom-width:2px;border-radius:4px;background:#fff;color:#1c1c1e;text-align:center}.learn-cloze-gap.right{border-color:#34c759;background:#34c75924}.learn-cloze-gap.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-cloze-gap.shown{border-color:#d97706;background:#fef3c7}.learn-cloze-gap:disabled{opacity:1;-webkit-text-fill-color:currentColor}.learn-cloze-actions{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.learn-cloze-check{font-weight:600}.learn-cloze-status:empty{display:none}.learn-cloze-status{padding:8px 12px;border-radius:8px;font-weight:600}.learn-cloze-status.right{background:#dcfce7}.learn-cloze-status.wrong{background:#fee2e2}.learn-mark{color:inherit;padding:0 3px;border-radius:3px}.learn-mark.blau{background:#dbeafe}.learn-mark.orange{background:#ffedd5}.learn-mark.gruen{background:#dcfce7}.startup-error{max-width:520px;margin:15vh auto 0;padding:0 16px;font:16px/1.5 system-ui,-apple-system,sans-serif;color:var(--text)}.startup-error h1{font-size:22px}.startup-error button{font-size:16px;padding:8px 16px}.startup-error pre{margin-top:24px;color:var(--muted);font-size:12px;white-space:pre-wrap}.visubot-stage{position:relative;height:280px;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:linear-gradient(#dfe9f3,#f6f3ec)}.visubot-live{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot-live:empty{display:none}.visubot-live.connected{color:#0f8a5f;font-weight:600}.visubot-worlds{display:flex;gap:6px;margin:0 0 6px}.visubot-worlds button.active{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-canvas{display:block;width:100%;height:100%;touch-action:none}.visubot-status{font-size:12px;color:var(--muted);margin:6px 0 0}.visubot-controls{margin-top:8px;font-size:13px}.visubot-controls summary{cursor:pointer;font-weight:600}.visubot-controls .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-controls label{display:grid;grid-template-columns:9.5em 1fr 2.5em;align-items:center;gap:6px;margin:2px 0}.visubot-controls output{text-align:end;font-variant-numeric:tabular-nums}.visubot-presses{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.visubot-presses button{min-width:2.2em}.visubot-presses button.pressed{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-check{margin-top:8px;font-size:13px}.visubot-check summary{cursor:pointer;font-weight:600}.visubot-check .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-check-sensors{margin-top:8px;border-collapse:collapse;font-variant-numeric:tabular-nums}.visubot-check-sensors th{text-align:start;font-weight:400;padding:1px 12px 1px 0}.palette-visubot-title{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:14px 0 6px}.palette-sensor{display:flex;flex-direction:column;align-items:flex-start;gap:2px;border-style:dashed}.palette-sensor code{font-size:12px;color:var(--muted)}.palette-visubot .palette-item{border-color:#a7a0d3;background:color-mix(in srgb,#a7a0d3 16%,transparent)}.visubot-model{margin:12px 0}.visubot-model .visubot-stage{height:300px}.visubot-model-hint{font-size:13px;margin:4px 0 0}.visubot-part-label{position:absolute;pointer-events:none;padding:2px 8px;border-radius:6px;background:#14181ed9;color:#fff;font-size:13px;white-space:nowrap;z-index:1}.robot-part-link{text-decoration:underline 2px #f2b705;text-underline-offset:3px;cursor:pointer}.robot-part-link:hover,.robot-part-link:focus-visible{background:color-mix(in srgb,#f2b705 25%,transparent);outline:none}.visubot-quiz-question{font-size:15px;margin:12px 0 6px}.visubot-quiz-question.done{color:var(--success, #2f9e44)}.visubot-quiz-feedback{min-height:1.4em;margin:6px 0}.visubot-quiz-feedback.right{color:var(--success, #2f9e44)}.visubot-quiz-feedback.wrong{color:var(--danger, #c92a2a)}.diagram-tools .mbot-link{margin-inline-start:auto;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools .mbot-link:not([hidden])+.sim-toggle,.diagram-tools .mbot-upload:not([hidden])+.sim-toggle{margin-inline-start:6px}.diagram-tools .mbot-upload{margin-inline-start:6px;height:30px;padding:0 10px;white-space:nowrap}.mbot-upload-steps{margin:0 0 12px;padding-inline-start:22px;line-height:1.5}.mbot-upload progress{width:100%;height:10px}.mbot-upload-status.done{color:var(--success, #2f9e44);font-weight:600}.settings-mbot-link{display:grid;gap:4px;margin-top:8px}.settings-mbot-link small{font-size:12px;color:var(--muted)}.world-chooser{margin-bottom:4px}.world-hint{display:block;font-size:12px;color:var(--muted);margin-bottom:8px}.start-world{margin-bottom:14px}.robotpreview,.robotpreview-rail,.preview-resizer{display:none}.shell.robot-world.preview .robotpreview{display:flex}.shell.robot-world:not(.preview) .robotpreview-rail{display:flex;border-inline-end:none;border-inline-start:1px solid var(--border)}.robotpreview-rail svg{transform:scaleX(-1)}.shell.robot-world.preview:not(.preview-stacked) .preview-resizer{display:block}.robotpreview{flex:0 1 auto;width:360px;min-width:220px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0;overflow-y:auto}.robotpreview .hint{margin:0;font-size:.85em;color:var(--muted, inherit)}.robotpreview .robotpreview-stage{flex:1 1 auto;height:auto;min-height:160px}.robotpreview .robotpreview-status{margin:0;min-height:1.3em}.robotpreview-height{display:none}.robotpreview.simulation>.visubot-worlds,.robotpreview.simulation>.robotpreview-stage,.robotpreview.simulation>.robotpreview-status,.robotpreview.simulation .robotpreview-play{display:none}.robotpreview .visubot-viewport{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.robotpreview .visubot-viewport .visubot-stage{flex:1 1 auto;height:auto;min-height:160px}.visubot-elsewhere{display:none;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot:not(:has(>.visubot-viewport)) .visubot-elsewhere{display:block}.shell.preview-stacked .robotpreview{flex:0 0 auto;width:auto!important;height:320px;min-width:0;margin:4px -12px -12px;padding-top:0;border-inline-start:none;border-top:1px solid var(--border);overflow:visible}.shell.preview-stacked .robotpreview-height{display:block;height:10px;margin:-5px 0 0;cursor:row-resize;touch-action:none;position:relative}.robotpreview-height:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px;background:transparent;transition:background .15s}.robotpreview-height:hover:after,.robotpreview-height:focus-visible:after,.shell.resizing .robotpreview-height:after{background:var(--accent)}.robotpreview-height:focus-visible{outline:none}.preview-resizer{flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.preview-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.preview-resizer:hover:after,.preview-resizer:focus-visible:after,.shell.resizing .preview-resizer:after{background:var(--accent)}.preview-resizer:focus-visible{outline:none}.palette-group{grid-column:1 / -1}.palette-group button{display:flex;align-items:center;gap:6px;width:100%;margin-top:4px;padding:2px 0;border:none;background:none;color:var(--muted);font-size:12px;font-weight:600;text-align:start;cursor:pointer}.palette-group button:before{content:"▾";transition:transform .15s}.palette-group button[aria-expanded=false]:before{transform:rotate(-90deg)}.palette-item[hidden]{display:none}.editor-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.editor-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.editor-resizer:hover:after,.editor-resizer:focus-visible:after,.shell.resizing .editor-resizer:after{background:var(--accent)}.editor-resizer:focus-visible{outline:none}.shell.code-main.live:not(.editor-hidden) .editor-resizer{display:block}.shell.code-main.live:not(.editor-hidden) .live-resizer{display:none}.shell.code-main.live:not(.editor-hidden) .app{flex:0 1 auto;width:460px;min-width:300px}.shell.code-main.live:not(.editor-hidden) .livecode{flex:1 1 0;width:auto!important;min-width:0}.shell.code-main.live:not(.editor-hidden) .livecode{order:1}.shell.code-main.live:not(.editor-hidden) .editor-resizer{order:2}.shell.code-main.live:not(.editor-hidden) .app{order:3;border-inline-start:1px solid var(--border)}.shell.code-main.live:not(.editor-hidden) .live-rail,.shell.code-main.live:not(.editor-hidden) .preview-resizer,.shell.code-main.live:not(.editor-hidden) .robotpreview,.shell.code-main.live:not(.editor-hidden) .robotpreview-rail{order:4}[data-action=swap-main]{font-size:16px;line-height:1}[data-action=swap-main][aria-pressed=true]{color:var(--accent)}.palette-resizer{grid-area:pal;justify-self:end;width:10px;margin-inline-end:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.palette-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.palette-resizer:hover:after,.palette-resizer:focus-visible:after,.shell.resizing .palette-resizer:after{background:var(--accent)}.palette-resizer:focus-visible{outline:none}.app.simulating .palette-resizer{display:none}:root.visuobject-theme{--bg: #edf4f6;--text: #17292e;--muted: #566a70;--border: #cddde1;--accent: #0e7c86;--accent-soft: rgba(14, 124, 134, .2);--accent-faint: rgba(14, 124, 134, .08);--accent-glow: rgba(14, 124, 134, .35)}.visuobject-obj,.visuobject .brand .logo{color:var(--accent)}.shell.visuobject button.text-button{padding:5px 10px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);font:inherit;cursor:pointer}.shell.visuobject button.text-button:hover{border-color:var(--accent);color:var(--accent)}:root.visuobject-theme{--vo-bar: #e3edf0}.vo-columns{display:grid;grid-template-columns:var(--vo-cols, 260px 1px minmax(0, 45fr) 1px minmax(0, 55fr));flex:1;min-height:0;border-top:1px solid var(--border)}.vo-columns.vo-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.vo-pane{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--panel)}.vo-pane.collapsed>:not(.vo-strip){display:none}.vo-strip{display:none;flex:1;align-items:center;justify-content:center;padding:12px 0;border:0;background:var(--vo-bar);color:var(--muted);font:600 14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;writing-mode:vertical-rl;cursor:pointer}.vo-pane.collapsed>.vo-strip{display:flex}.vo-strip:hover,.vo-strip:focus-visible{color:var(--accent);background:var(--accent-faint);outline:none}.vo-splitter{position:relative;z-index:4;background:var(--border);cursor:col-resize;touch-action:none;outline:none}.vo-splitter:after{content:"";position:absolute;top:0;right:-4px;bottom:0;left:-4px}.vo-splitter:hover,.vo-splitter:focus-visible,.vo-resizing .vo-splitter{background:var(--accent)}.vo-splitter.fixed{cursor:default;background:var(--border)}.vo-bar{display:flex;flex-wrap:wrap;align-items:stretch;min-height:40px;background:var(--vo-bar);border-bottom:1px solid var(--border);font-size:14px}.vo-bar-title{display:flex;flex:1;align-items:center;margin:0;text-transform:none;letter-spacing:normal;padding:0 12px;font-size:14px;font-weight:600;color:var(--text)}.vo-bar-actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px;padding:4px 4px 4px 0}.shell.visuobject .vo-bar button.text-button{padding:2px 8px;border-radius:6px}.vo-collapse{padding:0 12px;border:0;background:none;color:var(--muted);font-size:16px;font-weight:700;cursor:pointer}.vo-collapse:hover,.vo-collapse:focus-visible{color:var(--accent)}.vo-tabs{display:flex;flex:1;min-width:0;overflow-x:auto}.vo-tab{display:flex;align-items:stretch;border-right:1px solid var(--border);border-bottom:3px solid transparent}.vo-tab.active{background:var(--panel);border-bottom-color:var(--accent)}.vo-tab [role=tab]{padding:0 4px 0 14px;border:0;background:none;color:var(--text);font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;white-space:nowrap;cursor:pointer}.vo-tab.active [role=tab]{font-weight:700}.vo-tab [role=tab]:hover{color:var(--accent)}.vo-tab-close{padding:0 10px 0 6px;border:0;background:none;color:var(--muted);font-size:15px;cursor:pointer;visibility:hidden}.vo-tab.active .vo-tab-close,.vo-tab:hover .vo-tab-close{visibility:visible}.vo-tab-close:hover{color:var(--accent)}.vo-tab-close .vo-dot,.vo-tab-close.unsaved .vo-x{display:none}.vo-tab-close.unsaved{visibility:visible;color:var(--text)}.vo-tab-close.unsaved .vo-dot{display:inline;font-size:11px}.vo-tab-close.unsaved:hover .vo-dot{display:none}.vo-tab-close.unsaved:hover .vo-x{display:inline}.vo-no-file{display:flex;align-items:center;padding:0 12px;color:var(--muted)}.vo-editor{flex:1;min-height:0;overflow:auto;font-size:14px}.vo-foot{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;padding:6px 12px;border-top:1px solid var(--border);background:var(--vo-bar)}.vo-hint{color:var(--muted);flex:1 1 260px}.vo-canvas{position:relative;flex:1;min-height:0;overflow:auto;background:radial-gradient(circle,var(--border) 1px,transparent 1px) 0 0 / 20px 20px;outline:none}.vo-frames{position:absolute;inset:0 auto auto 0;z-index:0;pointer-events:none;overflow:visible}.vo-package-frame{fill:#0e7c8609;stroke:var(--muted);stroke-width:1.2}.vo-package.current .vo-package-frame{stroke:var(--accent);fill:var(--accent-faint)}.vo-package-name{font:600 12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted)}.vo-package.current .vo-package-name{fill:var(--accent)}.vo-lines{position:absolute;inset:0 auto auto 0;z-index:3;pointer-events:none;overflow:visible}.vo-rel{stroke:var(--text);stroke-width:1.4;fill:none}.vo-rel.ghost{stroke:var(--accent);stroke-dasharray:4 4}.vo-hit{stroke:transparent;stroke-width:12;pointer-events:stroke;cursor:pointer}.vo-relation:hover .vo-rel,.vo-relation:hover .vo-diamond{stroke:var(--accent)}.vo-relation.selected .vo-rel,.vo-relation.selected .vo-diamond{stroke:var(--accent);stroke-width:2.4}.vo-relation.selected .vo-label-svg{fill:var(--accent)}.vo-diamond{fill:var(--panel);stroke:var(--text);stroke-width:1.4}.vo-diamond.filled{fill:var(--text)}.vo-relation.selected .vo-diamond.filled{fill:var(--accent)}.vo-label-svg.name{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:italic;fill:var(--text)}.vo-rel.dashed{stroke-dasharray:6 4}.vo-hollow,.vo-open{fill:none;stroke:var(--text);stroke-width:1.4}.vo-label-svg{font:12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted);paint-order:stroke;stroke:var(--panel);stroke-width:4px}.vo-empty{margin:24px;max-width:40ch;color:var(--muted)}.vo-status{margin:0;color:#b3261e}.vo-status:empty{display:none}.vo-status.hint{color:var(--accent)}.uml-class{position:absolute;left:16px;top:16px;min-width:150px;background:var(--panel);border:1.5px solid var(--text);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.uml-connect{position:absolute;right:-11px;top:50%;width:20px;height:20px;margin-top:-10px;padding:0;border:2px solid var(--panel);border-radius:50%;background:var(--accent);box-shadow:0 1px 4px #00000040;cursor:crosshair;touch-action:none}.uml-connect:after{content:"";position:absolute;top:5px;right:4px;bottom:5px;left:5px;background:#fff;clip-path:polygon(0 35%,55% 35%,55% 0,100% 50%,55% 100%,55% 65%,0 65%)}.uml-class.drop{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.vo-relmenu{position:absolute;z-index:10;display:grid;min-width:220px;padding:6px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0000002e;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-relmenu p{margin:2px 8px 6px;color:var(--muted);font-size:12px}.vo-relmenu button{display:flex;align-items:center;gap:10px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:inherit;text-align:left;cursor:pointer}.vo-relmenu button:hover,.vo-relmenu button:focus-visible{background:var(--accent-faint);color:var(--accent);outline:none}.vo-relicon{flex:none}.vo-palette{display:flex;flex-wrap:wrap;align-items:stretch;gap:2px;padding:4px 6px;border-bottom:1px solid var(--border);background:var(--panel)}.vo-palette-sep{width:1px;margin:4px;background:var(--border)}.vo-tool{display:grid;justify-items:center;gap:1px;min-width:44px;padding:3px 3px 2px;border:1px solid transparent;border-radius:7px;background:none;color:var(--text);font:11px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer;touch-action:none;-webkit-user-select:none;user-select:none}.vo-tool:hover{background:var(--accent-faint);color:var(--accent)}.vo-tool[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.vo-tool[data-tool=class],.vo-tool[data-tool=interface]{cursor:grab}.vo-tool-ghost{position:fixed;z-index:1000;display:grid;justify-items:center;min-width:120px;padding:4px 10px 14px;margin:-14px 0 0 -60px;border:1.5px dashed var(--accent);background:#ffffffe6;font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;pointer-events:none}.vo-tool-ghost small{color:var(--muted);font-size:11px}.vo-canvas:not([data-tool=select])[data-tool]{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class:hover,.uml-class.source{border-color:var(--accent)}.uml-class.source{box-shadow:0 0 0 4px var(--accent-soft)}.vo-stage{position:relative;display:flex;flex:1;min-height:0}.vo-stage .vo-canvas{flex:1}.vo-hsplit{flex:0 0 6px;margin:-3px 0;position:relative;z-index:5;cursor:row-resize;touch-action:none}.vo-hsplit:after{content:"";position:absolute;left:0;right:0;top:2px;height:2px;background:transparent}.vo-hsplit:hover:after,.vo-hsplit:focus-visible:after{background:var(--accent)}.vo-hsplit:focus-visible{outline:none}.vo-dock.collapsed+.vo-hsplit,.vo-hsplit:has(+.vo-dock.collapsed){cursor:default;pointer-events:none}.vo-dock{border-top:1px solid var(--border);background:var(--panel)}.vo-dock-bar{min-height:30px}.vo-dock-bar .vo-bar-title{font-size:13px}.vo-dock.collapsed .vo-inspector{display:none}.vo-inspector{display:grid;align-content:start;gap:8px;height:32vh;overflow:auto;padding:8px 12px 10px;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector-row>label.check,.vo-inspector label.check{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;padding-bottom:6px;color:var(--text);font-size:13px}.vo-inspector input[type=checkbox]{width:auto;margin:0;accent-color:var(--accent)}.vo-inspector fieldset.vo-inspector-ifaces{display:flex;flex-wrap:wrap;gap:4px 14px}.vo-inspector-empty{color:var(--muted)}.vo-inspector-row{display:flex;flex-wrap:wrap;align-items:end;gap:8px 12px}.vo-inspector-row>label{flex:1 1 160px;max-width:260px}.vo-inspector-ends{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.vo-inspector label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-inspector input,.vo-inspector select{box-sizing:border-box;width:100%;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector input:focus,.vo-inspector select:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.vo-inspector fieldset{display:grid;grid-template-columns:minmax(0,1fr) 84px;align-items:start;gap:6px;min-width:0;margin:0;padding:6px 8px 8px;border:1px solid var(--border);border-radius:8px}.vo-inspector fieldset .vo-wide{grid-column:1 / -1}.vo-reading{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;color:var(--muted)}.vo-reading b{color:var(--text)}.shell.visuobject .vo-reading button.text-button{padding:1px 8px;font-size:12px}.vo-inspector legend{padding:0 4px;color:var(--text);font-weight:600}.vo-inspector small{color:var(--muted);font-size:11px}.vo-inspector p{margin:0}.vo-inspector-kind{font-weight:600;padding-top:4px}.shell.visuobject .vo-inspector button.vo-danger{display:inline-flex;align-items:center;justify-self:start;gap:6px;color:#b3261e}.vo-inspector .vo-danger svg{width:15px;height:15px}.vo-insp-head{position:sticky;top:-8px;z-index:1;margin-top:-8px;padding-top:8px;background:var(--panel);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 12px;border-bottom:1px solid var(--border)}.vo-insp-head .vo-inspector-kind{padding:0}.vo-insp-tabs{display:flex;gap:2px}.shell.visuobject .vo-insp-tabs button{margin-bottom:-1px;padding:5px 12px;border:1px solid transparent;border-bottom:none;border-radius:6px 6px 0 0;background:none;color:var(--muted);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-insp-tabs button[aria-selected=true]{border-color:var(--border);background:var(--panel);color:var(--text);font-weight:600}.vo-members{width:100%;border-collapse:collapse}.vo-members th{padding:0 4px 3px;color:var(--muted);font-size:12px;font-weight:500;text-align:left}.vo-members td{padding:2px 4px;vertical-align:middle}.vo-members td.c{width:52px;text-align:center}.vo-members td:first-child{width:112px}.vo-members td:last-child{width:32px}.vo-members .icon svg{width:15px;height:15px}.vo-doc textarea{box-sizing:border-box;width:100%;max-width:780px;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;resize:vertical}.vo-insp-sep{align-self:stretch;width:1px;margin:0 4px;background:var(--border)}.vo-insp-label{align-self:center;color:var(--muted);font-size:12px}.uml-class.selected{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);z-index:2}.uml-head{display:grid;justify-items:center;padding:4px 10px;font-weight:700}.uml-head small{font-weight:400;font-size:11px;color:var(--muted)}.uml-class.abstract .uml-name,.uml-member.abstract{font-style:italic}.uml-member.static{text-decoration:underline}.uml-class ul{list-style:none;margin:0;padding:3px 0;border-top:1.5px solid var(--text);min-height:12px}.uml-class.selected ul{border-top-color:var(--accent)}.uml-class li{padding:0 10px;white-space:nowrap}.uml-member.selected{background:var(--accent-soft)}.uml-add{color:var(--accent);font-style:italic;cursor:pointer;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:12px}.uml-add:hover{text-decoration:underline}.uml-input{font:inherit;padding:0 4px;margin:0 -5px;border:1px solid var(--accent);border-radius:4px;outline:none;max-width:340px}.uml-tools{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;padding:6px 10px;border-top:1px dashed var(--border);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:default}.uml-tools label{display:inline-flex;gap:4px;align-items:center}.uml-tools button.icon svg{width:16px;height:16px}.vo-ws{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 10px 4px;font-size:13px}.vo-ws[hidden]{display:none}.vo-ws.ask{margin:8px 10px 4px;padding:10px;border:1px solid var(--accent);border-radius:8px;background:var(--bg, #fff)}.vo-ws.ask p{flex-basis:100%;margin:0}.vo-ws.ask .hint{color:var(--muted);font-size:12px;margin-bottom:4px}.vo-ws-name{display:inline-flex;align-items:center;gap:6px;margin-right:auto;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shell.visuobject .vo-ws button.text-button{padding:2px 8px;border-radius:6px}.shell.visuobject .vo-ws button.text-button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.vo-lines .vo-end-hit{fill:transparent;pointer-events:all;cursor:context-menu}.vo-lines .vo-label-svg.editable{pointer-events:all;cursor:pointer}.vo-lines .vo-label-svg.editable:hover{fill:var(--accent);text-decoration:underline}.vo-lines .vo-label-svg.placeholder{fill:var(--muted);opacity:.6;font-style:italic}.vo-endpop{position:absolute;z-index:12;display:grid;gap:8px;width:min(330px,calc(100% - 16px));box-sizing:border-box;padding:10px 12px;background:var(--panel);border:1px solid var(--accent);border-radius:10px;box-shadow:0 8px 24px #00000029;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop p{margin:0}.vo-endpop label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-endpop input{box-sizing:border-box;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop-row{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.vo-endpop-row>span{flex-basis:100%;color:var(--muted);font-size:12px}.vo-endpop-row button{padding:2px 8px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.vo-endpop-row button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.vo-endpop-row input{width:64px}.vo-new{position:relative}.vo-new-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:grid;min-width:190px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000024}.vo-new-menu[hidden]{display:none}.vo-new-menu button{display:flex;align-items:center;gap:8px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;text-align:left;cursor:pointer}.vo-new-menu button:hover,.vo-new-menu button:focus-visible{background:var(--accent-soft);outline:none}.vo-badge.folder.source{box-shadow:inset 0 3px #ffffff59,inset -5px -4px #8a6d2b}.confirm-card.vo-wizard{display:grid;gap:10px;width:min(520px,100%);max-width:none;max-height:calc(100vh - 32px);overflow:auto;box-sizing:border-box;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-wizard h2{margin:0;font-size:17px}.vo-wizard .hint{margin:0;color:var(--muted);font-size:13px}.vo-wizard>label{display:grid;grid-template-columns:130px minmax(0,1fr);align-items:center;gap:8px;color:var(--muted);font-size:13px}.vo-wizard input[type=text],.vo-wizard select{box-sizing:border-box;width:100%;min-width:0;padding:5px 7px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:inherit}.vo-wizard fieldset{margin:0;padding:6px 10px 8px;border:1px solid var(--border);border-radius:8px}.vo-wizard legend{padding:0 4px;color:var(--muted);font-size:13px}.vo-wizard-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}.vo-wizard-row select,.vo-wizard-row input[type=text]{width:auto;flex:1 1 160px}.vo-wizard-list{display:grid;gap:4px}.vo-wizard .check{display:inline-flex;align-items:center;gap:6px}.vo-wizard code{font-size:12px}.vo-wizard-error{min-height:1em;margin:0;color:#b3261e;font-size:13px}.vo-wizard .group button.primary{background:var(--accent);border-color:var(--accent);color:#fff}@media(max-width:560px){.vo-wizard>label{grid-template-columns:1fr}}.vo-dirty{color:var(--accent)}.vo-tree-tools{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 4px}.shell.visuobject .vo-tree-tools button.text-button{padding:2px 8px;border-radius:6px}.vo-tree{flex:1;min-height:0;overflow:auto;padding:6px;font:13px/1.3 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-tree ul{list-style:none;margin:0;padding:0}.vo-row{display:flex;align-items:center;gap:6px;min-height:28px;padding:0 6px 0 calc(4px + var(--depth, 0) * 14px);border-radius:7px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;outline:none}.vo-row:hover{background:var(--accent-faint)}.vo-row:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-soft)}.vo-row.active .vo-label{font-weight:600}.vo-row.selected{background:var(--accent-soft);color:var(--text)}.vo-twisty,.vo-twisty-space{flex:none;width:18px;height:18px}.vo-twisty{display:grid;place-items:center;padding:0;border:0;border-radius:4px;background:none;color:var(--muted);cursor:pointer}.vo-twisty svg{transition:transform .15s ease}[aria-expanded=true]>.vo-row .vo-twisty svg{transform:rotate(90deg)}.vo-twisty:hover{color:var(--accent)}.vo-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-type{color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis}.vo-row .uml-input{margin:0;font:inherit}.vo-row-delete{margin-left:auto;visibility:hidden}.vo-tree button.vo-row-delete{width:24px;height:24px}.vo-tree button.vo-row-delete svg{width:14px;height:14px}.vo-row:hover .vo-row-delete,.vo-row.selected .vo-row-delete{visibility:visible}.vo-tree-empty{padding:6px 10px 6px 52px;color:var(--muted);font-size:12px;white-space:normal}.vo-badge{flex:none;display:inline-grid;place-items:center;width:16px;height:16px;border-radius:4px;font:700 10px/1 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#fff}.vo-badge.project{background:var(--accent);border-radius:5px;box-shadow:inset 0 -5px #0000002e}.vo-badge.project.closed{opacity:.55}.vo-badge.folder{width:17px;height:13px;border-radius:2px 4px 3px 3px;background:#e0a63b;box-shadow:inset 0 3px #ffffff59}.vo-badge.package{width:14px;height:14px;border-radius:3px;background:#b07a2a;transform:rotate(45deg) scale(.82)}.vo-badge.package.empty{background:none;border:1.5px solid #b07a2a}.vo-badge.file{background:#e66a2c;border-radius:3px 6px 3px 3px}.vo-badge.type.class{background:#2f7d32;border-radius:50%}.vo-badge.type.class.abstract{background:#6a9c3a;font-style:italic}.vo-badge.type.interface{background:#7b4fb0;border-radius:50%}.vo-badge.field,.vo-badge.method{width:9px;height:9px;margin:0 3px}.vo-badge.field{border-radius:2px}.vo-badge.method{border-radius:50%}.vo-badge.public{background:#2f9e44}.vo-badge.private{background:#d6453d}.vo-badge.protected{background:#e0a63b}.vo-badge.package.field,.vo-badge.package.method{background:#3b82c4;transform:none;border:0}.vo-badge.static{box-shadow:0 0 0 2px var(--panel),0 0 0 3px currentColor;color:var(--muted)}@media(max-width:760px){.vo-columns{grid-template-columns:1fr;grid-auto-rows:auto;overflow:auto}.vo-splitter{display:none}.vo-explorer:not(.collapsed){height:260px}.vo-code:not(.collapsed){height:320px}.vo-diagram:not(.collapsed){min-height:420px}.vo-pane{border-bottom:1px solid var(--border)}.vo-strip{writing-mode:horizontal-tb;padding:10px}}.shell.visuobject .vo-run-group button.vo-run{color:var(--accent);font-weight:600}.vo-console{display:flex;flex-direction:column;height:32vh;min-height:120px;border-top:1px solid var(--border)}.vo-console[hidden],.vo-swing[hidden]{display:none}.vo-console .vo-dock-bar{gap:10px}.vo-console-status{flex:1;color:var(--muted);font-size:12px}.vo-console-status.error{color:#b3261e}.vo-swing{display:flex;height:60%;padding:6px}.vo-console-lines{flex:1;min-height:0;overflow:auto;margin:0;padding:6px 12px;font-size:13px;white-space:pre-wrap}.uml-note{position:absolute;min-width:120px;max-width:260px;padding:8px 22px 8px 10px;background:#fffbe6;border:1.2px solid var(--text);clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,0 100%);font:13px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#17292e;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none;z-index:1}.uml-note:after{content:"";position:absolute;top:0;right:0;width:14px;height:14px;background:linear-gradient(to bottom left,transparent 50%,#e9dfae 50%);border-left:1.2px solid var(--text);border-bottom:1.2px solid var(--text)}.uml-note.selected{outline:3px solid var(--accent-soft);border-color:var(--accent);clip-path:none}.uml-note .uml-connect{z-index:2}.uml-note-text{white-space:pre-wrap;overflow-wrap:anywhere}.uml-note-text.placeholder{color:#8a8a8a;font-style:italic}.uml-note-edit{box-sizing:border-box;width:220px;border:1px solid var(--accent);background:#fffef5;font:inherit;resize:both}.vo-note-link{stroke-dasharray:5 4}.vo-canvas[hidden],.vo-palette[hidden]{display:none}.vo-diagram-switch{display:flex;gap:2px;padding:2px;border:1px solid var(--border);border-radius:8px;background:var(--panel)}.shell.visuobject .vo-diagram-switch button{padding:3px 10px;border:none;border-radius:6px;background:none;color:var(--muted);font:600 13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-diagram-switch button[aria-selected=true]{background:var(--accent);color:#fff}.vo-obj-palette{align-items:center;gap:8px;padding:6px 10px}.vo-obj-new{display:flex;align-items:center;gap:6px;font-size:13px}.vo-obj-new select{padding:3px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.uml-object .uml-objname{text-decoration:underline;font-weight:600}.uml-object.unknown{border-style:dashed}.uml-object .uml-member.changed,.vo-objlink.changed{animation:vo-changed 1.2s ease-out}.uml-object .uml-member.changed{background:#fff3b0}@keyframes vo-changed{0%{background:#ffe066}}.vo-obj-values td:first-child{width:auto;white-space:nowrap}.vo-obj-values td:last-child{width:50%}.vo-dbg-controls{display:inline-flex;gap:2px}.vo-dbg-controls[hidden]{display:none}.vo-console-lines .vo-out-err{color:#b3261e}.vo-console-lines .vo-out-in{color:var(--accent);font-weight:600}.vo-console-input{display:flex;align-items:center;gap:6px;padding:4px 12px 8px;color:var(--accent)}.vo-console-input[hidden]{display:none}.vo-console-input input{flex:1;font-size:13px;padding:4px 6px;border:1px solid var(--accent);border-radius:4px}.vo-dbg{display:grid;grid-template-columns:minmax(160px,1fr) minmax(220px,2fr);gap:12px;padding:8px 12px}.vo-dbg h3{margin:0 0 6px;font-size:12px;font-weight:600;color:var(--muted)}.vo-dbg ol{list-style:none;margin:0;padding:0}.vo-dbg-frame{display:block;width:100%;text-align:start;padding:3px 6px;border:0;border-radius:4px;background:none;color:inherit;font:inherit;cursor:pointer}.vo-dbg-frame.on{background:var(--accent-soft)}.vo-dbg-frame small{color:var(--muted)}.vo-dbg-vars tr.changed td{background:#ffd60a59}@media(max-width:760px){.vo-dbg{grid-template-columns:1fr}}.vo-seqcanvas{overflow:auto}.vo-seqcanvas .vo-empty[hidden]{display:none}.vo-seq{display:block;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}.vo-seq-head rect{fill:var(--panel);stroke:var(--text);stroke-width:1.2}.vo-seq-head text{fill:var(--text);text-decoration:underline}.vo-seq-head.static text{text-decoration:none;font-weight:600}.vo-seq-life{stroke:var(--muted);stroke-dasharray:5 4}.vo-seq-bar{fill:var(--panel);stroke:var(--text);stroke-width:1}.vo-seq-bar.running{fill:var(--accent-soft)}.vo-seq-msg{cursor:pointer}.vo-seq-msg line,.vo-seq-msg path{stroke:var(--text);stroke-width:1.2}.vo-seq-msg .head.filled{fill:var(--text)}.vo-seq-msg text{fill:var(--text)}.vo-seq-msg.return line,.vo-seq-msg.create line{stroke-dasharray:6 4}.vo-seq-msg.exception line,.vo-seq-msg.exception text{stroke:#b3261e;fill:#b3261e}.vo-seq-msg.current line,.vo-seq-msg.current path{stroke:#e0a800;stroke-width:2.4}.vo-seq-msg.current .head.filled{fill:#e0a800}.vo-seq-msg.current text{font-weight:700}.vo-seq-msg:hover text{fill:var(--accent)}.vo-seq-more{fill:var(--muted)}.palette-head{display:flex;align-items:center;gap:4px;margin:0 0 4px}.palette-head h2{flex:1;min-width:0;margin:0}.palette-hide{min-height:26px;padding:2px 5px}.app.compact-palette .palette-head{flex-direction:column;gap:2px}.palette-rail{display:none;grid-area:pal;width:auto}.app.palette-hidden .palette,.app.palette-hidden .palette-resizer{display:none}.app.palette-hidden:not(.simulating) .palette-rail{display:flex}@media(max-width:820px){.palette-head{display:none}.app.palette-hidden .palette{display:block}.app.palette-hidden .palette-rail{display:none!important}} diff --git a/website/app/assets/index-Bv5oUBU1.css b/website/app/assets/index-Bv5oUBU1.css new file mode 100644 index 00000000..0f50ffab --- /dev/null +++ b/website/app/assets/index-Bv5oUBU1.css @@ -0,0 +1 @@ +:root{--bg: #f2f2f7;--panel: #ffffff;--text: #1c1c1e;--muted: #6e6e73;--border: #d1d1d6;--accent: #007aff;--accent-soft: rgba(0, 122, 255, .18);--accent-faint: rgba(0, 122, 255, .08);--accent-glow: rgba(0, 122, 255, .35);color-scheme:light}:root.visubot-theme{--bg: #f1f0f8;--text: #2f3454;--muted: #6a6890;--border: #d6d3e8;--accent: #e07000;--accent-soft: rgba(253, 161, 21, .24);--accent-faint: rgba(253, 161, 21, .1);--accent-glow: rgba(224, 112, 0, .35)}:root.visubot-theme .selection-frame{stroke:#e07000e6}*{box-sizing:border-box}html,body{margin:0;height:100%;background:var(--bg);color:var(--text);font:14px/1.4 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.app{display:grid;grid-template:"tools tools" auto "pal work" 1fr "pal insp" auto / var(--palette-width, 210px) minmax(0,1fr);height:100%;flex:1;min-width:0}.shell{display:flex;flex-direction:column;height:100vh;height:100dvh}.columns{display:flex;flex:1;min-height:0}.columns>.app{min-width:240px}.toolbar{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;padding:8px 12px;background:var(--panel);border-bottom:1px solid var(--border)}button.icon{display:inline-flex;align-items:center;justify-content:center;min-width:34px;height:32px;padding:0 7px}button.icon svg{display:block}.tooltip{position:fixed;z-index:1000;max-width:260px;padding:4px 8px;border-radius:6px;background:#1c1c1e;color:#fff;font-size:12px;line-height:1.35;pointer-events:none;box-shadow:0 2px 8px #0003}.tooltip[hidden]{display:none}.diagram-tools{grid-area:tools;display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:5px 8px;background:var(--panel);border-bottom:1px solid var(--border)}.diagram-tools button.icon{min-width:30px;height:30px;padding:0 5px}.diagram-tools .sim-toggle{margin-inline-start:auto;display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools{container-type:inline-size}@container (max-width: 520px){.diagram-tools .sim-toggle span{display:none}}.diagram-tools .sep{width:1px;height:20px;margin-inline:3px;background:var(--border)}.menu-host{position:relative}.export-menu{position:absolute;top:calc(100% + 4px);inset-inline-end:0;z-index:30;display:grid;min-width:180px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.export-menu[hidden]{display:none}.export-menu button{border:none;background:none;text-align:start;padding:7px 10px;border-radius:6px}.export-menu button:hover,.export-menu button:focus-visible{background:var(--accent-soft)}.settings{position:relative;margin-inline-start:auto}.settings>button{display:inline-flex;align-items:center;padding:6px 8px}.settings-menu{position:absolute;top:calc(100% + 6px);inset-inline-end:0;z-index:30;display:grid;width:290px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 80px);overflow-y:auto;padding:4px 0;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #00000026}.settings-menu[hidden]{display:none}.settings-menu section,.settings-menu footer{display:grid;gap:10px;padding:10px 14px 12px}.settings-menu section+section,.settings-menu footer{border-top:1px solid var(--border)}.settings-menu footer{display:flex;align-items:center;justify-content:space-between;gap:10px}.settings-version{font-size:12px;color:var(--muted)}.settings-menu section[hidden]{display:none}.settings-menu h3{margin:0;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}.settings-menu label{display:grid;gap:4px;font-size:13px;font-weight:600;color:var(--muted)}.settings-menu select{width:100%;max-width:none}.settings-menu label.check{grid-template-columns:auto 1fr;align-items:start;gap:8px;font-weight:500;color:var(--text);cursor:pointer}.settings-menu label.check input{margin:2px 0 0}.settings-menu label small,.settings-menu label.check small{display:block;font-weight:400;color:var(--muted)}.settings-menu .about-button{justify-self:start;padding:6px 10px;font-size:13px}dialog.about{width:min(560px,calc(100vw - 32px));max-height:calc(100dvh - 48px);padding:0;color:var(--text);background:var(--panel);border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 40px #00000040}dialog.about::backdrop{background:#00000059}dialog.about header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;border-bottom:1px solid var(--border)}dialog.about h2{margin:0;font-size:16px}.about-body{padding:20px 24px 24px;font-size:14px;line-height:1.5}.about-body p{margin:0 0 8px;color:var(--muted)}.about-head{display:flex;gap:16px;padding-bottom:16px;margin-bottom:8px;border-bottom:1px solid var(--border)}.about-head .logo{flex:none;width:40px;height:40px;color:var(--accent)}.about-head h3{margin:0 0 6px;font-size:20px}.about-head h3 small{font-weight:400;color:var(--muted)}.about-body .about-version{font-variant-numeric:tabular-nums}.about-body .about-author{color:var(--text);font-weight:600}.about-link{margin:0 0 2px}.about-body h4{margin:16px 0 6px;font-size:15px}.about-body code{font-weight:600;color:var(--text)}.about-body .about-copy{margin-top:16px}.brand{font-weight:700;font-size:16px;display:flex;align-items:center;gap:8px}.visubot-logo{width:auto;height:30px;margin:-4px 0}.visubot-bot{color:#f08a00;margin-left:-8px}.brand small{font-weight:500;color:var(--muted);font-size:12px}.logo{width:20px;height:20px;border:2px solid currentColor;background:linear-gradient(to bottom right,transparent 47%,currentColor 47% 53%,transparent 53%) left / 50% 60% no-repeat,linear-gradient(to bottom left,transparent 47%,currentColor 47% 53%,transparent 53%) right / 50% 60% no-repeat}.group{display:flex;flex-wrap:wrap;gap:6px}button,select{font:inherit;padding:6px 12px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);cursor:pointer;min-height:34px}select{max-width:180px}button:hover:not(:disabled),select:hover{border-color:var(--accent)}button:disabled{opacity:.4;cursor:default}.palette,.inspector{background:var(--panel);padding:12px;overflow-y:auto}.palette{grid-area:pal;border-inline-end:1px solid var(--border)}.inspector{grid-area:insp;border-top:1px solid var(--border);max-height:34vh}h2{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:0 0 4px}.hint{color:var(--muted);font-size:12px;margin:0 0 10px}.palette ul{list-style:none;margin:0;padding:0;display:grid;gap:6px}.palette-item{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;cursor:grab;line-height:1.25;user-select:none;-webkit-user-select:none;touch-action:none}.palette-item:hover,.palette-item:focus-visible{border-color:var(--accent);outline:none}.palette-item .icon{flex:none;color:var(--text)}.workspace{grid-area:work;display:flex;flex-direction:column;min-width:0;min-height:0}.caption{font:600 18px system-ui,-apple-system,sans-serif;border:none;border-bottom:1px solid var(--border);padding:10px 16px;background:var(--panel);outline:none}.canvas{flex:1;overflow:auto;scrollbar-gutter:stable;background:#fafafa}.canvas svg{display:block;user-select:none;-webkit-user-select:none}.dragging,.dragging *{cursor:grabbing!important}.drop-line{fill:var(--accent)}.drop-replace{fill:var(--accent-soft);stroke:var(--accent);stroke-width:3}.drag-ghost{position:fixed;left:0;top:0;z-index:10;pointer-events:none;padding:6px 10px;border-radius:8px;background:var(--accent);color:#fff;font-weight:600;box-shadow:0 4px 14px #0003;white-space:nowrap;max-width:260px;overflow:hidden;text-overflow:ellipsis}.inspector label{display:block;font-weight:600;margin:8px 0 4px}.inspector textarea{width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:8px;border:1px solid var(--border);border-radius:8px;resize:vertical}.statusbar{display:flex;flex-wrap:wrap;gap:2px 16px;align-items:baseline;padding:4px 12px;font-size:12px;color:var(--muted);background:var(--panel);border-top:1px solid var(--border)}.status{flex:1 1 auto;min-width:0}.site-links{display:flex;gap:12px;margin-inline-start:auto}.site-links a{color:inherit}.site-links a:hover,.site-links a:focus-visible{color:var(--accent)}a.brand{color:inherit;text-decoration:none}.file-drag .canvas{outline:3px dashed var(--accent);outline-offset:-8px}@media(min-width:821px){.app.compact-palette{--palette-width: 100px}.app.compact-palette .palette{padding:8px 6px}.app.compact-palette .palette h2{font-size:10px;letter-spacing:0;text-align:center}.app.compact-palette .palette .hint{display:none}.app.compact-palette .palette-item{flex-direction:column;gap:3px;padding:6px 2px;font-size:10.5px;line-height:1.15;text-align:center;overflow-wrap:break-word}}@media(max-width:820px){.app{grid-template:"tools" auto "pal" auto "work" 1fr "insp" auto / minmax(0,1fr)}.palette,.inspector{min-width:0}.palette{border-inline-end:none;border-bottom:1px solid var(--border);padding:8px}.palette .hint,.palette h2{display:none}.palette ul{display:flex;overflow-x:auto;overflow-y:hidden}.palette-item{white-space:nowrap}.inspector{max-height:30vh}}.status.message{color:var(--text);font-weight:600}.confirm{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#00000040;padding:16px}.confirm-card{background:var(--panel);border-radius:12px;padding:16px 18px;max-width:360px;box-shadow:0 10px 30px #0003}.confirm-card p{margin:0 0 8px}.confirm-card .group{justify-content:flex-end;margin-top:12px}.files-ask{width:min(360px,100%)}.files-ask input{width:100%;box-sizing:border-box;margin-top:4px}.files-choices{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 10px}.files-choice{display:inline-flex;align-items:center;gap:6px}.files-choice svg{width:16px;height:16px}button.danger{background:#d70015;border-color:#d70015;color:#fff}.simpanel{display:none;grid-area:insp;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto}.app.simulating{grid-template:"tools tools" auto "work insp" 1fr / minmax(0,1fr) 320px}.app.simulating.visubot-mode{grid-template:"tools tools" auto "work insp" 1fr / minmax(0,1fr) min(440px,45%)}.app.simulating .palette,.app.simulating .inspector{display:none}.app.simulating .simpanel{display:block}.app.simulating .caption{cursor:default}button.sim-toggle{font-weight:600}button.sim-toggle{background:var(--accent);border-color:var(--accent);color:#fff}.simpanel section{margin-bottom:14px}.sim-buttons{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:6px 0 10px}.sim-option{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:6px;font-size:13px}.mono,.sim-vars td{font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace}.sim-trace,.sim-output,.sim-vars{background:var(--bg);border-radius:8px;padding:8px 10px;overflow-wrap:anywhere}.sim-output{max-height:220px;overflow-y:auto;white-space:pre-wrap}.sim-vars table{border-collapse:collapse;width:100%}.sim-vars td{padding:2px 0;vertical-align:top}.sim-vars td:first-child{color:var(--muted);padding-inline-end:12px;width:1%;white-space:nowrap}.sim-vars table.sim-grid{width:auto}.sim-vars .sim-grid td,.sim-vars .sim-grid td:first-child{border:1px solid var(--border);color:inherit;font-size:11px;padding:0 4px;text-align:center;width:auto}.sim-vars .sim-grid td.sim-grid-true{font-weight:700}.simpanel .placeholder{color:var(--muted);font:13px system-ui,-apple-system,sans-serif;margin:0}.sim-notice{margin:0 0 14px;padding:8px 10px;border-radius:8px;background:#34c75926;font-weight:600}.sim-edit{width:100%;margin:-6px 0 14px}.sim-notice.error{background:#ff3b3026;color:#b0000f}.sim-input.active{padding:8px 10px;margin-left:-10px;margin-right:-10px;border-radius:10px;background:var(--accent-faint);outline:2px solid var(--accent)}.sim-prompt{margin:4px 0 6px;font-weight:600}.sim-input-row{display:flex;gap:6px}.sim-input-row input{flex:1;min-width:0;font:inherit;padding:6px 10px;border:1px solid var(--border);border-radius:8px}.sim-input-error{color:#b0000f;margin:6px 0 0;font-size:13px}@media(max-width:820px){.app.simulating{grid-template:"tools" auto "work" minmax(200px,1fr) "insp" auto / minmax(0,1fr)}.simpanel{border-inline-start:none;border-top:1px solid var(--border);max-height:48vh}}.codepanel{display:none;grid-area:code;background:var(--panel);border-inline-start:1px solid var(--border);padding:12px;overflow-y:auto;min-height:0}.app.coding{grid-template:"tools tools tools" auto "pal work code" 1fr "pal insp code" auto / var(--palette-width, 210px) minmax(0,1fr) 400px}.app.coding .codepanel{display:block}.app.coding .inspector{max-height:34vh}button[data-action=code][aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft)}.code-head,.runner-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.code-close{min-height:28px;padding:2px 10px}.segmented{display:flex;margin-bottom:8px}.segmented button{flex:1;border-radius:0;min-height:30px;padding:4px 8px}.segmented button:first-child{border-radius:8px 0 0 8px}.segmented button:last-child{border-radius:0 8px 8px 0}.segmented button+button{border-inline-start:none}.segmented button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.segmented[hidden]{display:none}.check{display:flex;gap:8px;align-items:center;font-size:13px;margin-bottom:4px}.code-actions{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}.code-actions [hidden]{display:none}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.code-view,.runner-out{margin:0;padding:10px 12px;border-radius:10px;background:var(--bg);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow:auto;white-space:pre;-moz-tab-size:4;tab-size:4}.runner{margin:12px 0}.runner-out{background:#0b1220;color:#e5e7eb;min-height:3em;max-height:240px;white-space:pre-wrap}.runner-out.error{outline:2px solid #ff453a}.runner-input{margin-top:8px}.runner-input label{display:block;font-weight:600;margin-bottom:4px}@media(max-width:820px){.app.coding{grid-template:"tools" auto "pal" auto "work" minmax(240px,1fr) "insp" auto "code" auto / minmax(0,1fr)}.codepanel{border-inline-start:none;border-top:1px solid var(--border);max-height:50vh}}.tabs{display:flex;align-items:flex-end;gap:2px;padding:6px 8px 0;background:var(--bg);border-bottom:1px solid var(--border);overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.tab{display:flex;align-items:center;max-width:220px;border:1px solid var(--border);border-bottom:none;border-radius:8px 8px 0 0;background:#ffffff80}.tab.active{background:var(--panel);margin-bottom:-1px;padding-bottom:1px}.tab button{border:none;background:none;min-height:30px;border-radius:8px 8px 0 0}.tab-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:4px 6px 4px 12px}.tab.active .tab-label{font-weight:600}.tab-close{padding:2px 8px;color:var(--muted);font-size:11px}.tab-close:hover{color:var(--text)}.tab-dot,.tab-close.unsaved .tab-x{display:none}.tab-close.unsaved .tab-dot{display:inline;color:var(--text);font-size:10px}.tab-close.unsaved:hover .tab-dot{display:none}button.tab-close.unsaved:hover .tab-x{display:inline}span.tab-close{padding:2px 10px 2px 4px}.tab-add{min-height:28px;padding:2px 10px;margin:0 0 3px 4px;border-radius:8px}.inspector .segmented{margin:6px 0 4px;max-width:420px}.mono-hint{font:11px/1.45 ui-monospace,SF Mono,Menlo,Consolas,monospace;overflow-wrap:anywhere}.editor-row{display:flex;gap:8px;align-items:flex-start}.editor-row textarea{flex:1;min-width:0}.fixed-prefix{font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;color:var(--muted);padding-top:9px}.inspector input:not([type]){width:100%;font:14px ui-monospace,SF Mono,Menlo,Consolas,monospace;padding:7px 8px;border:1px solid var(--border);border-radius:8px}.for-fields{display:grid;gap:4px}.for-fields label,.case-controls label{margin:4px 0 0;font-size:12px;color:var(--muted);font-weight:600}.case-controls{margin-top:12px;padding-top:10px;border-top:1px solid var(--border)}.case-controls .group{margin-top:8px}button.danger-text:not(:disabled){color:#d70015}.print-sheet{display:none}.files{display:none;flex:0 1 auto;flex-direction:column;width:260px;min-width:200px;min-height:0;background:var(--panel);border-inline-end:1px solid var(--border)}.shell.files-open .files{display:flex}.shell.files-open .files-rail{display:none}.files-head{display:flex;align-items:center;gap:4px;margin:10px 12px 6px}.files-head h2{flex:1;margin:0;font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.files-head button.icon{min-width:30px;height:30px;padding:0 5px}.files-head [hidden]{display:none}.files-body{flex:1;min-height:0;overflow:auto;padding:0 8px 12px;font-size:14px}.files-where{margin:0 4px 6px;font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-hint,.files-empty{margin:8px 4px;font-size:13px;color:var(--muted)}.start-ask .files-start{margin-bottom:2px}.start-ask .hint{font-size:13px;color:var(--muted)}.start-without{display:block;margin:12px auto 0;border:none;background:none;color:var(--accent);text-decoration:underline}.start-without+.hint{text-align:center}.files-start{display:flex;align-items:center;gap:6px;width:100%;margin:8px 0;justify-content:center}.files-row{display:flex;align-items:center;border-radius:6px}.files-row:hover,.files-row:focus-within{background:var(--accent-soft)}.files-row.current>.files-name{font-weight:600}.files-name{flex:1;min-width:0;display:flex;align-items:center;gap:6px;padding:4px 6px 4px calc(6px + var(--depth) * 16px);border:none;background:none;text-align:start;font:inherit;color:var(--text);cursor:pointer}.files-name:disabled{cursor:default;color:var(--muted)}.files-name svg{flex:none;width:16px;height:16px;color:var(--muted)}.files-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.files-name small{margin-inline-start:auto;padding:0 6px;border-radius:6px;background:var(--accent);color:#fff;font-size:11px;font-weight:600}.files-row .files-delete{visibility:hidden;min-width:26px;height:26px;padding:0 4px;border:none;background:none;color:var(--muted)}.files-row:hover .files-delete,.files-row:focus-within .files-delete{visibility:visible}.files-error{color:#c62828}.files-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.files-open .files-resizer{display:block}.files-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px}.files-resizer:hover:after,.files-resizer:focus-visible:after{background:var(--accent)}.learn{display:none;flex:0 1 auto;width:400px;min-width:280px;flex-direction:column;background:var(--panel);border-inline-end:1px solid var(--border);min-height:0}.shell.learning .learn{display:flex}.learn-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.learning .learn-resizer{display:block}.learn-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.learn-resizer:hover:after,.learn-resizer:focus-visible:after,.shell.resizing .learn-resizer:after{background:var(--accent)}.learn-resizer:focus-visible{outline:none}.shell.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.learn-head{display:flex;align-items:flex-start;gap:6px;margin:10px 12px 0}.learn-tabs{flex:1;min-width:0}.learn-hide{flex:none;min-height:30px;padding:4px 7px;display:inline-flex;align-items:center;color:var(--muted)}.learn-rail{flex:none;display:flex;flex-direction:column;align-items:center;gap:10px;width:36px;padding:10px 0;border:none;border-radius:0;border-inline-end:1px solid var(--border);background:var(--panel);cursor:pointer}.learn-rail:hover{background:var(--accent-soft)}.learn-rail span{writing-mode:vertical-rl;white-space:nowrap}.shell.learning .learn-rail:not(.live-rail):not(.editor-rail):not(.files-rail):not(.robotpreview-rail):not(.palette-rail){display:none}.live-rail{border-inline-end:none;border-inline-start:1px solid var(--border)}.live-rail svg{transform:scaleX(-1)}.shell.live .live-rail{display:none}.editor-rail{display:none;border-inline-start:1px solid var(--border)}.shell.editor-hidden .editor-rail{display:flex}.shell.editor-hidden .app,.shell.editor-hidden .live-resizer,.shell.editor-hidden:not(.live) .learn-resizer{display:none}.shell.editor-hidden .livecode,.shell.editor-hidden:not(.live) .learn{flex:1 1 0;width:auto!important;min-width:0}.learn-body{overflow-y:auto;scrollbar-gutter:stable;padding:4px 16px 24px;flex:1;min-height:0;line-height:1.5}.learn-body h2.learn-title{display:flex;align-items:center;gap:8px;font-size:20px;text-transform:none;letter-spacing:0;color:var(--text);margin:2px 0 10px}.learn-section{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:18px 0 6px}.learn-list{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-item{display:flex;align-items:center;gap:10px;width:100%;text-align:start;padding:8px 10px}.learn-item.done{border-color:#34c759}.learn-num{flex:none;min-width:28px;height:28px;border-radius:14px;background:var(--accent-soft);color:var(--accent);display:grid;place-items:center;font-weight:700;font-size:12px;padding:0 6px}.learn-item.done .learn-num{background:#34c7592e;color:#248a3d}.learn-item-text{flex:1;display:grid;min-width:0}.learn-item-text small{color:var(--muted)}.learn-status{flex:none;color:var(--muted);font-size:12px}.learn-item.done .learn-status{color:#248a3d;font-weight:700}.learn-back,.link-button{border:none;background:none;padding:6px 0;min-height:0;color:var(--accent)}.link-button{padding:0;text-align:start}.learn-kicker{margin:4px 0 0;color:var(--muted);font-size:12px}.learn-progress{display:flex;gap:4px;margin-bottom:14px}.learn-progress button{flex:1 1 0;min-width:0;padding:3px 0;font-size:13px;font-variant-numeric:tabular-nums;border-radius:6px}.learn-progress button.past{border-color:var(--accent);color:var(--accent)}.learn-progress button.current{border-color:var(--accent);background:var(--accent);color:#fff;font-weight:600}.learn-progress button.robot-step:not(.current){border-color:#0fa3c6;background:#0fa3c61f}.learn-progress button.robot-step.current{border-color:#0fa3c6;background:#0fa3c6}.learn-step-title{font-size:16px;margin:0 0 6px}.learn-text p,.learn-text ul,.learn-text ol{margin:0 0 10px}.learn-text ul,.learn-text ol{padding-inline-start:22px}.learn-text code,.learn-tests code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;background:var(--bg);border-radius:4px;padding:1px 4px}.learn-text h3{font-size:15px;margin:18px 0 4px}.reference-group{border:1px solid var(--border);border-radius:8px;margin:0 0 8px;padding:0 12px}.reference-group summary{cursor:pointer;font-weight:600;padding:9px 0}.reference-group[open] summary{border-bottom:1px solid var(--border)}.reference-group>h3:first-of-type{margin-top:10px}.lesson-code{background:var(--bg);border-radius:8px;padding:8px 10px;margin:0 0 10px;overflow-x:auto;overflow-y:hidden;font-size:12.5px}.lesson-code code{background:none;padding:0}.lesson-note{border-inline-start:3px solid var(--accent);background:var(--accent-soft);border-radius:6px;padding:8px 10px;margin:0 0 10px}.lesson-note p:last-child{margin-bottom:0}.learn-images{display:flex;gap:8px;flex-wrap:wrap}.learn-images img{width:150px;height:200px;object-fit:cover;border-radius:8px}.learn-file{margin:0 0 14px;border:1px solid var(--border);border-radius:10px;overflow:hidden;background:var(--panel)}.learn-file figcaption{display:flex;align-items:center;gap:6px;padding:6px 10px;background:var(--bg);border-bottom:1px solid var(--border);font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;font-weight:600}.learn-file-text{margin:0;padding:8px 10px;overflow-x:auto;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;white-space:pre}.learn-file.written{margin:8px 0;border-color:#15803d}.learn-file.written figcaption{background:#dcfce7}.learn-file-text .ln{display:inline-block;min-width:2ch;margin-inline-end:10px;color:var(--muted);text-align:end;-webkit-user-select:none;user-select:none}.learn-brag{display:grid;grid-template-columns:48px minmax(0,1fr);gap:10px;align-items:start;border:1px solid var(--border);border-radius:10px;padding:10px 12px;margin:0 0 14px;background:var(--accent-soft)}.learn-brag img{width:48px;height:48px;border-radius:50%}.learn-brag-title{margin:0 0 4px;font-weight:700}.learn-brag .learn-text p:last-child{margin-bottom:0}.learn-game{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-game-head{display:flex;align-items:center;gap:10px;font-size:1.05em}.learn-game-head img{width:40px;height:40px;border-radius:50%}.learn-game-status{margin:6px 0;color:var(--muted);font-size:.9em}.learn-game-values{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.learn-game-values code{background:var(--accent-soft);border-radius:6px;padding:2px 8px}.learn-game-condition{font-size:1.15em;font-weight:600;padding:10px 12px;border-radius:8px;background:var(--bg, #f2f2f7);margin-bottom:10px;overflow-wrap:anywhere}.learn-game-answers button{flex:1;font-weight:600;padding-block:10px}.learn-game-true:not(:disabled){border-color:#15803d;color:#15803d}.learn-game-false:not(:disabled){border-color:#b91c1c;color:#b91c1c}.learn-game-feedback:empty{display:none}.learn-game-feedback{margin-top:10px;padding:10px 12px;border-radius:8px}.learn-game-feedback.right{background:#dcfce7}.learn-game-feedback.wrong{background:#fee2e2}.learn-game-feedback p{margin:0 0 6px;font-weight:700}.learn-game-steps{margin-bottom:10px;line-height:1.6}.learn-game-result{font-size:1.2em;font-weight:700}.learn-game-question{font-weight:600;margin:10px 0 8px}.learn-game-code{margin:0 0 8px;padding:8px 0;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.5;overflow-x:auto}.learn-game-code .ln{padding:0 10px 0 calc(10px + 2ch);text-indent:-2ch;border-inline-start:3px solid transparent;white-space:pre-wrap;overflow-wrap:anywhere;transition:background .2s}.learn-game-code .ln.hit{background:#fef3c7;border-inline-start-color:#d97706}.learn-bomb{display:flex;align-items:center;gap:10px;margin-bottom:6px;font-weight:700}.learn-bomb-icon{font-size:28px;line-height:1}.learn-bomb.hurry .learn-bomb-icon{animation:learn-bomb-shake .25s infinite alternate}.learn-bomb.boom .learn-bomb-icon{animation:learn-bomb-boom .5s ease-out}@keyframes learn-bomb-shake{0%{transform:rotate(-8deg)}to{transform:rotate(8deg)}}@keyframes learn-bomb-boom{0%{transform:scale(.6)}60%{transform:scale(1.5)}to{transform:scale(1)}}.learn-bomb-time{min-width:7ch;font-variant-numeric:tabular-nums}.learn-bomb-fuse{flex:1;height:8px;border-radius:4px;background:#e5e7eb;overflow:hidden}.learn-bomb-fuse span{display:block;height:100%;background:#f59e0b;transition:width .2s linear}.learn-bomb.hurry .learn-bomb-fuse span{background:#dc2626}.learn-bomb.defused .learn-bomb-fuse span{background:#15803d}.learn-bomb-code .ln{display:block;width:100%;margin:0;border-radius:0;border-block:0;border-inline-end:0;background:none;color:inherit;font:inherit;line-height:inherit;min-height:0;height:auto;padding-block:1px;text-align:start;cursor:pointer}.learn-bomb-code .ln:not(:disabled):hover{background:#fef3c7}.learn-bomb-code .ln:disabled{cursor:default;opacity:1}.learn-bomb-code .ln.right,.learn-bomb-code .ln.right:hover{background:#dcfce7;border-inline-start-color:#15803d}.learn-bomb-code .ln.wrong,.learn-bomb-code .ln.wrong:hover{background:#fee2e2;border-inline-start-color:#b91c1c}.learn-bomb-fix code{white-space:pre-wrap}.learn-game-options{display:grid;gap:6px}.learn-game-options button{text-align:start;padding:8px 12px}.learn-game-options.pictures{grid-template-columns:repeat(auto-fill,minmax(130px,1fr))}.learn-game-options.pictures button{padding:6px}.learn-game-options button.right{border-color:#15803d;background:#dcfce7;color:inherit;opacity:1}.learn-game-options button.wrong{border-color:#b91c1c;background:#fee2e2;color:inherit;opacity:1}.learn-order-hint{margin:0 0 6px;font-size:13px;opacity:.75}.learn-order button{display:flex;align-items:center;gap:10px}.learn-order-badge{flex:none;display:inline-grid;place-items:center;width:24px;height:24px;border-radius:50%;border:1.5px solid currentColor;font-size:13px;font-weight:700;opacity:.5}.learn-order button.right .learn-order-badge,.learn-order button:disabled .learn-order-badge:not(:empty){opacity:1}.learn-game-file{margin:0;padding:2px 0;font-size:13px;line-height:1.45;white-space:pre;background:none}.learn-game-explain{margin-bottom:10px}.learn-swing-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:8px;align-items:start}.learn-swing-window{border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-swing-title{padding:3px 8px;font-size:12px;text-align:center;background:#e5e5ea;border-bottom:1px solid #d1d1d6;min-height:1.4em}.learn-swing-body{display:grid;gap:6px;padding:10px}.learn-swing-label{padding:4px 2px;min-height:1.4em}.learn-swing-label.changed,.learn-swing-button.changed{animation:swing-changed 1s ease-out}@keyframes swing-changed{0%{background:#ffd60acc}}.learn-swing-button{padding:6px 10px;background:#fff;color:#1c1c1e;border:1px solid #a1a1aa;border-radius:6px}.learn-swing-button:disabled{opacity:1;cursor:default}.learn-swing-button.pressed{background:var(--accent);border-color:var(--accent);color:#fff;transform:scale(.96)}.learn-swing-event{margin:0;padding:0 10px 8px;font-size:12px;min-height:1.4em}.learn-swing-event.heard{color:#b45309;font-weight:600}.learn-swing-event.nobody{color:#6b7280;font-style:italic}.learn-swing-console{margin:0 10px 10px;padding:6px 8px;border-radius:6px;background:#1c1c1e;color:#f2f2f7;font-size:12px}.learn-swing-console[hidden]{display:none}.learn-swing-clicks{margin:8px 0 0}.learn-swing-try{font-weight:400!important;font-style:italic}.learn-layout-window{width:100%;border:1px solid #a1a1aa;border-radius:6px;overflow:hidden;background:#fff;color:#1c1c1e}.learn-layout-title{height:10px;background:#e5e5ea;border-bottom:1px solid #d1d1d6}.learn-layout-body{height:80px;padding:3px;gap:3px;font-size:12px}.learn-layout-body.grid{display:grid;grid-auto-rows:1fr}.learn-layout-body.flow{display:flex;flex-direction:column;gap:3px}.learn-layout-row{display:flex;justify-content:center;gap:3px}.learn-layout-body.border{display:grid;grid-template:"N N N" auto "W C E" 1fr "S S S" auto / auto 1fr auto}.learn-layout-cell{display:flex;align-items:center;justify-content:center;min-width:22px;padding:2px 6px;border:1px solid #a1a1aa;border-radius:4px;background:#f4f4f5;font-weight:600}.learn-figure{margin:0 0 14px;display:grid;gap:6px;justify-items:start}.learn-preview{width:100%;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:#fafafa}.learn-preview>svg{display:block;width:100%;margin:0 auto;height:auto}.learn-figure figcaption{color:var(--muted);font-size:13px}.learn-exercise{border:1px solid var(--accent);border-radius:10px;padding:10px 12px;margin:0 0 14px;display:grid;gap:8px}.learn-exercise h4{margin:0;font-size:15px;display:flex;gap:8px;align-items:center}.learn-badge{font-size:12px;color:#248a3d;background:#34c7592e;border-radius:10px;padding:1px 8px}.learn-exercise .learn-text p:last-child{margin-bottom:0}.learn-result:empty{display:none}.learn-result{border-radius:8px;padding:8px 10px}.learn-result.ok{background:#34c75924}.learn-result.fail{background:#ff950024}.learn-result.info{background:var(--bg)}.learn-result-head{margin:0 0 6px;font-weight:600}.learn-tests{list-style:none;padding:0;margin:0;display:grid;gap:6px}.learn-test-detail{display:grid;padding-inline-start:16px;font-size:13px}.learn-error{color:#c4291c}.learn-solution summary{cursor:pointer;color:var(--accent)}.learn-solution[open]{display:grid;gap:6px;justify-items:start}.learn-checklist{list-style:none;padding:0;margin:0 0 14px;display:grid;gap:6px}.learn-checklist li{display:flex;gap:8px;align-items:baseline;justify-content:space-between}.learn-checklist label{display:flex;gap:8px;align-items:baseline}.learn-return{width:100%;margin:0 0 12px;border-color:var(--accent);background:var(--accent-soft)}.learn-nav+.learn-return{margin:12px 0 0}.learn-check-link{flex:none;font-size:13px}.learn-quiz fieldset{border:1px solid var(--border);border-radius:10px;padding:8px 12px 10px;margin:0 0 10px;display:grid;gap:6px}.learn-quiz legend{font-weight:600;padding:0 4px}.learn-option{text-align:start}.learn-option.right{border-color:#34c759;background:#34c75924}.learn-option.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-match{display:grid;gap:6px}.learn-match-left{display:grid;grid-template-columns:8.5em minmax(0,1fr);align-items:center;gap:8px}.learn-match-select{min-width:0;width:100%;max-width:none}.learn-match-select.right{border-color:#34c759;background:#34c75924}.learn-match-select.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-explanation{margin:0;color:var(--muted);font-size:13px}.learn-score{font-weight:600}.learn-nav{display:flex;justify-content:space-between;gap:8px;margin-top:18px}@media(max-width:1100px){.learn{width:340px}}@media(max-width:900px){.learn{width:300px}}.livecode{display:none;flex:0 1 auto;width:420px;min-width:200px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0}.shell.live .livecode{display:flex}.livecode-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px}.livecode-head h2{margin:0;font-size:16px}.livecode-lang{margin-inline-start:auto;padding:2px 8px;border-radius:6px;background:var(--accent-soft);color:var(--accent);font-size:12px;font-weight:600}.livecode .learn-hide svg{transform:scaleX(-1)}.livecode .hint{margin:0}.livecode-view{flex:1;min-height:0;padding:10px 0;font-size:var(--code-size, 14px)}.livecode-view .ln{padding:0 12px;min-height:1.5em;border-inline-start:3px solid transparent}.livecode-view.selectable .ln{cursor:pointer}.livecode-view .ln.sel{background:var(--accent-soft);border-inline-start-color:var(--accent)}.livecode-view .ph{color:var(--muted);font-style:italic}.livecode-editor{flex:1;min-height:0;padding:0;font-size:var(--code-size, 14px);white-space:normal;overflow:hidden;--syn-keyword: #7f0055;--syn-string: #2a00ff;--syn-number: #986801;--syn-comment: #3f7f5f}.livecode-editor[hidden],.livecode-view[hidden],.livecode-problem[hidden]{display:none}.livecode-editor .cm-editor{height:100%;background:transparent}.livecode-editor .cm-editor.cm-focused{outline:2px solid var(--accent-soft);outline-offset:-2px;border-radius:10px}.livecode-editor .cm-scroller{font:inherit;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;line-height:1.5}.livecode-editor .cm-gutters{background:transparent;border-inline-end:1px solid var(--border);color:var(--muted)}.livecode-editor .cm-lineNumbers .cm-gutterElement{padding:0 8px 0 10px;min-width:2ch}.livecode-editor .cm-activeLineGutter{background:transparent;color:var(--text)}.livecode-editor .cm-content{padding:10px 0;caret-color:var(--text)}.livecode-editor .cm-line{padding:0 12px;border-inline-start:3px solid transparent}.livecode-editor .cm-scopeLayer .cm-scope{border:1px solid color-mix(in srgb,var(--scope) 28%,transparent);border-left:3px solid var(--scope);border-radius:8px;background:color-mix(in srgb,var(--scope) 9%,#fff)}.livecode-editor .cm-scopeLayer .cm-scope-class{--scope: #34c47c}.livecode-editor .cm-scopeLayer .cm-scope-method{--scope: #f2b100}.livecode-editor .cm-scopeLayer .cm-scope-loop{--scope: #ec5fa6}.livecode-editor .cm-scopeLayer .cm-scope-if{--scope: #3b9cf0}.livecode-editor .cm-scopeLayer .cm-scope-try{--scope: #9a7cf0}:root.no-code-scopes .livecode-editor .cm-scopeLayer .cm-scope:not(.cm-scope-sel){display:none}:root:not(.no-code-scopes) .ns-scope-method{fill:color-mix(in srgb,#f2b100 14%,#fff)}:root:not(.no-code-scopes) .ns-scope-loop{fill:color-mix(in srgb,#ec5fa6 14%,#fff)}:root:not(.no-code-scopes) .ns-scope-if{fill:color-mix(in srgb,#3b9cf0 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=method]{background:color-mix(in srgb,#f2b100 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=loop]{background:color-mix(in srgb,#ec5fa6 14%,#fff)}:root:not(.no-code-scopes) .palette-item[data-scope=if]{background:color-mix(in srgb,#3b9cf0 14%,#fff)}.livecode-editor .cm-scopeLayer .cm-scope-sel{background:transparent;border:2px solid var(--accent);box-shadow:0 0 0 3px var(--accent-faint)}.livecode-editor .cm-line.cm-debug-line{background:#ffd60a59;border-inline-start-color:#e0a800}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement,.livecode-editor .cm-lineNumbers .cm-gutterElement{cursor:pointer}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement{display:flex;align-items:center;justify-content:center;width:14px;padding-inline-start:4px}.livecode-editor .cm-breakpoint{display:inline-block;width:10px;height:10px;border-radius:50%;background:#d33}.livecode-editor .cm-breakpoint-gutter .cm-gutterElement:not(:has(.cm-breakpoint)):hover:before{content:"";width:10px;height:10px;border-radius:50%;background:#dd33334d}.livecode-debug{flex:none;max-height:30%;overflow-y:auto}.livecode-debug[hidden]{display:none}.livecode-debug h2{margin:0 0 4px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.livecode-vars tr.changed td{animation:var-changed 1.6s ease-out;font-weight:700}@keyframes var-changed{0%{background:#ffd60ab3}to{background:transparent}}.livecode-editor .cm-ph,.livecode-editor .cm-ph *{color:var(--muted)!important;font-style:italic;font-weight:400!important}.livecode-editor .cm-err{text-decoration:underline wavy #d33;text-decoration-skip-ink:none;text-underline-offset:3px}.livecode-editor .cm-selectionBackground,.livecode-editor .cm-focused .cm-selectionBackground{background:color-mix(in srgb,var(--accent) 25%,transparent)!important}.livecode-editor .cm-matchingBracket{background:color-mix(in srgb,var(--accent) 20%,transparent);outline:1px solid color-mix(in srgb,var(--accent) 50%,transparent)}.cm-tooltip.cm-tooltip-autocomplete{border:1px solid var(--border);border-radius:8px;background:var(--panel);box-shadow:0 4px 16px #0000001f;overflow:hidden}.cm-tooltip.cm-tooltip-autocomplete>ul{font:14px/1.4 ui-monospace,SF Mono,Menlo,Consolas,monospace;max-height:16em}.cm-tooltip.cm-tooltip-autocomplete>ul>li{padding:4px 10px}.cm-tooltip.cm-tooltip-autocomplete>ul>li[aria-selected]{background:var(--accent);color:#fff}.cm-tooltip-autocomplete .cm-completionDetail{margin-inline-start:12px;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:normal;color:var(--muted)}.cm-tooltip-autocomplete li[aria-selected] .cm-completionDetail{color:#ffffffd9}.livecode-run{padding:3px 10px;font-size:13px;margin-inline-start:6px}.console{display:flex;flex:none;flex-direction:column;gap:6px;height:180px;min-height:80px;padding:6px 10px 8px;background:var(--bg);border:1px solid var(--border);border-radius:8px}.console[hidden],.console-resizer[hidden]{display:none}.console-head{display:flex;align-items:center;gap:8px}.console-head h2{margin:0;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted)}.console-hide{margin-inline-start:auto;padding:0 8px;font-size:14px}.console-resizer{flex:none;height:10px;margin-block:-5px;cursor:row-resize;touch-action:none;position:relative}.console-resizer:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px}.console-resizer:hover:after,.console-resizer:focus-visible:after,.console-resizer.dragging:after{background:var(--accent)}.console-resizer:focus-visible{outline:none}.livecode-console-lines{flex:1;min-height:0;overflow:auto;font-size:var(--code-size, 14px);white-space:pre-wrap}.livecode-console-lines .typed{color:var(--accent)}.livecode-console-lines .pending:after{content:"▌";color:var(--accent);animation:blink 1s steps(1) infinite}@keyframes blink{50%{opacity:0}}.livecode-console-input{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.livecode-console-input[hidden]{display:none}.livecode-console-input label{display:flex;flex:1;align-items:center;gap:6px;min-width:0;font-size:var(--code-size, 14px)}.livecode-console-input input{flex:1;min-width:60px;padding:4px 8px;font:inherit}.livecode-console-error,.livecode-console-notice{margin:0;font-size:13px;color:var(--muted)}.livecode-console-error{flex-basis:100%;color:#c62828}.livecode-console-notice.error{color:#c62828}.livecode-problem{margin:0;min-height:1.4em;font-size:13px;color:#c62828}.live-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.shell.live .live-resizer{display:block}.live-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.live-resizer:hover:after,.live-resizer:focus-visible:after,.shell.resizing .live-resizer:after{background:var(--accent)}.live-resizer:focus-visible{outline:none}@media(max-width:1100px){.livecode{width:340px}}@media(max-width:700px){.shell.learning .learn-resizer,.shell.live .live-resizer,.shell.files-open .files-resizer{display:none}.shell .files{width:auto!important;max-height:40vh;border-inline-end:none;border-bottom:1px solid var(--border)}.shell .learn,.shell .livecode,.columns>.app{width:auto!important;min-width:0}.livecode{height:40vh;height:40dvh;border-inline-start:none;border-top:1px solid var(--border)}.learn-rail{flex-direction:row;justify-content:center;width:auto;padding:4px 0;border-inline-end:none;border-bottom:1px solid var(--border)}.learn-rail span{writing-mode:horizontal-tb}.live-rail{border-inline-start:none;border-bottom:none;border-top:1px solid var(--border)}.columns{flex-direction:column}.editor-rail{border-inline-start:none;border-bottom:1px solid var(--border)}.learn{width:auto;height:45vh;height:45dvh;border-inline-end:none;border-bottom:1px solid var(--border)}.columns>.app,.shell.editor-hidden .livecode{flex:1;min-height:0;height:auto}}@media print{@page{margin:12mm}body>*:not(.print-sheet){display:none!important}body{background:#fff!important}.print-sheet{display:block}.print-sheet svg{display:block;width:100%;height:auto;max-height:100vh}}.learn .term{text-decoration:underline dotted var(--accent);text-decoration-thickness:2px;text-underline-offset:3px;cursor:help;border-radius:3px}.learn .term:focus-visible,.learn .term[aria-expanded=true]{outline:none;background:var(--accent-soft)}.term-tip{position:fixed;z-index:1000;max-width:min(300px,calc(100vw - 16px));padding:8px 10px;background:var(--panel);color:var(--text);border:1px solid var(--border);border-radius:8px;box-shadow:0 4px 16px #0000002e;font-size:14px;line-height:1.4}.term-tip[hidden]{display:none}.learn .ui-pointer{color:var(--accent);font-weight:600;border-bottom:2px solid var(--accent-soft);cursor:pointer;border-radius:3px}.learn .ui-pointer:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.ui-spot{outline:3px solid var(--accent)!important;outline-offset:-3px;box-shadow:inset 0 0 0 9999px var(--accent-faint);animation:ui-spot-pulse 1.2s ease-in-out infinite}@keyframes ui-spot-pulse{50%{outline-color:var(--accent-glow)}}@media(prefers-reduced-motion:reduce){.ui-spot{animation:none}}.learn-graphic{display:block;width:100%;max-width:440px;height:auto;margin:0 auto;border-radius:8px;border:1px solid var(--border)}.lesson-table{overflow-x:auto;margin:8px 0}.lesson-table table{border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums}.lesson-table th,.lesson-table td{border:1px solid var(--border);padding:3px 8px;text-align:start;white-space:nowrap}.lesson-table th{background:var(--bg)}.learn-hints .lesson-note{margin-top:8px}.learn-teacher{margin-top:24px;border-top:1px solid var(--border);padding-top:12px}.learn-teacher summary{cursor:pointer;color:var(--muted)}.learn-teacher input{flex:1;min-width:0}.shell.editor-hidden:not(.live):not(.learning) .files{flex:1 1 0;width:auto!important}.livecode-swing{height:380px}.livecode-swing[hidden]{display:none}.livecode-swing-display{position:relative;flex:1;min-height:0;overflow:hidden;border-radius:6px;background:#e9ecf0}.learn-caesar-stage{display:flex;flex-direction:column;align-items:center;gap:8px}.learn-caesar-disc{width:min(100%,320px);touch-action:none;user-select:none;-webkit-user-select:none}.learn-caesar-disc text{font:600 19px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.learn-caesar-disc .outer-disc{fill:#f3e6c8;stroke:#8a6d3b;stroke-width:3}.learn-caesar-disc .outer-letters text{fill:#3d2f14;cursor:pointer}.learn-caesar-disc .inner{cursor:grab;transition:transform .25s ease}.learn-caesar-disc .inner.dragging{cursor:grabbing;transition:none}.learn-caesar-disc .inner-disc{fill:#6b4f2a;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .inner-letters text{fill:#fff8e8}.learn-caesar-disc .tick{stroke:#8a6d3b;stroke-width:1;opacity:.6}.learn-caesar-disc .hub{fill:#f3e6c8;stroke:#3d2f14;stroke-width:2}.learn-caesar-disc .window{fill:var(--accent-soft);stroke:var(--accent);stroke-width:2.5}.learn-caesar-disc .marked text{fill:var(--accent);font-size:23px}.learn-caesar-disc .inner-letters .marked text{fill:#ffd54a}.learn-caesar-disc .key{font-size:40px;font-weight:700;fill:#3d2f14}.learn-caesar-disc .key-label{font-size:15px;fill:#6e5a33}.learn-caesar-controls,.learn-caesar-mode{display:flex;justify-content:center;gap:8px}.learn-caesar-controls button{min-width:56px;font-size:1.05em}.learn-caesar-mode{margin:10px 0 6px}.learn-caesar-mode button.active{background:var(--accent);border-color:var(--accent);color:#fff}.learn-caesar-fields{display:grid;gap:8px}.learn-caesar-fields label,.learn-caesar-fields>div{display:grid;gap:3px;color:var(--muted);font-size:.9em}.learn-caesar-fields input,.learn-caesar-output{font:600 1.15em ui-monospace,Menlo,Consolas,monospace;letter-spacing:.08em;padding:6px 8px;border:1px solid var(--border);border-radius:8px;color:var(--text);background:var(--panel);overflow-wrap:anywhere}.learn-caesar-output{background:var(--bg)}.learn-rescue-path{display:flex;align-items:center;gap:6px;margin:8px 0 2px}.learn-rescue-ludwig{width:32px;height:32px;border-radius:50%;flex:none}.learn-rescue-dot{flex:1;height:6px;max-width:48px;border-radius:3px;background:var(--border);transition:background .3s}.learn-rescue-dot.done{background:#15803d}.learn-rescue-tower{position:relative;font-size:34px;line-height:1;margin-inline-start:auto}.learn-rescue-zora,.learn-rescue-fox{position:absolute;font-size:15px}.learn-rescue-zora{top:-4px;left:50%;transform:translate(-50%)}.learn-rescue-fox{bottom:-2px;right:-12px;transition:transform .8s,opacity .8s}.learn-rescue.freed .learn-rescue-fox{transform:translate(60px);opacity:0}.learn-rescue.freed .learn-rescue-zora{display:none}.learn-rescue-free{font-size:24px;line-height:1;animation:learn-rescue-jump .6s ease-out 3}@keyframes learn-rescue-jump{50%{transform:translateY(-12px)}}.learn-rescue-answer{display:flex;gap:8px;align-items:center}.learn-rescue-number{width:6ch;font-size:1.1em;padding:6px 8px;text-align:center}.learn-rescue-label{margin:14px 0 4px;color:var(--muted);font-size:.9em}.learn-rescue-alphabet{display:flex;flex-wrap:wrap;gap:2px;margin-bottom:12px}.learn-rescue-letter{display:inline-flex;flex-direction:column;align-items:center;min-width:22px;padding:2px 0;border-radius:4px;background:var(--bg)}.learn-rescue-letter small{font-size:10px;color:var(--muted)}.learn-rescue-letter.hit{background:#fde68a;outline:2px solid #d97706}.learn-rescue-charat{font-weight:600}.learn-rescue-moved{font-weight:400!important}.learn-rescue-word{font:inherit;padding:1px 4px;border:1px solid var(--accent);border-radius:4px}.learn-rescue-gate{padding:8px 0;margin-bottom:8px}.learn-cw{--cw-cell: 30px;display:flex;flex-wrap:wrap;gap:12px 20px;margin-bottom:10px}.learn-cw-grid{display:grid;gap:2px}.learn-cw-cell{position:relative;width:var(--cw-cell);height:var(--cw-cell)}.learn-cw-cell input{width:100%;height:100%;box-sizing:border-box;padding:0;border:1px solid #6e6e73;border-radius:3px;background:#fff;color:#1c1c1e;text-align:center;font:600 16px/1 ui-monospace,SFMono-Regular,Menlo,monospace;text-transform:uppercase}.learn-cw-cell input:disabled{opacity:1;-webkit-text-fill-color:#1c1c1e}.learn-cw-cell.key input{background:#fde68a}.learn-cw-cell.given input{color:#1d4ed8;-webkit-text-fill-color:#1d4ed8}.learn-cw-cell.arrived input{animation:learn-cw-arrive .6s ease-out}.learn-cw-cell input.wrong{border-color:#b91c1c;background:#fee2e2}@keyframes learn-cw-arrive{0%{transform:scale(1.6)}}.learn-cw-number,.learn-cw-keyindex{position:absolute;font-size:8px;line-height:1;pointer-events:none;color:#6e6e73;z-index:1}.learn-cw-number{top:2px;left:2px}.learn-cw-keyindex{bottom:2px;right:2px;color:#b45309}.learn-cw-keyword{margin:8px 0 0;font-weight:600}.learn-cw-keybox{display:inline-block;width:22px;height:24px;margin-inline-end:2px;border-bottom:2px solid #d97706;background:#fef3c7;text-align:center;line-height:24px;white-space:pre}.learn-cw-cluebox{flex:1;min-width:200px}.learn-cw-clues{margin:4px 0 10px;padding-inline-start:24px}.learn-cw-clues li{cursor:pointer}@media(max-width:380px){.learn-cw{--cw-cell: 28px}}.learn-cloze{border:2px solid var(--accent);border-radius:12px;padding:12px 14px;margin:0 0 14px}.learn-cloze-title{display:block;font-size:1.05em;margin-bottom:4px}.learn-cloze p{margin:0 0 8px}.learn-cloze-hint{color:var(--muted);font-size:.9em}.learn-cloze-code{margin:0 0 10px;padding:8px 10px;border-radius:8px;background:var(--bg, #f2f2f7);font-size:13px;line-height:1.9;overflow-x:auto}.learn-cloze-code .ln{white-space:pre;min-height:1.9em}.learn-cloze-gap{font-size:13px;padding:1px 3px;margin:0 1px;min-width:0;max-width:none;border:1px solid #8e8e93;border-bottom-width:2px;border-radius:4px;background:#fff;color:#1c1c1e;text-align:center}.learn-cloze-gap.right{border-color:#34c759;background:#34c75924}.learn-cloze-gap.wrong{border-color:#ff3b30;background:#ff3b301a}.learn-cloze-gap.shown{border-color:#d97706;background:#fef3c7}.learn-cloze-gap:disabled{opacity:1;-webkit-text-fill-color:currentColor}.learn-cloze-actions{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px}.learn-cloze-check{font-weight:600}.learn-cloze-status:empty{display:none}.learn-cloze-status{padding:8px 12px;border-radius:8px;font-weight:600}.learn-cloze-status.right{background:#dcfce7}.learn-cloze-status.wrong{background:#fee2e2}.learn-mark{color:inherit;padding:0 3px;border-radius:3px}.learn-mark.blau{background:#e4f1fd}.learn-mark.orange{background:#ffedd5}.learn-mark.gruen{background:#dcfce7}.learn-mark.gelb{background:#fdf4db}.learn-mark.rosa{background:#fce9f2}.startup-error{max-width:520px;margin:15vh auto 0;padding:0 16px;font:16px/1.5 system-ui,-apple-system,sans-serif;color:var(--text)}.startup-error h1{font-size:22px}.startup-error button{font-size:16px;padding:8px 16px}.startup-error pre{margin-top:24px;color:var(--muted);font-size:12px;white-space:pre-wrap}.visubot-stage{position:relative;height:280px;border:1px solid var(--border);border-radius:8px;overflow:hidden;background:linear-gradient(#dfe9f3,#f6f3ec)}.visubot-live{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot-live:empty{display:none}.visubot-live.connected{color:#0f8a5f;font-weight:600}.visubot-worlds{display:flex;gap:6px;margin:0 0 6px}.visubot-worlds button.active{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-canvas{display:block;width:100%;height:100%;touch-action:none}.visubot-status{font-size:12px;color:var(--muted);margin:6px 0 0}.visubot-controls{margin-top:8px;font-size:13px}.visubot-controls summary{cursor:pointer;font-weight:600}.visubot-controls .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-controls label{display:grid;grid-template-columns:9.5em 1fr 2.5em;align-items:center;gap:6px;margin:2px 0}.visubot-controls output{text-align:end;font-variant-numeric:tabular-nums}.visubot-presses{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}.visubot-presses button{min-width:2.2em}.visubot-presses button.pressed{background:var(--accent);border-color:var(--accent);color:#fff}.visubot-check{margin-top:8px;font-size:13px}.visubot-check summary{cursor:pointer;font-weight:600}.visubot-check .hint{color:var(--muted);font-size:12px;margin:4px 0 6px}.visubot-check-sensors{margin-top:8px;border-collapse:collapse;font-variant-numeric:tabular-nums}.visubot-check-sensors th{text-align:start;font-weight:400;padding:1px 12px 1px 0}.palette-visubot-title{font-size:13px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin:14px 0 6px}.palette-sensor{display:flex;flex-direction:column;align-items:flex-start;gap:2px;border-style:dashed}.palette-sensor code{font-size:12px;color:var(--muted)}.palette-visubot .palette-item{border-color:#a7a0d3;background:color-mix(in srgb,#a7a0d3 16%,transparent)}.visubot-model{margin:12px 0}.visubot-model .visubot-stage{height:300px}.visubot-model-hint{font-size:13px;margin:4px 0 0}.visubot-part-label{position:absolute;pointer-events:none;padding:2px 8px;border-radius:6px;background:#14181ed9;color:#fff;font-size:13px;white-space:nowrap;z-index:1}.robot-part-link{text-decoration:underline 2px #f2b705;text-underline-offset:3px;cursor:pointer}.robot-part-link:hover,.robot-part-link:focus-visible{background:color-mix(in srgb,#f2b705 25%,transparent);outline:none}.visubot-quiz-question{font-size:15px;margin:12px 0 6px}.visubot-quiz-question.done{color:var(--success, #2f9e44)}.visubot-quiz-feedback{min-height:1.4em;margin:6px 0}.visubot-quiz-feedback.right{color:var(--success, #2f9e44)}.visubot-quiz-feedback.wrong{color:var(--danger, #c92a2a)}.diagram-tools .mbot-link{margin-inline-start:auto;height:30px;padding:0 10px;white-space:nowrap}.diagram-tools .mbot-link:not([hidden])+.sim-toggle,.diagram-tools .mbot-upload:not([hidden])+.sim-toggle{margin-inline-start:6px}.diagram-tools .mbot-upload{margin-inline-start:6px;height:30px;padding:0 10px;white-space:nowrap}.mbot-upload-steps{margin:0 0 12px;padding-inline-start:22px;line-height:1.5}.mbot-upload progress{width:100%;height:10px}.mbot-upload-status.done{color:var(--success, #2f9e44);font-weight:600}.settings-mbot-link{display:grid;gap:4px;margin-top:8px}.settings-mbot-link small{font-size:12px;color:var(--muted)}.world-chooser{margin-bottom:4px}.world-hint{display:block;font-size:12px;color:var(--muted);margin-bottom:8px}.start-world{margin-bottom:14px}.robotpreview,.robotpreview-rail,.preview-resizer{display:none}.shell.robot-world.preview .robotpreview{display:flex}.shell.robot-world:not(.preview) .robotpreview-rail{display:flex;border-inline-end:none;border-inline-start:1px solid var(--border)}.robotpreview-rail svg{transform:scaleX(-1)}.shell.robot-world.preview:not(.preview-stacked) .preview-resizer{display:block}.robotpreview{flex:0 1 auto;width:360px;min-width:220px;flex-direction:column;gap:6px;padding:10px 12px 12px;background:var(--panel);border-inline-start:1px solid var(--border);min-height:0;overflow-y:auto}.robotpreview .hint{margin:0;font-size:.85em;color:var(--muted, inherit)}.robotpreview .robotpreview-stage{flex:1 1 auto;height:auto;min-height:160px}.robotpreview .robotpreview-status{margin:0;min-height:1.3em}.robotpreview-height{display:none}.robotpreview.simulation>.visubot-worlds,.robotpreview.simulation>.robotpreview-stage,.robotpreview.simulation>.robotpreview-status,.robotpreview.simulation .robotpreview-play{display:none}.robotpreview .visubot-viewport{display:flex;flex:1 1 auto;flex-direction:column;min-height:0}.robotpreview .visubot-viewport .visubot-stage{flex:1 1 auto;height:auto;min-height:160px}.visubot-elsewhere{display:none;margin:0 0 8px;font-size:12px;color:var(--muted)}.visubot:not(:has(>.visubot-viewport)) .visubot-elsewhere{display:block}.shell.preview-stacked .robotpreview{flex:0 0 auto;width:auto!important;height:320px;min-width:0;margin:4px -12px -12px;padding-top:0;border-inline-start:none;border-top:1px solid var(--border);overflow:visible}.shell.preview-stacked .robotpreview-height{display:block;height:10px;margin:-5px 0 0;cursor:row-resize;touch-action:none;position:relative}.robotpreview-height:after{content:"";position:absolute;inset-inline:0;top:4px;height:2px;background:transparent;transition:background .15s}.robotpreview-height:hover:after,.robotpreview-height:focus-visible:after,.shell.resizing .robotpreview-height:after{background:var(--accent)}.robotpreview-height:focus-visible{outline:none}.preview-resizer{flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.preview-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.preview-resizer:hover:after,.preview-resizer:focus-visible:after,.shell.resizing .preview-resizer:after{background:var(--accent)}.preview-resizer:focus-visible{outline:none}.palette-group{grid-column:1 / -1}.palette-group button{display:flex;align-items:center;gap:6px;width:100%;margin-top:4px;padding:2px 0;border:none;background:none;color:var(--muted);font-size:12px;font-weight:600;text-align:start;cursor:pointer}.palette-group button:before{content:"▾";transition:transform .15s}.palette-group button[aria-expanded=false]:before{transform:rotate(-90deg)}.palette-item[hidden]{display:none}.editor-resizer{display:none;flex:none;width:10px;margin-inline:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.editor-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.editor-resizer:hover:after,.editor-resizer:focus-visible:after,.shell.resizing .editor-resizer:after{background:var(--accent)}.editor-resizer:focus-visible{outline:none}.shell.code-main.live:not(.editor-hidden) .editor-resizer{display:block}.shell.code-main.live:not(.editor-hidden) .live-resizer{display:none}.shell.code-main.live:not(.editor-hidden) .app{flex:0 1 auto;width:460px;min-width:300px}.shell.code-main.live:not(.editor-hidden) .livecode{flex:1 1 0;width:auto!important;min-width:0}.shell.code-main.live:not(.editor-hidden) .livecode{order:1}.shell.code-main.live:not(.editor-hidden) .editor-resizer{order:2}.shell.code-main.live:not(.editor-hidden) .app{order:3;border-inline-start:1px solid var(--border)}.shell.code-main.live:not(.editor-hidden) .live-rail,.shell.code-main.live:not(.editor-hidden) .preview-resizer,.shell.code-main.live:not(.editor-hidden) .robotpreview,.shell.code-main.live:not(.editor-hidden) .robotpreview-rail{order:4}[data-action=swap-main]{font-size:16px;line-height:1}[data-action=swap-main][aria-pressed=true]{color:var(--accent)}.palette-resizer{grid-area:pal;justify-self:end;width:10px;margin-inline-end:-5px;z-index:5;cursor:col-resize;touch-action:none;position:relative}.palette-resizer:after{content:"";position:absolute;inset-block:0;inset-inline-start:4px;width:2px;background:transparent;transition:background .15s}.palette-resizer:hover:after,.palette-resizer:focus-visible:after,.shell.resizing .palette-resizer:after{background:var(--accent)}.palette-resizer:focus-visible{outline:none}.app.simulating .palette-resizer{display:none}:root.visuobject-theme{--bg: #edf4f6;--text: #17292e;--muted: #566a70;--border: #cddde1;--accent: #0e7c86;--accent-soft: rgba(14, 124, 134, .2);--accent-faint: rgba(14, 124, 134, .08);--accent-glow: rgba(14, 124, 134, .35)}.visuobject-obj,.visuobject .brand .logo{color:var(--accent)}.shell.visuobject button.text-button{padding:5px 10px;border:1px solid var(--border);border-radius:8px;background:var(--panel);color:var(--text);font:inherit;cursor:pointer}.shell.visuobject button.text-button:hover{border-color:var(--accent);color:var(--accent)}:root.visuobject-theme{--vo-bar: #e3edf0}.vo-columns{display:grid;grid-template-columns:var(--vo-cols, 260px 1px minmax(0, 45fr) 1px minmax(0, 55fr));flex:1;min-height:0;border-top:1px solid var(--border)}.vo-columns.vo-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.vo-pane{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--panel)}.vo-pane.collapsed>:not(.vo-strip){display:none}.vo-strip{display:none;flex:1;align-items:center;justify-content:center;padding:12px 0;border:0;background:var(--vo-bar);color:var(--muted);font:600 14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;writing-mode:vertical-rl;cursor:pointer}.vo-pane.collapsed>.vo-strip{display:flex}.vo-strip:hover,.vo-strip:focus-visible{color:var(--accent);background:var(--accent-faint);outline:none}.vo-splitter{position:relative;z-index:4;background:var(--border);cursor:col-resize;touch-action:none;outline:none}.vo-splitter:after{content:"";position:absolute;top:0;right:-4px;bottom:0;left:-4px}.vo-splitter:hover,.vo-splitter:focus-visible,.vo-resizing .vo-splitter{background:var(--accent)}.vo-splitter.fixed{cursor:default;background:var(--border)}.vo-bar{display:flex;flex-wrap:wrap;align-items:stretch;min-height:40px;background:var(--vo-bar);border-bottom:1px solid var(--border);font-size:14px}.vo-bar-title{display:flex;flex:1;align-items:center;margin:0;text-transform:none;letter-spacing:normal;padding:0 12px;font-size:14px;font-weight:600;color:var(--text)}.vo-bar-actions{display:flex;flex:0 1 auto;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px;padding:4px 4px 4px 0}.shell.visuobject .vo-bar button.text-button{padding:2px 8px;border-radius:6px}.vo-collapse{padding:0 12px;border:0;background:none;color:var(--muted);font-size:16px;font-weight:700;cursor:pointer}.vo-collapse:hover,.vo-collapse:focus-visible{color:var(--accent)}.vo-tabs{display:flex;flex:1;min-width:0;overflow-x:auto}.vo-tab{display:flex;align-items:stretch;border-right:1px solid var(--border);border-bottom:3px solid transparent}.vo-tab.active{background:var(--panel);border-bottom-color:var(--accent)}.vo-tab [role=tab]{padding:0 4px 0 14px;border:0;background:none;color:var(--text);font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;white-space:nowrap;cursor:pointer}.vo-tab.active [role=tab]{font-weight:700}.vo-tab [role=tab]:hover{color:var(--accent)}.vo-tab-close{padding:0 10px 0 6px;border:0;background:none;color:var(--muted);font-size:15px;cursor:pointer;visibility:hidden}.vo-tab.active .vo-tab-close,.vo-tab:hover .vo-tab-close{visibility:visible}.vo-tab-close:hover{color:var(--accent)}.vo-tab-close .vo-dot,.vo-tab-close.unsaved .vo-x{display:none}.vo-tab-close.unsaved{visibility:visible;color:var(--text)}.vo-tab-close.unsaved .vo-dot{display:inline;font-size:11px}.vo-tab-close.unsaved:hover .vo-dot{display:none}.vo-tab-close.unsaved:hover .vo-x{display:inline}.vo-no-file{display:flex;align-items:center;padding:0 12px;color:var(--muted)}.vo-editor{flex:1;min-height:0;overflow:auto;font-size:14px}.vo-foot{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 12px;padding:6px 12px;border-top:1px solid var(--border);background:var(--vo-bar)}.vo-hint{color:var(--muted);flex:1 1 260px}.vo-canvas{position:relative;flex:1;min-height:0;overflow:auto;background:radial-gradient(circle,var(--border) 1px,transparent 1px) 0 0 / 20px 20px;outline:none}.vo-frames{position:absolute;inset:0 auto auto 0;z-index:0;pointer-events:none;overflow:visible}.vo-package-frame{fill:#0e7c8609;stroke:var(--muted);stroke-width:1.2}.vo-package.current .vo-package-frame{stroke:var(--accent);fill:var(--accent-faint)}.vo-package-name{font:600 12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted)}.vo-package.current .vo-package-name{fill:var(--accent)}.vo-lines{position:absolute;inset:0 auto auto 0;z-index:3;pointer-events:none;overflow:visible}.vo-rel{stroke:var(--text);stroke-width:1.4;fill:none}.vo-rel.ghost{stroke:var(--accent);stroke-dasharray:4 4}.vo-hit{stroke:transparent;stroke-width:12;pointer-events:stroke;cursor:pointer}.vo-relation:hover .vo-rel,.vo-relation:hover .vo-diamond{stroke:var(--accent)}.vo-relation.selected .vo-rel,.vo-relation.selected .vo-diamond{stroke:var(--accent);stroke-width:2.4}.vo-relation.selected .vo-label-svg{fill:var(--accent)}.vo-diamond{fill:var(--panel);stroke:var(--text);stroke-width:1.4}.vo-diamond.filled{fill:var(--text)}.vo-relation.selected .vo-diamond.filled{fill:var(--accent)}.vo-label-svg.name{font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-style:italic;fill:var(--text)}.vo-rel.dashed{stroke-dasharray:6 4}.vo-hollow,.vo-open{fill:none;stroke:var(--text);stroke-width:1.4}.vo-label-svg{font:12px ui-monospace,SF Mono,Menlo,Consolas,monospace;fill:var(--muted);paint-order:stroke;stroke:var(--panel);stroke-width:4px}.vo-empty{margin:24px;max-width:40ch;color:var(--muted)}.vo-status{margin:0;color:#b3261e}.vo-status:empty{display:none}.vo-status.hint{color:var(--accent)}.uml-class{position:absolute;left:16px;top:16px;min-width:150px;background:var(--panel);border:1.5px solid var(--text);font:13px/1.5 ui-monospace,SF Mono,Menlo,Consolas,monospace;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none}.uml-connect{position:absolute;right:-11px;top:50%;width:20px;height:20px;margin-top:-10px;padding:0;border:2px solid var(--panel);border-radius:50%;background:var(--accent);box-shadow:0 1px 4px #00000040;cursor:crosshair;touch-action:none}.uml-connect:after{content:"";position:absolute;top:5px;right:4px;bottom:5px;left:5px;background:#fff;clip-path:polygon(0 35%,55% 35%,55% 0,100% 50%,55% 100%,55% 65%,0 65%)}.uml-class.drop{border-color:var(--accent);box-shadow:0 0 0 4px var(--accent-soft)}.vo-relmenu{position:absolute;z-index:10;display:grid;min-width:220px;padding:6px;background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:0 8px 24px #0000002e;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-relmenu p{margin:2px 8px 6px;color:var(--muted);font-size:12px}.vo-relmenu button{display:flex;align-items:center;gap:10px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:inherit;text-align:left;cursor:pointer}.vo-relmenu button:hover,.vo-relmenu button:focus-visible{background:var(--accent-faint);color:var(--accent);outline:none}.vo-relicon{flex:none}.vo-palette{display:flex;flex-wrap:wrap;align-items:stretch;gap:2px;padding:4px 6px;border-bottom:1px solid var(--border);background:var(--panel)}.vo-palette-sep{width:1px;margin:4px;background:var(--border)}.vo-tool{display:grid;justify-items:center;gap:1px;min-width:44px;padding:3px 3px 2px;border:1px solid transparent;border-radius:7px;background:none;color:var(--text);font:11px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer;touch-action:none;-webkit-user-select:none;user-select:none}.vo-tool:hover{background:var(--accent-faint);color:var(--accent)}.vo-tool[aria-pressed=true]{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.vo-tool[data-tool=class],.vo-tool[data-tool=interface]{cursor:grab}.vo-tool-ghost{position:fixed;z-index:1000;display:grid;justify-items:center;min-width:120px;padding:4px 10px 14px;margin:-14px 0 0 -60px;border:1.5px dashed var(--accent);background:#ffffffe6;font:13px ui-monospace,SF Mono,Menlo,Consolas,monospace;pointer-events:none}.vo-tool-ghost small{color:var(--muted);font-size:11px}.vo-canvas:not([data-tool=select])[data-tool]{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class{cursor:crosshair}.vo-canvas:not([data-tool=select])[data-tool] .uml-class:hover,.uml-class.source{border-color:var(--accent)}.uml-class.source{box-shadow:0 0 0 4px var(--accent-soft)}.vo-stage{position:relative;display:flex;flex:1;min-height:0}.vo-stage .vo-canvas{flex:1}.vo-hsplit{flex:0 0 6px;margin:-3px 0;position:relative;z-index:5;cursor:row-resize;touch-action:none}.vo-hsplit:after{content:"";position:absolute;left:0;right:0;top:2px;height:2px;background:transparent}.vo-hsplit:hover:after,.vo-hsplit:focus-visible:after{background:var(--accent)}.vo-hsplit:focus-visible{outline:none}.vo-dock.collapsed+.vo-hsplit,.vo-hsplit:has(+.vo-dock.collapsed){cursor:default;pointer-events:none}.vo-dock{border-top:1px solid var(--border);background:var(--panel)}.vo-dock-bar{min-height:30px}.vo-dock-bar .vo-bar-title{font-size:13px}.vo-dock.collapsed .vo-inspector{display:none}.vo-inspector{display:grid;align-content:start;gap:8px;height:32vh;overflow:auto;padding:8px 12px 10px;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector-row>label.check,.vo-inspector label.check{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;padding-bottom:6px;color:var(--text);font-size:13px}.vo-inspector input[type=checkbox]{width:auto;margin:0;accent-color:var(--accent)}.vo-inspector fieldset.vo-inspector-ifaces{display:flex;flex-wrap:wrap;gap:4px 14px}.vo-inspector-empty{color:var(--muted)}.vo-inspector-row{display:flex;flex-wrap:wrap;align-items:end;gap:8px 12px}.vo-inspector-row>label{flex:1 1 160px;max-width:260px}.vo-inspector-ends{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:8px}.vo-inspector label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-inspector input,.vo-inspector select{box-sizing:border-box;width:100%;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-inspector input:focus,.vo-inspector select:focus{border-color:var(--accent);outline:2px solid var(--accent-soft)}.vo-inspector fieldset{display:grid;grid-template-columns:minmax(0,1fr) 84px;align-items:start;gap:6px;min-width:0;margin:0;padding:6px 8px 8px;border:1px solid var(--border);border-radius:8px}.vo-inspector fieldset .vo-wide{grid-column:1 / -1}.vo-reading{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;color:var(--muted)}.vo-reading b{color:var(--text)}.shell.visuobject .vo-reading button.text-button{padding:1px 8px;font-size:12px}.vo-inspector legend{padding:0 4px;color:var(--text);font-weight:600}.vo-inspector small{color:var(--muted);font-size:11px}.vo-inspector p{margin:0}.vo-inspector-kind{font-weight:600;padding-top:4px}.shell.visuobject .vo-inspector button.vo-danger{display:inline-flex;align-items:center;justify-self:start;gap:6px;color:#b3261e}.vo-inspector .vo-danger svg{width:15px;height:15px}.vo-insp-head{position:sticky;top:-8px;z-index:1;margin-top:-8px;padding-top:8px;background:var(--panel);display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 12px;border-bottom:1px solid var(--border)}.vo-insp-head .vo-inspector-kind{padding:0}.vo-insp-tabs{display:flex;gap:2px}.shell.visuobject .vo-insp-tabs button{margin-bottom:-1px;padding:5px 12px;border:1px solid transparent;border-bottom:none;border-radius:6px 6px 0 0;background:none;color:var(--muted);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-insp-tabs button[aria-selected=true]{border-color:var(--border);background:var(--panel);color:var(--text);font-weight:600}.vo-members{width:100%;border-collapse:collapse}.vo-members th{padding:0 4px 3px;color:var(--muted);font-size:12px;font-weight:500;text-align:left}.vo-members td{padding:2px 4px;vertical-align:middle}.vo-members td.c{width:52px;text-align:center}.vo-members td:first-child{width:112px}.vo-members td:last-child{width:32px}.vo-members .icon svg{width:15px;height:15px}.vo-doc textarea{box-sizing:border-box;width:100%;max-width:780px;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;resize:vertical}.vo-insp-sep{align-self:stretch;width:1px;margin:0 4px;background:var(--border)}.vo-insp-label{align-self:center;color:var(--muted);font-size:12px}.uml-class.selected{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);z-index:2}.uml-head{display:grid;justify-items:center;padding:4px 10px;font-weight:700}.uml-head small{font-weight:400;font-size:11px;color:var(--muted)}.uml-class.abstract .uml-name,.uml-member.abstract{font-style:italic}.uml-member.static{text-decoration:underline}.uml-class ul{list-style:none;margin:0;padding:3px 0;border-top:1.5px solid var(--text);min-height:12px}.uml-class.selected ul{border-top-color:var(--accent)}.uml-class li{padding:0 10px;white-space:nowrap}.uml-member.selected{background:var(--accent-soft)}.uml-add{color:var(--accent);font-style:italic;cursor:pointer;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:12px}.uml-add:hover{text-decoration:underline}.uml-input{font:inherit;padding:0 4px;margin:0 -5px;border:1px solid var(--accent);border-radius:4px;outline:none;max-width:340px}.uml-tools{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;padding:6px 10px;border-top:1px dashed var(--border);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:default}.uml-tools label{display:inline-flex;gap:4px;align-items:center}.uml-tools button.icon svg{width:16px;height:16px}.vo-ws{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 10px 4px;font-size:13px}.vo-ws[hidden]{display:none}.vo-ws.ask{margin:8px 10px 4px;padding:10px;border:1px solid var(--accent);border-radius:8px;background:var(--bg, #fff)}.vo-ws.ask p{flex-basis:100%;margin:0}.vo-ws.ask .hint{color:var(--muted);font-size:12px;margin-bottom:4px}.vo-ws-name{display:inline-flex;align-items:center;gap:6px;margin-right:auto;font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.shell.visuobject .vo-ws button.text-button{padding:2px 8px;border-radius:6px}.shell.visuobject .vo-ws button.text-button.primary{background:var(--accent);border-color:var(--accent);color:#fff}.vo-lines .vo-end-hit{fill:transparent;pointer-events:all;cursor:context-menu}.vo-lines .vo-label-svg.editable{pointer-events:all;cursor:pointer}.vo-lines .vo-label-svg.editable:hover{fill:var(--accent);text-decoration:underline}.vo-lines .vo-label-svg.placeholder{fill:var(--muted);opacity:.6;font-style:italic}.vo-endpop{position:absolute;z-index:12;display:grid;gap:8px;width:min(330px,calc(100% - 16px));box-sizing:border-box;padding:10px 12px;background:var(--panel);border:1px solid var(--accent);border-radius:10px;box-shadow:0 8px 24px #00000029;font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop p{margin:0}.vo-endpop label{display:grid;gap:3px;color:var(--muted);font-size:12px}.vo-endpop input{box-sizing:border-box;min-width:0;padding:4px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-endpop-row{display:flex;flex-wrap:wrap;align-items:center;gap:4px}.vo-endpop-row>span{flex-basis:100%;color:var(--muted);font-size:12px}.vo-endpop-row button{padding:2px 8px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:12px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.vo-endpop-row button[aria-pressed=true]{background:var(--accent);border-color:var(--accent);color:#fff}.vo-endpop-row input{width:64px}.vo-new{position:relative}.vo-new-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:30;display:grid;min-width:190px;padding:4px;background:var(--panel);border:1px solid var(--border);border-radius:8px;box-shadow:0 8px 24px #00000024}.vo-new-menu[hidden]{display:none}.vo-new-menu button{display:flex;align-items:center;gap:8px;padding:6px 8px;border:0;border-radius:6px;background:none;color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;text-align:left;cursor:pointer}.vo-new-menu button:hover,.vo-new-menu button:focus-visible{background:var(--accent-soft);outline:none}.vo-badge.folder.source{box-shadow:inset 0 3px #ffffff59,inset -5px -4px #8a6d2b}.confirm-card.vo-wizard{display:grid;gap:10px;width:min(520px,100%);max-width:none;max-height:calc(100vh - 32px);overflow:auto;box-sizing:border-box;font:14px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-wizard h2{margin:0;font-size:17px}.vo-wizard .hint{margin:0;color:var(--muted);font-size:13px}.vo-wizard>label{display:grid;grid-template-columns:130px minmax(0,1fr);align-items:center;gap:8px;color:var(--muted);font-size:13px}.vo-wizard input[type=text],.vo-wizard select{box-sizing:border-box;width:100%;min-width:0;padding:5px 7px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:inherit}.vo-wizard fieldset{margin:0;padding:6px 10px 8px;border:1px solid var(--border);border-radius:8px}.vo-wizard legend{padding:0 4px;color:var(--muted);font-size:13px}.vo-wizard-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}.vo-wizard-row select,.vo-wizard-row input[type=text]{width:auto;flex:1 1 160px}.vo-wizard-list{display:grid;gap:4px}.vo-wizard .check{display:inline-flex;align-items:center;gap:6px}.vo-wizard code{font-size:12px}.vo-wizard-error{min-height:1em;margin:0;color:#b3261e;font-size:13px}.vo-wizard .group button.primary{background:var(--accent);border-color:var(--accent);color:#fff}@media(max-width:560px){.vo-wizard>label{grid-template-columns:1fr}}.vo-dirty{color:var(--accent)}.vo-tree-tools{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 4px}.shell.visuobject .vo-tree-tools button.text-button{padding:2px 8px;border-radius:6px}.vo-tree{flex:1;min-height:0;overflow:auto;padding:6px;font:13px/1.3 system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.vo-tree ul{list-style:none;margin:0;padding:0}.vo-row{display:flex;align-items:center;gap:6px;min-height:28px;padding:0 6px 0 calc(4px + var(--depth, 0) * 14px);border-radius:7px;cursor:pointer;-webkit-user-select:none;user-select:none;white-space:nowrap;outline:none}.vo-row:hover{background:var(--accent-faint)}.vo-row:focus-visible{box-shadow:inset 0 0 0 2px var(--accent-soft)}.vo-row.active .vo-label{font-weight:600}.vo-row.selected{background:var(--accent-soft);color:var(--text)}.vo-twisty,.vo-twisty-space{flex:none;width:18px;height:18px}.vo-twisty{display:grid;place-items:center;padding:0;border:0;border-radius:4px;background:none;color:var(--muted);cursor:pointer}.vo-twisty svg{transition:transform .15s ease}[aria-expanded=true]>.vo-row .vo-twisty svg{transform:rotate(90deg)}.vo-twisty:hover{color:var(--accent)}.vo-label{min-width:0;overflow:hidden;text-overflow:ellipsis}.vo-type{color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis}.vo-row .uml-input{margin:0;font:inherit}.vo-row-delete{margin-left:auto;visibility:hidden}.vo-tree button.vo-row-delete{width:24px;height:24px}.vo-tree button.vo-row-delete svg{width:14px;height:14px}.vo-row:hover .vo-row-delete,.vo-row.selected .vo-row-delete{visibility:visible}.vo-tree-empty{padding:6px 10px 6px 52px;color:var(--muted);font-size:12px;white-space:normal}.vo-badge{flex:none;display:inline-grid;place-items:center;width:16px;height:16px;border-radius:4px;font:700 10px/1 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#fff}.vo-badge.project{background:var(--accent);border-radius:5px;box-shadow:inset 0 -5px #0000002e}.vo-badge.project.closed{opacity:.55}.vo-badge.folder{width:17px;height:13px;border-radius:2px 4px 3px 3px;background:#e0a63b;box-shadow:inset 0 3px #ffffff59}.vo-badge.package{width:14px;height:14px;border-radius:3px;background:#b07a2a;transform:rotate(45deg) scale(.82)}.vo-badge.package.empty{background:none;border:1.5px solid #b07a2a}.vo-badge.file{background:#e66a2c;border-radius:3px 6px 3px 3px}.vo-badge.type.class{background:#2f7d32;border-radius:50%}.vo-badge.type.class.abstract{background:#6a9c3a;font-style:italic}.vo-badge.type.interface{background:#7b4fb0;border-radius:50%}.vo-badge.field,.vo-badge.method{width:9px;height:9px;margin:0 3px}.vo-badge.field{border-radius:2px}.vo-badge.method{border-radius:50%}.vo-badge.public{background:#2f9e44}.vo-badge.private{background:#d6453d}.vo-badge.protected{background:#e0a63b}.vo-badge.package.field,.vo-badge.package.method{background:#3b82c4;transform:none;border:0}.vo-badge.static{box-shadow:0 0 0 2px var(--panel),0 0 0 3px currentColor;color:var(--muted)}@media(max-width:760px){.vo-columns{grid-template-columns:1fr;grid-auto-rows:auto;overflow:auto}.vo-splitter{display:none}.vo-explorer:not(.collapsed){height:260px}.vo-code:not(.collapsed){height:320px}.vo-diagram:not(.collapsed){min-height:420px}.vo-pane{border-bottom:1px solid var(--border)}.vo-strip{writing-mode:horizontal-tb;padding:10px}}.shell.visuobject .vo-run-group button.vo-run{color:var(--accent);font-weight:600}.vo-console{display:flex;flex-direction:column;height:32vh;min-height:120px;border-top:1px solid var(--border)}.vo-console[hidden],.vo-swing[hidden]{display:none}.vo-console .vo-dock-bar{gap:10px}.vo-console-status{flex:1;color:var(--muted);font-size:12px}.vo-console-status.error{color:#b3261e}.vo-swing{display:flex;height:60%;padding:6px}.vo-console-lines{flex:1;min-height:0;overflow:auto;margin:0;padding:6px 12px;font-size:13px;white-space:pre-wrap}.uml-note{position:absolute;min-width:120px;max-width:260px;padding:8px 22px 8px 10px;background:#fffbe6;border:1.2px solid var(--text);clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,0 100%);font:13px/1.45 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#17292e;cursor:grab;-webkit-user-select:none;user-select:none;touch-action:none;z-index:1}.uml-note:after{content:"";position:absolute;top:0;right:0;width:14px;height:14px;background:linear-gradient(to bottom left,transparent 50%,#e9dfae 50%);border-left:1.2px solid var(--text);border-bottom:1.2px solid var(--text)}.uml-note.selected{outline:3px solid var(--accent-soft);border-color:var(--accent);clip-path:none}.uml-note .uml-connect{z-index:2}.uml-note-text{white-space:pre-wrap;overflow-wrap:anywhere}.uml-note-text.placeholder{color:#8a8a8a;font-style:italic}.uml-note-edit{box-sizing:border-box;width:220px;border:1px solid var(--accent);background:#fffef5;font:inherit;resize:both}.vo-note-link{stroke-dasharray:5 4}.vo-canvas[hidden],.vo-palette[hidden]{display:none}.vo-diagram-switch{display:flex;gap:2px;padding:2px;border:1px solid var(--border);border-radius:8px;background:var(--panel)}.shell.visuobject .vo-diagram-switch button{padding:3px 10px;border:none;border-radius:6px;background:none;color:var(--muted);font:600 13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif;cursor:pointer}.shell.visuobject .vo-diagram-switch button[aria-selected=true]{background:var(--accent);color:#fff}.vo-obj-palette{align-items:center;gap:8px;padding:6px 10px}.vo-obj-new{display:flex;align-items:center;gap:6px;font-size:13px}.vo-obj-new select{padding:3px 6px;border:1px solid var(--border);border-radius:6px;background:var(--panel);color:var(--text);font:13px system-ui,-apple-system,Segoe UI,Roboto,sans-serif}.uml-object .uml-objname{text-decoration:underline;font-weight:600}.uml-object.unknown{border-style:dashed}.uml-object .uml-member.changed,.vo-objlink.changed{animation:vo-changed 1.2s ease-out}.uml-object .uml-member.changed{background:#fff3b0}@keyframes vo-changed{0%{background:#ffe066}}.vo-obj-values td:first-child{width:auto;white-space:nowrap}.vo-obj-values td:last-child{width:50%}.vo-dbg-controls{display:inline-flex;gap:2px}.vo-dbg-controls[hidden]{display:none}.vo-console-lines .vo-out-err{color:#b3261e}.vo-console-lines .vo-out-in{color:var(--accent);font-weight:600}.vo-console-input{display:flex;align-items:center;gap:6px;padding:4px 12px 8px;color:var(--accent)}.vo-console-input[hidden]{display:none}.vo-console-input input{flex:1;font-size:13px;padding:4px 6px;border:1px solid var(--accent);border-radius:4px}.vo-dbg{display:grid;grid-template-columns:minmax(160px,1fr) minmax(220px,2fr);gap:12px;padding:8px 12px}.vo-dbg h3{margin:0 0 6px;font-size:12px;font-weight:600;color:var(--muted)}.vo-dbg ol{list-style:none;margin:0;padding:0}.vo-dbg-frame{display:block;width:100%;text-align:start;padding:3px 6px;border:0;border-radius:4px;background:none;color:inherit;font:inherit;cursor:pointer}.vo-dbg-frame.on{background:var(--accent-soft)}.vo-dbg-frame small{color:var(--muted)}.vo-dbg-vars tr.changed td{background:#ffd60a59}@media(max-width:760px){.vo-dbg{grid-template-columns:1fr}}.vo-seqcanvas{overflow:auto}.vo-seqcanvas .vo-empty[hidden]{display:none}.vo-seq{display:block;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}.vo-seq-head rect{fill:var(--panel);stroke:var(--text);stroke-width:1.2}.vo-seq-head text{fill:var(--text);text-decoration:underline}.vo-seq-head.static text{text-decoration:none;font-weight:600}.vo-seq-life{stroke:var(--muted);stroke-dasharray:5 4}.vo-seq-bar{fill:var(--panel);stroke:var(--text);stroke-width:1}.vo-seq-bar.running{fill:var(--accent-soft)}.vo-seq-msg{cursor:pointer}.vo-seq-msg line,.vo-seq-msg path{stroke:var(--text);stroke-width:1.2}.vo-seq-msg .head.filled{fill:var(--text)}.vo-seq-msg text{fill:var(--text)}.vo-seq-msg.return line,.vo-seq-msg.create line{stroke-dasharray:6 4}.vo-seq-msg.exception line,.vo-seq-msg.exception text{stroke:#b3261e;fill:#b3261e}.vo-seq-msg.current line,.vo-seq-msg.current path{stroke:#e0a800;stroke-width:2.4}.vo-seq-msg.current .head.filled{fill:#e0a800}.vo-seq-msg.current text{font-weight:700}.vo-seq-msg:hover text{fill:var(--accent)}.vo-seq-more{fill:var(--muted)}.palette-head{display:flex;align-items:center;gap:4px;margin:0 0 4px}.palette-head h2{flex:1;min-width:0;margin:0}.palette-hide{min-height:26px;padding:2px 5px}.app.compact-palette .palette-head{flex-direction:column;gap:2px}.palette-rail{display:none;grid-area:pal;width:auto}.app.palette-hidden .palette,.app.palette-hidden .palette-resizer{display:none}.app.palette-hidden:not(.simulating) .palette-rail{display:flex}@media(max-width:820px){.palette-head{display:none}.app.palette-hidden .palette{display:block}.app.palette-hidden .palette-rail{display:none!important}} diff --git a/website/app/assets/objectApp-BRLr8JxR.js b/website/app/assets/objectApp-70d7xQix.js similarity index 99% rename from website/app/assets/objectApp-BRLr8JxR.js rename to website/app/assets/objectApp-70d7xQix.js index 0c2acb47..377413e4 100644 --- a/website/app/assets/objectApp-BRLr8JxR.js +++ b/website/app/assets/objectApp-70d7xQix.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./projectZip-CPnVPuE_.js","./index-CfA1lalH.js","./index-Bd1TBhw7.css"])))=>i.map(i=>d[i]); -var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-CfA1lalH.js";function Xs(a){const e=[];let t=0;for(;ti.map(i=>d[i]); +var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-B8RBcspd.js";function Xs(a){const e=[];let t=0;for(;te.text===","?", ":e.text).join("")}function ms(a){const e=[[]];let t=0;for(const s of a)s.text==="<"||s.text==="("||s.text==="["||s.text==="{"?t++:(s.text===">"||s.text===")"||s.text==="]"||s.text==="}")&&t--,s.text===","&&t===0?e.push([]):e[e.length-1].push(s);return e.filter(s=>s.length>0)}function ft(a){var t,s;const e=[];for(let i=0;i{const t=ft(e).filter(i=>i.text!=="final"),s=t[t.length-1];return{name:s!=null&&s.word?s.text:"",type:lt(t.slice(0,-1))}})}function kt(a,e,t,s){var x,L;const i=ft(a),n=new Set;let o=0;for(;o"));const r=i.slice(o);if(r.length===0||a.length===0)return[];const c=a[0].from,l=r.findIndex(S=>S.text==="("),h=r.findIndex(S=>S.text==="="),u=l>0&&(h<0||lS.text==="="),y=_<0?g:g.slice(0,_);let w=y.length-1;for(;w>0&&!y[w].word;)w--;if(w<1)return[];const $=lt(y.slice(0,w)),p=m.length>1,v=[];return m.forEach((S,k)=>{var C;const j=S.findIndex(F=>F.text==="="),M=j<0?S:S.slice(0,j),A=k===0?y[w]:M.find(F=>F.word);if(!A)return;const R=M.filter(F=>F.from>A.from&&F.text==="[").length;v.push({kind:"field",name:A.text,type:$+"[]".repeat(R),params:[],visibility:xt(n,f),isStatic:n.has("static"),isAbstract:!1,from:c,to:s,headerFrom:c,headerTo:k===0?((C=M[M.length-1])==null?void 0:C.to)??A.to:A.to,shared:p,nameFrom:A.from,nameTo:A.to})}),v}function Gs(a,e,t){var n;let s=[],i=e;for(;ih.text==="="),c=ye(a,i,"{","}");if(r){s.push(...a.slice(i,c)),i=c;continue}const l=s.map(h=>h.text);l.includes("class")||l.includes("interface")||l.includes("enum")||s.length>0&&t.members.push(...kt(s,t.name,t.kind==="interface",((n=a[c-1])==null?void 0:n.to)??o.to)),s=[],i=c;continue}s.push(o),i++}return t.bodyEnd=a.length>0?a[a.length-1].to:0,i}function oe(a){var n,o,r,c;const e=Xs(a),t=[];let s=[],i=0;for(;iw.text==="class"||w.text==="interface"),f=u>=0?h[u+1]:void 0;if(!(f!=null&&f.word)){i=ye(e,i,"{","}"),s=[];continue}let m=u;for(;m>0&&(fs.has(h[m-1].text)||h[m-1].text==="@");)m--;const g={name:f.text,kind:h[u].text==="interface"?"interface":"class",isAbstract:h.slice(m,u).some(w=>w.text==="abstract"),interfaces:[],members:[],from:((n=s[s.indexOf(h[m])])==null?void 0:n.from)??h[m].from,to:0,headerFrom:((o=s[s.indexOf(h[m])])==null?void 0:o.from)??h[m].from,headerTo:h[h.length-1].to,nameFrom:f.from,nameTo:f.to,bodyEnd:0};let _=u+2;((r=h[_])==null?void 0:r.text)==="<"&&(_=ye(h,_,"<",">"));let y="";for(;_")-1:w.word&&y==="extends"&&g.kind==="class"?g.superclass??(g.superclass=w.text):w.word&&y&&g.interfaces.push(w.text)}i=Gs(e,i+1,g),g.to=((c=e[i-1])==null?void 0:c.to)??a.length,t.push(g),s=[]}return t}function Fe(a){const e=/^([\p{L}_$][\p{L}\p{N}_$]*)(\[\])+$/u.exec(a);if(e)return{name:e[1],many:!0};const t=/^(?:ArrayList|LinkedList|List|Set|HashSet|TreeSet|Collection|Queue|Deque|ArrayDeque|Stack|Vector)<([\p{L}_$][\p{L}\p{N}_$]*)>$/u.exec(a);return t?{name:t[1],many:!0}:{name:a,many:!1}}function Zs(a){const e=new Set(a.map(s=>s.name)),t=[];for(const s of a){s.superclass&&e.has(s.superclass)&&t.push({kind:"extends",from:s.name,to:s.superclass});for(const i of s.interfaces)e.has(i)&&t.push({kind:s.kind==="interface"?"extends":"implements",from:s.name,to:i});for(const i of s.members){if(i.kind!=="field")continue;const n=Fe(i.type);e.has(n.name)&&t.push({kind:"association",from:s.name,to:n.name,role:i.name,multiplicity:n.many?"0..*":"1"})}}return t}function Ge(a){const e=a.params.map(t=>`${t.name}: ${t.type}`).join(", ");return a.kind==="field"?`${a.visibility} ${a.name}: ${a.type}`:a.kind==="constructor"?`${a.visibility} ${a.name}(${e})`:`${a.visibility} ${a.name}(${e}): ${a.type}`}const Qs=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;function Ve(a){var c;let e=a.trim().replace(/;$/,"").trim();if(!e)return;let t;/^[+\-#~]/.test(e)&&(t=e[0],e=e.slice(1).trim());let s=!1;const i=e.split(/\s+/);for(;["static","public","private","protected"].includes(i[0]);){const l=i.shift();l==="static"?s=!0:t??(t=l==="public"?"+":l==="private"?"-":"#")}e=i.join(" ");const n=e.indexOf("(");if(n>=0){const l=e.lastIndexOf(")");if(lg.trim()).filter(Boolean).map(g=>{const _=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(g);if(_)return{name:_[1],type:_[2].replace(/\s+/g,"")};const y=/^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(g);return y?{name:y[2],type:y[1].replace(/\s+/g,"")}:{name:g,type:"int"}});return{kind:"method",visibility:t,name:h,type:u==null?void 0:u.replace(/\s+/g,""),params:m,isStatic:s}}const o=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*(?::\s*(.+))?$/u.exec(e);if(o)return{kind:"field",visibility:t,name:o[1],type:(c=o[2])==null?void 0:c.replace(/\s+/g,""),params:[],isStatic:s};const r=/^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(e);if(r)return{kind:"field",visibility:t,name:r[2],type:r[1].replace(/\s+/g,""),params:[],isStatic:s}}const ei={"+":"public ","-":"private ","#":"protected ","~":""};function ti(a){return/^(int|long|short|byte)$/.test(a)?"0":/^(double|float)$/.test(a)?"0.0":a==="boolean"?"false":a==="char"?"' '":"null"}function bs(a,e,t){const s=e.kind==="interface",i=s?"":ei[a.visibility??(a.kind==="field"?"-":"+")],n=a.isStatic?"static ":"";if(a.kind==="field")return`${i}${n}${a.type??"int"} ${a.name}`;const o=a.params.map(r=>`${r.type} ${r.name}`).join(", ");return a.name===e.name?`${i}${a.name}(${o})`:`${i}${n}${t&&!s?"abstract ":""}${a.type??"void"} ${a.name}(${o})`}const Ue=(a,e)=>a.lastIndexOf(` `,e-1)+1;function mt(a,e,t){const s=Ue(a,e),i=a.slice(s,e);let n=t;for(;n
- ${b(d("web_about_version_fmt").replace("%@","0.13.1"))} + ${b(d("web_about_version_fmt").replace("%@","0.13.3"))}
@@ -315,7 +315,7 @@ public String toString() { `,"in"),this.consolePane().input.hidden=!0,t.vm.input(e),this.debugRun())}debugError(e){var o;const t=e.pos?String(e.pos.line+1):"",s=((o=e.pos)==null?void 0:o.file.split("/").pop())??"",i=e.detail.replace(/^expected:/,""),n={syntax:"web_visuobject_dbg_err_syntax",symbol:"web_visuobject_dbg_err_symbol",unsupported:"web_visuobject_dbg_err_unsupported",nomain:"web_visuobject_no_main",type:"web_visuobject_dbg_err_type",import:"web_visuobject_dbg_err_import",typename:"web_visuobject_dbg_err_typename"}[e.code];e.pos&&this.showLine(e.pos.file,e.pos.line),this.stopDebug(),this.debugStatus(d(n,s,t,i),!0)}showDebugButtons(){const e=this.dbg,t=(e==null?void 0:e.state)==="paused";for(const s of this.shell.querySelectorAll("[data-dbg]"))s.disabled=!e||(s.dataset.dbg==="pause"?e.state!=="running":!t)}showLine(e,t){this.project.files.some(s=>s.path===e)&&e!==this.active&&this.openFile(e),this.editor.setMarks({placeholders:[],problems:[],current:t},!0)}showDebugState(){const e=this.dbg;if(!e)return;e.frames=e.vm.stack();const t=e.vm.heap(),s=e.frames[e.frame];s&&this.showLine(s.pos.file,s.pos.line);const i=e.values.size===0&&e.vars.size===0,n=new Set,o=new Map;for(const h of t)for(const u of h.fields){const f=`dbg${h.id}.${u.name}`;o.set(f,u.value),!i&&e.values.get(f)!==u.value&&n.add(f)}e.values=o;const r=new Set,c=new Map;e.frames.forEach((h,u)=>{for(const f of h.vars){const m=`${e.frames.length-u}|${h.title}|${f.name}`;c.set(m,f.value),!i&&e.vars.get(m)!==f.value&&r.add(`${h.title}|${f.name}`)}}),e.vars=c;const l={objects:this.liveObjects(t),changed:n,frames:e.frames,frame:e.frame,changedVars:r,onFrame:h=>{e.frame=h,l.frame=h;const u=e.frames[h];u&&this.showLine(u.pos.file,u.pos.line),this.objectDiagram.renderInspector()},move:(h,u)=>e.places.set(h,u)};this.objectDiagram.live=l,this.sequence=e.vm.sequence(),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}renderSequence(){var n,o,r;const e=this.shell.querySelector(".vo-seqcanvas"),t=e.querySelector(".vo-seq"),s=e.querySelector(".vo-empty"),i=this.sequence;if(s.hidden=!!i&&i.events.length>0,s.textContent=d(i?"web_visuobject_seq_no_calls":"web_visuobject_seq_empty"),!i||!i.events.length)t.innerHTML="",t.setAttribute("width","0");else{const c=((n=this.dbg)==null?void 0:n.state)==="paused"||((o=this.dbg)==null?void 0:o.state)==="input",{svg:l,width:h,height:u}=Ci(i,c?i.events.length-1:void 0);t.innerHTML=l+(i.truncated?`${b(d("web_visuobject_seq_truncated"))}`:""),t.setAttribute("width",String(h)),t.setAttribute("height",String(u)),c&&((r=t.querySelector(".vo-seq-msg.current"))==null||r.scrollIntoView({block:"nearest",inline:"nearest"}))}this.renderSequenceInspector()}renderSequenceInspector(){if(this.objectDiagram.live)return this.objectDiagram.renderInspector();this.inspector.innerHTML=`

${b(d("web_visuobject_seq_hint"))}

`}liveObjects(e){const t=this.dbg,s=this.project.objects??[],i=c=>40+c.fields.length*20,n=[],o=[],r=[];for(const c of e){const l=`dbg${c.id}`,h=t.places.get(l)??s.find(u=>u.name===c.name&&u.cls===c.cls);if(!h){r.push(c);continue}t.places.set(l,{x:h.x,y:h.y}),n.push({x:h.x,y:h.y,w:260,h:i(c)})}for(const c of r){const l=i(c);let h={x:24,y:24};e:for(let u=24;u<6e3;u+=30)for(let f=24;f<=24+3*320;f+=320)if(n.every(m=>f+260+30<=m.x||m.x+m.w+30<=f||u+l+30<=m.y||m.y+m.h+30<=u)){h={x:f,y:u};break e}t.places.set(`dbg${c.id}`,h),n.push({...h,w:260,h:l})}for(const c of e){const l=`dbg${c.id}`;o.push({id:l,name:c.name,cls:c.cls,...t.places.get(l),values:Object.fromEntries(c.fields.map(h=>[h.name,h.value]))})}return o}stopDebug(e,t=!1){const s=this.dbg;s&&clearTimeout(s.timer),this.dbg=void 0,s&&(this.sequence=s.vm.sequence()),this.objectDiagram.live=void 0,this.consolePane().input.hidden=!0,this.shell.querySelector(".vo-dbg-controls").hidden=!0,this.shell.querySelector("[data-action=stop]").disabled=!0,this.shell.querySelector("[data-action=run]").disabled=!1,t||this.editor.setMarks({placeholders:[],problems:[]},!1),e&&this.debugStatus(d(e),t),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}chooseWorld(e){e!=="object"&&(Us(e),location.href=`${location.pathname}?${e==="on"?"visubot":"visustruct"}${location.hash}`)}get activeFile(){return this.project.files.find(e=>e.path===this.active)}showActive(){const e=this.activeFile;this.editor.setText((e==null?void 0:e.text)??""),this.editor.setBreakpoints(e?this.breakpoints.get(e.path)??[]:[]),this.editor.setReadOnly(!e),e&&!this.openTabs.includes(e.path)&&this.openTabs.push(e.path),this.renderTabs(),J(ot,this.active??"")}renderTabs(){if(this.openTabs=this.openTabs.filter(e=>this.project.files.some(t=>t.path===e)),J(cs,JSON.stringify(this.openTabs)),this.openTabs.length===0){this.tabs.innerHTML=`${b(d("web_visuobject_no_file"))}`;return}this.tabs.innerHTML=this.openTabs.map(e=>{const t=e===this.active,s=this.isDirty(e);return`
-
`}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-CPnVPuE_.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-CPnVPuE_.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} + `}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-BmUSPT6C.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-BmUSPT6C.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} ${s("zip",d("web_visuobject_ws_zip"),"text-button",d("web_visuobject_ws_zip_tip"))} ${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):this.pendingFolder?(e.className="vo-ws",e.innerHTML=`${s("reopen",d("web_visuobject_ws_reopen",this.pendingFolder.name),"text-button primary")}${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):se(rt)==="1"?(e.className="vo-ws",e.innerHTML=s("open",d("web_visuobject_ws_choose"),"text-button",d("web_visuobject_ws_hint"))):(e.className="vo-ws ask",e.innerHTML=`

${b(d("web_visuobject_ws_question"))}

${b(d("web_visuobject_ws_hint"))}

diff --git a/website/app/assets/projectZip-CPnVPuE_.js b/website/app/assets/projectZip-BmUSPT6C.js similarity index 99% rename from website/app/assets/projectZip-CPnVPuE_.js rename to website/app/assets/projectZip-BmUSPT6C.js index cd8a00bc..ad3d8d4b 100644 --- a/website/app/assets/projectZip-CPnVPuE_.js +++ b/website/app/assets/projectZip-BmUSPT6C.js @@ -1 +1 @@ -import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-BRLr8JxR.js";import"./index-CfA1lalH.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; +import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-70d7xQix.js";import"./index-B8RBcspd.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; diff --git a/website/app/assets/pt-PT-BLPvUgTR.js b/website/app/assets/pt-PT-BcL3wukx.js similarity index 99% rename from website/app/assets/pt-PT-BLPvUgTR.js rename to website/app/assets/pt-PT-BcL3wukx.js index 7dc7c151..2b7d7cd2 100644 --- a/website/app/assets/pt-PT-BLPvUgTR.js +++ b/website/app/assets/pt-PT-BcL3wukx.js @@ -661,6 +661,6 @@ const e=`/* Textos que só existem na versão web. Tudo o resto vem dos Localiza "web_visuobject_save_tip" = "Guardar o projeto como .zip: NomeDoProjeto/src/package/Classe.java"; "web_visuobject_open_tip" = "Abrir um projeto (.zip como do Eclipse ou BlueJ) ou juntar ficheiros .java ao projeto"; "web_visuobject_method_ph" = "+ ladrar(): void"; -"web_code_scopes" = "Blocos de código coloridos"; -"web_code_scopes_hint" = "Classe, método, ciclo, decisão em caixas próprias"; +"web_code_scopes" = "Blocos coloridos"; +"web_code_scopes_hint" = "Código e diagrama: ciclo rosa, decisão azul, método amarelo, classe verde"; `;export{e as default}; diff --git a/website/app/assets/robot3d-AYD_3VhA.js b/website/app/assets/robot3d-DrGbnn-t.js similarity index 99% rename from website/app/assets/robot3d-AYD_3VhA.js rename to website/app/assets/robot3d-DrGbnn-t.js index 46de6669..19c2b705 100644 --- a/website/app/assets/robot3d-AYD_3VhA.js +++ b/website/app/assets/robot3d-DrGbnn-t.js @@ -1,4 +1,4 @@ -var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-CfA1lalH.js";/** +var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-B8RBcspd.js";/** * @license * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT diff --git a/website/app/index.html b/website/app/index.html index d384e5bb..f7215e61 100644 --- a/website/app/index.html +++ b/website/app/index.html @@ -6,8 +6,8 @@ VisuStruct Web - - + +
From 8715baabc93225879de0cada03691a6a71d1a2cf Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 30 Oct 2026 16:12:08 +0000 Subject: [PATCH 2/2] Lektion 1: Anweisungen gelb, Sequenz ohne eigene Farbe Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Ugz28U8wYCXi1s1XAhMW6n --- CHANGELOG.md | 2 +- web/lessons/de/01-was-ist-ein-struktogramm.md | 4 ++-- web/lessons/en/01-was-ist-ein-struktogramm.md | 4 ++-- web/lessons/pt/01-was-ist-ein-struktogramm.md | 4 ++-- .../{index-B8RBcspd.js => index-DpeMIv3e.js} | 20 +++++++++---------- ...tApp-70d7xQix.js => objectApp-C6ZS5O9z.js} | 6 +++--- ...Zip-BmUSPT6C.js => projectZip-vbJDEaKJ.js} | 2 +- ...obot3d-DrGbnn-t.js => robot3d-s_ti3AsW.js} | 2 +- website/app/index.html | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) rename website/app/assets/{index-B8RBcspd.js => index-DpeMIv3e.js} (99%) rename website/app/assets/{objectApp-70d7xQix.js => objectApp-C6ZS5O9z.js} (99%) rename website/app/assets/{projectZip-BmUSPT6C.js => projectZip-vbJDEaKJ.js} (99%) rename website/app/assets/{robot3d-DrGbnn-t.js => robot3d-s_ti3AsW.js} (99%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 443aa18e..f72da106 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ The format is loosely inspired by Keep a Changelog. ### Added -- **Web 0.13.3, Struktogramm and Elemente in the code block colours:** the Struktogramm uses the same soft colours as the blocks in Programmieren: statements yellow like the method, loops (for, while, do-until, endless) pink, Verzweigung and Fallauswahl blue; elements inside a loop or branch take its colour, so code and diagram side by side show the matching blocks at a glance. The boxes in „Elemente“ get the same colours. The setting is now called „Blöcke farbig“ and switches code, diagram and Elemente together; a colour stored in the file still wins, and exports stay white. Lesson 1 uses the same colours (sequence yellow, branch blue, loop pink). +- **Web 0.13.3, Struktogramm and Elemente in the code block colours:** the Struktogramm uses the same soft colours as the blocks in Programmieren: statements yellow like the method, loops (for, while, do-until, endless) pink, Verzweigung and Fallauswahl blue; elements inside a loop or branch take its colour, so code and diagram side by side show the matching blocks at a glance. The boxes in „Elemente“ get the same colours. The setting is now called „Blöcke farbig“ and switches code, diagram and Elemente together; a colour stored in the file still wins, and exports stay white. Lesson 1 uses the same colours (statements yellow, branch blue, loop pink; the sequence itself has no colour, it is the row of statements). - **Web 0.13.1, divider between Struktogramm and Programmieren always draggable:** with four open columns (lessons, Struktogramm, Programmieren, „mBot2 live“) the diagram sat at its minimum width and the divider barely moved. Dragging it now first uses the space of the two columns next to it, then takes width from „mBot2 live“, then from the lessons and files columns (down to their minimum widths). Works in both orders after ⇄; all widths are remembered. - **Web 0.13.0, VisuBot simulation in the „mBot2 live“ window:** in the VisuBot world „Simulation starten“ no longer shows a second 3D world in the simulation column; the mBot2 of the simulation drives in the „mBot2 live“ window instead (title „🤖 Simulation“, world buttons and distance/line values there, its own ▶ rests until the simulation ends). The window opens by itself for the simulation and closes again afterwards if it was closed before; if it is closed during the simulation, the 3D world goes back to the simulation column. Controls, variables, console, sensor sliders and the real mBot2 stay in the simulation column. - **Web 0.12.12, misspelled data types:** a misspelled basic type at the start of a declaration (`booelan`, `Int`, `string`, `dobule`) is marked red in Programmieren with „Meintest du boolean?“ and ▶ does not start (like javac); the VisuObject debugger reports it with file and line. Valid types (`Boolean`, `Integer`) and own classes stay untouched. The simulation now runs declarations without a start value (`boolean fertig;`, `int a, b;`) and prints conditions like `System.out.println(b == true)` or `x > 3` as true/false (#195). diff --git a/web/lessons/de/01-was-ist-ein-struktogramm.md b/web/lessons/de/01-was-ist-ein-struktogramm.md index 519f53d7..ea2da15a 100644 --- a/web/lessons/de/01-was-ist-ein-struktogramm.md +++ b/web/lessons/de/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der S ## Baustein 1: Die Sequenz -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.gelb}, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. +Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: **Sequenz**, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen: [Anweisungen]{.gelb} sind gelb, Verzweigungen blau, Schleifen rosa. Die Sequenz hat keine eigene Farbe, sie ist einfach die Reihe von Anweisungen untereinander. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. @@ -90,7 +90,7 @@ Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Tel ## Alle drei zusammen -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.gelb} von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen Anweisungen. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. +Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine Sequenz von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen [Anweisungen]{.gelb}. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. ::: diagramm l1-grundbausteine.visustruct Die Verzweigung erkennst du am Dreieck, die Schleife an der Klammer links. Alles zusammen steht in einer Sequenz. diff --git a/web/lessons/en/01-was-ist-ein-struktogramm.md b/web/lessons/en/01-was-ist-ein-struktogramm.md index 01c39d09..a6b17361 100644 --- a/web/lessons/en/01-was-ist-ein-struktogramm.md +++ b/web/lessons/en/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony ## Building block 1: the sequence -Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.gelb}, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. +Every algorithm can be built from just **three basic building blocks**: **sequence**, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them: [statements]{.gelb} are yellow, branches blue, loops pink. The sequence has no colour of its own, it is simply the row of statements one below the other. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. @@ -90,7 +90,7 @@ As long as the plate is not empty, you take a bite. After that, the plate is cle ## All three together -The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.gelb} from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple statements. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. +The building blocks become really useful when you combine them. This diagram contains all three: a sequence from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple [statements]{.gelb}. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. ::: diagramm l1-grundbausteine.visustruct You recognise the branch by its triangle and the loop by the bracket on the left. Everything together sits in a sequence. diff --git a/web/lessons/pt/01-was-ist-ein-struktogramm.md b/web/lessons/pt/01-was-ist-ein-struktogramm.md index b7abff45..02f8420f 100644 --- a/web/lessons/pt/01-was-ist-ein-struktogramm.md +++ b/web/lessons/pt/01-was-ist-ein-struktogramm.md @@ -32,7 +32,7 @@ Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Univ ## Bloco básico 1: a sequência -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.gelb}, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. +Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: **sequência**, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los: as [instruções]{.gelb} são amarelas, as decisões azuis, os ciclos cor-de-rosa. A sequência não tem cor própria, é simplesmente a fila de instruções umas por baixo das outras. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. @@ -90,7 +90,7 @@ Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levant ## Os três juntos -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.gelb} de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são instruções simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. +Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma sequência de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são [instruções]{.gelb} simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. ::: diagramm l1-grundbausteine.visustruct Reconheces a decisão pelo triângulo e o ciclo pelo parêntese à esquerda. Tudo junto forma uma sequência. diff --git a/website/app/assets/index-B8RBcspd.js b/website/app/assets/index-DpeMIv3e.js similarity index 99% rename from website/app/assets/index-B8RBcspd.js rename to website/app/assets/index-DpeMIv3e.js index 85c3b0e4..74b3971c 100644 --- a/website/app/assets/index-B8RBcspd.js +++ b/website/app/assets/index-DpeMIv3e.js @@ -324,7 +324,7 @@ Määäh, aufgepasst! 1972 waren Nassi und Shneiderman noch Doktoranden an der S ## Baustein 1: Die Sequenz -Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: [**Sequenz**]{.gelb}, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. +Jeder Algorithmus lässt sich aus nur **drei Grundbausteinen** zusammensetzen: **Sequenz**, [**Verzweigung**]{.blau} und [**Wiederholung**]{.rosa}. Die Farben helfen dir beim Zuordnen: [Anweisungen]{.gelb} sind gelb, Verzweigungen blau, Schleifen rosa. Die Sequenz hat keine eigene Farbe, sie ist einfach die Reihe von Anweisungen untereinander. Dieselben Farben siehst du im Editor und später im Code. Du kannst sie in den Einstellungen unter „Blöcke farbig“ ausschalten. In diesem und den nächsten beiden Schritten lernst du sie einzeln kennen. Die **Sequenz** ist der einfachste Baustein: Mehrere Anweisungen werden **nacheinander** ausgeführt, jede genau einmal. @@ -382,7 +382,7 @@ Solange der Teller nicht leer ist, wird ein Bissen gegessen. Danach wird der Tel ## Alle drei zusammen -Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine [Sequenz]{.gelb} von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen Anweisungen. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. +Richtig nützlich werden die Bausteine, wenn man sie kombiniert. Das Diagramm enthält alle drei: eine Sequenz von oben nach unten, eine [Verzweigung]{.blau} und eine [Schleife]{.rosa}. Gelb sind die einfachen [Anweisungen]{.gelb}. Was in einer Verzweigung oder Schleife steht, bekommt deren Farbe. Genau genommen ist das ganze Diagramm eine Sequenz, denn auch Verzweigung und Schleife stehen in der Reihe von oben nach unten. ::: diagramm l1-grundbausteine.visustruct Die Verzweigung erkennst du am Dreieck, die Schleife an der Klammer links. Alles zusammen steht in einer Sequenz. @@ -11406,7 +11406,7 @@ Baaah, listen up! In 1972 Nassi and Shneiderman were still PhD students at Stony ## Building block 1: the sequence -Every algorithm can be built from just **three basic building blocks**: [**sequence**]{.gelb}, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. +Every algorithm can be built from just **three basic building blocks**: **sequence**, [**branch**]{.blau} and [**loop**]{.rosa}. The colours help you match them: [statements]{.gelb} are yellow, branches blue, loops pink. The sequence has no colour of its own, it is simply the row of statements one below the other. You see the same colours in the editor and later in the code. You can switch them off in the settings under “Colored blocks”. In this step and the next two you get to know them one by one. The **sequence** is the simplest building block: several statements run **one after another**, each exactly once. @@ -11464,7 +11464,7 @@ As long as the plate is not empty, you take a bite. After that, the plate is cle ## All three together -The building blocks become really useful when you combine them. This diagram contains all three: a [sequence]{.gelb} from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple statements. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. +The building blocks become really useful when you combine them. This diagram contains all three: a sequence from top to bottom, a [branch]{.blau} and a [loop]{.rosa}. The yellow boxes are simple [statements]{.gelb}. Whatever stands inside a branch or a loop takes its colour. Strictly speaking, the whole diagram is a sequence, because the branch and the loop also stand in the row from top to bottom. ::: diagramm l1-grundbausteine.visustruct You recognise the branch by its triangle and the loop by the bracket on the left. Everything together sits in a sequence. @@ -22484,7 +22484,7 @@ Méééé, ouve bem! Em 1972, Nassi e Shneiderman ainda eram doutorandos na Univ ## Bloco básico 1: a sequência -Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: [**sequência**]{.gelb}, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. +Qualquer algoritmo pode ser construído com apenas **três blocos básicos**: **sequência**, [**decisão**]{.blau} e [**ciclo**]{.rosa}. As cores ajudam-te a associá-los: as [instruções]{.gelb} são amarelas, as decisões azuis, os ciclos cor-de-rosa. A sequência não tem cor própria, é simplesmente a fila de instruções umas por baixo das outras. Vês as mesmas cores no editor e mais tarde no código. Podes desligá-las nas definições em “Blocos coloridos”. Neste passo e nos dois seguintes vais conhecê-los um a um. A **sequência** é o bloco mais simples: várias instruções são executadas **uma a seguir à outra**, cada uma exatamente uma vez. @@ -22542,7 +22542,7 @@ Enquanto o prato não estiver vazio, dás uma garfada. Depois, o prato é levant ## Os três juntos -Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma [sequência]{.gelb} de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são instruções simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. +Os blocos básicos tornam-se realmente úteis quando os combinas. Este diagrama contém os três: uma sequência de cima para baixo, uma [decisão]{.blau} e um [ciclo]{.rosa}. As caixas amarelas são [instruções]{.gelb} simples. O que está dentro de uma decisão ou de um ciclo fica com a cor dela. Em rigor, o diagrama todo é uma sequência, porque a decisão e o ciclo também estão na fila de cima para baixo. ::: diagramm l1-grundbausteine.visustruct Reconheces a decisão pelo triângulo e o ciclo pelo parêntese à esquerda. Tudo junto forma uma sequência. @@ -60311,7 +60311,7 @@ ${l}`)}La=kB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const

${Ae(p("simulation_trace"))}

${Ae(p("simulation_variables"))}

${Ae(p("simulation_output"))}

- `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Ae(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(qh(u)):m.textContent=we(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Ae(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...Qh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Ae(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function qh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,oD="http://www.w3.org/2000/svg";function Me(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(oD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function lD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function uD(i,e){let t=i,n=!1,a=-t*Jn;const s=Me("section",{class:"learn-game learn-caesar"});s.append(Me("div",{class:"learn-game-head"},Me("strong",{},p("web_learn_caesar_title")))),s.append(Me("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:mD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let O=0;O{o.cells.forEach((L,E)=>L.classList.toggle("marked",E===O)),u.cells.forEach((L,E)=>L.classList.toggle("marked",O!==void 0&&E===(O+t)%26))},_=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),S.textContent=lD(y.value,n?-t:t)||" ";const O=Array.from(y.value.toUpperCase()).reverse().find(E=>f1.includes(E));if(O===void 0)return k();const L=f1.indexOf(O);k(n?(L-t+26)%26:L)},T=O=>{t=(O%26+26)%26,a=-t*Jn,_()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var O;n&&(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!1,_()}),x.addEventListener("click",()=>{var O;n||(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!0,_()}),y.addEventListener("input",_),o.cells.forEach((O,L)=>O.addEventListener("click",()=>k(L)));let j;const C=O=>{const L=r.getBoundingClientRect();return Math.atan2(O.clientY-(L.top+L.height/2),O.clientX-(L.left+L.width/2))*180/Math.PI};l.addEventListener("pointerdown",O=>{const L=O;j=C(L)-a,l.classList.add("dragging"),r.setPointerCapture(L.pointerId),L.preventDefault()}),r.addEventListener("pointermove",O=>{if(j===void 0)return;a=C(O)-j,l.setAttribute("transform",`rotate(${a})`);const L=Math.round(-a/Jn);if((L%26+26)%26!==t){t=(L%26+26)%26;const E=a;_(),a=E,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),_(),s}function mD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),Uh=new WeakMap;function $h(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=q(async()=>{const{Robot3D:c}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return Uh.set(a,m),m}function cD(i,e,t=!1){return $h(i,e,t).box}function dD(i){const e=i.querySelector(".visubot-model"),t=e&&Uh.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function hD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=$h([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(y=>{window.clearTimeout(y),window.clearInterval(y)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const y=V("button",{class:"primary"},o+1{o++,o{const y=i.rounds[o],w=i.seconds,S=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),k=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,S),_=V("div",{class:"learn-game-feedback",role:"status"}),T=y.code.split(` + `;const e=a=>this.element.querySelector(a);this.buttons={play:e("[data-sim=play]"),pause:e("[data-sim=pause]"),step:e("[data-sim=step]"),stop:e("[data-sim=stop]")},this.buttons.play.addEventListener("click",()=>this.play()),this.buttons.pause.addEventListener("click",()=>this.pause()),this.buttons.step.addEventListener("click",()=>this.step()),this.buttons.stop.addEventListener("click",()=>this.reset()),this.editButton=e(".sim-edit"),this.editButton.addEventListener("click",()=>this.onEdit());const t=e("[data-sim=highlight]");t.value=this.highlightMode,t.addEventListener("change",()=>{this.highlightMode=t.value,Vu(Hu,this.highlightMode)});const n=e("[data-sim=delay]");n.value=this.delay,n.addEventListener("change",()=>{this.delay=n.value,Vu(fr,this.delay)}),this.inputSection=e(".sim-input > div"),this.trace=e(".sim-trace"),this.variables=e(".sim-vars"),this.output=e(".sim-output"),this.notice=e(".sim-notice")}collectOutput(){const e=this.engine.state.outputLines;for(;this.printedr.localeCompare(o));if(n.length===0)this.variables.innerHTML=`

${Ae(p("simulation_variables_placeholder"))}

`;else{const r=document.createElement("table");for(const o of n){const l=r.insertRow();l.insertCell().textContent=o;const u=e.variables.get(o),m=l.insertCell();u.kind==="grid"?m.append(qh(u)):m.textContent=we(u)}this.variables.replaceChildren(r)}e.outputLines.length===0&&e.files.size===0?this.output.innerHTML=`

${Ae(p("simulation_output_placeholder"))}

`:(this.output.replaceChildren(...e.outputLines.map(r=>{const o=document.createElement("div");return o.textContent=r,o}),...Qh(e.files)),this.output.scrollTop=this.output.scrollHeight)}updateInput(){const e=this.engine.state.inputRequest,t=this.inputSection;if(t.parentElement.classList.toggle("active",!!e),!e){t.innerHTML=`

${Ae(p("simulation_input_placeholder"))}

`;return}let n=t.querySelector("form");if(!n){n=document.createElement("form"),n.innerHTML=`

`;const l=n.querySelector("input");n.addEventListener("submit",u=>{u.preventDefault(),this.submitInput(l)}),t.replaceChildren(n),requestAnimationFrame(()=>l.focus())}const a=this.engine.state.outputLines;n.querySelector(".sim-prompt").textContent=e.prompt||(a[a.length-1]??"");const s=n.querySelector("input");s.inputMode=e.valueType==="string"||e.valueType==="boolean"?"text":"decimal";const r=this.engine.state.inputErrorNotice,o=n.querySelector(".sim-input-error");o.textContent=r?Kn(r):"",o.hidden=!r}}function qh(i){const e=document.createElement("table");e.className="sim-grid";for(const t of i.value){const n=e.insertRow();for(const a of t){const s=n.insertCell();s.textContent=String(a),a===!0&&(s.className="sim-grid-true")}}return e}const f1=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZ"),Jn=360/f1.length,oD="http://www.w3.org/2000/svg";function Me(i,e={},...t){const n=document.createElement(i);for(const[a,s]of Object.entries(e))n.setAttribute(a,s);return n.append(...t),n}function ft(i,e={},t){const n=document.createElementNS(oD,i);for(const[a,s]of Object.entries(e))n.setAttribute(a,String(s));return t!==void 0&&(n.textContent=t),n}function lD(i,e){const t=(e%26+26)%26;return Array.from(i).map(n=>{const a=n.charCodeAt(0);return a>=65&&a<=90?String.fromCharCode((a-65+t)%26+65):a>=97&&a<=122?String.fromCharCode((a-97+t)%26+97):n}).join("")}function Qu(i,e){const t=ft("g",{class:e}),n=f1.map((a,s)=>{const r=ft("g",{transform:`rotate(${s*Jn})`});return r.append(ft("text",{x:0,y:-i,"text-anchor":"middle","dominant-baseline":"central"},a)),t.append(r),r});return{group:t,cells:n}}function uD(i,e){let t=i,n=!1,a=-t*Jn;const s=Me("section",{class:"learn-game learn-caesar"});s.append(Me("div",{class:"learn-game-head"},Me("strong",{},p("web_learn_caesar_title")))),s.append(Me("p",{class:"learn-game-status"},p("web_learn_caesar_hint")));const r=ft("svg",{viewBox:"-200 -200 400 400",class:"learn-caesar-disc",role:"img"});r.append(ft("circle",{r:196,class:"outer-disc"})),r.append(ft("path",{d:mD(196,92,Jn/2),class:"window"}));const o=Qu(168,"outer-letters");r.append(o.group);for(let O=0;O{o.cells.forEach((L,E)=>L.classList.toggle("marked",E===O)),u.cells.forEach((L,E)=>L.classList.toggle("marked",O!==void 0&&E===(O+t)%26))},_=()=>{m.textContent=String(t),l.setAttribute("transform",`rotate(${a})`),r.setAttribute("aria-label",p("web_learn_caesar_key_fmt",t)),b.textContent=p(n?"web_learn_caesar_secret":"web_learn_caesar_plain"),w.textContent=p(n?"web_learn_caesar_plain":"web_learn_caesar_secret"),f.classList.toggle("active",!n),x.classList.toggle("active",n),S.textContent=lD(y.value,n?-t:t)||" ";const O=Array.from(y.value.toUpperCase()).reverse().find(E=>f1.includes(E));if(O===void 0)return k();const L=f1.indexOf(O);k(n?(L-t+26)%26:L)},T=O=>{t=(O%26+26)%26,a=-t*Jn,_()};c.addEventListener("click",()=>T(t-1)),d.addEventListener("click",()=>T(t+1)),f.addEventListener("click",()=>{var O;n&&(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!1,_()}),x.addEventListener("click",()=>{var O;n||(y.value=((O=S.textContent)==null?void 0:O.trim())??""),n=!0,_()}),y.addEventListener("input",_),o.cells.forEach((O,L)=>O.addEventListener("click",()=>k(L)));let j;const C=O=>{const L=r.getBoundingClientRect();return Math.atan2(O.clientY-(L.top+L.height/2),O.clientX-(L.left+L.width/2))*180/Math.PI};l.addEventListener("pointerdown",O=>{const L=O;j=C(L)-a,l.classList.add("dragging"),r.setPointerCapture(L.pointerId),L.preventDefault()}),r.addEventListener("pointermove",O=>{if(j===void 0)return;a=C(O)-j,l.setAttribute("transform",`rotate(${a})`);const L=Math.round(-a/Jn);if((L%26+26)%26!==t){t=(L%26+26)%26;const E=a;_(),a=E,l.setAttribute("transform",`rotate(${a})`)}});const P=()=>{j!==void 0&&(j=void 0,l.classList.remove("dragging"),T(t))};return r.addEventListener("pointerup",P),r.addEventListener("pointercancel",P),_(),s}function mD(i,e,t){const n=(a,s)=>{const r=(s-90)*Math.PI/180;return`${(a*Math.cos(r)).toFixed(2)} ${(a*Math.sin(r)).toFixed(2)}`};return`M ${n(i,-t)} A ${i} ${i} 0 0 1 ${n(i,t)} L ${n(e,t)} A ${e} ${e} 0 0 0 ${n(e,-t)} Z`}const t0=i=>p(`web_visubot_part_${i}`),Uh=new WeakMap;function $h(i,e,t,n){const a=document.createElement("div");a.className="visubot-model";const s=document.createElement("div");s.className="visubot-stage";const r=document.createElement("div");r.className="visubot-part-label",r.hidden=!0,s.append(r);const o=(c,d,h)=>{r.hidden=!1,r.textContent=t0(c),r.style.left=`${Math.min(d+12,s.clientWidth-140)}px`,r.style.top=`${h+12}px`},l=document.createElement("p");l.className="visubot-model-hint hint",l.textContent=p("web_visubot_tap_part"),l.hidden=!!n,a.append(s,l);const u=q(async()=>{const{Robot3D:c}=await import("./robot3d-s_ti3AsW.js");return{Robot3D:c}},[],import.meta.url).then(({Robot3D:c})=>{const d=new c(s);d.showcase(),d.highlight(i),i.includes("leds")&&d.setLed([40,90,255]),d.focusOn([],e==="unten"||e==="bottom"?"":e,!1,1),d.focusOn(i,e,t);let h;return s.addEventListener("pointerdown",g=>h={x:g.clientX,y:g.clientY}),s.addEventListener("pointerup",g=>{if(!h||Math.hypot(g.clientX-h.x,g.clientY-h.y)>5)return;const f=d.partAt(g.clientX,g.clientY);if(!f)return;if(n)return n(f);d.highlight(f);const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointermove",g=>{if(g.pointerType!=="mouse"||n)return;const f=d.partAt(g.clientX,g.clientY);if(r.hidden=!f,!f)return;const x=s.getBoundingClientRect();o(f,g.clientX-x.left,g.clientY-x.top)}),s.addEventListener("pointerleave",()=>r.hidden=!0),d}).catch(c=>{console.error(c),s.textContent=p("web_visubot_no_3d")}),m={box:a,ready:u,focus:i,view:e};return Uh.set(a,m),m}function cD(i,e,t=!1){return $h(i,e,t).box}function dD(i){const e=i.querySelector(".visubot-model"),t=e&&Uh.get(e);for(const n of i.querySelectorAll("[data-robot-part]")){const a=(n.dataset.robotPart??"").split(",").filter(Boolean);if(n.title=a.map(t0).join(", "),!t)continue;const s=()=>void t.ready.then(o=>o==null?void 0:o.highlight(a)),r=()=>void t.ready.then(o=>o==null?void 0:o.highlight(t.focus));n.addEventListener("mouseenter",s),n.addEventListener("focus",s),n.addEventListener("mouseleave",r),n.addEventListener("blur",r),n.addEventListener("click",()=>{t.ready.then(o=>{o==null||o.highlight(a),o==null||o.focusOn(a,t.view)}),t.box.scrollIntoView({block:"nearest",behavior:"smooth"})})}}function hD(i,e){let t=0;const n=document.createElement("div");n.className="visubot-quiz-question";const a=document.createElement("p");a.className="visubot-quiz-feedback",a.setAttribute("aria-live","polite");const s=()=>{n.innerHTML=kn(`**${t+1}/${i.length}** ${i[t].question}`)},r=$h([],void 0,!1,l=>{if(!(t>=i.length)){if(r.ready.then(u=>u==null?void 0:u.highlight(l)),l!==i[t].part){a.className="visubot-quiz-feedback wrong",a.textContent=p("web_visubot_quiz_wrong_fmt",t0(l));return}t++,a.className="visubot-quiz-feedback right",t{u.forEach(y=>{window.clearTimeout(y),window.clearInterval(y)}),u=[]},c=()=>{a.textContent=`${p("web_game_round_fmt",o+1,r)} · ${p("web_game_score_fmt",l)}`},d=()=>{const y=V("button",{class:"primary"},o+1{o++,o{const y=i.rounds[o],w=i.seconds,S=V("div",{class:"learn-bomb-fuse"},V("span",{})),z=V("span",{class:"learn-bomb-time"}),k=V("div",{class:"learn-bomb","aria-live":"polite"},V("span",{class:"learn-bomb-icon","aria-hidden":"true"},"💣"),z,S),_=V("div",{class:"learn-game-feedback",role:"status"}),T=y.code.split(` `).map((E,Q)=>{const $=V("button",{class:"ln",type:"button"},E||" ");return $.disabled=!E.trim(),$.addEventListener("click",()=>O(Q+1===y.wrongLine?"right":"wrong",$)),$}),j=V("div",{class:"learn-game-code learn-bomb-code mono",dir:"ltr"},...T),C=Date.now(),P=()=>{if(!t.isConnected&&Date.now()-C>1e3)return m();const E=Math.max(0,w-(Date.now()-C)/1e3);z.textContent=p("web_game_time_fmt",Math.ceil(E)),S.firstChild.style.width=`${E/w*100}%`,k.classList.toggle("hurry",E<=5),E<=0&&O("time")},O=(E,Q)=>{m(),T.forEach((Te,xe)=>{Te.disabled=!0,xe+1===y.wrongLine&&Te.classList.add("right")}),Q&&E==="wrong"&&Q.classList.add("wrong");const $=E==="right";$&&l++,c(),k.classList.add($?"defused":"boom"),k.firstChild.textContent=$?"✂️":"💥",_.className=`learn-game-feedback ${$?"right":"wrong"}`;const he=d();_.replaceChildren(V("p",{},p($?"web_game_defused":E==="time"?"web_game_boom_time":"web_game_boom_wrong")),Nn("div",{class:"learn-game-explain"},y.explanation),V("p",{class:"learn-bomb-fix"},`${p("web_game_fix")} `,V("code",{},y.fix.trim())),he),he.focus({preventScroll:!0})};s.replaceChildren(k,Nn("p",{class:"learn-game-question"},y.question),j,_),P();const L=window.setInterval(P,200);u.push(L)},g=()=>{const y=i.rounds[o],w=[];y.code.trim()&&w.push(Uu(y.code).element),w.push(Nn("p",{class:"learn-game-question"},y.question),V("p",{class:"learn-order-hint"},p("web_game_order_hint")));const S=V("div",{class:"learn-game-options learn-order"}),z=V("div",{class:"learn-game-feedback",role:"status"});let k=0;const _=pD(y.options.length).map(j=>{const C=V("span",{class:"learn-order-badge","aria-hidden":"true"}),P=V("span",{});P.innerHTML=Re(y.options[j].text);const O=V("button",{},C,P);return O.addEventListener("click",()=>{if(j!==k)return O.classList.add("wrong"),T(!1);O.classList.add("right"),C.textContent=String(++k),O.disabled=!0,k===y.options.length&&T(!0)}),S.append(O),{k:j,b:O,badge:C}}),T=j=>{for(const{k:P,b:O,badge:L}of[..._].sort((E,Q)=>E.k-Q.k))O.disabled=!0,L.textContent=String(P+1),S.append(O);j&&l++,c(),z.className=`learn-game-feedback ${j?"right":"wrong"}`;const C=d();z.replaceChildren(V("p",{},p(j?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation),C),C.focus({preventScroll:!0})};s.replaceChildren(...w,S,z)},f=()=>{if(m(),i.kind==="bombe"||i.kind==="reihenfolge"){c(),i.kind==="bombe"?h():g();return}const y=i.rounds[o];c();const w=Uu(y.code),S=[];let z;i.kind==="zuhoerer"?(z=fD(Dh(y.code),w),S.push(V("div",{class:"learn-swing-row"},w.element,z.element)),y.clicks.length&&S.push(V("p",{class:"learn-swing-clicks"},`${p("web_game_clicks")} `,...y.clicks.flatMap((C,P)=>[...P?[" → "]:[],V("code",{},C)])))):y.code.trim()&&S.push(w.element),S.push(Nn("p",{class:"learn-game-question"},y.question));const k=V("div",{class:`learn-game-options ${i.kind==="layout"?"pictures":""}`}),_=V("div",{class:"learn-game-feedback",role:"status"}),T=y.options.map(C=>{const P=V("button",{});return i.kind==="layout"?P.append(bD(C.text)):C.text.includes(` `)?P.append(xD(C.text)):P.innerHTML=Re(C.text),P.addEventListener("click",()=>j(C.right,P)),k.append(P),P}),j=(C,P)=>{T.forEach((L,E)=>{L.disabled=!0,y.options[E].right&&L.classList.add("right")}),C||P.classList.add("wrong"),C&&l++,c(),_.className=`learn-game-feedback ${C?"right":"wrong"}`;const O=d();_.replaceChildren(V("p",{},p(C?"web_game_right":"web_game_wrong_short")),Nn("div",{class:"learn-game-explain"},y.explanation)),_.append(O),z&&(u=z.replay(y.clicks,()=>O.before(V("p",{class:"learn-swing-try"},p("web_game_try"))))),O.focus({preventScroll:!0})};s.replaceChildren(...S,k,_)},x=()=>{m(),a.textContent="";const y=V("button",{class:"primary"},p("web_game_again"));y.addEventListener("click",()=>{o=l=0,f()}),s.replaceChildren(V("p",{class:"learn-game-result"},p("web_game_done_fmt",l,r)),V("p",{},p(l===r?"web_game_perfect":l>=r*.7?"web_game_good":"web_game_practice_short")),y)},b=V("button",{class:"primary"},p("web_game_start"));return b.addEventListener("click",f),s.append(Nn("p",{},i.intro),b),t}function pD(i){const e=[...Array(i).keys()];for(;e.every((t,n)=>t===n);)for(let t=i-1;t>0;t--){const n=Math.floor(Math.random()*(t+1));[e[t],e[n]]=[e[n],e[t]]}return e}function Uu(i){const e=i.split(` `).map(n=>V("div",{class:"ln"},n||" "));return{element:V("pre",{class:"learn-game-code mono",dir:"ltr"},...e),highlight(n,a){e.forEach((s,r)=>s.classList.toggle("hit",n!==void 0&&r>=n&&r<=(a??n)))}}}function fD(i,e){const t=Zh(i),n=V("div",{class:"learn-swing-window",dir:"ltr"});n.append(V("div",{class:"learn-swing-title"},i.title||" "));const a=V("div",{class:"learn-swing-body"}),s=new Map;for(const c of i.labels){const d=V("div",{class:"learn-swing-label"},t.texts[c.name]);s.set(c.name,d),a.append(d)}const r=i.buttons.map(c=>{const d=V("button",{class:"learn-swing-button",disabled:""},t.texts[c.name]);return s.set(c.name,d),a.append(d),d}),o=V("p",{class:"learn-swing-event",role:"status"}),l=V("pre",{class:"learn-swing-console mono",hidden:""});n.append(a,o,l);const u=c=>{var h,g;const d=s.get(c.button);d.classList.add("pressed"),window.setTimeout(()=>d.classList.remove("pressed"),350),e.highlight((h=c.listener)==null?void 0:h.from,(g=c.listener)==null?void 0:g.to),o.textContent=c.listener?p("web_game_event_fmt",d.textContent??""):p("web_game_nobody"),o.className=`learn-swing-event ${c.listener?"heard":"nobody"}`;for(const[f,x]of Object.entries(c.texts)){const b=s.get(f);b&&b.textContent!==x&&(b.textContent=x,b.classList.remove("changed"),b.offsetWidth,b.classList.add("changed"))}c.console.length&&(l.hidden=!1,l.textContent+=c.console.map(f=>`${f} @@ -60326,7 +60326,7 @@ ${l}`)}La=kB(((o=e.find(([l])=>l==="begriffe.md"))==null?void 0:o[1])??"")}const ${a}`));this.body.append(s),this.foldReference(s)}}foldReference(e){const t="visustruct.reference.open";let n=[];try{n=JSON.parse(localStorage.getItem(t)??"[]")}catch{}for(const a of[...e.querySelectorAll("h2")]){const s=a.textContent??"",r=A("details",{class:"reference-group"});r.open=n.includes(s);const o=A("summary",{},s);for(a.replaceWith(r),r.append(o);r.nextSibling&&r.nextSibling.nodeName!=="H2";)r.append(r.nextSibling);r.addEventListener("toggle",()=>{n=r.open?[...new Set([...n,s])]:n.filter(l=>l!==s);try{localStorage.setItem(t,JSON.stringify(n))}catch{}})}}showReference(){this.tab="reference",this.persist(),this.render()}persist(){ge.setView({tab:this.tab,lesson:this.lessonId,task:this.taskId})}openLesson(e){this.tab="lessons",this.lessonId=e,this.returnTo=void 0,this.persist(),this.render(),this.body.scrollTop=0}renderLessonList(){this.body.append(A("p",{class:"hint"},p("web_learn_intro")));for(const e of PD()){this.body.append(A("h3",{class:"learn-section"},e.name));const t=A("ol",{class:"learn-list"});for(const n of e.lessons){const a=ge.lesson(n.id),s=a.done?"✓":a.step>0?p("web_learn_step_of_fmt",a.step+1,n.steps.length):"",r=A("button",{class:"learn-item"+(a.done?" done":""),"data-lesson":n.id},A("span",{class:"learn-num"},String(n.number)),A("span",{class:"learn-item-text"},A("strong",{},n.robot?`🤖 ${n.title}`:n.title),A("small",{},n.summary)),A("span",{class:"learn-status"},s));r.addEventListener("click",()=>this.openLesson(n.id)),t.append(A("li",{},r))}this.body.append(t)}this.body.append(this.renderTeacherBox())}renderLesson(e){var c;const t=ge.lesson(e.id),n=Math.min(t.step,e.steps.length-1),a=e.steps[n],s=A("button",{class:"learn-back"},`← ${p("web_learn_all_lessons")}`);s.addEventListener("click",()=>this.openLesson(void 0));const r=A("nav",{class:"learn-progress","aria-label":p("web_learn_step_of_fmt",n+1,e.steps.length)});r.append(...e.steps.map((d,h)=>{const g=p("web_learn_step_fmt",h+1,d.title),f=hthis.goToStep(e,h)),x})),this.body.append(s,A("p",{class:"learn-kicker"},`${p("web_learn_lesson_fmt",e.number)} · ${e.section}${e.robot?" · 🤖 VisuBot":""}`),A("h2",{class:"learn-title"},A("span",{class:"learn-num","aria-hidden":"true"},String(e.number)),e.title),r,A("h3",{class:"learn-step-title"},`${n+1}. ${a.title}`));const o=((c=this.returnTo)==null?void 0:c.lesson)===e.id&&this.returnTo.step!==n?this.returnTo:void 0,l=()=>{const d=A("button",{class:"learn-return"},`↩ ${p("web_learn_back_to_checklist")}`);return d.addEventListener("click",()=>{this.returnTo=void 0,this.goToStep(e,o.step),this.body.scrollTop=o.scroll}),d};o&&this.body.append(l()),a.blocks.forEach((d,h)=>this.body.append(this.renderBlock(d,`${n}-${h}`,e))),Ku(this.body),dD(this.body),this.openNeededColumns(a.blocks),Xu(this.body,La);const u=A("div",{class:"learn-nav"}),m=A("button",{},`← ${p("web_learn_back")}`);if(m.disabled=n===0,m.addEventListener("click",()=>this.goToStep(e,n-1)),u.append(m),nthis.goToStep(e,n+1)),u.append(d)}else{const d=A("button",{class:"primary"},t.done?`✓ ${p("web_learn_done")}`:p("web_learn_finish"));d.addEventListener("click",()=>{ge.updateLesson(e.id,{done:!0});const h=Ot.find(g=>g.number===e.number+1);this.openLesson(h==null?void 0:h.id)}),u.append(d)}this.body.append(u),o&&this.body.append(l())}goToStep(e,t){ge.updateLesson(e.id,{step:t}),this.render(),this.body.scrollTop=0}openNeededColumns(e){const t=e.flatMap(n=>n.kind==="exercise"?[n.exercise]:[]);TD(this.body)?this.host.showEditor():_D(this.body)?this.host.showFiles():t.some(n=>n.code!=="java")?this.host.showEditor():(t.length>0||this.body.querySelector(".lesson-code[data-lang=java]"))&&this.host.showJava(),OD(this.body)&&this.host.showLiveCode()}renderTaskList(){this.body.append(A("p",{class:"hint"},p("web_learn_tasks_intro")));const e=A("ul",{class:"learn-list"});for(const t of Tn){const n=this.taskExercises(t),a=n.length>0&&n.every(o=>ge.exercise(o.id).done),s=Ot.find(o=>o.number===t.after),r=A("button",{class:"learn-item"+(a?" done":""),"data-task":t.id},A("span",{class:"learn-num","aria-label":p("web_learn_level_fmt",t.level)},"★".repeat(t.level)),A("span",{class:"learn-item-text"},A("strong",{},t.title),A("small",{},s?p("web_learn_after_fmt",s.number,s.title):"")),A("span",{class:"learn-status"},a?"✓":""));r.addEventListener("click",()=>{this.taskId=t.id,this.persist(),this.render(),this.body.scrollTop=0}),e.append(A("li",{},r))}this.body.append(e,this.renderTeacherBox())}renderTeacherBox(){const e=A("details",{class:"learn-teacher"},A("summary",{},p("web_learn_teacher")));if(Ru()){e.setAttribute("open","");const s=A("button",{},p("web_learn_teacher_off"));return s.addEventListener("click",()=>{aD(),this.render()}),e.append(A("p",{},p("web_learn_teacher_on")),s),e}const t=A("input",{type:"password",autocomplete:"off","aria-label":p("web_learn_teacher_code"),placeholder:p("web_learn_teacher_code")}),n=A("p",{class:"learn-result",role:"status"}),a=A("form",{class:"group"},t,A("button",{type:"submit"},p("web_learn_teacher_unlock")));return a.addEventListener("submit",async s=>{s.preventDefault(),await iD(t.value)?this.render():(n.className="learn-result info",n.textContent=p("web_learn_teacher_wrong"))}),e.append(A("p",{class:"hint"},p("web_learn_teacher_intro")),a,n),e}taskExercises(e){return e.blocks.flatMap(t=>t.kind==="exercise"?[t.exercise]:[])}renderTask(e){const t=A("button",{class:"learn-back"},`← ${p("web_learn_all_tasks")}`);t.addEventListener("click",()=>{this.taskId=void 0,this.persist(),this.render()});const n=Ot.find(a=>a.number===e.after);if(this.body.append(t,A("h2",{class:"learn-title"},e.title)),n){const a=A("button",{class:"link-button"},p("web_learn_after_fmt",n.number,n.title));a.addEventListener("click",()=>this.openLesson(n.id)),this.body.append(A("p",{class:"learn-kicker"},a))}e.blocks.forEach((a,s)=>this.body.append(this.renderBlock(a,`task-${s}`))),Ku(this.body),this.openNeededColumns(e.blocks),Xu(this.body,La)}renderBlock(e,t,n){switch(e.kind){case"markdown":return gt("div",{class:"learn-text"},kn(e.text));case"diagram":return this.renderDiagram(e.file,e.caption);case"exercise":return this.renderExercise(e.exercise);case"checklist":return this.renderChecklist(e.items,t,n);case"quiz":return this.renderQuiz(e.questions,t,n);case"brag":return this.renderBrag(e.text,e.tip);case"images":return this.renderImages(e.files,e.caption);case"graphic":return this.renderGraphic(e.file,e.caption);case"game":return this.renderGame(e.game);case"roundGame":return gD(e.game,aa);case"rescueGame":return yD(e.game,aa);case"caesar":return uD(e.key,e.text);case"cloze":return wD(e.cloze);case"textFile":return Vh(e.name,e.content);case"robotModel":return cD(e.focus,e.view,e.spin);case"robotQuiz":return hD(e.tasks,e.done)}}renderBrag(e,t=!1){const n=A("aside",{class:"learn-brag"});n.append(A("img",{src:aa,alt:"",width:"48",height:"48"}));const a=A("div",{},A("p",{class:"learn-brag-title"},p(t?"web_learn_ludwig_tip":"web_learn_brag")));return a.append(gt("div",{class:"learn-text"},kn(e))),n.append(a),n}renderGame(e){const n=A("section",{class:"learn-game"}),a=A("div",{class:"learn-game-head"});a.append(A("img",{src:aa,alt:"",width:"40",height:"40"}),A("strong",{},p("web_game_title")));const s=A("p",{class:"learn-game-status"}),r=A("div",{class:"learn-game-stage"});n.append(a,s,r);let o=0,l=0;const u=()=>{const d=Ux(e,o,10);s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`;const h=A("div",{class:"learn-game-values mono"});for(const[w,S]of $x(d))h.append(A("code",{},`${w} = ${S}`));const g=A("div",{class:"group learn-game-answers"}),f=A("button",{class:"learn-game-true"},`✓ ${p("web_game_true")}`),x=A("button",{class:"learn-game-false"},`✗ ${p("web_game_false")}`);g.append(f,x);const b=A("div",{class:"learn-game-feedback",role:"status"}),y=w=>{f.disabled=x.disabled=!0;const S=w===d.answer;S&&l++,s.textContent=`${p("web_game_round_fmt",o+1,10)} · ${p("web_game_score_fmt",l)}`,b.className=`learn-game-feedback ${S?"right":"wrong"}`;const z=A("div",{class:"learn-game-steps mono"});Qx(d.condition,d.values).forEach((_,T)=>z.append(A("div",{},`${T?"→ ":""}${_}`)));const k=A("button",{class:"primary"},o+1<10?p("web_game_next"):p("web_game_finish"));k.addEventListener("click",()=>{o++,o<10?u():m()}),b.replaceChildren(A("p",{},p(S?"web_game_right":"web_game_wrong")),z,k),k.focus()};f.addEventListener("click",()=>y(!0)),x.addEventListener("click",()=>y(!1)),r.replaceChildren(h,A("div",{class:"learn-game-condition mono"},d.condition),g,b)},m=()=>{s.textContent="";const d=A("button",{class:"primary"},p("web_game_again"));d.addEventListener("click",()=>{o=l=0,u()}),r.replaceChildren(A("p",{class:"learn-game-result"},p("web_game_done_fmt",l,10)),A("p",{},p(l===10?"web_game_perfect":l>=10*.7?"web_game_good":"web_game_practice")),d)},c=A("button",{class:"primary"},p("web_game_start"));return c.addEventListener("click",u),r.append(A("p",{},p("web_game_intro")),c),n}renderImages(e,t){const n=A("figure",{class:"learn-figure"}),a=A("div",{class:"learn-images"});for(const s of e){const r=Fu(s);r&&a.append(A("img",{src:r,alt:"",loading:"lazy"}))}return n.append(a),t&&n.append(gt("figcaption",{},Re(t))),n}renderGraphic(e,t){const n=A("figure",{class:"learn-figure"}),a=Fu(e);return a&&n.append(A("img",{class:"learn-graphic",src:a,alt:"",loading:"lazy"})),t&&n.append(gt("figcaption",{},Re(t))),n}renderDiagram(e,t){const n=X1(e),a=A("figure",{class:"learn-figure"});if(!n)return a;const s=this.host.preview(n);s&&a.append(A("div",{class:"learn-preview",dir:"ltr"},s)),t&&a.append(gt("figcaption",{},Re(t)));const r=A("button",{},p("web_learn_open_in_editor"));return r.addEventListener("click",()=>this.host.openDiagram(n,e)),a.append(r),a}renderExercise(e){const t=A("section",{class:"learn-exercise","data-exercise":e.id}),n=()=>ge.exercise(e.id),a=A("span",{class:"learn-badge"},`✓ ${p("web_learn_solved")}`);a.hidden=!n().done,t.append(A("h4",{},`${p("web_learn_exercise")}: ${e.title}`,a),gt("div",{class:"learn-text"},kn(e.task)));const s=A("div",{class:"learn-result",role:"status"}),r=A("div",{class:"learn-hints"}),o=A("div",{class:"group"}),l=A("button",{class:"primary"},p("web_learn_open_exercise"));l.addEventListener("click",()=>{const c=n().xml;let d=em(e);if(c)try{d=Bl(c)}catch{}this.host.openExercise(e,d)});const u=A("button",{},p("web_learn_check"));if(u.addEventListener("click",()=>{const c=this.host.exerciseDocument(e.id);if(!c){s.className="learn-result info",s.textContent=p("web_learn_open_first");return}if(c.elements.every(Al)){s.className="learn-result info",s.textContent=p("web_learn_empty");return}this.host.stopSimulation();const d=Jx(c,e.tests,this.host.subprogramsFor(e.id),Wa),h=Rx(c),g=e.requires.map(b=>b==="forZaehlSchleife"?"forSchleife":b).filter(b=>b in I&&!h.has(I[b])),f=e.loopDepth!==void 0&&_o(c.elements)b.passed)&&g.length===0&&!f;this.showResult(s,d,g,x,f),x&&(ge.updateExercise(e.id,{done:!0}),a.hidden=!1)}),o.append(l,u),e.hints.length>0){const c=A("button",{},p("web_learn_hint"));c.addEventListener("click",()=>{const d=r.children.length;if(d>=e.hints.length)return;const h=e.hints.length>1?`**${p("web_learn_hint_fmt",d+1,e.hints.length)}:** `:"";r.append(gt("aside",{class:"lesson-note"},kn(h+e.hints[d]))),c.textContent=p("web_learn_hint_more"),c.toggleAttribute("disabled",d+1>=e.hints.length)}),o.append(c)}const m=A("button",{class:"danger-text"},p("web_learn_reset"));if(m.addEventListener("click",()=>{if(m.dataset.confirm!=="1"){m.dataset.confirm="1",m.textContent=p("web_learn_reset_confirm"),setTimeout(()=>{m.dataset.confirm="",m.textContent=p("web_learn_reset")},4e3);return}ge.resetExercise(e.id),this.host.resetExercise(e.id,em(e)),a.hidden=!0,s.replaceChildren(),s.className="learn-result",m.dataset.confirm="",m.textContent=p("web_learn_reset")}),o.append(m),t.append(o,r,s),Ru()&&e.solution){const c=X1(e.solution);if(c){const d=A("details",{class:"learn-solution"},A("summary",{},p("web_learn_solution")));d.addEventListener("toggle",()=>{if(!d.open||d.querySelector(".learn-preview"))return;const h=this.host.preview(c);h&&d.append(A("div",{class:"learn-preview",dir:"ltr"},h));const g=A("button",{},p("web_learn_open_in_editor"));g.addEventListener("click",()=>{this.host.openDiagram(c,e.solution);for(const f of e.subprograms){const x=X1(f);x&&this.host.openDiagram(x,f)}});for(const f of e.subprograms){const x=X1(f),b=x&&this.host.preview(x);b&&d.append(A("div",{class:"learn-preview",dir:"ltr"},b))}d.append(g)}),t.append(d)}}return t}showResult(e,t,n,a,s){var o,l,u,m,c;e.className="learn-result "+(a?"ok":"fail"),e.replaceChildren(A("p",{class:"learn-result-head"},a?`🎉 ${p("web_learn_passed")}`:p("web_learn_failed")));for(const d of n)e.append(A("p",{},`✗ ${p("web_learn_missing_fmt",jD(I[d]))}`));s&&e.append(A("p",{},`✗ ${p("web_visubot_depth_fmt",s)}`));const r=A("ul",{class:"learn-tests",dir:"auto"});for(const d of t){const h=d.test.world?t.filter(b=>b.test.world).indexOf(d)+1:0,g=d.test.world?`🗺 ${p("web_visubot_world_fmt",h)}`:d.test.actions?`🤖 ${p("web_visubot_actions")}`:d.test.sensors?`🎛 ${Object.entries(d.test.sensors).map(([b,y])=>`mbot.${b}() = ${y.join(" → ")}`).join(", ")}`:d.test.drive?`🤖 ${p("web_visubot_drive")}`:d.test.inputs.length?p("web_learn_input_fmt",d.test.inputs.join(", ")):p("web_learn_no_input"),f=[`${d.passed?"✓":"✗"} ${g}`],x=A("div",{class:"learn-test-detail"});if(d.test.drive&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.drive)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.drive??[])||"–"))),d.test.actions&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},U1(d.test.actions)||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},U1(d.result.actions??[])||"–"))),d.test.led!==void 0){const b=y=>p(y?"web_visubot_led_on":"web_visubot_led_off");x.append(A("span",{},`💡 ${p("web_learn_expected")}: ${b(d.test.led)} · ${p("web_learn_actual")}: ${b(d.result.led)}`))}if(d.test.tone!==void 0){const b=y=>p(y?"web_visubot_tone_yes":"web_visubot_tone_no");x.append(A("span",{},`🔊 ${p("web_learn_expected")}: ${b(d.test.tone)} · ${p("web_learn_actual")}: ${b(d.result.tone)}`))}d.test.screen!==void 0&&x.append(A("span",{},`📺 ${p("web_learn_expected")}: `,A("code",{},d.test.screen),` · ${p("web_learn_actual")}: `,A("code",{},d.result.screen??"–"))),d.test.world&&(((l=(o=Wa(d.test.world))==null?void 0:o.goals)!=null&&l.length||(m=(u=Wa(d.test.world))==null?void 0:u.targets)!=null&&m.length)&&x.append(A("span",{},d.result.atGoal?`✓ ${p("web_visubot_goal_reached")}`:`✗ ${p("web_visubot_goal_missed")}`)),d.result.bumps&&x.append(A("span",{class:"learn-error"},`⚠︎ ${p("web_visubot_bumps")}: ${d.result.bumps}`))),(!d.test.drive&&!d.test.world&&!d.test.sensors&&!d.test.actions||d.result.outputs.length)&&x.append(A("span",{},`${p("web_learn_expected")}: `,A("code",{},d.test.expected.join(" | ")||"–")),A("span",{},`${p("web_learn_actual")}: `,A("code",{},d.result.outputs.join(" | ")||"–")));for(const b of d.test.files??[])x.append(A("span",{},`📄 ${b.name}, ${p("web_learn_expected")}: `,A("code",{},b.lines.join(" | ")||"–")),A("span",{},`📄 ${b.name}, ${p("web_learn_actual")}: `,A("code",{},Ch((c=d.result.files)==null?void 0:c.get(b.name)).join(" | ")||"–")));d.result.error&&x.append(A("span",{class:"learn-error"},Kn(d.result.error))),d.result.missingInput&&x.append(A("span",{class:"learn-error"},p("web_learn_missing_input"))),d.result.tooManySteps&&x.append(A("span",{class:"learn-error"},p("web_learn_too_many_steps"))),!d.passed&&d.result.unusedInputs&&x.append(A("span",{class:"learn-error"},p("web_learn_unused_input"))),r.append(A("li",{class:d.passed?"ok":"fail"},...f,x))}e.append(r)}renderChecklist(e,t,n){const a=A("ul",{class:"learn-checklist"});return e.forEach((s,r)=>{var c;const o=`${t}-${r}`,l=A("input",{type:"checkbox"});l.checked=!!(n&&((c=ge.lesson(n.id).checks)!=null&&c[o])),l.addEventListener("change",()=>{if(!n)return;const d={...ge.lesson(n.id).checks??{},[o]:l.checked};ge.updateLesson(n.id,{checks:d})});const u=A("label",{},l);u.insertAdjacentHTML("beforeend"," "+Re(s.text));const m=A("li",{},u);if(n&&s.step!==void 0){const d=s.step,h=p("web_learn_step_fmt",d+1,n.steps[d].title),g=A("button",{class:"link-button learn-check-link",title:h,"aria-label":`${p("web_learn_review")}: ${h}`},p("web_learn_review"));g.addEventListener("click",()=>{this.returnTo={lesson:n.id,step:ge.lesson(n.id).step,scroll:this.body.scrollTop},this.goToStep(n,d)}),m.append(g)}a.append(m)}),a}renderQuiz(e,t,n){const a=A("div",{class:"learn-quiz"}),s=A("p",{class:"learn-score",role:"status"}),r=()=>n?ge.lesson(n.id).quiz??{}:{},o=()=>{const l=r(),u=(h,g)=>h.pairs?h.pairs.every((f,x)=>l[`${t}-${g}-${x}`]!==void 0):l[`${t}-${g}`]!==void 0,m=(h,g)=>{var f;return h.pairs?h.pairs.every((x,b)=>tm(h)[l[`${t}-${g}-${b}`]]===h.pairs[b].right):(f=h.options[l[`${t}-${g}`]])==null?void 0:f.correct},c=e.filter(u).length,d=e.filter(m).length;s.textContent=c===e.length?p("web_learn_score_fmt",d,e.length):""};return e.forEach((l,u)=>{const m=`${t}-${u}`,c=A("fieldset",{},gt("legend",{},Re(l.question))),d=gt("p",{class:"learn-explanation"},Re(l.explanation??""));if(l.pairs){c.append(this.renderMatch(l,m,r,n,d,o),d),a.append(c);return}const h=g=>{c.querySelectorAll("button").forEach((f,x)=>{f.classList.toggle("right",g!==void 0&&l.options[x].correct),f.classList.toggle("wrong",g===x&&!l.options[x].correct),f.setAttribute("aria-pressed",String(g===x))}),d.hidden=g===void 0||!l.explanation};l.options.forEach((g,f)=>{const x=gt("button",{class:"learn-option"},Re(g.text));x.addEventListener("click",()=>{n&&ge.updateLesson(n.id,{quiz:{...r(),[m]:f}}),h(f),o()}),c.append(x)}),c.append(d),h(r()[m]),a.append(c)}),a.append(s),o(),a}renderMatch(e,t,n,a,s,r){const o=e.pairs,l=tm(e),u=A("div",{class:"learn-match"});let m={};const c=()=>a?n():m,d=x=>a?ge.updateLesson(a.id,{quiz:x}):m=x,h=x=>c()[`${t}-${x}`],g=o.map(x=>{const b=A("select",{class:"learn-match-select"});b.append(A("option",{value:""},"–")),l.forEach((w,S)=>b.append(A("option",{value:String(S)},w)));const y=gt("label",{class:"learn-match-left"},Re(x.left));return y.append(b),u.append(y),b}),f=()=>{const x=o.every((b,y)=>h(y)!==void 0);g.forEach((b,y)=>{const w=h(y);b.value=w===void 0?"":String(w),b.classList.toggle("right",x&&l[w]===o[y].right),b.classList.toggle("wrong",x&&l[w]!==o[y].right)}),s.hidden=!x||!e.explanation};return g.forEach((x,b)=>x.addEventListener("change",()=>{const y={...c()};x.value===""?delete y[`${t}-${b}`]:y[`${t}-${b}`]=Number(x.value),d(y),f(),r()})),f(),u}}function tm(i){return(i.pairs??[]).map(e=>e.right).sort((e,t)=>e.localeCompare(t,"de"))}const DD=""+new URL("visubot-CyGFOI9V.webp",import.meta.url).href,i0="visustruct.visubot";function a0(){try{return localStorage.getItem(i0)}catch{return null}}function ri(){const i=a0();return i==="1"||i==="kurs"?"on":"off"}const Xh=()=>a0()==="2";function Kh(){try{localStorage.setItem(i0,"2")}catch{}}const ZD=()=>a0()!==null;function br(i){try{localStorage.setItem(i0,i==="on"?"1":"0")}catch{}}const MD=`VisuBot`,Rn=()=>ri()!=="off",nm=i=>i.replace(/[&<>"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e]);function Po(){const i=Xh()?"object":ri(),e=(n,a)=>``,t={off:"web_visubot_world_visustruct_hint",on:"web_visubot_world_visubot_hint",object:"web_visuobject_world_hint"}[i];return`
${e("off","VisuStruct")}${e("on","🤖 VisuBot")}${e("object","VisuObject")}
- ${nm(p(t))}`}class LD{constructor(e=vi){v(this,"element");v(this,"world");v(this,"view");v(this,"loading");v(this,"status");v(this,"stage");v(this,"picker");v(this,"applied",0);v(this,"sent",0);v(this,"liveStatus");v(this,"viewport");v(this,"stopListening");v(this,"realSensors");v(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});v(this,"pressTimers",new Map);v(this,"check");v(this,"checking",!1);v(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${WD()}${ED()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??vi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=tg(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function eg(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function WD(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")} + ${nm(p(t))}`}class LD{constructor(e=vi){v(this,"element");v(this,"world");v(this,"view");v(this,"loading");v(this,"status");v(this,"stage");v(this,"picker");v(this,"applied",0);v(this,"sent",0);v(this,"liveStatus");v(this,"viewport");v(this,"stopListening");v(this,"realSensors");v(this,"controls",{getBrightness:50,getLoudness:0,getPitch:0,getRoll:0});v(this,"pressTimers",new Map);v(this,"check");v(this,"checking",!1);v(this,"onWorldChange");this.world=new us(e),this.element=document.createElement("section"),this.element.className="visubot",this.element.innerHTML=`

${p("web_visubot_world")}

${p("web_visubot_world_in_preview")}

${WD()}${ED()}`,this.stage=this.element.querySelector(".visubot-stage"),this.picker=this.element.querySelector(".visubot-worlds"),this.status=this.element.querySelector(".visubot-status"),this.liveStatus=this.element.querySelector(".visubot-live"),this.viewport=this.element.querySelector(".visubot-viewport"),this.stopListening=le.listen(()=>this.updateLive()),this.setupControls(),this.check=this.element.querySelector(".visubot-check"),this.setupCheck(),this.updateLive(),this.updateStatus()}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-s_ti3AsW.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{this.view=new e(this.stage),this.view.setWorld(this.world.setup),this.view.place(this.world.pose,this.world.trail),this.view.setLeds(this.world.leds)}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}restoreViewport(){this.viewport.parentElement!==this.element&&this.liveStatus.after(this.viewport)}setWorlds(e){this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t,a)),this.picker.append(a)}),this.useWorld(e[0]??vi,this.picker.firstElementChild)}useWorld(e,t){var n,a,s,r,o;for(const l of this.picker.children)l.classList.toggle("active",l===t);e!==this.world.setup&&(this.world=new us(e),this.applied=0,this.sent=0,(n=this.view)==null||n.setWorld(e),(a=this.view)==null||a.place(this.world.pose,this.world.trail),(s=this.view)==null||s.setLed(void 0),(r=this.view)==null||r.setScreen(void 0),this.updateStatus(),(o=this.onWorldChange)==null||o.call(this))}reset(){var e,t,n;this.world.reset(),this.applied=0,this.sent=0,this.realSensors=void 0,(e=this.view)==null||e.place(this.world.pose,this.world.trail),(t=this.view)==null||t.setLed(void 0),(n=this.view)==null||n.setScreen(void 0),this.updateStatus()}prepare(e){e.robotSensors={...this.controls,...this.world.sensors()}}setupControls(){for(const e of this.element.querySelectorAll(".visubot-controls input[type=range]")){const t=e.parentElement.querySelector("output"),n=()=>{this.controls[e.name]=Number(e.value),t.textContent=e.value};e.addEventListener("input",n),n()}for(const e of this.element.querySelectorAll(".visubot-controls button[name]"))e.addEventListener("click",()=>{const t=e.name;this.controls[t]=!0,e.classList.add("pressed"),window.clearTimeout(this.pressTimers.get(t)),this.pressTimers.set(t,window.setTimeout(()=>{this.controls[t]=!1,e.classList.remove("pressed")},1e3))})}setupCheck(){for(const e of this.check.querySelectorAll("button[data-py]"))e.addEventListener("click",()=>{const{after:t,wait:n}=e.dataset;le.run(e.dataset.py).then(()=>t?new Promise(a=>setTimeout(a,Number(n))).then(()=>le.run(t)):void 0).catch(a=>this.liveFailed(a))});this.check.addEventListener("toggle",()=>void this.readCheck())}async readCheck(){if(!this.checking){this.checking=!0;try{for(;this.check.open&&le.connected;){for(const e of this.check.querySelectorAll("[data-sensor]")){if(!this.check.open||!le.connected)break;const t=e.dataset.sensor,n=await le.ask(St[t].python).catch(()=>{});n!==void 0&&(e.textContent=typeof St[t].simulated=="boolean"?n===!0||typeof n=="number"&&n!==0?"✓":"–":String(typeof n=="number"?Math.round(n*10)/10:n))}await new Promise(e=>setTimeout(e,200))}}finally{this.checking=!1}}}get live(){return le.connected}async prepareLive(e,t=[]){const n={};for(const a of new Set(["getDistance","getLine",...t])){const s=await le.ask(St[a].python);typeof St[a].simulated=="boolean"?n[a]=s===!0||typeof s=="number"&&s!==0:typeof St[a].simulated=="string"?n[a]=typeof s=="string"?s:String(St[a].simulated):n[a]=typeof s=="number"?a==="getDistance"?Math.round(s):s:0}this.realSensors=n,e.robotSensors={...this.controls,...this.world.sensors(),...n}}async drive(e){for(;this.sentsetTimeout(n,t.args[0]))}}liveFailed(e){le.disconnect(e instanceof Error?e.message:String(e))}updateLive(){this.liveStatus.textContent=tg(),this.liveStatus.classList.toggle("connected",le.connected),this.check.hidden=!le.connected,le.connected||(this.check.open=!1),this.updateStatus()}follow(e,t){var a,s,r,o;for(;this.appliedl!==0);this.world.tick(Xl),n&&((o=this.view)==null||o.moveTo(this.world.pose,this.world.trail,t)),this.updateStatus()}dispose(){var e;this.stopListening();for(const t of this.pressTimers.values())window.clearTimeout(t);(e=this.view)==null||e.dispose(),this.view=void 0,this.loading=void 0}updateStatus(){const e=this.world.lineState().toString(2).padStart(4,"0"),t=[`${p("web_visubot_distance")}: ${this.world.distance()} cm`,`${p("web_visubot_line")}: ${e}`];this.world.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${this.world.bumps}`),this.world.screen!==void 0&&t.push(`📺 ${this.world.screen}`),this.realSensors&&le.connected&&t.push(`🤖 ${p("web_visubot_distance")}: ${this.realSensors.getDistance} cm · ${p("web_visubot_line")}: ${Number(this.realSensors.getLine).toString(2).padStart(4,"0")}`),this.status.textContent=t.join(" · ")}}let J1;function eg(i,e){try{J1??(J1=new AudioContext);const t=J1.createOscillator(),n=J1.createGain();t.type="square",t.frequency.value=Math.max(20,Math.min(2e4,i)),n.gain.value=.05,t.connect(n).connect(J1.destination);const a=J1.currentTime+Math.min(Math.max(e,0),5e3)/1e3;t.start(),t.stop(a)}catch{}}function WD(){const i=(t,n,a,s,r)=>``,e=(t,n,a)=>``;return`
🎛 ${p("web_visubot_controls")}

${p("web_visubot_controls_hint")}

${i("getBrightness","web_visubot_sensor_brightness",0,100,50)} ${i("getLoudness","web_visubot_sensor_loudness",0,100,0)} @@ -60555,7 +60555,7 @@ ${i}

${bn(p("web_visubot_preview_hint"))}

-

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-DrGbnn-t.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` +

`;const e=t=>this.element.querySelector(t);this.heightBar=e(".robotpreview-height"),this.stage=e(".robotpreview-stage"),this.status=e(".robotpreview-status"),this.picker=e(".visubot-worlds"),this.playButton=e(".robotpreview-play"),this.stackButton=e(".robotpreview-stack"),this.playButton.addEventListener("click",()=>this.playTimer===void 0?this.play():this.stopPlaying(!0)),this.stackButton.addEventListener("click",()=>this.onToggleStacked()),e(".learn-hide").addEventListener("click",()=>this.onHide()),this.rail=document.createElement("button"),this.rail.className="learn-rail robotpreview-rail",this.setStacked(!1),this.relabel()}hostSimulation(e){var t;e!==this.simulation&&((t=this.simulation)==null||t.remove(),this.simulation=e,this.element.classList.toggle("simulation",!!e),e&&(this.pause(),this.status.after(e)),this.relabel())}relabel(){const e=a=>this.element.querySelector(a),t=!!this.simulation;e("h2").textContent=`🤖 ${p(t?"web_visubot_preview_sim_title":"web_visubot_preview_title")}`,e(".hint").textContent=p(t?"web_visubot_preview_sim_hint":"web_visubot_preview_hint"),this.heightBar.title=p("web_visubot_preview_resize");const n=e(".learn-hide");n.title=p("web_visubot_preview_hide"),n.setAttribute("aria-label",p("web_visubot_preview_hide")),this.rail.title=p("web_visubot_preview_show"),this.rail.innerHTML=`${kt}🤖 ${bn(p("web_visubot_preview_title"))}`,this.setStacked(this.stackButton.textContent==="▥"),this.stopPlaying(!1),this.worldsKey=void 0,this.lastKey=void 0}setStacked(e){const t=e?"web_visubot_preview_side":"web_visubot_preview_stack";this.stackButton.innerHTML=e?"▥":"⬓",this.stackButton.className="icon robotpreview-stack",this.stackButton.dataset.tip=p(t),this.stackButton.setAttribute("aria-label",p(t))}show(){this.loading??(this.loading=q(async()=>{const{Robot3D:e}=await import("./robot3d-s_ti3AsW.js");return{Robot3D:e}},[],import.meta.url).then(({Robot3D:e})=>{var t;this.view=new e(this.stage),this.view.setWorld(this.setup),this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}).catch(()=>{this.stage.textContent=p("web_visubot_no_3d")}))}update(e,t,n,a,s){if(this.simulation)return;this.show(),a!==this.worldsKey&&(this.worldsKey=a,this.setWorlds(n)),this.input={doc:e,resolve:t};const r=JSON.stringify(s)+` `+JSON.stringify(e);r!==this.lastKey&&(this.lastKey=r,window.clearTimeout(this.pending),this.pending=window.setTimeout(()=>this.recompute(),120))}setWorlds(e){this.worlds=e,this.picker.replaceChildren(),this.picker.hidden=e.length<2,e.forEach((t,n)=>{const a=document.createElement("button");a.textContent=p("web_visubot_world_fmt",n+1),a.addEventListener("click",()=>this.useWorld(t)),this.picker.append(a)}),this.useWorld(e[0]??vi)}useWorld(e){var t;this.worlds.forEach((n,a)=>{var s;return(s=this.picker.children[a])==null?void 0:s.classList.toggle("active",n===e)}),!(e===this.setup&&this.result)&&(this.setup=e,(t=this.view)==null||t.setWorld(e),this.recompute())}recompute(){var e;if(this.pending=void 0,this.stopPlaying(!1),!!this.input){try{this.result=tJ(this.input.doc,this.input.resolve,this.setup)}catch{this.result=void 0}this.showFrame((e=this.result)==null?void 0:e.frames.at(-1)),this.updateStatus()}}showFrame(e,t=0){if(!this.view)return;const n=e??{pose:{...this.setup.start},trail:[{x:this.setup.start.x,y:this.setup.start.y}],leds:Array(5).fill(void 0),screen:void 0};t>0?this.view.moveTo(n.pose,n.trail,t):this.view.place(n.pose,n.trail),this.view.setLeds(n.leds),this.view.setScreen(n.screen)}play(){var a;const e=(a=this.result)==null?void 0:a.frames;if(!e||e.length<2||!this.view)return;this.stopPlaying(!1);let t=0;this.showFrame(e[0]),this.playButton.innerHTML=ne.stop,this.playButton.dataset.tip=p("web_visubot_preview_stop"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_stop"));const n=()=>{if(t++,t>=e.length){this.stopPlaying(!1);return}const s=e[t];s.tone&&eg(s.tone[0],s.tone[1]),this.showFrame(s,$r-30),this.playTimer=window.setTimeout(n,$r)};this.playTimer=window.setTimeout(n,$r)}stopPlaying(e){var t;this.playTimer!==void 0&&window.clearTimeout(this.playTimer),this.playTimer=void 0,this.playButton.innerHTML=ne.play,this.playButton.dataset.tip=p("web_visubot_preview_play"),this.playButton.setAttribute("aria-label",p("web_visubot_preview_play")),e&&this.showFrame((t=this.result)==null?void 0:t.frames.at(-1))}updateStatus(){const e=this.result;if(this.playButton.disabled=!e||e.frames.length<2,!e){this.status.textContent="";return}const t=[p("web_visubot_preview_distance_fmt",e.distance)];e.bumps>0&&t.push(`⚠︎ ${p("web_visubot_bumps")}: ${e.bumps}`),e.stop==="input"?t.push(p("web_visubot_preview_input")):e.stop==="limit"?t.push(p("web_visubot_preview_limit")):e.stop==="error"&&e.notice&&t.push(`⚠︎ ${Kn(e.notice)}`),this.status.textContent=t.join(" · ")}pause(){window.clearTimeout(this.pending),this.pending=void 0,this.lastKey=void 0,this.stopPlaying(!1)}}const iJ={left:12,top:10},aJ=8,Ms=8e3,pi=16,Yr=12,Ff="#fafafa";function Jf(i){const e=i.caption.trim();return e===""?p("diagram_title_placeholder"):e}function Yc(i){let e=i.trim().replace(/\.visustruct$/i,"");if(e==="")return"";for(e=e.replace(/\s/g,"-").replace(/[/:\\*?"<>|]/g,"-");e.includes("--");)e=e.replace(/--/g,"-");return e=e.replace(/^-+|-+$/g,""),e.length>120&&(e=e.slice(0,120).replace(/^-+|-+$/g,"")),e}function Xc(i,e){return Yc(i.caption)||Yc(e)||"VisuStruct"}function sJ(i,e,t){const n=i.split(/\s+/),a=[];let s="";for(const r of n){const o=s?`${s} ${r}`:r;s&&t(o,pi,"bold")>e?(a.push(s),s=r):s=o}if(s&&a.push(s),a.length>2){let r=a.slice(1).join(" ");for(;r.length>1&&t(r+"…",pi,"bold")>e;)r=r.slice(0,-1);return[a[0],r+"…"]}return a}function Kc(i,e,t,n=320){const a={...i,elements:i.elements.map(Ua)},s=new Md(e,t).layout(a,iJ),r=Math.min(Ms,Math.max(n,s.canvasSize.width)),o=Math.min(Ms,Math.max(n,s.canvasSize.height));if(r<=2||o<=2)return;const l=sJ(Jf(i),r-2*Yr,t),u=Math.ceil(pi*1.2),m=Math.min(56,l.length*u+2),c=m+o,d=new Nd(e,t).render(s,{width:r,height:o},void 0,aJ);d.setAttribute("y",String(m)),d.removeAttribute("class");const h=ye("svg",{xmlns:"http://www.w3.org/2000/svg",width:r,height:c,viewBox:`0 0 ${r} ${c}`});h.append(ye("rect",{x:0,y:0,width:r,height:c,fill:Ff}));const g=ye("text",{x:Yr,y:0,"font-family":Ls,"font-size":pi,"font-weight":600,fill:"black"});return l.forEach((f,x)=>{const b=ye("tspan",{x:Yr,y:x*u+pi});b.textContent=f,g.append(b)}),h.append(g,d),{svg:h,width:r,height:c}}function Rf(i){return` `+new XMLSerializer().serializeToString(i.svg)}async function ed(i,e){const t=Math.max(1,Math.min(e,Ms/i.width,Ms/i.height)),n=URL.createObjectURL(new Blob([Rf(i)],{type:"image/svg+xml"}));try{const a=new Image;a.src=n,await a.decode();const s=document.createElement("canvas");s.width=Math.round(i.width*t),s.height=Math.round(i.height*t);const r=s.getContext("2d");return r.fillStyle=Ff,r.fillRect(0,0,s.width,s.height),r.drawImage(a,0,0,s.width,s.height),s}finally{URL.revokeObjectURL(n)}}function rJ(i){return new Promise((e,t)=>i.toBlob(n=>n?e(n):t(new Error("PNG konnte nicht erzeugt werden.")),"image/png"))}function oJ(i,e){const a=Math.max(1,i),s=Math.max(1,e),r=f=>{const x=f.width-64,b=f.height-64;return{s:Math.min(x/a,b/s)*.98,cw:x,ch:b}},o={width:595,height:842},l={width:842,height:595},u=r(o),m=r(l),[c,d]=m.s>u.s?[l,m]:[o,u],h=a*d.s,g=s*d.s;return{page:c,draw:{x:32+(d.cw-h)/2,y:32+(d.ch-g)/2,width:h,height:g}}}async function lJ(i){const e=new Blob([i]).stream().pipeThrough(new CompressionStream("deflate"));return new Uint8Array(await new Response(e).arrayBuffer())}function td(i){let e="FEFF";for(let t=0;t`}async function uJ(i,e,t,n,a){const{page:s,draw:r}=oJ(n.width,n.height),o=await lJ(i),l=b=>(Math.round(b*100)/100).toString(),u=`q ${l(r.width)} 0 0 ${l(r.height)} ${l(r.x)} ${l(s.height-r.y-r.height)} cm /Im0 Do Q`,m=new TextEncoder,c=[["<< /Type /Catalog /Pages 2 0 R >>"],["<< /Type /Pages /Kids [3 0 R] /Count 1 >>"],[`<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${s.width} ${s.height}] /Resources << /XObject << /Im0 4 0 R >> >> /Contents 5 0 R >>`],[`<< /Type /XObject /Subtype /Image /Width ${e} /Height ${t} /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /FlateDecode /Length ${o.length} >> stream @@ -60862,4 +60862,4 @@ ${c}

${W(p("close_unsaved_title"))}

${W(p("web_discard_message_fmt",this.fileName))}

- `,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:sd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:sd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Xc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=Kc(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Xc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Rf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await ed(t,a);await this.offerDownload(`${n}.png`,await rJ(s));break}case"pdf":{const s=await ed(t,Math.max(a,3)),r=await uJ(mJ(s),s.width,s.height,t,Jf(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:ad.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function Sd(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function _d(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>_d(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&_d(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function Qf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function CJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{Qf()&&i.preventDefault()});const BJ=M2();Promise.all([qd(BJ,!1),Qd(D2(),!1)]).then(()=>{Vf(),jJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&Kh();const e=document.getElementById("app");if(Xh()&&!i.has("visustruct")&&!i.has("visubot"))return q(async()=>{const{ObjectApp:t}=await import("./objectApp-70d7xQix.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new OJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&Qf()||CJ(i)});export{Vn as C,DF as J,jx as L,q as _,vF as a,RF as b,Zf as c,EJ as d,br as e,sa as f,_J as g,HD as h,ne as i,GD as j,i1 as k,WJ as m,WF as p,am as r,$D as s,p as t,Po as w}; + `,t.addEventListener("click",n=>{const a=n.target.dataset.r;a===void 0&&n.target!==t||(t.remove(),e(a==="1"))}),document.body.append(t),t.querySelector('[data-r="0"]').focus()}):Promise.resolve(!0)}showMessage(e){this.statusLine.textContent=e,this.statusLine.classList.add("message"),setTimeout(()=>{this.statusLine.classList.remove("message"),this.updateStatus()},6e3)}loadXML(e,t,n){let a;try{a=Bl(e)}catch(s){this.showMessage(p("web_err_unreadable_fmt",t,s.message));return}(this.dirty||this.tab.fileName||this.tab.exerciseId)&&this.addTab(),this.doc=a,this.tab.fileName=t.replace(/\.(strk|xml)$/i,".visustruct"),this.fileHandle=n&&/\.visustruct$/i.test(t)?n:void 0,this.resetHistory()}async open(e){const t=window;if(!t.showOpenFilePicker||this.inViewer)return e.click();try{const[n]=await t.showOpenFilePicker({types:sd()}),a=await n.getFile();this.loadXML(await a.text(),a.name,n)}catch{}}async save(){var n,a;if(!this.downloads&&await this.saveToWorkspace())return;const e=new Blob([o1(this.doc)],{type:"application/xml"}),t=window;try{if(this.downloads){const s=this.fileName+".txt";await this.downloads.save({filename:s,data:e}),(n=this.tab).fileName??(n.fileName=this.fileName),this.dirty=!1,this.render(),this.showMessage(p("web_saved_txt_fmt",s));return}if(!this.fileHandle&&t.showSaveFilePicker&&!this.inViewer&&(this.fileHandle=await t.showSaveFilePicker({suggestedName:this.fileName,types:sd()}),this.tab.fileName=this.fileHandle.name),this.fileHandle){const s=await this.fileHandle.createWritable();await s.write(e),await s.close()}else{const s=document.createElement("a");s.href=URL.createObjectURL(e),s.download=this.fileName,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e3)}(a=this.tab).fileName??(a.fileName=this.fileName),this.dirty=!1,this.render()}catch{}}async exportDiagram(e){if(e==="visustruct"){const s=Xc(this.doc,on(this.tab));return this.offerDownload(`${s}.visustruct`,new Blob([o1(this.doc)],{type:"application/xml"}))}const t=Kc(this.doc,this.metrics,this.measure);if(!t){this.showMessage(p(e==="print"?"err_diagram_too_small_print":"err_diagram_too_small_export"));return}const n=Xc(this.doc,on(this.tab)),a=Math.max(2,window.devicePixelRatio||1)*this.zoom;try{switch(e){case"svg":{t.svg.setAttribute("width",String(t.width*this.zoom)),t.svg.setAttribute("height",String(t.height*this.zoom)),await this.offerDownload(`${n}.svg`,new Blob([Rf(t)],{type:"image/svg+xml"}));break}case"png":{const s=await ed(t,a);await this.offerDownload(`${n}.png`,await rJ(s));break}case"pdf":{const s=await ed(t,Math.max(a,3)),r=await uJ(mJ(s),s.width,s.height,t,Jf(this.doc));await this.offerDownload(`${n}.pdf`,r);break}case"print":this.printDiagram(t);break}}catch(s){this.showMessage(p("web_export_failed_fmt",s instanceof Error?s.message:String(s)))}}printDiagram(e){const t=document.createElement("div");t.className="print-sheet",e.svg.removeAttribute("width"),e.svg.removeAttribute("height"),t.append(e.svg),document.body.append(t);const n=()=>t.remove();window.addEventListener("afterprint",n,{once:!0});try{window.print()}catch{n(),this.showMessage(`${p("err_print_unavailable")} ${p("web_print_hint")}`);return}setTimeout(n,6e4)}async offerDownload(e,t){try{if(this.downloads){try{await this.downloads.save({filename:e,data:t}),this.showMessage(p("web_saved_fmt",e))}catch{await this.downloads.save({filename:e+".txt",data:t}),this.showMessage(p("web_saved_txt_fmt",e+".txt"))}return}const n=document.createElement("a");n.href=URL.createObjectURL(t),n.download=e,n.click(),setTimeout(()=>URL.revokeObjectURL(n.href),1e3)}catch{this.showMessage(p("err_save_failed_fmt",e))}}setupFileDrop(){window.addEventListener("dragover",e=>{var t;(t=e.dataTransfer)!=null&&t.types.includes("Files")&&(e.preventDefault(),this.root.classList.add("file-drag"))}),window.addEventListener("dragleave",e=>{e.relatedTarget===null&&this.root.classList.remove("file-drag")}),window.addEventListener("drop",async e=>{var n;this.root.classList.remove("file-drag");const t=(n=e.dataTransfer)==null?void 0:n.files[0];t&&(e.preventDefault(),this.loadXML(await t.text(),t.name))})}onKeyDown(e){var a,s;const t=e.metaKey||e.ctrlKey,n=e.target instanceof HTMLTextAreaElement||e.target instanceof HTMLInputElement||((a=e.target)==null?void 0:a.isContentEditable)===!0;if(t&&e.key.toLowerCase()==="s")e.preventDefault(),this.save();else if(t&&e.key.toLowerCase()==="p")e.preventDefault(),this.simulating||this.exportDiagram("print");else if(t&&e.key.toLowerCase()==="o")e.preventDefault(),this.open(this.root.querySelector("input[type=file]"));else{if(n||this.simulating)return;t&&e.key.toLowerCase()==="z"?(e.preventDefault(),e.shiftKey?this.redo():this.undo()):t&&e.key.toLowerCase()==="c"&&!((s=getSelection())!=null&&s.toString())?this.copySelection()&&e.preventDefault():t&&e.key.toLowerCase()==="x"?(e.preventDefault(),this.cutSelection()):t&&e.key.toLowerCase()==="v"?(e.preventDefault(),this.paste()):t&&e.key.toLowerCase()==="y"?(e.preventDefault(),this.redo()):e.key==="Delete"||e.key==="Backspace"?(e.preventDefault(),this.deleteSelection()):e.key==="Escape"&&(this.drag?this.endDrag():(this.selected=void 0,this.render()))}}svgPoint(e,t){if(!this.svg)return;const n=this.svg.getBoundingClientRect(),a=e-n.left,s=t-n.top;if(!(a<0||s<0||a>n.width||s>n.height))return{x:a/this.zoom,y:s/this.zoom}}nodeAt(e,t){for(let n=this.flat.length-1;n>=0;n--){const a=this.flat[n].frame;if(e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height)return this.flat[n]}}onCanvasPointerDown(e){if(this.simulating)return;const t=this.svgPoint(e.clientX,e.clientY);if(!t)return;document.activeElement instanceof HTMLElement&&document.activeElement.blur();const n=this.nodeAt(t.x,t.y),a=n&&this.selected&&lo(n.idPath,this.selected);this.selected=n==null?void 0:n.idPath,this.render(),n&&e.pointerType!=="touch"&&!(wn(this.doc,n.idPath)&&!a)&&this.beginDrag(e,{kind:"move",path:n.idPath})}beginDrag(e,t){e.button!==0||this.simulating||(e.preventDefault(),this.drag={source:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,active:!1})}onPointerMove(e){const t=this.drag;if(!t||e.pointerId!==t.pointerId)return;if(!t.active){if(Math.hypot(e.clientX-t.startX,e.clientY-t.startY)<5)return;t.active=!0,t.ghost=this.makeGhost(t.source),document.body.append(t.ghost),this.root.classList.add("dragging")}t.ghost.style.transform=`translate(${e.clientX+12}px, ${e.clientY+12}px)`,this.autoScroll(e.clientX,e.clientY);const n=this.svgPoint(e.clientX,e.clientY);t.target=n?this.dropTargetAt(n.x,n.y,t.source):void 0,this.showDropTarget(t.target)}onPointerUp(e){const t=this.drag;!t||e.pointerId!==t.pointerId||(t.active&&t.target?this.applyDrop(t.source,t.target):!t.active&&t.source.kind==="palette"?this.insertNearSelection(t.source.make()):!t.active&&t.source.kind==="sensor"&&this.insertSensor(t.source.text),this.endDrag())}endDrag(){var e,t;(t=(e=this.drag)==null?void 0:e.ghost)==null||t.remove(),this.drag=void 0,this.root.classList.remove("dragging"),this.showDropTarget(void 0)}makeGhost(e){const t=document.createElement("div");if(t.className="drag-ghost",e.kind==="palette"||e.kind==="sensor")t.textContent=e.label;else{const n=At(this.doc,e.path);t.textContent=`${Xr(n.type)}: ${Ol(n)[0]}`}return t}autoScroll(e,t){const n=this.canvasHost.getBoundingClientRect(),a=40,s=12;t>n.bottom-a&&tn.top-a&&(this.canvasHost.scrollTop-=s),e>n.right-a&&en.left-a&&(this.canvasHost.scrollLeft-=s)}dropTargetAt(e,t,n){var l;const a=((l=this.layout)==null?void 0:l.elements)??[],s=this.nodeAt(e,t);if(n.kind==="sensor")return!s||wn(this.doc,s.idPath)?void 0:ad.includes(At(this.doc,s.idPath).type)?{kind:"condition",path:s.idPath,frame:s.frame}:void 0;if(!s){const u=a[a.length-1];if(!u)return;const m=u.frame.y+u.frame.height;return t>m?n.kind==="move"&&n.path.length===1&&n.path[0]===a.length-1?void 0:{kind:"rootAppend",frame:{x:u.frame.x,y:m,width:u.frame.width,height:0}}:t=n.path.length&&n.path.every((u,m)=>r[m]===u)?void 0:wn(this.doc,r)?{kind:"replace",path:r,frame:s.frame}:{kind:t"]/g,e=>({"&":"&","<":"<",">":">",'"':"""})[e])}function Sd(i){if(!i)return[];for(const e of[...Ot.flatMap(t=>t.steps.flatMap(n=>n.blocks)),...Tn.flatMap(t=>t.blocks)])if(!(e.kind!=="exercise"||e.exercise.id!==i))return e.exercise.tests.flatMap(t=>{const n=t.world?Wa(t.world):void 0;return n?[n]:[]});return[]}let Et,Sl,_l;function _d(i){const e=i.dataset.tip;if(!e)return;Et??(Et=Object.assign(document.createElement("div"),{className:"tooltip",role:"tooltip"})),Et.isConnected||document.body.append(Et),Et.textContent=e,Et.hidden=!1;const t=i.getBoundingClientRect(),n=Et.offsetWidth,a=Et.offsetHeight,s=Math.min(Math.max(8,t.left+t.width/2-n/2),window.innerWidth-n-8),r=t.bottom+6+a{if(i.pointerType==="touch")return;const e=i.target.closest("[data-tip]");e!==_l&&(no(),e&&(_l=e,Sl=window.setTimeout(()=>_d(e),350)))}),document.addEventListener("focusin",i=>{const e=i.target.closest("[data-tip]");no(),e!=null&&e.matches(":focus-visible")&&_d(e)});for(const i of["pointerdown","focusout","scroll","keydown"])document.addEventListener(i,no,!0)}const Tl="visustruct.reloadedAfterError";function Qf(){try{const i=Number(sessionStorage.getItem(Tl));if(i&&Date.now()-i<3e4)return!1;sessionStorage.setItem(Tl,String(Date.now()))}catch{return!1}return location.reload(),!0}function CJ(i){console.error(i);const e=(navigator.language||"").toLowerCase().startsWith("de"),t=document.createElement("div");t.className="startup-error";const n=document.createElement("h1");n.textContent=e?"VisuStruct konnte nicht starten":"VisuStruct could not start";const a=document.createElement("p");a.textContent=e?"Wahrscheinlich gibt es gerade eine neue Version. Lade die Seite neu. Hilft das nicht, drücke Strg+Umschalt+R (Mac: ⌘⇧R).":"There is probably a new version. Reload the page. If that does not help, press Ctrl+Shift+R (Mac: ⌘⇧R).";const s=document.createElement("button");s.textContent=e?"Neu laden":"Reload",s.addEventListener("click",()=>location.reload());const r=document.createElement("pre");r.textContent=String(i instanceof Error?i.message:i),t.append(n,a,s,r),(document.getElementById("app")??document.body).replaceWith(t)}window.addEventListener("vite:preloadError",i=>{Qf()&&i.preventDefault()});const BJ=M2();Promise.all([qd(BJ,!1),Qd(D2(),!1)]).then(()=>{Vf(),jJ();const i=new URLSearchParams(location.search);i.has("visuobject")&&Kh();const e=document.getElementById("app");if(Xh()&&!i.has("visustruct")&&!i.has("visubot"))return q(async()=>{const{ObjectApp:t}=await import("./objectApp-C6ZS5O9z.js").then(n=>n.g);return{ObjectApp:t}},[],import.meta.url).then(({ObjectApp:t})=>new t(e));new OJ(e)}).then(()=>{try{sessionStorage.removeItem(Tl)}catch{}}).catch(i=>{/dynamically imported module|Importing a module script failed|error loading dynamically/i.test(String(i))&&Qf()||CJ(i)});export{Vn as C,DF as J,jx as L,q as _,vF as a,RF as b,Zf as c,EJ as d,br as e,sa as f,_J as g,HD as h,ne as i,GD as j,i1 as k,WJ as m,WF as p,am as r,$D as s,p as t,Po as w}; diff --git a/website/app/assets/objectApp-70d7xQix.js b/website/app/assets/objectApp-C6ZS5O9z.js similarity index 99% rename from website/app/assets/objectApp-70d7xQix.js rename to website/app/assets/objectApp-C6ZS5O9z.js index 377413e4..108f612a 100644 --- a/website/app/assets/objectApp-70d7xQix.js +++ b/website/app/assets/objectApp-C6ZS5O9z.js @@ -1,5 +1,5 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./projectZip-BmUSPT6C.js","./index-B8RBcspd.js","./index-Bv5oUBU1.css"])))=>i.map(i=>d[i]); -var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-B8RBcspd.js";function Xs(a){const e=[];let t=0;for(;ti.map(i=>d[i]); +var Ns=Object.defineProperty;var Os=(a,e,t)=>e in a?Ns(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var E=(a,e,t)=>Os(a,typeof e!="symbol"?e+"":e,t);import{t as d,i as ie,s as Ps,m as Is,g as Ds,w as Rs,J as Hs,c as Bs,a as Ws,b as Ye,p as zs,d as Vs,e as Us,_ as wt,f as $t,h as Js,r as _t,j as Ks,k as ct}from"./index-DpeMIv3e.js";function Xs(a){const e=[];let t=0;for(;te.text===","?", ":e.text).join("")}function ms(a){const e=[[]];let t=0;for(const s of a)s.text==="<"||s.text==="("||s.text==="["||s.text==="{"?t++:(s.text===">"||s.text===")"||s.text==="]"||s.text==="}")&&t--,s.text===","&&t===0?e.push([]):e[e.length-1].push(s);return e.filter(s=>s.length>0)}function ft(a){var t,s;const e=[];for(let i=0;i{const t=ft(e).filter(i=>i.text!=="final"),s=t[t.length-1];return{name:s!=null&&s.word?s.text:"",type:lt(t.slice(0,-1))}})}function kt(a,e,t,s){var x,L;const i=ft(a),n=new Set;let o=0;for(;o"));const r=i.slice(o);if(r.length===0||a.length===0)return[];const c=a[0].from,l=r.findIndex(S=>S.text==="("),h=r.findIndex(S=>S.text==="="),u=l>0&&(h<0||lS.text==="="),y=_<0?g:g.slice(0,_);let w=y.length-1;for(;w>0&&!y[w].word;)w--;if(w<1)return[];const $=lt(y.slice(0,w)),p=m.length>1,v=[];return m.forEach((S,k)=>{var C;const j=S.findIndex(F=>F.text==="="),M=j<0?S:S.slice(0,j),A=k===0?y[w]:M.find(F=>F.word);if(!A)return;const R=M.filter(F=>F.from>A.from&&F.text==="[").length;v.push({kind:"field",name:A.text,type:$+"[]".repeat(R),params:[],visibility:xt(n,f),isStatic:n.has("static"),isAbstract:!1,from:c,to:s,headerFrom:c,headerTo:k===0?((C=M[M.length-1])==null?void 0:C.to)??A.to:A.to,shared:p,nameFrom:A.from,nameTo:A.to})}),v}function Gs(a,e,t){var n;let s=[],i=e;for(;ih.text==="="),c=ye(a,i,"{","}");if(r){s.push(...a.slice(i,c)),i=c;continue}const l=s.map(h=>h.text);l.includes("class")||l.includes("interface")||l.includes("enum")||s.length>0&&t.members.push(...kt(s,t.name,t.kind==="interface",((n=a[c-1])==null?void 0:n.to)??o.to)),s=[],i=c;continue}s.push(o),i++}return t.bodyEnd=a.length>0?a[a.length-1].to:0,i}function oe(a){var n,o,r,c;const e=Xs(a),t=[];let s=[],i=0;for(;iw.text==="class"||w.text==="interface"),f=u>=0?h[u+1]:void 0;if(!(f!=null&&f.word)){i=ye(e,i,"{","}"),s=[];continue}let m=u;for(;m>0&&(fs.has(h[m-1].text)||h[m-1].text==="@");)m--;const g={name:f.text,kind:h[u].text==="interface"?"interface":"class",isAbstract:h.slice(m,u).some(w=>w.text==="abstract"),interfaces:[],members:[],from:((n=s[s.indexOf(h[m])])==null?void 0:n.from)??h[m].from,to:0,headerFrom:((o=s[s.indexOf(h[m])])==null?void 0:o.from)??h[m].from,headerTo:h[h.length-1].to,nameFrom:f.from,nameTo:f.to,bodyEnd:0};let _=u+2;((r=h[_])==null?void 0:r.text)==="<"&&(_=ye(h,_,"<",">"));let y="";for(;_")-1:w.word&&y==="extends"&&g.kind==="class"?g.superclass??(g.superclass=w.text):w.word&&y&&g.interfaces.push(w.text)}i=Gs(e,i+1,g),g.to=((c=e[i-1])==null?void 0:c.to)??a.length,t.push(g),s=[]}return t}function Fe(a){const e=/^([\p{L}_$][\p{L}\p{N}_$]*)(\[\])+$/u.exec(a);if(e)return{name:e[1],many:!0};const t=/^(?:ArrayList|LinkedList|List|Set|HashSet|TreeSet|Collection|Queue|Deque|ArrayDeque|Stack|Vector)<([\p{L}_$][\p{L}\p{N}_$]*)>$/u.exec(a);return t?{name:t[1],many:!0}:{name:a,many:!1}}function Zs(a){const e=new Set(a.map(s=>s.name)),t=[];for(const s of a){s.superclass&&e.has(s.superclass)&&t.push({kind:"extends",from:s.name,to:s.superclass});for(const i of s.interfaces)e.has(i)&&t.push({kind:s.kind==="interface"?"extends":"implements",from:s.name,to:i});for(const i of s.members){if(i.kind!=="field")continue;const n=Fe(i.type);e.has(n.name)&&t.push({kind:"association",from:s.name,to:n.name,role:i.name,multiplicity:n.many?"0..*":"1"})}}return t}function Ge(a){const e=a.params.map(t=>`${t.name}: ${t.type}`).join(", ");return a.kind==="field"?`${a.visibility} ${a.name}: ${a.type}`:a.kind==="constructor"?`${a.visibility} ${a.name}(${e})`:`${a.visibility} ${a.name}(${e}): ${a.type}`}const Qs=/^[\p{L}_$][\p{L}\p{N}_$]*$/u;function Ve(a){var c;let e=a.trim().replace(/;$/,"").trim();if(!e)return;let t;/^[+\-#~]/.test(e)&&(t=e[0],e=e.slice(1).trim());let s=!1;const i=e.split(/\s+/);for(;["static","public","private","protected"].includes(i[0]);){const l=i.shift();l==="static"?s=!0:t??(t=l==="public"?"+":l==="private"?"-":"#")}e=i.join(" ");const n=e.indexOf("(");if(n>=0){const l=e.lastIndexOf(")");if(lg.trim()).filter(Boolean).map(g=>{const _=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*:\s*(.+)$/u.exec(g);if(_)return{name:_[1],type:_[2].replace(/\s+/g,"")};const y=/^(.+)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(g);return y?{name:y[2],type:y[1].replace(/\s+/g,"")}:{name:g,type:"int"}});return{kind:"method",visibility:t,name:h,type:u==null?void 0:u.replace(/\s+/g,""),params:m,isStatic:s}}const o=/^([\p{L}_$][\p{L}\p{N}_$]*)\s*(?::\s*(.+))?$/u.exec(e);if(o)return{kind:"field",visibility:t,name:o[1],type:(c=o[2])==null?void 0:c.replace(/\s+/g,""),params:[],isStatic:s};const r=/^(.+?)\s+([\p{L}_$][\p{L}\p{N}_$]*)$/u.exec(e);if(r)return{kind:"field",visibility:t,name:r[2],type:r[1].replace(/\s+/g,""),params:[],isStatic:s}}const ei={"+":"public ","-":"private ","#":"protected ","~":""};function ti(a){return/^(int|long|short|byte)$/.test(a)?"0":/^(double|float)$/.test(a)?"0.0":a==="boolean"?"false":a==="char"?"' '":"null"}function bs(a,e,t){const s=e.kind==="interface",i=s?"":ei[a.visibility??(a.kind==="field"?"-":"+")],n=a.isStatic?"static ":"";if(a.kind==="field")return`${i}${n}${a.type??"int"} ${a.name}`;const o=a.params.map(r=>`${r.type} ${r.name}`).join(", ");return a.name===e.name?`${i}${a.name}(${o})`:`${i}${n}${t&&!s?"abstract ":""}${a.type??"void"} ${a.name}(${o})`}const Ue=(a,e)=>a.lastIndexOf(` `,e-1)+1;function mt(a,e,t){const s=Ue(a,e),i=a.slice(s,e);let n=t;for(;ns.path===e)&&e!==this.active&&this.openFile(e),this.editor.setMarks({placeholders:[],problems:[],current:t},!0)}showDebugState(){const e=this.dbg;if(!e)return;e.frames=e.vm.stack();const t=e.vm.heap(),s=e.frames[e.frame];s&&this.showLine(s.pos.file,s.pos.line);const i=e.values.size===0&&e.vars.size===0,n=new Set,o=new Map;for(const h of t)for(const u of h.fields){const f=`dbg${h.id}.${u.name}`;o.set(f,u.value),!i&&e.values.get(f)!==u.value&&n.add(f)}e.values=o;const r=new Set,c=new Map;e.frames.forEach((h,u)=>{for(const f of h.vars){const m=`${e.frames.length-u}|${h.title}|${f.name}`;c.set(m,f.value),!i&&e.vars.get(m)!==f.value&&r.add(`${h.title}|${f.name}`)}}),e.vars=c;const l={objects:this.liveObjects(t),changed:n,frames:e.frames,frame:e.frame,changedVars:r,onFrame:h=>{e.frame=h,l.frame=h;const u=e.frames[h];u&&this.showLine(u.pos.file,u.pos.line),this.objectDiagram.renderInspector()},move:(h,u)=>e.places.set(h,u)};this.objectDiagram.live=l,this.sequence=e.vm.sequence(),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}renderSequence(){var n,o,r;const e=this.shell.querySelector(".vo-seqcanvas"),t=e.querySelector(".vo-seq"),s=e.querySelector(".vo-empty"),i=this.sequence;if(s.hidden=!!i&&i.events.length>0,s.textContent=d(i?"web_visuobject_seq_no_calls":"web_visuobject_seq_empty"),!i||!i.events.length)t.innerHTML="",t.setAttribute("width","0");else{const c=((n=this.dbg)==null?void 0:n.state)==="paused"||((o=this.dbg)==null?void 0:o.state)==="input",{svg:l,width:h,height:u}=Ci(i,c?i.events.length-1:void 0);t.innerHTML=l+(i.truncated?`${b(d("web_visuobject_seq_truncated"))}`:""),t.setAttribute("width",String(h)),t.setAttribute("height",String(u)),c&&((r=t.querySelector(".vo-seq-msg.current"))==null||r.scrollIntoView({block:"nearest",inline:"nearest"}))}this.renderSequenceInspector()}renderSequenceInspector(){if(this.objectDiagram.live)return this.objectDiagram.renderInspector();this.inspector.innerHTML=`

${b(d("web_visuobject_seq_hint"))}

`}liveObjects(e){const t=this.dbg,s=this.project.objects??[],i=c=>40+c.fields.length*20,n=[],o=[],r=[];for(const c of e){const l=`dbg${c.id}`,h=t.places.get(l)??s.find(u=>u.name===c.name&&u.cls===c.cls);if(!h){r.push(c);continue}t.places.set(l,{x:h.x,y:h.y}),n.push({x:h.x,y:h.y,w:260,h:i(c)})}for(const c of r){const l=i(c);let h={x:24,y:24};e:for(let u=24;u<6e3;u+=30)for(let f=24;f<=24+3*320;f+=320)if(n.every(m=>f+260+30<=m.x||m.x+m.w+30<=f||u+l+30<=m.y||m.y+m.h+30<=u)){h={x:f,y:u};break e}t.places.set(`dbg${c.id}`,h),n.push({...h,w:260,h:l})}for(const c of e){const l=`dbg${c.id}`;o.push({id:l,name:c.name,cls:c.cls,...t.places.get(l),values:Object.fromEntries(c.fields.map(h=>[h.name,h.value]))})}return o}stopDebug(e,t=!1){const s=this.dbg;s&&clearTimeout(s.timer),this.dbg=void 0,s&&(this.sequence=s.vm.sequence()),this.objectDiagram.live=void 0,this.consolePane().input.hidden=!0,this.shell.querySelector(".vo-dbg-controls").hidden=!0,this.shell.querySelector("[data-action=stop]").disabled=!0,this.shell.querySelector("[data-action=run]").disabled=!1,t||this.editor.setMarks({placeholders:[],problems:[]},!1),e&&this.debugStatus(d(e),t),this.diagramMode==="object"&&this.objectDiagram.render(),this.diagramMode==="sequence"&&this.renderSequence()}chooseWorld(e){e!=="object"&&(Us(e),location.href=`${location.pathname}?${e==="on"?"visubot":"visustruct"}${location.hash}`)}get activeFile(){return this.project.files.find(e=>e.path===this.active)}showActive(){const e=this.activeFile;this.editor.setText((e==null?void 0:e.text)??""),this.editor.setBreakpoints(e?this.breakpoints.get(e.path)??[]:[]),this.editor.setReadOnly(!e),e&&!this.openTabs.includes(e.path)&&this.openTabs.push(e.path),this.renderTabs(),J(ot,this.active??"")}renderTabs(){if(this.openTabs=this.openTabs.filter(e=>this.project.files.some(t=>t.path===e)),J(cs,JSON.stringify(this.openTabs)),this.openTabs.length===0){this.tabs.innerHTML=`${b(d("web_visuobject_no_file"))}`;return}this.tabs.innerHTML=this.openTabs.map(e=>{const t=e===this.active,s=this.isDirty(e);return`
-
`}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-BmUSPT6C.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-BmUSPT6C.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} + `}).join("")}onTabClick(e){var i;const t=e.target,s=(i=t.closest("[data-tab]"))==null?void 0:i.dataset.tab;if(s){if(t.closest("[data-close]"))return this.closeTab(s);this.treeSelection=`file:${s}`,this.openFile(s)}}closeTab(e){const t=this.openTabs.indexOf(e);t<0||(this.openTabs.splice(t,1),e===this.active?(this.active=this.openTabs[Math.min(t,this.openTabs.length-1)],this.lastTyping=0,this.showActive(),this.refresh()):this.renderTabs())}snapshot(){return JSON.stringify({project:this.project,active:this.active})}remember(){this.history.push(this.snapshot()),this.history.length>xn&&this.history.shift(),this.future=[]}setProject(e,t=this.active){var s;this.remember(),this.lastTyping=0,this.project=e,this.active=e.files.some(i=>i.path===t)?t:(s=e.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}openFile(e){if(e===this.active)return;this.active=e,this.lastTyping=0,this.showActive();const t=D(e);this.currentPackage=t,this.open.set(`pkg:${t}`,!0),this.refresh()}typed(){const e=this.activeFile;if(!e)return;const t=Date.now();t-this.lastTyping>1500&&this.remember(),this.lastTyping=t,this.project=$e(this.project,e.path,this.editor.text),this.saveBreakpoints(),this.dbg&&this.stopDebug("web_visuobject_dbg_code_changed"),this.refresh(),clearTimeout(this.renameTimer),this.renameTimer=window.setTimeout(()=>this.syncFileName(),700)}syncFileName(){var c;const e=this.activeFile;if(!e||this.editing)return;const t=Q(e.path).replace(/\.java$/i,""),s=this.classes.filter(l=>l.path===e.path);if(s.length===0||s.some(l=>l.name===t))return;const i=((c=/\bpublic\s+(?:abstract\s+|final\s+)*(?:class|interface|enum)\s+(\w+)/.exec(e.text))==null?void 0:c[1])??s[0].name;if(!pe.test(i)||s.filter(l=>l.name===i).length!==1)return;const n=le(D(e.path),`${i}.java`);if(this.project.files.some(l=>l.path===n))return;let o=Oe(this.project,e.path,n);const r=this.positions.get(t);r&&!this.positions.has(i)&&this.positions.set(i,r);for(const l of Object.keys(o.uml??{}))l.startsWith(`${t}.`)&&(o={...o,uml:ke(o.uml,l,i+l.slice(t.length))});this.openTabs=this.openTabs.map(l=>l===e.path?n:l),this.treeSelection===`file:${e.path}`&&(this.treeSelection=`file:${n}`),this.isOpen(`file:${e.path}`)&&this.open.set(`file:${n}`,!0),this.project=o,this.active=n,J(ot,n),this.savePositions(),this.refresh()}undo(e){const t=e?this.future:this.history,s=e?this.history:this.future,i=t.pop();if(i===void 0)return;s.push(this.snapshot());const n=JSON.parse(i);this.project=n.project,this.active=n.active,this.lastTyping=0,this.showActive(),this.refresh()}refresh(){J(os,Pe(this.project)),this.renderTabs(),this.classes=Ct(this.project),this.selection&&!this.findClass(this.selection.cls)&&(this.selection=void 0),this.relSelection&&!this.findRelation(this.relSelection)&&!this.findDependency(this.relSelection)&&(this.relSelection=void 0),this.editing||(this.render(),this.renderTree())}ownTypesAt(e){const t=this.activeFile;if(!t)return;const s=this.editor.view.state.doc.toString(),i=X(D(t.path)),n=oe(s).map(l=>({...l,pkg:i})),o=new Set(n.map(l=>l.name)),r=n.find(l=>l.headerFrom<=e&&e<=l.bodyEnd),c=ct()==="de"?"de":ct()==="pt-PT"?"pt":"en";return Ui([...n,...this.classes.filter(l=>l.path!==t.path&&!o.has(l.name))],{cls:r==null?void 0:r.name,pkg:i},c)}findClass(e){return this.classes.find(t=>t.name===e)}caretMoved(){var n,o;const e=this.editor.caret,t=this.classes.find(r=>r.path===this.active&&e>=r.from&&e<=r.to),s=t==null?void 0:t.members.findIndex(r=>e>=r.from&&e<=r.to),i=t?{cls:t.name,member:s!==void 0&&s>=0?s:void 0}:void 0;(i==null?void 0:i.cls)===((n=this.selection)==null?void 0:n.cls)&&(i==null?void 0:i.member)===((o=this.selection)==null?void 0:o.member)||(this.selection=i,this.editing||(this.render(),this.renderTree()))}showInCode(e,t){e.path!==this.active&&(this.active=e.path,this.lastTyping=0,this.showActive());const s=this.editor.view,[i,n]=t?[t.headerFrom,t.headerTo]:[e.nameFrom,e.nameTo],o=Math.min(n,s.state.doc.length);s.dispatch({selection:{anchor:Math.min(i,o),head:o},scrollIntoView:!0})}message(e,t=!1){this.status.textContent=e,this.status.classList.toggle("hint",t)}openFiles(){const e=document.createElement("input");e.type="file",e.multiple=!0,e.accept=".zip,.java,.visuobject,application/zip,text/plain",e.addEventListener("change",()=>void this.readFiles([...e.files??[]])),e.click()}async readFiles(e){var t;if(e.length!==0)try{const s=e.find(r=>/\.zip$/i.test(r.name));if(s){const{projectFromZip:r}=await wt(async()=>{const{projectFromZip:l}=await import("./projectZip-vbJDEaKJ.js");return{projectFromZip:l}},__vite__mapDeps([0,1,2]),import.meta.url),c=r(new Uint8Array(await s.arrayBuffer()),s.name.replace(/\.zip$/i,""));await this.newProject(c);return}const i=e.find(r=>/\.visuobject$/i.test(r.name));if(i){const r=qt(await i.text());if(!r)throw new Error("format");await this.newProject(r);return}const n=At(this.project.name,await Promise.all(e.map(async r=>({name:r.name,text:await r.text()}))));let o=this.project;for(const r of n.files)o=et(o,r.path,r.text);this.setProject(o,(t=n.files[0])==null?void 0:t.path)}catch{this.message(d("web_visuobject_open_failed"))}}async save(){this.workspace?await this.writeCurrent():await this.downloadZip()}async downloadZip(){const{projectToZip:e}=await wt(async()=>{const{projectToZip:s}=await import("./projectZip-vbJDEaKJ.js");return{projectToZip:s}},__vite__mapDeps([0,1,2]),import.meta.url),t=e(this.project);jn(`${this.project.name||"Projekt"}.zip`,t.slice().buffer,"application/zip")}isDirty(e){var t;return!this.workspace||this.saved===void 0?!1:e===void 0?this.saved!==Pe(this.project):this.savedFiles.get(e)!==((t=this.project.files.find(s=>s.path===e))==null?void 0:t.text)}markSaved(){this.saved=Pe(this.project),this.savedFiles=new Map(this.project.files.map(e=>[e.path,e.text]))}async restoreWorkspace(){if(!$t())return;const e=await Js(us);if(e!=null&&e.ready){const t=await _t(e.handle);if(t)return this.useWorkspace(t.root,!0)}this.pendingFolder=e==null?void 0:e.handle,this.renderWorkspace()}async useWorkspace(e,t=!1){var s;this.workspace=e,this.pendingFolder=void 0,J(rt,"0");try{this.projects=await is(e);const i=se(We),n=this.project;if(t&&i&&this.projects.includes(i)){const o={active:this.active,tabs:[...this.openTabs],positions:new Map(this.positions)};await this.loadProject(i),this.positions=o.positions,this.savePositions(),Pe(n)!==this.saved&&(this.project=n),this.openTabs=o.tabs.filter(r=>this.project.files.some(c=>c.path===r)),this.active=this.project.files.some(r=>r.path===o.active)?o.active:(s=this.project.files[0])==null?void 0:s.path,this.showActive(),this.refresh()}else!this.projects.some(o=>o.toLowerCase()===ge(n.name).toLowerCase())&&n.files.length?(this.folder=ge(n.name),await this.writeCurrent(!1)):this.projects.length?await this.loadProject(this.projects.includes(i??"")?i:this.projects[0]):(this.folder=ge(n.name),await this.writeCurrent(!1))}catch(i){this.message(d("web_visuobject_ws_failed",String((i==null?void 0:i.message)??i)))}this.renderWorkspace(),this.refresh()}async loadProject(e){var i;const{project:t,positions:s}=await gn(this.workspace,e);this.folder=e,this.project=t,this.markSaved(),this.message(""),this.history=[],this.future=[],this.lastTyping=0,this.selection=void 0,this.relSelection=void 0,this.treeSelection=void 0,this.currentPackage=void 0,this.positions=new Map(Object.entries(s)),this.savePositions(),this.openTabs=[],this.active=(i=t.files[0])==null?void 0:i.path,J(We,e),this.showActive(),this.refresh()}async writeCurrent(e=!0){const t=this.workspace;if(!t)return!1;const s=ge(this.project.name),i=this.folder,n=new Set(this.classes.map(r=>r.name)),o=Object.fromEntries([...this.positions].filter(([r])=>n.has(r)));if(s!==i&&this.projects.some(r=>r!==i&&r.toLowerCase()===s.toLowerCase()))return this.message(d("web_visuobject_ws_taken",this.project.name)),!1;try{return await $n(t,s,this.project,o),i&&i!==s&&this.projects.includes(i)&&await t.remove(i),this.folder=s,this.projects=await is(t),J(We,s),this.markSaved(),e&&this.message(d("web_visuobject_ws_saved",t.name,s),!0),this.refresh(),!0}catch(r){return this.message(d("web_visuobject_ws_failed",String((r==null?void 0:r.message)??r))),!1}}async switchProject(e){if(!(!this.workspace||e===this.folder)&&!(this.isDirty()&&!await this.writeCurrent(!1)))try{await this.loadProject(e)}catch(t){this.message(d("web_visuobject_ws_failed",String((t==null?void 0:t.message)??t)))}}async newProject(e,t,s=!1){var n,o;if(!this.workspace){this.setProject(e,t??((n=e.files[0])==null?void 0:n.path)),e.files.length===0&&!s&&this.editProjectName();return}if(this.isDirty()&&!await this.writeCurrent(!1))return;const i=ns(ge(e.name),this.projects);this.project={...e,name:i},this.folder=i,this.history=[],this.future=[],this.openTabs=[],this.positions.clear(),this.savePositions(),this.active=e.files.some(r=>r.path===t)?t:(o=e.files[0])==null?void 0:o.path,this.showActive(),this.refresh(),await this.writeCurrent(!1)&&(this.message(d("web_visuobject_ws_created",i),!0),e.files.length===0&&!s&&this.editProjectName())}get currentPlace(){const e=this.currentPackage??(this.active?D(this.active):ce(this.project)[0]??"");return{root:U(e),pkg:X(e)}}async newFromWizard(e){var u;const t=this.currentPlace,s=(f,m)=>{let g=f;for(let _=2;m(g);_++)g=f+_;return g},i=await nn(e,{roots:ue(this.project),packagesIn:f=>ce(this.project,f).map(X),classes:this.classes,root:t.root,pkg:t.pkg,suggest:f=>f==="project"?ns(d("web_visuobject_project_name"),this.workspace?[...this.projects,this.folder??""]:[]):f==="folder"?s("test",m=>ue(this.project).includes(m)):f==="package"?s(d("web_visuobject_new_package_name"),m=>ce(this.project).includes(re(t.root,m))):this.uniqueClassName(d(f==="class"?"web_visuobject_new_class_name":"web_visuobject_new_interface_name")),check:(f,m,g,_)=>{if(!m)return d("web_visuobject_new_name_missing");if(f==="project")return this.workspace&&this.projects.some(y=>y!==this.folder&&y.toLowerCase()===ge(m).toLowerCase())?d("web_visuobject_ws_taken",m):void 0;if(f==="folder")return!Je(m)||ue(this.project).includes(m)?d("web_visuobject_bad_folder",m):void 0;if(f==="package")return!Mt(m)||ce(this.project).includes(re(g,m))?d("web_visuobject_bad_package",m):void 0;if(!pe.test(m))return d("web_visuobject_bad_name",m);if(this.findClass(m)||this.project.files.some(y=>y.path===le(re(g,_),`${m}.java`)))return d("web_visuobject_new_exists",m);if(m.charAt(0)!==m.charAt(0).toUpperCase())return d("web_visuobject_new_upper")}});if(!i)return;const{name:n,root:o,pkg:r}=i;if(e==="project")return this.newProject({name:n,files:[],packages:[]},void 0,!0);if(this.message(""),e==="folder")return this.currentPackage=re(n,""),this.treeSelection=`root:${n}`,this.open.set(`root:${n}`,!0),this.setProject(mi(this.project,n));if(e==="package"){const f=re(o,n);return this.currentPackage=f,this.treeSelection=`pkg:${f}`,this.open.set(`root:${o}`,!0),this.setProject(pi(this.project,f))}const c=re(o,r),l=le(c,`${n}.java`);this.currentPackage=c,this.selection={cls:n},this.open.set(`root:${o}`,!0),this.open.set(`pkg:${c}`,!0),this.setProject(et(this.project,l,this.sectioned(tn(i.options),n)),l);const h=this.findClass(n);h&&this.showInCode(h),(u=this.canvas.querySelector(`.uml-class[data-class="${CSS.escape(n)}"]`))==null||u.scrollIntoView({block:"nearest",inline:"nearest"})}editProjectName(){this.treeSelection="project",this.renderTree(),this.startEditing(this.tree.querySelector('[data-node="project"] > .vo-row .vo-label'))}renderWorkspace(){const e=this.wsBox;e.hidden=!$t();const t=this.shell.querySelector("[data-action=save]");if(t.dataset.tip=d(this.workspace?"web_visuobject_save_ws_tip":"web_visuobject_save_tip"),e.hidden)return;const s=(i,n,o="text-button",r)=>``;this.workspace?(e.className="vo-ws",e.innerHTML=`${b(this.workspace.name)} ${s("zip",d("web_visuobject_ws_zip"),"text-button",d("web_visuobject_ws_zip_tip"))} ${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):this.pendingFolder?(e.className="vo-ws",e.innerHTML=`${s("reopen",d("web_visuobject_ws_reopen",this.pendingFolder.name),"text-button primary")}${s("switch",d("web_visuobject_ws_switch"),"text-button")}`):se(rt)==="1"?(e.className="vo-ws",e.innerHTML=s("open",d("web_visuobject_ws_choose"),"text-button",d("web_visuobject_ws_hint"))):(e.className="vo-ws ask",e.innerHTML=`

${b(d("web_visuobject_ws_question"))}

${b(d("web_visuobject_ws_hint"))}

diff --git a/website/app/assets/projectZip-BmUSPT6C.js b/website/app/assets/projectZip-vbJDEaKJ.js similarity index 99% rename from website/app/assets/projectZip-BmUSPT6C.js rename to website/app/assets/projectZip-vbJDEaKJ.js index ad3d8d4b..95044980 100644 --- a/website/app/assets/projectZip-BmUSPT6C.js +++ b/website/app/assets/projectZip-vbJDEaKJ.js @@ -1 +1 @@ -import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-70d7xQix.js";import"./index-B8RBcspd.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; +import{p as Br,d as Er,a as mr,i as Gr,b as Qr,c as Vr,u as Lr,n as _r,o as pr,e as br,r as dr,f as re,s as ee}from"./objectApp-C6ZS5O9z.js";import"./index-DpeMIv3e.js";var M=Uint8Array,K=Uint16Array,Tr=Int32Array,hr=new M([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),gr=new M([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Sr=new M([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Wr=function(r,e){for(var n=new K(31),a=0;a<31;++a)n[a]=e+=1<>1|(F&21845)<<1;b=(b&52428)>>2|(b&13107)<<2,b=(b&61680)>>4|(b&3855)<<4,Cr[F]=((b&65280)>>8|(b&255)<<8)>>1}var V=(function(r,e,n){for(var a=r.length,f=0,v=new K(e);f>l]=c}else for(s=new K(a),f=0;f>15-r[f]);return s}),d=new M(288);for(var F=0;F<144;++F)d[F]=8;for(var F=144;F<256;++F)d[F]=9;for(var F=256;F<280;++F)d[F]=7;for(var F=280;F<288;++F)d[F]=8;var ir=new M(32);for(var F=0;F<32;++F)ir[F]=5;var ae=V(d,9,0),fe=V(d,9,1),ve=V(ir,5,0),te=V(ir,5,1),xr=function(r){for(var e=r[0],n=1;ne&&(e=r[n]);return e},X=function(r,e,n){var a=e/8|0;return(r[a]|r[a+1]<<8)>>(e&7)&n},yr=function(r,e){var n=e/8|0;return(r[n]|r[n+1]<<8|r[n+2]<<16)>>(e&7)},Ur=function(r){return(r+7)/8|0},lr=function(r,e,n){return(e==null||e<0)&&(e=0),(n==null||n>r.length)&&(n=r.length),new M(r.subarray(e,n))},oe=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],I=function(r,e,n){var a=new Error(e||oe[r]);if(a.code=r,Error.captureStackTrace&&Error.captureStackTrace(a,I),!n)throw a;return a},ie=function(r,e,n,a){var f=r.length,v=a?a.length:0;if(!f||e.f&&!e.l)return n||new M(0);var i=!n,s=i||e.i!=2,l=e.i;i&&(n=new M(f*3));var c=function(fr){var vr=n.length;if(fr>vr){var nr=new M(Math.max(vr*2,fr));nr.set(n),n=nr}},t=e.f||0,o=e.p||0,u=e.b||0,h=e.l,y=e.d,w=e.m,x=e.n,T=f*8;do{if(!h){t=X(r,o,1);var z=X(r,o+1,3);if(o+=3,z)if(z==1)h=fe,y=te,w=9,x=5;else if(z==2){var U=X(r,o,31)+257,A=X(r,o+10,15)+4,m=U+X(r,o+5,31)+1;o+=14;for(var g=new M(m),B=new M(19),j=0;j>4;if(C<16)g[j++]=C;else{var E=0,k=0;for(C==16?(k=3+X(r,o,3),o+=2,E=g[j-1]):C==17?(k=3+X(r,o,7),o+=3):C==18&&(k=11+X(r,o,127),o+=7);k--;)g[j++]=E}}var W=g.subarray(0,U),J=g.subarray(U);w=xr(W),x=xr(J),h=V(W,w,1),y=V(J,x,1)}else I(1);else{var C=Ur(o)+4,O=r[C-4]|r[C-3]<<8,$=C+O;if($>f){l&&I(0);break}s&&c(u+O),n.set(r.subarray(C,$),u),e.b=u+=O,e.p=o=$*8,e.f=t;continue}if(o>T){l&&I(0);break}}s&&c(u+131072);for(var ar=(1<>4;if(o+=E&15,o>T){l&&I(0);break}if(E||I(2),q<256)n[u++]=q;else if(q==256){L=o,h=null;break}else{var H=q-254;if(q>264){var j=q-257,S=hr[j];H=X(r,o,(1<>4;G||I(3),o+=G&15;var J=ne[rr];if(rr>3){var S=gr[rr];J+=yr(r,o)&(1<T){l&&I(0);break}s&&c(u+131072);var er=u+H;if(u>8},tr=function(r,e,n){n<<=e&7;var a=e/8|0;r[a]|=n,r[a+1]|=n>>8,r[a+2]|=n>>16},Fr=function(r,e){for(var n=[],a=0;au&&(u=v[a].s);var h=new K(u+1),y=Or(n[t-1],h,0);if(y>e){var a=0,w=0,x=y-e,T=1<e)w+=T-(1<>=x;w>0;){var C=v[a].s;h[C]=0&&w;--a){var O=v[a].s;h[O]==e&&(--h[O],++w)}y=e}return{t:new M(h),l:y}},Or=function(r,e,n){return r.s==-1?Math.max(Or(r.l,e,n+1),Or(r.r,e,n+1)):e[r.s]=n},Nr=function(r){for(var e=r.length;e&&!r[--e];);for(var n=new K(++e),a=0,f=r[0],v=1,i=function(l){n[a++]=l},s=1;s<=e;++s)if(r[s]==f&&s!=e)++v;else{if(!f&&v>2){for(;v>138;v-=138)i(32754);v>2&&(i(v>10?v-11<<5|28690:v-3<<5|12305),v=0)}else if(v>3){for(i(f),--v;v>6;v-=6)i(8304);v>2&&(i(v-3<<5|8208),v=0)}for(;v--;)i(f);v=1,f=r[s]}return{c:n.subarray(0,a),n:e}},or=function(r,e){for(var n=0,a=0;a>8,r[f+2]=r[f]^255,r[f+3]=r[f+1]^255;for(var v=0;v4&&!B[Sr[D-1]];--D);var p=c+5<<3,Z=or(f,d)+or(v,ir)+i,P=or(f,u)+or(v,w)+i+14+3*D+or(A,B)+2*A[16]+3*A[17]+7*A[18];if(l>=0&&p<=Z&&p<=P)return Kr(e,t,r.subarray(l,l+c));var E,k,W,J;if(_(e,t,1+(P15&&(_(e,t,q[m]>>5&127),t+=q[m]>>12)}}else E=ae,k=d,W=ve,J=ir;for(var m=0;m255){var H=S>>18&31;tr(e,t,E[H+257]),t+=k[H+257],H>7&&(_(e,t,S>>23&31),t+=hr[H]);var G=S&31;tr(e,t,W[G]),t+=J[G],G>3&&(tr(e,t,S>>5&8191),t+=gr[G])}else tr(e,t,E[S]),t+=k[S]}return tr(e,t,E[256]),t+k[256]},le=new Tr([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),Rr=new M(0),se=function(r,e,n,a,f,v){var i=v.z||r.length,s=new M(a+i+5*(1+Math.ceil(i/7e3))+f),l=s.subarray(a,s.length-f),c=v.l,t=(v.r||0)&7;if(e){t&&(l[0]=v.r>>3);for(var o=le[e-1],u=o>>13,h=o&8191,y=(1<7e3||B>24576)&&(E>423||!c)){t=Dr(r,l,0,O,$,U,m,B,D,g-D,t),B=A=m=0,D=g;for(var k=0;k<286;++k)$[k]=0;for(var k=0;k<30;++k)U[k]=0}var W=2,J=0,ar=h,R=Z-P&32767;if(E>2&&p==C(g-R))for(var L=Math.min(u,E)-1,q=Math.min(32767,g),H=Math.min(258,E);R<=q&&--ar&&Z!=P;){if(r[g+W]==r[g+W-R]){for(var S=0;SW){if(W=S,J=R,S>L)break;for(var G=Math.min(R,S-2),rr=0,k=0;krr&&(rr=ur,P=er)}}}Z=P,P=w[Z],R+=Z-P&32767}if(J){O[B++]=268435456|Mr[W]<<18|Jr[J];var fr=Mr[W]&31,vr=Jr[J]&31;m+=hr[fr]+gr[vr],++$[257+fr],++U[vr],j=g+W,++A}else O[B++]=r[g],++$[r[g]]}}for(g=Math.max(g,j);g=i&&(l[t/8|0]=c,nr=i),t=Kr(l,t+1,r.subarray(g,nr))}v.i=i}return lr(s,0,a+Ur(t)+f)},ue=(function(){for(var r=new Int32Array(256),e=0;e<256;++e){for(var n=e,a=9;--a;)n=(n&1&&-306674912)^n>>>1;r[e]=n}return r})(),ce=function(){var r=-1;return{p:function(e){for(var n=r,a=0;a>>8;r=n},d:function(){return~r}}},he=function(r,e,n,a,f){if(!f&&(f={l:1},e.dictionary)){var v=e.dictionary.subarray(-32768),i=new M(v.length+r.length);i.set(v),i.set(r,v.length),r=i,f.w=v.length}return se(r,e.level==null?6:e.level,e.mem==null?f.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+e.mem,n,a,f)},Xr=function(r,e){var n={};for(var a in r)n[a]=r[a];for(var a in e)n[a]=e[a];return n},Q=function(r,e){return r[e]|r[e+1]<<8},Y=function(r,e){return(r[e]|r[e+1]<<8|r[e+2]<<16|r[e+3]<<24)>>>0},kr=function(r,e){return Y(r,e)+Y(r,e+4)*4294967296},N=function(r,e,n){for(;n;++e)r[e]=n,n>>>=8};function ge(r,e){return he(r,e||{},0,0)}function we(r,e){return ie(r,{i:2},e&&e.out,e&&e.dictionary)}var Yr=function(r,e,n,a){for(var f in r){var v=r[f],i=e+f,s=a;Array.isArray(v)&&(s=Xr(a,v[1]),v=v[0]),v instanceof M?n[i]=[v,s]:(n[i+="/"]=[new M(0),s],Yr(v,i,n,a))}},Ir=typeof TextEncoder<"u"&&new TextEncoder,Ar=typeof TextDecoder<"u"&&new TextDecoder,me=0;try{Ar.decode(Rr,{stream:!0}),me=1}catch{}var xe=function(r){for(var e="",n=0;;){var a=r[n++],f=(a>127)+(a>223)+(a>239);if(n+f>r.length)return{s:e,r:lr(r,n-1)};f?f==3?(a=((a&15)<<18|(r[n++]&63)<<12|(r[n++]&63)<<6|r[n++]&63)-65536,e+=String.fromCharCode(55296|a>>10,56320|a&1023)):f&1?e+=String.fromCharCode((a&31)<<6|r[n++]&63):e+=String.fromCharCode((a&15)<<12|(r[n++]&63)<<6|r[n++]&63):e+=String.fromCharCode(a)}};function cr(r,e){var n;if(Ir)return Ir.encode(r);for(var a=r.length,f=new M(r.length+(r.length>>1)),v=0,i=function(c){f[v++]=c},n=0;nf.length){var s=new M(v+8+(a-n<<1));s.set(f),f=s}var l=r.charCodeAt(n);l<128||e?i(l):l<2048?(i(192|l>>6),i(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|r.charCodeAt(++n)&1023,i(240|l>>18),i(128|l>>12&63),i(128|l>>6&63),i(128|l&63)):(i(224|l>>12),i(128|l>>6&63),i(128|l&63))}return lr(f,0,v)}function jr(r,e){if(e){for(var n="",a=0;a65535&&I(9),e+=a+4}return e},Pr=function(r,e,n,a,f,v,i,s){var l=a.length,c=n.extra,t=s&&s.length,o=zr(c);N(r,e,i!=null?33639248:67324752),e+=4,i!=null&&(r[e++]=20,r[e++]=n.os),r[e]=20,e+=2,r[e++]=n.flag<<1|(v<0&&8),r[e++]=f&&8,r[e++]=n.compression&255,r[e++]=n.compression>>8;var u=new Date(n.mtime==null?Date.now():n.mtime),h=u.getFullYear()-1980;if((h<0||h>119)&&I(10),N(r,e,h<<25|u.getMonth()+1<<21|u.getDate()<<16|u.getHours()<<11|u.getMinutes()<<5|u.getSeconds()>>1),e+=4,v!=-1&&(N(r,e,n.crc),N(r,e+4,v<0?-v-2:v),N(r,e+8,n.size)),N(r,e+12,l),N(r,e+14,o),e+=16,i!=null&&(N(r,e,t),N(r,e+6,n.attrs),N(r,e+10,i),e+=14),r.set(a,e),e+=l,o)for(var y in c){var w=c[y],x=w.length;N(r,e,+y),N(r,e+2,x),r.set(w,e+4),e+=4+x}return t&&(r.set(s,e),e+=t),e},Se=function(r,e,n,a,f){N(r,e,101010256),N(r,e+8,n),N(r,e+10,n),N(r,e+12,a),N(r,e+16,f)};function Me(r,e){e||(e={});var n={},a=[];Yr(r,"",n,e);var f=0,v=0;for(var i in n){var s=n[i],l=s[0],c=s[1],t=c.level==0?0:8,o=cr(i),u=o.length,h=c.comment,y=h&&cr(h),w=y&&y.length,x=zr(c.extra);u>65535&&I(11);var T=t?ge(l,c):l,z=T.length,C=ce();C.p(l),a.push(Xr(c,{size:l.length,crc:C.d(),c:T,f:o,m:y,u:u!=i.length||y&&h.length!=w,o:f,compression:t})),f+=30+u+x+z,v+=76+2*(u+x)+(w||0)+z}for(var O=new M(v+22),$=f,U=v-f,A=0;A65558)&&I(13);var f=Q(r,a+8);if(!f)return{};var v=Y(r,a+16),i=v==4294967295||f==65535;if(i){var s=Y(r,a-12);i=Y(r,s)==101075792,i&&(f=Y(r,s+32),v=Y(r,s+48))}for(var l=0;l|]/g,"_")||"Projekt",n={};for(const l of r.files)n[`${e}/${br(l.path)}`]=new Uint8Array(cr(l.text));const a=[...r.packages.map(l=>`${e}/${dr(l)}/${re(l).replace(/\./g,"/")}/`),...ee(r).map(l=>`${e}/${l}/`)];for(const l of a)Object.keys(n).some(c=>c.startsWith(l))||(n[l.replace(/\/\/$/,"/")]=new Uint8Array);return(r.uml&&Object.keys(r.uml).length||(f=r.notes)!=null&&f.length||(v=r.objects)!=null&&v.length)&&(n[`${e}/${$r}`]=new Uint8Array(cr(JSON.stringify({format:"visuobject",version:1,uml:r.uml??{},...(i=r.notes)!=null&&i.length?{notes:r.notes}:{},...(s=r.objects)!=null&&s.length?{objects:r.objects}:{}},null,2)))),Me(n,{level:6})}function ze(r,e){var c;const n=Ce(r),a=Object.entries(n).filter(([t])=>/\.java$/i.test(t)&&!t.startsWith("__MACOSX/")).map(([t,o])=>({name:t,text:jr(o)})),f=new Set(Object.keys(n).map(t=>t.split("/")[0])),v=f.size===1&&Object.keys(n).some(t=>t.includes("/"))?[...f][0]:e,i=v!==e,s=Br(v,[]);for(const t of a){const o=Br(v,[{name:t.name.slice(t.name.lastIndexOf("/")+1),text:t.text}]).files[0],u=t.name.split("/").slice(i?1:0,-1),h=Er(o.text).split(".").filter(Boolean),w=u.slice(u.length-h.length).join("/")===h.join("/")?u.slice(0,u.length-h.length).join("/"):"",x=w&&w!==mr&&w.split("/").every(Gr)&&!w.includes(":")?w:mr,T=Qr(Vr(x,Er(o.text)),o.path.slice(o.path.lastIndexOf("/")+1));s.files=[...s.files.filter(z=>z.path!==T),{...o,path:T}],x!==mr&&!((c=s.sourceFolders)!=null&&c.includes(x))&&(s.sourceFolders=[...s.sourceFolders??[],x])}const l=Object.entries(n).find(([t])=>t===$r||t.endsWith(`/${$r}`));if(l)try{const t=JSON.parse(jr(l[1])),o=Lr(t.uml);o&&(s.uml=o);const u=_r(t.notes);u&&(s.notes=u);const h=pr(t.objects);h&&(s.objects=h)}catch{}return s}export{ze as projectFromZip,je as projectToZip}; diff --git a/website/app/assets/robot3d-DrGbnn-t.js b/website/app/assets/robot3d-s_ti3AsW.js similarity index 99% rename from website/app/assets/robot3d-DrGbnn-t.js rename to website/app/assets/robot3d-s_ti3AsW.js index 19c2b705..622da925 100644 --- a/website/app/assets/robot3d-DrGbnn-t.js +++ b/website/app/assets/robot3d-s_ti3AsW.js @@ -1,4 +1,4 @@ -var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-B8RBcspd.js";/** +var gl=Object.defineProperty;var _l=(i,t,e)=>t in i?gl(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var le=(i,t,e)=>_l(i,typeof t!="symbol"?t+"":t,e);import{C as rn,L as oo}from"./index-DpeMIv3e.js";/** * @license * Copyright 2010-2025 Three.js Authors * SPDX-License-Identifier: MIT diff --git a/website/app/index.html b/website/app/index.html index f7215e61..0a256476 100644 --- a/website/app/index.html +++ b/website/app/index.html @@ -6,7 +6,7 @@ VisuStruct Web - +