From c6af7bbf50065bd1bb0891a10e0fdb6a3fd05611 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Wed, 6 Mar 2024 21:26:47 +0100 Subject: [PATCH 01/60] motivation --- documentation/latex/lib/bib.bib | 3 +- documentation/latex/main.tex | 78 ++++++++++--------- documentation/latex/sections/analyse.tex | 14 +--- documentation/latex/sections/conclusion.tex | 16 +--- documentation/latex/sections/einleitung.tex | 8 +- documentation/latex/sections/recherche.tex | 12 +-- documentation/latex/sections/umsetzung.tex | 17 +--- documentation/latex/subsections/api.tex | 4 + documentation/latex/subsections/ausblick.tex | 4 + documentation/latex/subsections/cve.tex | 2 + .../latex/subsections/laufzeitanalyse.tex | 5 ++ .../latex/subsections/laufzeitmessungen.tex | 3 + .../latex/subsections/motivation.tex | 28 +++++++ .../subsections/n\303\244chste_schritte.tex" | 4 + .../latex/subsections/problemstellung.tex | 5 ++ .../latex/subsections/referenzen.tex | 5 ++ .../latex/subsections/technologiestack.tex | 6 ++ .../latex/subsections/umgang_mit_cve.tex | 2 + documentation/latex/subsections/vision.tex | 10 +++ documentation/latex/subsections/vorgehen.tex | 20 +++++ .../latex/subsubsections/controller.tex | 3 + .../latex/subsubsections/db_anbindung.tex | 2 + .../latex/subsubsections/dependa_bot.tex | 2 + .../latex/subsubsections/modells.tex | 3 + documentation/latex/subsubsections/nist.tex | 2 + .../latex/subsubsections/weitere.tex | 2 + 26 files changed, 168 insertions(+), 92 deletions(-) create mode 100644 documentation/latex/subsections/api.tex create mode 100644 documentation/latex/subsections/ausblick.tex create mode 100644 documentation/latex/subsections/cve.tex create mode 100644 documentation/latex/subsections/laufzeitanalyse.tex create mode 100644 documentation/latex/subsections/laufzeitmessungen.tex create mode 100644 documentation/latex/subsections/motivation.tex create mode 100644 "documentation/latex/subsections/n\303\244chste_schritte.tex" create mode 100644 documentation/latex/subsections/problemstellung.tex create mode 100644 documentation/latex/subsections/referenzen.tex create mode 100644 documentation/latex/subsections/technologiestack.tex create mode 100644 documentation/latex/subsections/umgang_mit_cve.tex create mode 100644 documentation/latex/subsections/vision.tex create mode 100644 documentation/latex/subsections/vorgehen.tex create mode 100644 documentation/latex/subsubsections/controller.tex create mode 100644 documentation/latex/subsubsections/db_anbindung.tex create mode 100644 documentation/latex/subsubsections/dependa_bot.tex create mode 100644 documentation/latex/subsubsections/modells.tex create mode 100644 documentation/latex/subsubsections/nist.tex create mode 100644 documentation/latex/subsubsections/weitere.tex diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index f8f1585..e9cdca5 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -6,4 +6,5 @@ @book{Buch:Demo edition = "Demo", year = "2023", isbn = "000-0-00000-000-0" -} \ No newline at end of file +} +%https://www.redhat.com/de/topics/security/what-is-cve \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 1e8ed04..e915812 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -109,45 +109,49 @@ \newpage - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - \begin{wrapfigure}{l}{0.5\textwidth} - \centering - \begin{tikzpicture} - \begin{axis}[ - ybar, - bar width=0.5cm, - width=0.48\textwidth, - height=6cm, - ymin=0, - xlabel={$x$}, - ylabel={Werte}, - xtick={1,2,3,4,5}, - xticklabels={1, 2, 3, 4, 5}, - xtick=data, - nodes near coords, - nodes near coords style={/pgf/number format/.cd,fixed zerofill,precision=1}, - nodes near coords align={vertical}, - ] - \addplot coordinates {(1,1) (2,34) (3,23) (4,123) (5,84)}; - \addplot[smooth, red, mark=*] coordinates { - (0, {(1 + 34 + 23 + 123 + 84) / 5}) - (6, {(1 + 34 + 23 + 123 + 84) / 5}) - }; - \end{axis} - \end{tikzpicture} - \caption{Balkendiagramm} - \end{wrapfigure} - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % \begin{wrapfigure}{l}{0.5\textwidth} + % \centering + % \begin{tikzpicture} + % \begin{axis}[ + % ybar, + % bar width=0.5cm, + % width=0.48\textwidth, + % height=6cm, + % ymin=0, + % xlabel={$x$}, + % ylabel={Werte}, + % xtick={1,2,3,4,5}, + % xticklabels={1, 2, 3, 4, 5}, + % xtick=data, + % nodes near coords, + % nodes near coords style={/pgf/number format/.cd,fixed zerofill,precision=1}, + % nodes near coords align={vertical}, + % ] + % \addplot coordinates {(1,1) (2,34) (3,23) (4,123) (5,84)}; + % \addplot[smooth, red, mark=*] coordinates { + % (0, {(1 + 34 + 23 + 123 + 84) / 5}) + % (6, {(1 + 34 + 23 + 123 + 84) / 5}) + % }; + % \end{axis} + % \end{tikzpicture} + % \caption{Balkendiagramm} + % \end{wrapfigure} + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? \newpage - \input{sections/sec1.tex} + \input{sections/einleitung.tex} + \input{sections/recherche.tex} + \input{sections/umsetzung.tex} + \input{sections/analyse.tex} + \input{sections/conclusion.tex} \newpage \phantomsection diff --git a/documentation/latex/sections/analyse.tex b/documentation/latex/sections/analyse.tex index 386a186..ad3c710 100644 --- a/documentation/latex/sections/analyse.tex +++ b/documentation/latex/sections/analyse.tex @@ -1,12 +1,4 @@ \section{Analyse} \label{sec:Analyse} - (4) - (sub) - Laufzeitmessungen nach Datenbankerstellung (etwa 1 std rechnen) - JSON-Datei Suche VS LiteDB suche (60 min vs 8 s): Rechnung nach wie vielen Suchanfragen sich das ganze gelohnt hat (nach etwa einer) - Laufzeitanalyse Mono-Suche und Pipeline-Suche auf LiteDB - Wie ist LiteDB-Suche zu verschnellern - Vergleich der Messungen - Erklärung der Pipeline (Diagramme) (Wie und Warum, LiteDB ist File-Basier und deswegen kann auf mehreren Dateien gesucht werden falls genug threads zur verfügung stehen) - Ausblick - Ziel: schneller als NIST API sein (so und so viele Sekunden übers Netz im vergleich zu so und so vielen sekunden über unsere API) - Um Ziel zu erreichen: Andere Datenbank verwenden um Lesezugriffe optimieren + \input{subsections/laufzeitmessungen.tex} + \input{subsections/laufzeitanalyse.tex} + \input{subsections/ausblick.tex} diff --git a/documentation/latex/sections/conclusion.tex b/documentation/latex/sections/conclusion.tex index 4e1729f..bab9d34 100644 --- a/documentation/latex/sections/conclusion.tex +++ b/documentation/latex/sections/conclusion.tex @@ -1,16 +1,4 @@ \section{Conclusion} \label{sec:Conclusion} - (5) - (sub) - Vision - Validieren ob Ziel erreicht ist, dass - ein Node-JS-Projekt komplett analysisert (alle Pakete entnommen werden) und nach Schwachstellen untersucht werden - das zurückgegebene Format der API sinnvoll und struckturiert ist - Wurde sich an programmiertechnische Standards gehalten - Models sind eigene Bibliothek (losgelöst von der API, können weiterverwendet werden getrennt und weiterentwickelt werden) - Controller liegen im Controller-Namespace - Sinnvolle Trennung von Endpunkten in Controller mit http-Signatur - Routennamen der Endpunkte in natürlicher Sprache/Pfaden - Nächste Schritte mit neuer Zielsetzung - API mit MySQL-DB versehen für vermutete höhere Performance (vermutung weil db-Server wahrscheinlich schneller als lokal lesen/schreiben[hardwareabhängig]) - Analyseergebnis ist auszubauen um Schweregrad der Schwachstelle um besonders kritische stellen im Dependency-Baum hervorzuheben + \input{subsections/vision.tex} + \input{subsections/nächste_schritte.tex} \ No newline at end of file diff --git a/documentation/latex/sections/einleitung.tex b/documentation/latex/sections/einleitung.tex index 105ecde..62f5bf1 100644 --- a/documentation/latex/sections/einleitung.tex +++ b/documentation/latex/sections/einleitung.tex @@ -1,6 +1,4 @@ \section{Einleitung} \label{sec:Einleitung} - (1) - als sub sections:\\ - Problemstellung - Motivation - Vorgehen (zur Lösung) \ No newline at end of file + \input{subsections/problemstellung.tex} + \input{subsections/motivation.tex} + \input{subsections/vorgehen.tex} \ No newline at end of file diff --git a/documentation/latex/sections/recherche.tex b/documentation/latex/sections/recherche.tex index faf734c..f3784a9 100644 --- a/documentation/latex/sections/recherche.tex +++ b/documentation/latex/sections/recherche.tex @@ -1,10 +1,4 @@ \section{Recherche} \label{sec:Recherche} - (2) - (sub) - Was ist CVE - Umgang mit CVE - Referenzen und CVE-Nutzungen - (subsub) - NIST-API - DEPENDA-BOT (GITHUB) - Weitere \ No newline at end of file + \input{subsections/cve.tex} + \input{subsections/umgang_mit_cve.tex} + \input{subsections/referenzen.tex} \ No newline at end of file diff --git a/documentation/latex/sections/umsetzung.tex b/documentation/latex/sections/umsetzung.tex index 8461aa3..1ff0af5 100644 --- a/documentation/latex/sections/umsetzung.tex +++ b/documentation/latex/sections/umsetzung.tex @@ -1,17 +1,4 @@ \section{Umsetzung} \label{sec:Umsetzung} - (3) - (sub) - Technologiestack - ASP.NET - DOCKER - LiteDB (NOSQL) erst - MySQL (SQL) Ausblick - API - Modells - PUML (Klassen) - Interaktion und Zusammenhang der Klassen/Fktn - Controller - Auflistung und Erklärung (Swagger screenshot) in Paragraphs - Views (JSON-LD def von CVE-Result, JSON-LD von NodePackageResult) - DB-Anbindung: LiteDB braucht DB-Controller + \input{subsections/technologiestack.tex} + \input{subsections/api.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/api.tex b/documentation/latex/subsections/api.tex new file mode 100644 index 0000000..797b1f8 --- /dev/null +++ b/documentation/latex/subsections/api.tex @@ -0,0 +1,4 @@ +\subsection{API} \label{subsec:API} + \input{subsubsections/modells.tex} + \input{subsubsections/controller.tex} + \input{subsubsections/db_anbindung.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/ausblick.tex b/documentation/latex/subsections/ausblick.tex new file mode 100644 index 0000000..6f8115b --- /dev/null +++ b/documentation/latex/subsections/ausblick.tex @@ -0,0 +1,4 @@ +\subsection{Ausblick} \label{subsec:Ausblick} +Ausblick +Ziel: schneller als NIST API sein (so und so viele Sekunden übers Netz im vergleich zu so und so vielen sekunden über unsere API) +Um Ziel zu erreichen: Andere Datenbank verwenden um Lesezugriffe optimieren \ No newline at end of file diff --git a/documentation/latex/subsections/cve.tex b/documentation/latex/subsections/cve.tex new file mode 100644 index 0000000..c4398cb --- /dev/null +++ b/documentation/latex/subsections/cve.tex @@ -0,0 +1,2 @@ +\subsection{CVE} \label{subsec:CVE} +CVE, oder Common Vulnerabilities and Exposures \cite{} \ No newline at end of file diff --git a/documentation/latex/subsections/laufzeitanalyse.tex b/documentation/latex/subsections/laufzeitanalyse.tex new file mode 100644 index 0000000..8a6909c --- /dev/null +++ b/documentation/latex/subsections/laufzeitanalyse.tex @@ -0,0 +1,5 @@ +\subsection{Laufzeitanalyse Mono-Suche und Pipeline-Suche auf LiteDB} \label{subsec:Laufzeitanalyse} +Laufzeitanalyse Mono-Suche und Pipeline-Suche auf LiteDB +Wie ist LiteDB-Suche zu verschnellern +Vergleich der Messungen +Erklärung der Pipeline (Diagramme) (Wie und Warum, LiteDB ist File-Basier und deswegen kann auf mehreren Dateien gesucht werden falls genug threads zur verfügung stehen) \ No newline at end of file diff --git a/documentation/latex/subsections/laufzeitmessungen.tex b/documentation/latex/subsections/laufzeitmessungen.tex new file mode 100644 index 0000000..28026d9 --- /dev/null +++ b/documentation/latex/subsections/laufzeitmessungen.tex @@ -0,0 +1,3 @@ +\subsection{Laufzeitmessungen nach Datenbankerstellung} \label{subsec:Laufzeitmessungen} +Laufzeitmessungen nach Datenbankerstellung (etwa 1 std rechnen) +JSON-Datei Suche VS LiteDB suche (60 min vs 8 s): Rechnung nach wie vielen Suchanfragen sich das ganze gelohnt hat (nach etwa einer) \ No newline at end of file diff --git a/documentation/latex/subsections/motivation.tex b/documentation/latex/subsections/motivation.tex new file mode 100644 index 0000000..bc16685 --- /dev/null +++ b/documentation/latex/subsections/motivation.tex @@ -0,0 +1,28 @@ +\subsection{Motivation} \label{subsec:Motivation} + Beim Entwickeln von Softwarelösungen gibt es viele Herausforderungen und Probleme. + Diese werden durch viele bereits vorhandene Softwarepakete bewältigt. + Die Nutzung frei verfügbarer Softwarepakete sind deshalb im Arbeitsalltag gang und gäbe. + Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. + Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der gute Pakete beständig besser werden lässt und nicht durchdachte entweder (a) an Bedeutung verlieren lässt oder (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. + Ein anderer essentieller Aspekt außer der Nutzbarkeit oder Funktionserfüllung ist die Sicherheit. + Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. + Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. + \\ \\ + Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. + CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \\ + Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem Angebot der \glqq National Cybersecurity FFRDC\grqq~zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. + Eine Automatisierung der Analyse solcher Pakete zielt somit nicht nur eine Reduktion des Zeitaufwandes mit sich, auch ist eine umfangreichere Analyse ohne Mehraufwand möglich. + Dies spiegelt sich beispielsweise in der Möglichkeit wieder, ganze Projekte direkt analysieren zu lassen anstelle der einzelnen Pakete. + \\ + Das zeigt, dass ein dringender Bedarf an einem Werkzeug besteht, das Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. + Solch ein Werkzeug könnte einem Unternehmen weiterhin verschiedene Vorteile im Bereich der Softwareentwicklung für Transparenz, Qualität und Sicherheit bringen. + \begin{enumerate} + \item Transparenz und Vertrauen\\ + Durch eine klare Übersicht über genutzte externe Softwarekomponenten mit Sicherheitslücken können frühzeitig besser informierte Entscheidungen getroffen und potenzielle Risiken identifiziert werden. + \item Qualität\\ + Entwickler können leichter erkennen, ob Abhängigkeiten ersetzt oder aktualisiert werden müssen. + \item Sicherheit\\ + Um die Gesamtsicherheit einer Applikation bestmöglich zu gewährleisten trägt ein solches Tool, welches Schwachstellen und Abhängigkeiten auch in tieferen Ebenen von Abhängigkeiten darstellt, zur Identifikation und Vermeidung von Sicherheitslücken bei. + \end{enumerate} + Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file diff --git "a/documentation/latex/subsections/n\303\244chste_schritte.tex" "b/documentation/latex/subsections/n\303\244chste_schritte.tex" new file mode 100644 index 0000000..66a5f77 --- /dev/null +++ "b/documentation/latex/subsections/n\303\244chste_schritte.tex" @@ -0,0 +1,4 @@ +\subsection{Nächste Schritte mit neuer Zielsetzung} \label{subsec:Nächste_Schritte} +Nächste Schritte mit neuer Zielsetzung + API mit MySQL-DB versehen für vermutete höhere Performance (vermutung weil db-Server wahrscheinlich schneller als lokal lesen/schreiben[hardwareabhängig]) + Analyseergebnis ist auszubauen um Schweregrad der Schwachstelle um besonders kritische stellen im Dependency-Baum hervorzuheben \ No newline at end of file diff --git a/documentation/latex/subsections/problemstellung.tex b/documentation/latex/subsections/problemstellung.tex new file mode 100644 index 0000000..6b342ec --- /dev/null +++ b/documentation/latex/subsections/problemstellung.tex @@ -0,0 +1,5 @@ +\subsection{Problemstellung} \label{subsec:Problemstellung} + Das Entwickeln von Softwarelösungen ist heutzutage nicht mehr ohne Bibliotheken, Frameworks oder externe Module denkbar. + Solche Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung. + Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. + Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. \ No newline at end of file diff --git a/documentation/latex/subsections/referenzen.tex b/documentation/latex/subsections/referenzen.tex new file mode 100644 index 0000000..09cca4f --- /dev/null +++ b/documentation/latex/subsections/referenzen.tex @@ -0,0 +1,5 @@ +\subsection{Referenzen} \label{subsec:Referenzen} +Referenzen und CVE-Nutzungen + \input{subsubsections/nist.tex} + \input{subsubsections/dependa_bot.tex} + \input{subsubsections/weitere.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/technologiestack.tex b/documentation/latex/subsections/technologiestack.tex new file mode 100644 index 0000000..2970f71 --- /dev/null +++ b/documentation/latex/subsections/technologiestack.tex @@ -0,0 +1,6 @@ +\subsection{Technologiestack} \label{subsec:Technologiestack} +Technologiestack + ASP.NET + DOCKER + LiteDB (NOSQL) erst + MySQL (SQL) Ausblick \ No newline at end of file diff --git a/documentation/latex/subsections/umgang_mit_cve.tex b/documentation/latex/subsections/umgang_mit_cve.tex new file mode 100644 index 0000000..50edf58 --- /dev/null +++ b/documentation/latex/subsections/umgang_mit_cve.tex @@ -0,0 +1,2 @@ +\subsection{Umgang mit CVE} \label{subsec:Umgang_mit_CVE} +Umgang mit CVE \ No newline at end of file diff --git a/documentation/latex/subsections/vision.tex b/documentation/latex/subsections/vision.tex new file mode 100644 index 0000000..99501f9 --- /dev/null +++ b/documentation/latex/subsections/vision.tex @@ -0,0 +1,10 @@ +\subsection{Vision} \label{subsec:Vision} +Vision + Validieren ob Ziel erreicht ist, dass + ein Node-JS-Projekt komplett analysisert (alle Pakete entnommen werden) und nach Schwachstellen untersucht werden + das zurückgegebene Format der API sinnvoll und struckturiert ist + Wurde sich an programmiertechnische Standards gehalten + Models sind eigene Bibliothek (losgelöst von der API, können weiterverwendet werden getrennt und weiterentwickelt werden) + Controller liegen im Controller-Namespace + Sinnvolle Trennung von Endpunkten in Controller mit http-Signatur + Routennamen der Endpunkte in natürlicher Sprache/Pfaden \ No newline at end of file diff --git a/documentation/latex/subsections/vorgehen.tex b/documentation/latex/subsections/vorgehen.tex new file mode 100644 index 0000000..de189bd --- /dev/null +++ b/documentation/latex/subsections/vorgehen.tex @@ -0,0 +1,20 @@ +\subsection{Vorgehen} \label{subsec:Vorgehen} +Um nun ein solches Werkzeug zur Verfügung zu stellen muss zuerst eine Anforderungsanalyse durchgeführt werden. +\begin{itemize} + \item Transparenz schaffen + \item Entscheidungsfindung unterstützen + \item Sicherheitsrisiken minimieren +\end{itemize} +Diese Ziele sollen folgenden Nutzern bei der Entscheidungsfindung über Abhängigkeiten zu nutzen sein: +\begin{itemize} + \item Softwareentwickler + \item Projekt-Owner bzw. Teamleiter +\end{itemize} +Folgende Funktionalitäten sollen durch dieses Werkzeug umgesetzt werden: +Dazu sind folgende Ziele des Werkzeugs festgesetzt: +\begin{itemize} + \item Information über Sicherheitslücken eines Pakets und dessen Abhängigkeiten. + \item Information über Sicherheitslücken einer Liste von Paketen und dessen Abhängigkeiten. + \item Analyse eines Git-Projekts mit dessen Abhängigkeiten auf Sicherheitslücken. + \item Bereitstellung der Sicherheitslücken als weiter nutzbares Datenformat. +\end{itemize} \ No newline at end of file diff --git a/documentation/latex/subsubsections/controller.tex b/documentation/latex/subsubsections/controller.tex new file mode 100644 index 0000000..a2ef7ac --- /dev/null +++ b/documentation/latex/subsubsections/controller.tex @@ -0,0 +1,3 @@ +\subsubsection{Controller} \label{subsubsec:Controller} +Auflistung und Erklärung (Swagger screenshot) in Paragraphs +Views (JSON-LD def von CVE-Result, JSON-LD von NodePackageResult) \ No newline at end of file diff --git a/documentation/latex/subsubsections/db_anbindung.tex b/documentation/latex/subsubsections/db_anbindung.tex new file mode 100644 index 0000000..dba3eaf --- /dev/null +++ b/documentation/latex/subsubsections/db_anbindung.tex @@ -0,0 +1,2 @@ +\subsubsection{DB-Anbindung} \label{subsubsec:DB-Anbindung} +DB-Anbindung: LiteDB braucht DB-Controller \ No newline at end of file diff --git a/documentation/latex/subsubsections/dependa_bot.tex b/documentation/latex/subsubsections/dependa_bot.tex new file mode 100644 index 0000000..f374bd7 --- /dev/null +++ b/documentation/latex/subsubsections/dependa_bot.tex @@ -0,0 +1,2 @@ +\subsubsection{DEPENDA-BOT} \label{subsubsec:DEPENDA_BOT} + DEPENDA-BOT (GITHUB) \ No newline at end of file diff --git a/documentation/latex/subsubsections/modells.tex b/documentation/latex/subsubsections/modells.tex new file mode 100644 index 0000000..a034ff3 --- /dev/null +++ b/documentation/latex/subsubsections/modells.tex @@ -0,0 +1,3 @@ +\subsubsection{Modells} \label{subsubsec:Modells} +PUML (Klassen) +Interaktion und Zusammenhang der Klassen/Fktn \ No newline at end of file diff --git a/documentation/latex/subsubsections/nist.tex b/documentation/latex/subsubsections/nist.tex new file mode 100644 index 0000000..a4fb56d --- /dev/null +++ b/documentation/latex/subsubsections/nist.tex @@ -0,0 +1,2 @@ +\subsubsection{NIST-API} \label{subsubsec:NIST_API} + NIST-API \ No newline at end of file diff --git a/documentation/latex/subsubsections/weitere.tex b/documentation/latex/subsubsections/weitere.tex new file mode 100644 index 0000000..6c4e6ab --- /dev/null +++ b/documentation/latex/subsubsections/weitere.tex @@ -0,0 +1,2 @@ +\subsubsection{Weitere} \label{subsubsec:Weitere} + Weitere \ No newline at end of file From dacb982ac86cf6c581cf6a156be25cec79d8dcb6 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 7 Mar 2024 17:53:05 +0100 Subject: [PATCH 02/60] Some fragments --- documentation/fragments/searchStatistic.md | 663 +++++++++++++++++++++ documentation/fragments/uml.puml | 78 +++ 2 files changed, 741 insertions(+) create mode 100644 documentation/fragments/searchStatistic.md create mode 100644 documentation/fragments/uml.puml diff --git a/documentation/fragments/searchStatistic.md b/documentation/fragments/searchStatistic.md new file mode 100644 index 0000000..0c5ad89 --- /dev/null +++ b/documentation/fragments/searchStatistic.md @@ -0,0 +1,663 @@ +# Statistiken +- [Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe Fall: weniger Pakete als Datenbanken](#zeitunterschied-abfrage-auf-den-datenbanken-mono-pipe--fall-weniger-pakete-als-datenbanken) + - [Durchgang 1 von 10](#durchgang-1-von-10) + - [Durchgang 2 von 10](#durchgang-2-von-10) + - [Durchgang 3 von 10](#durchgang-3-von-10) + - [Durchgang 4 von 10](#durchgang-4-von-10) + - [Durchgang 5 von 10](#durchgang-5-von-10) + - [Durchgang 6 von 10](#durchgang-6-von-10) + - [Durchgang 7 von 10](#durchgang-7-von-10) + - [Durchgang 8 von 10](#durchgang-8-von-10) + - [Durchgang 9 von 10](#durchgang-9-von-10) + - [Durchgang 10 von 10](#durchgang-10-von-10) + - [Erkenntnisse](#erkenntnisse) +- [Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe Fall: mehr Pakete als Datenbanken](#zeitunterschied-abfrage-auf-den-datenbanken-mono-pipe--fall-mehr-pakete-als-datenbanken) + - [Durchgang 1 von 10](#durchgang-1-von-10-1) + - [Durchgang 2 von 10](#durchgang-2-von-10-1) + - [Durchgang 3 von 10](#durchgang-3-von-10-1) + - [Durchgang 4 von 10](#durchgang-4-von-10-1) + - [Durchgang 5 von 10](#durchgang-5-von-10-1) + - [Durchgang 6 von 10](#durchgang-6-von-10-1) + - [Durchgang 7 von 10](#durchgang-7-von-10-1) + - [Durchgang 8 von 10](#durchgang-8-von-10-1) + - [Durchgang 9 von 10](#durchgang-9-von-10-1) + - [Durchgang 10 von 10](#durchgang-10-von-10-1) + - [Erkenntnisse](#erkenntnisse-1) + +## Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe
Fall: weniger Pakete als Datenbanken +### Durchgang 1 von 10 +```log +2024-02-20 16:52:48.970 +01:00 [INF] Time by mono LiteDB completed in 4147.1 ms +2024-02-20 16:52:51.848 +01:00 [INF] Time by mono Newtonsoft completed in 2866.1 ms +2024-02-20 16:52:54.625 +01:00 [INF] Time by mono NewtonSoft completed in 2776.4 ms +2024-02-20 16:52:57.421 +01:00 [INF] Time by mono Crowd completed in 2796.2 ms +2024-02-20 16:53:00.201 +01:00 [INF] Time by mono Atlassian completed in 2779.7 ms +2024-02-20 16:53:02.980 +01:00 [INF] Time by mono Debian completed in 2779.5 ms +2024-02-20 16:53:05.740 +01:00 [INF] Time by mono Ubuntu completed in 2760.0 ms +2024-02-20 16:53:08.605 +01:00 [INF] Time by mono Arc42 completed in 2864.0 ms +2024-02-20 16:53:13.009 +01:00 [INF] Time by mono arc42 completed in 4404.5 ms +2024-02-20 16:53:24.805 +01:00 [INF] Time by pipe completed in 11794.7 ms +``` +Durchschnitt Mono: 3130,3889ms
+Laufzeit der Pipe: 11794,7ms
+Gesamt Mono: 28173,5ms
+Faktor: 2,388657617 + +### Durchgang 2 von 10 +```log +2024-02-20 16:54:34.973 +01:00 [INF] Time by mono LiteDB completed in 4004.3 ms +2024-02-20 16:54:37.857 +01:00 [INF] Time by mono Newtonsoft completed in 2866.0 ms +2024-02-20 16:54:40.656 +01:00 [INF] Time by mono NewtonSoft completed in 2799.1 ms +2024-02-20 16:54:43.436 +01:00 [INF] Time by mono Crowd completed in 2780.3 ms +2024-02-20 16:54:46.207 +01:00 [INF] Time by mono Atlassian completed in 2770.9 ms +2024-02-20 16:54:48.966 +01:00 [INF] Time by mono Debian completed in 2758.1 ms +2024-02-20 16:54:51.740 +01:00 [INF] Time by mono Ubuntu completed in 2774.3 ms +2024-02-20 16:54:54.543 +01:00 [INF] Time by mono Arc42 completed in 2803.2 ms +2024-02-20 16:54:57.289 +01:00 [INF] Time by mono arc42 completed in 2745.9 ms +2024-02-20 16:55:07.436 +01:00 [INF] Time by pipe completed in 10146.6 ms +``` +Durchschnitt Mono: 2922,4555ms
+Laufzeit der Pipe: 10146,6ms
+Gesamt Mono: 26302,1ms
+Faktor: 2,592208227 + +### Durchgang 3 von 10 +```log +2024-02-20 16:55:57.166 +01:00 [INF] Time by mono LiteDB completed in 4102.0 ms +2024-02-20 16:55:59.938 +01:00 [INF] Time by mono Newtonsoft completed in 2761.0 ms +2024-02-20 16:56:02.704 +01:00 [INF] Time by mono NewtonSoft completed in 2766.5 ms +2024-02-20 16:56:05.472 +01:00 [INF] Time by mono Crowd completed in 2767.9 ms +2024-02-20 16:56:08.227 +01:00 [INF] Time by mono Atlassian completed in 2754.5 ms +2024-02-20 16:56:10.970 +01:00 [INF] Time by mono Debian completed in 2742.7 ms +2024-02-20 16:56:13.729 +01:00 [INF] Time by mono Ubuntu completed in 2759.3 ms +2024-02-20 16:56:16.484 +01:00 [INF] Time by mono Arc42 completed in 2754.3 ms +2024-02-20 16:56:19.254 +01:00 [INF] Time by mono arc42 completed in 2770.2 ms +2024-02-20 16:56:28.535 +01:00 [INF] Time by pipe completed in 9281.4 ms +``` +Durchschnitt Mono: 2908,7111ms
+Laufzeit der Pipe: 9281,4ms
+Gesamt Mono: 26178,4ms
+Faktor: 2,820522766 + +### Durchgang 4 von 10 +```log +2024-02-20 16:57:34.891 +01:00 [INF] Time by mono LiteDB completed in 4750.3 ms +2024-02-20 16:57:37.679 +01:00 [INF] Time by mono Newtonsoft completed in 2777.6 ms +2024-02-20 16:57:40.432 +01:00 [INF] Time by mono NewtonSoft completed in 2752.7 ms +2024-02-20 16:57:43.144 +01:00 [INF] Time by mono Crowd completed in 2712.3 ms +2024-02-20 16:57:45.869 +01:00 [INF] Time by mono Atlassian completed in 2724.7 ms +2024-02-20 16:57:48.584 +01:00 [INF] Time by mono Debian completed in 2715.0 ms +2024-02-20 16:57:51.292 +01:00 [INF] Time by mono Ubuntu completed in 2708.1 ms +2024-02-20 16:57:53.999 +01:00 [INF] Time by mono Arc42 completed in 2706.5 ms +2024-02-20 16:57:56.718 +01:00 [INF] Time by mono arc42 completed in 2718.8 ms +2024-02-20 16:58:06.284 +01:00 [INF] Time by pipe completed in 9566.3 ms +``` +Durchschnitt Mono: 2951,7777ms
+Laufzeit der Pipe: 9566,3ms
+Gesamt Mono: 26566ms
+Faktor: 2,777040235 + +### Durchgang 5 von 10 +```log +2024-02-20 16:58:52.421 +01:00 [INF] Time by mono LiteDB completed in 4087.7 ms +2024-02-20 16:58:55.148 +01:00 [INF] Time by mono Newtonsoft completed in 2716.4 ms +2024-02-20 16:58:57.845 +01:00 [INF] Time by mono NewtonSoft completed in 2697.0 ms +2024-02-20 16:59:00.541 +01:00 [INF] Time by mono Crowd completed in 2696.4 ms +2024-02-20 16:59:03.256 +01:00 [INF] Time by mono Atlassian completed in 2714.8 ms +2024-02-20 16:59:05.957 +01:00 [INF] Time by mono Debian completed in 2700.4 ms +2024-02-20 16:59:08.659 +01:00 [INF] Time by mono Ubuntu completed in 2701.9 ms +2024-02-20 16:59:11.364 +01:00 [INF] Time by mono Arc42 completed in 2705.2 ms +2024-02-20 16:59:14.060 +01:00 [INF] Time by mono arc42 completed in 2696.0 ms +2024-02-20 16:59:23.294 +01:00 [INF] Time by pipe completed in 9233.7 ms +``` +Durchschnitt Mono: 2857,3111ms
+Laufzeit der Pipe: 9233,7ms
+Gesamt Mono: 25715,8ms
+Faktor: 2,784994098 + +### Durchgang 6 von 10 +```log +2024-02-20 17:00:07.005 +01:00 [INF] Time by mono LiteDB completed in 4338.2 ms +2024-02-20 17:00:09.769 +01:00 [INF] Time by mono Newtonsoft completed in 2753.6 ms +2024-02-20 17:00:12.514 +01:00 [INF] Time by mono NewtonSoft completed in 2744.4 ms +2024-02-20 17:00:15.243 +01:00 [INF] Time by mono Crowd completed in 2729.1 ms +2024-02-20 17:00:17.996 +01:00 [INF] Time by mono Atlassian completed in 2753.0 ms +2024-02-20 17:00:20.738 +01:00 [INF] Time by mono Debian completed in 2741.7 ms +2024-02-20 17:00:23.465 +01:00 [INF] Time by mono Ubuntu completed in 2726.5 ms +2024-02-20 17:00:26.193 +01:00 [INF] Time by mono Arc42 completed in 2728.0 ms +2024-02-20 17:00:28.908 +01:00 [INF] Time by mono arc42 completed in 2715.0 ms +2024-02-20 17:00:38.115 +01:00 [INF] Time by pipe completed in 9207.4 ms +``` +Durchschnitt Mono: 2914,3888ms
+Laufzeit der Pipe: 9207,4ms
+Gesamt Mono: 26229,5ms
+Faktor: 2,84874123 + +### Durchgang 7 von 10 +```log +2024-02-20 17:01:15.254 +01:00 [INF] Time by mono LiteDB completed in 4183.9 ms +2024-02-20 17:01:18.155 +01:00 [INF] Time by mono Newtonsoft completed in 2882.7 ms +2024-02-20 17:01:20.884 +01:00 [INF] Time by mono NewtonSoft completed in 2729.3 ms +2024-02-20 17:01:23.624 +01:00 [INF] Time by mono Crowd completed in 2740.1 ms +2024-02-20 17:01:26.347 +01:00 [INF] Time by mono Atlassian completed in 2722.7 ms +2024-02-20 17:01:29.068 +01:00 [INF] Time by mono Debian completed in 2721.1 ms +2024-02-20 17:01:31.809 +01:00 [INF] Time by mono Ubuntu completed in 2740.8 ms +2024-02-20 17:01:34.544 +01:00 [INF] Time by mono Arc42 completed in 2734.4 ms +2024-02-20 17:01:37.332 +01:00 [INF] Time by mono arc42 completed in 2788.2 ms +2024-02-20 17:01:46.705 +01:00 [INF] Time by pipe completed in 9372.5 ms +``` +Durchschnitt Mono: 2915,9111ms
+Laufzeit der Pipe: 9372,5ms
+Gesamt Mono: 26243,2ms
+Faktor: 2,800021339 + +### Durchgang 8 von 10 +```log +2024-02-20 17:02:26.668 +01:00 [INF] Time by mono LiteDB completed in 4080.0 ms +2024-02-20 17:02:29.378 +01:00 [INF] Time by mono Newtonsoft completed in 2699.1 ms +2024-02-20 17:02:32.081 +01:00 [INF] Time by mono NewtonSoft completed in 2703.3 ms +2024-02-20 17:02:34.793 +01:00 [INF] Time by mono Crowd completed in 2711.8 ms +2024-02-20 17:02:37.499 +01:00 [INF] Time by mono Atlassian completed in 2706.1 ms +2024-02-20 17:02:40.194 +01:00 [INF] Time by mono Debian completed in 2694.4 ms +2024-02-20 17:02:42.884 +01:00 [INF] Time by mono Ubuntu completed in 2689.8 ms +2024-02-20 17:02:45.583 +01:00 [INF] Time by mono Arc42 completed in 2699.5 ms +2024-02-20 17:02:48.283 +01:00 [INF] Time by mono arc42 completed in 2699.5 ms +2024-02-20 17:02:57.652 +01:00 [INF] Time by pipe completed in 9369.2 ms +``` +Durchschnitt Mono: 2853,7222ms
+Laufzeit der Pipe: 9369,2ms
+Gesamt Mono: 25683,5ms
+Faktor: 2,741269265 + +### Durchgang 9 von 10 +```log +2024-02-20 17:03:46.609 +01:00 [INF] Time by mono LiteDB completed in 4061.9 ms +2024-02-20 17:03:49.326 +01:00 [INF] Time by mono Newtonsoft completed in 2706.6 ms +2024-02-20 17:03:52.066 +01:00 [INF] Time by mono NewtonSoft completed in 2739.0 ms +2024-02-20 17:03:54.813 +01:00 [INF] Time by mono Crowd completed in 2746.9 ms +2024-02-20 17:03:57.524 +01:00 [INF] Time by mono Atlassian completed in 2711.0 ms +2024-02-20 17:04:00.245 +01:00 [INF] Time by mono Debian completed in 2721.0 ms +2024-02-20 17:04:02.960 +01:00 [INF] Time by mono Ubuntu completed in 2714.8 ms +2024-02-20 17:04:05.664 +01:00 [INF] Time by mono Arc42 completed in 2703.6 ms +2024-02-20 17:04:08.370 +01:00 [INF] Time by mono arc42 completed in 2706.4 ms +2024-02-20 17:04:17.750 +01:00 [INF] Time by pipe completed in 9380.2 ms +``` +Durchschnitt Mono: 2867,9111ms
+Laufzeit der Pipe: 9380,2ms
+Gesamt Mono: 25811,2ms
+Faktor: 2,751668408 + +### Durchgang 10 von 10 +```log +2024-02-20 17:04:49.929 +01:00 [INF] Time by mono LiteDB completed in 4049.1 ms +2024-02-20 17:04:52.685 +01:00 [INF] Time by mono Newtonsoft completed in 2746.2 ms +2024-02-20 17:04:55.396 +01:00 [INF] Time by mono NewtonSoft completed in 2711.0 ms +2024-02-20 17:04:58.101 +01:00 [INF] Time by mono Crowd completed in 2704.9 ms +2024-02-20 17:05:00.809 +01:00 [INF] Time by mono Atlassian completed in 2707.1 ms +2024-02-20 17:05:03.515 +01:00 [INF] Time by mono Debian completed in 2706.5 ms +2024-02-20 17:05:06.216 +01:00 [INF] Time by mono Ubuntu completed in 2700.4 ms +2024-02-20 17:05:08.940 +01:00 [INF] Time by mono Arc42 completed in 2724.0 ms +2024-02-20 17:05:11.664 +01:00 [INF] Time by mono arc42 completed in 2724.3 ms +2024-02-20 17:05:21.181 +01:00 [INF] Time by pipe completed in 9516.4 ms +``` +Durchschnitt Mono: 2863,7222ms
+Laufzeit der Pipe: 9516,4ms
+Gesamt Mono: 25773,5ms
+Faktor: 2,708324577 + +### Erkenntnisse +Die durchschnittliche Laufzeit der Mono bzw. Single-Paket Analyse dauerte: 2918,63ms
+Die Gesamtlaufzeit von Mono beträgt: 262676,7ms
+Die Gesamtlaufzeit von Pipe beträgt: 96868,4ms
+ +Der Durchschnittliche Faktor (schnellere Pipe als Mono) beträgt: 2,7213448 + + +## Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe
Fall: mehr Pakete als Datenbanken +Noch zu messen! +### Durchgang 1 von 10 +```log +2024-02-21 15:05:20.021 +01:00 [INF] Time by mono LiteDB completed in 7208.9 ms +2024-02-21 15:05:22.798 +01:00 [INF] Time by mono Newtonsoft completed in 2765.7 ms +2024-02-21 15:05:25.526 +01:00 [INF] Time by mono NewtonSoft completed in 2728.0 ms +2024-02-21 15:05:28.264 +01:00 [INF] Time by mono Crowd completed in 2737.9 ms +2024-02-21 15:05:30.992 +01:00 [INF] Time by mono Atlassian completed in 2727.2 ms +2024-02-21 15:05:33.706 +01:00 [INF] Time by mono Debian completed in 2714.1 ms +2024-02-21 15:05:36.408 +01:00 [INF] Time by mono Ubuntu completed in 2702.3 ms +2024-02-21 15:05:39.095 +01:00 [INF] Time by mono Arc42 completed in 2687.2 ms +2024-02-21 15:05:41.794 +01:00 [INF] Time by mono arc42 completed in 2698.7 ms +2024-02-21 15:05:44.499 +01:00 [INF] Time by mono cookie completed in 2694.2 ms +2024-02-21 15:05:47.205 +01:00 [INF] Time by mono mongoDb completed in 2705.9 ms +2024-02-21 15:05:49.908 +01:00 [INF] Time by mono mongoDB completed in 2702.4 ms +2024-02-21 15:05:52.610 +01:00 [INF] Time by mono mongodb completed in 2702.4 ms +2024-02-21 15:05:55.377 +01:00 [INF] Time by mono parser completed in 2766.6 ms +2024-02-21 15:05:58.095 +01:00 [INF] Time by mono LiteDb completed in 2718.1 ms +2024-02-21 15:06:00.962 +01:00 [INF] Time by mono php completed in 2866.8 ms +2024-02-21 15:06:03.677 +01:00 [INF] Time by mono PHP completed in 2715.3 ms +2024-02-21 15:06:06.399 +01:00 [INF] Time by mono Laravel completed in 2721.7 ms +2024-02-21 15:06:09.108 +01:00 [INF] Time by mono laravel completed in 2709.1 ms +2024-02-21 15:06:11.835 +01:00 [INF] Time by mono LARAVEL completed in 2726.8 ms +2024-02-21 15:06:14.549 +01:00 [INF] Time by mono beta completed in 2713.3 ms +2024-02-21 15:06:17.265 +01:00 [INF] Time by mono meta completed in 2716.0 ms +2024-02-21 15:06:19.983 +01:00 [INF] Time by mono META completed in 2717.8 ms +2024-02-21 15:06:22.688 +01:00 [INF] Time by mono express-ejs-layouts completed in 2705.4 ms +2024-02-21 15:06:25.409 +01:00 [INF] Time by mono accepts completed in 2720.1 ms +2024-02-21 15:06:28.125 +01:00 [INF] Time by mono mime-db completed in 2716.2 ms +2024-02-21 15:06:30.829 +01:00 [INF] Time by mono mime-DB completed in 2703.7 ms +2024-02-21 15:06:33.538 +01:00 [INF] Time by mono iconv-lite completed in 2708.8 ms +2024-02-21 15:06:36.228 +01:00 [INF] Time by mono safer-buffer completed in 2690.8 ms +2024-02-21 15:06:38.929 +01:00 [INF] Time by mono raw-body completed in 2700.3 ms +2024-02-21 15:06:41.633 +01:00 [INF] Time by mono depd completed in 2704.4 ms +2024-02-21 15:06:44.338 +01:00 [INF] Time by mono finalhandler completed in 2704.6 ms +2024-02-21 15:06:47.039 +01:00 [INF] Time by mono on-finished completed in 2700.3 ms +2024-02-21 15:06:49.734 +01:00 [INF] Time by mono ipaddr.js completed in 2695.2 ms +2024-02-21 15:06:52.440 +01:00 [INF] Time by mono encodeurl completed in 2705.9 ms +2024-02-21 15:07:14.672 +01:00 [INF] Time by pipe completed in 22231.9 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 2 von 10 +```log +2024-02-21 15:07:49.056 +01:00 [INF] Time by mono LiteDB completed in 3859.8 ms +2024-02-21 15:07:51.704 +01:00 [INF] Time by mono Newtonsoft completed in 2638.7 ms +2024-02-21 15:07:54.355 +01:00 [INF] Time by mono NewtonSoft completed in 2650.9 ms +2024-02-21 15:07:57.009 +01:00 [INF] Time by mono Crowd completed in 2653.7 ms +2024-02-21 15:07:59.664 +01:00 [INF] Time by mono Atlassian completed in 2654.5 ms +2024-02-21 15:08:02.306 +01:00 [INF] Time by mono Debian completed in 2642.1 ms +2024-02-21 15:08:04.973 +01:00 [INF] Time by mono Ubuntu completed in 2666.9 ms +2024-02-21 15:08:07.653 +01:00 [INF] Time by mono Arc42 completed in 2680.2 ms +2024-02-21 15:08:10.298 +01:00 [INF] Time by mono arc42 completed in 2644.9 ms +2024-02-21 15:08:12.911 +01:00 [INF] Time by mono cookie completed in 2613.2 ms +2024-02-21 15:08:15.517 +01:00 [INF] Time by mono mongoDb completed in 2605.5 ms +2024-02-21 15:08:18.112 +01:00 [INF] Time by mono mongoDB completed in 2594.6 ms +2024-02-21 15:08:20.745 +01:00 [INF] Time by mono mongodb completed in 2633.3 ms +2024-02-21 15:08:23.349 +01:00 [INF] Time by mono parser completed in 2603.7 ms +2024-02-21 15:08:25.955 +01:00 [INF] Time by mono LiteDb completed in 2605.7 ms +2024-02-21 15:08:28.573 +01:00 [INF] Time by mono php completed in 2618.1 ms +2024-02-21 15:08:31.210 +01:00 [INF] Time by mono PHP completed in 2637.3 ms +2024-02-21 15:08:33.846 +01:00 [INF] Time by mono Laravel completed in 2635.7 ms +2024-02-21 15:08:36.502 +01:00 [INF] Time by mono laravel completed in 2656.1 ms +2024-02-21 15:08:39.123 +01:00 [INF] Time by mono LARAVEL completed in 2620.6 ms +2024-02-21 15:08:41.766 +01:00 [INF] Time by mono beta completed in 2642.6 ms +2024-02-21 15:08:44.390 +01:00 [INF] Time by mono meta completed in 2624.1 ms +2024-02-21 15:08:47.030 +01:00 [INF] Time by mono META completed in 2640.4 ms +2024-02-21 15:08:49.672 +01:00 [INF] Time by mono express-ejs-layouts completed in 2641.2 ms +2024-02-21 15:08:52.319 +01:00 [INF] Time by mono accepts completed in 2647.7 ms +2024-02-21 15:08:54.957 +01:00 [INF] Time by mono mime-db completed in 2637.5 ms +2024-02-21 15:08:57.596 +01:00 [INF] Time by mono mime-DB completed in 2639.2 ms +2024-02-21 15:09:00.239 +01:00 [INF] Time by mono iconv-lite completed in 2642.4 ms +2024-02-21 15:09:02.879 +01:00 [INF] Time by mono safer-buffer completed in 2639.8 ms +2024-02-21 15:09:05.525 +01:00 [INF] Time by mono raw-body completed in 2645.7 ms +2024-02-21 15:09:08.186 +01:00 [INF] Time by mono depd completed in 2661.3 ms +2024-02-21 15:09:10.819 +01:00 [INF] Time by mono finalhandler completed in 2633.1 ms +2024-02-21 15:09:13.452 +01:00 [INF] Time by mono on-finished completed in 2632.7 ms +2024-02-21 15:09:16.074 +01:00 [INF] Time by mono ipaddr.js completed in 2622.2 ms +2024-02-21 15:09:18.712 +01:00 [INF] Time by mono encodeurl completed in 2637.7 ms +2024-02-21 15:09:40.604 +01:00 [INF] Time by pipe completed in 21891.4 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 3 von 10 +```log +2024-02-21 15:19:41.636 +01:00 [INF] Time by mono LiteDB completed in 3882.4 ms +2024-02-21 15:19:44.313 +01:00 [INF] Time by mono Newtonsoft completed in 2667.4 ms +2024-02-21 15:19:46.959 +01:00 [INF] Time by mono NewtonSoft completed in 2645.8 ms +2024-02-21 15:19:49.617 +01:00 [INF] Time by mono Crowd completed in 2657.7 ms +2024-02-21 15:19:52.270 +01:00 [INF] Time by mono Atlassian completed in 2652.4 ms +2024-02-21 15:19:54.943 +01:00 [INF] Time by mono Debian completed in 2673.4 ms +2024-02-21 15:19:57.588 +01:00 [INF] Time by mono Ubuntu completed in 2644.7 ms +2024-02-21 15:20:00.243 +01:00 [INF] Time by mono Arc42 completed in 2654.8 ms +2024-02-21 15:20:02.906 +01:00 [INF] Time by mono arc42 completed in 2662.5 ms +2024-02-21 15:20:05.565 +01:00 [INF] Time by mono cookie completed in 2658.9 ms +2024-02-21 15:20:08.206 +01:00 [INF] Time by mono mongoDb completed in 2641.1 ms +2024-02-21 15:20:10.863 +01:00 [INF] Time by mono mongoDB completed in 2657.2 ms +2024-02-21 15:20:13.517 +01:00 [INF] Time by mono mongodb completed in 2653.4 ms +2024-02-21 15:20:16.181 +01:00 [INF] Time by mono parser completed in 2663.9 ms +2024-02-21 15:20:18.826 +01:00 [INF] Time by mono LiteDb completed in 2645.1 ms +2024-02-21 15:20:21.466 +01:00 [INF] Time by mono php completed in 2639.8 ms +2024-02-21 15:20:24.116 +01:00 [INF] Time by mono PHP completed in 2650.5 ms +2024-02-21 15:20:26.758 +01:00 [INF] Time by mono Laravel completed in 2641.7 ms +2024-02-21 15:20:29.405 +01:00 [INF] Time by mono laravel completed in 2647.1 ms +2024-02-21 15:20:32.039 +01:00 [INF] Time by mono LARAVEL completed in 2633.5 ms +2024-02-21 15:20:34.702 +01:00 [INF] Time by mono beta completed in 2662.6 ms +2024-02-21 15:20:37.373 +01:00 [INF] Time by mono meta completed in 2671.4 ms +2024-02-21 15:20:40.003 +01:00 [INF] Time by mono META completed in 2629.9 ms +2024-02-21 15:20:42.636 +01:00 [INF] Time by mono express-ejs-layouts completed in 2632.6 ms +2024-02-21 15:20:45.276 +01:00 [INF] Time by mono accepts completed in 2640.0 ms +2024-02-21 15:20:47.910 +01:00 [INF] Time by mono mime-db completed in 2633.9 ms +2024-02-21 15:20:50.561 +01:00 [INF] Time by mono mime-DB completed in 2651.3 ms +2024-02-21 15:20:53.215 +01:00 [INF] Time by mono iconv-lite completed in 2654.0 ms +2024-02-21 15:20:55.853 +01:00 [INF] Time by mono safer-buffer completed in 2637.8 ms +2024-02-21 15:20:58.512 +01:00 [INF] Time by mono raw-body completed in 2658.4 ms +2024-02-21 15:21:01.158 +01:00 [INF] Time by mono depd completed in 2646.4 ms +2024-02-21 15:21:03.821 +01:00 [INF] Time by mono finalhandler completed in 2662.8 ms +2024-02-21 15:21:06.494 +01:00 [INF] Time by mono on-finished completed in 2672.2 ms +2024-02-21 15:21:09.147 +01:00 [INF] Time by mono ipaddr.js completed in 2653.3 ms +2024-02-21 15:21:11.796 +01:00 [INF] Time by mono encodeurl completed in 2649.0 ms +2024-02-21 15:21:34.070 +01:00 [INF] Time by pipe completed in 22273.4 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 4 von 10 +```log +2024-02-21 15:22:21.048 +01:00 [INF] Time by mono LiteDB completed in 3895.0 ms +2024-02-21 15:22:23.724 +01:00 [INF] Time by mono Newtonsoft completed in 2665.8 ms +2024-02-21 15:22:26.383 +01:00 [INF] Time by mono NewtonSoft completed in 2659.2 ms +2024-02-21 15:22:29.042 +01:00 [INF] Time by mono Crowd completed in 2659.2 ms +2024-02-21 15:22:31.704 +01:00 [INF] Time by mono Atlassian completed in 2661.8 ms +2024-02-21 15:22:34.351 +01:00 [INF] Time by mono Debian completed in 2646.3 ms +2024-02-21 15:22:37.001 +01:00 [INF] Time by mono Ubuntu completed in 2650.6 ms +2024-02-21 15:22:39.649 +01:00 [INF] Time by mono Arc42 completed in 2647.3 ms +2024-02-21 15:22:42.313 +01:00 [INF] Time by mono arc42 completed in 2664.2 ms +2024-02-21 15:22:44.961 +01:00 [INF] Time by mono cookie completed in 2647.3 ms +2024-02-21 15:22:47.607 +01:00 [INF] Time by mono mongoDb completed in 2646.0 ms +2024-02-21 15:22:50.245 +01:00 [INF] Time by mono mongoDB completed in 2638.4 ms +2024-02-21 15:22:52.904 +01:00 [INF] Time by mono mongodb completed in 2658.5 ms +2024-02-21 15:22:55.567 +01:00 [INF] Time by mono parser completed in 2662.9 ms +2024-02-21 15:22:58.203 +01:00 [INF] Time by mono LiteDb completed in 2635.9 ms +2024-02-21 15:23:00.883 +01:00 [INF] Time by mono php completed in 2680.5 ms +2024-02-21 15:23:03.545 +01:00 [INF] Time by mono PHP completed in 2661.8 ms +2024-02-21 15:23:06.229 +01:00 [INF] Time by mono Laravel completed in 2683.5 ms +2024-02-21 15:23:08.891 +01:00 [INF] Time by mono laravel completed in 2662.3 ms +2024-02-21 15:23:11.541 +01:00 [INF] Time by mono LARAVEL completed in 2649.9 ms +2024-02-21 15:23:14.208 +01:00 [INF] Time by mono beta completed in 2667.3 ms +2024-02-21 15:23:16.867 +01:00 [INF] Time by mono meta completed in 2658.4 ms +2024-02-21 15:23:19.517 +01:00 [INF] Time by mono META completed in 2649.8 ms +2024-02-21 15:23:22.180 +01:00 [INF] Time by mono express-ejs-layouts completed in 2662.6 ms +2024-02-21 15:23:24.845 +01:00 [INF] Time by mono accepts completed in 2665.6 ms +2024-02-21 15:23:27.506 +01:00 [INF] Time by mono mime-db completed in 2660.5 ms +2024-02-21 15:23:30.170 +01:00 [INF] Time by mono mime-DB completed in 2664.4 ms +2024-02-21 15:23:32.847 +01:00 [INF] Time by mono iconv-lite completed in 2676.4 ms +2024-02-21 15:23:35.501 +01:00 [INF] Time by mono safer-buffer completed in 2654.0 ms +2024-02-21 15:23:38.170 +01:00 [INF] Time by mono raw-body completed in 2669.3 ms +2024-02-21 15:23:40.840 +01:00 [INF] Time by mono depd completed in 2669.0 ms +2024-02-21 15:23:43.508 +01:00 [INF] Time by mono finalhandler completed in 2668.1 ms +2024-02-21 15:23:46.174 +01:00 [INF] Time by mono on-finished completed in 2665.5 ms +2024-02-21 15:23:48.837 +01:00 [INF] Time by mono ipaddr.js completed in 2662.7 ms +2024-02-21 15:23:51.494 +01:00 [INF] Time by mono encodeurl completed in 2657.5 ms +2024-02-21 15:24:13.535 +01:00 [INF] Time by pipe completed in 22041.2 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 5 von 10 +```log +2024-02-21 15:25:42.913 +01:00 [INF] Time by mono LiteDB completed in 4195.1 ms +2024-02-21 15:25:45.595 +01:00 [INF] Time by mono Newtonsoft completed in 2671.8 ms +2024-02-21 15:25:48.273 +01:00 [INF] Time by mono NewtonSoft completed in 2678.1 ms +2024-02-21 15:25:50.960 +01:00 [INF] Time by mono Crowd completed in 2687.0 ms +2024-02-21 15:25:53.630 +01:00 [INF] Time by mono Atlassian completed in 2669.7 ms +2024-02-21 15:25:56.287 +01:00 [INF] Time by mono Debian completed in 2657.2 ms +2024-02-21 15:25:58.963 +01:00 [INF] Time by mono Ubuntu completed in 2676.2 ms +2024-02-21 15:26:01.609 +01:00 [INF] Time by mono Arc42 completed in 2645.2 ms +2024-02-21 15:26:04.272 +01:00 [INF] Time by mono arc42 completed in 2663.0 ms +2024-02-21 15:26:06.950 +01:00 [INF] Time by mono cookie completed in 2678.2 ms +2024-02-21 15:26:09.635 +01:00 [INF] Time by mono mongoDb completed in 2685.4 ms +2024-02-21 15:26:12.301 +01:00 [INF] Time by mono mongoDB completed in 2665.6 ms +2024-02-21 15:26:14.981 +01:00 [INF] Time by mono mongodb completed in 2679.3 ms +2024-02-21 15:26:17.668 +01:00 [INF] Time by mono parser completed in 2686.9 ms +2024-02-21 15:26:20.346 +01:00 [INF] Time by mono LiteDb completed in 2678.2 ms +2024-02-21 15:26:23.037 +01:00 [INF] Time by mono php completed in 2690.9 ms +2024-02-21 15:26:25.715 +01:00 [INF] Time by mono PHP completed in 2678.4 ms +2024-02-21 15:26:28.384 +01:00 [INF] Time by mono Laravel completed in 2668.6 ms +2024-02-21 15:26:31.053 +01:00 [INF] Time by mono laravel completed in 2668.6 ms +2024-02-21 15:26:33.718 +01:00 [INF] Time by mono LARAVEL completed in 2664.8 ms +2024-02-21 15:26:36.372 +01:00 [INF] Time by mono beta completed in 2654.2 ms +2024-02-21 15:26:39.029 +01:00 [INF] Time by mono meta completed in 2656.4 ms +2024-02-21 15:26:41.671 +01:00 [INF] Time by mono META completed in 2642.4 ms +2024-02-21 15:26:44.336 +01:00 [INF] Time by mono express-ejs-layouts completed in 2664.9 ms +2024-02-21 15:26:47.001 +01:00 [INF] Time by mono accepts completed in 2664.4 ms +2024-02-21 15:26:49.651 +01:00 [INF] Time by mono mime-db completed in 2649.9 ms +2024-02-21 15:26:52.303 +01:00 [INF] Time by mono mime-DB completed in 2652.8 ms +2024-02-21 15:26:54.960 +01:00 [INF] Time by mono iconv-lite completed in 2656.4 ms +2024-02-21 15:26:57.630 +01:00 [INF] Time by mono safer-buffer completed in 2670.2 ms +2024-02-21 15:27:00.296 +01:00 [INF] Time by mono raw-body completed in 2665.4 ms +2024-02-21 15:27:02.963 +01:00 [INF] Time by mono depd completed in 2667.3 ms +2024-02-21 15:27:05.638 +01:00 [INF] Time by mono finalhandler completed in 2675.1 ms +2024-02-21 15:27:08.315 +01:00 [INF] Time by mono on-finished completed in 2676.2 ms +2024-02-21 15:27:10.992 +01:00 [INF] Time by mono ipaddr.js completed in 2677.3 ms +2024-02-21 15:27:13.679 +01:00 [INF] Time by mono encodeurl completed in 2686.5 ms +2024-02-21 15:27:35.944 +01:00 [INF] Time by pipe completed in 22265.6 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 6 von 10 +```log +2024-02-21 15:28:48.481 +01:00 [INF] Time by mono LiteDB completed in 3908.8 ms +2024-02-21 15:28:51.150 +01:00 [INF] Time by mono Newtonsoft completed in 2658.6 ms +2024-02-21 15:28:53.815 +01:00 [INF] Time by mono NewtonSoft completed in 2665.2 ms +2024-02-21 15:28:56.486 +01:00 [INF] Time by mono Crowd completed in 2670.9 ms +2024-02-21 15:28:59.145 +01:00 [INF] Time by mono Atlassian completed in 2658.7 ms +2024-02-21 15:29:01.815 +01:00 [INF] Time by mono Debian completed in 2670.3 ms +2024-02-21 15:29:04.488 +01:00 [INF] Time by mono Ubuntu completed in 2673.0 ms +2024-02-21 15:29:07.169 +01:00 [INF] Time by mono Arc42 completed in 2680.6 ms +2024-02-21 15:29:09.835 +01:00 [INF] Time by mono arc42 completed in 2665.9 ms +2024-02-21 15:29:12.506 +01:00 [INF] Time by mono cookie completed in 2671.1 ms +2024-02-21 15:29:15.181 +01:00 [INF] Time by mono mongoDb completed in 2674.8 ms +2024-02-21 15:29:17.867 +01:00 [INF] Time by mono mongoDB completed in 2685.6 ms +2024-02-21 15:29:20.551 +01:00 [INF] Time by mono mongodb completed in 2683.9 ms +2024-02-21 15:29:23.228 +01:00 [INF] Time by mono parser completed in 2676.8 ms +2024-02-21 15:29:25.903 +01:00 [INF] Time by mono LiteDb completed in 2675.1 ms +2024-02-21 15:29:28.568 +01:00 [INF] Time by mono php completed in 2665.1 ms +2024-02-21 15:29:31.247 +01:00 [INF] Time by mono PHP completed in 2679.0 ms +2024-02-21 15:29:33.909 +01:00 [INF] Time by mono Laravel completed in 2662.0 ms +2024-02-21 15:29:36.587 +01:00 [INF] Time by mono laravel completed in 2677.4 ms +2024-02-21 15:29:39.239 +01:00 [INF] Time by mono LARAVEL completed in 2652.3 ms +2024-02-21 15:29:41.900 +01:00 [INF] Time by mono beta completed in 2660.6 ms +2024-02-21 15:29:44.557 +01:00 [INF] Time by mono meta completed in 2657.5 ms +2024-02-21 15:29:47.206 +01:00 [INF] Time by mono META completed in 2648.4 ms +2024-02-21 15:29:49.862 +01:00 [INF] Time by mono express-ejs-layouts completed in 2655.7 ms +2024-02-21 15:29:52.522 +01:00 [INF] Time by mono accepts completed in 2659.9 ms +2024-02-21 15:29:55.186 +01:00 [INF] Time by mono mime-db completed in 2663.8 ms +2024-02-21 15:29:57.835 +01:00 [INF] Time by mono mime-DB completed in 2649.1 ms +2024-02-21 15:30:00.492 +01:00 [INF] Time by mono iconv-lite completed in 2657.1 ms +2024-02-21 15:30:03.164 +01:00 [INF] Time by mono safer-buffer completed in 2672.2 ms +2024-02-21 15:30:05.832 +01:00 [INF] Time by mono raw-body completed in 2667.5 ms +2024-02-21 15:30:08.498 +01:00 [INF] Time by mono depd completed in 2665.8 ms +2024-02-21 15:30:11.166 +01:00 [INF] Time by mono finalhandler completed in 2667.8 ms +2024-02-21 15:30:13.831 +01:00 [INF] Time by mono on-finished completed in 2664.5 ms +2024-02-21 15:30:16.480 +01:00 [INF] Time by mono ipaddr.js completed in 2649.5 ms +2024-02-21 15:30:19.148 +01:00 [INF] Time by mono encodeurl completed in 2667.3 ms +2024-02-21 15:30:41.173 +01:00 [INF] Time by pipe completed in 22025.6 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 7 von 10 +```log +2024-02-21 15:35:57.965 +01:00 [INF] Time by mono LiteDB completed in 3805.9 ms +2024-02-21 15:36:00.640 +01:00 [INF] Time by mono Newtonsoft completed in 2665.7 ms +2024-02-21 15:36:03.329 +01:00 [INF] Time by mono NewtonSoft completed in 2687.9 ms +2024-02-21 15:36:06.027 +01:00 [INF] Time by mono Crowd completed in 2698.6 ms +2024-02-21 15:36:08.703 +01:00 [INF] Time by mono Atlassian completed in 2675.4 ms +2024-02-21 15:36:11.373 +01:00 [INF] Time by mono Debian completed in 2670.5 ms +2024-02-21 15:36:14.046 +01:00 [INF] Time by mono Ubuntu completed in 2672.7 ms +2024-02-21 15:36:16.727 +01:00 [INF] Time by mono Arc42 completed in 2681.3 ms +2024-02-21 15:36:19.410 +01:00 [INF] Time by mono arc42 completed in 2682.9 ms +2024-02-21 15:36:22.095 +01:00 [INF] Time by mono cookie completed in 2684.7 ms +2024-02-21 15:36:24.773 +01:00 [INF] Time by mono mongoDb completed in 2677.2 ms +2024-02-21 15:36:27.442 +01:00 [INF] Time by mono mongoDB completed in 2669.8 ms +2024-02-21 15:36:30.123 +01:00 [INF] Time by mono mongodb completed in 2680.6 ms +2024-02-21 15:36:32.799 +01:00 [INF] Time by mono parser completed in 2675.7 ms +2024-02-21 15:36:35.460 +01:00 [INF] Time by mono LiteDb completed in 2660.7 ms +2024-02-21 15:36:38.121 +01:00 [INF] Time by mono php completed in 2661.2 ms +2024-02-21 15:36:40.823 +01:00 [INF] Time by mono PHP completed in 2702.3 ms +2024-02-21 15:36:43.482 +01:00 [INF] Time by mono Laravel completed in 2658.7 ms +2024-02-21 15:36:46.139 +01:00 [INF] Time by mono laravel completed in 2656.8 ms +2024-02-21 15:36:48.793 +01:00 [INF] Time by mono LARAVEL completed in 2654.0 ms +2024-02-21 15:36:51.473 +01:00 [INF] Time by mono beta completed in 2679.7 ms +2024-02-21 15:36:54.144 +01:00 [INF] Time by mono meta completed in 2670.9 ms +2024-02-21 15:36:56.788 +01:00 [INF] Time by mono META completed in 2643.9 ms +2024-02-21 15:36:59.466 +01:00 [INF] Time by mono express-ejs-layouts completed in 2678.0 ms +2024-02-21 15:37:02.138 +01:00 [INF] Time by mono accepts completed in 2672.1 ms +2024-02-21 15:37:04.807 +01:00 [INF] Time by mono mime-db completed in 2669.0 ms +2024-02-21 15:37:07.480 +01:00 [INF] Time by mono mime-DB completed in 2672.6 ms +2024-02-21 15:37:10.153 +01:00 [INF] Time by mono iconv-lite completed in 2672.6 ms +2024-02-21 15:37:12.843 +01:00 [INF] Time by mono safer-buffer completed in 2689.8 ms +2024-02-21 15:37:15.516 +01:00 [INF] Time by mono raw-body completed in 2672.7 ms +2024-02-21 15:37:18.176 +01:00 [INF] Time by mono depd completed in 2659.8 ms +2024-02-21 15:37:20.851 +01:00 [INF] Time by mono finalhandler completed in 2675.1 ms +2024-02-21 15:37:23.522 +01:00 [INF] Time by mono on-finished completed in 2671.4 ms +2024-02-21 15:37:26.198 +01:00 [INF] Time by mono ipaddr.js completed in 2675.3 ms +2024-02-21 15:37:28.872 +01:00 [INF] Time by mono encodeurl completed in 2673.9 ms +2024-02-21 15:37:50.909 +01:00 [INF] Time by pipe completed in 22037.0 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 8 von 10 +```log +2024-02-21 15:38:59.564 +01:00 [INF] Time by mono LiteDB completed in 3914.2 ms +2024-02-21 15:39:02.277 +01:00 [INF] Time by mono Newtonsoft completed in 2703.2 ms +2024-02-21 15:39:04.995 +01:00 [INF] Time by mono NewtonSoft completed in 2717.7 ms +2024-02-21 15:39:07.709 +01:00 [INF] Time by mono Crowd completed in 2714.1 ms +2024-02-21 15:39:10.402 +01:00 [INF] Time by mono Atlassian completed in 2693.0 ms +2024-02-21 15:39:13.115 +01:00 [INF] Time by mono Debian completed in 2712.6 ms +2024-02-21 15:39:15.830 +01:00 [INF] Time by mono Ubuntu completed in 2714.6 ms +2024-02-21 15:39:18.549 +01:00 [INF] Time by mono Arc42 completed in 2719.5 ms +2024-02-21 15:39:21.277 +01:00 [INF] Time by mono arc42 completed in 2727.6 ms +2024-02-21 15:39:23.993 +01:00 [INF] Time by mono cookie completed in 2715.4 ms +2024-02-21 15:39:26.713 +01:00 [INF] Time by mono mongoDb completed in 2720.5 ms +2024-02-21 15:39:29.431 +01:00 [INF] Time by mono mongoDB completed in 2718.2 ms +2024-02-21 15:39:32.134 +01:00 [INF] Time by mono mongodb completed in 2702.6 ms +2024-02-21 15:39:34.846 +01:00 [INF] Time by mono parser completed in 2711.8 ms +2024-02-21 15:39:37.560 +01:00 [INF] Time by mono LiteDb completed in 2713.6 ms +2024-02-21 15:39:40.275 +01:00 [INF] Time by mono php completed in 2715.2 ms +2024-02-21 15:39:42.977 +01:00 [INF] Time by mono PHP completed in 2702.1 ms +2024-02-21 15:39:45.698 +01:00 [INF] Time by mono Laravel completed in 2720.3 ms +2024-02-21 15:39:48.420 +01:00 [INF] Time by mono laravel completed in 2722.3 ms +2024-02-21 15:39:51.136 +01:00 [INF] Time by mono LARAVEL completed in 2716.2 ms +2024-02-21 15:39:53.830 +01:00 [INF] Time by mono beta completed in 2693.8 ms +2024-02-21 15:39:56.548 +01:00 [INF] Time by mono meta completed in 2717.8 ms +2024-02-21 15:39:59.253 +01:00 [INF] Time by mono META completed in 2704.6 ms +2024-02-21 15:40:01.969 +01:00 [INF] Time by mono express-ejs-layouts completed in 2716.0 ms +2024-02-21 15:40:04.674 +01:00 [INF] Time by mono accepts completed in 2705.0 ms +2024-02-21 15:40:07.394 +01:00 [INF] Time by mono mime-db completed in 2719.6 ms +2024-02-21 15:40:10.116 +01:00 [INF] Time by mono mime-DB completed in 2722.5 ms +2024-02-21 15:40:12.816 +01:00 [INF] Time by mono iconv-lite completed in 2699.7 ms +2024-02-21 15:40:15.530 +01:00 [INF] Time by mono safer-buffer completed in 2714.0 ms +2024-02-21 15:40:18.249 +01:00 [INF] Time by mono raw-body completed in 2719.2 ms +2024-02-21 15:40:20.964 +01:00 [INF] Time by mono depd completed in 2714.5 ms +2024-02-21 15:40:23.681 +01:00 [INF] Time by mono finalhandler completed in 2717.1 ms +2024-02-21 15:40:26.409 +01:00 [INF] Time by mono on-finished completed in 2727.4 ms +2024-02-21 15:40:29.108 +01:00 [INF] Time by mono ipaddr.js completed in 2698.8 ms +2024-02-21 15:40:31.801 +01:00 [INF] Time by mono encodeurl completed in 2693.3 ms +2024-02-21 15:40:54.221 +01:00 [INF] Time by pipe completed in 22419.6 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 9 von 10 +```log +2024-02-21 15:42:36.944 +01:00 [INF] Time by mono LiteDB completed in 4029.9 ms +2024-02-21 15:42:39.619 +01:00 [INF] Time by mono Newtonsoft completed in 2665.9 ms +2024-02-21 15:42:42.278 +01:00 [INF] Time by mono NewtonSoft completed in 2658.3 ms +2024-02-21 15:42:44.956 +01:00 [INF] Time by mono Crowd completed in 2677.8 ms +2024-02-21 15:42:47.609 +01:00 [INF] Time by mono Atlassian completed in 2653.4 ms +2024-02-21 15:42:50.290 +01:00 [INF] Time by mono Debian completed in 2681.1 ms +2024-02-21 15:42:52.959 +01:00 [INF] Time by mono Ubuntu completed in 2668.2 ms +2024-02-21 15:42:55.629 +01:00 [INF] Time by mono Arc42 completed in 2670.1 ms +2024-02-21 15:42:58.302 +01:00 [INF] Time by mono arc42 completed in 2673.1 ms +2024-02-21 15:43:00.957 +01:00 [INF] Time by mono cookie completed in 2654.4 ms +2024-02-21 15:43:03.639 +01:00 [INF] Time by mono mongoDb completed in 2682.3 ms +2024-02-21 15:43:06.328 +01:00 [INF] Time by mono mongoDB completed in 2688.9 ms +2024-02-21 15:43:09.001 +01:00 [INF] Time by mono mongodb completed in 2673.4 ms +2024-02-21 15:43:11.692 +01:00 [INF] Time by mono parser completed in 2690.1 ms +2024-02-21 15:43:14.368 +01:00 [INF] Time by mono LiteDb completed in 2676.6 ms +2024-02-21 15:43:17.035 +01:00 [INF] Time by mono php completed in 2666.7 ms +2024-02-21 15:43:19.716 +01:00 [INF] Time by mono PHP completed in 2680.7 ms +2024-02-21 15:43:22.396 +01:00 [INF] Time by mono Laravel completed in 2679.6 ms +2024-02-21 15:43:25.092 +01:00 [INF] Time by mono laravel completed in 2696.4 ms +2024-02-21 15:43:27.765 +01:00 [INF] Time by mono LARAVEL completed in 2673.0 ms +2024-02-21 15:43:30.439 +01:00 [INF] Time by mono beta completed in 2673.1 ms +2024-02-21 15:43:33.106 +01:00 [INF] Time by mono meta completed in 2666.8 ms +2024-02-21 15:43:35.784 +01:00 [INF] Time by mono META completed in 2677.9 ms +2024-02-21 15:43:38.459 +01:00 [INF] Time by mono express-ejs-layouts completed in 2675.0 ms +2024-02-21 15:43:41.139 +01:00 [INF] Time by mono accepts completed in 2679.4 ms +2024-02-21 15:43:43.805 +01:00 [INF] Time by mono mime-db completed in 2666.0 ms +2024-02-21 15:43:46.462 +01:00 [INF] Time by mono mime-DB completed in 2656.4 ms +2024-02-21 15:43:49.130 +01:00 [INF] Time by mono iconv-lite completed in 2668.2 ms +2024-02-21 15:43:51.801 +01:00 [INF] Time by mono safer-buffer completed in 2671.4 ms +2024-02-21 15:43:54.465 +01:00 [INF] Time by mono raw-body completed in 2663.7 ms +2024-02-21 15:43:57.134 +01:00 [INF] Time by mono depd completed in 2668.6 ms +2024-02-21 15:43:59.811 +01:00 [INF] Time by mono finalhandler completed in 2676.7 ms +2024-02-21 15:44:02.503 +01:00 [INF] Time by mono on-finished completed in 2692.3 ms +2024-02-21 15:44:05.177 +01:00 [INF] Time by mono ipaddr.js completed in 2673.8 ms +2024-02-21 15:44:07.869 +01:00 [INF] Time by mono encodeurl completed in 2692.1 ms +2024-02-21 15:44:29.962 +01:00 [INF] Time by pipe completed in 22092.4 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Durchgang 10 von 10 +```log +2024-02-21 15:45:17.426 +01:00 [INF] Time by mono LiteDB completed in 3985.9 ms +2024-02-21 15:45:20.063 +01:00 [INF] Time by mono Newtonsoft completed in 2627.1 ms +2024-02-21 15:45:22.688 +01:00 [INF] Time by mono NewtonSoft completed in 2624.8 ms +2024-02-21 15:45:25.333 +01:00 [INF] Time by mono Crowd completed in 2644.6 ms +2024-02-21 15:45:27.961 +01:00 [INF] Time by mono Atlassian completed in 2627.8 ms +2024-02-21 15:45:30.593 +01:00 [INF] Time by mono Debian completed in 2632.2 ms +2024-02-21 15:45:33.222 +01:00 [INF] Time by mono Ubuntu completed in 2628.7 ms +2024-02-21 15:45:35.856 +01:00 [INF] Time by mono Arc42 completed in 2634.3 ms +2024-02-21 15:45:38.462 +01:00 [INF] Time by mono arc42 completed in 2605.6 ms +2024-02-21 15:45:41.080 +01:00 [INF] Time by mono cookie completed in 2618.4 ms +2024-02-21 15:45:43.698 +01:00 [INF] Time by mono mongoDb completed in 2617.8 ms +2024-02-21 15:45:46.325 +01:00 [INF] Time by mono mongoDB completed in 2626.6 ms +2024-02-21 15:45:48.949 +01:00 [INF] Time by mono mongodb completed in 2623.7 ms +2024-02-21 15:45:51.559 +01:00 [INF] Time by mono parser completed in 2610.7 ms +2024-02-21 15:45:54.214 +01:00 [INF] Time by mono LiteDb completed in 2654.7 ms +2024-02-21 15:45:56.852 +01:00 [INF] Time by mono php completed in 2637.5 ms +2024-02-21 15:45:59.475 +01:00 [INF] Time by mono PHP completed in 2622.8 ms +2024-02-21 15:46:02.102 +01:00 [INF] Time by mono Laravel completed in 2626.9 ms +2024-02-21 15:46:04.732 +01:00 [INF] Time by mono laravel completed in 2629.7 ms +2024-02-21 15:46:07.361 +01:00 [INF] Time by mono LARAVEL completed in 2629.8 ms +2024-02-21 15:46:09.986 +01:00 [INF] Time by mono beta completed in 2624.7 ms +2024-02-21 15:46:12.622 +01:00 [INF] Time by mono meta completed in 2635.4 ms +2024-02-21 15:46:15.255 +01:00 [INF] Time by mono META completed in 2633.3 ms +2024-02-21 15:46:17.886 +01:00 [INF] Time by mono express-ejs-layouts completed in 2630.7 ms +2024-02-21 15:46:20.518 +01:00 [INF] Time by mono accepts completed in 2631.6 ms +2024-02-21 15:46:23.145 +01:00 [INF] Time by mono mime-db completed in 2626.9 ms +2024-02-21 15:46:25.792 +01:00 [INF] Time by mono mime-DB completed in 2646.3 ms +2024-02-21 15:46:28.419 +01:00 [INF] Time by mono iconv-lite completed in 2627.2 ms +2024-02-21 15:46:31.052 +01:00 [INF] Time by mono safer-buffer completed in 2633.2 ms +2024-02-21 15:46:33.675 +01:00 [INF] Time by mono raw-body completed in 2622.8 ms +2024-02-21 15:46:36.303 +01:00 [INF] Time by mono depd completed in 2627.3 ms +2024-02-21 15:46:38.930 +01:00 [INF] Time by mono finalhandler completed in 2627.2 ms +2024-02-21 15:46:41.551 +01:00 [INF] Time by mono on-finished completed in 2620.6 ms +2024-02-21 15:46:44.175 +01:00 [INF] Time by mono ipaddr.js completed in 2624.0 ms +2024-02-21 15:46:46.817 +01:00 [INF] Time by mono encodeurl completed in 2641.9 ms +2024-02-21 15:47:08.654 +01:00 [INF] Time by pipe completed in 21836.9 ms +``` +Durchschnitt Mono:
+Laufzeit der Pipe:
+Gesamt Mono:
+Faktor: + +### Erkenntnisse +Die durchschnittliche Laufzeit der Mono bzw. Single-Paket Analyse dauerte:
+Die Gesamtlaufzeit von Mono beträgt:
+Die Gesamtlaufzeit von Pipe beträgt:
+ +Der Durchschnittliche Faktor (schnellere Pipe als Mono) beträgt: diff --git a/documentation/fragments/uml.puml b/documentation/fragments/uml.puml new file mode 100644 index 0000000..8affef3 --- /dev/null +++ b/documentation/fragments/uml.puml @@ -0,0 +1,78 @@ +@startuml + + namespace AmIVulnerable.Controllers { + class DbController { + ' Inhalt + } + + class DependenciesController { + ' Inhalt + } + + class GitController { + ' Inhalt + } + + class ViewController { + ' Inhalt + } + } + + namespace LiteDbLib.Controller { + class ConvertCveToDbController { + - static string saveDir + - List files + - List dbFiles + - readonly string tableName = "cve" + - Regex regexYear = new Regex(@"\\cves\\(\d{4})\\") + --- + + ConvertCveToDbController(List files) + + bool ConvertRawCve() + } + + class SearchDbController { + - static string SaveDir + - List dbFiles + - readonly string tableName = "cve" + + + SearchDbController() + + List SearchSinglePackage(string designation) + + async Task> SearchPackagesAsList(List designations) + + List SearchPackagesAsListMono(List designations) + - List SearchInDb(string dbFile, string designation) + } + } + + namespace Modells { + namespace Packages { + class NodePackage { + + string Name { get; set; } = ""; + + string Version { get; set; } = ""; + + List Dependencies { get; set; } = []; + } + + class NodePackageResult { + + string Name { get; set; } = ""; + + string Version { get; set; } = ""; + + bool isCveTracked { get; set; } = false; + + List Dependencies { get; set; } = []; + } + } + + note "Klassendarstellung der CVE-Daten;\nfür Detail Datei ''CVEcomp.cs'' konsultieren" as CveCompNote + CveCompNote .. CVEcomp + class CVEcomp { + } + + class CveResult { + + string CveNumber { get; set; } = ""; + + string Version { get; set; } = ""; + + string Designation { get; set; } = ""; + } + + enum ProjectType { + NodeJs = 0 + } + } + +@enduml \ No newline at end of file From c9d7c9bae899a4a39aa237d553ddaa1447773b88 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 10 Mar 2024 20:35:07 +0100 Subject: [PATCH 03/60] changed structure of documentation --- documentation/latex/1_abstract/abstract.tex | 1 + documentation/latex/2_motivation/motivation.tex | 1 + documentation/latex/3_definitions/definitions.tex | 1 + documentation/latex/4_other_work/other_work.tex | 1 + documentation/latex/5_concept/concept.tex | 1 + documentation/latex/6_implementation/implementation.tex | 1 + documentation/latex/7_verification/verification.tex | 1 + documentation/latex/8_discussion/discussion.tex | 1 + documentation/latex/9_summary/summary.tex | 1 + 9 files changed, 9 insertions(+) create mode 100644 documentation/latex/1_abstract/abstract.tex create mode 100644 documentation/latex/2_motivation/motivation.tex create mode 100644 documentation/latex/3_definitions/definitions.tex create mode 100644 documentation/latex/4_other_work/other_work.tex create mode 100644 documentation/latex/5_concept/concept.tex create mode 100644 documentation/latex/6_implementation/implementation.tex create mode 100644 documentation/latex/7_verification/verification.tex create mode 100644 documentation/latex/8_discussion/discussion.tex create mode 100644 documentation/latex/9_summary/summary.tex diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/1_abstract/abstract.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/2_motivation/motivation.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/3_definitions/definitions.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/4_other_work/other_work.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/5_concept/concept.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/6_implementation/implementation.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/7_verification/verification.tex b/documentation/latex/7_verification/verification.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/7_verification/verification.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/8_discussion/discussion.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/8_discussion/discussion.tex @@ -0,0 +1 @@ +\section{} \label{sec:} diff --git a/documentation/latex/9_summary/summary.tex b/documentation/latex/9_summary/summary.tex new file mode 100644 index 0000000..6656d08 --- /dev/null +++ b/documentation/latex/9_summary/summary.tex @@ -0,0 +1 @@ +\section{} \label{sec:} From ba2acc473f7d14cabb01aab6f55ebbf10c5e40f9 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Wed, 13 Mar 2024 16:06:46 +0100 Subject: [PATCH 04/60] update latex --- documentation/latex/1_abstract/abstract.tex | 9 ++++++- .../latex/2_motivation/motivation.tex | 26 ++++++++++++++++++- documentation/latex/3_definitions/cve.tex | 8 ++++++ .../latex/3_definitions/definitions.tex | 3 ++- documentation/latex/4_other_work/dependa.tex | 2 ++ documentation/latex/4_other_work/nist.tex | 10 +++++++ .../latex/4_other_work/other_work.tex | 5 +++- documentation/latex/lib/bib.bib | 5 +++- documentation/latex/main.tex | 21 +++++++++++---- 9 files changed, 79 insertions(+), 10 deletions(-) create mode 100644 documentation/latex/3_definitions/cve.tex create mode 100644 documentation/latex/4_other_work/dependa.tex create mode 100644 documentation/latex/4_other_work/nist.tex diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 6656d08..be4c2fa 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -1 +1,8 @@ -\section{} \label{sec:} +\section{Abstract} \label{sec:abstract} +Das Entwickeln von Softwarelösungen ist heutzutage nicht mehr ohne Bibliotheken, Frameworks oder externe Module denkbar. +Solche Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung. +Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. +Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. +\\ +In dieser Arbeit ist durch das Aufstellen einer API eine Möglichkeit aufgezeigt, wie transitive Vererbungen von Abhängigkeiten dargestellt werden können. +Außderdem sind Laufzeitmessungen sowie -vergleiche mit anderen Tools vorgenommen und diese bewertet. \ No newline at end of file diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index 6656d08..a6906bd 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -1 +1,25 @@ -\section{} \label{sec:} +\subsection{Motivation} \label{subsec:Motivation} + Beim Entwickeln von Softwarelösungen gibt es viele Herausforderungen und Probleme. + Diese werden durch viele bereits vorhandene Softwarepakete bewältigt. + Die Nutzung frei verfügbarer Softwarepakete sind deshalb im Arbeitsalltag gang und gäbe. + Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. + Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der gute Pakete beständig besser werden lässt und nicht durchdachte entweder (a) an Bedeutung verlieren lässt oder (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. + Ein anderer essentieller Aspekt außer der Nutzbarkeit oder Funktionserfüllung ist die Sicherheit. + Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. + Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. + \\ \\ + Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. + Eine Automatisierung der Analyse solcher Pakete zielt somit nicht nur eine Reduktion des Zeitaufwandes mit sich, auch ist eine umfangreichere Analyse ohne Mehraufwand möglich. + Dies spiegelt sich beispielsweise in der Möglichkeit wieder, ganze Projekte direkt analysieren zu lassen anstelle der einzelnen Pakete. + \\ + Das zeigt, dass ein dringender Bedarf an einem Werkzeug besteht, das Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. + Solch ein Werkzeug könnte einem Unternehmen weiterhin verschiedene Vorteile im Bereich der Softwareentwicklung für Transparenz, Qualität und Sicherheit bringen. + \begin{enumerate} + \item Transparenz und Vertrauen\\ + Durch eine klare Übersicht über genutzte externe Softwarekomponenten mit Sicherheitslücken können frühzeitig besser informierte Entscheidungen getroffen und potenzielle Risiken identifiziert werden. + \item Qualität\\ + Entwickler können leichter erkennen, ob Abhängigkeiten ersetzt oder aktualisiert werden müssen. + \item Sicherheit\\ + Um die Gesamtsicherheit einer Applikation bestmöglich zu gewährleisten trägt ein solches Tool, welches Schwachstellen und Abhängigkeiten auch in tieferen Ebenen von Abhängigkeiten darstellt, zur Identifikation und Vermeidung von Sicherheitslücken bei. + \end{enumerate} + Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file diff --git a/documentation/latex/3_definitions/cve.tex b/documentation/latex/3_definitions/cve.tex new file mode 100644 index 0000000..097a419 --- /dev/null +++ b/documentation/latex/3_definitions/cve.tex @@ -0,0 +1,8 @@ +\subsection{CVE} \label{sec:CVE} +Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. +CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. +\\ +\glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. +Hierbei werden nur die Schwachstellen betrachtet, die durch eine \glqq CVE Numbering Authority\grqq (CNA) eine CVE-Nummer zugewiesen bekommen haben.\cite{} +Solch eine CVE-Nummer beinhaltet keine technischen Informationen zur Betroffenen Softwarekomponente. +Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. \ No newline at end of file diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 6656d08..6a4d3c0 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1 +1,2 @@ -\section{} \label{sec:} +\section{Definitionen} \label{sec:Definitionen} +\input{3_definitions/cve.tex} \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex new file mode 100644 index 0000000..e56899b --- /dev/null +++ b/documentation/latex/4_other_work/dependa.tex @@ -0,0 +1,2 @@ +\subsection{Github Dependa Bot} \label{sec:Dependa} +https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex new file mode 100644 index 0000000..5d9701c --- /dev/null +++ b/documentation/latex/4_other_work/nist.tex @@ -0,0 +1,10 @@ +\subsection{NIST-API} \label{sec:NIST-API} +Es werden zwei CVE-API's vom NIST angeboten: +\begin{itemize} + \item CVE \\ + Hier lassen sich Informationen zu einer oder mehreren CVE's erhalten. + Durch das Vorhandensein von mehr als 240.000 Einträgen wird eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. + \item CVE Change History \\ + Hier lassen sich Informationen über Änderungen einer CVE oder einer Sammlung von CVE's erhalten. +\end{itemize} +Für das Projekt wurde die erste API genutzt, die unter \href{https://services.nvd.nist.gov/rest/json/cves/2.0}{https://services.nvd.nist.gov/rest/json/cves/2.0} verfügbar ist. \ No newline at end of file diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 6656d08..83adcfc 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1 +1,4 @@ -\section{} \label{sec:} +\section{Andere Arbeiten} \label{sec:Andere} +CVE-Daten werden bereits von verschiedenen Services genutzt um bei betroffenen Komponenten eine CVE-Nummer zu erhalten. +\input{4_other_work/nist.tex} +\input{4_other_work/dependa.tex} \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index e9cdca5..14065fe 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -7,4 +7,7 @@ @book{Buch:Demo year = "2023", isbn = "000-0-00000-000-0" } -%https://www.redhat.com/de/topics/security/what-is-cve \ No newline at end of file +%https://www.redhat.com/de/topics/security/what-is-cve +%https://www.cve.org/ProgramOrganization/CNAs +% https://nvd.nist.gov/developers/vulnerabilities +% https://github.com/dependabot \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index e915812..fa8a208 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -147,11 +147,22 @@ % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? \newpage - \input{sections/einleitung.tex} - \input{sections/recherche.tex} - \input{sections/umsetzung.tex} - \input{sections/analyse.tex} - \input{sections/conclusion.tex} + + \input{1_abstract/abstract.tex} + \input{2_motivation/motivation.tex} + \input{3_definitions/definitions.tex} + \input{4_other_work/other_work.tex} + \input{5_concept/concept.tex} + \input{6_implementation/implementation.tex} + \input{7_verification/verification.tex} + \input{8_discussion/discussion.tex} + \input{9_summary/summary.tex} + + % \input{sections/einleitung.tex} + % \input{sections/recherche.tex} + % \input{sections/umsetzung.tex} + % \input{sections/analyse.tex} + % \input{sections/conclusion.tex} \newpage \phantomsection From fe361e8d8c59e6d8f0b0a04e1e93ba44f5289f63 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Thu, 14 Mar 2024 20:57:13 +0100 Subject: [PATCH 05/60] added/changed sections 1,2,3 and 4 --- documentation/latex/1_abstract/abstract.tex | 9 +++-- .../latex/2_motivation/motivation.tex | 34 +++++++--------- documentation/latex/3_definitions/cve.tex | 8 ---- .../latex/3_definitions/definitions.tex | 39 ++++++++++++++++++- documentation/latex/4_other_work/dependa.tex | 1 - documentation/latex/4_other_work/nist.tex | 28 ++++++++----- .../latex/4_other_work/other_work.tex | 11 +++++- documentation/latex/4_other_work/owasp.tex | 2 + documentation/latex/4_other_work/snyk.tex | 2 + .../latex/4_other_work/whitesource.tex | 2 + documentation/latex/5_concept/concept.tex | 3 +- documentation/latex/lib/bib.bib | 16 +++++++- 12 files changed, 107 insertions(+), 48 deletions(-) delete mode 100644 documentation/latex/3_definitions/cve.tex create mode 100644 documentation/latex/4_other_work/owasp.tex create mode 100644 documentation/latex/4_other_work/snyk.tex create mode 100644 documentation/latex/4_other_work/whitesource.tex diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index be4c2fa..01eab94 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -1,8 +1,9 @@ \section{Abstract} \label{sec:abstract} -Das Entwickeln von Softwarelösungen ist heutzutage nicht mehr ohne Bibliotheken, Frameworks oder externe Module denkbar. -Solche Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung. +Das Entwickeln von Softwarelösungen ohne Bibliotheken, Frameworks oder externe Module ist heutzutage nicht mehr denkbar. +Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein wunder Punkt der Softwareentwicklung. Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. \\ -In dieser Arbeit ist durch das Aufstellen einer API eine Möglichkeit aufgezeigt, wie transitive Vererbungen von Abhängigkeiten dargestellt werden können. -Außderdem sind Laufzeitmessungen sowie -vergleiche mit anderen Tools vorgenommen und diese bewertet. \ No newline at end of file +Diese Arbeit stellt die Entwicklung einer API vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. +Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. +Ziel einer soclehn Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index a6906bd..a42ccb8 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -1,25 +1,19 @@ -\subsection{Motivation} \label{subsec:Motivation} +\section{Motivation} \label{subsec:Motivation} Beim Entwickeln von Softwarelösungen gibt es viele Herausforderungen und Probleme. - Diese werden durch viele bereits vorhandene Softwarepakete bewältigt. - Die Nutzung frei verfügbarer Softwarepakete sind deshalb im Arbeitsalltag gang und gäbe. + Diese werden durch viele bereits vorhandene Softwarepakete, wie etwa Bibliotheken oderFrameworks, bewältigt. + Die Nutzung frei verfügbarer Softwarepakete ist deshalb im Arbeitsalltag gang und gäbe. Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. - Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der gute Pakete beständig besser werden lässt und nicht durchdachte entweder (a) an Bedeutung verlieren lässt oder (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. - Ein anderer essentieller Aspekt außer der Nutzbarkeit oder Funktionserfüllung ist die Sicherheit. + Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der Pakete (a) an Bedeutung verlieren lässt bzw. (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. + \\ \\ + Neben der Funktionalität besteht ein anderer essentieller Aspekt in der Sicherheit. Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. - \\ \\ Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. - Eine Automatisierung der Analyse solcher Pakete zielt somit nicht nur eine Reduktion des Zeitaufwandes mit sich, auch ist eine umfangreichere Analyse ohne Mehraufwand möglich. - Dies spiegelt sich beispielsweise in der Möglichkeit wieder, ganze Projekte direkt analysieren zu lassen anstelle der einzelnen Pakete. - \\ - Das zeigt, dass ein dringender Bedarf an einem Werkzeug besteht, das Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. - Solch ein Werkzeug könnte einem Unternehmen weiterhin verschiedene Vorteile im Bereich der Softwareentwicklung für Transparenz, Qualität und Sicherheit bringen. - \begin{enumerate} - \item Transparenz und Vertrauen\\ - Durch eine klare Übersicht über genutzte externe Softwarekomponenten mit Sicherheitslücken können frühzeitig besser informierte Entscheidungen getroffen und potenzielle Risiken identifiziert werden. - \item Qualität\\ - Entwickler können leichter erkennen, ob Abhängigkeiten ersetzt oder aktualisiert werden müssen. - \item Sicherheit\\ - Um die Gesamtsicherheit einer Applikation bestmöglich zu gewährleisten trägt ein solches Tool, welches Schwachstellen und Abhängigkeiten auch in tieferen Ebenen von Abhängigkeiten darstellt, zur Identifikation und Vermeidung von Sicherheitslücken bei. - \end{enumerate} - Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file + \\ \\ + Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. + Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt der Nutzer. + Somit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. + \\ \\ + Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. + Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. + Dieses Werkzeug hilft also bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file diff --git a/documentation/latex/3_definitions/cve.tex b/documentation/latex/3_definitions/cve.tex deleted file mode 100644 index 097a419..0000000 --- a/documentation/latex/3_definitions/cve.tex +++ /dev/null @@ -1,8 +0,0 @@ -\subsection{CVE} \label{sec:CVE} -Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. -CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. -\\ -\glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. -Hierbei werden nur die Schwachstellen betrachtet, die durch eine \glqq CVE Numbering Authority\grqq (CNA) eine CVE-Nummer zugewiesen bekommen haben.\cite{} -Solch eine CVE-Nummer beinhaltet keine technischen Informationen zur Betroffenen Softwarekomponente. -Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. \ No newline at end of file diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 6a4d3c0..77e2ea5 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1,2 +1,39 @@ \section{Definitionen} \label{sec:Definitionen} -\input{3_definitions/cve.tex} \ No newline at end of file +\begin{itemize} + \item \textbf{CVE (Common Vulnerabilities and Exposures):} \\ + + Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. + CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \\ + \glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. + In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq CVE Numbering Authority's\grqq (CNA's) eine CVE-Nummer zugewiesen bekommen haben.\cite{} + Eine CVE-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. + Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. + + \item \textbf{Direkte Abhängigkeiten:} \\ + In der Softwareentwicklung ist eine Abhängigkeit ein Softwarepaket, welches von der Anwendung selbst benötigt wird, um korrekt zu funktionieren. + Diese Abhängigkeiten können direkt oder indirekt sein. + Indirekte Abhängigkeiten sind solche, die durch andere Abhängigkeiten eingeführt werden. + Direkte Abhängigkeiten sind typischerweise externe Softwarekomponenten oder Bibliotheken. + Diese werden auch als Paket bezeichnet. + + \item \textbf{Transitive Abhängigkeiten:} \\ + Transitive Abhängigkeiten sind indirekte Abhängigkeiten, die durch andere Abhängigkeiten benötigt werden. + Wenn nun eine Applikation ein Paket einbindet welches ein weiteres Paket selbst benötigt, so ist dieses eine transitive Abhängigkeit der Applikation. + Somit können sich rekursiv Abhängigkeitsbäume aufspannen, die teils sogar gleiche Pakete in verschiedenen Versionen einbinden. + + \item \textbf{API (Application Programming Interface):} \\ + Eine API definiert eine Reihe von Regeln und Mechanismen, über die verschiedene Softwarekomponenten miteinander interagieren können. + Somit bieten stellen sie Schnittstelle zwischen verschiedenen Systemen dar. + Sie legt fest, wie Softwaremodule oder -anwendungen miteinander kommunizieren, indem sie Funktionen, Methoden, Protokolle und Datenstrukturen bereitstellt. + Um eine API zu nutzen müssen diese Festlegungen eingehalten werden. + + + \item \textbf{JSON (JavaScript Object Notation):} \\ + JSON ist ein in der Webentwicklung verbreitetes Datenformat. + Genutzt wird dieses um strukturierte Daten zu speichern und auszutauschen. + Basierend auf einer einfachen Syntax, die auf Schlüssel-Wert-Paaren und verschachtelten Datenstrukturen basiert ermöglicht es für Mensch sowie Maschine eine gute Les- und Parsbarkeit. + JSON wird häufig für die Übertragung von Daten zwischen Client und Server. + Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ählnich der von C, C++ oder C\#. + +\end{itemize} \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index e56899b..df6924e 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,2 +1 @@ \subsection{Github Dependa Bot} \label{sec:Dependa} -https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index 5d9701c..18992f4 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,10 +1,20 @@ \subsection{NIST-API} \label{sec:NIST-API} -Es werden zwei CVE-API's vom NIST angeboten: -\begin{itemize} - \item CVE \\ - Hier lassen sich Informationen zu einer oder mehreren CVE's erhalten. - Durch das Vorhandensein von mehr als 240.000 Einträgen wird eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. - \item CVE Change History \\ - Hier lassen sich Informationen über Änderungen einer CVE oder einer Sammlung von CVE's erhalten. -\end{itemize} -Für das Projekt wurde die erste API genutzt, die unter \href{https://services.nvd.nist.gov/rest/json/cves/2.0}{https://services.nvd.nist.gov/rest/json/cves/2.0} verfügbar ist. \ No newline at end of file +Das \glqq National Institute of Standards and Technology\grqq~(NIST) bietet zwei CVE-API's an. +Diese sind die CVE-API und die CVE-Change-History-API. +\\ \\ +Die \textbf{CVE-API} nimmt Anfragen zu einer oder mehreren CVE-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. +Um nun aktuelle CVE-Daten abzurufen und zu Nutzen muss lediglich diese API in eigene Anwendungen oder Tools zu integriert werden. +Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte CVEs zu reagieren. +Durch das Vorhandensein von mehr als 240.000 Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. +\\ \\ +Die \textbf{CVE-Change-History-API} bietet einen historischen Überblick über Änderungen an CVE-Einträgen. +Durch diese können Änderungsverläufe und Aktualisierungen von CVE's besser nachvollzogen werden. +Aus den dadurch bereitgestellten Daten können Muster oder Trends bei Sicherheitsvorfällen identifiziert werden und entsprechende Vorkerungen seitens der Entwickler getroffen werden. +\\ \\ +Durch eine Nutzung dieser NIST-APIs können Entwickler und Sicherheitspersonal auf aktuelle CVE-Daten zugreifen. +Die Sicherheit ihrer Softwarelösungen kann verbessert und potenzielle Risiken minimiert werden. +Im Vergleich zu anderen noch vorzustellenden Lösungen muss hier eine Applikation angebunden werden, die die Daten grafisch aufbereitet, da diese nur in einem JSON-Format zurückgegeben werden. +Die Integration dieser Daten in Sicherheitstools und Plattformen trägt dazu bei, die Effektivität von Sicherheitsmaßnahmen in der Softwareentwicklung zu erhöhen und eine proaktive Sicherheitsstrategie zu fördern. + + + diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 83adcfc..4cdf836 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1,4 +1,11 @@ \section{Andere Arbeiten} \label{sec:Andere} -CVE-Daten werden bereits von verschiedenen Services genutzt um bei betroffenen Komponenten eine CVE-Nummer zu erhalten. +Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. +Eine Vielzahl von Arbeiten beschäftigt sich mit der Herausforderung, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. +Dabei reicht das Spektrum von manuellen Ansätzen bis hin zu automatisierten Tools und Plattformen, die Entwicklern dabei helfen, die Qualität und Sicherheit ihrer Software zu verbessern. +In diesem Artikel werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden, sowie deren Ansätze und Funktionen analysiert. +Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen besser einzuschätzen. \input{4_other_work/nist.tex} -\input{4_other_work/dependa.tex} \ No newline at end of file +\input{4_other_work/dependa.tex} +\input{4_other_work/snyk.tex} +\input{4_other_work/owasp.tex} +\input{4_other_work/whitesource.tex} \ No newline at end of file diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex new file mode 100644 index 0000000..0f79a66 --- /dev/null +++ b/documentation/latex/4_other_work/owasp.tex @@ -0,0 +1,2 @@ +\subsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} +https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex new file mode 100644 index 0000000..426010f --- /dev/null +++ b/documentation/latex/4_other_work/snyk.tex @@ -0,0 +1,2 @@ +\subsection{Snyk} \label{sec:Snyk} +https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/4_other_work/whitesource.tex b/documentation/latex/4_other_work/whitesource.tex new file mode 100644 index 0000000..8969456 --- /dev/null +++ b/documentation/latex/4_other_work/whitesource.tex @@ -0,0 +1,2 @@ +\subsection{Mend.io} \label{sec:Mend-io} +https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 6656d08..8c3beaf 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -1 +1,2 @@ -\section{} \label{sec:} +\section{Konzept} \label{sec:Konzept} +Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, mit welcher \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 14065fe..3d9f560 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -7,7 +7,19 @@ @book{Buch:Demo year = "2023", isbn = "000-0-00000-000-0" } -%https://www.redhat.com/de/topics/security/what-is-cve -%https://www.cve.org/ProgramOrganization/CNAs +% Definition CVE +% https://www.redhat.com/de/topics/security/what-is-cve +% https://www.cve.org/ProgramOrganization/CNAs + +% Def Abhängigkeit +% https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de +% https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + +% Def API +% https://aws.amazon.com/what-is/api/ + +% Def JSON +% https://www.json.org/json-en.html + % https://nvd.nist.gov/developers/vulnerabilities % https://github.com/dependabot \ No newline at end of file From 094893ee4583c3f8412a1934ccdf92d8b8e04e6a Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 17 Mar 2024 17:01:32 +0100 Subject: [PATCH 06/60] added other work 1-4 --- documentation/latex/3_definitions/definitions.tex | 3 +++ documentation/latex/4_other_work/dependa.tex | 9 +++++++++ documentation/latex/4_other_work/mend.tex | 2 ++ documentation/latex/4_other_work/other_work.tex | 7 +++---- documentation/latex/4_other_work/owasp.tex | 5 ++++- documentation/latex/4_other_work/snyk.tex | 11 ++++++++++- documentation/latex/4_other_work/whitesource.tex | 2 -- documentation/latex/lib/bib.bib | 11 ++++++++++- 8 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 documentation/latex/4_other_work/mend.tex delete mode 100644 documentation/latex/4_other_work/whitesource.tex diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 77e2ea5..6f9bef2 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -36,4 +36,7 @@ \section{Definitionen} \label{sec:Definitionen} JSON wird häufig für die Übertragung von Daten zwischen Client und Server. Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ählnich der von C, C++ oder C\#. + \item \textbf{Container:} \\ + \item \textbf{Kubernetes:} \\ + \item \textbf{CI/CD:} \\ \end{itemize} \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index df6924e..08d5bce 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1 +1,10 @@ \subsection{Github Dependa Bot} \label{sec:Dependa} +Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängigkeiten. +Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. +\\ \\ +Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genuttzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. +Dabei wird zwischen Versions- und Sicherheitsaktualisierungen von Abhängigkeiten unterschieden. +Versionsaktualisierungen halten Abhängigkeiten up-to-date während Sicherheitsaktualisierungen betroffene Abhängigkeiten auf eine Version heben, welche die Schwachstellen nicht mehr aufweisen. +Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projkten oder \textit{requirements.txt} in Python-Projekten vorgenommen. +\\ \\ +Dadurch trägt der Dependa-Bot zur Wartbarkeit und Sicherheit eines Projektes bei und nimmt Entwicklern ab, Abhängigkeiten vollständig selbst verwalten zu müssen. \ No newline at end of file diff --git a/documentation/latex/4_other_work/mend.tex b/documentation/latex/4_other_work/mend.tex new file mode 100644 index 0000000..9e4443e --- /dev/null +++ b/documentation/latex/4_other_work/mend.tex @@ -0,0 +1,2 @@ +\subsection{Mend.io} \label{sec:Mend-io} +Mend.io ist eine Plattform, durch welche \ No newline at end of file diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 4cdf836..79eb5e7 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1,11 +1,10 @@ \section{Andere Arbeiten} \label{sec:Andere} Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. -Eine Vielzahl von Arbeiten beschäftigt sich mit der Herausforderung, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. -Dabei reicht das Spektrum von manuellen Ansätzen bis hin zu automatisierten Tools und Plattformen, die Entwicklern dabei helfen, die Qualität und Sicherheit ihrer Software zu verbessern. -In diesem Artikel werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden, sowie deren Ansätze und Funktionen analysiert. +Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. +Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen besser einzuschätzen. \input{4_other_work/nist.tex} \input{4_other_work/dependa.tex} \input{4_other_work/snyk.tex} \input{4_other_work/owasp.tex} -\input{4_other_work/whitesource.tex} \ No newline at end of file +\input{4_other_work/mend.tex} \ No newline at end of file diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index 0f79a66..8608d06 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,2 +1,5 @@ \subsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} -https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file +Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen untersucht. +Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger CVE-Nummer erstellt. +\\ \\ +Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die Schwachstelle selbst, sondern auch Maßnahmen zum schließen dieser. \ No newline at end of file diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index 426010f..2b65d99 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -1,2 +1,11 @@ \subsection{Snyk} \label{sec:Snyk} -https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file +Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. +Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. +\\ \\ +Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. +\glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. +\glqq Synk Container\grqq~erkennt Schwachstellen in Container-Images sowie Kubernetesanwendungen. +\glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. +\\ \\ +Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesammten Deployment-Kette auf Schwachstellen geachtet. +Lösungen bzw. Alternativen werden angeboten und zusätztlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. \ No newline at end of file diff --git a/documentation/latex/4_other_work/whitesource.tex b/documentation/latex/4_other_work/whitesource.tex deleted file mode 100644 index 8969456..0000000 --- a/documentation/latex/4_other_work/whitesource.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsection{Mend.io} \label{sec:Mend-io} -https://docs.github.com/en/code-security/getting-started/github-security-features \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 3d9f560..f9c35f8 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -21,5 +21,14 @@ @book{Buch:Demo % Def JSON % https://www.json.org/json-en.html +% NIST % https://nvd.nist.gov/developers/vulnerabilities -% https://github.com/dependabot \ No newline at end of file + +% Dependa-Bot +% https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide + +% Synk +% https://docs.snyk.io/getting-started + +% OWASP Dependency-Check +% https://owasp.org/www-project-dependency-check/ \ No newline at end of file From c80b5c49d447c42ccf5feeb69cee3f56a4b80844 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 17 Mar 2024 22:07:08 +0100 Subject: [PATCH 07/60] added concept v1 --- documentation/latex/4_other_work/mend.tex | 2 -- .../latex/4_other_work/other_work.tex | 3 +- documentation/latex/5_concept/concept.tex | 30 ++++++++++++++++++- documentation/latex/lib/bib.bib | 5 ++++ 4 files changed, 35 insertions(+), 5 deletions(-) delete mode 100644 documentation/latex/4_other_work/mend.tex diff --git a/documentation/latex/4_other_work/mend.tex b/documentation/latex/4_other_work/mend.tex deleted file mode 100644 index 9e4443e..0000000 --- a/documentation/latex/4_other_work/mend.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsection{Mend.io} \label{sec:Mend-io} -Mend.io ist eine Plattform, durch welche \ No newline at end of file diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 79eb5e7..8a80b13 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -6,5 +6,4 @@ \section{Andere Arbeiten} \label{sec:Andere} \input{4_other_work/nist.tex} \input{4_other_work/dependa.tex} \input{4_other_work/snyk.tex} -\input{4_other_work/owasp.tex} -\input{4_other_work/mend.tex} \ No newline at end of file +\input{4_other_work/owasp.tex} \ No newline at end of file diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 8c3beaf..876e1f7 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -1,2 +1,30 @@ \section{Konzept} \label{sec:Konzept} -Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, mit welcher \ No newline at end of file +Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. +Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. +Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. +Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. +\\ \\ +Folgende Forschungsfragen werden dabei betrachtet: +\begin{enumerate} + \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} + \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen besser weiterzuverwenden?} \label{two} + \item \textbf{Wie ist eine Schwachstellenanalyse-API in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} + \item \textbf{Wie kann eine solche API leistungsstärker und laufzeiteffizienter werden?} \label{four} +\end{enumerate} +Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. +Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. +Die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. +Je nach Größe der zu suchenden Menge an Abhängigkeiten müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. +Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. +\\ \\ +Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. +Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. +\\ \\ +Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. +Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie eine Swagger zur Nutzung und Dokumentation der Endpunkte eingesetzt. +Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne des zu Untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. +Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. +\\ \\ +Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. +Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. +Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index f9c35f8..8dfcbd9 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -7,6 +7,11 @@ @book{Buch:Demo year = "2023", isbn = "000-0-00000-000-0" } +% @online{link:, +% title = "", +% urldate = "2022-xx-xx", +% url = "", +% } % Definition CVE % https://www.redhat.com/de/topics/security/what-is-cve % https://www.cve.org/ProgramOrganization/CNAs From c3ef09dca02ccefaf2c8acdfbc6fea6cad1fa3fa Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Mon, 18 Mar 2024 22:15:41 +0100 Subject: [PATCH 08/60] typos and first corrections --- documentation/latex/1_abstract/abstract.tex | 4 ++-- documentation/latex/2_motivation/motivation.tex | 8 ++++---- documentation/latex/3_definitions/definitions.tex | 7 +++---- documentation/latex/4_other_work/dependa.tex | 4 ++-- documentation/latex/4_other_work/nist.tex | 4 ++-- documentation/latex/4_other_work/other_work.tex | 2 +- documentation/latex/4_other_work/owasp.tex | 4 ++-- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 01eab94..43b5691 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -1,9 +1,9 @@ \section{Abstract} \label{sec:abstract} Das Entwickeln von Softwarelösungen ohne Bibliotheken, Frameworks oder externe Module ist heutzutage nicht mehr denkbar. -Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein wunder Punkt der Softwareentwicklung. +Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein sensibler Punkt der Softwareentwicklung. Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. \\ Diese Arbeit stellt die Entwicklung einer API vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. -Ziel einer soclehn Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file +Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index a42ccb8..ca94157 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -1,6 +1,6 @@ \section{Motivation} \label{subsec:Motivation} Beim Entwickeln von Softwarelösungen gibt es viele Herausforderungen und Probleme. - Diese werden durch viele bereits vorhandene Softwarepakete, wie etwa Bibliotheken oderFrameworks, bewältigt. + Diese werden durch viele bereits vorhandene Softwarepakete, wie etwa Bibliotheken oder Frameworks, bewältigt. Die Nutzung frei verfügbarer Softwarepakete ist deshalb im Arbeitsalltag gang und gäbe. Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der Pakete (a) an Bedeutung verlieren lässt bzw. (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. @@ -8,11 +8,11 @@ \section{Motivation} \label{subsec:Motivation} Neben der Funktionalität besteht ein anderer essentieller Aspekt in der Sicherheit. Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. - Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. + Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv -- schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. \\ \\ Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. - Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt der Nutzer. - Somit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. + Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. + Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. \\ \\ Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 6f9bef2..4e0f334 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -12,8 +12,7 @@ \section{Definitionen} \label{sec:Definitionen} \item \textbf{Direkte Abhängigkeiten:} \\ In der Softwareentwicklung ist eine Abhängigkeit ein Softwarepaket, welches von der Anwendung selbst benötigt wird, um korrekt zu funktionieren. - Diese Abhängigkeiten können direkt oder indirekt sein. - Indirekte Abhängigkeiten sind solche, die durch andere Abhängigkeiten eingeführt werden. + Damit sind direkte Abhängigkeiten nicht wie indirekte durch andere Abhängigkeiten eingeführt, sondern direkt eingebunden. Direkte Abhängigkeiten sind typischerweise externe Softwarekomponenten oder Bibliotheken. Diese werden auch als Paket bezeichnet. @@ -32,9 +31,9 @@ \section{Definitionen} \label{sec:Definitionen} \item \textbf{JSON (JavaScript Object Notation):} \\ JSON ist ein in der Webentwicklung verbreitetes Datenformat. Genutzt wird dieses um strukturierte Daten zu speichern und auszutauschen. - Basierend auf einer einfachen Syntax, die auf Schlüssel-Wert-Paaren und verschachtelten Datenstrukturen basiert ermöglicht es für Mensch sowie Maschine eine gute Les- und Parsbarkeit. + Basierend auf einer einfachen Syntax, die auf Schlüssel-Wert-Paaren und verschachtelten Datenstrukturen basiert, ermöglicht dieses Format für Mensch sowie Maschine eine gute Les- und Parsbarkeit. JSON wird häufig für die Übertragung von Daten zwischen Client und Server. - Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ählnich der von C, C++ oder C\#. + Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ähnlich der von C, C++ oder C\#. \item \textbf{Container:} \\ \item \textbf{Kubernetes:} \\ diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index 08d5bce..e2e21a5 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,8 +1,8 @@ \subsection{Github Dependa Bot} \label{sec:Dependa} -Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängigkeiten. +Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. \\ \\ -Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genuttzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. +Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. Dabei wird zwischen Versions- und Sicherheitsaktualisierungen von Abhängigkeiten unterschieden. Versionsaktualisierungen halten Abhängigkeiten up-to-date während Sicherheitsaktualisierungen betroffene Abhängigkeiten auf eine Version heben, welche die Schwachstellen nicht mehr aufweisen. Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projkten oder \textit{requirements.txt} in Python-Projekten vorgenommen. diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index 18992f4..6b808cb 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -2,10 +2,10 @@ \subsection{NIST-API} \label{sec:NIST-API} Das \glqq National Institute of Standards and Technology\grqq~(NIST) bietet zwei CVE-API's an. Diese sind die CVE-API und die CVE-Change-History-API. \\ \\ -Die \textbf{CVE-API} nimmt Anfragen zu einer oder mehreren CVE-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. +Die \textbf{CVE-API} nimmt Anfragen zu einer oder mehreren<-?????? CVE-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. Um nun aktuelle CVE-Daten abzurufen und zu Nutzen muss lediglich diese API in eigene Anwendungen oder Tools zu integriert werden. Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte CVEs zu reagieren. -Durch das Vorhandensein von mehr als 240.000 Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. +Durch das Vorhandensein von mehr als 240.000<-?????? Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. \\ \\ Die \textbf{CVE-Change-History-API} bietet einen historischen Überblick über Änderungen an CVE-Einträgen. Durch diese können Änderungsverläufe und Aktualisierungen von CVE's besser nachvollzogen werden. diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 8a80b13..335d264 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -2,7 +2,7 @@ \section{Andere Arbeiten} \label{sec:Andere} Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. -Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen besser einzuschätzen. +Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen, besser einzuschätzen. \input{4_other_work/nist.tex} \input{4_other_work/dependa.tex} \input{4_other_work/snyk.tex} diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index 8608d06..f5047ca 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,5 +1,5 @@ \subsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} -Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen untersucht. +Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger CVE-Nummer erstellt. \\ \\ -Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die Schwachstelle selbst, sondern auch Maßnahmen zum schließen dieser. \ No newline at end of file +Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file From fbc62552011162c469d28003277468a88681bb01 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Tue, 19 Mar 2024 22:32:56 +0100 Subject: [PATCH 09/60] added subsections for concept --- .../latex/5_concept/architecture.tex | 16 ++++++++++ documentation/latex/5_concept/concept.tex | 31 ++++--------------- documentation/latex/5_concept/features.tex | 2 ++ documentation/latex/5_concept/questions.tex | 25 +++++++++++++++ documentation/latex/5_concept/results.tex | 2 ++ documentation/latex/5_concept/risks.tex | 2 ++ .../latex/5_concept/special_attr.tex | 2 ++ 7 files changed, 55 insertions(+), 25 deletions(-) create mode 100644 documentation/latex/5_concept/architecture.tex create mode 100644 documentation/latex/5_concept/features.tex create mode 100644 documentation/latex/5_concept/questions.tex create mode 100644 documentation/latex/5_concept/results.tex create mode 100644 documentation/latex/5_concept/risks.tex create mode 100644 documentation/latex/5_concept/special_attr.tex diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex new file mode 100644 index 0000000..89a2339 --- /dev/null +++ b/documentation/latex/5_concept/architecture.tex @@ -0,0 +1,16 @@ +\subsection{Architektur} \label{sec:Architektur} +Um eine API umzusetzen sind verschiedene Komponenten nötig: +\begin{enumerate} + \item \textbf{Datenbank} \\ + In der Datenbank sind alle CVE-Daten, die zu Durchsuchen sind zu persistieren. + Diese Daten dienen als Grundlage der Durchsuchung von Projekten und Paketen nach Schachstellen. + Wichtig sind hier schnelle Lesezugriffe, da diese beim Durchsuchen der Datenbank die größte Laufzeiteinsparung bringen. + \item \textbf{Controller} \\ + Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. + Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. + \item \textbf{Datenmodelle} \\ + Um Daten korrekt in die Datenbank füllen sowie beim herstellen des Resultat-Json's werden Datenmodelle genutzt. + \item \textbf{Konvertierung von und in JSON} \\ + Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. + Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich noch als JSON dem Benutzer übermittelt werden. +\end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 876e1f7..9464505 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -3,28 +3,9 @@ \section{Konzept} \label{sec:Konzept} Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. -\\ \\ -Folgende Forschungsfragen werden dabei betrachtet: -\begin{enumerate} - \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} - \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen besser weiterzuverwenden?} \label{two} - \item \textbf{Wie ist eine Schwachstellenanalyse-API in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} - \item \textbf{Wie kann eine solche API leistungsstärker und laufzeiteffizienter werden?} \label{four} -\end{enumerate} -Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. -Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. -Die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. -Je nach Größe der zu suchenden Menge an Abhängigkeiten müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. -Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. -\\ \\ -Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. -Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. -\\ \\ -Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. -Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie eine Swagger zur Nutzung und Dokumentation der Endpunkte eingesetzt. -Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne des zu Untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. -Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. -\\ \\ -Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. -Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. -Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file +\input{5_concept/questions.tex} +\input{5_concept/architecture.tex} +\input{5_concept/features.tex} +\input{5_concept/special_attr.tex} +\input{5_concept/results.tex} +\input{5_concept/risks.tex} \ No newline at end of file diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex new file mode 100644 index 0000000..c2ef491 --- /dev/null +++ b/documentation/latex/5_concept/features.tex @@ -0,0 +1,2 @@ +\subsection{Funktionalitäten} \label{sec:Funktionalitäten} +Funktionalitäten \ No newline at end of file diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex new file mode 100644 index 0000000..ba51143 --- /dev/null +++ b/documentation/latex/5_concept/questions.tex @@ -0,0 +1,25 @@ +\subsection{Forschungsfragen} \label{sec:Forschungsfragen} +Folgende Forschungsfragen werden in dieser Arbeit betrachtet: +\begin{enumerate} + \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} + \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen besser weiterzuverwenden?} \label{two} + \item \textbf{Wie ist eine Schwachstellenanalyse-API in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} + \item \textbf{Wie kann eine solche API leistungsstärker und laufzeiteffizienter werden?} \label{four} +\end{enumerate} +Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. +Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. +Zusätzlich auch die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. +Je nachdem, ob eine Menge an Abhängigkeiten oder ein ganzes Repositoriy durchsucht werden muss müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. +Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. +\\ \\ +Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. +Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. +\\ \\ +Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. +Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das Endpunktdokumentations- und Testmöglichkeitstool. +Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. +Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. +\\ \\ +Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. +Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. +Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex new file mode 100644 index 0000000..3b559f4 --- /dev/null +++ b/documentation/latex/5_concept/results.tex @@ -0,0 +1,2 @@ +\subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} +Erwartete Ergebnisse \ No newline at end of file diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex new file mode 100644 index 0000000..6c7a647 --- /dev/null +++ b/documentation/latex/5_concept/risks.tex @@ -0,0 +1,2 @@ +\subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderungen} +Risiken und Herausforderungen \ No newline at end of file diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex new file mode 100644 index 0000000..7911be8 --- /dev/null +++ b/documentation/latex/5_concept/special_attr.tex @@ -0,0 +1,2 @@ +\subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} +Besondere Merkmale \ No newline at end of file From 47f92252c5f5fb7a569a0e788b4c34038a1eb890 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Wed, 20 Mar 2024 16:49:36 +0100 Subject: [PATCH 10/60] added to concept --- documentation/latex/5_concept/features.tex | 8 +++++++- documentation/latex/5_concept/risks.tex | 9 ++++++++- documentation/latex/5_concept/special_attr.tex | 6 +++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex index c2ef491..b12808b 100644 --- a/documentation/latex/5_concept/features.tex +++ b/documentation/latex/5_concept/features.tex @@ -1,2 +1,8 @@ \subsection{Funktionalitäten} \label{sec:Funktionalitäten} -Funktionalitäten \ No newline at end of file +Folgende Features werden durch die API-Endpunkte bereitgestellt: +\begin{itemize} + \item Bei Angabe einer Paketbezeichnung erhalte ich die Information ob dieses Sicherheitslücken hat und welche diese sind. + \item Bei Angabe einer Liste von Paketbezeichnungen erhalte ich eine Liste solcher Informationen zu allen Paketen. + \item Bei Angabe eines Git-Repositories wird dieses auf Abhängigkeiten und deren Schachstellen analysiert. + Ich erhalte für jedes, in diesem Repository eingebunenes, schwachstellenbehaftete Paket einen Abhängigkeitsbaum. +\end{itemize} \ No newline at end of file diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex index 6c7a647..077bfea 100644 --- a/documentation/latex/5_concept/risks.tex +++ b/documentation/latex/5_concept/risks.tex @@ -1,2 +1,9 @@ \subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderungen} -Risiken und Herausforderungen \ No newline at end of file +Risiken: +\begin{itemize} + \item Der CVE-Daten Provider stellt den Service ein +\end{itemize} +Herausforderungen: +\begin{itemize} + \item CVE-JSON-Daten für Datenbankabspeicherung umwandeln +\end{itemize} \ No newline at end of file diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index 7911be8..d8c0595 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -1,2 +1,6 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} -Besondere Merkmale \ No newline at end of file +Durch die große Menge an CVE-Daten, die als Schachstellen-Suchbasis dient, können diese nicht vor jeder Anfrage erneut abgerufen werden. +Somit ist es notwendig diese abzuspeichern und ggf. nur zu aktualisieren. +\\ \\ +Da das Rückgabeformat der API JSON ist und bei Analyse eines ganzen Repositories hier Abhängigkeitsbäume aufgezeigt werden ist die Rückgabe dann teils schlecht händisch zu durchsuchen. +Deshalb ist es empfohlen ein Frontendservice an den entsprechenden Endpunkt anzuknüpfen. \ No newline at end of file From f8870004f52815f713713b6a2e5b4d67566cd0f1 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Thu, 21 Mar 2024 18:20:25 +0100 Subject: [PATCH 11/60] added to concept --- documentation/latex/5_concept/features.tex | 16 +++++++++------- documentation/latex/5_concept/results.tex | 12 +++++++++++- documentation/latex/5_concept/risks.tex | 9 +++++++-- documentation/latex/5_concept/special_attr.tex | 11 +++++++---- .../latex/6_implementation/experiments.tex | 2 ++ .../latex/6_implementation/implementation.tex | 11 ++++++++++- .../latex/7_verification/verification.tex | 2 +- documentation/latex/8_discussion/discussion.tex | 2 +- documentation/latex/9_summary/summary.tex | 2 +- 9 files changed, 49 insertions(+), 18 deletions(-) create mode 100644 documentation/latex/6_implementation/experiments.tex diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex index b12808b..057310c 100644 --- a/documentation/latex/5_concept/features.tex +++ b/documentation/latex/5_concept/features.tex @@ -1,8 +1,10 @@ \subsection{Funktionalitäten} \label{sec:Funktionalitäten} -Folgende Features werden durch die API-Endpunkte bereitgestellt: -\begin{itemize} - \item Bei Angabe einer Paketbezeichnung erhalte ich die Information ob dieses Sicherheitslücken hat und welche diese sind. - \item Bei Angabe einer Liste von Paketbezeichnungen erhalte ich eine Liste solcher Informationen zu allen Paketen. - \item Bei Angabe eines Git-Repositories wird dieses auf Abhängigkeiten und deren Schachstellen analysiert. - Ich erhalte für jedes, in diesem Repository eingebunenes, schwachstellenbehaftete Paket einen Abhängigkeitsbaum. -\end{itemize} \ No newline at end of file +Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. +\begin{enumerate} + \item Einladen und Konvertieren der Schachstellendaten und persistente Speicherung dieser in einer internen Datenbank. + \item Überprüfung von Abhängigkeiten auf Sicherheitslücken mittels Abgleich zu einer internen Schachstellendatenbank. + \item Clonen eines Repositories von Github. + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zu einer internen Schachstellendatenbank. + \item Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. +\end{enumerate} +Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. \ No newline at end of file diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index 3b559f4..6a0f565 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -1,2 +1,12 @@ \subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} -Erwartete Ergebnisse \ No newline at end of file +Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: +\begin{enumerate} + \item \textbf{Entwicklung einer funktionsfähigen API} \\ + Diese soll performant und möglichst schmal in einem Containercontext nutzbar sein und alle, von den Features, notwenigen Endpunkte beinhalten. + \item \textbf{Analyse auf Sicherheitslücken} \\ + Die entstehende API soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. + \item \textbf{Darstellung der schachstellenbefallenen Abhängigkeiten als Baum} \\ + Bei Analyse einer Abhängigkeit sollen alle Abhängigkeiten dieser selbst aufgezeigt werden. + \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ + Die entstehende API soll dem Nutzer letztendlich dabei helfen eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Softwarekomponente zu fällen. +\end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex index 077bfea..d70faec 100644 --- a/documentation/latex/5_concept/risks.tex +++ b/documentation/latex/5_concept/risks.tex @@ -1,9 +1,14 @@ \subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderungen} Risiken: \begin{itemize} - \item Der CVE-Daten Provider stellt den Service ein + \item Bei bestehender Schachstelle ist kein Eintrag in dern genutzten Daten vorhanden + \item Abhängigkeit vom CVE-Daten Provider + \item Sicherheitslücken in der API selbst \end{itemize} Herausforderungen: \begin{itemize} - \item CVE-JSON-Daten für Datenbankabspeicherung umwandeln + \item Extrahieren der Abhängigkeitsgraphen + \item Unterschiede zwischen Frameworks und Programmiersprachen + \item Schachstellendatenaktualität + \item Performance sowie Skalierbarkeit \end{itemize} \ No newline at end of file diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index d8c0595..3b37a0a 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -1,6 +1,9 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} -Durch die große Menge an CVE-Daten, die als Schachstellen-Suchbasis dient, können diese nicht vor jeder Anfrage erneut abgerufen werden. -Somit ist es notwendig diese abzuspeichern und ggf. nur zu aktualisieren. +Dadurchm dass diese API bei schachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstelle ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegenüber gegeben. +Somit können Aufwand bei Ersatz oder Anpassung an dieser besser eingeschätzt und die Entscheidung der Dringlichkeit dieser Arbeiten besser gefällt werden. \\ \\ -Da das Rückgabeformat der API JSON ist und bei Analyse eines ganzen Repositories hier Abhängigkeitsbäume aufgezeigt werden ist die Rückgabe dann teils schlecht händisch zu durchsuchen. -Deshalb ist es empfohlen ein Frontendservice an den entsprechenden Endpunkt anzuknüpfen. \ No newline at end of file +Durch die große Menge an CVE-Daten, die als Schwachstellen-Suchbasis dient, und dadurch, dass diese Datenbasis immer nur erweitert wird ist der der API ermöglicht nur die aktuell neuesten Änderungen herunterzuladen und einzupflegen. +Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis ernuet herunterzuladen. +\\ \\ +Durch die lokal vorliegende Datenbasis ist das Suchen auf dieser deutlich schneller als diese Daten immer erneut anzufragen. +Somit kann mit einer niedrigeren Laufzeit in z.B. CI/CD intergrationen dieser gerechnet werden als andere Tools. \ No newline at end of file diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex new file mode 100644 index 0000000..4742b1d --- /dev/null +++ b/documentation/latex/6_implementation/experiments.tex @@ -0,0 +1,2 @@ +\subsection{Experimente} \label{sec:Experimente} +Experimente \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index 6656d08..57011c9 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -1 +1,10 @@ -\section{} \label{sec:} +\section{Implementation} \label{sec:Implementation} +Vor der Implementation ist die Entscheidung der Auswahl der Einzelkomponenten, welche im Abschnitt \ref{Architektur} vorgestellt wurden, zu treffen. +\\ \\ +Zuerst ist die Programmiersprache sowie das genutzte Framework zu definieren. +Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. +Mit diesem lassen sich unter anderem API-Services bauen. +ASP.NET hat mit Visual Studio auch direkt eine Entwicklungsumgebung sowie Debugging Möglichkeiten. +Weiterhin gibt es die Möglichkeit die eingebette NoSQL-Datenbak LiteDB zu nutzen. +Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. +\input{6_implementation/experiments.tex} \ No newline at end of file diff --git a/documentation/latex/7_verification/verification.tex b/documentation/latex/7_verification/verification.tex index 6656d08..0a158db 100644 --- a/documentation/latex/7_verification/verification.tex +++ b/documentation/latex/7_verification/verification.tex @@ -1 +1 @@ -\section{} \label{sec:} +\section{Verifikation} \label{sec:Verifikation} diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/8_discussion/discussion.tex index 6656d08..d368824 100644 --- a/documentation/latex/8_discussion/discussion.tex +++ b/documentation/latex/8_discussion/discussion.tex @@ -1 +1 @@ -\section{} \label{sec:} +\section{Diskussion} \label{sec:Diskussion} diff --git a/documentation/latex/9_summary/summary.tex b/documentation/latex/9_summary/summary.tex index 6656d08..c9b28eb 100644 --- a/documentation/latex/9_summary/summary.tex +++ b/documentation/latex/9_summary/summary.tex @@ -1 +1 @@ -\section{} \label{sec:} +\section{Zusammenfassung} \label{sec:Zusammenfassung} From 0308a230d8bbd07e160cf06497578e80a2c61917 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Tue, 26 Mar 2024 23:00:57 +0100 Subject: [PATCH 12/60] questions --- documentation/latex/3_definitions/definitions.tex | 1 - documentation/latex/6_implementation/db_exp.tex | 12 ++++++++++++ documentation/latex/6_implementation/experiments.tex | 2 +- .../latex/6_implementation/implementation.tex | 2 ++ 4 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 documentation/latex/6_implementation/db_exp.tex diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 4e0f334..6b4d7d0 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1,7 +1,6 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} \item \textbf{CVE (Common Vulnerabilities and Exposures):} \\ - Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. \\ diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex new file mode 100644 index 0000000..0994660 --- /dev/null +++ b/documentation/latex/6_implementation/db_exp.tex @@ -0,0 +1,12 @@ +\subsubsection{Datenbank} \label{sec:Experimente} +Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. +Aus der Gegebenen Einbindung einer NoSQL Datenbanklösung in ASP.NET, LiteDB, wurde diese auch zuerst als Datenspeicher gewählt. +\\ +--> reicht diese Begründung für die Entscheidung? \\ + +Wieso Entscheidung auf Änderung? \\ + +Vergleich Messwerte (Am besten Messreihen) in Tabelle auf welchen Datenmengen? \\ + +--> Entscheidung auf welche DB am Ende, weil? \\ +--> Einsparung von was am Ende? \\ \ No newline at end of file diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index 4742b1d..d6861b5 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,2 +1,2 @@ \subsection{Experimente} \label{sec:Experimente} -Experimente \ No newline at end of file +\input{6_implementation/db_exp.tex} \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index 57011c9..2f1feda 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -7,4 +7,6 @@ \section{Implementation} \label{sec:Implementation} ASP.NET hat mit Visual Studio auch direkt eine Entwicklungsumgebung sowie Debugging Möglichkeiten. Weiterhin gibt es die Möglichkeit die eingebette NoSQL-Datenbak LiteDB zu nutzen. Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. +\\ \\ +Es wurden weiterhin verschiedene Experimente vorgenommen um Teile der Architektur und deren Implementation durch verschiedene Softwarekomponenten zu Vergleichen. \input{6_implementation/experiments.tex} \ No newline at end of file From 59a8d5b8457ab30fac4e17a8b756c67d5b981ef6 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 31 Mar 2024 18:25:48 +0200 Subject: [PATCH 13/60] Create mysql-measure.md --- documentation/fragments/mysql-measure.md | 826 +++++++++++++++++++++++ 1 file changed, 826 insertions(+) create mode 100644 documentation/fragments/mysql-measure.md diff --git a/documentation/fragments/mysql-measure.md b/documentation/fragments/mysql-measure.md new file mode 100644 index 0000000..a2690fb --- /dev/null +++ b/documentation/fragments/mysql-measure.md @@ -0,0 +1,826 @@ +# MySQL Messungen +- [Mit Index](#mit-index) + - [1 von 10](#1-von-10) + - [2 von 10](#2-von-10) + - [3 von 10](#3-von-10) + - [4 von 10](#4-von-10) + - [5 von 10](#5-von-10) + - [6 von 10](#6-von-10) + - [7 von 10](#7-von-10) + - [8 von 10](#8-von-10) + - [9 von 10](#9-von-10) + - [10 von 10](#10-von-10) +- [Ohne Index](#ohne-index) + - [1 von 10](#1-von-10-1) + - [2 von 10](#2-von-10-1) + - [3 von 10](#3-von-10-1) + - [4 von 10](#4-von-10-1) + - [5 von 10](#5-von-10-1) + - [6 von 10](#6-von-10-1) + - [7 von 10](#7-von-10-1) + - [8 von 10](#8-von-10-1) + - [9 von 10](#9-von-10-1) + - [10 von 10](#10-von-10-1) + + +## Mit Index +### 1 von 10 +```log +2024-03-31 15:51:16.604 +00:00 [INF] Query-Time for Package "LiteDB" completed in 64.0 ms +2024-03-31 15:51:16.662 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 1.4 ms +2024-03-31 15:51:16.663 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.5 ms +2024-03-31 15:51:16.664 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.7 ms +2024-03-31 15:51:16.667 +00:00 [INF] Query-Time for Package "Atlassian" completed in 2.5 ms +2024-03-31 15:51:16.668 +00:00 [INF] Query-Time for Package "Debian" completed in 0.7 ms +2024-03-31 15:51:16.669 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.7 ms +2024-03-31 15:51:16.670 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.7 ms +2024-03-31 15:51:16.670 +00:00 [INF] Query-Time for Package "arc42" completed in 0.5 ms +2024-03-31 15:51:16.671 +00:00 [INF] Query-Time for Package "cookie" completed in 0.7 ms +2024-03-31 15:51:16.672 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.8 ms +2024-03-31 15:51:16.672 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.5 ms +2024-03-31 15:51:16.673 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.5 ms +2024-03-31 15:51:16.674 +00:00 [INF] Query-Time for Package "parser" completed in 0.7 ms +2024-03-31 15:51:16.675 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.6 ms +2024-03-31 15:51:16.680 +00:00 [INF] Query-Time for Package "php" completed in 5.6 ms +2024-03-31 15:51:16.693 +00:00 [INF] Query-Time for Package "PHP" completed in 1.5 ms +2024-03-31 15:51:16.700 +00:00 [INF] Query-Time for Package "Laravel" completed in 1.6 ms +2024-03-31 15:51:16.701 +00:00 [INF] Query-Time for Package "laravel" completed in 0.5 ms +2024-03-31 15:51:16.702 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.5 ms +2024-03-31 15:51:16.703 +00:00 [INF] Query-Time for Package "beta" completed in 0.7 ms +2024-03-31 15:51:16.704 +00:00 [INF] Query-Time for Package "meta" completed in 0.9 ms +2024-03-31 15:51:16.705 +00:00 [INF] Query-Time for Package "META" completed in 0.6 ms +2024-03-31 15:51:16.706 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.7 ms +2024-03-31 15:51:16.707 +00:00 [INF] Query-Time for Package "accepts" completed in 0.7 ms +2024-03-31 15:51:16.707 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.7 ms +2024-03-31 15:51:16.708 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.5 ms +2024-03-31 15:51:16.709 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.6 ms +2024-03-31 15:51:16.709 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.6 ms +2024-03-31 15:51:16.710 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.6 ms +2024-03-31 15:51:16.711 +00:00 [INF] Query-Time for Package "depd" completed in 0.6 ms +2024-03-31 15:51:16.711 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.6 ms +2024-03-31 15:51:16.712 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.6 ms +2024-03-31 15:51:16.713 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.6 ms +2024-03-31 15:51:16.714 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.7 ms +2024-03-31 15:51:16.714 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 181.8 ms +``` + +### 2 von 10 +```log +2024-03-31 15:52:47.286 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.9 ms +2024-03-31 15:52:47.287 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.5 ms +2024-03-31 15:52:47.287 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.4 ms +2024-03-31 15:52:47.288 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.6 ms +2024-03-31 15:52:47.290 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.5 ms +2024-03-31 15:52:47.290 +00:00 [INF] Query-Time for Package "Debian" completed in 0.4 ms +2024-03-31 15:52:47.291 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.4 ms +2024-03-31 15:52:47.291 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.5 ms +2024-03-31 15:52:47.292 +00:00 [INF] Query-Time for Package "arc42" completed in 0.4 ms +2024-03-31 15:52:47.292 +00:00 [INF] Query-Time for Package "cookie" completed in 0.4 ms +2024-03-31 15:52:47.293 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.4 ms +2024-03-31 15:52:47.293 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.4 ms +2024-03-31 15:52:47.294 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.4 ms +2024-03-31 15:52:47.294 +00:00 [INF] Query-Time for Package "parser" completed in 0.5 ms +2024-03-31 15:52:47.295 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.6 ms +2024-03-31 15:52:47.296 +00:00 [INF] Query-Time for Package "php" completed in 1.0 ms +2024-03-31 15:52:47.303 +00:00 [INF] Query-Time for Package "PHP" completed in 1.0 ms +2024-03-31 15:52:47.309 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.5 ms +2024-03-31 15:52:47.310 +00:00 [INF] Query-Time for Package "laravel" completed in 0.5 ms +2024-03-31 15:52:47.311 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.4 ms +2024-03-31 15:52:47.311 +00:00 [INF] Query-Time for Package "beta" completed in 0.5 ms +2024-03-31 15:52:47.312 +00:00 [INF] Query-Time for Package "meta" completed in 0.4 ms +2024-03-31 15:52:47.312 +00:00 [INF] Query-Time for Package "META" completed in 0.4 ms +2024-03-31 15:52:47.313 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.4 ms +2024-03-31 15:52:47.313 +00:00 [INF] Query-Time for Package "accepts" completed in 0.4 ms +2024-03-31 15:52:47.314 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.4 ms +2024-03-31 15:52:47.314 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.4 ms +2024-03-31 15:52:47.315 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.4 ms +2024-03-31 15:52:47.315 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.4 ms +2024-03-31 15:52:47.316 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.5 ms +2024-03-31 15:52:47.316 +00:00 [INF] Query-Time for Package "depd" completed in 0.4 ms +2024-03-31 15:52:47.317 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.4 ms +2024-03-31 15:52:47.317 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.4 ms +2024-03-31 15:52:47.318 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.4 ms +2024-03-31 15:52:47.318 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.4 ms +2024-03-31 15:52:47.318 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 33.5 ms +``` + +### 3 von 10 +```log +2024-03-31 15:56:58.682 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.8 ms +2024-03-31 15:56:58.683 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.5 ms +2024-03-31 15:56:58.684 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.5 ms +2024-03-31 15:56:58.684 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.6 ms +2024-03-31 15:56:58.686 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.9 ms +2024-03-31 15:56:58.687 +00:00 [INF] Query-Time for Package "Debian" completed in 0.5 ms +2024-03-31 15:56:58.688 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.4 ms +2024-03-31 15:56:58.688 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.5 ms +2024-03-31 15:56:58.689 +00:00 [INF] Query-Time for Package "arc42" completed in 0.5 ms +2024-03-31 15:56:58.690 +00:00 [INF] Query-Time for Package "cookie" completed in 0.9 ms +2024-03-31 15:56:58.691 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.7 ms +2024-03-31 15:56:58.692 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.8 ms +2024-03-31 15:56:58.693 +00:00 [INF] Query-Time for Package "mongodb" completed in 1.0 ms +2024-03-31 15:56:58.694 +00:00 [INF] Query-Time for Package "parser" completed in 1.0 ms +2024-03-31 15:56:58.695 +00:00 [INF] Query-Time for Package "LiteDb" completed in 1.0 ms +2024-03-31 15:56:58.697 +00:00 [INF] Query-Time for Package "php" completed in 1.2 ms +2024-03-31 15:56:58.705 +00:00 [INF] Query-Time for Package "PHP" completed in 1.5 ms +2024-03-31 15:56:58.714 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.8 ms +2024-03-31 15:56:58.715 +00:00 [INF] Query-Time for Package "laravel" completed in 0.5 ms +2024-03-31 15:56:58.716 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.5 ms +2024-03-31 15:56:58.717 +00:00 [INF] Query-Time for Package "beta" completed in 0.4 ms +2024-03-31 15:56:58.717 +00:00 [INF] Query-Time for Package "meta" completed in 0.4 ms +2024-03-31 15:56:58.718 +00:00 [INF] Query-Time for Package "META" completed in 0.4 ms +2024-03-31 15:56:58.718 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.4 ms +2024-03-31 15:56:58.719 +00:00 [INF] Query-Time for Package "accepts" completed in 0.4 ms +2024-03-31 15:56:58.719 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.4 ms +2024-03-31 15:56:58.720 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.4 ms +2024-03-31 15:56:58.721 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.5 ms +2024-03-31 15:56:58.721 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.4 ms +2024-03-31 15:56:58.722 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.5 ms +2024-03-31 15:56:58.722 +00:00 [INF] Query-Time for Package "depd" completed in 0.4 ms +2024-03-31 15:56:58.723 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.5 ms +2024-03-31 15:56:58.723 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.4 ms +2024-03-31 15:56:58.724 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.4 ms +2024-03-31 15:56:58.724 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.4 ms +2024-03-31 15:56:58.724 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 43.1 ms +``` + +### 4 von 10 +```log +2024-03-31 15:58:31.441 +00:00 [INF] Query-Time for Package "LiteDB" completed in 1.0 ms +2024-03-31 15:58:31.442 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.4 ms +2024-03-31 15:58:31.442 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.3 ms +2024-03-31 15:58:31.443 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.6 ms +2024-03-31 15:58:31.443 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.5 ms +2024-03-31 15:58:31.444 +00:00 [INF] Query-Time for Package "Debian" completed in 0.4 ms +2024-03-31 15:58:31.444 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.3 ms +2024-03-31 15:58:31.445 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.3 ms +2024-03-31 15:58:31.445 +00:00 [INF] Query-Time for Package "arc42" completed in 0.3 ms +2024-03-31 15:58:31.445 +00:00 [INF] Query-Time for Package "cookie" completed in 0.3 ms +2024-03-31 15:58:31.446 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.3 ms +2024-03-31 15:58:31.446 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.3 ms +2024-03-31 15:58:31.446 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.4 ms +2024-03-31 15:58:31.447 +00:00 [INF] Query-Time for Package "parser" completed in 0.3 ms +2024-03-31 15:58:31.447 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.4 ms +2024-03-31 15:58:31.448 +00:00 [INF] Query-Time for Package "php" completed in 0.9 ms +2024-03-31 15:58:31.450 +00:00 [INF] Query-Time for Package "PHP" completed in 0.8 ms +2024-03-31 15:58:31.452 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.4 ms +2024-03-31 15:58:31.452 +00:00 [INF] Query-Time for Package "laravel" completed in 0.4 ms +2024-03-31 15:58:31.452 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.4 ms +2024-03-31 15:58:31.453 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 15:58:31.453 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 15:58:31.454 +00:00 [INF] Query-Time for Package "META" completed in 0.3 ms +2024-03-31 15:58:31.454 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.3 ms +2024-03-31 15:58:31.454 +00:00 [INF] Query-Time for Package "accepts" completed in 0.3 ms +2024-03-31 15:58:31.455 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.3 ms +2024-03-31 15:58:31.455 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.3 ms +2024-03-31 15:58:31.455 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.3 ms +2024-03-31 15:58:31.456 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.3 ms +2024-03-31 15:58:31.456 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.2 ms +2024-03-31 15:58:31.456 +00:00 [INF] Query-Time for Package "depd" completed in 0.3 ms +2024-03-31 15:58:31.457 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.2 ms +2024-03-31 15:58:31.457 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.2 ms +2024-03-31 15:58:31.457 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.3 ms +2024-03-31 15:58:31.458 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms +2024-03-31 15:58:31.458 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 17.7 ms +``` + +### 5 von 10 +```log +2024-03-31 15:59:31.247 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.7 ms +2024-03-31 15:59:31.247 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.4 ms +2024-03-31 15:59:31.248 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.3 ms +2024-03-31 15:59:31.248 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.4 ms +2024-03-31 15:59:31.249 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.6 ms +2024-03-31 15:59:31.250 +00:00 [INF] Query-Time for Package "Debian" completed in 0.4 ms +2024-03-31 15:59:31.250 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.6 ms +2024-03-31 15:59:31.251 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.5 ms +2024-03-31 15:59:31.251 +00:00 [INF] Query-Time for Package "arc42" completed in 0.4 ms +2024-03-31 15:59:31.252 +00:00 [INF] Query-Time for Package "cookie" completed in 0.4 ms +2024-03-31 15:59:31.252 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.4 ms +2024-03-31 15:59:31.253 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.5 ms +2024-03-31 15:59:31.253 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.4 ms +2024-03-31 15:59:31.254 +00:00 [INF] Query-Time for Package "parser" completed in 0.4 ms +2024-03-31 15:59:31.254 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.4 ms +2024-03-31 15:59:31.255 +00:00 [INF] Query-Time for Package "php" completed in 0.7 ms +2024-03-31 15:59:31.257 +00:00 [INF] Query-Time for Package "PHP" completed in 0.8 ms +2024-03-31 15:59:31.258 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.4 ms +2024-03-31 15:59:31.259 +00:00 [INF] Query-Time for Package "laravel" completed in 0.4 ms +2024-03-31 15:59:31.259 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 15:59:31.259 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 15:59:31.260 +00:00 [INF] Query-Time for Package "meta" completed in 0.4 ms +2024-03-31 15:59:31.260 +00:00 [INF] Query-Time for Package "META" completed in 0.4 ms +2024-03-31 15:59:31.261 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.3 ms +2024-03-31 15:59:31.261 +00:00 [INF] Query-Time for Package "accepts" completed in 0.3 ms +2024-03-31 15:59:31.261 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.3 ms +2024-03-31 15:59:31.262 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.3 ms +2024-03-31 15:59:31.262 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.3 ms +2024-03-31 15:59:31.263 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.3 ms +2024-03-31 15:59:31.263 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.3 ms +2024-03-31 15:59:31.263 +00:00 [INF] Query-Time for Package "depd" completed in 0.4 ms +2024-03-31 15:59:31.264 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.3 ms +2024-03-31 15:59:31.264 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.3 ms +2024-03-31 15:59:31.264 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.3 ms +2024-03-31 15:59:31.265 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms +2024-03-31 15:59:31.265 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 18.8 ms +``` + +### 6 von 10 +```log +2024-03-31 16:01:13.650 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.7 ms +2024-03-31 16:01:13.651 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.4 ms +2024-03-31 16:01:13.652 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.5 ms +2024-03-31 16:01:13.652 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.5 ms +2024-03-31 16:01:13.653 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.4 ms +2024-03-31 16:01:13.653 +00:00 [INF] Query-Time for Package "Debian" completed in 0.3 ms +2024-03-31 16:01:13.653 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.4 ms +2024-03-31 16:01:13.654 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.3 ms +2024-03-31 16:01:13.655 +00:00 [INF] Query-Time for Package "arc42" completed in 0.6 ms +2024-03-31 16:01:13.655 +00:00 [INF] Query-Time for Package "cookie" completed in 0.6 ms +2024-03-31 16:01:13.656 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.4 ms +2024-03-31 16:01:13.656 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.4 ms +2024-03-31 16:01:13.657 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.4 ms +2024-03-31 16:01:13.657 +00:00 [INF] Query-Time for Package "parser" completed in 0.5 ms +2024-03-31 16:01:13.658 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.4 ms +2024-03-31 16:01:13.658 +00:00 [INF] Query-Time for Package "php" completed in 0.8 ms +2024-03-31 16:01:13.660 +00:00 [INF] Query-Time for Package "PHP" completed in 0.8 ms +2024-03-31 16:01:13.662 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.4 ms +2024-03-31 16:01:13.662 +00:00 [INF] Query-Time for Package "laravel" completed in 0.4 ms +2024-03-31 16:01:13.662 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 16:01:13.663 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 16:01:13.663 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 16:01:13.663 +00:00 [INF] Query-Time for Package "META" completed in 0.2 ms +2024-03-31 16:01:13.664 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.2 ms +2024-03-31 16:01:13.664 +00:00 [INF] Query-Time for Package "accepts" completed in 0.3 ms +2024-03-31 16:01:13.665 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.4 ms +2024-03-31 16:01:13.665 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.3 ms +2024-03-31 16:01:13.665 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.3 ms +2024-03-31 16:01:13.666 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.3 ms +2024-03-31 16:01:13.666 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.3 ms +2024-03-31 16:01:13.666 +00:00 [INF] Query-Time for Package "depd" completed in 0.2 ms +2024-03-31 16:01:13.666 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.3 ms +2024-03-31 16:01:13.667 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.3 ms +2024-03-31 16:01:13.667 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.2 ms +2024-03-31 16:01:13.668 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms +2024-03-31 16:01:13.668 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 17.9 ms +``` + +### 7 von 10 +```log +2024-03-31 16:03:51.640 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.6 ms +2024-03-31 16:03:51.641 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.4 ms +2024-03-31 16:03:51.641 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.5 ms +2024-03-31 16:03:51.642 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.7 ms +2024-03-31 16:03:51.643 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.7 ms +2024-03-31 16:03:51.645 +00:00 [INF] Query-Time for Package "Debian" completed in 1.0 ms +2024-03-31 16:03:51.645 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.6 ms +2024-03-31 16:03:51.646 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.4 ms +2024-03-31 16:03:51.646 +00:00 [INF] Query-Time for Package "arc42" completed in 0.3 ms +2024-03-31 16:03:51.647 +00:00 [INF] Query-Time for Package "cookie" completed in 0.4 ms +2024-03-31 16:03:51.647 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.3 ms +2024-03-31 16:03:51.648 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.5 ms +2024-03-31 16:03:51.648 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.5 ms +2024-03-31 16:03:51.649 +00:00 [INF] Query-Time for Package "parser" completed in 0.5 ms +2024-03-31 16:03:51.649 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.4 ms +2024-03-31 16:03:51.650 +00:00 [INF] Query-Time for Package "php" completed in 0.7 ms +2024-03-31 16:03:51.652 +00:00 [INF] Query-Time for Package "PHP" completed in 0.7 ms +2024-03-31 16:03:51.653 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.3 ms +2024-03-31 16:03:51.654 +00:00 [INF] Query-Time for Package "laravel" completed in 0.3 ms +2024-03-31 16:03:51.654 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 16:03:51.654 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 16:03:51.655 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 16:03:51.655 +00:00 [INF] Query-Time for Package "META" completed in 0.3 ms +2024-03-31 16:03:51.655 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.3 ms +2024-03-31 16:03:51.656 +00:00 [INF] Query-Time for Package "accepts" completed in 0.3 ms +2024-03-31 16:03:51.656 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.3 ms +2024-03-31 16:03:51.656 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.3 ms +2024-03-31 16:03:51.657 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.3 ms +2024-03-31 16:03:51.657 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.7 ms +2024-03-31 16:03:51.658 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.4 ms +2024-03-31 16:03:51.658 +00:00 [INF] Query-Time for Package "depd" completed in 0.3 ms +2024-03-31 16:03:51.659 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.3 ms +2024-03-31 16:03:51.659 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.3 ms +2024-03-31 16:03:51.659 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.3 ms +2024-03-31 16:03:51.660 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms +2024-03-31 16:03:51.660 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 20.1 ms +``` + +### 8 von 10 +```log +2024-03-31 16:04:25.573 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.5 ms +2024-03-31 16:04:25.573 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.3 ms +2024-03-31 16:04:25.573 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.3 ms +2024-03-31 16:04:25.574 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.4 ms +2024-03-31 16:04:25.574 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.3 ms +2024-03-31 16:04:25.575 +00:00 [INF] Query-Time for Package "Debian" completed in 0.3 ms +2024-03-31 16:04:25.575 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.2 ms +2024-03-31 16:04:25.575 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.2 ms +2024-03-31 16:04:25.576 +00:00 [INF] Query-Time for Package "arc42" completed in 0.2 ms +2024-03-31 16:04:25.576 +00:00 [INF] Query-Time for Package "cookie" completed in 0.2 ms +2024-03-31 16:04:25.576 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.2 ms +2024-03-31 16:04:25.576 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.2 ms +2024-03-31 16:04:25.577 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.4 ms +2024-03-31 16:04:25.577 +00:00 [INF] Query-Time for Package "parser" completed in 0.2 ms +2024-03-31 16:04:25.578 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.3 ms +2024-03-31 16:04:25.578 +00:00 [INF] Query-Time for Package "php" completed in 0.7 ms +2024-03-31 16:04:25.580 +00:00 [INF] Query-Time for Package "PHP" completed in 0.7 ms +2024-03-31 16:04:25.581 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.4 ms +2024-03-31 16:04:25.582 +00:00 [INF] Query-Time for Package "laravel" completed in 0.3 ms +2024-03-31 16:04:25.582 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 16:04:25.583 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 16:04:25.583 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 16:04:25.583 +00:00 [INF] Query-Time for Package "META" completed in 0.2 ms +2024-03-31 16:04:25.583 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.2 ms +2024-03-31 16:04:25.584 +00:00 [INF] Query-Time for Package "accepts" completed in 0.2 ms +2024-03-31 16:04:25.584 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.2 ms +2024-03-31 16:04:25.584 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.2 ms +2024-03-31 16:04:25.585 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.2 ms +2024-03-31 16:04:25.585 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.4 ms +2024-03-31 16:04:25.585 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.3 ms +2024-03-31 16:04:25.586 +00:00 [INF] Query-Time for Package "depd" completed in 0.3 ms +2024-03-31 16:04:25.586 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.3 ms +2024-03-31 16:04:25.586 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.3 ms +2024-03-31 16:04:25.587 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.2 ms +2024-03-31 16:04:25.587 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms +2024-03-31 16:04:25.587 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 15.1 ms +``` + +### 9 von 10 +```log +2024-03-31 16:05:19.085 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.8 ms +2024-03-31 16:05:19.085 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.5 ms +2024-03-31 16:05:19.086 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.3 ms +2024-03-31 16:05:19.086 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.4 ms +2024-03-31 16:05:19.087 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.4 ms +2024-03-31 16:05:19.087 +00:00 [INF] Query-Time for Package "Debian" completed in 0.5 ms +2024-03-31 16:05:19.088 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.6 ms +2024-03-31 16:05:19.089 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.7 ms +2024-03-31 16:05:19.090 +00:00 [INF] Query-Time for Package "arc42" completed in 0.7 ms +2024-03-31 16:05:19.090 +00:00 [INF] Query-Time for Package "cookie" completed in 0.7 ms +2024-03-31 16:05:19.091 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.5 ms +2024-03-31 16:05:19.092 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.6 ms +2024-03-31 16:05:19.092 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.5 ms +2024-03-31 16:05:19.093 +00:00 [INF] Query-Time for Package "parser" completed in 0.4 ms +2024-03-31 16:05:19.093 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.6 ms +2024-03-31 16:05:19.094 +00:00 [INF] Query-Time for Package "php" completed in 0.9 ms +2024-03-31 16:05:19.096 +00:00 [INF] Query-Time for Package "PHP" completed in 0.9 ms +2024-03-31 16:05:19.098 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.5 ms +2024-03-31 16:05:19.098 +00:00 [INF] Query-Time for Package "laravel" completed in 0.4 ms +2024-03-31 16:05:19.099 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 16:05:19.099 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 16:05:19.100 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 16:05:19.100 +00:00 [INF] Query-Time for Package "META" completed in 0.3 ms +2024-03-31 16:05:19.100 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.3 ms +2024-03-31 16:05:19.101 +00:00 [INF] Query-Time for Package "accepts" completed in 0.3 ms +2024-03-31 16:05:19.101 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.3 ms +2024-03-31 16:05:19.101 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.3 ms +2024-03-31 16:05:19.101 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.2 ms +2024-03-31 16:05:19.102 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.2 ms +2024-03-31 16:05:19.102 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.2 ms +2024-03-31 16:05:19.102 +00:00 [INF] Query-Time for Package "depd" completed in 0.2 ms +2024-03-31 16:05:19.103 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.2 ms +2024-03-31 16:05:19.103 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.2 ms +2024-03-31 16:05:19.103 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.2 ms +2024-03-31 16:05:19.103 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms +2024-03-31 16:05:19.103 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 19.7 ms +``` + +### 10 von 10 +```log +2024-03-31 16:05:57.410 +00:00 [INF] Query-Time for Package "LiteDB" completed in 0.6 ms +2024-03-31 16:05:57.410 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 0.4 ms +2024-03-31 16:05:57.411 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 0.4 ms +2024-03-31 16:05:57.411 +00:00 [INF] Query-Time for Package "Crowd" completed in 0.5 ms +2024-03-31 16:05:57.412 +00:00 [INF] Query-Time for Package "Atlassian" completed in 0.4 ms +2024-03-31 16:05:57.412 +00:00 [INF] Query-Time for Package "Debian" completed in 0.4 ms +2024-03-31 16:05:57.413 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 0.3 ms +2024-03-31 16:05:57.413 +00:00 [INF] Query-Time for Package "Arc42" completed in 0.3 ms +2024-03-31 16:05:57.413 +00:00 [INF] Query-Time for Package "arc42" completed in 0.3 ms +2024-03-31 16:05:57.414 +00:00 [INF] Query-Time for Package "cookie" completed in 0.3 ms +2024-03-31 16:05:57.414 +00:00 [INF] Query-Time for Package "mongoDb" completed in 0.3 ms +2024-03-31 16:05:57.414 +00:00 [INF] Query-Time for Package "mongoDB" completed in 0.3 ms +2024-03-31 16:05:57.415 +00:00 [INF] Query-Time for Package "mongodb" completed in 0.3 ms +2024-03-31 16:05:57.415 +00:00 [INF] Query-Time for Package "parser" completed in 0.3 ms +2024-03-31 16:05:57.415 +00:00 [INF] Query-Time for Package "LiteDb" completed in 0.3 ms +2024-03-31 16:05:57.416 +00:00 [INF] Query-Time for Package "php" completed in 0.6 ms +2024-03-31 16:05:57.417 +00:00 [INF] Query-Time for Package "PHP" completed in 0.7 ms +2024-03-31 16:05:57.419 +00:00 [INF] Query-Time for Package "Laravel" completed in 0.3 ms +2024-03-31 16:05:57.419 +00:00 [INF] Query-Time for Package "laravel" completed in 0.3 ms +2024-03-31 16:05:57.419 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 0.3 ms +2024-03-31 16:05:57.420 +00:00 [INF] Query-Time for Package "beta" completed in 0.3 ms +2024-03-31 16:05:57.420 +00:00 [INF] Query-Time for Package "meta" completed in 0.3 ms +2024-03-31 16:05:57.420 +00:00 [INF] Query-Time for Package "META" completed in 0.3 ms +2024-03-31 16:05:57.421 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 0.2 ms +2024-03-31 16:05:57.421 +00:00 [INF] Query-Time for Package "accepts" completed in 0.2 ms +2024-03-31 16:05:57.421 +00:00 [INF] Query-Time for Package "mime-db" completed in 0.3 ms +2024-03-31 16:05:57.422 +00:00 [INF] Query-Time for Package "mime-DB" completed in 0.2 ms +2024-03-31 16:05:57.422 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 0.2 ms +2024-03-31 16:05:57.422 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 0.2 ms +2024-03-31 16:05:57.422 +00:00 [INF] Query-Time for Package "raw-body" completed in 0.2 ms +2024-03-31 16:05:57.423 +00:00 [INF] Query-Time for Package "depd" completed in 0.2 ms +2024-03-31 16:05:57.423 +00:00 [INF] Query-Time for Package "finalhandler" completed in 0.2 ms +2024-03-31 16:05:57.423 +00:00 [INF] Query-Time for Package "on-finished" completed in 0.3 ms +2024-03-31 16:05:57.424 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 0.2 ms +2024-03-31 16:05:57.424 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms +2024-03-31 16:05:57.424 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 15.0 ms +``` + +## Ohne Index +### 1 von 10 +```log +2024-03-31 16:10:29.164 +00:00 [INF] Query-Time for Package "LiteDB" completed in 264.8 ms +2024-03-31 16:10:29.385 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 221.6 ms +2024-03-31 16:10:29.597 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 211.4 ms +2024-03-31 16:10:29.807 +00:00 [INF] Query-Time for Package "Crowd" completed in 209.8 ms +2024-03-31 16:10:30.018 +00:00 [INF] Query-Time for Package "Atlassian" completed in 211.1 ms +2024-03-31 16:10:30.225 +00:00 [INF] Query-Time for Package "Debian" completed in 206.6 ms +2024-03-31 16:10:30.431 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 206.4 ms +2024-03-31 16:10:30.644 +00:00 [INF] Query-Time for Package "Arc42" completed in 212.2 ms +2024-03-31 16:10:30.852 +00:00 [INF] Query-Time for Package "arc42" completed in 208.4 ms +2024-03-31 16:10:31.061 +00:00 [INF] Query-Time for Package "cookie" completed in 208.6 ms +2024-03-31 16:10:31.270 +00:00 [INF] Query-Time for Package "mongoDb" completed in 209.3 ms +2024-03-31 16:10:31.480 +00:00 [INF] Query-Time for Package "mongoDB" completed in 209.5 ms +2024-03-31 16:10:31.688 +00:00 [INF] Query-Time for Package "mongodb" completed in 208.4 ms +2024-03-31 16:10:31.896 +00:00 [INF] Query-Time for Package "parser" completed in 207.6 ms +2024-03-31 16:10:32.102 +00:00 [INF] Query-Time for Package "LiteDb" completed in 206.2 ms +2024-03-31 16:10:32.315 +00:00 [INF] Query-Time for Package "php" completed in 212.7 ms +2024-03-31 16:10:32.523 +00:00 [INF] Query-Time for Package "PHP" completed in 206.3 ms +2024-03-31 16:10:32.732 +00:00 [INF] Query-Time for Package "Laravel" completed in 208.4 ms +2024-03-31 16:10:32.945 +00:00 [INF] Query-Time for Package "laravel" completed in 212.4 ms +2024-03-31 16:10:33.155 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 210.3 ms +2024-03-31 16:10:33.362 +00:00 [INF] Query-Time for Package "beta" completed in 206.6 ms +2024-03-31 16:10:33.570 +00:00 [INF] Query-Time for Package "meta" completed in 208.0 ms +2024-03-31 16:10:33.776 +00:00 [INF] Query-Time for Package "META" completed in 205.4 ms +2024-03-31 16:10:33.983 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 207.6 ms +2024-03-31 16:10:34.188 +00:00 [INF] Query-Time for Package "accepts" completed in 205.1 ms +2024-03-31 16:10:34.396 +00:00 [INF] Query-Time for Package "mime-db" completed in 207.7 ms +2024-03-31 16:10:34.603 +00:00 [INF] Query-Time for Package "mime-DB" completed in 206.1 ms +2024-03-31 16:10:34.809 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 206.2 ms +2024-03-31 16:10:35.014 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 205.4 ms +2024-03-31 16:10:35.221 +00:00 [INF] Query-Time for Package "raw-body" completed in 206.9 ms +2024-03-31 16:10:35.433 +00:00 [INF] Query-Time for Package "depd" completed in 211.2 ms +2024-03-31 16:10:35.640 +00:00 [INF] Query-Time for Package "finalhandler" completed in 207.0 ms +2024-03-31 16:10:35.847 +00:00 [INF] Query-Time for Package "on-finished" completed in 207.6 ms +2024-03-31 16:10:36.056 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 208.3 ms +2024-03-31 16:10:36.263 +00:00 [INF] Query-Time for Package "encodeurl" completed in 207.1 ms +2024-03-31 16:10:36.263 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7364.4 ms +``` + +### 2 von 10 +```log +2024-03-31 16:11:55.380 +00:00 [INF] Query-Time for Package "LiteDB" completed in 208.5 ms +2024-03-31 16:11:55.586 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 205.3 ms +2024-03-31 16:11:55.795 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 209.3 ms +2024-03-31 16:11:56.002 +00:00 [INF] Query-Time for Package "Crowd" completed in 206.9 ms +2024-03-31 16:11:56.213 +00:00 [INF] Query-Time for Package "Atlassian" completed in 210.4 ms +2024-03-31 16:11:56.418 +00:00 [INF] Query-Time for Package "Debian" completed in 205.4 ms +2024-03-31 16:11:56.627 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 208.0 ms +2024-03-31 16:11:56.840 +00:00 [INF] Query-Time for Package "Arc42" completed in 213.6 ms +2024-03-31 16:11:57.049 +00:00 [INF] Query-Time for Package "arc42" completed in 208.1 ms +2024-03-31 16:11:57.257 +00:00 [INF] Query-Time for Package "cookie" completed in 207.9 ms +2024-03-31 16:11:57.464 +00:00 [INF] Query-Time for Package "mongoDb" completed in 207.2 ms +2024-03-31 16:11:57.672 +00:00 [INF] Query-Time for Package "mongoDB" completed in 208.5 ms +2024-03-31 16:11:57.881 +00:00 [INF] Query-Time for Package "mongodb" completed in 208.4 ms +2024-03-31 16:11:58.090 +00:00 [INF] Query-Time for Package "parser" completed in 208.9 ms +2024-03-31 16:11:58.298 +00:00 [INF] Query-Time for Package "LiteDb" completed in 207.7 ms +2024-03-31 16:11:58.508 +00:00 [INF] Query-Time for Package "php" completed in 210.3 ms +2024-03-31 16:11:58.720 +00:00 [INF] Query-Time for Package "PHP" completed in 210.8 ms +2024-03-31 16:11:58.930 +00:00 [INF] Query-Time for Package "Laravel" completed in 209.1 ms +2024-03-31 16:11:59.138 +00:00 [INF] Query-Time for Package "laravel" completed in 208.1 ms +2024-03-31 16:11:59.347 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 208.1 ms +2024-03-31 16:11:59.556 +00:00 [INF] Query-Time for Package "beta" completed in 209.3 ms +2024-03-31 16:11:59.766 +00:00 [INF] Query-Time for Package "meta" completed in 209.8 ms +2024-03-31 16:11:59.976 +00:00 [INF] Query-Time for Package "META" completed in 209.8 ms +2024-03-31 16:12:00.182 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 206.5 ms +2024-03-31 16:12:00.397 +00:00 [INF] Query-Time for Package "accepts" completed in 214.7 ms +2024-03-31 16:12:00.605 +00:00 [INF] Query-Time for Package "mime-db" completed in 208.0 ms +2024-03-31 16:12:00.814 +00:00 [INF] Query-Time for Package "mime-DB" completed in 208.2 ms +2024-03-31 16:12:01.024 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 210.3 ms +2024-03-31 16:12:01.233 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 208.7 ms +2024-03-31 16:12:01.441 +00:00 [INF] Query-Time for Package "raw-body" completed in 207.5 ms +2024-03-31 16:12:01.650 +00:00 [INF] Query-Time for Package "depd" completed in 209.9 ms +2024-03-31 16:12:01.858 +00:00 [INF] Query-Time for Package "finalhandler" completed in 207.6 ms +2024-03-31 16:12:02.065 +00:00 [INF] Query-Time for Package "on-finished" completed in 206.8 ms +2024-03-31 16:12:02.279 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 214.2 ms +2024-03-31 16:12:02.489 +00:00 [INF] Query-Time for Package "encodeurl" completed in 209.4 ms +2024-03-31 16:12:02.489 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7317.2 ms +``` + +### 3 von 10 +```log +2024-03-31 16:13:09.964 +00:00 [INF] Query-Time for Package "LiteDB" completed in 206.5 ms +2024-03-31 16:13:10.173 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 208.6 ms +2024-03-31 16:13:10.383 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 209.8 ms +2024-03-31 16:13:10.591 +00:00 [INF] Query-Time for Package "Crowd" completed in 207.9 ms +2024-03-31 16:13:10.800 +00:00 [INF] Query-Time for Package "Atlassian" completed in 208.7 ms +2024-03-31 16:13:11.008 +00:00 [INF] Query-Time for Package "Debian" completed in 207.8 ms +2024-03-31 16:13:11.218 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 209.5 ms +2024-03-31 16:13:11.425 +00:00 [INF] Query-Time for Package "Arc42" completed in 207.8 ms +2024-03-31 16:13:11.637 +00:00 [INF] Query-Time for Package "arc42" completed in 211.0 ms +2024-03-31 16:13:11.848 +00:00 [INF] Query-Time for Package "cookie" completed in 211.2 ms +2024-03-31 16:13:12.055 +00:00 [INF] Query-Time for Package "mongoDb" completed in 206.9 ms +2024-03-31 16:13:12.261 +00:00 [INF] Query-Time for Package "mongoDB" completed in 206.5 ms +2024-03-31 16:13:12.469 +00:00 [INF] Query-Time for Package "mongodb" completed in 207.7 ms +2024-03-31 16:13:12.677 +00:00 [INF] Query-Time for Package "parser" completed in 207.2 ms +2024-03-31 16:13:12.883 +00:00 [INF] Query-Time for Package "LiteDb" completed in 206.6 ms +2024-03-31 16:13:13.093 +00:00 [INF] Query-Time for Package "php" completed in 210.0 ms +2024-03-31 16:13:13.302 +00:00 [INF] Query-Time for Package "PHP" completed in 207.0 ms +2024-03-31 16:13:13.508 +00:00 [INF] Query-Time for Package "Laravel" completed in 205.3 ms +2024-03-31 16:13:13.717 +00:00 [INF] Query-Time for Package "laravel" completed in 209.2 ms +2024-03-31 16:13:13.924 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 206.2 ms +2024-03-31 16:13:14.128 +00:00 [INF] Query-Time for Package "beta" completed in 204.0 ms +2024-03-31 16:13:14.337 +00:00 [INF] Query-Time for Package "meta" completed in 209.6 ms +2024-03-31 16:13:14.544 +00:00 [INF] Query-Time for Package "META" completed in 205.9 ms +2024-03-31 16:13:14.749 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 205.4 ms +2024-03-31 16:13:14.955 +00:00 [INF] Query-Time for Package "accepts" completed in 206.0 ms +2024-03-31 16:13:15.162 +00:00 [INF] Query-Time for Package "mime-db" completed in 206.9 ms +2024-03-31 16:13:15.369 +00:00 [INF] Query-Time for Package "mime-DB" completed in 206.6 ms +2024-03-31 16:13:15.575 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 206.5 ms +2024-03-31 16:13:15.786 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 210.2 ms +2024-03-31 16:13:15.995 +00:00 [INF] Query-Time for Package "raw-body" completed in 209.4 ms +2024-03-31 16:13:16.204 +00:00 [INF] Query-Time for Package "depd" completed in 208.5 ms +2024-03-31 16:13:16.416 +00:00 [INF] Query-Time for Package "finalhandler" completed in 212.0 ms +2024-03-31 16:13:16.627 +00:00 [INF] Query-Time for Package "on-finished" completed in 211.3 ms +2024-03-31 16:13:16.836 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 209.0 ms +2024-03-31 16:13:17.046 +00:00 [INF] Query-Time for Package "encodeurl" completed in 209.2 ms +2024-03-31 16:13:17.046 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7288.1 ms +``` + +### 4 von 10 +```log +2024-03-31 16:14:40.185 +00:00 [INF] Query-Time for Package "LiteDB" completed in 205.8 ms +2024-03-31 16:14:40.397 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 211.0 ms +2024-03-31 16:14:40.606 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 208.9 ms +2024-03-31 16:14:40.815 +00:00 [INF] Query-Time for Package "Crowd" completed in 209.1 ms +2024-03-31 16:14:41.024 +00:00 [INF] Query-Time for Package "Atlassian" completed in 208.5 ms +2024-03-31 16:14:41.232 +00:00 [INF] Query-Time for Package "Debian" completed in 207.7 ms +2024-03-31 16:14:41.440 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 208.5 ms +2024-03-31 16:14:41.646 +00:00 [INF] Query-Time for Package "Arc42" completed in 206.2 ms +2024-03-31 16:14:41.854 +00:00 [INF] Query-Time for Package "arc42" completed in 207.8 ms +2024-03-31 16:14:42.062 +00:00 [INF] Query-Time for Package "cookie" completed in 207.7 ms +2024-03-31 16:14:42.271 +00:00 [INF] Query-Time for Package "mongoDb" completed in 208.3 ms +2024-03-31 16:14:42.481 +00:00 [INF] Query-Time for Package "mongoDB" completed in 210.3 ms +2024-03-31 16:14:42.688 +00:00 [INF] Query-Time for Package "mongodb" completed in 206.9 ms +2024-03-31 16:14:42.897 +00:00 [INF] Query-Time for Package "parser" completed in 208.8 ms +2024-03-31 16:14:43.103 +00:00 [INF] Query-Time for Package "LiteDb" completed in 205.9 ms +2024-03-31 16:14:43.307 +00:00 [INF] Query-Time for Package "php" completed in 204.2 ms +2024-03-31 16:14:43.514 +00:00 [INF] Query-Time for Package "PHP" completed in 206.0 ms +2024-03-31 16:14:43.722 +00:00 [INF] Query-Time for Package "Laravel" completed in 206.5 ms +2024-03-31 16:14:43.929 +00:00 [INF] Query-Time for Package "laravel" completed in 206.7 ms +2024-03-31 16:14:44.135 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 206.1 ms +2024-03-31 16:14:44.341 +00:00 [INF] Query-Time for Package "beta" completed in 205.7 ms +2024-03-31 16:14:44.551 +00:00 [INF] Query-Time for Package "meta" completed in 209.8 ms +2024-03-31 16:14:44.759 +00:00 [INF] Query-Time for Package "META" completed in 208.7 ms +2024-03-31 16:14:44.966 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 206.1 ms +2024-03-31 16:14:45.171 +00:00 [INF] Query-Time for Package "accepts" completed in 205.2 ms +2024-03-31 16:14:45.377 +00:00 [INF] Query-Time for Package "mime-db" completed in 206.4 ms +2024-03-31 16:14:45.581 +00:00 [INF] Query-Time for Package "mime-DB" completed in 203.3 ms +2024-03-31 16:14:45.789 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 208.5 ms +2024-03-31 16:14:46.002 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 212.7 ms +2024-03-31 16:14:46.209 +00:00 [INF] Query-Time for Package "raw-body" completed in 206.2 ms +2024-03-31 16:14:46.417 +00:00 [INF] Query-Time for Package "depd" completed in 207.9 ms +2024-03-31 16:14:46.620 +00:00 [INF] Query-Time for Package "finalhandler" completed in 203.5 ms +2024-03-31 16:14:46.827 +00:00 [INF] Query-Time for Package "on-finished" completed in 206.8 ms +2024-03-31 16:14:47.035 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 207.6 ms +2024-03-31 16:14:47.241 +00:00 [INF] Query-Time for Package "encodeurl" completed in 205.8 ms +2024-03-31 16:14:47.241 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7261.3 ms +``` + +### 5 von 10 +```log +2024-03-31 16:16:43.914 +00:00 [INF] Query-Time for Package "LiteDB" completed in 209.7 ms +2024-03-31 16:16:44.123 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 208.1 ms +2024-03-31 16:16:44.336 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 212.9 ms +2024-03-31 16:16:44.542 +00:00 [INF] Query-Time for Package "Crowd" completed in 206.3 ms +2024-03-31 16:16:44.754 +00:00 [INF] Query-Time for Package "Atlassian" completed in 211.6 ms +2024-03-31 16:16:44.960 +00:00 [INF] Query-Time for Package "Debian" completed in 205.8 ms +2024-03-31 16:16:45.172 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 211.7 ms +2024-03-31 16:16:45.382 +00:00 [INF] Query-Time for Package "Arc42" completed in 210.5 ms +2024-03-31 16:16:45.588 +00:00 [INF] Query-Time for Package "arc42" completed in 205.6 ms +2024-03-31 16:16:45.797 +00:00 [INF] Query-Time for Package "cookie" completed in 208.8 ms +2024-03-31 16:16:46.007 +00:00 [INF] Query-Time for Package "mongoDb" completed in 209.5 ms +2024-03-31 16:16:46.214 +00:00 [INF] Query-Time for Package "mongoDB" completed in 206.9 ms +2024-03-31 16:16:46.421 +00:00 [INF] Query-Time for Package "mongodb" completed in 207.3 ms +2024-03-31 16:16:46.630 +00:00 [INF] Query-Time for Package "parser" completed in 208.4 ms +2024-03-31 16:16:46.837 +00:00 [INF] Query-Time for Package "LiteDb" completed in 207.7 ms +2024-03-31 16:16:47.045 +00:00 [INF] Query-Time for Package "php" completed in 207.9 ms +2024-03-31 16:16:47.254 +00:00 [INF] Query-Time for Package "PHP" completed in 207.7 ms +2024-03-31 16:16:47.465 +00:00 [INF] Query-Time for Package "Laravel" completed in 209.5 ms +2024-03-31 16:16:47.676 +00:00 [INF] Query-Time for Package "laravel" completed in 210.7 ms +2024-03-31 16:16:47.885 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 209.2 ms +2024-03-31 16:16:48.093 +00:00 [INF] Query-Time for Package "beta" completed in 207.6 ms +2024-03-31 16:16:48.302 +00:00 [INF] Query-Time for Package "meta" completed in 209.5 ms +2024-03-31 16:16:48.509 +00:00 [INF] Query-Time for Package "META" completed in 206.1 ms +2024-03-31 16:16:48.715 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 206.2 ms +2024-03-31 16:16:48.922 +00:00 [INF] Query-Time for Package "accepts" completed in 206.9 ms +2024-03-31 16:16:49.130 +00:00 [INF] Query-Time for Package "mime-db" completed in 208.3 ms +2024-03-31 16:16:49.339 +00:00 [INF] Query-Time for Package "mime-DB" completed in 208.1 ms +2024-03-31 16:16:49.545 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 206.5 ms +2024-03-31 16:16:49.753 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 207.4 ms +2024-03-31 16:16:49.961 +00:00 [INF] Query-Time for Package "raw-body" completed in 207.9 ms +2024-03-31 16:16:50.169 +00:00 [INF] Query-Time for Package "depd" completed in 208.4 ms +2024-03-31 16:16:50.377 +00:00 [INF] Query-Time for Package "finalhandler" completed in 207.9 ms +2024-03-31 16:16:50.585 +00:00 [INF] Query-Time for Package "on-finished" completed in 207.6 ms +2024-03-31 16:16:50.792 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 206.6 ms +2024-03-31 16:16:50.998 +00:00 [INF] Query-Time for Package "encodeurl" completed in 206.1 ms +2024-03-31 16:16:50.998 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7293.3 ms +``` + +### 6 von 10 +```log +2024-03-31 16:18:32.320 +00:00 [INF] Query-Time for Package "LiteDB" completed in 208.3 ms +2024-03-31 16:18:32.529 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 209.1 ms +2024-03-31 16:18:32.739 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 209.5 ms +2024-03-31 16:18:32.946 +00:00 [INF] Query-Time for Package "Crowd" completed in 206.7 ms +2024-03-31 16:18:33.154 +00:00 [INF] Query-Time for Package "Atlassian" completed in 207.7 ms +2024-03-31 16:18:33.363 +00:00 [INF] Query-Time for Package "Debian" completed in 208.7 ms +2024-03-31 16:18:33.571 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 208.6 ms +2024-03-31 16:18:33.779 +00:00 [INF] Query-Time for Package "Arc42" completed in 207.8 ms +2024-03-31 16:18:33.987 +00:00 [INF] Query-Time for Package "arc42" completed in 207.5 ms +2024-03-31 16:18:34.196 +00:00 [INF] Query-Time for Package "cookie" completed in 208.5 ms +2024-03-31 16:18:34.402 +00:00 [INF] Query-Time for Package "mongoDb" completed in 205.9 ms +2024-03-31 16:18:34.608 +00:00 [INF] Query-Time for Package "mongoDB" completed in 206.5 ms +2024-03-31 16:18:34.814 +00:00 [INF] Query-Time for Package "mongodb" completed in 205.9 ms +2024-03-31 16:18:35.020 +00:00 [INF] Query-Time for Package "parser" completed in 205.5 ms +2024-03-31 16:18:35.226 +00:00 [INF] Query-Time for Package "LiteDb" completed in 205.6 ms +2024-03-31 16:18:35.433 +00:00 [INF] Query-Time for Package "php" completed in 207.6 ms +2024-03-31 16:18:35.644 +00:00 [INF] Query-Time for Package "PHP" completed in 209.2 ms +2024-03-31 16:18:35.849 +00:00 [INF] Query-Time for Package "Laravel" completed in 203.9 ms +2024-03-31 16:18:36.055 +00:00 [INF] Query-Time for Package "laravel" completed in 206.4 ms +2024-03-31 16:18:36.264 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 208.9 ms +2024-03-31 16:18:36.471 +00:00 [INF] Query-Time for Package "beta" completed in 206.3 ms +2024-03-31 16:18:36.677 +00:00 [INF] Query-Time for Package "meta" completed in 206.3 ms +2024-03-31 16:18:36.883 +00:00 [INF] Query-Time for Package "META" completed in 205.7 ms +2024-03-31 16:18:37.091 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 208.2 ms +2024-03-31 16:18:37.299 +00:00 [INF] Query-Time for Package "accepts" completed in 207.8 ms +2024-03-31 16:18:37.506 +00:00 [INF] Query-Time for Package "mime-db" completed in 206.4 ms +2024-03-31 16:18:37.716 +00:00 [INF] Query-Time for Package "mime-DB" completed in 210.1 ms +2024-03-31 16:18:37.925 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 208.5 ms +2024-03-31 16:18:38.134 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 209.2 ms +2024-03-31 16:18:38.344 +00:00 [INF] Query-Time for Package "raw-body" completed in 210.7 ms +2024-03-31 16:18:38.552 +00:00 [INF] Query-Time for Package "depd" completed in 208.1 ms +2024-03-31 16:18:38.761 +00:00 [INF] Query-Time for Package "finalhandler" completed in 208.7 ms +2024-03-31 16:18:38.971 +00:00 [INF] Query-Time for Package "on-finished" completed in 209.7 ms +2024-03-31 16:18:39.180 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 208.9 ms +2024-03-31 16:18:39.388 +00:00 [INF] Query-Time for Package "encodeurl" completed in 208.2 ms +2024-03-31 16:18:39.388 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7277.1 ms +``` + +### 7 von 10 +```log +2024-03-31 16:19:36.516 +00:00 [INF] Query-Time for Package "LiteDB" completed in 206.7 ms +2024-03-31 16:19:36.726 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 210.0 ms +2024-03-31 16:19:36.934 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 207.6 ms +2024-03-31 16:19:37.143 +00:00 [INF] Query-Time for Package "Crowd" completed in 209.4 ms +2024-03-31 16:19:37.350 +00:00 [INF] Query-Time for Package "Atlassian" completed in 206.6 ms +2024-03-31 16:19:37.559 +00:00 [INF] Query-Time for Package "Debian" completed in 208.3 ms +2024-03-31 16:19:37.765 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 206.7 ms +2024-03-31 16:19:37.973 +00:00 [INF] Query-Time for Package "Arc42" completed in 207.5 ms +2024-03-31 16:19:38.182 +00:00 [INF] Query-Time for Package "arc42" completed in 209.1 ms +2024-03-31 16:19:38.389 +00:00 [INF] Query-Time for Package "cookie" completed in 207.4 ms +2024-03-31 16:19:38.601 +00:00 [INF] Query-Time for Package "mongoDb" completed in 211.8 ms +2024-03-31 16:19:38.807 +00:00 [INF] Query-Time for Package "mongoDB" completed in 206.5 ms +2024-03-31 16:19:39.015 +00:00 [INF] Query-Time for Package "mongodb" completed in 207.5 ms +2024-03-31 16:19:39.223 +00:00 [INF] Query-Time for Package "parser" completed in 208.4 ms +2024-03-31 16:19:39.431 +00:00 [INF] Query-Time for Package "LiteDb" completed in 207.5 ms +2024-03-31 16:19:39.639 +00:00 [INF] Query-Time for Package "php" completed in 208.3 ms +2024-03-31 16:19:39.847 +00:00 [INF] Query-Time for Package "PHP" completed in 206.5 ms +2024-03-31 16:19:40.056 +00:00 [INF] Query-Time for Package "Laravel" completed in 208.0 ms +2024-03-31 16:19:40.263 +00:00 [INF] Query-Time for Package "laravel" completed in 206.7 ms +2024-03-31 16:19:40.467 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 204.4 ms +2024-03-31 16:19:40.673 +00:00 [INF] Query-Time for Package "beta" completed in 205.5 ms +2024-03-31 16:19:40.879 +00:00 [INF] Query-Time for Package "meta" completed in 206.0 ms +2024-03-31 16:19:41.086 +00:00 [INF] Query-Time for Package "META" completed in 206.5 ms +2024-03-31 16:19:41.290 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 204.5 ms +2024-03-31 16:19:41.498 +00:00 [INF] Query-Time for Package "accepts" completed in 207.5 ms +2024-03-31 16:19:41.706 +00:00 [INF] Query-Time for Package "mime-db" completed in 208.4 ms +2024-03-31 16:19:41.915 +00:00 [INF] Query-Time for Package "mime-DB" completed in 208.4 ms +2024-03-31 16:19:42.123 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 208.3 ms +2024-03-31 16:19:42.328 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 204.4 ms +2024-03-31 16:19:42.534 +00:00 [INF] Query-Time for Package "raw-body" completed in 205.6 ms +2024-03-31 16:19:42.740 +00:00 [INF] Query-Time for Package "depd" completed in 205.9 ms +2024-03-31 16:19:42.944 +00:00 [INF] Query-Time for Package "finalhandler" completed in 204.8 ms +2024-03-31 16:19:43.150 +00:00 [INF] Query-Time for Package "on-finished" completed in 205.4 ms +2024-03-31 16:19:43.354 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 204.2 ms +2024-03-31 16:19:43.558 +00:00 [INF] Query-Time for Package "encodeurl" completed in 203.6 ms +2024-03-31 16:19:43.558 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7249.9 ms +``` + +### 8 von 10 +```log +2024-03-31 16:21:32.321 +00:00 [INF] Query-Time for Package "LiteDB" completed in 206.2 ms +2024-03-31 16:21:32.527 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 206.4 ms +2024-03-31 16:21:32.735 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 208.3 ms +2024-03-31 16:21:32.941 +00:00 [INF] Query-Time for Package "Crowd" completed in 205.6 ms +2024-03-31 16:21:33.150 +00:00 [INF] Query-Time for Package "Atlassian" completed in 208.8 ms +2024-03-31 16:21:33.356 +00:00 [INF] Query-Time for Package "Debian" completed in 205.3 ms +2024-03-31 16:21:33.564 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 207.8 ms +2024-03-31 16:21:33.771 +00:00 [INF] Query-Time for Package "Arc42" completed in 207.1 ms +2024-03-31 16:21:33.975 +00:00 [INF] Query-Time for Package "arc42" completed in 203.8 ms +2024-03-31 16:21:34.181 +00:00 [INF] Query-Time for Package "cookie" completed in 206.5 ms +2024-03-31 16:21:34.387 +00:00 [INF] Query-Time for Package "mongoDb" completed in 205.7 ms +2024-03-31 16:21:34.595 +00:00 [INF] Query-Time for Package "mongoDB" completed in 207.7 ms +2024-03-31 16:21:34.800 +00:00 [INF] Query-Time for Package "mongodb" completed in 205.4 ms +2024-03-31 16:21:35.006 +00:00 [INF] Query-Time for Package "parser" completed in 205.3 ms +2024-03-31 16:21:35.212 +00:00 [INF] Query-Time for Package "LiteDb" completed in 206.0 ms +2024-03-31 16:21:35.419 +00:00 [INF] Query-Time for Package "php" completed in 206.9 ms +2024-03-31 16:21:35.627 +00:00 [INF] Query-Time for Package "PHP" completed in 206.5 ms +2024-03-31 16:21:35.835 +00:00 [INF] Query-Time for Package "Laravel" completed in 207.7 ms +2024-03-31 16:21:36.042 +00:00 [INF] Query-Time for Package "laravel" completed in 206.3 ms +2024-03-31 16:21:36.250 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 207.6 ms +2024-03-31 16:21:36.454 +00:00 [INF] Query-Time for Package "beta" completed in 204.5 ms +2024-03-31 16:21:36.662 +00:00 [INF] Query-Time for Package "meta" completed in 207.4 ms +2024-03-31 16:21:36.868 +00:00 [INF] Query-Time for Package "META" completed in 205.9 ms +2024-03-31 16:21:37.077 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 208.8 ms +2024-03-31 16:21:37.284 +00:00 [INF] Query-Time for Package "accepts" completed in 207.3 ms +2024-03-31 16:21:37.493 +00:00 [INF] Query-Time for Package "mime-db" completed in 209.0 ms +2024-03-31 16:21:37.701 +00:00 [INF] Query-Time for Package "mime-DB" completed in 207.6 ms +2024-03-31 16:21:37.908 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 207.2 ms +2024-03-31 16:21:38.115 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 206.3 ms +2024-03-31 16:21:38.320 +00:00 [INF] Query-Time for Package "raw-body" completed in 205.5 ms +2024-03-31 16:21:38.526 +00:00 [INF] Query-Time for Package "depd" completed in 205.8 ms +2024-03-31 16:21:38.733 +00:00 [INF] Query-Time for Package "finalhandler" completed in 206.5 ms +2024-03-31 16:21:38.937 +00:00 [INF] Query-Time for Package "on-finished" completed in 204.0 ms +2024-03-31 16:21:39.143 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 205.8 ms +2024-03-31 16:21:39.348 +00:00 [INF] Query-Time for Package "encodeurl" completed in 205.2 ms +2024-03-31 16:21:39.348 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7234.1 ms +``` + +### 9 von 10 +```log +2024-03-31 16:22:50.000 +00:00 [INF] Query-Time for Package "LiteDB" completed in 209.1 ms +2024-03-31 16:22:50.209 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 208.4 ms +2024-03-31 16:22:50.422 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 213.5 ms +2024-03-31 16:22:50.633 +00:00 [INF] Query-Time for Package "Crowd" completed in 210.4 ms +2024-03-31 16:22:50.840 +00:00 [INF] Query-Time for Package "Atlassian" completed in 206.6 ms +2024-03-31 16:22:51.050 +00:00 [INF] Query-Time for Package "Debian" completed in 210.0 ms +2024-03-31 16:22:51.259 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 208.7 ms +2024-03-31 16:22:51.467 +00:00 [INF] Query-Time for Package "Arc42" completed in 208.2 ms +2024-03-31 16:22:51.676 +00:00 [INF] Query-Time for Package "arc42" completed in 208.9 ms +2024-03-31 16:22:51.888 +00:00 [INF] Query-Time for Package "cookie" completed in 211.5 ms +2024-03-31 16:22:52.094 +00:00 [INF] Query-Time for Package "mongoDb" completed in 206.6 ms +2024-03-31 16:22:52.304 +00:00 [INF] Query-Time for Package "mongoDB" completed in 209.6 ms +2024-03-31 16:22:52.512 +00:00 [INF] Query-Time for Package "mongodb" completed in 207.6 ms +2024-03-31 16:22:52.720 +00:00 [INF] Query-Time for Package "parser" completed in 208.2 ms +2024-03-31 16:22:52.928 +00:00 [INF] Query-Time for Package "LiteDb" completed in 208.2 ms +2024-03-31 16:22:53.137 +00:00 [INF] Query-Time for Package "php" completed in 208.9 ms +2024-03-31 16:22:53.347 +00:00 [INF] Query-Time for Package "PHP" completed in 208.2 ms +2024-03-31 16:22:53.557 +00:00 [INF] Query-Time for Package "Laravel" completed in 209.1 ms +2024-03-31 16:22:53.764 +00:00 [INF] Query-Time for Package "laravel" completed in 206.9 ms +2024-03-31 16:22:53.972 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 207.9 ms +2024-03-31 16:22:54.178 +00:00 [INF] Query-Time for Package "beta" completed in 205.9 ms +2024-03-31 16:22:54.385 +00:00 [INF] Query-Time for Package "meta" completed in 207.0 ms +2024-03-31 16:22:54.595 +00:00 [INF] Query-Time for Package "META" completed in 209.3 ms +2024-03-31 16:22:54.803 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 208.4 ms +2024-03-31 16:22:55.010 +00:00 [INF] Query-Time for Package "accepts" completed in 206.5 ms +2024-03-31 16:22:55.217 +00:00 [INF] Query-Time for Package "mime-db" completed in 207.3 ms +2024-03-31 16:22:55.427 +00:00 [INF] Query-Time for Package "mime-DB" completed in 209.3 ms +2024-03-31 16:22:55.634 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 207.1 ms +2024-03-31 16:22:55.842 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 207.9 ms +2024-03-31 16:22:56.048 +00:00 [INF] Query-Time for Package "raw-body" completed in 206.4 ms +2024-03-31 16:22:56.255 +00:00 [INF] Query-Time for Package "depd" completed in 207.1 ms +2024-03-31 16:22:56.461 +00:00 [INF] Query-Time for Package "finalhandler" completed in 205.8 ms +2024-03-31 16:22:56.672 +00:00 [INF] Query-Time for Package "on-finished" completed in 210.7 ms +2024-03-31 16:22:56.878 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 206.2 ms +2024-03-31 16:22:57.087 +00:00 [INF] Query-Time for Package "encodeurl" completed in 208.4 ms +2024-03-31 16:22:57.087 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7295.9 ms +``` + +### 10 von 10 +```log +2024-03-31 16:24:49.065 +00:00 [INF] Query-Time for Package "LiteDB" completed in 203.3 ms +2024-03-31 16:24:49.272 +00:00 [INF] Query-Time for Package "Newtonsoft" completed in 207.2 ms +2024-03-31 16:24:49.480 +00:00 [INF] Query-Time for Package "NewtonSoft" completed in 207.4 ms +2024-03-31 16:24:49.688 +00:00 [INF] Query-Time for Package "Crowd" completed in 208.5 ms +2024-03-31 16:24:49.895 +00:00 [INF] Query-Time for Package "Atlassian" completed in 206.1 ms +2024-03-31 16:24:50.102 +00:00 [INF] Query-Time for Package "Debian" completed in 206.8 ms +2024-03-31 16:24:50.308 +00:00 [INF] Query-Time for Package "Ubuntu" completed in 205.8 ms +2024-03-31 16:24:50.515 +00:00 [INF] Query-Time for Package "Arc42" completed in 207.2 ms +2024-03-31 16:24:50.720 +00:00 [INF] Query-Time for Package "arc42" completed in 204.6 ms +2024-03-31 16:24:50.926 +00:00 [INF] Query-Time for Package "cookie" completed in 206.3 ms +2024-03-31 16:24:51.133 +00:00 [INF] Query-Time for Package "mongoDb" completed in 207.0 ms +2024-03-31 16:24:51.340 +00:00 [INF] Query-Time for Package "mongoDB" completed in 206.4 ms +2024-03-31 16:24:51.548 +00:00 [INF] Query-Time for Package "mongodb" completed in 208.0 ms +2024-03-31 16:24:51.754 +00:00 [INF] Query-Time for Package "parser" completed in 206.5 ms +2024-03-31 16:24:51.961 +00:00 [INF] Query-Time for Package "LiteDb" completed in 207.0 ms +2024-03-31 16:24:52.170 +00:00 [INF] Query-Time for Package "php" completed in 208.5 ms +2024-03-31 16:24:52.377 +00:00 [INF] Query-Time for Package "PHP" completed in 205.7 ms +2024-03-31 16:24:52.583 +00:00 [INF] Query-Time for Package "Laravel" completed in 205.5 ms +2024-03-31 16:24:52.789 +00:00 [INF] Query-Time for Package "laravel" completed in 205.2 ms +2024-03-31 16:24:52.994 +00:00 [INF] Query-Time for Package "LARAVEL" completed in 205.4 ms +2024-03-31 16:24:53.201 +00:00 [INF] Query-Time for Package "beta" completed in 206.1 ms +2024-03-31 16:24:53.407 +00:00 [INF] Query-Time for Package "meta" completed in 206.6 ms +2024-03-31 16:24:53.617 +00:00 [INF] Query-Time for Package "META" completed in 209.3 ms +2024-03-31 16:24:53.822 +00:00 [INF] Query-Time for Package "express-ejs-layouts" completed in 205.4 ms +2024-03-31 16:24:54.030 +00:00 [INF] Query-Time for Package "accepts" completed in 207.4 ms +2024-03-31 16:24:54.236 +00:00 [INF] Query-Time for Package "mime-db" completed in 205.9 ms +2024-03-31 16:24:54.441 +00:00 [INF] Query-Time for Package "mime-DB" completed in 204.9 ms +2024-03-31 16:24:54.646 +00:00 [INF] Query-Time for Package "iconv-lite" completed in 204.9 ms +2024-03-31 16:24:54.852 +00:00 [INF] Query-Time for Package "safer-buffer" completed in 206.4 ms +2024-03-31 16:24:55.061 +00:00 [INF] Query-Time for Package "raw-body" completed in 208.7 ms +2024-03-31 16:24:55.267 +00:00 [INF] Query-Time for Package "depd" completed in 205.6 ms +2024-03-31 16:24:55.473 +00:00 [INF] Query-Time for Package "finalhandler" completed in 205.9 ms +2024-03-31 16:24:55.679 +00:00 [INF] Query-Time for Package "on-finished" completed in 206.0 ms +2024-03-31 16:24:55.885 +00:00 [INF] Query-Time for Package "ipaddr.js" completed in 206.5 ms +2024-03-31 16:24:56.093 +00:00 [INF] Query-Time for Package "encodeurl" completed in 207.7 ms +2024-03-31 16:24:56.093 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7231.9 ms +``` From d19169e2ff611e3ba5a3f43f385287fb517c3b79 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Wed, 3 Apr 2024 18:58:17 +0200 Subject: [PATCH 14/60] typos --- documentation/fragments/packages.md | 39 +++++++++++++++++++ .../latex/5_concept/architecture.tex | 10 ++--- documentation/latex/5_concept/features.tex | 8 ++-- documentation/latex/5_concept/questions.tex | 2 +- documentation/latex/5_concept/results.tex | 22 +++++------ documentation/latex/5_concept/risks.tex | 30 +++++++------- .../latex/5_concept/special_attr.tex | 19 +++++---- .../latex/6_implementation/experiments.tex | 3 +- .../latex/6_implementation/implementation.tex | 22 +++++------ .../latex/6_implementation/mysql_index.tex | 2 + 10 files changed, 103 insertions(+), 54 deletions(-) create mode 100644 documentation/fragments/packages.md create mode 100644 documentation/latex/6_implementation/mysql_index.tex diff --git a/documentation/fragments/packages.md b/documentation/fragments/packages.md new file mode 100644 index 0000000..a557e84 --- /dev/null +++ b/documentation/fragments/packages.md @@ -0,0 +1,39 @@ +## in cve +- LiteDB completed in 7208.9 ms +- LiteDb completed in 2718.1 ms (2) +- Crowd completed in 2737.9 ms +- Atlassian completed in 2727.2 ms +- php completed in 2866.8 ms +- PHP completed in 2715.3 ms (2) +- Laravel completed in 2721.7 ms +- laravel completed in 2709.1 ms (2) +- LARAVEL completed in 2726.8 ms (3) + +## not in cve +- Newtonsoft completed in 2765.7 ms +- NewtonSoft completed in 2728.0 ms +- Debian completed in 2714.1 ms +- Ubuntu completed in 2702.3 ms +- Arc42 completed in 2687.2 ms +- arc42 completed in 2698.7 ms +- cookie completed in 2694.2 ms +- mongoDb completed in 2705.9 ms +- mongoDB completed in 2702.4 ms +- mongodb completed in 2702.4 ms +- parser completed in 2766.6 ms +- beta completed in 2713.3 ms +- meta completed in 2716.0 ms +- META completed in 2717.8 ms +- express-ejs-layouts completed in 2705.4 ms +- accepts completed in 2720.1 ms +- mime-db completed in 2716.2 ms +- mime-DB completed in 2703.7 ms +- iconv-lite completed in 2708.8 ms +- safer-buffer completed in 2690.8 ms +- raw-body completed in 2700.3 ms +- depd completed in 2704.4 ms +- finalhandler completed in 2704.6 ms +- on-finished completed in 2700.3 ms +- ipaddr.js completed in 2695.2 ms +- encodeurl completed in 2705.9 ms +- \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index 89a2339..f5121a8 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -2,15 +2,15 @@ \subsection{Architektur} \label{sec:Architektur} Um eine API umzusetzen sind verschiedene Komponenten nötig: \begin{enumerate} \item \textbf{Datenbank} \\ - In der Datenbank sind alle CVE-Daten, die zu Durchsuchen sind zu persistieren. - Diese Daten dienen als Grundlage der Durchsuchung von Projekten und Paketen nach Schachstellen. - Wichtig sind hier schnelle Lesezugriffe, da diese beim Durchsuchen der Datenbank die größte Laufzeiteinsparung bringen. + In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. + Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. + Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. \item \textbf{Controller} \\ Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. \item \textbf{Datenmodelle} \\ - Um Daten korrekt in die Datenbank füllen sowie beim herstellen des Resultat-Json's werden Datenmodelle genutzt. + Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. \item \textbf{Konvertierung von und in JSON} \\ Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. - Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich noch als JSON dem Benutzer übermittelt werden. + Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex index 057310c..bf3332e 100644 --- a/documentation/latex/5_concept/features.tex +++ b/documentation/latex/5_concept/features.tex @@ -1,10 +1,10 @@ \subsection{Funktionalitäten} \label{sec:Funktionalitäten} Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. \begin{enumerate} - \item Einladen und Konvertieren der Schachstellendaten und persistente Speicherung dieser in einer internen Datenbank. - \item Überprüfung von Abhängigkeiten auf Sicherheitslücken mittels Abgleich zu einer internen Schachstellendatenbank. + \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. \item Clonen eines Repositories von Github. - \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zu einer internen Schachstellendatenbank. + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. \item Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. \end{enumerate} -Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. \ No newline at end of file +Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index ba51143..36e4ae9 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -2,7 +2,7 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} Folgende Forschungsfragen werden in dieser Arbeit betrachtet: \begin{enumerate} \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} - \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen besser weiterzuverwenden?} \label{two} + \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{two} \item \textbf{Wie ist eine Schwachstellenanalyse-API in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} \item \textbf{Wie kann eine solche API leistungsstärker und laufzeiteffizienter werden?} \label{four} \end{enumerate} diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index 6a0f565..14cc076 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -1,12 +1,12 @@ \subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} -Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: -\begin{enumerate} - \item \textbf{Entwicklung einer funktionsfähigen API} \\ - Diese soll performant und möglichst schmal in einem Containercontext nutzbar sein und alle, von den Features, notwenigen Endpunkte beinhalten. - \item \textbf{Analyse auf Sicherheitslücken} \\ - Die entstehende API soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. - \item \textbf{Darstellung der schachstellenbefallenen Abhängigkeiten als Baum} \\ - Bei Analyse einer Abhängigkeit sollen alle Abhängigkeiten dieser selbst aufgezeigt werden. - \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ - Die entstehende API soll dem Nutzer letztendlich dabei helfen eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Softwarekomponente zu fällen. -\end{enumerate} \ No newline at end of file + Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: + \begin{enumerate} + \item \textbf{Entwicklung einer funktionsfähigen API} \\ + Diese soll performant und möglichst schmal in einem Containercontext nutzbar sein und alle -- von den Features -- notwenigen Endpunkte beinhalten. + \item \textbf{Analyse auf Sicherheitslücken} \\ + Die entstehende API soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. + \item \textbf{Darstellung der detektierten Schwachstellenpakete inklusive Abhängigkeiten als Baum} \\ + Bei Analyse eines Repositories sollen alle Abhängigkeiten dieses mit dessen Abhängigkeiten aufgezeigt werden. + \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ + Die entstehende API soll dem Nutzer letztendlich dabei helfen, eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Abhängigkeit zu fällen. + \end{enumerate} diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex index d70faec..90d1d49 100644 --- a/documentation/latex/5_concept/risks.tex +++ b/documentation/latex/5_concept/risks.tex @@ -1,14 +1,18 @@ \subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderungen} -Risiken: -\begin{itemize} - \item Bei bestehender Schachstelle ist kein Eintrag in dern genutzten Daten vorhanden - \item Abhängigkeit vom CVE-Daten Provider - \item Sicherheitslücken in der API selbst -\end{itemize} -Herausforderungen: -\begin{itemize} - \item Extrahieren der Abhängigkeitsgraphen - \item Unterschiede zwischen Frameworks und Programmiersprachen - \item Schachstellendatenaktualität - \item Performance sowie Skalierbarkeit -\end{itemize} \ No newline at end of file + Risiken: + \begin{itemize} + \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden + \item Abhängigkeit vom CVE-Daten Provider + \item Sicherheitslücken in der API selbst + \end{itemize} + Herausforderungen: + \begin{description} + \item[I) Extrahieren der Abhängigkeitsgraphen]\hfill \\ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + \item[II) Unterschiede zwischen Frameworks und Programmiersprachen]\hfill \\ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + \item[III) Aktualität der Schwachstellendaten]\hfill \\ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + \item[IV) Performance sowie Skalierbarkeit]\hfill \\ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + \end{description} diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index 3b37a0a..5115370 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -1,9 +1,12 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} -Dadurchm dass diese API bei schachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstelle ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegenüber gegeben. -Somit können Aufwand bei Ersatz oder Anpassung an dieser besser eingeschätzt und die Entscheidung der Dringlichkeit dieser Arbeiten besser gefällt werden. -\\ \\ -Durch die große Menge an CVE-Daten, die als Schwachstellen-Suchbasis dient, und dadurch, dass diese Datenbasis immer nur erweitert wird ist der der API ermöglicht nur die aktuell neuesten Änderungen herunterzuladen und einzupflegen. -Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis ernuet herunterzuladen. -\\ \\ -Durch die lokal vorliegende Datenbasis ist das Suchen auf dieser deutlich schneller als diese Daten immer erneut anzufragen. -Somit kann mit einer niedrigeren Laufzeit in z.B. CI/CD intergrationen dieser gerechnet werden als andere Tools. \ No newline at end of file + Dadurch, dass diese API bei schwachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstellt, ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegeben. + Somit können Aufwand, bezüglich Ersatzes oder Anpassungen bei Abhängigkeiten, besser eingeschätzt werden und die Entscheidung, hier bezüglich der Dringlichkeit dieses Schrittes des Ersatzes, zutreffender fallen. + \\ \\ + Durch die Menge der als Schwachstellen-Suchbasis dienenden CVE-Daten und deren stetige Erweiterung und Aktualisierung ist es der API zu ermöglichen, immer nur die aktuellsten Änderungen herunterzuladen und einzupflegen. + Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis erneut herunterzuladen. + \\ \\ + Durch die lokal vorliegende Datenbasis ist das Suchen deutlich schneller als diese Daten immer erneut extern anzufragen. + Somit kann mit einer niedrigeren Laufzeit in z.B. CI/CD Intergrationen dieser gerechnet werden als andere Tools. + \\ \\ + Die Abfrage einzelner Pakete ist ebenfalls unterstützt. + Demnach ist die punktuelle Analyse einzelner Pakete möglich, was den Einsatzrahmen für die Endnutzer erweitert. diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index d6861b5..6c3baf7 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,2 +1,3 @@ \subsection{Experimente} \label{sec:Experimente} -\input{6_implementation/db_exp.tex} \ No newline at end of file + \input{6_implementation/db_exp.tex} + \input{6_implementation/mysql_index.tex} diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index 2f1feda..fb15abb 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -1,12 +1,12 @@ \section{Implementation} \label{sec:Implementation} -Vor der Implementation ist die Entscheidung der Auswahl der Einzelkomponenten, welche im Abschnitt \ref{Architektur} vorgestellt wurden, zu treffen. -\\ \\ -Zuerst ist die Programmiersprache sowie das genutzte Framework zu definieren. -Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. -Mit diesem lassen sich unter anderem API-Services bauen. -ASP.NET hat mit Visual Studio auch direkt eine Entwicklungsumgebung sowie Debugging Möglichkeiten. -Weiterhin gibt es die Möglichkeit die eingebette NoSQL-Datenbak LiteDB zu nutzen. -Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. -\\ \\ -Es wurden weiterhin verschiedene Experimente vorgenommen um Teile der Architektur und deren Implementation durch verschiedene Softwarekomponenten zu Vergleichen. -\input{6_implementation/experiments.tex} \ No newline at end of file + Vor der Implementation steht die Entscheidung über die Auswahl der Einzelkomponenten, welche im Abschnitt \ref{sec:Architektur} vorgestellt wurden. + \\ \\ + Zuerst ist die Programmiersprache sowie das genutzte Framework zu definieren. + Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. + Mit diesem lassen sich unter anderem API-Services bauen. + Mittels der für das .NET Framework expliziet vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. + Für .NET gibt es ein \textit{embedded NoSQL-Document-Store} -- LiteDB. % TODO: https://www.litedb.org/ + Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. + \\ \\ + Es wurden weiterhin verschiedene Experimente vorgenommen um Teile der Architektur und deren Implementation durch verschiedene Softwarekomponenten zu Vergleichen. + \input{6_implementation/experiments.tex} diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex new file mode 100644 index 0000000..084b222 --- /dev/null +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -0,0 +1,2 @@ +\subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} + MySQL Indexierung \ No newline at end of file From e350a1a64f3f5e4566cca5196f11c8eadb962784 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:31:53 +0200 Subject: [PATCH 15/60] structure update latex --- .../latex/4_other_work/other_work.tex | 19 ++--- .../latex/5_concept/architecture.tex | 71 +++++++++++++++---- documentation/latex/5_concept/features.tex | 18 ++--- documentation/latex/5_concept/results.tex | 4 ++ documentation/latex/5_concept/risks.tex | 4 ++ .../latex/7_verification/verification.tex | 3 + .../latex/8_discussion/discussion.tex | 9 +++ .../latex/subsections/motivation.tex | 8 ++- 8 files changed, 103 insertions(+), 33 deletions(-) diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 335d264..1dba481 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1,9 +1,12 @@ \section{Andere Arbeiten} \label{sec:Andere} -Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. -Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. -Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. -Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen, besser einzuschätzen. -\input{4_other_work/nist.tex} -\input{4_other_work/dependa.tex} -\input{4_other_work/snyk.tex} -\input{4_other_work/owasp.tex} \ No newline at end of file + \textcolor{red}{ + \textbf{\textit{\texttt{WISSENSCHAFTLICHE ARBEITEN BETRACHTEN}}} + } + Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. + Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. + Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. + Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen, besser einzuschätzen. + \input{4_other_work/nist.tex} + \input{4_other_work/dependa.tex} + \input{4_other_work/snyk.tex} + \input{4_other_work/owasp.tex} diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index f5121a8..db7d6f3 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -1,16 +1,57 @@ \subsection{Architektur} \label{sec:Architektur} -Um eine API umzusetzen sind verschiedene Komponenten nötig: -\begin{enumerate} - \item \textbf{Datenbank} \\ - In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. - Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. - Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. - \item \textbf{Controller} \\ - Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. - Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. - \item \textbf{Datenmodelle} \\ - Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. - \item \textbf{Konvertierung von und in JSON} \\ - Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. - Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. -\end{enumerate} \ No newline at end of file + Um eine API umzusetzen sind verschiedene Komponenten nötig: + \begin{enumerate} + \item \textbf{Datenbank} \\ + In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. + Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. + Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. + \item \textbf{Controller} \\ + Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. + Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. + \item \textbf{Datenmodelle} \\ + Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. + \item \textbf{Konvertierung von und in JSON} \\ + Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. + Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. + \end{enumerate} + + \textcolor{red}{ + 5. bleibt Architektur, 6. API (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Verifikation V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Verifikation V2 (Unterschiede zu V1 betrachten und) + \begin{enumerate} + \item Architektur V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für API (inklusive DB darin) + \begin{itemize} + \item removed Controller-Endpoints: + \item Db/CheckRawDir (check if the downloaded cve-dir is ready to convert) + \item Db/ConvertRawDirToDb (Convert the downloaded cve to LiteDB) + \item Git/cloneStatus (if the current clone is finished) + \end{itemize} + \item Verifikation V1, sind die Ausgaben den Vorgaben entsprechend (funktional) + \begin{itemize} + \item api/Db/checkSinglePackage + \item api/Db/checkPackageList + \item api/Dependecies/ExtractTree + \item api/Dependecies/ExtractAndAnalyzeTree + \end{itemize} + \item Verifikation V1 (nicht-funktional) + \begin{itemize} + \item Skalierbarkeit und Laufzeiteffizienz (siehe risks.tex) + \item JSON-LD (Branch: 30-json-ld...) + \item GEGENCHECK BEI UNS VS NIST API ODER ANDERE CVE DATENBANK + \end{itemize} + \item Experimente + \begin{itemize} + \item Laufzeitmessungen LiteDB (Mono vs. Pipe -- schon schneller, aber nicht genug $\rightarrow$ fragments/searchStatistics.md) + \item conclusio geht es schneller mit einer relationalen Datenbank? + \end{itemize} + \item Architektur V2 (MySQL) + \begin{itemize} + \item Was hat sich geändert -- nur code, Endpunkte identisch, oder die 3 oberen entfernt + \item neuer Container für die DB + \end{itemize} + \item Verifikation V2 + \begin{itemize} + \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt + \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md + \end{itemize} + \end{enumerate} + } diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex index bf3332e..0ee08f5 100644 --- a/documentation/latex/5_concept/features.tex +++ b/documentation/latex/5_concept/features.tex @@ -1,10 +1,10 @@ \subsection{Funktionalitäten} \label{sec:Funktionalitäten} -Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. -\begin{enumerate} - \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. - \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. - \item Clonen eines Repositories von Github. - \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. - \item Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. -\end{enumerate} -Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. + Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. + \begin{enumerate} + \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. + \item Clonen eines Repositories von Github. + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. + \item Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. + \end{enumerate} + Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index 14cc076..9c105df 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -10,3 +10,7 @@ \subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ Die entstehende API soll dem Nutzer letztendlich dabei helfen, eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Abhängigkeit zu fällen. \end{enumerate} + + \textcolor{red}{ + Ewartete Ergebnisse zu Zielsetzung oder abgeleiteten Zielen + } diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex index 90d1d49..c02dec3 100644 --- a/documentation/latex/5_concept/risks.tex +++ b/documentation/latex/5_concept/risks.tex @@ -16,3 +16,7 @@ \subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderun \item[IV) Performance sowie Skalierbarkeit]\hfill \\ Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? \end{description} + + \textcolor{red}{ + this weg zu 8. Diskussion und 5.3/5.4 Herausforderungen: Nichtfkt und fkt Anforderungen aussortieren (Performance --> nichtfkt Anf, Skalierbarkeit --> Diskussion) + } diff --git a/documentation/latex/7_verification/verification.tex b/documentation/latex/7_verification/verification.tex index 0a158db..1827192 100644 --- a/documentation/latex/7_verification/verification.tex +++ b/documentation/latex/7_verification/verification.tex @@ -1 +1,4 @@ \section{Verifikation} \label{sec:Verifikation} + \textcolor{red}{ + nicht mehr nötig, ist in konzept + } diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/8_discussion/discussion.tex index d368824..ed81f34 100644 --- a/documentation/latex/8_discussion/discussion.tex +++ b/documentation/latex/8_discussion/discussion.tex @@ -1 +1,10 @@ \section{Diskussion} \label{sec:Diskussion} + \textcolor{red}{ + \begin{itemize} + \item CVE Datenmodell 2014 umgeändert? + \item Manche Pakete haben keine Designation? $\rightarrow$ Bereinigen? Wie kann man damit umgehen? + \item Risiken ausführlich betrachten, Kritik, dort kann man weitermachen/müsste man, was hat man nicht in dieser Arbeit adressiert? (alle Programmiersprachen) + \item Diskussion aus verifizierten Sachen raus + \item !!! FUTURE WORK + \end{itemize} + } diff --git a/documentation/latex/subsections/motivation.tex b/documentation/latex/subsections/motivation.tex index bc16685..1f3823a 100644 --- a/documentation/latex/subsections/motivation.tex +++ b/documentation/latex/subsections/motivation.tex @@ -25,4 +25,10 @@ \subsection{Motivation} \label{subsec:Motivation} \item Sicherheit\\ Um die Gesamtsicherheit einer Applikation bestmöglich zu gewährleisten trägt ein solches Tool, welches Schwachstellen und Abhängigkeiten auch in tieferen Ebenen von Abhängigkeiten darstellt, zur Identifikation und Vermeidung von Sicherheitslücken bei. \end{enumerate} - Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file + Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. + + \textcolor{red}{ + \begin{itemize} + \item Forschungsfragennennung in Motivation! ABER nicht erklären/ausführen. + \end{itemize} + } From b1892828c7f95fbad736a8e5f2ac876f1973af1b Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Mon, 8 Apr 2024 20:56:34 +0200 Subject: [PATCH 16/60] changed structure --- .../latex/2_motivation/motivation.tex | 13 ++++- .../latex/3_definitions/definitions.tex | 6 +- documentation/latex/4_other_work/demyst.tex | 8 +++ documentation/latex/4_other_work/dependa.tex | 2 +- documentation/latex/4_other_work/nist.tex | 2 +- documentation/latex/4_other_work/on_t_eff.tex | 5 ++ .../latex/4_other_work/other_work.tex | 8 ++- documentation/latex/4_other_work/owasp.tex | 2 +- .../latex/4_other_work/repos_vul.tex | 9 +++ documentation/latex/4_other_work/snyk.tex | 2 +- .../latex/5_concept/architecture.tex | 55 +------------------ .../latex/5_concept/architecture_1.tex | 47 ++++++++++++++++ .../latex/5_concept/architecture_2.tex | 6 ++ documentation/latex/5_concept/concept.tex | 19 +++---- documentation/latex/5_concept/features.tex | 3 +- documentation/latex/5_concept/func.tex | 11 ++++ documentation/latex/5_concept/non_func.tex | 6 ++ documentation/latex/5_concept/questions.tex | 42 ++++++-------- documentation/latex/5_concept/results.tex | 8 +-- documentation/latex/5_concept/risks.tex | 22 -------- .../latex/6_implementation/experiments.tex | 5 ++ .../latex/6_implementation/implementation.tex | 15 ++--- .../6_implementation/implementation_1.tex | 26 +++++++++ .../6_implementation/implementation_2.tex | 6 ++ .../latex/6_implementation/verification_1.tex | 8 +++ .../latex/6_implementation/verification_2.tex | 6 ++ .../latex/7_verification/verification.tex | 4 -- .../latex/8_discussion/discussion.tex | 7 +++ documentation/latex/lib/bib.bib | 11 +++- documentation/latex/main.tex | 12 +++- 30 files changed, 230 insertions(+), 146 deletions(-) create mode 100644 documentation/latex/4_other_work/demyst.tex create mode 100644 documentation/latex/4_other_work/on_t_eff.tex create mode 100644 documentation/latex/4_other_work/repos_vul.tex create mode 100644 documentation/latex/5_concept/architecture_1.tex create mode 100644 documentation/latex/5_concept/architecture_2.tex create mode 100644 documentation/latex/5_concept/func.tex create mode 100644 documentation/latex/5_concept/non_func.tex delete mode 100644 documentation/latex/5_concept/risks.tex create mode 100644 documentation/latex/6_implementation/implementation_1.tex create mode 100644 documentation/latex/6_implementation/implementation_2.tex create mode 100644 documentation/latex/6_implementation/verification_1.tex create mode 100644 documentation/latex/6_implementation/verification_2.tex delete mode 100644 documentation/latex/7_verification/verification.tex diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index ca94157..45fe3c1 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -10,10 +10,17 @@ \section{Motivation} \label{subsec:Motivation} Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv -- schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. \\ \\ - Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. + Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken ganzer Projekte bietet. Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. - \\ \\ + Hieraus ergiben sich folgende Forschungsfragen: + \begin{enumerate} + \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} + \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{two} + \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} + \item \textbf{Wie kann ein solches Tool leistungsstärker und laufzeiteffizienter werden?} \label{four} + \end{enumerate} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. - Dieses Werkzeug hilft also bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. \ No newline at end of file + Dieses Werkzeug hilft also bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. + \ No newline at end of file diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 6b4d7d0..6560742 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -34,7 +34,7 @@ \section{Definitionen} \label{sec:Definitionen} JSON wird häufig für die Übertragung von Daten zwischen Client und Server. Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ähnlich der von C, C++ oder C\#. - \item \textbf{Container:} \\ - \item \textbf{Kubernetes:} \\ - \item \textbf{CI/CD:} \\ + \item \textbf{JSON-LD (JSON-Linked Data):} \\ + JSON-LD ist ein Linked-Data-Format, welches auf dem JSON-Format basiert. + Dieses Linked-Data-Format ermöglicht es ein standardisiertes, maschinenlesbares Datennetzwerk über Websites hinweg zu schaffen. \end{itemize} \ No newline at end of file diff --git a/documentation/latex/4_other_work/demyst.tex b/documentation/latex/4_other_work/demyst.tex new file mode 100644 index 0000000..64159f6 --- /dev/null +++ b/documentation/latex/4_other_work/demyst.tex @@ -0,0 +1,8 @@ +\subsubsection{Demystifying Vulnerability Propagation} \label{sec:DVP} +Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq~von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. +Betrachtet wurden auch Versionierungen von Paketen. +Es wurde ein kompletter Abhängigkeits-Wissensgraph des NPM-Ökosystems aufgestellt, welcher dann zum identifizieren von Schwachstellen sowie deren Propagation genutzt wurde. +Das entwickelte \glqq DVReme\grqq~Tool verfolgt Pakete und ihre Abhängigkeiten zurück und sucht diese nach Schwachstellen ab. +Ergebnis der Studie war, dass 20\% der Bibliotheken im NPM-Ökosystem Schachstellen aufweisen. +30\% dieser Bibliotheken enthalten Schwachstellen aus direkten Abhängigkeiten. +Ein weiterer Fund war, dass je länger eine bekannte Schachstelle offen bleibt desto mehr Pakete sind im gesamten Abhängigkeitsbaum des NPM-Ökosystems betroffen davon. \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index e2e21a5..fdfd390 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,4 +1,4 @@ -\subsection{Github Dependa Bot} \label{sec:Dependa} +\subsubsection{Github Dependa Bot} \label{sec:Dependa} Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. \\ \\ diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index 6b808cb..3490392 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,4 +1,4 @@ -\subsection{NIST-API} \label{sec:NIST-API} +\subsubsection{NIST-API} \label{sec:NIST-API} Das \glqq National Institute of Standards and Technology\grqq~(NIST) bietet zwei CVE-API's an. Diese sind die CVE-API und die CVE-Change-History-API. \\ \\ diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex new file mode 100644 index 0000000..621a9c5 --- /dev/null +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -0,0 +1,5 @@ +\subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label{sec:Transitivity} +Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq~von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. +Dabei wurde auf direkte sowie transitive Abhängigkeiten geachtet und die Verteilung von Sicherheitslücken im Datensatz betrachtet. +Analysiert wurden weiterhin die Erreichbarkeit der Sicherheitslücken mit dem Ergebnis, dass nur etwa 1\% der transitiven Abhängigkeiten mit Sicherheitslücken diese ausweisen. +Dazu wurde eine Datenverarbeitungspipeline implementiert, wobei der Abhängigkeitsdatensatz in einem Wissensgraph dargestellt und analsiert wurde. \ No newline at end of file diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 1dba481..d107a98 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1,12 +1,14 @@ \section{Andere Arbeiten} \label{sec:Andere} - \textcolor{red}{ - \textbf{\textit{\texttt{WISSENSCHAFTLICHE ARBEITEN BETRACHTEN}}} - } Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen, besser einzuschätzen. + \subsection{Softwaretools} \label{subsec:Softwaretools} \input{4_other_work/nist.tex} \input{4_other_work/dependa.tex} \input{4_other_work/snyk.tex} \input{4_other_work/owasp.tex} + \subsection{Wissenschaftliche Arbeiten} \label{subsec:Wiss_Arbeiten} + \input{4_other_work/repos_vul.tex} + \input{4_other_work/on_t_eff.tex} + \input{4_other_work/demyst.tex} \ No newline at end of file diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index f5047ca..3b9fd79 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,4 +1,4 @@ -\subsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} +\subsubsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger CVE-Nummer erstellt. \\ \\ diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex new file mode 100644 index 0000000..3b9cc05 --- /dev/null +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -0,0 +1,9 @@ +\subsubsection{ReposVul} \label{sec:ReposVul} +Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Repositorie basis Schwachstellendatensätze konstruiert. +Hierbei wird zwischen Code-Änderungen und Patches zu Schwachstellen unterschieden, Aufrufbeziehungen von Schwachstellen extrahiert und ein Filtermodul für veraltete Patches bereitgestellt. +Analysiert wurden unter anderem auch transitive Abhängigkeiten +Es wurden in dieser Analyse C++, C, Java und Python als Programmiersprachen betrachtet und über 1491 Projekte ausgewertet. +% \\ +% Als wesentlicher Unterschied zu dieser Arbeit ist, dass die Resultatdaten nicht als Abhängigkeitsbaum dargestellt sind. +% Weiterhin ist ein Framework und kein Servive, wie z.B. eine API, zur Verfügung gestellt und somit nicht direkt in Entwicklungsprozesse zu integrieren. +% Resultatdaten werden im JSON Lines-Format ausgegeben und nicht als standardisiertes, maschinenlesbares JSON-LD, womit sie nicht direkt weiterverwendbar sind. diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index 2b65d99..93f01e5 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -1,4 +1,4 @@ -\subsection{Snyk} \label{sec:Snyk} +\subsubsection{Snyk} \label{sec:Snyk} Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. \\ \\ diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index db7d6f3..fd40919 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -1,57 +1,6 @@ \subsection{Architektur} \label{sec:Architektur} - Um eine API umzusetzen sind verschiedene Komponenten nötig: - \begin{enumerate} - \item \textbf{Datenbank} \\ - In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. - Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. - Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. - \item \textbf{Controller} \\ - Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. - Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. - \item \textbf{Datenmodelle} \\ - Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. - \item \textbf{Konvertierung von und in JSON} \\ - Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. - Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. - \end{enumerate} - + \input{5_concept/architecture_1.tex} + \input{5_concept/architecture_2.tex} \textcolor{red}{ 5. bleibt Architektur, 6. API (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Verifikation V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Verifikation V2 (Unterschiede zu V1 betrachten und) - \begin{enumerate} - \item Architektur V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für API (inklusive DB darin) - \begin{itemize} - \item removed Controller-Endpoints: - \item Db/CheckRawDir (check if the downloaded cve-dir is ready to convert) - \item Db/ConvertRawDirToDb (Convert the downloaded cve to LiteDB) - \item Git/cloneStatus (if the current clone is finished) - \end{itemize} - \item Verifikation V1, sind die Ausgaben den Vorgaben entsprechend (funktional) - \begin{itemize} - \item api/Db/checkSinglePackage - \item api/Db/checkPackageList - \item api/Dependecies/ExtractTree - \item api/Dependecies/ExtractAndAnalyzeTree - \end{itemize} - \item Verifikation V1 (nicht-funktional) - \begin{itemize} - \item Skalierbarkeit und Laufzeiteffizienz (siehe risks.tex) - \item JSON-LD (Branch: 30-json-ld...) - \item GEGENCHECK BEI UNS VS NIST API ODER ANDERE CVE DATENBANK - \end{itemize} - \item Experimente - \begin{itemize} - \item Laufzeitmessungen LiteDB (Mono vs. Pipe -- schon schneller, aber nicht genug $\rightarrow$ fragments/searchStatistics.md) - \item conclusio geht es schneller mit einer relationalen Datenbank? - \end{itemize} - \item Architektur V2 (MySQL) - \begin{itemize} - \item Was hat sich geändert -- nur code, Endpunkte identisch, oder die 3 oberen entfernt - \item neuer Container für die DB - \end{itemize} - \item Verifikation V2 - \begin{itemize} - \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt - \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md - \end{itemize} - \end{enumerate} } diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex new file mode 100644 index 0000000..22d3188 --- /dev/null +++ b/documentation/latex/5_concept/architecture_1.tex @@ -0,0 +1,47 @@ +\subsubsection{Architektur V1} \label{sec:Architektur} + Um eine API umzusetzen und diese zu nutzen sind verschiedene Komponenten nötig: + \begin{enumerate} + \item \textbf{Framework} \label{arch_1}\\ + Als API-Grundlage muss ein passendes Framework genutzt werden. + Dadurch, dass keine Notwendigkeit für ein Frontend besteht gibt es hier wenig Eingrenzungen. + \\ \\ + Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. + Mit diesem lassen sich unter anderem API-Services bauen. + Mittels der für das .NET Framework expliziet vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. + Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. + \item \textbf{Datenbank} \label{arch_2}\\ + In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. + Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. + Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. + \\ \\ + Durch die Wahl des Frameworks auf ASP.NET ist es möglich einen \textit{embedded NoSQL-Document-Store} -- LiteDB zu nutzen. % TODO: https://www.litedb.org/ + Diese ist leicht intern nutzbar und muss nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der API mit enthalten ist. + \item \textbf{Controller} \label{arch_3}\\ + Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. + Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. + \\ \\ + Notwendig sind hier view Controller. + Für die Forschungsfrage \ref{one} bzw. \ref{three} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. + In diesem sind Endpunkte zum clonen des CVE-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK + \\ + Weiterhin ist ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. + \\ + Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer Endpunkt zu implementieren. + In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. + \\ + Für Forschungsfrage \ref{two} muss in jedem Endpunkt bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. + Weiterhin sind durch einen Controller die Rückgabedaten zu dokumentieren. + Dazu ist zwischen Softwarepaketen und CVE-Einträgen zu unterscheiden. + \item \textbf{Datenmodelle} \label{arch_4}\\ + Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. + \item \textbf{Konvertierung von und in JSON} \label{arch_5}\\ + Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. + Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. + \\ \\ + Dies muss in den jeweiligen Controllern geschehen. + Damit die Daten besser weiterverwendbar sind muss zusätzlich ein Kontext \glqq @context\grqq~hinzugefügt werden. + \item \textbf{Container} \\ + Um die API unabhängig von der Umgebung und möglichst Speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. + \\ \\ + Für den bau der Containers wird Docker-Compose genutzt. + \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex new file mode 100644 index 0000000..3e17c5e --- /dev/null +++ b/documentation/latex/5_concept/architecture_2.tex @@ -0,0 +1,6 @@ +\subsubsection{Architektur V2} \label{sec:Architektur} + Aus den Ergebnissen des Experiments, aus Kapitel \ref{...}, werden folgende Anpassungen an der Achitektur vorgenommen: + \begin{enumerate} + \item \textbf{Datenbank} \\ + Nutzung der SQL-Datenbank MySQL anstatt der eingebetteten No-SQL-Datenbank LiteDB. + \end{enumerate} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 9464505..9aa1c27 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -1,11 +1,10 @@ \section{Konzept} \label{sec:Konzept} -Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. -Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. -Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. -Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. -\input{5_concept/questions.tex} -\input{5_concept/architecture.tex} -\input{5_concept/features.tex} -\input{5_concept/special_attr.tex} -\input{5_concept/results.tex} -\input{5_concept/risks.tex} \ No newline at end of file + Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. + Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. + Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. + Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. + \input{5_concept/questions.tex} + \input{5_concept/features.tex} + \input{5_concept/special_attr.tex} + \input{5_concept/results.tex} + \input{5_concept/architecture.tex} \ No newline at end of file diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex index 0ee08f5..f6e4a08 100644 --- a/documentation/latex/5_concept/features.tex +++ b/documentation/latex/5_concept/features.tex @@ -1,4 +1,5 @@ -\subsection{Funktionalitäten} \label{sec:Funktionalitäten} +\subsection{Anforderungen} \label{sec:Anforderungen} + Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. \begin{enumerate} \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex new file mode 100644 index 0000000..24705ca --- /dev/null +++ b/documentation/latex/5_concept/func.tex @@ -0,0 +1,11 @@ +\subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} + Bei der Umsetzung dieser API sind verschidene funktuinale Anforderungen zu implementieren. + \begin{enumerate} + \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. + \item Clonen eines Repositories von Github. + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. + \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. + \item Aktualisierung der Schwachstellendatenbasis + \end{enumerate} + Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex new file mode 100644 index 0000000..74e36e4 --- /dev/null +++ b/documentation/latex/5_concept/non_func.tex @@ -0,0 +1,6 @@ +\subsubsection{Nicht funktionale Anforderungen} \label{sec:N_Anforderungen} + Bei der Umsetzung dieser API sind verschidene nichtunktionale Anforderungen umzusetzen. + \begin{itemize} + \item Performance sowie Skalierbarkeit der Anwendung + \item + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index 36e4ae9..50d67b9 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -1,25 +1,19 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} -Folgende Forschungsfragen werden in dieser Arbeit betrachtet: -\begin{enumerate} - \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} - \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{two} - \item \textbf{Wie ist eine Schwachstellenanalyse-API in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} - \item \textbf{Wie kann eine solche API leistungsstärker und laufzeiteffizienter werden?} \label{four} -\end{enumerate} -Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. -Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. -Zusätzlich auch die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. -Je nachdem, ob eine Menge an Abhängigkeiten oder ein ganzes Repositoriy durchsucht werden muss müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. -Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. -\\ \\ -Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. -Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. -\\ \\ -Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. -Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das Endpunktdokumentations- und Testmöglichkeitstool. -Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. -Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. -\\ \\ -Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. -Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. -Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file + Folgende Forschungsfragen werden in dieser Arbeit betrachtet: + Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. + Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. + Zusätzlich auch die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. + Je nachdem, ob eine Menge an Abhängigkeiten oder ein ganzes Repositoriy durchsucht werden muss müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. + Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. + \\ \\ + Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. + Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. + \\ \\ + Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. + Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das Endpunktdokumentations- und Testmöglichkeitstool. + Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. + Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. + \\ \\ + Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. + Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. + Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index 9c105df..32a88a0 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -1,4 +1,4 @@ -\subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} +\subsection{Zielsetzung} \label{sec:Zielsetzung} Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: \begin{enumerate} \item \textbf{Entwicklung einer funktionsfähigen API} \\ @@ -9,8 +9,4 @@ \subsection{Erwartete Ergebnisse} \label{sec:Erwartete Ergebnisse} Bei Analyse eines Repositories sollen alle Abhängigkeiten dieses mit dessen Abhängigkeiten aufgezeigt werden. \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ Die entstehende API soll dem Nutzer letztendlich dabei helfen, eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Abhängigkeit zu fällen. - \end{enumerate} - - \textcolor{red}{ - Ewartete Ergebnisse zu Zielsetzung oder abgeleiteten Zielen - } + \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/risks.tex b/documentation/latex/5_concept/risks.tex deleted file mode 100644 index c02dec3..0000000 --- a/documentation/latex/5_concept/risks.tex +++ /dev/null @@ -1,22 +0,0 @@ -\subsection{Risiken und Herausforderungen} \label{sec:Risiken und Herausforderungen} - Risiken: - \begin{itemize} - \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden - \item Abhängigkeit vom CVE-Daten Provider - \item Sicherheitslücken in der API selbst - \end{itemize} - Herausforderungen: - \begin{description} - \item[I) Extrahieren der Abhängigkeitsgraphen]\hfill \\ - Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - \item[II) Unterschiede zwischen Frameworks und Programmiersprachen]\hfill \\ - Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - \item[III) Aktualität der Schwachstellendaten]\hfill \\ - Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - \item[IV) Performance sowie Skalierbarkeit]\hfill \\ - Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - \end{description} - - \textcolor{red}{ - this weg zu 8. Diskussion und 5.3/5.4 Herausforderungen: Nichtfkt und fkt Anforderungen aussortieren (Performance --> nichtfkt Anf, Skalierbarkeit --> Diskussion) - } diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index 6c3baf7..408f1ea 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,3 +1,8 @@ \subsection{Experimente} \label{sec:Experimente} \input{6_implementation/db_exp.tex} \input{6_implementation/mysql_index.tex} + Experimente + \begin{itemize} + \item Laufzeitmessungen LiteDB (Mono vs. Pipe -- schon schneller, aber nicht genug $\rightarrow$ fragments/searchStatistics.md) + \item conclusio geht es schneller mit einer relationalen Datenbank? + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index fb15abb..fa0fec2 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -1,12 +1,7 @@ \section{Implementation} \label{sec:Implementation} - Vor der Implementation steht die Entscheidung über die Auswahl der Einzelkomponenten, welche im Abschnitt \ref{sec:Architektur} vorgestellt wurden. - \\ \\ - Zuerst ist die Programmiersprache sowie das genutzte Framework zu definieren. - Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. - Mit diesem lassen sich unter anderem API-Services bauen. - Mittels der für das .NET Framework expliziet vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. - Für .NET gibt es ein \textit{embedded NoSQL-Document-Store} -- LiteDB. % TODO: https://www.litedb.org/ - Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. - \\ \\ - Es wurden weiterhin verschiedene Experimente vorgenommen um Teile der Architektur und deren Implementation durch verschiedene Softwarekomponenten zu Vergleichen. + \input{6_implementation/implementation_1.tex} + \input{6_implementation/verification_1.tex} \input{6_implementation/experiments.tex} + \input{6_implementation/implementation_2.tex} + \input{6_implementation/verification_2.tex} + diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex new file mode 100644 index 0000000..62a699e --- /dev/null +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -0,0 +1,26 @@ +\subsection{Implementation V1} \label{sec:Implementation1} + Folgende Komponenten wurden für die erste Implementation genutzt: + \begin{itemize} + \item ASP.NET (C\#) + \item LiteDB + \item Docker-Compose + \end{itemize} + Die genutze Datenbank LiteDB wurde folgend genutzt:\\ %TODO + Folgende Datenmodelle wurden zur Nutzung der Daten in der Datenbank angelegt:\\ %TODO + Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: + \begin{itemize} + \item Db \\ + Die in der Architektur (Vgl. \ref{arch_2}) + \item Dependecies + \item Git + \item MySqlConnection + \item View + \end{itemize} + + Implementation V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für API (inklusive DB darin) + \begin{itemize} + \item removed Controller-Endpoints: + \item Db/CheckRawDir (check if the downloaded cve-dir is ready to convert) + \item Db/ConvertRawDirToDb (Convert the downloaded cve to LiteDB) + \item Git/cloneStatus (if the current clone is finished) + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation_2.tex b/documentation/latex/6_implementation/implementation_2.tex new file mode 100644 index 0000000..4f40ca5 --- /dev/null +++ b/documentation/latex/6_implementation/implementation_2.tex @@ -0,0 +1,6 @@ +\subsection{Implementation V2} \label{sec:Implementation2} + Implementation V2 (MySQL) + \begin{itemize} + \item Was hat sich geändert -- nur code, Endpunkte identisch, oder die 3 oberen entfernt + \item neuer Container für die DB + \end{itemize} diff --git a/documentation/latex/6_implementation/verification_1.tex b/documentation/latex/6_implementation/verification_1.tex new file mode 100644 index 0000000..b7725ab --- /dev/null +++ b/documentation/latex/6_implementation/verification_1.tex @@ -0,0 +1,8 @@ +\subsection{Verifikation V1} \label{sec:Ver1} + Verifikation V1, sind die Ausgaben den Vorgaben entsprechend (funktional) + \begin{itemize} + \item api/Db/checkSinglePackage + \item api/Db/checkPackageList + \item api/Dependecies/ExtractTree + \item api/Dependecies/ExtractAndAnalyzeTree + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/verification_2.tex b/documentation/latex/6_implementation/verification_2.tex new file mode 100644 index 0000000..3c4660f --- /dev/null +++ b/documentation/latex/6_implementation/verification_2.tex @@ -0,0 +1,6 @@ +\subsection{Verifikation V2} \label{sec:Ver2} + Verifikation V2 + \begin{itemize} + \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt + \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/7_verification/verification.tex b/documentation/latex/7_verification/verification.tex deleted file mode 100644 index 1827192..0000000 --- a/documentation/latex/7_verification/verification.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Verifikation} \label{sec:Verifikation} - \textcolor{red}{ - nicht mehr nötig, ist in konzept - } diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/8_discussion/discussion.tex index ed81f34..255826c 100644 --- a/documentation/latex/8_discussion/discussion.tex +++ b/documentation/latex/8_discussion/discussion.tex @@ -6,5 +6,12 @@ \section{Diskussion} \label{sec:Diskussion} \item Risiken ausführlich betrachten, Kritik, dort kann man weitermachen/müsste man, was hat man nicht in dieser Arbeit adressiert? (alle Programmiersprachen) \item Diskussion aus verifizierten Sachen raus \item !!! FUTURE WORK + \item Paper: On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem \end{itemize} } + Risiken: + \begin{itemize} + \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden + \item Abhängigkeit vom CVE-Daten Provider + \item Sicherheitslücken in der API selbst + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 8dfcbd9..fea5007 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -26,6 +26,9 @@ @online{link: % Def JSON % https://www.json.org/json-en.html +% Def JSON-LD +% https://json-ld.org/ + % NIST % https://nvd.nist.gov/developers/vulnerabilities @@ -36,4 +39,10 @@ @online{link: % https://docs.snyk.io/getting-started % OWASP Dependency-Check -% https://owasp.org/www-project-dependency-check/ \ No newline at end of file +% https://owasp.org/www-project-dependency-check/ + +% Wiss1: ReposVul: A Repository-Level High-Quality Vulnerability Dataset +% https://arxiv.org/abs/2401.13169 + +% Wiss2: Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem +% https://www.semanticscholar.org/paper/Demystifying-the-Vulnerability-Propagation-and-Its-Liu-Chen/63c8044efacec1b39a28fbde5889bc75f473bd46 \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index fa8a208..bcf26de 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -149,14 +149,22 @@ \newpage \input{1_abstract/abstract.tex} + \newpage \input{2_motivation/motivation.tex} + \newpage \input{3_definitions/definitions.tex} + \newpage \input{4_other_work/other_work.tex} + \newpage \input{5_concept/concept.tex} + \newpage \input{6_implementation/implementation.tex} - \input{7_verification/verification.tex} + \newpage + % \input{7_verification/verification.tex} + % \newpage \input{8_discussion/discussion.tex} - \input{9_summary/summary.tex} + \newpage + \input{9_summary/summary.tex} % \input{sections/einleitung.tex} % \input{sections/recherche.tex} From 46b4a0bd22000c03d69016240b8271ab70d4ac45 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Fri, 12 Apr 2024 11:59:12 +0200 Subject: [PATCH 17/60] added functional and non funtional req, changed research questions --- .../latex/2_motivation/motivation.tex | 9 +++--- .../latex/5_concept/architecture_1.tex | 9 +++--- .../latex/5_concept/architecture_2.tex | 21 ++++++++++--- documentation/latex/5_concept/concept.tex | 3 +- documentation/latex/5_concept/features.tex | 11 ------- documentation/latex/5_concept/func.tex | 15 +++++----- documentation/latex/5_concept/non_func.tex | 13 ++++---- documentation/latex/5_concept/questions.tex | 30 ++++++++++++------- .../latex/6_implementation/db_exp.tex | 2 +- .../latex/6_implementation/mysql_index.tex | 4 ++- 10 files changed, 69 insertions(+), 48 deletions(-) delete mode 100644 documentation/latex/5_concept/features.tex diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index 45fe3c1..db1fc46 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -15,10 +15,11 @@ \section{Motivation} \label{subsec:Motivation} Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. Hieraus ergiben sich folgende Forschungsfragen: \begin{enumerate} - \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{one} - \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{two} - \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{three} - \item \textbf{Wie kann ein solches Tool leistungsstärker und laufzeiteffizienter werden?} \label{four} + \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?} \label{q:one} + \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{q:two} + \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{q:three} + \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{q:four} + \item \textbf{Wie kann ein solches Tool leistungsstärker und laufzeiteffizienter werden?} \label{q:five} \end{enumerate} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index 22d3188..e1de722 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -1,5 +1,5 @@ \subsubsection{Architektur V1} \label{sec:Architektur} - Um eine API umzusetzen und diese zu nutzen sind verschiedene Komponenten nötig: + Für die Beantwortung der Forschungsfragen \ref{q:one}, \ref{q:two}, \ref{q:five} und vor allem \ref{q:four} verschiedene Komponenten nötig: \begin{enumerate} \item \textbf{Framework} \label{arch_1}\\ Als API-Grundlage muss ein passendes Framework genutzt werden. @@ -21,7 +21,7 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. \\ \\ Notwendig sind hier view Controller. - Für die Forschungsfrage \ref{one} bzw. \ref{three} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. + Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. In diesem sind Endpunkte zum clonen des CVE-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK \\ Weiterhin ist ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. @@ -29,7 +29,7 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer Endpunkt zu implementieren. In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. \\ - Für Forschungsfrage \ref{two} muss in jedem Endpunkt bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. + Für Forschungsfrage \ref{q:three} muss in jedem Endpunkt bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. Weiterhin sind durch einen Controller die Rückgabedaten zu dokumentieren. Dazu ist zwischen Softwarepaketen und CVE-Einträgen zu unterscheiden. \item \textbf{Datenmodelle} \label{arch_4}\\ @@ -44,4 +44,5 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Um die API unabhängig von der Umgebung und möglichst Speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. \\ \\ Für den bau der Containers wird Docker-Compose genutzt. - \end{enumerate} \ No newline at end of file + \end{enumerate} + Weiterhin muss das JSON-LD-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex index 3e17c5e..e177d56 100644 --- a/documentation/latex/5_concept/architecture_2.tex +++ b/documentation/latex/5_concept/architecture_2.tex @@ -1,6 +1,19 @@ \subsubsection{Architektur V2} \label{sec:Architektur} - Aus den Ergebnissen des Experiments, aus Kapitel \ref{...}, werden folgende Anpassungen an der Achitektur vorgenommen: + Aus den Ergebnissen der Experimente, aus Kapitel \ref{sec:ExperimenteDB} und \ref{sec:MySQL_Indexierung}, werden folgende Anpassungen an der Achitektur vorgenommen: \begin{enumerate} - \item \textbf{Datenbank} \\ - Nutzung der SQL-Datenbank MySQL anstatt der eingebetteten No-SQL-Datenbank LiteDB. - \end{enumerate} + \item \textbf{Datenbank} + \begin{itemize} + \item Nutzung der SQL-Datenbank MySQL anstatt der eingebetteten No-SQL-Datenbank LiteDB + \item Erstellung einer Tabelle für Cve-Nummern, eine für heruntergeladene Repositories + \item Indexierung in der MySQL-Datenbank auf Spalte \glqq designation\grqq~bzw. Paketname + \end{itemize} + \item \textbf{Controller} + \begin{itemize} + \item Datenbankabfragen per SQL-Query anstatt internen Query-Builder für LiteDB + \end{itemize} + \item \textbf{Controller} + \begin{itemize} + \item Containerisierung von nicht nur der API sondern auch der MySQL-Datenbank + \item Herstellung einer Verbindung über das interne Docker-Netzwerk + \end{itemize} + \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 9aa1c27..47e0da0 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -3,8 +3,9 @@ \section{Konzept} \label{sec:Konzept} Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. + \input{5_concept/func.tex} + \input{5_concept/non_func.tex} \input{5_concept/questions.tex} - \input{5_concept/features.tex} \input{5_concept/special_attr.tex} \input{5_concept/results.tex} \input{5_concept/architecture.tex} \ No newline at end of file diff --git a/documentation/latex/5_concept/features.tex b/documentation/latex/5_concept/features.tex deleted file mode 100644 index f6e4a08..0000000 --- a/documentation/latex/5_concept/features.tex +++ /dev/null @@ -1,11 +0,0 @@ -\subsection{Anforderungen} \label{sec:Anforderungen} - - Bei der Umsetzung dieser API sind verschidene Funktionalitäten zu implementieren. - \begin{enumerate} - \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. - \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. - \item Clonen eines Repositories von Github. - \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. - \item Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. - \end{enumerate} - Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index 24705ca..c158e8d 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -1,11 +1,12 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} - Bei der Umsetzung dieser API sind verschidene funktuinale Anforderungen zu implementieren. + Bei der Umsetzung dieser Schwachstellenanalyse-API sind verschidene funktionale Anforderungen zu implementieren. \begin{enumerate} - \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank. - \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schachstellendatenbank. - \item Clonen eines Repositories von Github. - \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schachstellendatenbank. - \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken. - \item Aktualisierung der Schwachstellendatenbasis + \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank \label{f:one} + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} + \item Clonen eines Repositories von Github. \label{f:three} + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} + \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken \label{f:five} + \item Aktualisierung der Schwachstellendatenbasis \label{f:six} + \item Bereitstellung der API in einem Container \label{f:seven} \end{enumerate} Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index 74e36e4..0f9e764 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,6 +1,9 @@ -\subsubsection{Nicht funktionale Anforderungen} \label{sec:N_Anforderungen} +\subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} Bei der Umsetzung dieser API sind verschidene nichtunktionale Anforderungen umzusetzen. - \begin{itemize} - \item Performance sowie Skalierbarkeit der Anwendung - \item - \end{itemize} \ No newline at end of file + \begin{enumerate} + \item Performance der Anwendung \label{nf:one} + \item Skalierbarkeit der Anwendung \label{nf:two} + \item Dokumentation der Endpunkte \label{nf:three} + \item Rückgabe der Daten im JSON-LD-Format \label{nf:four} + \item Nutzung passender, etablierter Technologien \label{nf:five} + \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index 50d67b9..30d2a2f 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -1,19 +1,29 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} - Folgende Forschungsfragen werden in dieser Arbeit betrachtet: - Forschungsfrage \ref{one} bestimmt die zu implementierenden Funktionalitäten. + Aus den funktionalen und nichtfunktionalen Anforderungen ergeben sich folgende Forschungsfragen für diese Arbeit: + \\ \\ + Forschungsfrage \ref{q:one}, welche aus den funktionalen Anforderungen \ref{f:one} und \ref{f:two} hervorkommt, betrachtet die Analyse von einzelnen oder Listen von Abhängigkeiten auf Basis der eingeladenen Schwachstellendaten. + Je nachdem, ob eine Menge an Abhängigkeiten oder eine Einzelne gesucht werden muss müssen hier verschiedene Algorithmen implementiert werden um eine effiziente Ergebnisfindung zu gestalten. + \\ \\ + Forschungsfrage \ref{q:two} handelt von den zu implementierenden Funktionalitäten für Repositories und geschieht aufbauen auf Forschungsfrage \ref{q:one}. + Deshalb sind die folgenden funktionalen Anforderungen \ref{f:one}, \ref{f:three}, \ref{f:four} und \ref{f:five} zu betrachten. Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. Zusätzlich auch die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. - Je nachdem, ob eine Menge an Abhängigkeiten oder ein ganzes Repositoriy durchsucht werden muss müssen hier verschiedene Algorithmen genutzt werden um eine effiziente Ergebnisfindung zu gestalten. - Hier ist auch die Suche der Abhängigkeiten auf der Datenbasis zu thematisieren. \\ \\ - Forschungsfrage \ref{two} definiert den Rückgabetyp der Daten. - Hier müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. + Forschungsfrage \ref{q:three} definiert den Rückgabetyp der Daten. + Vor allem die nichtfunktionale Anforderung \ref{nf:four}, der Rückgabe im JSON-LD-Format, ist Ausschlaggebend. + Hier müssen demnach sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. \\ \\ - Forschungsfrage \ref{three} behandelt die Umsetung der API selbst. + Forschungsfrage \ref{q:four} behandelt die Umsetung der API selbst. + Es ist die Umsetzung der Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. + Vor allem nichtfunktionale Anforderung \ref{nf:five}, die Nutzung von Etablierten Technologien, hat hier ihren Schwerpunkt. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das Endpunktdokumentations- und Testmöglichkeitstool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. - Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. + Der entstandene Service muss, wie durch funktionale Anforderung \ref{f:seven} bestimmt, weiterhin im Container-Kontext nutzbar sein. \\ \\ - Forschungsfrage \ref{four} beschäftigt sich mit der Optimierung der API. + Forschungsfrage \ref{q:five} beschäftigt sich mit der Optimierung der API. + Funktionale Anforderung \ref{f:six} und nichtfunktionale Anforderungen \ref{nf:one}, \ref{nf:two} und teils auch \ref{nf:three} sind hier zugehörig. Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. - Besonders gewählte Datenbankformate werden hier thematisiert. \ No newline at end of file + Besonders gewählte Datenbankformate werden hier thematisiert. + + + \ No newline at end of file diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 0994660..462fb3c 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -1,4 +1,4 @@ -\subsubsection{Datenbank} \label{sec:Experimente} +\subsubsection{Datenbank} \label{sec:ExperimenteDB} Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. Aus der Gegebenen Einbindung einer NoSQL Datenbanklösung in ASP.NET, LiteDB, wurde diese auch zuerst als Datenspeicher gewählt. \\ diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex index 084b222..9801ba7 100644 --- a/documentation/latex/6_implementation/mysql_index.tex +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -1,2 +1,4 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} - MySQL Indexierung \ No newline at end of file + MySQL Indexierung + Suche mit Indizierung: 0.8-1.2 ms + Suche ohne Indizierung: 120-140 ms \ No newline at end of file From 2d0feeb6a4a29013811bcda24248bcead05c0c83 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 12 Apr 2024 14:03:44 +0200 Subject: [PATCH 18/60] line-word-break fixed sometimes --- .../AmIVulnerable/Data/test.litedb | Bin 32768 -> 0 bytes documentation/latex/4_other_work/demyst.tex | 2 +- documentation/latex/4_other_work/on_t_eff.tex | 2 +- documentation/latex/5_concept/questions.tex | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 code/AmIVulnerable/AmIVulnerable/Data/test.litedb diff --git a/code/AmIVulnerable/AmIVulnerable/Data/test.litedb b/code/AmIVulnerable/AmIVulnerable/Data/test.litedb deleted file mode 100644 index f3ec34ad5873b43f74871a55f28fdea8e09eaba1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)y-LGS6u|M5FX<#*I%tR9!7dpDCqV>39PL&dm7%O=~tWvi$wa*S*j8n&mv%ShqtPSo_c!Hc^|!*4-Lx0lztqVfGyULlEivR)$Ab Date: Fri, 12 Apr 2024 14:20:31 +0200 Subject: [PATCH 19/60] little wording --- .../latex/5_concept/architecture_1.tex | 30 +++++++++---------- documentation/latex/5_concept/func.tex | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index e1de722..1a032a2 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -2,12 +2,12 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Für die Beantwortung der Forschungsfragen \ref{q:one}, \ref{q:two}, \ref{q:five} und vor allem \ref{q:four} verschiedene Komponenten nötig: \begin{enumerate} \item \textbf{Framework} \label{arch_1}\\ - Als API-Grundlage muss ein passendes Framework genutzt werden. + Um eine API zu entwickeln, muss ein passendes Framework genutzt werden. Dadurch, dass keine Notwendigkeit für ein Frontend besteht gibt es hier wenig Eingrenzungen. - \\ \\ + \\ Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. Mit diesem lassen sich unter anderem API-Services bauen. - Mittels der für das .NET Framework expliziet vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. + Mittels der für das .NET Framework explizit vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. \item \textbf{Datenbank} \label{arch_2}\\ In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. @@ -15,34 +15,34 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. \\ \\ Durch die Wahl des Frameworks auf ASP.NET ist es möglich einen \textit{embedded NoSQL-Document-Store} -- LiteDB zu nutzen. % TODO: https://www.litedb.org/ - Diese ist leicht intern nutzbar und muss nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der API mit enthalten ist. + Diese ist leicht intern nutzbar und muss als \textit{file-based DB} nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der API mit enthalten ist. \item \textbf{Controller} \label{arch_3}\\ Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. \\ \\ - Notwendig sind hier view Controller. - Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. + Notwendig sind hier vier Controller. + (1) Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. In diesem sind Endpunkte zum clonen des CVE-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK \\ - Weiterhin ist ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. + Weiterhin ist (2) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. \\ - Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer Endpunkt zu implementieren. + Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer (3) Endpunkt zu implementieren. In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. \\ - Für Forschungsfrage \ref{q:three} muss in jedem Endpunkt bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. - Weiterhin sind durch einen Controller die Rückgabedaten zu dokumentieren. + Für Forschungsfrage \ref{q:three} muss in jedem Endpunkt (4) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. + Ebenfalls sind durch einen Controller die Rückgabedaten zu dokumentieren. Dazu ist zwischen Softwarepaketen und CVE-Einträgen zu unterscheiden. \item \textbf{Datenmodelle} \label{arch_4}\\ Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. \item \textbf{Konvertierung von und in JSON} \label{arch_5}\\ - Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. + Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. - \\ \\ + \\ Dies muss in den jeweiligen Controllern geschehen. Damit die Daten besser weiterverwendbar sind muss zusätzlich ein Kontext \glqq @context\grqq~hinzugefügt werden. \item \textbf{Container} \\ - Um die API unabhängig von der Umgebung und möglichst Speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. + Um die API unabhängig von der Umgebung und möglichst speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. \\ \\ - Für den bau der Containers wird Docker-Compose genutzt. + Für den Bau der Containers wird Docker-Compose genutzt. \end{enumerate} - Weiterhin muss das JSON-LD-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). \ No newline at end of file + Weiterhin muss das JSON-LD-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index c158e8d..ad32b48 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -5,7 +5,7 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} \item Clonen eines Repositories von Github. \label{f:three} \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} - \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheitslücken \label{f:five} + \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken \label{f:five} \item Aktualisierung der Schwachstellendatenbasis \label{f:six} \item Bereitstellung der API in einem Container \label{f:seven} \end{enumerate} From d088af04743766941ceb0b59960f2f7495576bee Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 14 Apr 2024 12:50:34 +0200 Subject: [PATCH 20/60] appendix added and some acronym's (API, NIST, CVE) --- documentation/latex/1_abstract/abstract.tex | 2 +- .../latex/3_definitions/definitions.tex | 14 ++++++------ documentation/latex/4_other_work/nist.tex | 16 +++++++------- .../latex/4_other_work/other_work.tex | 4 ++-- documentation/latex/4_other_work/owasp.tex | 2 +- .../latex/5_concept/architecture.tex | 2 +- .../latex/5_concept/architecture_1.tex | 22 +++++++++---------- .../latex/5_concept/architecture_2.tex | 4 ++-- documentation/latex/5_concept/concept.tex | 2 +- documentation/latex/5_concept/func.tex | 6 ++--- documentation/latex/5_concept/non_func.tex | 2 +- documentation/latex/5_concept/questions.tex | 4 ++-- documentation/latex/5_concept/results.tex | 6 ++--- .../latex/5_concept/special_attr.tex | 4 ++-- .../6_implementation/implementation_1.tex | 6 ++--- .../latex/8_discussion/discussion.tex | 6 ++--- documentation/latex/main.tex | 15 +++++++++++++ documentation/latex/subsections/api.tex | 2 +- documentation/latex/subsections/ausblick.tex | 2 +- documentation/latex/subsections/cve.tex | 2 +- .../latex/subsections/motivation.tex | 2 +- .../subsections/n\303\244chste_schritte.tex" | 4 ++-- .../latex/subsections/referenzen.tex | 2 +- .../latex/subsections/umgang_mit_cve.tex | 2 +- documentation/latex/subsections/vision.tex | 4 ++-- .../latex/subsubsections/controller.tex | 4 ++-- documentation/latex/subsubsections/nist.tex | 4 ++-- 27 files changed, 80 insertions(+), 65 deletions(-) diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 43b5691..8687c1b 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -4,6 +4,6 @@ \section{Abstract} \label{sec:abstract} Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. \\ -Diese Arbeit stellt die Entwicklung einer API vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. +Diese Arbeit stellt die Entwicklung einer \ac{API} vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 6560742..73bac0f 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1,12 +1,12 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} - \item \textbf{CVE (Common Vulnerabilities and Exposures):} \\ + \item \textbf{\ac{CVE}:} \\ Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. - CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \ac{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. \\ \glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. - In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq CVE Numbering Authority's\grqq (CNA's) eine CVE-Nummer zugewiesen bekommen haben.\cite{} - Eine CVE-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. + In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (CNA's) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{} + Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. \item \textbf{Direkte Abhängigkeiten:} \\ @@ -20,11 +20,11 @@ \section{Definitionen} \label{sec:Definitionen} Wenn nun eine Applikation ein Paket einbindet welches ein weiteres Paket selbst benötigt, so ist dieses eine transitive Abhängigkeit der Applikation. Somit können sich rekursiv Abhängigkeitsbäume aufspannen, die teils sogar gleiche Pakete in verschiedenen Versionen einbinden. - \item \textbf{API (Application Programming Interface):} \\ - Eine API definiert eine Reihe von Regeln und Mechanismen, über die verschiedene Softwarekomponenten miteinander interagieren können. + \item \textbf{\ac{API}:} \\ + Eine \ac{API} definiert eine Reihe von Regeln und Mechanismen, über die verschiedene Softwarekomponenten miteinander interagieren können. Somit bieten stellen sie Schnittstelle zwischen verschiedenen Systemen dar. Sie legt fest, wie Softwaremodule oder -anwendungen miteinander kommunizieren, indem sie Funktionen, Methoden, Protokolle und Datenstrukturen bereitstellt. - Um eine API zu nutzen müssen diese Festlegungen eingehalten werden. + Um eine \ac{API} zu nutzen müssen diese Festlegungen eingehalten werden. \item \textbf{JSON (JavaScript Object Notation):} \\ diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index 3490392..3be0adc 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,17 +1,17 @@ \subsubsection{NIST-API} \label{sec:NIST-API} -Das \glqq National Institute of Standards and Technology\grqq~(NIST) bietet zwei CVE-API's an. -Diese sind die CVE-API und die CVE-Change-History-API. +Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an. +Diese sind die \ac{CVE}-\ac{API} und die \ac{CVE}-Change-History-\ac{API}. \\ \\ -Die \textbf{CVE-API} nimmt Anfragen zu einer oder mehreren<-?????? CVE-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. -Um nun aktuelle CVE-Daten abzurufen und zu Nutzen muss lediglich diese API in eigene Anwendungen oder Tools zu integriert werden. -Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte CVEs zu reagieren. +Die \textbf{\ac{CVE}-\ac{API}} nimmt Anfragen zu einer oder mehreren<-?????? \ac{CVE}-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. +Um nun aktuelle \ac{CVE}-Daten abzurufen und zu Nutzen muss lediglich diese \ac{API} in eigene Anwendungen oder Tools zu integriert werden. +Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte \ac{CVE}'s zu reagieren. Durch das Vorhandensein von mehr als 240.000<-?????? Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. \\ \\ -Die \textbf{CVE-Change-History-API} bietet einen historischen Überblick über Änderungen an CVE-Einträgen. -Durch diese können Änderungsverläufe und Aktualisierungen von CVE's besser nachvollzogen werden. +Die \textbf{\ac{CVE}-Change-History-\ac{API}} bietet einen historischen Überblick über Änderungen an \ac{CVE}-Einträgen. +Durch diese können Änderungsverläufe und Aktualisierungen von \ac{CVE}'s besser nachvollzogen werden. Aus den dadurch bereitgestellten Daten können Muster oder Trends bei Sicherheitsvorfällen identifiziert werden und entsprechende Vorkerungen seitens der Entwickler getroffen werden. \\ \\ -Durch eine Nutzung dieser NIST-APIs können Entwickler und Sicherheitspersonal auf aktuelle CVE-Daten zugreifen. +Durch eine Nutzung dieser \ac{NIST}-\ac{API}s können Entwickler und Sicherheitspersonal auf aktuelle \ac{CVE}-Daten zugreifen. Die Sicherheit ihrer Softwarelösungen kann verbessert und potenzielle Risiken minimiert werden. Im Vergleich zu anderen noch vorzustellenden Lösungen muss hier eine Applikation angebunden werden, die die Daten grafisch aufbereitet, da diese nur in einem JSON-Format zurückgegeben werden. Die Integration dieser Daten in Sicherheitstools und Plattformen trägt dazu bei, die Effektivität von Sicherheitsmaßnahmen in der Softwareentwicklung zu erhöhen und eine proaktive Sicherheitsstrategie zu fördern. diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index d107a98..e6df2a3 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -1,6 +1,6 @@ \section{Andere Arbeiten} \label{sec:Andere} - Vor der Konzeption der Softwarelösung einer Dependency-API muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. - Es gibt bereits verschiedene Applikationen, API's und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. + Vor der Konzeption der Softwarelösung einer Dependency-\ac{API} muss erst ein Blick auf die bisherige Forschung und Entwicklung in diesem Bereich geworfen werden. + Es gibt bereits verschiedene Applikationen, \ac{API}'s und Plattformen, die sich mit der Herausforderung beschäftigen, Abhängigkeiten in Softwarelösungen zu verwalten und potenzielle Sicherheitsrisiken zu identifizieren. Folgend werden einige der bekanntesten Softwarelösungen betrachtet, die für diese Zwecke entwickelt wurden. Es soll ein Überblick über den aktuellen Stand der Technik und mögliche Herausforderungen entstehen um Herausforderungen, denen sich Entwickler bei der Verwaltung von Abhängigkeiten und der Gewährleistung der Sicherheit in ihren Projekten gegenübersehen, besser einzuschätzen. \subsection{Softwaretools} \label{subsec:Softwaretools} diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index 3b9fd79..6b9bda5 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,5 +1,5 @@ \subsubsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. -Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger CVE-Nummer erstellt. +Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger \ac{CVE}-Nummer erstellt. \\ \\ Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index fd40919..a5abbb9 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -2,5 +2,5 @@ \subsection{Architektur} \label{sec:Architektur} \input{5_concept/architecture_1.tex} \input{5_concept/architecture_2.tex} \textcolor{red}{ - 5. bleibt Architektur, 6. API (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Verifikation V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Verifikation V2 (Unterschiede zu V1 betrachten und) + 5. bleibt Architektur, 6. \ac{API} (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Verifikation V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Verifikation V2 (Unterschiede zu V1 betrachten und) } diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index 1a032a2..6ac209b 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -2,27 +2,27 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Für die Beantwortung der Forschungsfragen \ref{q:one}, \ref{q:two}, \ref{q:five} und vor allem \ref{q:four} verschiedene Komponenten nötig: \begin{enumerate} \item \textbf{Framework} \label{arch_1}\\ - Um eine API zu entwickeln, muss ein passendes Framework genutzt werden. + Um eine \ac{API} zu entwickeln, muss ein passendes Framework genutzt werden. Dadurch, dass keine Notwendigkeit für ein Frontend besteht gibt es hier wenig Eingrenzungen. \\ Aus Erfahrungsgründen wurde das C\# Framework ASP.NET gewählt. - Mit diesem lassen sich unter anderem API-Services bauen. + Mit diesem lassen sich unter anderem \ac{API}-Services bauen. Mittels der für das .NET Framework explizit vorhandenen IDE \glqq Visual Studio\grqq~bestehen auch native Debugging-Möglichkeiten. Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. \item \textbf{Datenbank} \label{arch_2}\\ - In der Datenbank sind alle CVE-Daten zu persistieren, welche zu durchsuchen sind. + In der Datenbank sind alle \ac{CVE}-Daten zu persistieren, welche zu durchsuchen sind. Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. \\ \\ Durch die Wahl des Frameworks auf ASP.NET ist es möglich einen \textit{embedded NoSQL-Document-Store} -- LiteDB zu nutzen. % TODO: https://www.litedb.org/ - Diese ist leicht intern nutzbar und muss als \textit{file-based DB} nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der API mit enthalten ist. + Diese ist leicht intern nutzbar und muss als \textit{file-based DB} nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der \ac{API} mit enthalten ist. \item \textbf{Controller} \label{arch_3}\\ - Controller einer API nehmen HTTP-Anfragen entgegen und reagieren darauf. - Hier wird die Hauptaufgabe der API geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. + Controller einer \ac{API} nehmen HTTP-Anfragen entgegen und reagieren darauf. + Hier wird die Hauptaufgabe der \ac{API} geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. \\ \\ Notwendig sind hier vier Controller. - (1) Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von CVE-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. - In diesem sind Endpunkte zum clonen des CVE-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK + (1) Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von \ac{CVE}-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. + In diesem sind Endpunkte zum clonen des \ac{CVE}-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK \\ Weiterhin ist (2) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. \\ @@ -31,17 +31,17 @@ \subsubsection{Architektur V1} \label{sec:Architektur} \\ Für Forschungsfrage \ref{q:three} muss in jedem Endpunkt (4) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. Ebenfalls sind durch einen Controller die Rückgabedaten zu dokumentieren. - Dazu ist zwischen Softwarepaketen und CVE-Einträgen zu unterscheiden. + Dazu ist zwischen Softwarepaketen und \ac{CVE}-Einträgen zu unterscheiden. \item \textbf{Datenmodelle} \label{arch_4}\\ Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. \item \textbf{Konvertierung von und in JSON} \label{arch_5}\\ - Beim Einlesen der CVE-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. + Beim Einlesen der \ac{CVE}-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. \\ Dies muss in den jeweiligen Controllern geschehen. Damit die Daten besser weiterverwendbar sind muss zusätzlich ein Kontext \glqq @context\grqq~hinzugefügt werden. \item \textbf{Container} \\ - Um die API unabhängig von der Umgebung und möglichst speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. + Um die \ac{API} unabhängig von der Umgebung und möglichst speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. \\ \\ Für den Bau der Containers wird Docker-Compose genutzt. \end{enumerate} diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex index e177d56..15b5b7c 100644 --- a/documentation/latex/5_concept/architecture_2.tex +++ b/documentation/latex/5_concept/architecture_2.tex @@ -4,7 +4,7 @@ \subsubsection{Architektur V2} \label{sec:Architektur} \item \textbf{Datenbank} \begin{itemize} \item Nutzung der SQL-Datenbank MySQL anstatt der eingebetteten No-SQL-Datenbank LiteDB - \item Erstellung einer Tabelle für Cve-Nummern, eine für heruntergeladene Repositories + \item Erstellung einer Tabelle für \ac{CVE}-Nummern, eine für heruntergeladene Repositories \item Indexierung in der MySQL-Datenbank auf Spalte \glqq designation\grqq~bzw. Paketname \end{itemize} \item \textbf{Controller} @@ -13,7 +13,7 @@ \subsubsection{Architektur V2} \label{sec:Architektur} \end{itemize} \item \textbf{Controller} \begin{itemize} - \item Containerisierung von nicht nur der API sondern auch der MySQL-Datenbank + \item Containerisierung von nicht nur der \ac{API} sondern auch der MySQL-Datenbank \item Herstellung einer Verbindung über das interne Docker-Netzwerk \end{itemize} \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 47e0da0..666724c 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -1,5 +1,5 @@ \section{Konzept} \label{sec:Konzept} - Im Rahmen dieser Arbeit soll eine API zur Verfügung gestellt werden, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. + Im Rahmen dieser Arbeit soll eine \ac{API} zur Verfügung gestellt werden, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index ad32b48..5a43ef0 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -1,5 +1,5 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} - Bei der Umsetzung dieser Schwachstellenanalyse-API sind verschidene funktionale Anforderungen zu implementieren. + Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} sind verschidene funktionale Anforderungen zu implementieren. \begin{enumerate} \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank \label{f:one} \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} @@ -7,6 +7,6 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken \label{f:five} \item Aktualisierung der Schwachstellendatenbasis \label{f:six} - \item Bereitstellung der API in einem Container \label{f:seven} + \item Bereitstellung der \ac{API} in einem Container \label{f:seven} \end{enumerate} - Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der API. + Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der \ac{API}. diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index 0f9e764..6ed10b9 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,5 +1,5 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} - Bei der Umsetzung dieser API sind verschidene nichtunktionale Anforderungen umzusetzen. + Bei der Umsetzung dieser \ac{API} sind verschidene nichtunktionale Anforderungen umzusetzen. \begin{enumerate} \item Performance der Anwendung \label{nf:one} \item Skalierbarkeit der Anwendung \label{nf:two} diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index cbce276..755753d 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -13,14 +13,14 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} Vor allem die nichtfunktionale Anforderung \ref{nf:four}, der Rückgabe im JSON-LD-Format, ist Ausschlaggebend. Hier müssen demnach sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. \\ \\ - Forschungsfrage \ref{q:four} behandelt die Umsetung der API selbst. + Forschungsfrage \ref{q:four} behandelt die Umsetung der \ac{API} selbst. Es ist die Umsetzung der Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. Vor allem nichtfunktionale Anforderung \ref{nf:five}, die Nutzung von Etablierten Technologien, hat hier ihren Schwerpunkt. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das End\-punkt\-doku\-mentations- und Test\-möglich\-keits\-tool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. Der entstandene Service muss, wie durch funktionale Anforderung \ref{f:seven} bestimmt, weiterhin im Container-Kontext nutzbar sein. \\ \\ - Forschungsfrage \ref{q:five} beschäftigt sich mit der Optimierung der API. + Forschungsfrage \ref{q:five} beschäftigt sich mit der Optimierung der \ac{API}. Funktionale Anforderung \ref{f:six} und nichtfunktionale Anforderungen \ref{nf:one}, \ref{nf:two} und teils auch \ref{nf:three} sind hier zugehörig. Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. Besonders gewählte Datenbankformate werden hier thematisiert. diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index 32a88a0..e63afa7 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -1,12 +1,12 @@ \subsection{Zielsetzung} \label{sec:Zielsetzung} Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: \begin{enumerate} - \item \textbf{Entwicklung einer funktionsfähigen API} \\ + \item \textbf{Entwicklung einer funktionsfähigen \ac{API}} \\ Diese soll performant und möglichst schmal in einem Containercontext nutzbar sein und alle -- von den Features -- notwenigen Endpunkte beinhalten. \item \textbf{Analyse auf Sicherheitslücken} \\ - Die entstehende API soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. + Die entstehende \ac{API} soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. \item \textbf{Darstellung der detektierten Schwachstellenpakete inklusive Abhängigkeiten als Baum} \\ Bei Analyse eines Repositories sollen alle Abhängigkeiten dieses mit dessen Abhängigkeiten aufgezeigt werden. \item \textbf{Entscheidungsunterstützung bei Abhängigkeitsveränderungen} \\ - Die entstehende API soll dem Nutzer letztendlich dabei helfen, eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Abhängigkeit zu fällen. + Die entstehende \ac{API} soll dem Nutzer letztendlich dabei helfen, eine Entscheidung über das Weiterverwenden oder Austauschen bzw. Aktualisieren einer Abhängigkeit zu fällen. \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index 5115370..0cf2669 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -1,8 +1,8 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} - Dadurch, dass diese API bei schwachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstellt, ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegeben. + Dadurch, dass diese \ac{API} bei schwachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstellt, ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegeben. Somit können Aufwand, bezüglich Ersatzes oder Anpassungen bei Abhängigkeiten, besser eingeschätzt werden und die Entscheidung, hier bezüglich der Dringlichkeit dieses Schrittes des Ersatzes, zutreffender fallen. \\ \\ - Durch die Menge der als Schwachstellen-Suchbasis dienenden CVE-Daten und deren stetige Erweiterung und Aktualisierung ist es der API zu ermöglichen, immer nur die aktuellsten Änderungen herunterzuladen und einzupflegen. + Durch die Menge der als Schwachstellen-Suchbasis dienenden \ac{CVE}-Daten und deren stetige Erweiterung und Aktualisierung ist es der \ac{API} zu ermöglichen, immer nur die aktuellsten Änderungen herunterzuladen und einzupflegen. Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis erneut herunterzuladen. \\ \\ Durch die lokal vorliegende Datenbasis ist das Suchen deutlich schneller als diese Daten immer erneut extern anzufragen. diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index 62a699e..ac6d54b 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -17,10 +17,10 @@ \subsection{Implementation V1} \label{sec:Implementation1} \item View \end{itemize} - Implementation V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für API (inklusive DB darin) + Implementation V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für \ac{API} (inklusive DB darin) \begin{itemize} \item removed Controller-Endpoints: - \item Db/CheckRawDir (check if the downloaded cve-dir is ready to convert) - \item Db/ConvertRawDirToDb (Convert the downloaded cve to LiteDB) + \item Db/CheckRawDir (check if the downloaded \ac{CVE}-dir is ready to convert) + \item Db/ConvertRawDirToDb (Convert the downloaded \ac{CVE} to LiteDB) \item Git/cloneStatus (if the current clone is finished) \end{itemize} \ No newline at end of file diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/8_discussion/discussion.tex index 255826c..0fda6f9 100644 --- a/documentation/latex/8_discussion/discussion.tex +++ b/documentation/latex/8_discussion/discussion.tex @@ -1,7 +1,7 @@ \section{Diskussion} \label{sec:Diskussion} \textcolor{red}{ \begin{itemize} - \item CVE Datenmodell 2014 umgeändert? + \item \ac{CVE} Datenmodell 2014 umgeändert? \item Manche Pakete haben keine Designation? $\rightarrow$ Bereinigen? Wie kann man damit umgehen? \item Risiken ausführlich betrachten, Kritik, dort kann man weitermachen/müsste man, was hat man nicht in dieser Arbeit adressiert? (alle Programmiersprachen) \item Diskussion aus verifizierten Sachen raus @@ -12,6 +12,6 @@ \section{Diskussion} \label{sec:Diskussion} Risiken: \begin{itemize} \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden - \item Abhängigkeit vom CVE-Daten Provider - \item Sicherheitslücken in der API selbst + \item Abhängigkeit vom \ac{CVE}-Daten Provider + \item Sicherheitslücken in der \ac{API} selbst \end{itemize} \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index bcf26de..6988278 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -100,6 +100,10 @@ citecolor = blue } +% Anhang +\usepackage[toc,page]{appendix} +% Abkürzungen +\usepackage{acronym} \begin{document} \nocite{*} @@ -172,6 +176,17 @@ % \input{sections/analyse.tex} % \input{sections/conclusion.tex} + \newpage + \begin{appendices} + \section{Abkürzungen} \label{sec:Abkürzungen} + \begin{acronym}[LangesWortFuerDieEinstellung] + \acro{API}[API]{\textbf{A}pplication \textbf{P}rogramming \textbf{I}nterface} + \acro{NIST}[NIST]{\textbf{N}ational \textbf{I}nstitute for \textbf{S}tandards and \textbf{T}echnology} + \acro{CVE}[CVE]{\textbf{C}ommon \textbf{V}ulnerabilities and \textbf{E}xposures} + \end{acronym} + \section{Messungen} \label{sec:Messungen} + \end{appendices} + \newpage \phantomsection \printbibheading[title={Quellen}] diff --git a/documentation/latex/subsections/api.tex b/documentation/latex/subsections/api.tex index 797b1f8..b874606 100644 --- a/documentation/latex/subsections/api.tex +++ b/documentation/latex/subsections/api.tex @@ -1,4 +1,4 @@ -\subsection{API} \label{subsec:API} +\subsection{\ac{API}} \label{subsec:API} \input{subsubsections/modells.tex} \input{subsubsections/controller.tex} \input{subsubsections/db_anbindung.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/ausblick.tex b/documentation/latex/subsections/ausblick.tex index 6f8115b..384efbd 100644 --- a/documentation/latex/subsections/ausblick.tex +++ b/documentation/latex/subsections/ausblick.tex @@ -1,4 +1,4 @@ \subsection{Ausblick} \label{subsec:Ausblick} Ausblick -Ziel: schneller als NIST API sein (so und so viele Sekunden übers Netz im vergleich zu so und so vielen sekunden über unsere API) +Ziel: schneller als \ac{NIST}-\ac{API} sein (so und so viele Sekunden übers Netz im Vergleich zu so und so vielen sekunden über unsere \ac{API}) Um Ziel zu erreichen: Andere Datenbank verwenden um Lesezugriffe optimieren \ No newline at end of file diff --git a/documentation/latex/subsections/cve.tex b/documentation/latex/subsections/cve.tex index c4398cb..019f389 100644 --- a/documentation/latex/subsections/cve.tex +++ b/documentation/latex/subsections/cve.tex @@ -1,2 +1,2 @@ \subsection{CVE} \label{subsec:CVE} -CVE, oder Common Vulnerabilities and Exposures \cite{} \ No newline at end of file + \ac{CVE} \cite{} \ No newline at end of file diff --git a/documentation/latex/subsections/motivation.tex b/documentation/latex/subsections/motivation.tex index 1f3823a..be8f307 100644 --- a/documentation/latex/subsections/motivation.tex +++ b/documentation/latex/subsections/motivation.tex @@ -9,7 +9,7 @@ \subsection{Motivation} \label{subsec:Motivation} Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. \\ \\ Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. - CVE nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \ac{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. \\ Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem Angebot der \glqq National Cybersecurity FFRDC\grqq~zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. Eine Automatisierung der Analyse solcher Pakete zielt somit nicht nur eine Reduktion des Zeitaufwandes mit sich, auch ist eine umfangreichere Analyse ohne Mehraufwand möglich. diff --git "a/documentation/latex/subsections/n\303\244chste_schritte.tex" "b/documentation/latex/subsections/n\303\244chste_schritte.tex" index 66a5f77..14b566e 100644 --- "a/documentation/latex/subsections/n\303\244chste_schritte.tex" +++ "b/documentation/latex/subsections/n\303\244chste_schritte.tex" @@ -1,4 +1,4 @@ \subsection{Nächste Schritte mit neuer Zielsetzung} \label{subsec:Nächste_Schritte} -Nächste Schritte mit neuer Zielsetzung - API mit MySQL-DB versehen für vermutete höhere Performance (vermutung weil db-Server wahrscheinlich schneller als lokal lesen/schreiben[hardwareabhängig]) + Nächste Schritte mit neuer Zielsetzung + \ac{API} mit MySQL-DB versehen für vermutete höhere Performance (vermutung weil db-Server wahrscheinlich schneller als lokal lesen/schreiben[hardwareabhängig]) Analyseergebnis ist auszubauen um Schweregrad der Schwachstelle um besonders kritische stellen im Dependency-Baum hervorzuheben \ No newline at end of file diff --git a/documentation/latex/subsections/referenzen.tex b/documentation/latex/subsections/referenzen.tex index 09cca4f..4bcba51 100644 --- a/documentation/latex/subsections/referenzen.tex +++ b/documentation/latex/subsections/referenzen.tex @@ -1,5 +1,5 @@ \subsection{Referenzen} \label{subsec:Referenzen} -Referenzen und CVE-Nutzungen + Referenzen und \ac{CVE}-Nutzungen \input{subsubsections/nist.tex} \input{subsubsections/dependa_bot.tex} \input{subsubsections/weitere.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/umgang_mit_cve.tex b/documentation/latex/subsections/umgang_mit_cve.tex index 50edf58..21e2013 100644 --- a/documentation/latex/subsections/umgang_mit_cve.tex +++ b/documentation/latex/subsections/umgang_mit_cve.tex @@ -1,2 +1,2 @@ \subsection{Umgang mit CVE} \label{subsec:Umgang_mit_CVE} -Umgang mit CVE \ No newline at end of file + Umgang mit \ac{CVE} \ No newline at end of file diff --git a/documentation/latex/subsections/vision.tex b/documentation/latex/subsections/vision.tex index 99501f9..0c6b572 100644 --- a/documentation/latex/subsections/vision.tex +++ b/documentation/latex/subsections/vision.tex @@ -2,9 +2,9 @@ \subsection{Vision} \label{subsec:Vision} Vision Validieren ob Ziel erreicht ist, dass ein Node-JS-Projekt komplett analysisert (alle Pakete entnommen werden) und nach Schwachstellen untersucht werden - das zurückgegebene Format der API sinnvoll und struckturiert ist + das zurückgegebene Format der \ac{API} sinnvoll und struckturiert ist Wurde sich an programmiertechnische Standards gehalten - Models sind eigene Bibliothek (losgelöst von der API, können weiterverwendet werden getrennt und weiterentwickelt werden) + Models sind eigene Bibliothek (losgelöst von der \ac{API}, können weiterverwendet werden getrennt und weiterentwickelt werden) Controller liegen im Controller-Namespace Sinnvolle Trennung von Endpunkten in Controller mit http-Signatur Routennamen der Endpunkte in natürlicher Sprache/Pfaden \ No newline at end of file diff --git a/documentation/latex/subsubsections/controller.tex b/documentation/latex/subsubsections/controller.tex index a2ef7ac..f6f9abd 100644 --- a/documentation/latex/subsubsections/controller.tex +++ b/documentation/latex/subsubsections/controller.tex @@ -1,3 +1,3 @@ \subsubsection{Controller} \label{subsubsec:Controller} -Auflistung und Erklärung (Swagger screenshot) in Paragraphs -Views (JSON-LD def von CVE-Result, JSON-LD von NodePackageResult) \ No newline at end of file + Auflistung und Erklärung (Swagger screenshot) in Paragraphs + Views (JSON-LD def von \ac{CVE}-Result, JSON-LD von NodePackageResult) \ No newline at end of file diff --git a/documentation/latex/subsubsections/nist.tex b/documentation/latex/subsubsections/nist.tex index a4fb56d..4aa2663 100644 --- a/documentation/latex/subsubsections/nist.tex +++ b/documentation/latex/subsubsections/nist.tex @@ -1,2 +1,2 @@ -\subsubsection{NIST-API} \label{subsubsec:NIST_API} - NIST-API \ No newline at end of file +\subsubsection{\ac{NIST}-\ac{API}} \label{subsubsec:NIST_API} + \ac{NIST}-\ac{API} \ No newline at end of file From cc50d1f53207e46cda66737804672f764ef60957 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 14 Apr 2024 12:51:30 +0200 Subject: [PATCH 21/60] add first demo-log to the appendix for messurment print --- documentation/latex/main.tex | 52 ++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 6988278..abe357f 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -104,6 +104,9 @@ \usepackage[toc,page]{appendix} % Abkürzungen \usepackage{acronym} +\usepackage{tabularx} +\usepackage{ltablex} + \begin{document} \nocite{*} @@ -185,6 +188,55 @@ \acro{CVE}[CVE]{\textbf{C}ommon \textbf{V}ulnerabilities and \textbf{E}xposures} \end{acronym} \section{Messungen} \label{sec:Messungen} + % TODO: Andere Logs ebenfalls eintragen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:24:49.065 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 203.3 ms \\ + 2024-03-31 16:24:49.272 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 207.2 ms \\ + 2024-03-31 16:24:49.480 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 207.4 ms \\ + 2024-03-31 16:24:49.688 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 208.5 ms \\ + 2024-03-31 16:24:49.895 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 206.1 ms \\ + 2024-03-31 16:24:50.102 +00:00 & [INF] & Query-Time for Package "Debian" completed in 206.8 ms \\ + 2024-03-31 16:24:50.308 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 205.8 ms \\ + 2024-03-31 16:24:50.515 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.2 ms \\ + 2024-03-31 16:24:50.720 +00:00 & [INF] & Query-Time for Package "arc42" completed in 204.6 ms \\ + 2024-03-31 16:24:50.926 +00:00 & [INF] & Query-Time for Package "cookie" completed in 206.3 ms \\ + 2024-03-31 16:24:51.133 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 207.0 ms \\ + 2024-03-31 16:24:51.340 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.4 ms \\ + 2024-03-31 16:24:51.548 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 208.0 ms \\ + 2024-03-31 16:24:51.754 +00:00 & [INF] & Query-Time for Package "parser" completed in 206.5 ms \\ + 2024-03-31 16:24:51.961 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.0 ms \\ + 2024-03-31 16:24:52.170 +00:00 & [INF] & Query-Time for Package "php" completed in 208.5 ms \\ + 2024-03-31 16:24:52.377 +00:00 & [INF] & Query-Time for Package "PHP" completed in 205.7 ms \\ + 2024-03-31 16:24:52.583 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 205.5 ms \\ + 2024-03-31 16:24:52.789 +00:00 & [INF] & Query-Time for Package "laravel" completed in 205.2 ms \\ + 2024-03-31 16:24:52.994 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 205.4 ms \\ + 2024-03-31 16:24:53.201 +00:00 & [INF] & Query-Time for Package "beta" completed in 206.1 ms \\ + 2024-03-31 16:24:53.407 +00:00 & [INF] & Query-Time for Package "meta" completed in 206.6 ms \\ + 2024-03-31 16:24:53.617 +00:00 & [INF] & Query-Time for Package "META" completed in 209.3 ms \\ + 2024-03-31 16:24:53.822 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 205.4 ms \\ + 2024-03-31 16:24:54.030 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.4 ms \\ + 2024-03-31 16:24:54.236 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 205.9 ms \\ + 2024-03-31 16:24:54.441 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 204.9 ms \\ + 2024-03-31 16:24:54.646 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 204.9 ms \\ + 2024-03-31 16:24:54.852 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 206.4 ms \\ + 2024-03-31 16:24:55.061 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 208.7 ms \\ + 2024-03-31 16:24:55.267 +00:00 & [INF] & Query-Time for Package "depd" completed in 205.6 ms \\ + 2024-03-31 16:24:55.473 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 205.9 ms \\ + 2024-03-31 16:24:55.679 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 206.0 ms \\ + 2024-03-31 16:24:55.885 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 206.5 ms \\ + 2024-03-31 16:24:56.093 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 207.7 ms \\ + 2024-03-31 16:24:56.093 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7231.9 ms \\ + \hline + \end{tabularx} + } + } \end{appendices} \newpage From 44755624014ab5390eb4dee1c9a3eeaab81c9c64 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 14 Apr 2024 17:48:43 +0200 Subject: [PATCH 22/60] added acronyms and relocate measurements --- .../latex/Appendix/mySqlWithoutIndex.tex | 490 ++++++++++++++++++ documentation/latex/main.tex | 56 +- 2 files changed, 496 insertions(+), 50 deletions(-) create mode 100644 documentation/latex/Appendix/mySqlWithoutIndex.tex diff --git a/documentation/latex/Appendix/mySqlWithoutIndex.tex b/documentation/latex/Appendix/mySqlWithoutIndex.tex new file mode 100644 index 0000000..8891578 --- /dev/null +++ b/documentation/latex/Appendix/mySqlWithoutIndex.tex @@ -0,0 +1,490 @@ +\subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} + \subsubsection{Messung 1 von 10} \label{subsubsec:MySQLOhneIndex1von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:10:29.164 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 264.8 ms \\ + 2024-03-31 16:10:29.385 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 221.6 ms \\ + 2024-03-31 16:10:29.597 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 211.4 ms \\ + 2024-03-31 16:10:29.807 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 209.8 ms \\ + 2024-03-31 16:10:30.018 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 211.1 ms \\ + 2024-03-31 16:10:30.225 +00:00 & [INF] & Query-Time for Package "Debian" completed in 206.6 ms \\ + 2024-03-31 16:10:30.431 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 206.4 ms \\ + 2024-03-31 16:10:30.644 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 212.2 ms \\ + 2024-03-31 16:10:30.852 +00:00 & [INF] & Query-Time for Package "arc42" completed in 208.4 ms \\ + 2024-03-31 16:10:31.061 +00:00 & [INF] & Query-Time for Package "cookie" completed in 208.6 ms \\ + 2024-03-31 16:10:31.270 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 209.3 ms \\ + 2024-03-31 16:10:31.480 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 209.5 ms \\ + 2024-03-31 16:10:31.688 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 208.4 ms \\ + 2024-03-31 16:10:31.896 +00:00 & [INF] & Query-Time for Package "parser" completed in 207.6 ms \\ + 2024-03-31 16:10:32.102 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 206.2 ms \\ + 2024-03-31 16:10:32.315 +00:00 & [INF] & Query-Time for Package "php" completed in 212.7 ms \\ + 2024-03-31 16:10:32.523 +00:00 & [INF] & Query-Time for Package "PHP" completed in 206.3 ms \\ + 2024-03-31 16:10:32.732 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 208.4 ms \\ + 2024-03-31 16:10:32.945 +00:00 & [INF] & Query-Time for Package "laravel" completed in 212.4 ms \\ + 2024-03-31 16:10:33.155 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 210.3 ms \\ + 2024-03-31 16:10:33.362 +00:00 & [INF] & Query-Time for Package "beta" completed in 206.6 ms \\ + 2024-03-31 16:10:33.570 +00:00 & [INF] & Query-Time for Package "meta" completed in 208.0 ms \\ + 2024-03-31 16:10:33.776 +00:00 & [INF] & Query-Time for Package "META" completed in 205.4 ms \\ + 2024-03-31 16:10:33.983 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 207.6 ms \\ + 2024-03-31 16:10:34.188 +00:00 & [INF] & Query-Time for Package "accepts" completed in 205.1 ms \\ + 2024-03-31 16:10:34.396 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 207.7 ms \\ + 2024-03-31 16:10:34.603 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 206.1 ms \\ + 2024-03-31 16:10:34.809 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 206.2 ms \\ + 2024-03-31 16:10:35.014 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 205.4 ms \\ + 2024-03-31 16:10:35.221 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 206.9 ms \\ + 2024-03-31 16:10:35.433 +00:00 & [INF] & Query-Time for Package "depd" completed in 211.2 ms \\ + 2024-03-31 16:10:35.640 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 207.0 ms \\ + 2024-03-31 16:10:35.847 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 207.6 ms \\ + 2024-03-31 16:10:36.056 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 208.3 ms \\ + 2024-03-31 16:10:36.263 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 207.1 ms \\ + 2024-03-31 16:10:36.263 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7364.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 2 von 10} \label{subsubsec:MySQLOhneIndex2von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:11:55.380 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 208.5 ms \\ + 2024-03-31 16:11:55.586 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 205.3 ms \\ + 2024-03-31 16:11:55.795 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 209.3 ms \\ + 2024-03-31 16:11:56.002 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 206.9 ms \\ + 2024-03-31 16:11:56.213 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 210.4 ms \\ + 2024-03-31 16:11:56.418 +00:00 & [INF] & Query-Time for Package "Debian" completed in 205.4 ms \\ + 2024-03-31 16:11:56.627 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 208.0 ms \\ + 2024-03-31 16:11:56.840 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 213.6 ms \\ + 2024-03-31 16:11:57.049 +00:00 & [INF] & Query-Time for Package "arc42" completed in 208.1 ms \\ + 2024-03-31 16:11:57.257 +00:00 & [INF] & Query-Time for Package "cookie" completed in 207.9 ms \\ + 2024-03-31 16:11:57.464 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 207.2 ms \\ + 2024-03-31 16:11:57.672 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 208.5 ms \\ + 2024-03-31 16:11:57.881 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 208.4 ms \\ + 2024-03-31 16:11:58.090 +00:00 & [INF] & Query-Time for Package "parser" completed in 208.9 ms \\ + 2024-03-31 16:11:58.298 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.7 ms \\ + 2024-03-31 16:11:58.508 +00:00 & [INF] & Query-Time for Package "php" completed in 210.3 ms \\ + 2024-03-31 16:11:58.720 +00:00 & [INF] & Query-Time for Package "PHP" completed in 210.8 ms \\ + 2024-03-31 16:11:58.930 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 209.1 ms \\ + 2024-03-31 16:11:59.138 +00:00 & [INF] & Query-Time for Package "laravel" completed in 208.1 ms \\ + 2024-03-31 16:11:59.347 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 208.1 ms \\ + 2024-03-31 16:11:59.556 +00:00 & [INF] & Query-Time for Package "beta" completed in 209.3 ms \\ + 2024-03-31 16:11:59.766 +00:00 & [INF] & Query-Time for Package "meta" completed in 209.8 ms \\ + 2024-03-31 16:11:59.976 +00:00 & [INF] & Query-Time for Package "META" completed in 209.8 ms \\ + 2024-03-31 16:12:00.182 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 206.5 ms \\ + 2024-03-31 16:12:00.397 +00:00 & [INF] & Query-Time for Package "accepts" completed in 214.7 ms \\ + 2024-03-31 16:12:00.605 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 208.0 ms \\ + 2024-03-31 16:12:00.814 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 208.2 ms \\ + 2024-03-31 16:12:01.024 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 210.3 ms \\ + 2024-03-31 16:12:01.233 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 208.7 ms \\ + 2024-03-31 16:12:01.441 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 207.5 ms \\ + 2024-03-31 16:12:01.650 +00:00 & [INF] & Query-Time for Package "depd" completed in 209.9 ms \\ + 2024-03-31 16:12:01.858 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 207.6 ms \\ + 2024-03-31 16:12:02.065 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 206.8 ms \\ + 2024-03-31 16:12:02.279 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 214.2 ms \\ + 2024-03-31 16:12:02.489 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 209.4 ms \\ + 2024-03-31 16:12:02.489 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7317.2 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 3 von 10} \label{subsubsec:MySQLOhneIndex3von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:13:09.964 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 206.5 ms \\ + 2024-03-31 16:13:10.173 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 208.6 ms \\ + 2024-03-31 16:13:10.383 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 209.8 ms \\ + 2024-03-31 16:13:10.591 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 207.9 ms \\ + 2024-03-31 16:13:10.800 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 208.7 ms \\ + 2024-03-31 16:13:11.008 +00:00 & [INF] & Query-Time for Package "Debian" completed in 207.8 ms \\ + 2024-03-31 16:13:11.218 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 209.5 ms \\ + 2024-03-31 16:13:11.425 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.8 ms \\ + 2024-03-31 16:13:11.637 +00:00 & [INF] & Query-Time for Package "arc42" completed in 211.0 ms \\ + 2024-03-31 16:13:11.848 +00:00 & [INF] & Query-Time for Package "cookie" completed in 211.2 ms \\ + 2024-03-31 16:13:12.055 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 206.9 ms \\ + 2024-03-31 16:13:12.261 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.5 ms \\ + 2024-03-31 16:13:12.469 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 207.7 ms \\ + 2024-03-31 16:13:12.677 +00:00 & [INF] & Query-Time for Package "parser" completed in 207.2 ms \\ + 2024-03-31 16:13:12.883 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 206.6 ms \\ + 2024-03-31 16:13:13.093 +00:00 & [INF] & Query-Time for Package "php" completed in 210.0 ms \\ + 2024-03-31 16:13:13.302 +00:00 & [INF] & Query-Time for Package "PHP" completed in 207.0 ms \\ + 2024-03-31 16:13:13.508 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 205.3 ms \\ + 2024-03-31 16:13:13.717 +00:00 & [INF] & Query-Time for Package "laravel" completed in 209.2 ms \\ + 2024-03-31 16:13:13.924 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 206.2 ms \\ + 2024-03-31 16:13:14.128 +00:00 & [INF] & Query-Time for Package "beta" completed in 204.0 ms \\ + 2024-03-31 16:13:14.337 +00:00 & [INF] & Query-Time for Package "meta" completed in 209.6 ms \\ + 2024-03-31 16:13:14.544 +00:00 & [INF] & Query-Time for Package "META" completed in 205.9 ms \\ + 2024-03-31 16:13:14.749 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 205.4 ms \\ + 2024-03-31 16:13:14.955 +00:00 & [INF] & Query-Time for Package "accepts" completed in 206.0 ms \\ + 2024-03-31 16:13:15.162 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 206.9 ms \\ + 2024-03-31 16:13:15.369 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 206.6 ms \\ + 2024-03-31 16:13:15.575 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 206.5 ms \\ + 2024-03-31 16:13:15.786 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 210.2 ms \\ + 2024-03-31 16:13:15.995 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 209.4 ms \\ + 2024-03-31 16:13:16.204 +00:00 & [INF] & Query-Time for Package "depd" completed in 208.5 ms \\ + 2024-03-31 16:13:16.416 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 212.0 ms \\ + 2024-03-31 16:13:16.627 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 211.3 ms \\ + 2024-03-31 16:13:16.836 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 209.0 ms \\ + 2024-03-31 16:13:17.046 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 209.2 ms \\ + 2024-03-31 16:13:17.046 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7288.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 4 von 10} \label{subsubsec:MySQLOhneIndex4von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:14:40.185 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 205.8 ms \\ + 2024-03-31 16:14:40.397 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 211.0 ms \\ + 2024-03-31 16:14:40.606 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 208.9 ms \\ + 2024-03-31 16:14:40.815 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 209.1 ms \\ + 2024-03-31 16:14:41.024 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 208.5 ms \\ + 2024-03-31 16:14:41.232 +00:00 & [INF] & Query-Time for Package "Debian" completed in 207.7 ms \\ + 2024-03-31 16:14:41.440 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 208.5 ms \\ + 2024-03-31 16:14:41.646 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 206.2 ms \\ + 2024-03-31 16:14:41.854 +00:00 & [INF] & Query-Time for Package "arc42" completed in 207.8 ms \\ + 2024-03-31 16:14:42.062 +00:00 & [INF] & Query-Time for Package "cookie" completed in 207.7 ms \\ + 2024-03-31 16:14:42.271 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 208.3 ms \\ + 2024-03-31 16:14:42.481 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 210.3 ms \\ + 2024-03-31 16:14:42.688 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 206.9 ms \\ + 2024-03-31 16:14:42.897 +00:00 & [INF] & Query-Time for Package "parser" completed in 208.8 ms \\ + 2024-03-31 16:14:43.103 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 205.9 ms \\ + 2024-03-31 16:14:43.307 +00:00 & [INF] & Query-Time for Package "php" completed in 204.2 ms \\ + 2024-03-31 16:14:43.514 +00:00 & [INF] & Query-Time for Package "PHP" completed in 206.0 ms \\ + 2024-03-31 16:14:43.722 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 206.5 ms \\ + 2024-03-31 16:14:43.929 +00:00 & [INF] & Query-Time for Package "laravel" completed in 206.7 ms \\ + 2024-03-31 16:14:44.135 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 206.1 ms \\ + 2024-03-31 16:14:44.341 +00:00 & [INF] & Query-Time for Package "beta" completed in 205.7 ms \\ + 2024-03-31 16:14:44.551 +00:00 & [INF] & Query-Time for Package "meta" completed in 209.8 ms \\ + 2024-03-31 16:14:44.759 +00:00 & [INF] & Query-Time for Package "META" completed in 208.7 ms \\ + 2024-03-31 16:14:44.966 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 206.1 ms \\ + 2024-03-31 16:14:45.171 +00:00 & [INF] & Query-Time for Package "accepts" completed in 205.2 ms \\ + 2024-03-31 16:14:45.377 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 206.4 ms \\ + 2024-03-31 16:14:45.581 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 203.3 ms \\ + 2024-03-31 16:14:45.789 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 208.5 ms \\ + 2024-03-31 16:14:46.002 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 212.7 ms \\ + 2024-03-31 16:14:46.209 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 206.2 ms \\ + 2024-03-31 16:14:46.417 +00:00 & [INF] & Query-Time for Package "depd" completed in 207.9 ms \\ + 2024-03-31 16:14:46.620 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 203.5 ms \\ + 2024-03-31 16:14:46.827 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 206.8 ms \\ + 2024-03-31 16:14:47.035 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 207.6 ms \\ + 2024-03-31 16:14:47.241 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 205.8 ms \\ + 2024-03-31 16:14:47.241 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7261.3 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 5 von 10} \label{subsubsec:MySQLOhneIndex5von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:16:43.914 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 209.7 ms \\ + 2024-03-31 16:16:44.123 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 208.1 ms \\ + 2024-03-31 16:16:44.336 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 212.9 ms \\ + 2024-03-31 16:16:44.542 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 206.3 ms \\ + 2024-03-31 16:16:44.754 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 211.6 ms \\ + 2024-03-31 16:16:44.960 +00:00 & [INF] & Query-Time for Package "Debian" completed in 205.8 ms \\ + 2024-03-31 16:16:45.172 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 211.7 ms \\ + 2024-03-31 16:16:45.382 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 210.5 ms \\ + 2024-03-31 16:16:45.588 +00:00 & [INF] & Query-Time for Package "arc42" completed in 205.6 ms \\ + 2024-03-31 16:16:45.797 +00:00 & [INF] & Query-Time for Package "cookie" completed in 208.8 ms \\ + 2024-03-31 16:16:46.007 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 209.5 ms \\ + 2024-03-31 16:16:46.214 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.9 ms \\ + 2024-03-31 16:16:46.421 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 207.3 ms \\ + 2024-03-31 16:16:46.630 +00:00 & [INF] & Query-Time for Package "parser" completed in 208.4 ms \\ + 2024-03-31 16:16:46.837 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.7 ms \\ + 2024-03-31 16:16:47.045 +00:00 & [INF] & Query-Time for Package "php" completed in 207.9 ms \\ + 2024-03-31 16:16:47.254 +00:00 & [INF] & Query-Time for Package "PHP" completed in 207.7 ms \\ + 2024-03-31 16:16:47.465 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 209.5 ms \\ + 2024-03-31 16:16:47.676 +00:00 & [INF] & Query-Time for Package "laravel" completed in 210.7 ms \\ + 2024-03-31 16:16:47.885 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 209.2 ms \\ + 2024-03-31 16:16:48.093 +00:00 & [INF] & Query-Time for Package "beta" completed in 207.6 ms \\ + 2024-03-31 16:16:48.302 +00:00 & [INF] & Query-Time for Package "meta" completed in 209.5 ms \\ + 2024-03-31 16:16:48.509 +00:00 & [INF] & Query-Time for Package "META" completed in 206.1 ms \\ + 2024-03-31 16:16:48.715 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 206.2 ms \\ + 2024-03-31 16:16:48.922 +00:00 & [INF] & Query-Time for Package "accepts" completed in 206.9 ms \\ + 2024-03-31 16:16:49.130 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 208.3 ms \\ + 2024-03-31 16:16:49.339 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 208.1 ms \\ + 2024-03-31 16:16:49.545 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 206.5 ms \\ + 2024-03-31 16:16:49.753 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 207.4 ms \\ + 2024-03-31 16:16:49.961 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 207.9 ms \\ + 2024-03-31 16:16:50.169 +00:00 & [INF] & Query-Time for Package "depd" completed in 208.4 ms \\ + 2024-03-31 16:16:50.377 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 207.9 ms \\ + 2024-03-31 16:16:50.585 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 207.6 ms \\ + 2024-03-31 16:16:50.792 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 206.6 ms \\ + 2024-03-31 16:16:50.998 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 206.1 ms \\ + 2024-03-31 16:16:50.998 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7293.3 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 6 von 10} \label{subsubsec:MySQLOhneIndex6von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:18:32.320 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 208.3 ms \\ + 2024-03-31 16:18:32.529 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 209.1 ms \\ + 2024-03-31 16:18:32.739 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 209.5 ms \\ + 2024-03-31 16:18:32.946 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 206.7 ms \\ + 2024-03-31 16:18:33.154 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 207.7 ms \\ + 2024-03-31 16:18:33.363 +00:00 & [INF] & Query-Time for Package "Debian" completed in 208.7 ms \\ + 2024-03-31 16:18:33.571 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 208.6 ms \\ + 2024-03-31 16:18:33.779 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.8 ms \\ + 2024-03-31 16:18:33.987 +00:00 & [INF] & Query-Time for Package "arc42" completed in 207.5 ms \\ + 2024-03-31 16:18:34.196 +00:00 & [INF] & Query-Time for Package "cookie" completed in 208.5 ms \\ + 2024-03-31 16:18:34.402 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 205.9 ms \\ + 2024-03-31 16:18:34.608 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.5 ms \\ + 2024-03-31 16:18:34.814 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 205.9 ms \\ + 2024-03-31 16:18:35.020 +00:00 & [INF] & Query-Time for Package "parser" completed in 205.5 ms \\ + 2024-03-31 16:18:35.226 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 205.6 ms \\ + 2024-03-31 16:18:35.433 +00:00 & [INF] & Query-Time for Package "php" completed in 207.6 ms \\ + 2024-03-31 16:18:35.644 +00:00 & [INF] & Query-Time for Package "PHP" completed in 209.2 ms \\ + 2024-03-31 16:18:35.849 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 203.9 ms \\ + 2024-03-31 16:18:36.055 +00:00 & [INF] & Query-Time for Package "laravel" completed in 206.4 ms \\ + 2024-03-31 16:18:36.264 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 208.9 ms \\ + 2024-03-31 16:18:36.471 +00:00 & [INF] & Query-Time for Package "beta" completed in 206.3 ms \\ + 2024-03-31 16:18:36.677 +00:00 & [INF] & Query-Time for Package "meta" completed in 206.3 ms \\ + 2024-03-31 16:18:36.883 +00:00 & [INF] & Query-Time for Package "META" completed in 205.7 ms \\ + 2024-03-31 16:18:37.091 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 208.2 ms \\ + 2024-03-31 16:18:37.299 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.8 ms \\ + 2024-03-31 16:18:37.506 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 206.4 ms \\ + 2024-03-31 16:18:37.716 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 210.1 ms \\ + 2024-03-31 16:18:37.925 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 208.5 ms \\ + 2024-03-31 16:18:38.134 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 209.2 ms \\ + 2024-03-31 16:18:38.344 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 210.7 ms \\ + 2024-03-31 16:18:38.552 +00:00 & [INF] & Query-Time for Package "depd" completed in 208.1 ms \\ + 2024-03-31 16:18:38.761 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 208.7 ms \\ + 2024-03-31 16:18:38.971 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 209.7 ms \\ + 2024-03-31 16:18:39.180 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 208.9 ms \\ + 2024-03-31 16:18:39.388 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 208.2 ms \\ + 2024-03-31 16:18:39.388 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7277.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 7 von 10} \label{subsubsec:MySQLOhneIndex7von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:19:36.516 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 206.7 ms \\ + 2024-03-31 16:19:36.726 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 210.0 ms \\ + 2024-03-31 16:19:36.934 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 207.6 ms \\ + 2024-03-31 16:19:37.143 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 209.4 ms \\ + 2024-03-31 16:19:37.350 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 206.6 ms \\ + 2024-03-31 16:19:37.559 +00:00 & [INF] & Query-Time for Package "Debian" completed in 208.3 ms \\ + 2024-03-31 16:19:37.765 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 206.7 ms \\ + 2024-03-31 16:19:37.973 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.5 ms \\ + 2024-03-31 16:19:38.182 +00:00 & [INF] & Query-Time for Package "arc42" completed in 209.1 ms \\ + 2024-03-31 16:19:38.389 +00:00 & [INF] & Query-Time for Package "cookie" completed in 207.4 ms \\ + 2024-03-31 16:19:38.601 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 211.8 ms \\ + 2024-03-31 16:19:38.807 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.5 ms \\ + 2024-03-31 16:19:39.015 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 207.5 ms \\ + 2024-03-31 16:19:39.223 +00:00 & [INF] & Query-Time for Package "parser" completed in 208.4 ms \\ + 2024-03-31 16:19:39.431 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.5 ms \\ + 2024-03-31 16:19:39.639 +00:00 & [INF] & Query-Time for Package "php" completed in 208.3 ms \\ + 2024-03-31 16:19:39.847 +00:00 & [INF] & Query-Time for Package "PHP" completed in 206.5 ms \\ + 2024-03-31 16:19:40.056 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 208.0 ms \\ + 2024-03-31 16:19:40.263 +00:00 & [INF] & Query-Time for Package "laravel" completed in 206.7 ms \\ + 2024-03-31 16:19:40.467 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 204.4 ms \\ + 2024-03-31 16:19:40.673 +00:00 & [INF] & Query-Time for Package "beta" completed in 205.5 ms \\ + 2024-03-31 16:19:40.879 +00:00 & [INF] & Query-Time for Package "meta" completed in 206.0 ms \\ + 2024-03-31 16:19:41.086 +00:00 & [INF] & Query-Time for Package "META" completed in 206.5 ms \\ + 2024-03-31 16:19:41.290 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 204.5 ms \\ + 2024-03-31 16:19:41.498 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.5 ms \\ + 2024-03-31 16:19:41.706 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 208.4 ms \\ + 2024-03-31 16:19:41.915 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 208.4 ms \\ + 2024-03-31 16:19:42.123 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 208.3 ms \\ + 2024-03-31 16:19:42.328 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 204.4 ms \\ + 2024-03-31 16:19:42.534 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 205.6 ms \\ + 2024-03-31 16:19:42.740 +00:00 & [INF] & Query-Time for Package "depd" completed in 205.9 ms \\ + 2024-03-31 16:19:42.944 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 204.8 ms \\ + 2024-03-31 16:19:43.150 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 205.4 ms \\ + 2024-03-31 16:19:43.354 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 204.2 ms \\ + 2024-03-31 16:19:43.558 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 203.6 ms \\ + 2024-03-31 16:19:43.558 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7249.9 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 8 von 10} \label{subsubsec:MySQLOhneIndex8von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:21:32.321 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 206.2 ms \\ + 2024-03-31 16:21:32.527 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 206.4 ms \\ + 2024-03-31 16:21:32.735 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 208.3 ms \\ + 2024-03-31 16:21:32.941 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 205.6 ms \\ + 2024-03-31 16:21:33.150 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 208.8 ms \\ + 2024-03-31 16:21:33.356 +00:00 & [INF] & Query-Time for Package "Debian" completed in 205.3 ms \\ + 2024-03-31 16:21:33.564 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 207.8 ms \\ + 2024-03-31 16:21:33.771 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.1 ms \\ + 2024-03-31 16:21:33.975 +00:00 & [INF] & Query-Time for Package "arc42" completed in 203.8 ms \\ + 2024-03-31 16:21:34.181 +00:00 & [INF] & Query-Time for Package "cookie" completed in 206.5 ms \\ + 2024-03-31 16:21:34.387 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 205.7 ms \\ + 2024-03-31 16:21:34.595 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 207.7 ms \\ + 2024-03-31 16:21:34.800 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 205.4 ms \\ + 2024-03-31 16:21:35.006 +00:00 & [INF] & Query-Time for Package "parser" completed in 205.3 ms \\ + 2024-03-31 16:21:35.212 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 206.0 ms \\ + 2024-03-31 16:21:35.419 +00:00 & [INF] & Query-Time for Package "php" completed in 206.9 ms \\ + 2024-03-31 16:21:35.627 +00:00 & [INF] & Query-Time for Package "PHP" completed in 206.5 ms \\ + 2024-03-31 16:21:35.835 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 207.7 ms \\ + 2024-03-31 16:21:36.042 +00:00 & [INF] & Query-Time for Package "laravel" completed in 206.3 ms \\ + 2024-03-31 16:21:36.250 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 207.6 ms \\ + 2024-03-31 16:21:36.454 +00:00 & [INF] & Query-Time for Package "beta" completed in 204.5 ms \\ + 2024-03-31 16:21:36.662 +00:00 & [INF] & Query-Time for Package "meta" completed in 207.4 ms \\ + 2024-03-31 16:21:36.868 +00:00 & [INF] & Query-Time for Package "META" completed in 205.9 ms \\ + 2024-03-31 16:21:37.077 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 208.8 ms \\ + 2024-03-31 16:21:37.284 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.3 ms \\ + 2024-03-31 16:21:37.493 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 209.0 ms \\ + 2024-03-31 16:21:37.701 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 207.6 ms \\ + 2024-03-31 16:21:37.908 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 207.2 ms \\ + 2024-03-31 16:21:38.115 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 206.3 ms \\ + 2024-03-31 16:21:38.320 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 205.5 ms \\ + 2024-03-31 16:21:38.526 +00:00 & [INF] & Query-Time for Package "depd" completed in 205.8 ms \\ + 2024-03-31 16:21:38.733 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 206.5 ms \\ + 2024-03-31 16:21:38.937 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 204.0 ms \\ + 2024-03-31 16:21:39.143 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 205.8 ms \\ + 2024-03-31 16:21:39.348 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 205.2 ms \\ + 2024-03-31 16:21:39.348 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7234.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 9 von 10} \label{subsubsec:MySQLOhneIndex9von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:22:50.000 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 209.1 ms \\ + 2024-03-31 16:22:50.209 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 208.4 ms \\ + 2024-03-31 16:22:50.422 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 213.5 ms \\ + 2024-03-31 16:22:50.633 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 210.4 ms \\ + 2024-03-31 16:22:50.840 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 206.6 ms \\ + 2024-03-31 16:22:51.050 +00:00 & [INF] & Query-Time for Package "Debian" completed in 210.0 ms \\ + 2024-03-31 16:22:51.259 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 208.7 ms \\ + 2024-03-31 16:22:51.467 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 208.2 ms \\ + 2024-03-31 16:22:51.676 +00:00 & [INF] & Query-Time for Package "arc42" completed in 208.9 ms \\ + 2024-03-31 16:22:51.888 +00:00 & [INF] & Query-Time for Package "cookie" completed in 211.5 ms \\ + 2024-03-31 16:22:52.094 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 206.6 ms \\ + 2024-03-31 16:22:52.304 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 209.6 ms \\ + 2024-03-31 16:22:52.512 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 207.6 ms \\ + 2024-03-31 16:22:52.720 +00:00 & [INF] & Query-Time for Package "parser" completed in 208.2 ms \\ + 2024-03-31 16:22:52.928 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 208.2 ms \\ + 2024-03-31 16:22:53.137 +00:00 & [INF] & Query-Time for Package "php" completed in 208.9 ms \\ + 2024-03-31 16:22:53.347 +00:00 & [INF] & Query-Time for Package "PHP" completed in 208.2 ms \\ + 2024-03-31 16:22:53.557 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 209.1 ms \\ + 2024-03-31 16:22:53.764 +00:00 & [INF] & Query-Time for Package "laravel" completed in 206.9 ms \\ + 2024-03-31 16:22:53.972 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 207.9 ms \\ + 2024-03-31 16:22:54.178 +00:00 & [INF] & Query-Time for Package "beta" completed in 205.9 ms \\ + 2024-03-31 16:22:54.385 +00:00 & [INF] & Query-Time for Package "meta" completed in 207.0 ms \\ + 2024-03-31 16:22:54.595 +00:00 & [INF] & Query-Time for Package "META" completed in 209.3 ms \\ + 2024-03-31 16:22:54.803 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 208.4 ms \\ + 2024-03-31 16:22:55.010 +00:00 & [INF] & Query-Time for Package "accepts" completed in 206.5 ms \\ + 2024-03-31 16:22:55.217 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 207.3 ms \\ + 2024-03-31 16:22:55.427 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 209.3 ms \\ + 2024-03-31 16:22:55.634 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 207.1 ms \\ + 2024-03-31 16:22:55.842 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 207.9 ms \\ + 2024-03-31 16:22:56.048 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 206.4 ms \\ + 2024-03-31 16:22:56.255 +00:00 & [INF] & Query-Time for Package "depd" completed in 207.1 ms \\ + 2024-03-31 16:22:56.461 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 205.8 ms \\ + 2024-03-31 16:22:56.672 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 210.7 ms \\ + 2024-03-31 16:22:56.878 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 206.2 ms \\ + 2024-03-31 16:22:57.087 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 208.4 ms \\ + 2024-03-31 16:22:57.087 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7295.9 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 10 von 10} \label{subsubsec:MySQLOhneIndex10von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:24:49.065 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 203.3 ms \\ + 2024-03-31 16:24:49.272 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 207.2 ms \\ + 2024-03-31 16:24:49.480 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 207.4 ms \\ + 2024-03-31 16:24:49.688 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 208.5 ms \\ + 2024-03-31 16:24:49.895 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 206.1 ms \\ + 2024-03-31 16:24:50.102 +00:00 & [INF] & Query-Time for Package "Debian" completed in 206.8 ms \\ + 2024-03-31 16:24:50.308 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 205.8 ms \\ + 2024-03-31 16:24:50.515 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.2 ms \\ + 2024-03-31 16:24:50.720 +00:00 & [INF] & Query-Time for Package "arc42" completed in 204.6 ms \\ + 2024-03-31 16:24:50.926 +00:00 & [INF] & Query-Time for Package "cookie" completed in 206.3 ms \\ + 2024-03-31 16:24:51.133 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 207.0 ms \\ + 2024-03-31 16:24:51.340 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.4 ms \\ + 2024-03-31 16:24:51.548 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 208.0 ms \\ + 2024-03-31 16:24:51.754 +00:00 & [INF] & Query-Time for Package "parser" completed in 206.5 ms \\ + 2024-03-31 16:24:51.961 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.0 ms \\ + 2024-03-31 16:24:52.170 +00:00 & [INF] & Query-Time for Package "php" completed in 208.5 ms \\ + 2024-03-31 16:24:52.377 +00:00 & [INF] & Query-Time for Package "PHP" completed in 205.7 ms \\ + 2024-03-31 16:24:52.583 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 205.5 ms \\ + 2024-03-31 16:24:52.789 +00:00 & [INF] & Query-Time for Package "laravel" completed in 205.2 ms \\ + 2024-03-31 16:24:52.994 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 205.4 ms \\ + 2024-03-31 16:24:53.201 +00:00 & [INF] & Query-Time for Package "beta" completed in 206.1 ms \\ + 2024-03-31 16:24:53.407 +00:00 & [INF] & Query-Time for Package "meta" completed in 206.6 ms \\ + 2024-03-31 16:24:53.617 +00:00 & [INF] & Query-Time for Package "META" completed in 209.3 ms \\ + 2024-03-31 16:24:53.822 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 205.4 ms \\ + 2024-03-31 16:24:54.030 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.4 ms \\ + 2024-03-31 16:24:54.236 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 205.9 ms \\ + 2024-03-31 16:24:54.441 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 204.9 ms \\ + 2024-03-31 16:24:54.646 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 204.9 ms \\ + 2024-03-31 16:24:54.852 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 206.4 ms \\ + 2024-03-31 16:24:55.061 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 208.7 ms \\ + 2024-03-31 16:24:55.267 +00:00 & [INF] & Query-Time for Package "depd" completed in 205.6 ms \\ + 2024-03-31 16:24:55.473 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 205.9 ms \\ + 2024-03-31 16:24:55.679 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 206.0 ms \\ + 2024-03-31 16:24:55.885 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 206.5 ms \\ + 2024-03-31 16:24:56.093 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 207.7 ms \\ + 2024-03-31 16:24:56.093 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7231.9 ms \\ + \hline + \end{tabularx} + } + } diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index abe357f..ec561dc 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -186,66 +186,22 @@ \acro{API}[API]{\textbf{A}pplication \textbf{P}rogramming \textbf{I}nterface} \acro{NIST}[NIST]{\textbf{N}ational \textbf{I}nstitute for \textbf{S}tandards and \textbf{T}echnology} \acro{CVE}[CVE]{\textbf{C}ommon \textbf{V}ulnerabilities and \textbf{E}xposures} + \acro{CNA}[CNA]{\textbf{C}VE \textbf{N}umbering \textbf{A}uthority} + \acro{JSON}[JSON]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation} + \acro{JSON-LD}[JSON-LD]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation \textbf{L}inked \textbf{D}ata} \end{acronym} \section{Messungen} \label{sec:Messungen} % TODO: Andere Logs ebenfalls eintragen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} - {\shorthandoff{"} - {\small - \begin{tabularx}{\textwidth}{|l|l|X|} - \hline - \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ - \hline - \endhead - 2024-03-31 16:24:49.065 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 203.3 ms \\ - 2024-03-31 16:24:49.272 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 207.2 ms \\ - 2024-03-31 16:24:49.480 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 207.4 ms \\ - 2024-03-31 16:24:49.688 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 208.5 ms \\ - 2024-03-31 16:24:49.895 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 206.1 ms \\ - 2024-03-31 16:24:50.102 +00:00 & [INF] & Query-Time for Package "Debian" completed in 206.8 ms \\ - 2024-03-31 16:24:50.308 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 205.8 ms \\ - 2024-03-31 16:24:50.515 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 207.2 ms \\ - 2024-03-31 16:24:50.720 +00:00 & [INF] & Query-Time for Package "arc42" completed in 204.6 ms \\ - 2024-03-31 16:24:50.926 +00:00 & [INF] & Query-Time for Package "cookie" completed in 206.3 ms \\ - 2024-03-31 16:24:51.133 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 207.0 ms \\ - 2024-03-31 16:24:51.340 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 206.4 ms \\ - 2024-03-31 16:24:51.548 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 208.0 ms \\ - 2024-03-31 16:24:51.754 +00:00 & [INF] & Query-Time for Package "parser" completed in 206.5 ms \\ - 2024-03-31 16:24:51.961 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 207.0 ms \\ - 2024-03-31 16:24:52.170 +00:00 & [INF] & Query-Time for Package "php" completed in 208.5 ms \\ - 2024-03-31 16:24:52.377 +00:00 & [INF] & Query-Time for Package "PHP" completed in 205.7 ms \\ - 2024-03-31 16:24:52.583 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 205.5 ms \\ - 2024-03-31 16:24:52.789 +00:00 & [INF] & Query-Time for Package "laravel" completed in 205.2 ms \\ - 2024-03-31 16:24:52.994 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 205.4 ms \\ - 2024-03-31 16:24:53.201 +00:00 & [INF] & Query-Time for Package "beta" completed in 206.1 ms \\ - 2024-03-31 16:24:53.407 +00:00 & [INF] & Query-Time for Package "meta" completed in 206.6 ms \\ - 2024-03-31 16:24:53.617 +00:00 & [INF] & Query-Time for Package "META" completed in 209.3 ms \\ - 2024-03-31 16:24:53.822 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 205.4 ms \\ - 2024-03-31 16:24:54.030 +00:00 & [INF] & Query-Time for Package "accepts" completed in 207.4 ms \\ - 2024-03-31 16:24:54.236 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 205.9 ms \\ - 2024-03-31 16:24:54.441 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 204.9 ms \\ - 2024-03-31 16:24:54.646 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 204.9 ms \\ - 2024-03-31 16:24:54.852 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 206.4 ms \\ - 2024-03-31 16:24:55.061 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 208.7 ms \\ - 2024-03-31 16:24:55.267 +00:00 & [INF] & Query-Time for Package "depd" completed in 205.6 ms \\ - 2024-03-31 16:24:55.473 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 205.9 ms \\ - 2024-03-31 16:24:55.679 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 206.0 ms \\ - 2024-03-31 16:24:55.885 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 206.5 ms \\ - 2024-03-31 16:24:56.093 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 207.7 ms \\ - 2024-03-31 16:24:56.093 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 7231.9 ms \\ - \hline - \end{tabularx} - } - } + \input{Appendix/mySqlWithoutIndex.tex} \end{appendices} \newpage \phantomsection \printbibheading[title={Quellen}] \addcontentsline{toc}{section}{Quellen} - \printbibliography[type=book, heading=subbibliography, title={Literatur}] + % \printbibliography[type=book, heading=subbibliography, title={Literatur}] % \newpage - % \printbibliography[type=online, heading=subbibliography, title={Links}] + \printbibliography[type=online, heading=subbibliography, title={Links}] % \newpage % \printbibliography[type=article, heading=subbibliography, title={Zeitschriften}] From 580474ccfdbf0ad6df65b8b67993176b7581cff8 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 14 Apr 2024 17:50:10 +0200 Subject: [PATCH 23/60] begin active linking in .bib --- documentation/latex/lib/bib.bib | 39 +++++++----- documentation/latex/lib/main.bbl | 105 ++++++++++++++++++++++++------- 2 files changed, 107 insertions(+), 37 deletions(-) diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index fea5007..fe46c31 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -1,27 +1,38 @@ -@book{Buch:Demo, - author = "Demo", - title = "Demo", - titleaddon = "Demo", - publisher = "Demo", - edition = "Demo", - year = "2023", - isbn = "000-0-00000-000-0" -} -% @online{link:, -% title = "", -% urldate = "2022-xx-xx", -% url = "", -% } % Definition CVE % https://www.redhat.com/de/topics/security/what-is-cve % https://www.cve.org/ProgramOrganization/CNAs +@online{link:RedHatCveDef, + title = "Was bedeutet CVE?", + urldate = "2024-04-14", + url = "https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve", +} +@online{link:CveOrgCnaS, + title = "CVE Numbering Authorities (CNAs)", + urldate = "2024-04-14", + url = "https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs", +} % Def Abhängigkeit % https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de % https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ +@online{link:GoogleDependencies, + title = "Abhängigkeitsverwaltung", + urldate = "2024-04-14", + url = "https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de", +} +@online{link:DevInsiderDependecyDef, + title = "Was ist eine Dependency", + urldate = "2024-04-14", + url = "https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/", +} % Def API % https://aws.amazon.com/what-is/api/ +@online{link:ApiDef, + title = "What is an API (Application Programming Interface)?", + urldate = "2024-04-14", + url = "https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/", +} % Def JSON % https://www.json.org/json-en.html diff --git a/documentation/latex/lib/main.bbl b/documentation/latex/lib/main.bbl index ff7f67a..3dc9ac7 100644 --- a/documentation/latex/lib/main.bbl +++ b/documentation/latex/lib/main.bbl @@ -19,31 +19,90 @@ \refsection{0} \datalist[entry]{none/global//global/global} - \entry{Buch:Demo}{book}{} - \name{author}{1}{}{% - {{hash=f0258b6685684c113bad94d91b8fa02a}{% - family={Demo}, - familyi={D\bibinitperiod}}}% - } - \list{publisher}{1}{% - {Demo}% - } - \strng{namehash}{f0258b6685684c113bad94d91b8fa02a} - \strng{fullhash}{f0258b6685684c113bad94d91b8fa02a} - \strng{bibnamehash}{f0258b6685684c113bad94d91b8fa02a} - \strng{authorbibnamehash}{f0258b6685684c113bad94d91b8fa02a} - \strng{authornamehash}{f0258b6685684c113bad94d91b8fa02a} - \strng{authorfullhash}{f0258b6685684c113bad94d91b8fa02a} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} - \field{labelnamesource}{author} + \entry{link:RedHatCveDef}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} - \field{edition}{Demo} - \field{isbn}{000-0-00000-000-0} - \field{title}{Demo} - \field{titleaddon}{Demo} - \field{year}{2023} + \field{title}{Was bedeutet CVE?} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \verb{url} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \endentry + \entry{link:CveOrgCnaS}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{labeltitlesource}{title} + \field{title}{CVE Numbering Authorities (CNAs)} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs + \endverb + \verb{url} + \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs + \endverb + \endentry + \entry{link:GoogleDependencies}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Abhängigkeitsverwaltung} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \verb{url} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \endentry + \entry{link:DevInsiderDependecyDef}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{Was ist eine Dependency} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \endentry + \entry{link:ApiDef}{online}{} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{labeltitlesource}{title} + \field{title}{What is an API (Application Programming Interface)?} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb \endentry \enddatalist \endrefsection From 225439ecf50c4892a8d2ddd851a87d35d5eab880 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 14 Apr 2024 17:51:20 +0200 Subject: [PATCH 24/60] implementation_1 done --- .../latex/3_definitions/definitions.tex | 14 +- .../latex/6_implementation/experiments.tex | 1 + .../6_implementation/implementation_1.tex | 133 +++++++++++++++--- 3 files changed, 122 insertions(+), 26 deletions(-) diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 73bac0f..8de19b6 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -2,10 +2,10 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} \item \textbf{\ac{CVE}:} \\ Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. - \ac{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \acs{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. \\ \glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. - In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (CNA's) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{} + In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (\acs{CNA}'s) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{} Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. @@ -27,14 +27,14 @@ \section{Definitionen} \label{sec:Definitionen} Um eine \ac{API} zu nutzen müssen diese Festlegungen eingehalten werden. - \item \textbf{JSON (JavaScript Object Notation):} \\ - JSON ist ein in der Webentwicklung verbreitetes Datenformat. + \item \textbf{\ac{JSON}:} \\ + \ac{JSON} ist ein in der Webentwicklung verbreitetes Datenformat. Genutzt wird dieses um strukturierte Daten zu speichern und auszutauschen. Basierend auf einer einfachen Syntax, die auf Schlüssel-Wert-Paaren und verschachtelten Datenstrukturen basiert, ermöglicht dieses Format für Mensch sowie Maschine eine gute Les- und Parsbarkeit. - JSON wird häufig für die Übertragung von Daten zwischen Client und Server. + \ac{JSON} wird häufig für die Übertragung von Daten zwischen Client und Server. Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ähnlich der von C, C++ oder C\#. - \item \textbf{JSON-LD (JSON-Linked Data):} \\ - JSON-LD ist ein Linked-Data-Format, welches auf dem JSON-Format basiert. + \item \textbf{\ac{JSON-LD}:} \\ + \ac{JSON-LD} ist ein Linked-Data-Format, welches auf dem \ac{JSON}-Format basiert. Dieses Linked-Data-Format ermöglicht es ein standardisiertes, maschinenlesbares Datennetzwerk über Websites hinweg zu schaffen. \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index 408f1ea..217ae06 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,6 +1,7 @@ \subsection{Experimente} \label{sec:Experimente} \input{6_implementation/db_exp.tex} \input{6_implementation/mysql_index.tex} + %!!!! SUCHE AUF JSON VS DB FILE Experimente \begin{itemize} \item Laufzeitmessungen LiteDB (Mono vs. Pipe -- schon schneller, aber nicht genug $\rightarrow$ fragments/searchStatistics.md) diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index ac6d54b..3c3fbc0 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -1,26 +1,121 @@ \subsection{Implementation V1} \label{sec:Implementation1} - Folgende Komponenten wurden für die erste Implementation genutzt: + Folgende Komponenten wurden für die erste Implementation der \ac{API} genutzt: \begin{itemize} - \item ASP.NET (C\#) - \item LiteDB - \item Docker-Compose + \item Framework ASP.NET (C\#) + \item Datenbank LiteDB + \item Docker-Compose zur Container-Orchestration \end{itemize} - Die genutze Datenbank LiteDB wurde folgend genutzt:\\ %TODO - Folgende Datenmodelle wurden zur Nutzung der Daten in der Datenbank angelegt:\\ %TODO - Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: + + Die genutzte Datenbank LiteDB wurde folgend genutzt: \begin{itemize} - \item Db \\ - Die in der Architektur (Vgl. \ref{arch_2}) - \item Dependecies - \item Git - \item MySqlConnection - \item View + \item Speicherung aller \ac{CVE}-Daten + \item Je Jahr der vorhandenen \ac{CVE}-Daten wurde eine Datenbankdatei angelegt \end{itemize} - Implementation V1 (LiteDB), alle Controller erwähnen, LiteDB, Datenmodelle, Konvertierung von und in Json zu Controller (oben die Punkte), nur ein Container für \ac{API} (inklusive DB darin) + Folgende Datenmodelle wurden zur Nutzung der Daten in der Datenbank und/oder zur internen Verarbeitung angelegt: \begin{itemize} - \item removed Controller-Endpoints: - \item Db/CheckRawDir (check if the downloaded \ac{CVE}-dir is ready to convert) - \item Db/ConvertRawDirToDb (Convert the downloaded \ac{CVE} to LiteDB) - \item Git/cloneStatus (if the current clone is finished) - \end{itemize} \ No newline at end of file + \item CVEcomp, für CVE-Complete \\ + Dieses Modell ist eine komplette Representation eines \ac{CVE}-Eintrags. + Für dieses Modell sind viele weitere Klassen notwendig um mit dem JSONSerializer den kompletten Datensatz umwandeln und anschließend in die interne Datenbank einfügen zu können. + Es befinden sich als Klassen alle weiteren Subelemente der \ac{JSON}-Datei für die korrekte Verarbeitung im Programm. + \item CveResult \\ + Dieses Modell dient der Rückgabe von \ac{CVE}-Daten bei der Einzelpaket- oder Mehrpaketsuche auf der Datenbasis. + Hier wird also ein Objekt oder eine Liste dieses Modells zurückgegeben. + \item JsonLdObject \\ + Mittels diese Modells wird das Verbinden des \ac{JSON-LD} \textit{$@context$} mit dem \textit{$data$} Teil einer Response ermöglicht. + % \item PackageForApi %! SIEHE V2 + % \item RepoObject %! SIEHE V2 + \item $[$Enum$]$ ProjectType \\ + Dieses Enum wurde eingeführt, damit bei Nutzung des Repository-Analyze-Endpunkts nicht der Projekttyp als String (z.B. NodeJS) sondern ein Ganzzahlwert anstatt dessen genutzt werden kann. + Die Entscheidung dafür fiel, damit mögliche Schreibfehler vom Endnutzer ausgeschlossen werden können. + \end{itemize} + + Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: + \begin{itemize} + \item DbController \\ + Dieser Controller dient der Befüllung der Datenbank mit \ac{CVE}-Daten sowie der Nutzung dieser für kleinere Analysen. Dies sind z.B. einzelne Pakete oder Listen von Paketen. + \begin{itemize} + \item CheckRawDir-Endpunkt \\ + Dieser Get-Endpunkt dient zur Überprüfung, ob die Roh-Daten für die \ac{CVE}-LiteDB-Datenbank bereits vollständig Herunterladen wurden. + \\ + \textbf{OK} bei Vorhandensein + \\ + \textbf{No Content} bei nicht Vorhandensein der Datenbasis + \item ConvertRawDirToDb-Endpunkt \\ + Dieser Endpunkt dient der Konvertierung des heruntergeladenen \ac{CVE}-Daten-Repositories in die intern nutzbaren LiteDB Datenbankdateien. + Dies ist für die Vermeidung der Volltextsuche auf den \ac{JSON}-Dateien des \ac{CVE}-Repositories zwingend notwendig. + \\ + \textbf{OK} wird immer zurückgegeben. + \item checkSinglePackage-Endpunkt \\ + Durch diesen Post-Endpunkt wird durch einen übergebenen Paketnamen und ggf. dessen Version nach \ac{CVE}-Einträgen zu diesem gesucht. + Falls es diese gibt werden sie als Liste zurückgegeben. + \\ + \textbf{OK} bei Vorhandensein mit Rückgabe der Liste + \\ + \textbf{No Content} bei nicht Vorhandensein ohne weitere Rückgabe. + \item checkPackageList-Endpunkt \\ + Durch diesen Post-Endpunkt werden durch eine übergebene Liste eines Tupels aus Paketnamen und Version nach \ac{CVE}-Einträgen zu diesen gesucht. + Falls es diese gibt werden sie als Liste zurückgegeben. + \\ + \textbf{OK} bei Vorhandensein mit Rückgabe der \ac{CVE}-Daten-Liste + \\ + \textbf{No Content} bei nicht Vorhandensein ohne weitere Rückgabe + \end{itemize} + + \item DependeciesController \\ + Dieser Controller dient der Extraktion des Abhängigkeitsbaumes von Repositories und der Analyse dieser. + Dabei bedeutet Analyse eine Untersuchung auf \ac{CVE}-Daten für jegliche im Repository enthaltene Pakete. + \begin{itemize} + \item ExtractTree-Endpunkt \\ + Bei diesem Get-Endpunkt wird je nach Projekttyp, z.B. NodeJs, der Abhängigkeitsbaum extrahiert. + \\ + \textbf{OK} mit dem Abhängigkeitsbäumen für alle Abhängigkeiten des Repositories im Response-Body + \\ + \textbf{Bad Request} bei nicht Vorhandensein des angegebenen Projekttyps + \item ExtractAndAnalyzeTree-Endpunkt \\ + Bei diesem Get-Endpunkt handelt es sich um eine Erweiterung des ExtractTree-Endpunkts. + Es der wird zusätzlich für jedes Paket im Repository und in dessen Abhängigkeitsbaum eine Suche auf der CVE-Datenbasis durchgeführt und in der jeweiligen Stelle im Abhängigkeitsbaum das Attribut isCveTracked wahr gesetzt wird. + \\ + \textbf{OK} mit dem Analysierten Abhängigkeitsbäumen für alle Abhängigkeiten des Repositories im Response-Body + \\ + \textbf{229 Keine Schwachstelle gefunden} bei keiner gefundenen Schwachstelle in allen Abhängigkeitsbäumen + \\ + \textbf{Bad Request} bei nicht Vorhandensein des angegebenen Projekttyps + \end{itemize} + + \item GitController \\ + Da die \ac{CVE}-Daten sowie die zu untersuchenden Repositories ihre Datenbasis in GitHub\cite{GITHUB} haben, werden diese durch diesen Controller gecloned. + \begin{itemize} + \item Clone-Endpunkt \\ + Bei deisem Post-Endpunkt wird das CVE-Daten-Repository bzw. das zu analysierende Repository aus GitHub heruntergeladen. + Übergeben wird hier ein Tupel aus Strings, welches die URL und ein Tag beinhaltet sowie einen Boolwert, der angibt, ob es sich um CVE-Daten oder ein Analyserepository handelt. + \\ + \textbf{OK} bei erfolgreichem Herunterladen + \\ + \textbf{Bad Request} bei nicht erfolgreichem Herunterladen + \end{itemize} + + % \item MySqlConnectionController \\ %! V2 + % Dieser Controller hat die Aufgabe die Erreichbarkeit der Datenbank zu überprüfen. %! V2 + + \item ViewController \\ + In diesem Controller werden als HTML alle \ac{JSON-LD} Beschreibungen -- siehe $@context$ -- zurückgegeben. + \begin{itemize} + \item json-ld-Endpunkt \\ + In diesem Get-Endpunkt wird die JSON-LD-Definition als ansehbare HTML-Daten dargestellt. + \\ + \textbf{OK} mit den HTML-Daten als Inhalt des Response-Bodys + \end{itemize} + \end{itemize} + + % Konvertierung von und in \ac{JSON} zu Controller (oben die Punkte) + % \begin{itemize} + % \item removed Controller-Endpoints: + % \item Db/CheckRawDir (check if the downloaded \ac{CVE}-dir is ready to convert) + % \item Db/ConvertRawDirToDb (Convert the downloaded \ac{CVE} to LiteDB) + % \item Git/cloneStatus (if the current clone is finished) + % \end{itemize} + + Um diese Applikation jetzt unabhängig vom Betriebssystem des Endgerätes zu machen, wurde eine docker-compose-Datei für die Containerisierung erstellt. + Dieses referenzierte ein einzelnes Dockerfile mit dem Container der API. + Ein eigenständiger Datenbankcontainer ist aufgrund der Eigenart von LiteDB als dateibasierte Datenbank nicht notwendig. From 20675f5675d7e373d397cb17fb658c039496e1b6 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:11:04 +0200 Subject: [PATCH 25/60] next meassurement --- documentation/latex/6_implementation/implementation_1.tex | 1 + documentation/latex/main.tex | 1 + 2 files changed, 2 insertions(+) diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index 3c3fbc0..2da33f5 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -1,4 +1,5 @@ \subsection{Implementation V1} \label{sec:Implementation1} + \textcolor{red}{PIPELINE BILDER (svg im pap Ordner)} Folgende Komponenten wurden für die erste Implementation der \ac{API} genutzt: \begin{itemize} \item Framework ASP.NET (C\#) diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index ec561dc..b55fbc1 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -192,6 +192,7 @@ \end{acronym} \section{Messungen} \label{sec:Messungen} % TODO: Andere Logs ebenfalls eintragen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} \end{appendices} From 6c0242ff84775e328cf1842e875b6bbaa0f05cc9 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:11:39 +0200 Subject: [PATCH 26/60] mySqlWithIndex.tex added --- .../latex/Appendix/mySqlWithIndex.tex | 490 ++++++++++++++++++ 1 file changed, 490 insertions(+) create mode 100644 documentation/latex/Appendix/mySqlWithIndex.tex diff --git a/documentation/latex/Appendix/mySqlWithIndex.tex b/documentation/latex/Appendix/mySqlWithIndex.tex new file mode 100644 index 0000000..f30f655 --- /dev/null +++ b/documentation/latex/Appendix/mySqlWithIndex.tex @@ -0,0 +1,490 @@ +\subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} + \subsubsection{Messung 1 von 10} \label{subsubsec:MySQLMitIndex1von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 15:51:16.604 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 64.0 ms \\ + 2024-03-31 15:51:16.662 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 1.4 ms \\ + 2024-03-31 15:51:16.663 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.5 ms \\ + 2024-03-31 15:51:16.664 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.7 ms \\ + 2024-03-31 15:51:16.667 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 2.5 ms \\ + 2024-03-31 15:51:16.668 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.7 ms \\ + 2024-03-31 15:51:16.669 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.7 ms \\ + 2024-03-31 15:51:16.670 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.7 ms \\ + 2024-03-31 15:51:16.670 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.5 ms \\ + 2024-03-31 15:51:16.671 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.7 ms \\ + 2024-03-31 15:51:16.672 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.8 ms \\ + 2024-03-31 15:51:16.672 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.5 ms \\ + 2024-03-31 15:51:16.673 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.5 ms \\ + 2024-03-31 15:51:16.674 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.7 ms \\ + 2024-03-31 15:51:16.675 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.6 ms \\ + 2024-03-31 15:51:16.680 +00:00 & [INF] & Query-Time for Package "php" completed in 5.6 ms \\ + 2024-03-31 15:51:16.693 +00:00 & [INF] & Query-Time for Package "PHP" completed in 1.5 ms \\ + 2024-03-31 15:51:16.700 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 1.6 ms \\ + 2024-03-31 15:51:16.701 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.5 ms \\ + 2024-03-31 15:51:16.702 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.5 ms \\ + 2024-03-31 15:51:16.703 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.7 ms \\ + 2024-03-31 15:51:16.704 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.9 ms \\ + 2024-03-31 15:51:16.705 +00:00 & [INF] & Query-Time for Package "META" completed in 0.6 ms \\ + 2024-03-31 15:51:16.706 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.7 ms \\ + 2024-03-31 15:51:16.707 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.7 ms \\ + 2024-03-31 15:51:16.707 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.7 ms \\ + 2024-03-31 15:51:16.708 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.5 ms \\ + 2024-03-31 15:51:16.709 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.6 ms \\ + 2024-03-31 15:51:16.709 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.6 ms \\ + 2024-03-31 15:51:16.710 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.6 ms \\ + 2024-03-31 15:51:16.711 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.6 ms \\ + 2024-03-31 15:51:16.711 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.6 ms \\ + 2024-03-31 15:51:16.712 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.6 ms \\ + 2024-03-31 15:51:16.713 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.6 ms \\ + 2024-03-31 15:51:16.714 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.7 ms \\ + 2024-03-31 15:51:16.714 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 181.8 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 2 von 10} \label{subsubsec:MySQLMitIndex2von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 15:52:47.286 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.9 ms \\ + 2024-03-31 15:52:47.287 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.5 ms \\ + 2024-03-31 15:52:47.287 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.4 ms \\ + 2024-03-31 15:52:47.288 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.6 ms \\ + 2024-03-31 15:52:47.290 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.5 ms \\ + 2024-03-31 15:52:47.290 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.4 ms \\ + 2024-03-31 15:52:47.291 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.4 ms \\ + 2024-03-31 15:52:47.291 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.5 ms \\ + 2024-03-31 15:52:47.292 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.4 ms \\ + 2024-03-31 15:52:47.292 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.4 ms \\ + 2024-03-31 15:52:47.293 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.4 ms \\ + 2024-03-31 15:52:47.293 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.4 ms \\ + 2024-03-31 15:52:47.294 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.4 ms \\ + 2024-03-31 15:52:47.294 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.5 ms \\ + 2024-03-31 15:52:47.295 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.6 ms \\ + 2024-03-31 15:52:47.296 +00:00 & [INF] & Query-Time for Package "php" completed in 1.0 ms \\ + 2024-03-31 15:52:47.303 +00:00 & [INF] & Query-Time for Package "PHP" completed in 1.0 ms \\ + 2024-03-31 15:52:47.309 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.5 ms \\ + 2024-03-31 15:52:47.310 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.5 ms \\ + 2024-03-31 15:52:47.311 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.4 ms \\ + 2024-03-31 15:52:47.311 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.5 ms \\ + 2024-03-31 15:52:47.312 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.4 ms \\ + 2024-03-31 15:52:47.312 +00:00 & [INF] & Query-Time for Package "META" completed in 0.4 ms \\ + 2024-03-31 15:52:47.313 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.4 ms \\ + 2024-03-31 15:52:47.313 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.4 ms \\ + 2024-03-31 15:52:47.314 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.4 ms \\ + 2024-03-31 15:52:47.314 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.4 ms \\ + 2024-03-31 15:52:47.315 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.4 ms \\ + 2024-03-31 15:52:47.315 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.4 ms \\ + 2024-03-31 15:52:47.316 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.5 ms \\ + 2024-03-31 15:52:47.316 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.4 ms \\ + 2024-03-31 15:52:47.317 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.4 ms \\ + 2024-03-31 15:52:47.317 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.4 ms \\ + 2024-03-31 15:52:47.318 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.4 ms \\ + 2024-03-31 15:52:47.318 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.4 ms \\ + 2024-03-31 15:52:47.318 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 33.5 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 3 von 10} \label{subsubsec:MySQLMitIndex3von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 15:56:58.682 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.8 ms \\ + 2024-03-31 15:56:58.683 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.5 ms \\ + 2024-03-31 15:56:58.684 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.5 ms \\ + 2024-03-31 15:56:58.684 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.6 ms \\ + 2024-03-31 15:56:58.686 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.9 ms \\ + 2024-03-31 15:56:58.687 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.5 ms \\ + 2024-03-31 15:56:58.688 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.4 ms \\ + 2024-03-31 15:56:58.688 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.5 ms \\ + 2024-03-31 15:56:58.689 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.5 ms \\ + 2024-03-31 15:56:58.690 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.9 ms \\ + 2024-03-31 15:56:58.691 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.7 ms \\ + 2024-03-31 15:56:58.692 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.8 ms \\ + 2024-03-31 15:56:58.693 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 1.0 ms \\ + 2024-03-31 15:56:58.694 +00:00 & [INF] & Query-Time for Package "parser" completed in 1.0 ms \\ + 2024-03-31 15:56:58.695 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 1.0 ms \\ + 2024-03-31 15:56:58.697 +00:00 & [INF] & Query-Time for Package "php" completed in 1.2 ms \\ + 2024-03-31 15:56:58.705 +00:00 & [INF] & Query-Time for Package "PHP" completed in 1.5 ms \\ + 2024-03-31 15:56:58.714 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.8 ms \\ + 2024-03-31 15:56:58.715 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.5 ms \\ + 2024-03-31 15:56:58.716 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.5 ms \\ + 2024-03-31 15:56:58.717 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.4 ms \\ + 2024-03-31 15:56:58.717 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.4 ms \\ + 2024-03-31 15:56:58.718 +00:00 & [INF] & Query-Time for Package "META" completed in 0.4 ms \\ + 2024-03-31 15:56:58.718 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.4 ms \\ + 2024-03-31 15:56:58.719 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.4 ms \\ + 2024-03-31 15:56:58.719 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.4 ms \\ + 2024-03-31 15:56:58.720 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.4 ms \\ + 2024-03-31 15:56:58.721 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.5 ms \\ + 2024-03-31 15:56:58.721 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.4 ms \\ + 2024-03-31 15:56:58.722 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.5 ms \\ + 2024-03-31 15:56:58.722 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.4 ms \\ + 2024-03-31 15:56:58.723 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.5 ms \\ + 2024-03-31 15:56:58.723 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.4 ms \\ + 2024-03-31 15:56:58.724 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.4 ms \\ + 2024-03-31 15:56:58.724 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.4 ms \\ + 2024-03-31 15:56:58.724 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 43.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 4 von 10} \label{subsubsec:MySQLMitIndex4von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 15:58:31.441 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 1.0 ms \\ + 2024-03-31 15:58:31.442 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.4 ms \\ + 2024-03-31 15:58:31.442 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.3 ms \\ + 2024-03-31 15:58:31.443 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.6 ms \\ + 2024-03-31 15:58:31.443 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.5 ms \\ + 2024-03-31 15:58:31.444 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.4 ms \\ + 2024-03-31 15:58:31.444 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.3 ms \\ + 2024-03-31 15:58:31.445 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.3 ms \\ + 2024-03-31 15:58:31.445 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.3 ms \\ + 2024-03-31 15:58:31.445 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.3 ms \\ + 2024-03-31 15:58:31.446 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.3 ms \\ + 2024-03-31 15:58:31.446 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.3 ms \\ + 2024-03-31 15:58:31.446 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.4 ms \\ + 2024-03-31 15:58:31.447 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.3 ms \\ + 2024-03-31 15:58:31.447 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.4 ms \\ + 2024-03-31 15:58:31.448 +00:00 & [INF] & Query-Time for Package "php" completed in 0.9 ms \\ + 2024-03-31 15:58:31.450 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.8 ms \\ + 2024-03-31 15:58:31.452 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.4 ms \\ + 2024-03-31 15:58:31.452 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.4 ms \\ + 2024-03-31 15:58:31.452 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.4 ms \\ + 2024-03-31 15:58:31.453 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 15:58:31.453 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 15:58:31.454 +00:00 & [INF] & Query-Time for Package "META" completed in 0.3 ms \\ + 2024-03-31 15:58:31.454 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.3 ms \\ + 2024-03-31 15:58:31.454 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.3 ms \\ + 2024-03-31 15:58:31.455 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.3 ms \\ + 2024-03-31 15:58:31.455 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.3 ms \\ + 2024-03-31 15:58:31.455 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.3 ms \\ + 2024-03-31 15:58:31.456 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.3 ms \\ + 2024-03-31 15:58:31.456 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.2 ms \\ + 2024-03-31 15:58:31.456 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.3 ms \\ + 2024-03-31 15:58:31.457 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.2 ms \\ + 2024-03-31 15:58:31.457 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.2 ms \\ + 2024-03-31 15:58:31.457 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.3 ms \\ + 2024-03-31 15:58:31.458 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.3 ms \\ + 2024-03-31 15:58:31.458 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 17.7 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 5 von 10} \label{subsubsec:MySQLMitIndex5von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 15:59:31.247 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.7 ms \\ + 2024-03-31 15:59:31.247 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.4 ms \\ + 2024-03-31 15:59:31.248 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.3 ms \\ + 2024-03-31 15:59:31.248 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.4 ms \\ + 2024-03-31 15:59:31.249 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.6 ms \\ + 2024-03-31 15:59:31.250 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.4 ms \\ + 2024-03-31 15:59:31.250 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.6 ms \\ + 2024-03-31 15:59:31.251 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.5 ms \\ + 2024-03-31 15:59:31.251 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.4 ms \\ + 2024-03-31 15:59:31.252 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.4 ms \\ + 2024-03-31 15:59:31.252 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.4 ms \\ + 2024-03-31 15:59:31.253 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.5 ms \\ + 2024-03-31 15:59:31.253 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.4 ms \\ + 2024-03-31 15:59:31.254 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.4 ms \\ + 2024-03-31 15:59:31.254 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.4 ms \\ + 2024-03-31 15:59:31.255 +00:00 & [INF] & Query-Time for Package "php" completed in 0.7 ms \\ + 2024-03-31 15:59:31.257 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.8 ms \\ + 2024-03-31 15:59:31.258 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.4 ms \\ + 2024-03-31 15:59:31.259 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.4 ms \\ + 2024-03-31 15:59:31.259 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 15:59:31.259 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 15:59:31.260 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.4 ms \\ + 2024-03-31 15:59:31.260 +00:00 & [INF] & Query-Time for Package "META" completed in 0.4 ms \\ + 2024-03-31 15:59:31.261 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.3 ms \\ + 2024-03-31 15:59:31.261 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.3 ms \\ + 2024-03-31 15:59:31.261 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.3 ms \\ + 2024-03-31 15:59:31.262 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.3 ms \\ + 2024-03-31 15:59:31.262 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.3 ms \\ + 2024-03-31 15:59:31.263 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.3 ms \\ + 2024-03-31 15:59:31.263 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.3 ms \\ + 2024-03-31 15:59:31.263 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.4 ms \\ + 2024-03-31 15:59:31.264 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.3 ms \\ + 2024-03-31 15:59:31.264 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.3 ms \\ + 2024-03-31 15:59:31.264 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.3 ms \\ + 2024-03-31 15:59:31.265 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.3 ms \\ + 2024-03-31 15:59:31.265 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 18.8 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 6 von 10} \label{subsubsec:MySQLMitIndex6von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:01:13.650 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.7 ms \\ + 2024-03-31 16:01:13.651 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.4 ms \\ + 2024-03-31 16:01:13.652 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.5 ms \\ + 2024-03-31 16:01:13.652 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.5 ms \\ + 2024-03-31 16:01:13.653 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.4 ms \\ + 2024-03-31 16:01:13.653 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.3 ms \\ + 2024-03-31 16:01:13.653 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.4 ms \\ + 2024-03-31 16:01:13.654 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.3 ms \\ + 2024-03-31 16:01:13.655 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.6 ms \\ + 2024-03-31 16:01:13.655 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.6 ms \\ + 2024-03-31 16:01:13.656 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.4 ms \\ + 2024-03-31 16:01:13.656 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.4 ms \\ + 2024-03-31 16:01:13.657 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.4 ms \\ + 2024-03-31 16:01:13.657 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.5 ms \\ + 2024-03-31 16:01:13.658 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.4 ms \\ + 2024-03-31 16:01:13.658 +00:00 & [INF] & Query-Time for Package "php" completed in 0.8 ms \\ + 2024-03-31 16:01:13.660 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.8 ms \\ + 2024-03-31 16:01:13.662 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.4 ms \\ + 2024-03-31 16:01:13.662 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.4 ms \\ + 2024-03-31 16:01:13.662 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 16:01:13.663 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 16:01:13.663 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 16:01:13.663 +00:00 & [INF] & Query-Time for Package "META" completed in 0.2 ms \\ + 2024-03-31 16:01:13.664 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.2 ms \\ + 2024-03-31 16:01:13.664 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.3 ms \\ + 2024-03-31 16:01:13.665 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.4 ms \\ + 2024-03-31 16:01:13.665 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.3 ms \\ + 2024-03-31 16:01:13.665 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.3 ms \\ + 2024-03-31 16:01:13.666 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.3 ms \\ + 2024-03-31 16:01:13.666 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.3 ms \\ + 2024-03-31 16:01:13.666 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.2 ms \\ + 2024-03-31 16:01:13.666 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.3 ms \\ + 2024-03-31 16:01:13.667 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.3 ms \\ + 2024-03-31 16:01:13.667 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.2 ms \\ + 2024-03-31 16:01:13.668 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.3 ms \\ + 2024-03-31 16:01:13.668 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 17.9 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 7 von 10} \label{subsubsec:MySQLMitIndex7von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:03:51.640 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.6 ms \\ + 2024-03-31 16:03:51.641 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.4 ms \\ + 2024-03-31 16:03:51.641 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.5 ms \\ + 2024-03-31 16:03:51.642 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.7 ms \\ + 2024-03-31 16:03:51.643 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.7 ms \\ + 2024-03-31 16:03:51.645 +00:00 & [INF] & Query-Time for Package "Debian" completed in 1.0 ms \\ + 2024-03-31 16:03:51.645 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.6 ms \\ + 2024-03-31 16:03:51.646 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.4 ms \\ + 2024-03-31 16:03:51.646 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.3 ms \\ + 2024-03-31 16:03:51.647 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.4 ms \\ + 2024-03-31 16:03:51.647 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.3 ms \\ + 2024-03-31 16:03:51.648 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.5 ms \\ + 2024-03-31 16:03:51.648 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.5 ms \\ + 2024-03-31 16:03:51.649 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.5 ms \\ + 2024-03-31 16:03:51.649 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.4 ms \\ + 2024-03-31 16:03:51.650 +00:00 & [INF] & Query-Time for Package "php" completed in 0.7 ms \\ + 2024-03-31 16:03:51.652 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.7 ms \\ + 2024-03-31 16:03:51.653 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.3 ms \\ + 2024-03-31 16:03:51.654 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.3 ms \\ + 2024-03-31 16:03:51.654 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 16:03:51.654 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 16:03:51.655 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 16:03:51.655 +00:00 & [INF] & Query-Time for Package "META" completed in 0.3 ms \\ + 2024-03-31 16:03:51.655 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.3 ms \\ + 2024-03-31 16:03:51.656 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.3 ms \\ + 2024-03-31 16:03:51.656 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.3 ms \\ + 2024-03-31 16:03:51.656 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.3 ms \\ + 2024-03-31 16:03:51.657 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.3 ms \\ + 2024-03-31 16:03:51.657 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.7 ms \\ + 2024-03-31 16:03:51.658 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.4 ms \\ + 2024-03-31 16:03:51.658 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.3 ms \\ + 2024-03-31 16:03:51.659 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.3 ms \\ + 2024-03-31 16:03:51.659 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.3 ms \\ + 2024-03-31 16:03:51.659 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.3 ms \\ + 2024-03-31 16:03:51.660 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.3 ms \\ + 2024-03-31 16:03:51.660 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 20.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 8 von 10} \label{subsubsec:MySQLMitIndex8von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:04:25.573 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.5 ms \\ + 2024-03-31 16:04:25.573 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.3 ms \\ + 2024-03-31 16:04:25.573 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.3 ms \\ + 2024-03-31 16:04:25.574 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.4 ms \\ + 2024-03-31 16:04:25.574 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.3 ms \\ + 2024-03-31 16:04:25.575 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.3 ms \\ + 2024-03-31 16:04:25.575 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.2 ms \\ + 2024-03-31 16:04:25.575 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.2 ms \\ + 2024-03-31 16:04:25.576 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.2 ms \\ + 2024-03-31 16:04:25.576 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.2 ms \\ + 2024-03-31 16:04:25.576 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.2 ms \\ + 2024-03-31 16:04:25.576 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.2 ms \\ + 2024-03-31 16:04:25.577 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.4 ms \\ + 2024-03-31 16:04:25.577 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.2 ms \\ + 2024-03-31 16:04:25.578 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.3 ms \\ + 2024-03-31 16:04:25.578 +00:00 & [INF] & Query-Time for Package "php" completed in 0.7 ms \\ + 2024-03-31 16:04:25.580 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.7 ms \\ + 2024-03-31 16:04:25.581 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.4 ms \\ + 2024-03-31 16:04:25.582 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.3 ms \\ + 2024-03-31 16:04:25.582 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 16:04:25.583 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 16:04:25.583 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 16:04:25.583 +00:00 & [INF] & Query-Time for Package "META" completed in 0.2 ms \\ + 2024-03-31 16:04:25.583 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.2 ms \\ + 2024-03-31 16:04:25.584 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.2 ms \\ + 2024-03-31 16:04:25.584 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.2 ms \\ + 2024-03-31 16:04:25.584 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.2 ms \\ + 2024-03-31 16:04:25.585 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.2 ms \\ + 2024-03-31 16:04:25.585 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.4 ms \\ + 2024-03-31 16:04:25.585 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.3 ms \\ + 2024-03-31 16:04:25.586 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.3 ms \\ + 2024-03-31 16:04:25.586 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.3 ms \\ + 2024-03-31 16:04:25.586 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.3 ms \\ + 2024-03-31 16:04:25.587 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.2 ms \\ + 2024-03-31 16:04:25.587 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.2 ms \\ + 2024-03-31 16:04:25.587 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 15.1 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 9 von 10} \label{subsubsec:MySQLMitIndex9von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:05:19.085 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.8 ms \\ + 2024-03-31 16:05:19.085 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.5 ms \\ + 2024-03-31 16:05:19.086 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.3 ms \\ + 2024-03-31 16:05:19.086 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.4 ms \\ + 2024-03-31 16:05:19.087 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.4 ms \\ + 2024-03-31 16:05:19.087 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.5 ms \\ + 2024-03-31 16:05:19.088 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.6 ms \\ + 2024-03-31 16:05:19.089 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.7 ms \\ + 2024-03-31 16:05:19.090 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.7 ms \\ + 2024-03-31 16:05:19.090 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.7 ms \\ + 2024-03-31 16:05:19.091 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.5 ms \\ + 2024-03-31 16:05:19.092 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.6 ms \\ + 2024-03-31 16:05:19.092 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.5 ms \\ + 2024-03-31 16:05:19.093 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.4 ms \\ + 2024-03-31 16:05:19.093 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.6 ms \\ + 2024-03-31 16:05:19.094 +00:00 & [INF] & Query-Time for Package "php" completed in 0.9 ms \\ + 2024-03-31 16:05:19.096 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.9 ms \\ + 2024-03-31 16:05:19.098 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.5 ms \\ + 2024-03-31 16:05:19.098 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.4 ms \\ + 2024-03-31 16:05:19.099 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 16:05:19.099 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 16:05:19.100 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 16:05:19.100 +00:00 & [INF] & Query-Time for Package "META" completed in 0.3 ms \\ + 2024-03-31 16:05:19.100 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.3 ms \\ + 2024-03-31 16:05:19.101 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.3 ms \\ + 2024-03-31 16:05:19.101 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.3 ms \\ + 2024-03-31 16:05:19.101 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.3 ms \\ + 2024-03-31 16:05:19.101 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.2 ms \\ + 2024-03-31 16:05:19.102 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.2 ms \\ + 2024-03-31 16:05:19.102 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.2 ms \\ + 2024-03-31 16:05:19.102 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.2 ms \\ + 2024-03-31 16:05:19.103 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.2 ms \\ + 2024-03-31 16:05:19.103 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.2 ms \\ + 2024-03-31 16:05:19.103 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.2 ms \\ + 2024-03-31 16:05:19.103 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.2 ms \\ + 2024-03-31 16:05:19.103 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 19.7 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 10 von 10} \label{subsubsec:MySQLMitIndex10von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-03-31 16:05:57.410 +00:00 & [INF] & Query-Time for Package "LiteDB" completed in 0.6 ms \\ + 2024-03-31 16:05:57.410 +00:00 & [INF] & Query-Time for Package "Newtonsoft" completed in 0.4 ms \\ + 2024-03-31 16:05:57.411 +00:00 & [INF] & Query-Time for Package "NewtonSoft" completed in 0.4 ms \\ + 2024-03-31 16:05:57.411 +00:00 & [INF] & Query-Time for Package "Crowd" completed in 0.5 ms \\ + 2024-03-31 16:05:57.412 +00:00 & [INF] & Query-Time for Package "Atlassian" completed in 0.4 ms \\ + 2024-03-31 16:05:57.412 +00:00 & [INF] & Query-Time for Package "Debian" completed in 0.4 ms \\ + 2024-03-31 16:05:57.413 +00:00 & [INF] & Query-Time for Package "Ubuntu" completed in 0.3 ms \\ + 2024-03-31 16:05:57.413 +00:00 & [INF] & Query-Time for Package "Arc42" completed in 0.3 ms \\ + 2024-03-31 16:05:57.413 +00:00 & [INF] & Query-Time for Package "arc42" completed in 0.3 ms \\ + 2024-03-31 16:05:57.414 +00:00 & [INF] & Query-Time for Package "cookie" completed in 0.3 ms \\ + 2024-03-31 16:05:57.414 +00:00 & [INF] & Query-Time for Package "mongoDb" completed in 0.3 ms \\ + 2024-03-31 16:05:57.414 +00:00 & [INF] & Query-Time for Package "mongoDB" completed in 0.3 ms \\ + 2024-03-31 16:05:57.415 +00:00 & [INF] & Query-Time for Package "mongodb" completed in 0.3 ms \\ + 2024-03-31 16:05:57.415 +00:00 & [INF] & Query-Time for Package "parser" completed in 0.3 ms \\ + 2024-03-31 16:05:57.415 +00:00 & [INF] & Query-Time for Package "LiteDb" completed in 0.3 ms \\ + 2024-03-31 16:05:57.416 +00:00 & [INF] & Query-Time for Package "php" completed in 0.6 ms \\ + 2024-03-31 16:05:57.417 +00:00 & [INF] & Query-Time for Package "PHP" completed in 0.7 ms \\ + 2024-03-31 16:05:57.419 +00:00 & [INF] & Query-Time for Package "Laravel" completed in 0.3 ms \\ + 2024-03-31 16:05:57.419 +00:00 & [INF] & Query-Time for Package "laravel" completed in 0.3 ms \\ + 2024-03-31 16:05:57.419 +00:00 & [INF] & Query-Time for Package "LARAVEL" completed in 0.3 ms \\ + 2024-03-31 16:05:57.420 +00:00 & [INF] & Query-Time for Package "beta" completed in 0.3 ms \\ + 2024-03-31 16:05:57.420 +00:00 & [INF] & Query-Time for Package "meta" completed in 0.3 ms \\ + 2024-03-31 16:05:57.420 +00:00 & [INF] & Query-Time for Package "META" completed in 0.3 ms \\ + 2024-03-31 16:05:57.421 +00:00 & [INF] & Query-Time for Package "express-ejs-layouts" completed in 0.2 ms \\ + 2024-03-31 16:05:57.421 +00:00 & [INF] & Query-Time for Package "accepts" completed in 0.2 ms \\ + 2024-03-31 16:05:57.421 +00:00 & [INF] & Query-Time for Package "mime-db" completed in 0.3 ms \\ + 2024-03-31 16:05:57.422 +00:00 & [INF] & Query-Time for Package "mime-DB" completed in 0.2 ms \\ + 2024-03-31 16:05:57.422 +00:00 & [INF] & Query-Time for Package "iconv-lite" completed in 0.2 ms \\ + 2024-03-31 16:05:57.422 +00:00 & [INF] & Query-Time for Package "safer-buffer" completed in 0.2 ms \\ + 2024-03-31 16:05:57.422 +00:00 & [INF] & Query-Time for Package "raw-body" completed in 0.2 ms \\ + 2024-03-31 16:05:57.423 +00:00 & [INF] & Query-Time for Package "depd" completed in 0.2 ms \\ + 2024-03-31 16:05:57.423 +00:00 & [INF] & Query-Time for Package "finalhandler" completed in 0.2 ms \\ + 2024-03-31 16:05:57.423 +00:00 & [INF] & Query-Time for Package "on-finished" completed in 0.3 ms \\ + 2024-03-31 16:05:57.424 +00:00 & [INF] & Query-Time for Package "ipaddr.js" completed in 0.2 ms \\ + 2024-03-31 16:05:57.424 +00:00 & [INF] & Query-Time for Package "encodeurl" completed in 0.2 ms \\ + 2024-03-31 16:05:57.424 +00:00 & [INF] & Complete Time for Query-Search after List of Packages completed in 15.0 ms \\ + \hline + \end{tabularx} + } + } From 8ff713d3b47460379c48dea500acde78d4a990bf Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 14 Apr 2024 19:42:42 +0200 Subject: [PATCH 27/60] meassurement with LiteDB 1 of 2 --- .../latex/Appendix/litedbMonoPipe.tex | 243 ++++++++++++++++++ documentation/latex/main.tex | 5 + 2 files changed, 248 insertions(+) create mode 100644 documentation/latex/Appendix/litedbMonoPipe.tex diff --git a/documentation/latex/Appendix/litedbMonoPipe.tex b/documentation/latex/Appendix/litedbMonoPipe.tex new file mode 100644 index 0000000..f8bb18f --- /dev/null +++ b/documentation/latex/Appendix/litedbMonoPipe.tex @@ -0,0 +1,243 @@ +\subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: weniger Pakete als Datenbanken} \label{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} + \subsubsection{Messung 1 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb1von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 16:52:48.970 +01:00 & [INF] & Time by mono LiteDB completed in 4147.1 ms \\ + 2024-02-20 16:52:51.848 +01:00 & [INF] & Time by mono Newtonsoft completed in 2866.1 ms \\ + 2024-02-20 16:52:54.625 +01:00 & [INF] & Time by mono NewtonSoft completed in 2776.4 ms \\ + 2024-02-20 16:52:57.421 +01:00 & [INF] & Time by mono Crowd completed in 2796.2 ms \\ + 2024-02-20 16:53:00.201 +01:00 & [INF] & Time by mono Atlassian completed in 2779.7 ms \\ + 2024-02-20 16:53:02.980 +01:00 & [INF] & Time by mono Debian completed in 2779.5 ms \\ + 2024-02-20 16:53:05.740 +01:00 & [INF] & Time by mono Ubuntu completed in 2760.0 ms \\ + 2024-02-20 16:53:08.605 +01:00 & [INF] & Time by mono Arc42 completed in 2864.0 ms \\ + 2024-02-20 16:53:13.009 +01:00 & [INF] & Time by mono arc42 completed in 4404.5 ms \\ + & & \\ + 2024-02-20 16:53:24.805 +01:00 & [INF] & Time by pipe completed in 11794.7 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 2 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb2von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 16:54:34.973 +01:00 & [INF] & Time by mono LiteDB completed in 4004.3 ms \\ + 2024-02-20 16:54:37.857 +01:00 & [INF] & Time by mono Newtonsoft completed in 2866.0 ms \\ + 2024-02-20 16:54:40.656 +01:00 & [INF] & Time by mono NewtonSoft completed in 2799.1 ms \\ + 2024-02-20 16:54:43.436 +01:00 & [INF] & Time by mono Crowd completed in 2780.3 ms \\ + 2024-02-20 16:54:46.207 +01:00 & [INF] & Time by mono Atlassian completed in 2770.9 ms \\ + 2024-02-20 16:54:48.966 +01:00 & [INF] & Time by mono Debian completed in 2758.1 ms \\ + 2024-02-20 16:54:51.740 +01:00 & [INF] & Time by mono Ubuntu completed in 2774.3 ms \\ + 2024-02-20 16:54:54.543 +01:00 & [INF] & Time by mono Arc42 completed in 2803.2 ms \\ + 2024-02-20 16:54:57.289 +01:00 & [INF] & Time by mono arc42 completed in 2745.9 ms \\ + & & \\ + 2024-02-20 16:55:07.436 +01:00 & [INF] & Time by pipe completed in 10146.6 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 3 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb3von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 16:55:57.166 +01:00 & [INF] & Time by mono LiteDB completed in 4102.0 ms \\ + 2024-02-20 16:55:59.938 +01:00 & [INF] & Time by mono Newtonsoft completed in 2761.0 ms \\ + 2024-02-20 16:56:02.704 +01:00 & [INF] & Time by mono NewtonSoft completed in 2766.5 ms \\ + 2024-02-20 16:56:05.472 +01:00 & [INF] & Time by mono Crowd completed in 2767.9 ms \\ + 2024-02-20 16:56:08.227 +01:00 & [INF] & Time by mono Atlassian completed in 2754.5 ms \\ + 2024-02-20 16:56:10.970 +01:00 & [INF] & Time by mono Debian completed in 2742.7 ms \\ + 2024-02-20 16:56:13.729 +01:00 & [INF] & Time by mono Ubuntu completed in 2759.3 ms \\ + 2024-02-20 16:56:16.484 +01:00 & [INF] & Time by mono Arc42 completed in 2754.3 ms \\ + 2024-02-20 16:56:19.254 +01:00 & [INF] & Time by mono arc42 completed in 2770.2 ms \\ + & & \\ + 2024-02-20 16:56:28.535 +01:00 & [INF] & Time by pipe completed in 9281.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 4 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb4von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 16:57:34.891 +01:00 & [INF] & Time by mono LiteDB completed in 4750.3 ms \\ + 2024-02-20 16:57:37.679 +01:00 & [INF] & Time by mono Newtonsoft completed in 2777.6 ms \\ + 2024-02-20 16:57:40.432 +01:00 & [INF] & Time by mono NewtonSoft completed in 2752.7 ms \\ + 2024-02-20 16:57:43.144 +01:00 & [INF] & Time by mono Crowd completed in 2712.3 ms \\ + 2024-02-20 16:57:45.869 +01:00 & [INF] & Time by mono Atlassian completed in 2724.7 ms \\ + 2024-02-20 16:57:48.584 +01:00 & [INF] & Time by mono Debian completed in 2715.0 ms \\ + 2024-02-20 16:57:51.292 +01:00 & [INF] & Time by mono Ubuntu completed in 2708.1 ms \\ + 2024-02-20 16:57:53.999 +01:00 & [INF] & Time by mono Arc42 completed in 2706.5 ms \\ + 2024-02-20 16:57:56.718 +01:00 & [INF] & Time by mono arc42 completed in 2718.8 ms \\ + & & \\ + 2024-02-20 16:58:06.284 +01:00 & [INF] & Time by pipe completed in 9566.3 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 5 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb5von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 16:58:52.421 +01:00 & [INF] & Time by mono LiteDB completed in 4087.7 ms \\ + 2024-02-20 16:58:55.148 +01:00 & [INF] & Time by mono Newtonsoft completed in 2716.4 ms \\ + 2024-02-20 16:58:57.845 +01:00 & [INF] & Time by mono NewtonSoft completed in 2697.0 ms \\ + 2024-02-20 16:59:00.541 +01:00 & [INF] & Time by mono Crowd completed in 2696.4 ms \\ + 2024-02-20 16:59:03.256 +01:00 & [INF] & Time by mono Atlassian completed in 2714.8 ms \\ + 2024-02-20 16:59:05.957 +01:00 & [INF] & Time by mono Debian completed in 2700.4 ms \\ + 2024-02-20 16:59:08.659 +01:00 & [INF] & Time by mono Ubuntu completed in 2701.9 ms \\ + 2024-02-20 16:59:11.364 +01:00 & [INF] & Time by mono Arc42 completed in 2705.2 ms \\ + 2024-02-20 16:59:14.060 +01:00 & [INF] & Time by mono arc42 completed in 2696.0 ms \\ + & & \\ + 2024-02-20 16:59:23.294 +01:00 & [INF] & Time by pipe completed in 9233.7 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 6 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb6von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 17:00:07.005 +01:00 & [INF] & Time by mono LiteDB completed in 4338.2 ms \\ + 2024-02-20 17:00:09.769 +01:00 & [INF] & Time by mono Newtonsoft completed in 2753.6 ms \\ + 2024-02-20 17:00:12.514 +01:00 & [INF] & Time by mono NewtonSoft completed in 2744.4 ms \\ + 2024-02-20 17:00:15.243 +01:00 & [INF] & Time by mono Crowd completed in 2729.1 ms \\ + 2024-02-20 17:00:17.996 +01:00 & [INF] & Time by mono Atlassian completed in 2753.0 ms \\ + 2024-02-20 17:00:20.738 +01:00 & [INF] & Time by mono Debian completed in 2741.7 ms \\ + 2024-02-20 17:00:23.465 +01:00 & [INF] & Time by mono Ubuntu completed in 2726.5 ms \\ + 2024-02-20 17:00:26.193 +01:00 & [INF] & Time by mono Arc42 completed in 2728.0 ms \\ + 2024-02-20 17:00:28.908 +01:00 & [INF] & Time by mono arc42 completed in 2715.0 ms \\ + & & \\ + 2024-02-20 17:00:38.115 +01:00 & [INF] & Time by pipe completed in 9207.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 7 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb7von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 17:01:15.254 +01:00 & [INF] & Time by mono LiteDB completed in 4183.9 ms \\ + 2024-02-20 17:01:18.155 +01:00 & [INF] & Time by mono Newtonsoft completed in 2882.7 ms \\ + 2024-02-20 17:01:20.884 +01:00 & [INF] & Time by mono NewtonSoft completed in 2729.3 ms \\ + 2024-02-20 17:01:23.624 +01:00 & [INF] & Time by mono Crowd completed in 2740.1 ms \\ + 2024-02-20 17:01:26.347 +01:00 & [INF] & Time by mono Atlassian completed in 2722.7 ms \\ + 2024-02-20 17:01:29.068 +01:00 & [INF] & Time by mono Debian completed in 2721.1 ms \\ + 2024-02-20 17:01:31.809 +01:00 & [INF] & Time by mono Ubuntu completed in 2740.8 ms \\ + 2024-02-20 17:01:34.544 +01:00 & [INF] & Time by mono Arc42 completed in 2734.4 ms \\ + 2024-02-20 17:01:37.332 +01:00 & [INF] & Time by mono arc42 completed in 2788.2 ms \\ + & & \\ + 2024-02-20 17:01:46.705 +01:00 & [INF] & Time by pipe completed in 9372.5 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 8 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb8von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 17:02:26.668 +01:00 & [INF] & Time by mono LiteDB completed in 4080.0 ms \\ + 2024-02-20 17:02:29.378 +01:00 & [INF] & Time by mono Newtonsoft completed in 2699.1 ms \\ + 2024-02-20 17:02:32.081 +01:00 & [INF] & Time by mono NewtonSoft completed in 2703.3 ms \\ + 2024-02-20 17:02:34.793 +01:00 & [INF] & Time by mono Crowd completed in 2711.8 ms \\ + 2024-02-20 17:02:37.499 +01:00 & [INF] & Time by mono Atlassian completed in 2706.1 ms \\ + 2024-02-20 17:02:40.194 +01:00 & [INF] & Time by mono Debian completed in 2694.4 ms \\ + 2024-02-20 17:02:42.884 +01:00 & [INF] & Time by mono Ubuntu completed in 2689.8 ms \\ + 2024-02-20 17:02:45.583 +01:00 & [INF] & Time by mono Arc42 completed in 2699.5 ms \\ + 2024-02-20 17:02:48.283 +01:00 & [INF] & Time by mono arc42 completed in 2699.5 ms \\ + & & \\ + 2024-02-20 17:02:57.652 +01:00 & [INF] & Time by pipe completed in 9369.2 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 9 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb9von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 17:03:46.609 +01:00 & [INF] & Time by mono LiteDB completed in 4061.9 ms \\ + 2024-02-20 17:03:49.326 +01:00 & [INF] & Time by mono Newtonsoft completed in 2706.6 ms \\ + 2024-02-20 17:03:52.066 +01:00 & [INF] & Time by mono NewtonSoft completed in 2739.0 ms \\ + 2024-02-20 17:03:54.813 +01:00 & [INF] & Time by mono Crowd completed in 2746.9 ms \\ + 2024-02-20 17:03:57.524 +01:00 & [INF] & Time by mono Atlassian completed in 2711.0 ms \\ + 2024-02-20 17:04:00.245 +01:00 & [INF] & Time by mono Debian completed in 2721.0 ms \\ + 2024-02-20 17:04:02.960 +01:00 & [INF] & Time by mono Ubuntu completed in 2714.8 ms \\ + 2024-02-20 17:04:05.664 +01:00 & [INF] & Time by mono Arc42 completed in 2703.6 ms \\ + 2024-02-20 17:04:08.370 +01:00 & [INF] & Time by mono arc42 completed in 2706.4 ms \\ + & & \\ + 2024-02-20 17:04:17.750 +01:00 & [INF] & Time by pipe completed in 9380.2 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection{Messung 10 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb10von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-20 17:04:49.929 +01:00 & [INF] & Time by mono LiteDB completed in 4049.1 ms \\ + 2024-02-20 17:04:52.685 +01:00 & [INF] & Time by mono Newtonsoft completed in 2746.2 ms \\ + 2024-02-20 17:04:55.396 +01:00 & [INF] & Time by mono NewtonSoft completed in 2711.0 ms \\ + 2024-02-20 17:04:58.101 +01:00 & [INF] & Time by mono Crowd completed in 2704.9 ms \\ + 2024-02-20 17:05:00.809 +01:00 & [INF] & Time by mono Atlassian completed in 2707.1 ms \\ + 2024-02-20 17:05:03.515 +01:00 & [INF] & Time by mono Debian completed in 2706.5 ms \\ + 2024-02-20 17:05:06.216 +01:00 & [INF] & Time by mono Ubuntu completed in 2700.4 ms \\ + 2024-02-20 17:05:08.940 +01:00 & [INF] & Time by mono Arc42 completed in 2724.0 ms \\ + 2024-02-20 17:05:11.664 +01:00 & [INF] & Time by mono arc42 completed in 2724.3 ms \\ + & & \\ + 2024-02-20 17:05:21.181 +01:00 & [INF] & Time by pipe completed in 9516.4 ms \\ + \hline + \end{tabularx} + } + } + +\subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: mehr Pakete als Datenbanken} \label{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken} + \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index b55fbc1..9c22d76 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -102,6 +102,9 @@ % Anhang \usepackage[toc,page]{appendix} +\renewcommand\appendixname{Appendix} +\renewcommand\appendixpagename{Appendix} +\renewcommand\appendixtocname{Appendix} % Abkürzungen \usepackage{acronym} \usepackage{tabularx} @@ -190,8 +193,10 @@ \acro{JSON}[JSON]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation} \acro{JSON-LD}[JSON-LD]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation \textbf{L}inked \textbf{D}ata} \end{acronym} + \newpage \section{Messungen} \label{sec:Messungen} % TODO: Andere Logs ebenfalls eintragen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} \end{appendices} From 67a12e7bde2800112d2bde8b91a686732ca25082 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:34:54 +0200 Subject: [PATCH 28/60] measurements inserted and removed from toc for better view --- .../latex/Appendix/litedbMonoPipe.tex | 520 +++++++++++++++++- .../latex/Appendix/mySqlWithIndex.tex | 20 +- .../latex/Appendix/mySqlWithoutIndex.tex | 20 +- documentation/latex/main.tex | 1 + 4 files changed, 530 insertions(+), 31 deletions(-) diff --git a/documentation/latex/Appendix/litedbMonoPipe.tex b/documentation/latex/Appendix/litedbMonoPipe.tex index f8bb18f..d243a08 100644 --- a/documentation/latex/Appendix/litedbMonoPipe.tex +++ b/documentation/latex/Appendix/litedbMonoPipe.tex @@ -1,5 +1,5 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: weniger Pakete als Datenbanken} \label{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} - \subsubsection{Messung 1 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb1von10} + \subsubsection*{Messung 1 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb1von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -23,7 +23,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 2 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb2von10} + \subsubsection*{Messung 2 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb2von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -47,7 +47,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 3 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb3von10} + \subsubsection*{Messung 3 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb3von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -71,7 +71,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 4 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb4von10} + \subsubsection*{Messung 4 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb4von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -95,7 +95,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 5 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb5von10} + \subsubsection*{Messung 5 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb5von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -119,7 +119,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 6 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb6von10} + \subsubsection*{Messung 6 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb6von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -143,7 +143,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 7 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb7von10} + \subsubsection*{Messung 7 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb7von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -167,7 +167,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 8 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb8von10} + \subsubsection*{Messung 8 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb8von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -191,7 +191,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 9 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb9von10} + \subsubsection*{Messung 9 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb9von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -215,7 +215,7 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } } - \subsubsection{Messung 10 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb10von10} + \subsubsection*{Messung 10 von 10} \label{subsubsec:LiteDbWenigerPaketeAlsDb10von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -240,4 +240,502 @@ \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: wenig } \subsection{Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: mehr Pakete als Datenbanken} \label{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken} - \ No newline at end of file + \subsubsection*{Messung 1 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb1von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:05:20.021 +01:00 & [INF] & Time by mono LiteDB completed in 7208.9 ms \\ + 2024-02-21 15:05:22.798 +01:00 & [INF] & Time by mono Newtonsoft completed in 2765.7 ms \\ + 2024-02-21 15:05:25.526 +01:00 & [INF] & Time by mono NewtonSoft completed in 2728.0 ms \\ + 2024-02-21 15:05:28.264 +01:00 & [INF] & Time by mono Crowd completed in 2737.9 ms \\ + 2024-02-21 15:05:30.992 +01:00 & [INF] & Time by mono Atlassian completed in 2727.2 ms \\ + 2024-02-21 15:05:33.706 +01:00 & [INF] & Time by mono Debian completed in 2714.1 ms \\ + 2024-02-21 15:05:36.408 +01:00 & [INF] & Time by mono Ubuntu completed in 2702.3 ms \\ + 2024-02-21 15:05:39.095 +01:00 & [INF] & Time by mono Arc42 completed in 2687.2 ms \\ + 2024-02-21 15:05:41.794 +01:00 & [INF] & Time by mono arc42 completed in 2698.7 ms \\ + 2024-02-21 15:05:44.499 +01:00 & [INF] & Time by mono cookie completed in 2694.2 ms \\ + 2024-02-21 15:05:47.205 +01:00 & [INF] & Time by mono mongoDb completed in 2705.9 ms \\ + 2024-02-21 15:05:49.908 +01:00 & [INF] & Time by mono mongoDB completed in 2702.4 ms \\ + 2024-02-21 15:05:52.610 +01:00 & [INF] & Time by mono mongodb completed in 2702.4 ms \\ + 2024-02-21 15:05:55.377 +01:00 & [INF] & Time by mono parser completed in 2766.6 ms \\ + 2024-02-21 15:05:58.095 +01:00 & [INF] & Time by mono LiteDb completed in 2718.1 ms \\ + 2024-02-21 15:06:00.962 +01:00 & [INF] & Time by mono php completed in 2866.8 ms \\ + 2024-02-21 15:06:03.677 +01:00 & [INF] & Time by mono PHP completed in 2715.3 ms \\ + 2024-02-21 15:06:06.399 +01:00 & [INF] & Time by mono Laravel completed in 2721.7 ms \\ + 2024-02-21 15:06:09.108 +01:00 & [INF] & Time by mono laravel completed in 2709.1 ms \\ + 2024-02-21 15:06:11.835 +01:00 & [INF] & Time by mono LARAVEL completed in 2726.8 ms \\ + 2024-02-21 15:06:14.549 +01:00 & [INF] & Time by mono beta completed in 2713.3 ms \\ + 2024-02-21 15:06:17.265 +01:00 & [INF] & Time by mono meta completed in 2716.0 ms \\ + 2024-02-21 15:06:19.983 +01:00 & [INF] & Time by mono META completed in 2717.8 ms \\ + 2024-02-21 15:06:22.688 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2705.4 ms \\ + 2024-02-21 15:06:25.409 +01:00 & [INF] & Time by mono accepts completed in 2720.1 ms \\ + 2024-02-21 15:06:28.125 +01:00 & [INF] & Time by mono mime-db completed in 2716.2 ms \\ + 2024-02-21 15:06:30.829 +01:00 & [INF] & Time by mono mime-DB completed in 2703.7 ms \\ + 2024-02-21 15:06:33.538 +01:00 & [INF] & Time by mono iconv-lite completed in 2708.8 ms \\ + 2024-02-21 15:06:36.228 +01:00 & [INF] & Time by mono safer-buffer completed in 2690.8 ms \\ + 2024-02-21 15:06:38.929 +01:00 & [INF] & Time by mono raw-body completed in 2700.3 ms \\ + 2024-02-21 15:06:41.633 +01:00 & [INF] & Time by mono depd completed in 2704.4 ms \\ + 2024-02-21 15:06:44.338 +01:00 & [INF] & Time by mono finalhandler completed in 2704.6 ms \\ + 2024-02-21 15:06:47.039 +01:00 & [INF] & Time by mono on-finished completed in 2700.3 ms \\ + 2024-02-21 15:06:49.734 +01:00 & [INF] & Time by mono ipaddr.js completed in 2695.2 ms \\ + 2024-02-21 15:06:52.440 +01:00 & [INF] & Time by mono encodeurl completed in 2705.9 ms \\ + & & \\ + 2024-02-21 15:07:14.672 +01:00 & [INF] & Time by pipe completed in 22231.9 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 2 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb2von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:07:49.056 +01:00 & [INF] & Time by mono LiteDB completed in 3859.8 ms \\ + 2024-02-21 15:07:51.704 +01:00 & [INF] & Time by mono Newtonsoft completed in 2638.7 ms \\ + 2024-02-21 15:07:54.355 +01:00 & [INF] & Time by mono NewtonSoft completed in 2650.9 ms \\ + 2024-02-21 15:07:57.009 +01:00 & [INF] & Time by mono Crowd completed in 2653.7 ms \\ + 2024-02-21 15:07:59.664 +01:00 & [INF] & Time by mono Atlassian completed in 2654.5 ms \\ + 2024-02-21 15:08:02.306 +01:00 & [INF] & Time by mono Debian completed in 2642.1 ms \\ + 2024-02-21 15:08:04.973 +01:00 & [INF] & Time by mono Ubuntu completed in 2666.9 ms \\ + 2024-02-21 15:08:07.653 +01:00 & [INF] & Time by mono Arc42 completed in 2680.2 ms \\ + 2024-02-21 15:08:10.298 +01:00 & [INF] & Time by mono arc42 completed in 2644.9 ms \\ + 2024-02-21 15:08:12.911 +01:00 & [INF] & Time by mono cookie completed in 2613.2 ms \\ + 2024-02-21 15:08:15.517 +01:00 & [INF] & Time by mono mongoDb completed in 2605.5 ms \\ + 2024-02-21 15:08:18.112 +01:00 & [INF] & Time by mono mongoDB completed in 2594.6 ms \\ + 2024-02-21 15:08:20.745 +01:00 & [INF] & Time by mono mongodb completed in 2633.3 ms \\ + 2024-02-21 15:08:23.349 +01:00 & [INF] & Time by mono parser completed in 2603.7 ms \\ + 2024-02-21 15:08:25.955 +01:00 & [INF] & Time by mono LiteDb completed in 2605.7 ms \\ + 2024-02-21 15:08:28.573 +01:00 & [INF] & Time by mono php completed in 2618.1 ms \\ + 2024-02-21 15:08:31.210 +01:00 & [INF] & Time by mono PHP completed in 2637.3 ms \\ + 2024-02-21 15:08:33.846 +01:00 & [INF] & Time by mono Laravel completed in 2635.7 ms \\ + 2024-02-21 15:08:36.502 +01:00 & [INF] & Time by mono laravel completed in 2656.1 ms \\ + 2024-02-21 15:08:39.123 +01:00 & [INF] & Time by mono LARAVEL completed in 2620.6 ms \\ + 2024-02-21 15:08:41.766 +01:00 & [INF] & Time by mono beta completed in 2642.6 ms \\ + 2024-02-21 15:08:44.390 +01:00 & [INF] & Time by mono meta completed in 2624.1 ms \\ + 2024-02-21 15:08:47.030 +01:00 & [INF] & Time by mono META completed in 2640.4 ms \\ + 2024-02-21 15:08:49.672 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2641.2 ms \\ + 2024-02-21 15:08:52.319 +01:00 & [INF] & Time by mono accepts completed in 2647.7 ms \\ + 2024-02-21 15:08:54.957 +01:00 & [INF] & Time by mono mime-db completed in 2637.5 ms \\ + 2024-02-21 15:08:57.596 +01:00 & [INF] & Time by mono mime-DB completed in 2639.2 ms \\ + 2024-02-21 15:09:00.239 +01:00 & [INF] & Time by mono iconv-lite completed in 2642.4 ms \\ + 2024-02-21 15:09:02.879 +01:00 & [INF] & Time by mono safer-buffer completed in 2639.8 ms \\ + 2024-02-21 15:09:05.525 +01:00 & [INF] & Time by mono raw-body completed in 2645.7 ms \\ + 2024-02-21 15:09:08.186 +01:00 & [INF] & Time by mono depd completed in 2661.3 ms \\ + 2024-02-21 15:09:10.819 +01:00 & [INF] & Time by mono finalhandler completed in 2633.1 ms \\ + 2024-02-21 15:09:13.452 +01:00 & [INF] & Time by mono on-finished completed in 2632.7 ms \\ + 2024-02-21 15:09:16.074 +01:00 & [INF] & Time by mono ipaddr.js completed in 2622.2 ms \\ + 2024-02-21 15:09:18.712 +01:00 & [INF] & Time by mono encodeurl completed in 2637.7 ms \\ + & & \\ + 2024-02-21 15:09:40.604 +01:00 & [INF] & Time by pipe completed in 21891.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 3 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb3von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:07:49.056 +01:00 & [INF] & Time by mono LiteDB completed in 3859.8 ms \\ + 2024-02-21 15:07:51.704 +01:00 & [INF] & Time by mono Newtonsoft completed in 2638.7 ms \\ + 2024-02-21 15:07:54.355 +01:00 & [INF] & Time by mono NewtonSoft completed in 2650.9 ms \\ + 2024-02-21 15:07:57.009 +01:00 & [INF] & Time by mono Crowd completed in 2653.7 ms \\ + 2024-02-21 15:07:59.664 +01:00 & [INF] & Time by mono Atlassian completed in 2654.5 ms \\ + 2024-02-21 15:08:02.306 +01:00 & [INF] & Time by mono Debian completed in 2642.1 ms \\ + 2024-02-21 15:08:04.973 +01:00 & [INF] & Time by mono Ubuntu completed in 2666.9 ms \\ + 2024-02-21 15:08:07.653 +01:00 & [INF] & Time by mono Arc42 completed in 2680.2 ms \\ + 2024-02-21 15:08:10.298 +01:00 & [INF] & Time by mono arc42 completed in 2644.9 ms \\ + 2024-02-21 15:08:12.911 +01:00 & [INF] & Time by mono cookie completed in 2613.2 ms \\ + 2024-02-21 15:08:15.517 +01:00 & [INF] & Time by mono mongoDb completed in 2605.5 ms \\ + 2024-02-21 15:08:18.112 +01:00 & [INF] & Time by mono mongoDB completed in 2594.6 ms \\ + 2024-02-21 15:08:20.745 +01:00 & [INF] & Time by mono mongodb completed in 2633.3 ms \\ + 2024-02-21 15:08:23.349 +01:00 & [INF] & Time by mono parser completed in 2603.7 ms \\ + 2024-02-21 15:08:25.955 +01:00 & [INF] & Time by mono LiteDb completed in 2605.7 ms \\ + 2024-02-21 15:08:28.573 +01:00 & [INF] & Time by mono php completed in 2618.1 ms \\ + 2024-02-21 15:08:31.210 +01:00 & [INF] & Time by mono PHP completed in 2637.3 ms \\ + 2024-02-21 15:08:33.846 +01:00 & [INF] & Time by mono Laravel completed in 2635.7 ms \\ + 2024-02-21 15:08:36.502 +01:00 & [INF] & Time by mono laravel completed in 2656.1 ms \\ + 2024-02-21 15:08:39.123 +01:00 & [INF] & Time by mono LARAVEL completed in 2620.6 ms \\ + 2024-02-21 15:08:41.766 +01:00 & [INF] & Time by mono beta completed in 2642.6 ms \\ + 2024-02-21 15:08:44.390 +01:00 & [INF] & Time by mono meta completed in 2624.1 ms \\ + 2024-02-21 15:08:47.030 +01:00 & [INF] & Time by mono META completed in 2640.4 ms \\ + 2024-02-21 15:08:49.672 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2641.2 ms \\ + 2024-02-21 15:08:52.319 +01:00 & [INF] & Time by mono accepts completed in 2647.7 ms \\ + 2024-02-21 15:08:54.957 +01:00 & [INF] & Time by mono mime-db completed in 2637.5 ms \\ + 2024-02-21 15:08:57.596 +01:00 & [INF] & Time by mono mime-DB completed in 2639.2 ms \\ + 2024-02-21 15:09:00.239 +01:00 & [INF] & Time by mono iconv-lite completed in 2642.4 ms \\ + 2024-02-21 15:09:02.879 +01:00 & [INF] & Time by mono safer-buffer completed in 2639.8 ms \\ + 2024-02-21 15:09:05.525 +01:00 & [INF] & Time by mono raw-body completed in 2645.7 ms \\ + 2024-02-21 15:09:08.186 +01:00 & [INF] & Time by mono depd completed in 2661.3 ms \\ + 2024-02-21 15:09:10.819 +01:00 & [INF] & Time by mono finalhandler completed in 2633.1 ms \\ + 2024-02-21 15:09:13.452 +01:00 & [INF] & Time by mono on-finished completed in 2632.7 ms \\ + 2024-02-21 15:09:16.074 +01:00 & [INF] & Time by mono ipaddr.js completed in 2622.2 ms \\ + 2024-02-21 15:09:18.712 +01:00 & [INF] & Time by mono encodeurl completed in 2637.7 ms \\ + & & \\ + 2024-02-21 15:09:40.604 +01:00 & [INF] & Time by pipe completed in 21891.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 4 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb4von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:22:21.048 +01:00 & [INF] & Time by mono LiteDB completed in 3895.0 ms \\ + 2024-02-21 15:22:23.724 +01:00 & [INF] & Time by mono Newtonsoft completed in 2665.8 ms \\ + 2024-02-21 15:22:26.383 +01:00 & [INF] & Time by mono NewtonSoft completed in 2659.2 ms \\ + 2024-02-21 15:22:29.042 +01:00 & [INF] & Time by mono Crowd completed in 2659.2 ms \\ + 2024-02-21 15:22:31.704 +01:00 & [INF] & Time by mono Atlassian completed in 2661.8 ms \\ + 2024-02-21 15:22:34.351 +01:00 & [INF] & Time by mono Debian completed in 2646.3 ms \\ + 2024-02-21 15:22:37.001 +01:00 & [INF] & Time by mono Ubuntu completed in 2650.6 ms \\ + 2024-02-21 15:22:39.649 +01:00 & [INF] & Time by mono Arc42 completed in 2647.3 ms \\ + 2024-02-21 15:22:42.313 +01:00 & [INF] & Time by mono arc42 completed in 2664.2 ms \\ + 2024-02-21 15:22:44.961 +01:00 & [INF] & Time by mono cookie completed in 2647.3 ms \\ + 2024-02-21 15:22:47.607 +01:00 & [INF] & Time by mono mongoDb completed in 2646.0 ms \\ + 2024-02-21 15:22:50.245 +01:00 & [INF] & Time by mono mongoDB completed in 2638.4 ms \\ + 2024-02-21 15:22:52.904 +01:00 & [INF] & Time by mono mongodb completed in 2658.5 ms \\ + 2024-02-21 15:22:55.567 +01:00 & [INF] & Time by mono parser completed in 2662.9 ms \\ + 2024-02-21 15:22:58.203 +01:00 & [INF] & Time by mono LiteDb completed in 2635.9 ms \\ + 2024-02-21 15:23:00.883 +01:00 & [INF] & Time by mono php completed in 2680.5 ms \\ + 2024-02-21 15:23:03.545 +01:00 & [INF] & Time by mono PHP completed in 2661.8 ms \\ + 2024-02-21 15:23:06.229 +01:00 & [INF] & Time by mono Laravel completed in 2683.5 ms \\ + 2024-02-21 15:23:08.891 +01:00 & [INF] & Time by mono laravel completed in 2662.3 ms \\ + 2024-02-21 15:23:11.541 +01:00 & [INF] & Time by mono LARAVEL completed in 2649.9 ms \\ + 2024-02-21 15:23:14.208 +01:00 & [INF] & Time by mono beta completed in 2667.3 ms \\ + 2024-02-21 15:23:16.867 +01:00 & [INF] & Time by mono meta completed in 2658.4 ms \\ + 2024-02-21 15:23:19.517 +01:00 & [INF] & Time by mono META completed in 2649.8 ms \\ + 2024-02-21 15:23:22.180 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2662.6 ms \\ + 2024-02-21 15:23:24.845 +01:00 & [INF] & Time by mono accepts completed in 2665.6 ms \\ + 2024-02-21 15:23:27.506 +01:00 & [INF] & Time by mono mime-db completed in 2660.5 ms \\ + 2024-02-21 15:23:30.170 +01:00 & [INF] & Time by mono mime-DB completed in 2664.4 ms \\ + 2024-02-21 15:23:32.847 +01:00 & [INF] & Time by mono iconv-lite completed in 2676.4 ms \\ + 2024-02-21 15:23:35.501 +01:00 & [INF] & Time by mono safer-buffer completed in 2654.0 ms \\ + 2024-02-21 15:23:38.170 +01:00 & [INF] & Time by mono raw-body completed in 2669.3 ms \\ + 2024-02-21 15:23:40.840 +01:00 & [INF] & Time by mono depd completed in 2669.0 ms \\ + 2024-02-21 15:23:43.508 +01:00 & [INF] & Time by mono finalhandler completed in 2668.1 ms \\ + 2024-02-21 15:23:46.174 +01:00 & [INF] & Time by mono on-finished completed in 2665.5 ms \\ + 2024-02-21 15:23:48.837 +01:00 & [INF] & Time by mono ipaddr.js completed in 2662.7 ms \\ + 2024-02-21 15:23:51.494 +01:00 & [INF] & Time by mono encodeurl completed in 2657.5 ms \\ + & & \\ + 2024-02-21 15:24:13.535 +01:00 & [INF] & Time by pipe completed in 22041.2 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 5 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb5von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:25:42.913 +01:00 & [INF] & Time by mono LiteDB completed in 4195.1 ms \\ + 2024-02-21 15:25:45.595 +01:00 & [INF] & Time by mono Newtonsoft completed in 2671.8 ms \\ + 2024-02-21 15:25:48.273 +01:00 & [INF] & Time by mono NewtonSoft completed in 2678.1 ms \\ + 2024-02-21 15:25:50.960 +01:00 & [INF] & Time by mono Crowd completed in 2687.0 ms \\ + 2024-02-21 15:25:53.630 +01:00 & [INF] & Time by mono Atlassian completed in 2669.7 ms \\ + 2024-02-21 15:25:56.287 +01:00 & [INF] & Time by mono Debian completed in 2657.2 ms \\ + 2024-02-21 15:25:58.963 +01:00 & [INF] & Time by mono Ubuntu completed in 2676.2 ms \\ + 2024-02-21 15:26:01.609 +01:00 & [INF] & Time by mono Arc42 completed in 2645.2 ms \\ + 2024-02-21 15:26:04.272 +01:00 & [INF] & Time by mono arc42 completed in 2663.0 ms \\ + 2024-02-21 15:26:06.950 +01:00 & [INF] & Time by mono cookie completed in 2678.2 ms \\ + 2024-02-21 15:26:09.635 +01:00 & [INF] & Time by mono mongoDb completed in 2685.4 ms \\ + 2024-02-21 15:26:12.301 +01:00 & [INF] & Time by mono mongoDB completed in 2665.6 ms \\ + 2024-02-21 15:26:14.981 +01:00 & [INF] & Time by mono mongodb completed in 2679.3 ms \\ + 2024-02-21 15:26:17.668 +01:00 & [INF] & Time by mono parser completed in 2686.9 ms \\ + 2024-02-21 15:26:20.346 +01:00 & [INF] & Time by mono LiteDb completed in 2678.2 ms \\ + 2024-02-21 15:26:23.037 +01:00 & [INF] & Time by mono php completed in 2690.9 ms \\ + 2024-02-21 15:26:25.715 +01:00 & [INF] & Time by mono PHP completed in 2678.4 ms \\ + 2024-02-21 15:26:28.384 +01:00 & [INF] & Time by mono Laravel completed in 2668.6 ms \\ + 2024-02-21 15:26:31.053 +01:00 & [INF] & Time by mono laravel completed in 2668.6 ms \\ + 2024-02-21 15:26:33.718 +01:00 & [INF] & Time by mono LARAVEL completed in 2664.8 ms \\ + 2024-02-21 15:26:36.372 +01:00 & [INF] & Time by mono beta completed in 2654.2 ms \\ + 2024-02-21 15:26:39.029 +01:00 & [INF] & Time by mono meta completed in 2656.4 ms \\ + 2024-02-21 15:26:41.671 +01:00 & [INF] & Time by mono META completed in 2642.4 ms \\ + 2024-02-21 15:26:44.336 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2664.9 ms \\ + 2024-02-21 15:26:47.001 +01:00 & [INF] & Time by mono accepts completed in 2664.4 ms \\ + 2024-02-21 15:26:49.651 +01:00 & [INF] & Time by mono mime-db completed in 2649.9 ms \\ + 2024-02-21 15:26:52.303 +01:00 & [INF] & Time by mono mime-DB completed in 2652.8 ms \\ + 2024-02-21 15:26:54.960 +01:00 & [INF] & Time by mono iconv-lite completed in 2656.4 ms \\ + 2024-02-21 15:26:57.630 +01:00 & [INF] & Time by mono safer-buffer completed in 2670.2 ms \\ + 2024-02-21 15:27:00.296 +01:00 & [INF] & Time by mono raw-body completed in 2665.4 ms \\ + 2024-02-21 15:27:02.963 +01:00 & [INF] & Time by mono depd completed in 2667.3 ms \\ + 2024-02-21 15:27:05.638 +01:00 & [INF] & Time by mono finalhandler completed in 2675.1 ms \\ + 2024-02-21 15:27:08.315 +01:00 & [INF] & Time by mono on-finished completed in 2676.2 ms \\ + 2024-02-21 15:27:10.992 +01:00 & [INF] & Time by mono ipaddr.js completed in 2677.3 ms \\ + 2024-02-21 15:27:13.679 +01:00 & [INF] & Time by mono encodeurl completed in 2686.5 ms \\ + & & \\ + 2024-02-21 15:27:35.944 +01:00 & [INF] & Time by pipe completed in 22265.6 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 6 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb6von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:28:48.481 +01:00 & [INF] & Time by mono LiteDB completed in 3908.8 ms \\ + 2024-02-21 15:28:51.150 +01:00 & [INF] & Time by mono Newtonsoft completed in 2658.6 ms \\ + 2024-02-21 15:28:53.815 +01:00 & [INF] & Time by mono NewtonSoft completed in 2665.2 ms \\ + 2024-02-21 15:28:56.486 +01:00 & [INF] & Time by mono Crowd completed in 2670.9 ms \\ + 2024-02-21 15:28:59.145 +01:00 & [INF] & Time by mono Atlassian completed in 2658.7 ms \\ + 2024-02-21 15:29:01.815 +01:00 & [INF] & Time by mono Debian completed in 2670.3 ms \\ + 2024-02-21 15:29:04.488 +01:00 & [INF] & Time by mono Ubuntu completed in 2673.0 ms \\ + 2024-02-21 15:29:07.169 +01:00 & [INF] & Time by mono Arc42 completed in 2680.6 ms \\ + 2024-02-21 15:29:09.835 +01:00 & [INF] & Time by mono arc42 completed in 2665.9 ms \\ + 2024-02-21 15:29:12.506 +01:00 & [INF] & Time by mono cookie completed in 2671.1 ms \\ + 2024-02-21 15:29:15.181 +01:00 & [INF] & Time by mono mongoDb completed in 2674.8 ms \\ + 2024-02-21 15:29:17.867 +01:00 & [INF] & Time by mono mongoDB completed in 2685.6 ms \\ + 2024-02-21 15:29:20.551 +01:00 & [INF] & Time by mono mongodb completed in 2683.9 ms \\ + 2024-02-21 15:29:23.228 +01:00 & [INF] & Time by mono parser completed in 2676.8 ms \\ + 2024-02-21 15:29:25.903 +01:00 & [INF] & Time by mono LiteDb completed in 2675.1 ms \\ + 2024-02-21 15:29:28.568 +01:00 & [INF] & Time by mono php completed in 2665.1 ms \\ + 2024-02-21 15:29:31.247 +01:00 & [INF] & Time by mono PHP completed in 2679.0 ms \\ + 2024-02-21 15:29:33.909 +01:00 & [INF] & Time by mono Laravel completed in 2662.0 ms \\ + 2024-02-21 15:29:36.587 +01:00 & [INF] & Time by mono laravel completed in 2677.4 ms \\ + 2024-02-21 15:29:39.239 +01:00 & [INF] & Time by mono LARAVEL completed in 2652.3 ms \\ + 2024-02-21 15:29:41.900 +01:00 & [INF] & Time by mono beta completed in 2660.6 ms \\ + 2024-02-21 15:29:44.557 +01:00 & [INF] & Time by mono meta completed in 2657.5 ms \\ + 2024-02-21 15:29:47.206 +01:00 & [INF] & Time by mono META completed in 2648.4 ms \\ + 2024-02-21 15:29:49.862 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2655.7 ms \\ + 2024-02-21 15:29:52.522 +01:00 & [INF] & Time by mono accepts completed in 2659.9 ms \\ + 2024-02-21 15:29:55.186 +01:00 & [INF] & Time by mono mime-db completed in 2663.8 ms \\ + 2024-02-21 15:29:57.835 +01:00 & [INF] & Time by mono mime-DB completed in 2649.1 ms \\ + 2024-02-21 15:30:00.492 +01:00 & [INF] & Time by mono iconv-lite completed in 2657.1 ms \\ + 2024-02-21 15:30:03.164 +01:00 & [INF] & Time by mono safer-buffer completed in 2672.2 ms \\ + 2024-02-21 15:30:05.832 +01:00 & [INF] & Time by mono raw-body completed in 2667.5 ms \\ + 2024-02-21 15:30:08.498 +01:00 & [INF] & Time by mono depd completed in 2665.8 ms \\ + 2024-02-21 15:30:11.166 +01:00 & [INF] & Time by mono finalhandler completed in 2667.8 ms \\ + 2024-02-21 15:30:13.831 +01:00 & [INF] & Time by mono on-finished completed in 2664.5 ms \\ + 2024-02-21 15:30:16.480 +01:00 & [INF] & Time by mono ipaddr.js completed in 2649.5 ms \\ + 2024-02-21 15:30:19.148 +01:00 & [INF] & Time by mono encodeurl completed in 2667.3 ms \\ + & & \\ + 2024-02-21 15:30:41.173 +01:00 & [INF] & Time by pipe completed in 22025.6 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 7 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb7von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:35:57.965 +01:00 & [INF] & Time by mono LiteDB completed in 3805.9 ms \\ + 2024-02-21 15:36:00.640 +01:00 & [INF] & Time by mono Newtonsoft completed in 2665.7 ms \\ + 2024-02-21 15:36:03.329 +01:00 & [INF] & Time by mono NewtonSoft completed in 2687.9 ms \\ + 2024-02-21 15:36:06.027 +01:00 & [INF] & Time by mono Crowd completed in 2698.6 ms \\ + 2024-02-21 15:36:08.703 +01:00 & [INF] & Time by mono Atlassian completed in 2675.4 ms \\ + 2024-02-21 15:36:11.373 +01:00 & [INF] & Time by mono Debian completed in 2670.5 ms \\ + 2024-02-21 15:36:14.046 +01:00 & [INF] & Time by mono Ubuntu completed in 2672.7 ms \\ + 2024-02-21 15:36:16.727 +01:00 & [INF] & Time by mono Arc42 completed in 2681.3 ms \\ + 2024-02-21 15:36:19.410 +01:00 & [INF] & Time by mono arc42 completed in 2682.9 ms \\ + 2024-02-21 15:36:22.095 +01:00 & [INF] & Time by mono cookie completed in 2684.7 ms \\ + 2024-02-21 15:36:24.773 +01:00 & [INF] & Time by mono mongoDb completed in 2677.2 ms \\ + 2024-02-21 15:36:27.442 +01:00 & [INF] & Time by mono mongoDB completed in 2669.8 ms \\ + 2024-02-21 15:36:30.123 +01:00 & [INF] & Time by mono mongodb completed in 2680.6 ms \\ + 2024-02-21 15:36:32.799 +01:00 & [INF] & Time by mono parser completed in 2675.7 ms \\ + 2024-02-21 15:36:35.460 +01:00 & [INF] & Time by mono LiteDb completed in 2660.7 ms \\ + 2024-02-21 15:36:38.121 +01:00 & [INF] & Time by mono php completed in 2661.2 ms \\ + 2024-02-21 15:36:40.823 +01:00 & [INF] & Time by mono PHP completed in 2702.3 ms \\ + 2024-02-21 15:36:43.482 +01:00 & [INF] & Time by mono Laravel completed in 2658.7 ms \\ + 2024-02-21 15:36:46.139 +01:00 & [INF] & Time by mono laravel completed in 2656.8 ms \\ + 2024-02-21 15:36:48.793 +01:00 & [INF] & Time by mono LARAVEL completed in 2654.0 ms \\ + 2024-02-21 15:36:51.473 +01:00 & [INF] & Time by mono beta completed in 2679.7 ms \\ + 2024-02-21 15:36:54.144 +01:00 & [INF] & Time by mono meta completed in 2670.9 ms \\ + 2024-02-21 15:36:56.788 +01:00 & [INF] & Time by mono META completed in 2643.9 ms \\ + 2024-02-21 15:36:59.466 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2678.0 ms \\ + 2024-02-21 15:37:02.138 +01:00 & [INF] & Time by mono accepts completed in 2672.1 ms \\ + 2024-02-21 15:37:04.807 +01:00 & [INF] & Time by mono mime-db completed in 2669.0 ms \\ + 2024-02-21 15:37:07.480 +01:00 & [INF] & Time by mono mime-DB completed in 2672.6 ms \\ + 2024-02-21 15:37:10.153 +01:00 & [INF] & Time by mono iconv-lite completed in 2672.6 ms \\ + 2024-02-21 15:37:12.843 +01:00 & [INF] & Time by mono safer-buffer completed in 2689.8 ms \\ + 2024-02-21 15:37:15.516 +01:00 & [INF] & Time by mono raw-body completed in 2672.7 ms \\ + 2024-02-21 15:37:18.176 +01:00 & [INF] & Time by mono depd completed in 2659.8 ms \\ + 2024-02-21 15:37:20.851 +01:00 & [INF] & Time by mono finalhandler completed in 2675.1 ms \\ + 2024-02-21 15:37:23.522 +01:00 & [INF] & Time by mono on-finished completed in 2671.4 ms \\ + 2024-02-21 15:37:26.198 +01:00 & [INF] & Time by mono ipaddr.js completed in 2675.3 ms \\ + 2024-02-21 15:37:28.872 +01:00 & [INF] & Time by mono encodeurl completed in 2673.9 ms \\ + & & \\ + 2024-02-21 15:37:50.909 +01:00 & [INF] & Time by pipe completed in 22037.0 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 8 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb8von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:38:59.564 +01:00 & [INF] & Time by mono LiteDB completed in 3914.2 ms \\ + 2024-02-21 15:39:02.277 +01:00 & [INF] & Time by mono Newtonsoft completed in 2703.2 ms \\ + 2024-02-21 15:39:04.995 +01:00 & [INF] & Time by mono NewtonSoft completed in 2717.7 ms \\ + 2024-02-21 15:39:07.709 +01:00 & [INF] & Time by mono Crowd completed in 2714.1 ms \\ + 2024-02-21 15:39:10.402 +01:00 & [INF] & Time by mono Atlassian completed in 2693.0 ms \\ + 2024-02-21 15:39:13.115 +01:00 & [INF] & Time by mono Debian completed in 2712.6 ms \\ + 2024-02-21 15:39:15.830 +01:00 & [INF] & Time by mono Ubuntu completed in 2714.6 ms \\ + 2024-02-21 15:39:18.549 +01:00 & [INF] & Time by mono Arc42 completed in 2719.5 ms \\ + 2024-02-21 15:39:21.277 +01:00 & [INF] & Time by mono arc42 completed in 2727.6 ms \\ + 2024-02-21 15:39:23.993 +01:00 & [INF] & Time by mono cookie completed in 2715.4 ms \\ + 2024-02-21 15:39:26.713 +01:00 & [INF] & Time by mono mongoDb completed in 2720.5 ms \\ + 2024-02-21 15:39:29.431 +01:00 & [INF] & Time by mono mongoDB completed in 2718.2 ms \\ + 2024-02-21 15:39:32.134 +01:00 & [INF] & Time by mono mongodb completed in 2702.6 ms \\ + 2024-02-21 15:39:34.846 +01:00 & [INF] & Time by mono parser completed in 2711.8 ms \\ + 2024-02-21 15:39:37.560 +01:00 & [INF] & Time by mono LiteDb completed in 2713.6 ms \\ + 2024-02-21 15:39:40.275 +01:00 & [INF] & Time by mono php completed in 2715.2 ms \\ + 2024-02-21 15:39:42.977 +01:00 & [INF] & Time by mono PHP completed in 2702.1 ms \\ + 2024-02-21 15:39:45.698 +01:00 & [INF] & Time by mono Laravel completed in 2720.3 ms \\ + 2024-02-21 15:39:48.420 +01:00 & [INF] & Time by mono laravel completed in 2722.3 ms \\ + 2024-02-21 15:39:51.136 +01:00 & [INF] & Time by mono LARAVEL completed in 2716.2 ms \\ + 2024-02-21 15:39:53.830 +01:00 & [INF] & Time by mono beta completed in 2693.8 ms \\ + 2024-02-21 15:39:56.548 +01:00 & [INF] & Time by mono meta completed in 2717.8 ms \\ + 2024-02-21 15:39:59.253 +01:00 & [INF] & Time by mono META completed in 2704.6 ms \\ + 2024-02-21 15:40:01.969 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2716.0 ms \\ + 2024-02-21 15:40:04.674 +01:00 & [INF] & Time by mono accepts completed in 2705.0 ms \\ + 2024-02-21 15:40:07.394 +01:00 & [INF] & Time by mono mime-db completed in 2719.6 ms \\ + 2024-02-21 15:40:10.116 +01:00 & [INF] & Time by mono mime-DB completed in 2722.5 ms \\ + 2024-02-21 15:40:12.816 +01:00 & [INF] & Time by mono iconv-lite completed in 2699.7 ms \\ + 2024-02-21 15:40:15.530 +01:00 & [INF] & Time by mono safer-buffer completed in 2714.0 ms \\ + 2024-02-21 15:40:18.249 +01:00 & [INF] & Time by mono raw-body completed in 2719.2 ms \\ + 2024-02-21 15:40:20.964 +01:00 & [INF] & Time by mono depd completed in 2714.5 ms \\ + 2024-02-21 15:40:23.681 +01:00 & [INF] & Time by mono finalhandler completed in 2717.1 ms \\ + 2024-02-21 15:40:26.409 +01:00 & [INF] & Time by mono on-finished completed in 2727.4 ms \\ + 2024-02-21 15:40:29.108 +01:00 & [INF] & Time by mono ipaddr.js completed in 2698.8 ms \\ + 2024-02-21 15:40:31.801 +01:00 & [INF] & Time by mono encodeurl completed in 2693.3 ms \\ + & & \\ + 2024-02-21 15:40:54.221 +01:00 & [INF] & Time by pipe completed in 22419.6 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 9 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb9von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:42:36.944 +01:00 & [INF] & Time by mono LiteDB completed in 4029.9 ms \\ + 2024-02-21 15:42:39.619 +01:00 & [INF] & Time by mono Newtonsoft completed in 2665.9 ms \\ + 2024-02-21 15:42:42.278 +01:00 & [INF] & Time by mono NewtonSoft completed in 2658.3 ms \\ + 2024-02-21 15:42:44.956 +01:00 & [INF] & Time by mono Crowd completed in 2677.8 ms \\ + 2024-02-21 15:42:47.609 +01:00 & [INF] & Time by mono Atlassian completed in 2653.4 ms \\ + 2024-02-21 15:42:50.290 +01:00 & [INF] & Time by mono Debian completed in 2681.1 ms \\ + 2024-02-21 15:42:52.959 +01:00 & [INF] & Time by mono Ubuntu completed in 2668.2 ms \\ + 2024-02-21 15:42:55.629 +01:00 & [INF] & Time by mono Arc42 completed in 2670.1 ms \\ + 2024-02-21 15:42:58.302 +01:00 & [INF] & Time by mono arc42 completed in 2673.1 ms \\ + 2024-02-21 15:43:00.957 +01:00 & [INF] & Time by mono cookie completed in 2654.4 ms \\ + 2024-02-21 15:43:03.639 +01:00 & [INF] & Time by mono mongoDb completed in 2682.3 ms \\ + 2024-02-21 15:43:06.328 +01:00 & [INF] & Time by mono mongoDB completed in 2688.9 ms \\ + 2024-02-21 15:43:09.001 +01:00 & [INF] & Time by mono mongodb completed in 2673.4 ms \\ + 2024-02-21 15:43:11.692 +01:00 & [INF] & Time by mono parser completed in 2690.1 ms \\ + 2024-02-21 15:43:14.368 +01:00 & [INF] & Time by mono LiteDb completed in 2676.6 ms \\ + 2024-02-21 15:43:17.035 +01:00 & [INF] & Time by mono php completed in 2666.7 ms \\ + 2024-02-21 15:43:19.716 +01:00 & [INF] & Time by mono PHP completed in 2680.7 ms \\ + 2024-02-21 15:43:22.396 +01:00 & [INF] & Time by mono Laravel completed in 2679.6 ms \\ + 2024-02-21 15:43:25.092 +01:00 & [INF] & Time by mono laravel completed in 2696.4 ms \\ + 2024-02-21 15:43:27.765 +01:00 & [INF] & Time by mono LARAVEL completed in 2673.0 ms \\ + 2024-02-21 15:43:30.439 +01:00 & [INF] & Time by mono beta completed in 2673.1 ms \\ + 2024-02-21 15:43:33.106 +01:00 & [INF] & Time by mono meta completed in 2666.8 ms \\ + 2024-02-21 15:43:35.784 +01:00 & [INF] & Time by mono META completed in 2677.9 ms \\ + 2024-02-21 15:43:38.459 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2675.0 ms \\ + 2024-02-21 15:43:41.139 +01:00 & [INF] & Time by mono accepts completed in 2679.4 ms \\ + 2024-02-21 15:43:43.805 +01:00 & [INF] & Time by mono mime-db completed in 2666.0 ms \\ + 2024-02-21 15:43:46.462 +01:00 & [INF] & Time by mono mime-DB completed in 2656.4 ms \\ + 2024-02-21 15:43:49.130 +01:00 & [INF] & Time by mono iconv-lite completed in 2668.2 ms \\ + 2024-02-21 15:43:51.801 +01:00 & [INF] & Time by mono safer-buffer completed in 2671.4 ms \\ + 2024-02-21 15:43:54.465 +01:00 & [INF] & Time by mono raw-body completed in 2663.7 ms \\ + 2024-02-21 15:43:57.134 +01:00 & [INF] & Time by mono depd completed in 2668.6 ms \\ + 2024-02-21 15:43:59.811 +01:00 & [INF] & Time by mono finalhandler completed in 2676.7 ms \\ + 2024-02-21 15:44:02.503 +01:00 & [INF] & Time by mono on-finished completed in 2692.3 ms \\ + 2024-02-21 15:44:05.177 +01:00 & [INF] & Time by mono ipaddr.js completed in 2673.8 ms \\ + 2024-02-21 15:44:07.869 +01:00 & [INF] & Time by mono encodeurl completed in 2692.1 ms \\ + & & \\ + 2024-02-21 15:44:29.962 +01:00 & [INF] & Time by pipe completed in 22092.4 ms \\ + \hline + \end{tabularx} + } + } + + \subsubsection*{Messung 10 von 10} \label{subsubsec:LiteDbMehrPaketeAlsDb10von10} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-02-21 15:45:17.426 +01:00 & [INF] & Time by mono LiteDB completed in 3985.9 ms \\ + 2024-02-21 15:45:20.063 +01:00 & [INF] & Time by mono Newtonsoft completed in 2627.1 ms \\ + 2024-02-21 15:45:22.688 +01:00 & [INF] & Time by mono NewtonSoft completed in 2624.8 ms \\ + 2024-02-21 15:45:25.333 +01:00 & [INF] & Time by mono Crowd completed in 2644.6 ms \\ + 2024-02-21 15:45:27.961 +01:00 & [INF] & Time by mono Atlassian completed in 2627.8 ms \\ + 2024-02-21 15:45:30.593 +01:00 & [INF] & Time by mono Debian completed in 2632.2 ms \\ + 2024-02-21 15:45:33.222 +01:00 & [INF] & Time by mono Ubuntu completed in 2628.7 ms \\ + 2024-02-21 15:45:35.856 +01:00 & [INF] & Time by mono Arc42 completed in 2634.3 ms \\ + 2024-02-21 15:45:38.462 +01:00 & [INF] & Time by mono arc42 completed in 2605.6 ms \\ + 2024-02-21 15:45:41.080 +01:00 & [INF] & Time by mono cookie completed in 2618.4 ms \\ + 2024-02-21 15:45:43.698 +01:00 & [INF] & Time by mono mongoDb completed in 2617.8 ms \\ + 2024-02-21 15:45:46.325 +01:00 & [INF] & Time by mono mongoDB completed in 2626.6 ms \\ + 2024-02-21 15:45:48.949 +01:00 & [INF] & Time by mono mongodb completed in 2623.7 ms \\ + 2024-02-21 15:45:51.559 +01:00 & [INF] & Time by mono parser completed in 2610.7 ms \\ + 2024-02-21 15:45:54.214 +01:00 & [INF] & Time by mono LiteDb completed in 2654.7 ms \\ + 2024-02-21 15:45:56.852 +01:00 & [INF] & Time by mono php completed in 2637.5 ms \\ + 2024-02-21 15:45:59.475 +01:00 & [INF] & Time by mono PHP completed in 2622.8 ms \\ + 2024-02-21 15:46:02.102 +01:00 & [INF] & Time by mono Laravel completed in 2626.9 ms \\ + 2024-02-21 15:46:04.732 +01:00 & [INF] & Time by mono laravel completed in 2629.7 ms \\ + 2024-02-21 15:46:07.361 +01:00 & [INF] & Time by mono LARAVEL completed in 2629.8 ms \\ + 2024-02-21 15:46:09.986 +01:00 & [INF] & Time by mono beta completed in 2624.7 ms \\ + 2024-02-21 15:46:12.622 +01:00 & [INF] & Time by mono meta completed in 2635.4 ms \\ + 2024-02-21 15:46:15.255 +01:00 & [INF] & Time by mono META completed in 2633.3 ms \\ + 2024-02-21 15:46:17.886 +01:00 & [INF] & Time by mono express-ejs-layouts completed in 2630.7 ms \\ + 2024-02-21 15:46:20.518 +01:00 & [INF] & Time by mono accepts completed in 2631.6 ms \\ + 2024-02-21 15:46:23.145 +01:00 & [INF] & Time by mono mime-db completed in 2626.9 ms \\ + 2024-02-21 15:46:25.792 +01:00 & [INF] & Time by mono mime-DB completed in 2646.3 ms \\ + 2024-02-21 15:46:28.419 +01:00 & [INF] & Time by mono iconv-lite completed in 2627.2 ms \\ + 2024-02-21 15:46:31.052 +01:00 & [INF] & Time by mono safer-buffer completed in 2633.2 ms \\ + 2024-02-21 15:46:33.675 +01:00 & [INF] & Time by mono raw-body completed in 2622.8 ms \\ + 2024-02-21 15:46:36.303 +01:00 & [INF] & Time by mono depd completed in 2627.3 ms \\ + 2024-02-21 15:46:38.930 +01:00 & [INF] & Time by mono finalhandler completed in 2627.2 ms \\ + 2024-02-21 15:46:41.551 +01:00 & [INF] & Time by mono on-finished completed in 2620.6 ms \\ + 2024-02-21 15:46:44.175 +01:00 & [INF] & Time by mono ipaddr.js completed in 2624.0 ms \\ + 2024-02-21 15:46:46.817 +01:00 & [INF] & Time by mono encodeurl completed in 2641.9 ms \\ + & & \\ + 2024-02-21 15:47:08.654 +01:00 & [INF] & Time by pipe completed in 21836.9 ms \\ + \hline + \end{tabularx} + } + } diff --git a/documentation/latex/Appendix/mySqlWithIndex.tex b/documentation/latex/Appendix/mySqlWithIndex.tex index f30f655..7b49fc8 100644 --- a/documentation/latex/Appendix/mySqlWithIndex.tex +++ b/documentation/latex/Appendix/mySqlWithIndex.tex @@ -1,5 +1,5 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} - \subsubsection{Messung 1 von 10} \label{subsubsec:MySQLMitIndex1von10} + \subsubsection*{Messung 1 von 10} \label{subsubsec:MySQLMitIndex1von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -48,7 +48,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 2 von 10} \label{subsubsec:MySQLMitIndex2von10} + \subsubsection*{Messung 2 von 10} \label{subsubsec:MySQLMitIndex2von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -97,7 +97,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 3 von 10} \label{subsubsec:MySQLMitIndex3von10} + \subsubsection*{Messung 3 von 10} \label{subsubsec:MySQLMitIndex3von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -146,7 +146,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 4 von 10} \label{subsubsec:MySQLMitIndex4von10} + \subsubsection*{Messung 4 von 10} \label{subsubsec:MySQLMitIndex4von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -195,7 +195,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 5 von 10} \label{subsubsec:MySQLMitIndex5von10} + \subsubsection*{Messung 5 von 10} \label{subsubsec:MySQLMitIndex5von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -244,7 +244,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 6 von 10} \label{subsubsec:MySQLMitIndex6von10} + \subsubsection*{Messung 6 von 10} \label{subsubsec:MySQLMitIndex6von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -293,7 +293,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 7 von 10} \label{subsubsec:MySQLMitIndex7von10} + \subsubsection*{Messung 7 von 10} \label{subsubsec:MySQLMitIndex7von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -342,7 +342,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 8 von 10} \label{subsubsec:MySQLMitIndex8von10} + \subsubsection*{Messung 8 von 10} \label{subsubsec:MySQLMitIndex8von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -391,7 +391,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 9 von 10} \label{subsubsec:MySQLMitIndex9von10} + \subsubsection*{Messung 9 von 10} \label{subsubsec:MySQLMitIndex9von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -440,7 +440,7 @@ \subsection{MySQL mit Index} \label{subsec:MySQLMitIndex} } } - \subsubsection{Messung 10 von 10} \label{subsubsec:MySQLMitIndex10von10} + \subsubsection*{Messung 10 von 10} \label{subsubsec:MySQLMitIndex10von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} diff --git a/documentation/latex/Appendix/mySqlWithoutIndex.tex b/documentation/latex/Appendix/mySqlWithoutIndex.tex index 8891578..eac0f47 100644 --- a/documentation/latex/Appendix/mySqlWithoutIndex.tex +++ b/documentation/latex/Appendix/mySqlWithoutIndex.tex @@ -1,5 +1,5 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} - \subsubsection{Messung 1 von 10} \label{subsubsec:MySQLOhneIndex1von10} + \subsubsection*{Messung 1 von 10} \label{subsubsec:MySQLOhneIndex1von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -48,7 +48,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 2 von 10} \label{subsubsec:MySQLOhneIndex2von10} + \subsubsection*{Messung 2 von 10} \label{subsubsec:MySQLOhneIndex2von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -97,7 +97,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 3 von 10} \label{subsubsec:MySQLOhneIndex3von10} + \subsubsection*{Messung 3 von 10} \label{subsubsec:MySQLOhneIndex3von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -146,7 +146,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 4 von 10} \label{subsubsec:MySQLOhneIndex4von10} + \subsubsection*{Messung 4 von 10} \label{subsubsec:MySQLOhneIndex4von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -195,7 +195,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 5 von 10} \label{subsubsec:MySQLOhneIndex5von10} + \subsubsection*{Messung 5 von 10} \label{subsubsec:MySQLOhneIndex5von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -244,7 +244,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 6 von 10} \label{subsubsec:MySQLOhneIndex6von10} + \subsubsection*{Messung 6 von 10} \label{subsubsec:MySQLOhneIndex6von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -293,7 +293,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 7 von 10} \label{subsubsec:MySQLOhneIndex7von10} + \subsubsection*{Messung 7 von 10} \label{subsubsec:MySQLOhneIndex7von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -342,7 +342,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 8 von 10} \label{subsubsec:MySQLOhneIndex8von10} + \subsubsection*{Messung 8 von 10} \label{subsubsec:MySQLOhneIndex8von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -391,7 +391,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 9 von 10} \label{subsubsec:MySQLOhneIndex9von10} + \subsubsection*{Messung 9 von 10} \label{subsubsec:MySQLOhneIndex9von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} @@ -440,7 +440,7 @@ \subsection{MySQL ohne Index} \label{subsec:MySQLOhneIndex} } } - \subsubsection{Messung 10 von 10} \label{subsubsec:MySQLOhneIndex10von10} + \subsubsection*{Messung 10 von 10} \label{subsubsec:MySQLOhneIndex10von10} {\shorthandoff{"} {\small \begin{tabularx}{\textwidth}{|l|l|X|} diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 9c22d76..b6fe4b4 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -64,6 +64,7 @@ % \renewcommand{\contentsname}{\hfill\bfseries\Large Inhaltsverzeichnis \hfill} % \renewcommand{\cftaftertoctitle}{\hfill} +\usepackage{tocloft} \usepackage[explicit]{titlesec} \setcounter{secnumdepth}{3} \setcounter{tocdepth}{3} From 893ae47e13b4bd621e236534f9ed88e96ffcc9d3 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:53:44 +0200 Subject: [PATCH 29/60] subtoc in the measurement added --- documentation/latex/main.tex | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index b6fe4b4..945865a 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -64,7 +64,7 @@ % \renewcommand{\contentsname}{\hfill\bfseries\Large Inhaltsverzeichnis \hfill} % \renewcommand{\cftaftertoctitle}{\hfill} -\usepackage{tocloft} +\usepackage{titletoc} % for mutli toc's \usepackage[explicit]{titlesec} \setcounter{secnumdepth}{3} \setcounter{tocdepth}{3} @@ -196,10 +196,12 @@ \end{acronym} \newpage \section{Messungen} \label{sec:Messungen} - % TODO: Andere Logs ebenfalls eintragen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + \startcontents[Messungen] + \printcontents[Messungen]{}{2}{} % \printcontents[⟨name⟩]{⟨prefix⟩}{⟨start-level⟩}[⟨toc-depth⟩]{⟨toc-code⟩} \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} + \stopcontents[Messungen] \end{appendices} \newpage From ad8fd83ed487ea8a76cfefee647830a69fae289f Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 15 Apr 2024 15:14:35 +0200 Subject: [PATCH 30/60] statistic update --- documentation/fragments/searchStatistic.md | 82 +++++++++++----------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/documentation/fragments/searchStatistic.md b/documentation/fragments/searchStatistic.md index 0c5ad89..bbdb562 100644 --- a/documentation/fragments/searchStatistic.md +++ b/documentation/fragments/searchStatistic.md @@ -254,10 +254,10 @@ Noch zu messen! 2024-02-21 15:06:52.440 +01:00 [INF] Time by mono encodeurl completed in 2705.9 ms 2024-02-21 15:07:14.672 +01:00 [INF] Time by pipe completed in 22231.9 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2845,774286ms
+Laufzeit der Pipe: 22231,9ms
+Gesamt Mono: 99602,1ms
+Faktor: 4,480143397 ### Durchgang 2 von 10 ```log @@ -298,10 +298,10 @@ Faktor: 2024-02-21 15:09:18.712 +01:00 [INF] Time by mono encodeurl completed in 2637.7 ms 2024-02-21 15:09:40.604 +01:00 [INF] Time by pipe completed in 21891.4 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2671,517143ms
+Laufzeit der Pipe: 21891,4ms
+Gesamt Mono: 93503,1ms
+Faktor: 4,271225229 ### Durchgang 3 von 10 ```log @@ -342,10 +342,10 @@ Faktor: 2024-02-21 15:21:11.796 +01:00 [INF] Time by mono encodeurl completed in 2649.0 ms 2024-02-21 15:21:34.070 +01:00 [INF] Time by pipe completed in 22273.4 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2686,54ms
+Laufzeit der Pipe: 22273,4ms
+Gesamt Mono: 94028,9ms
+Faktor: 4,2215782053 ### Durchgang 4 von 10 ```log @@ -386,10 +386,10 @@ Faktor: 2024-02-21 15:23:51.494 +01:00 [INF] Time by mono encodeurl completed in 2657.5 ms 2024-02-21 15:24:13.535 +01:00 [INF] Time by pipe completed in 22041.2 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2695,071429ms
+Laufzeit der Pipe: 22041,2ms
+Gesamt Mono: 94327,5ms
+Faktor: 4,2795991143 ### Durchgang 5 von 10 ```log @@ -430,10 +430,10 @@ Faktor: 2024-02-21 15:27:13.679 +01:00 [INF] Time by mono encodeurl completed in 2686.5 ms 2024-02-21 15:27:35.944 +01:00 [INF] Time by pipe completed in 22265.6 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2712,788571ms
+Laufzeit der Pipe: 22265,6ms
+Gesamt Mono: 94947,6ms
+Faktor: 4,264318051 ### Durchgang 6 von 10 ```log @@ -474,10 +474,10 @@ Faktor: 2024-02-21 15:30:19.148 +01:00 [INF] Time by mono encodeurl completed in 2667.3 ms 2024-02-21 15:30:41.173 +01:00 [INF] Time by pipe completed in 22025.6 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2701,765714ms
+Laufzeit der Pipe: 22025,6ms
+Gesamt Mono: 94561,8ms
+Faktor: 4,2932678338 ### Durchgang 7 von 10 ```log @@ -518,10 +518,10 @@ Faktor: 2024-02-21 15:37:28.872 +01:00 [INF] Time by mono encodeurl completed in 2673.9 ms 2024-02-21 15:37:50.909 +01:00 [INF] Time by pipe completed in 22037.0 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2705,697143ms
+Laufzeit der Pipe: 22037,0ms
+Gesamt Mono: 94699,4ms
+Faktor: 4,2972909198 ### Durchgang 8 von 10 ```log @@ -562,10 +562,10 @@ Faktor: 2024-02-21 15:40:31.801 +01:00 [INF] Time by mono encodeurl completed in 2693.3 ms 2024-02-21 15:40:54.221 +01:00 [INF] Time by pipe completed in 22419.6 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2746,8ms
+Laufzeit der Pipe: 22419,6ms
+Gesamt Mono: 96138ms
+Faktor: 4,28812289 ### Durchgang 9 von 10 ```log @@ -606,10 +606,10 @@ Faktor: 2024-02-21 15:44:07.869 +01:00 [INF] Time by mono encodeurl completed in 2692.1 ms 2024-02-21 15:44:29.962 +01:00 [INF] Time by pipe completed in 22092.4 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2712,608571ms
+Laufzeit der Pipe: 22092,4ms
+Gesamt Mono: 94941,3ms
+Faktor: 4,2974642864 ### Durchgang 10 von 10 ```log @@ -650,14 +650,14 @@ Faktor: 2024-02-21 15:46:46.817 +01:00 [INF] Time by mono encodeurl completed in 2641.9 ms 2024-02-21 15:47:08.654 +01:00 [INF] Time by pipe completed in 21836.9 ms ``` -Durchschnitt Mono:
-Laufzeit der Pipe:
-Gesamt Mono:
-Faktor: +Durchschnitt Mono: 2667,505714ms
+Laufzeit der Pipe: 21836,9ms
+Gesamt Mono: 93362,7ms
+Faktor: 4,2754557652 ### Erkenntnisse Die durchschnittliche Laufzeit der Mono bzw. Single-Paket Analyse dauerte:
Die Gesamtlaufzeit von Mono beträgt:
Die Gesamtlaufzeit von Pipe beträgt:
-Der Durchschnittliche Faktor (schnellere Pipe als Mono) beträgt: +Der Durchschnittliche Faktor (schnellere Pipe als Mono) beträgt: 4,296846569 From 39aa6616f08b36f96eb17420d2549b92646ca531 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Wed, 17 Apr 2024 19:17:51 +0200 Subject: [PATCH 31/60] added experiments --- .../latex/6_implementation/db_exp.tex | 14 ++-- .../latex/6_implementation/experiments.tex | 2 + .../latex/6_implementation/pipe_exp.tex | 63 ++++++++++++++++++ documentation/latex/main.tex | 1 + documentation/pap/Case_A.png | Bin 0 -> 27213 bytes documentation/pap/Case_B.png | Bin 0 -> 34262 bytes documentation/pap/Case_C.png | Bin 0 -> 49233 bytes .../Simultanius search on LiteDb-Files.png | Bin 0 -> 10788 bytes 8 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 documentation/latex/6_implementation/pipe_exp.tex create mode 100644 documentation/pap/Case_A.png create mode 100644 documentation/pap/Case_B.png create mode 100644 documentation/pap/Case_C.png create mode 100644 documentation/pap/Simultanius search on LiteDb-Files.png diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 462fb3c..1455ed7 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -1,12 +1,14 @@ \subsubsection{Datenbank} \label{sec:ExperimenteDB} Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. -Aus der Gegebenen Einbindung einer NoSQL Datenbanklösung in ASP.NET, LiteDB, wurde diese auch zuerst als Datenspeicher gewählt. -\\ ---> reicht diese Begründung für die Entscheidung? \\ +Aus der Gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. +Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen 2.5 und 4.4 Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. + +LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. +Dazu wurde MySQL als \textit{open-source} und \textit{free-use} Version gewählt. +Diese unterscheidet sich grundsätzlich durch Indexierung der jeweiligen Einträge sowie dem höheren Maß an nutzbaren Ressourcen durch das laufen auf einem separaten Server. -Wieso Entscheidung auf Änderung? \\ +\\ Vergleich Messwerte (Am besten Messreihen) in Tabelle auf welchen Datenmengen? \\ ---> Entscheidung auf welche DB am Ende, weil? \\ ---> Einsparung von was am Ende? \\ \ No newline at end of file +--> Einsparung von was am Ende? \\ diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index 217ae06..279b31c 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,4 +1,6 @@ \subsection{Experimente} \label{sec:Experimente} + Aus der Forschungsfrage \ref{q:five} ergeben sich Experimente, die auf Skalierbarkeit und Laufzeit der API abziehlen. + \input{6_implementation/pipe_exp.tex} \input{6_implementation/db_exp.tex} \input{6_implementation/mysql_index.tex} %!!!! SUCHE AUF JSON VS DB FILE diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex new file mode 100644 index 0000000..546ddc2 --- /dev/null +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -0,0 +1,63 @@ +\subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} + Um die Suche von mehreren Paketen in der Datenbasis zu beschleunigen wurde sich das Prinzip der Parallelisierung zu Nutzen gemacht. + Hierzu wurde die zu untersuchende Liste von Paketen auf verschiedene Tasks aufgeteilt. + So ist nach dem vollständigen Befüllen der Pipeline eine theoretischen Laufzeitverkürzung um der Faktor der maximal abarbeitbaren Tasks erreicht. + + Dabei sind zwei Fälle zu unterscheiden: + \begin{description} + \item[\textit{Weniger} Pakete als Datenbank-Dateien]\hfill \\ + In diesem Falle einer geringeren Anzahl an Pakete wird die Pipe nie vollständig gefüllt. + \item[\textit{Mehr} Pakete als Datenbank-Dateien]\hfill \\ + In jenem Falle muss die Paketliste Stück für Stück in die Pipe eingefügt werden und beim Erreichen der Kapazität -- entsprechend der Anzahl der Datenbanken -- das früheste Paket entfernt und ein neues Paket am Anfang eingefügt werden. + \end{description} + + Die Verwaltung der 3 verschiedenen Staaten der Pipe ist in folgender Abbildung mit \ac{PAP} nachvollziehbar. + Anschließend sind die 3 Fälle näher ausgeführt. + \begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{../pap/Simultanius search on LiteDb-Files.png} + \caption{Übersicht der Pipeline-Staaten} + \label{png:OverviewPipelineStatus} + \end{figure} + + Das Befüllen der Pipeline geschieht nach folgendem Muster: + \begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{../pap/Case_A.png} + \caption{\ac{PAP} Befüllen der Pipeline} + \label{png:case_a} + \end{figure} + + Nach vollständiger Befüllung die Erhaltung der Pipeline: + \begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{../pap/Case_B.png} + \caption{\ac{PAP} Aufrechterhalten der Pipeline} + \label{png:case_b} + \end{figure} + + Beim Leeren der Pipeline: + \begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{../pap/Case_C.png} + \caption{\ac{PAP} Leeren der Pipeline} + \label{png:case_c} + \end{figure} + + Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien: + \begin{tabular}{|c|c|c|} + \hline + Such-Typ & Zeit & Faktor \\ + Mono-Suche & 262676.7ms & 1 \\ + Pipeline & 96868.4ms & 2.7213448 \\ + \hline + \end{tabular} + + Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien: + \begin{tabular}{|c|c|c|} + \hline + Such-Typ & Zeit & Faktor \\ + Mono-Suche & 95011.24ms & 1 \\ + Pipeline & 22111.5ms & 4.296846569 \\ + \hline + \end{tabular} diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 945865a..78711d4 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -193,6 +193,7 @@ \acro{CNA}[CNA]{\textbf{C}VE \textbf{N}umbering \textbf{A}uthority} \acro{JSON}[JSON]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation} \acro{JSON-LD}[JSON-LD]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation \textbf{L}inked \textbf{D}ata} + \acro{PAP}[PAP]{\textbf{P}rogramm \textbf{A}blauf-\textbf{P}lan} \end{acronym} \newpage \section{Messungen} \label{sec:Messungen} diff --git a/documentation/pap/Case_A.png b/documentation/pap/Case_A.png new file mode 100644 index 0000000000000000000000000000000000000000..b9547d0ea9aeffaf2614bc1218bf68efe329546e GIT binary patch literal 27213 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 literal 0 HcmV?d00001 diff --git a/documentation/pap/Case_B.png b/documentation/pap/Case_B.png new file mode 100644 index 0000000000000000000000000000000000000000..cfbfb54deb00a4a2eccf347d113ab7d55207cabb GIT binary patch literal 34262 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 literal 0 HcmV?d00001 diff --git a/documentation/pap/Simultanius search on LiteDb-Files.png b/documentation/pap/Simultanius search on LiteDb-Files.png new file mode 100644 index 0000000000000000000000000000000000000000..c953052fec7209d5a47fffdce1665197b198f8c3 GIT binary patch literal 10788 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 BsjUD2 literal 0 HcmV?d00001 From 84b12fb483ae9270bf5bb4543cb054ee576d92b0 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:32:37 +0200 Subject: [PATCH 32/60] Pipeline experiment more detailed --- .../latex/6_implementation/db_exp.tex | 7 ++- .../latex/6_implementation/pipe_exp.tex | 46 +++++++++++++------ documentation/latex/Appendix/abk.tex | 10 ++++ documentation/latex/main.tex | 15 +----- 4 files changed, 45 insertions(+), 33 deletions(-) create mode 100644 documentation/latex/Appendix/abk.tex diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 1455ed7..04cb154 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -2,13 +2,12 @@ \subsubsection{Datenbank} \label{sec:ExperimenteDB} Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. Aus der Gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen 2.5 und 4.4 Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. +Dies wird deutlich an den in Abschnitt \textcolor{red}{Einfügen!} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. Dazu wurde MySQL als \textit{open-source} und \textit{free-use} Version gewählt. Diese unterscheidet sich grundsätzlich durch Indexierung der jeweiligen Einträge sowie dem höheren Maß an nutzbaren Ressourcen durch das laufen auf einem separaten Server. -\\ +% Vergleich Messwerte (Am besten Messreihen) in Tabelle auf welchen Datenmengen? \\ -Vergleich Messwerte (Am besten Messreihen) in Tabelle auf welchen Datenmengen? \\ - ---> Einsparung von was am Ende? \\ +% --> Einsparung von was am Ende? \\ diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex index 546ddc2..6bc8580 100644 --- a/documentation/latex/6_implementation/pipe_exp.tex +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -20,44 +20,60 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} \label{png:OverviewPipelineStatus} \end{figure} + \newpage Das Befüllen der Pipeline geschieht nach folgendem Muster: \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{../pap/Case_A.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_A.png} \caption{\ac{PAP} Befüllen der Pipeline} \label{png:case_a} \end{figure} + Zu Erkennen ist, dass solange ein neuer Task erstellt wird, wie die Anzahl erstens nicht die Anzahl der Datenbanken erreicht hat und zweitens die aktuelle Anzahl an Tasks nicht über dem Wert der Datenbankenmenge ist. + Dies definiert das Befüllen der Pipe. + \newpage Nach vollständiger Befüllung die Erhaltung der Pipeline: \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{../pap/Case_B.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_B.png} \caption{\ac{PAP} Aufrechterhalten der Pipeline} \label{png:case_b} \end{figure} + Hier wird jetzt nachdem das älteste, am zeitigsten in der Pipe eingeführte und noch zu analysierende Paket aus der Liste entfernt und am Anfang der Datenbankenliste der nächste Eintrag wieder angeführt, um ebenfalls alle Datenbanken zu durchlaufen. + \\ + Dieser Prozess wird nur dadurch unterbunden, wenn der Zähler registriert, dass keine größere Zahl an noch zu analysierenden Paketen als Datenbankdateien wartend ist und somit das entleeren der Pipe eingeläutet werden muss. + \newpage Beim Leeren der Pipeline: \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{../pap/Case_C.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_C.png} \caption{\ac{PAP} Leeren der Pipeline} \label{png:case_c} \end{figure} + Hier wird beim vollständigen Durchlaufen eines Paketes dieses entfernt aus der Liste und alle weiteren rücken eine Eintrag nach vorne, wodurch die letzten Pakete ebenfalls noch durch die restlichen Datenbankdateien vollständig abgeglichen werden. - Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien: - \begin{tabular}{|c|c|c|} + \newpage + Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien:\\ + \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline - Such-Typ & Zeit & Faktor \\ - Mono-Suche & 262676.7ms & 1 \\ - Pipeline & 96868.4ms & 2.7213448 \\ + Such-Typ & Zeit & Faktor \\ \hline + Mono-Suche & 262676.7ms & 1 \\ + Pipeline & 96868.4ms & 2.7213448 \\ \hline - \end{tabular} + \caption{Laufzeiten Durchschnitt 10 Messungen -- Weniger Pakete als Datenbankdateien \textsuperscript{siehe Appendix \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken}}} + \label{tabularx:LessPackagesThenDbFiles} + \end{tabularx} - Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien: - \begin{tabular}{|c|c|c|} + Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei mehr Paketen als Datenbankdateien:\\ + \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline - Such-Typ & Zeit & Faktor \\ - Mono-Suche & 95011.24ms & 1 \\ - Pipeline & 22111.5ms & 4.296846569 \\ + Such-Typ & Zeit & Faktor \\ \hline + Mono-Suche & 95011.24ms & 1 \\ + Pipeline & 22111.5ms & 4.296846569 \\ \hline - \end{tabular} + \caption{Laufzeiten Durchschnitt 10 Messungen -- Weniger Pakete als Datenbankdateien \textsuperscript{siehe Appendix \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken}}} + \label{tabularx:MorePackagesThenDbFiles} + \end{tabularx} + Deutlich ablesbar ist in den Tabellen \ref{tabularx:LessPackagesThenDbFiles} und \ref{tabularx:MorePackagesThenDbFiles}, dass jeweils ein Zeitgewinn erzielt wurde. + Somit ist die Pipeline eine deutliche Verbesserung für die Antwortzeiten des Webservices. diff --git a/documentation/latex/Appendix/abk.tex b/documentation/latex/Appendix/abk.tex new file mode 100644 index 0000000..16ec351 --- /dev/null +++ b/documentation/latex/Appendix/abk.tex @@ -0,0 +1,10 @@ +\section{Abkürzungen} \label{sec:Abkürzungen} + \begin{acronym}[LangesWortFuerDieEinstellung] + \acro{API}[API]{\textbf{A}pplication \textbf{P}rogramming \textbf{I}nterface} + \acro{NIST}[NIST]{\textbf{N}ational \textbf{I}nstitute for \textbf{S}tandards and \textbf{T}echnology} + \acro{CVE}[CVE]{\textbf{C}ommon \textbf{V}ulnerabilities and \textbf{E}xposures} + \acro{CNA}[CNA]{\textbf{C}VE \textbf{N}umbering \textbf{A}uthority} + \acro{JSON}[JSON]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation} + \acro{JSON-LD}[JSON-LD]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation \textbf{L}inked \textbf{D}ata} + \acro{PAP}[PAP]{\textbf{P}rogramm \textbf{A}blauf-\textbf{P}lan} + \end{acronym} \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 78711d4..740136e 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -185,16 +185,7 @@ \newpage \begin{appendices} - \section{Abkürzungen} \label{sec:Abkürzungen} - \begin{acronym}[LangesWortFuerDieEinstellung] - \acro{API}[API]{\textbf{A}pplication \textbf{P}rogramming \textbf{I}nterface} - \acro{NIST}[NIST]{\textbf{N}ational \textbf{I}nstitute for \textbf{S}tandards and \textbf{T}echnology} - \acro{CVE}[CVE]{\textbf{C}ommon \textbf{V}ulnerabilities and \textbf{E}xposures} - \acro{CNA}[CNA]{\textbf{C}VE \textbf{N}umbering \textbf{A}uthority} - \acro{JSON}[JSON]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation} - \acro{JSON-LD}[JSON-LD]{\textbf{J}ava\textbf{S}cript \textbf{O}bject \textbf{N}otation \textbf{L}inked \textbf{D}ata} - \acro{PAP}[PAP]{\textbf{P}rogramm \textbf{A}blauf-\textbf{P}lan} - \end{acronym} + \input{Appendix/abk.tex} \newpage \section{Messungen} \label{sec:Messungen} \startcontents[Messungen] @@ -209,11 +200,7 @@ \phantomsection \printbibheading[title={Quellen}] \addcontentsline{toc}{section}{Quellen} - % \printbibliography[type=book, heading=subbibliography, title={Literatur}] - % \newpage \printbibliography[type=online, heading=subbibliography, title={Links}] - % \newpage - % \printbibliography[type=article, heading=subbibliography, title={Zeitschriften}] \newpage \phantomsection From 84822dd08acc1e58bead8583a050a71ae649b90c Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:58:33 +0200 Subject: [PATCH 33/60] "Forschungsfragen"-Label + bib --- .../latex/2_motivation/motivation.tex | 4 +- documentation/latex/lib/bib.bib | 9 +++- documentation/latex/{lib => }/main.bbl | 36 ++++++++++---- documentation/latex/main.ptc | 48 +++++++++++++++++++ documentation/latex/main.tex | 1 + 5 files changed, 85 insertions(+), 13 deletions(-) rename documentation/latex/{lib => }/main.bbl (83%) create mode 100644 documentation/latex/main.ptc diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index db1fc46..ab8b2bb 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -13,8 +13,8 @@ \section{Motivation} \label{subsec:Motivation} Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken ganzer Projekte bietet. Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. - Hieraus ergiben sich folgende Forschungsfragen: - \begin{enumerate} + Hieraus ergiben sich folgende Forschungsfragen (FF): + \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1cm] \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?} \label{q:one} \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{q:two} \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{q:three} diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index fe46c31..492054b 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -56,4 +56,11 @@ @online{link:ApiDef % https://arxiv.org/abs/2401.13169 % Wiss2: Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem -% https://www.semanticscholar.org/paper/Demystifying-the-Vulnerability-Propagation-and-Its-Liu-Chen/63c8044efacec1b39a28fbde5889bc75f473bd46 \ No newline at end of file +% https://www.semanticscholar.org/paper/Demystifying-the-Vulnerability-Propagation-and-Its-Liu-Chen/63c8044efacec1b39a28fbde5889bc75f473bd46 + +% MySql Index +@online{link:MySqlIndex, + title = "10.3.1 How MySQL Uses Indexes", + urldate = "2024-04-18", + url = "https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html", +} diff --git a/documentation/latex/lib/main.bbl b/documentation/latex/main.bbl similarity index 83% rename from documentation/latex/lib/main.bbl rename to documentation/latex/main.bbl index 3dc9ac7..5a2ea3e 100644 --- a/documentation/latex/lib/main.bbl +++ b/documentation/latex/main.bbl @@ -20,8 +20,8 @@ \refsection{0} \datalist[entry]{none/global//global/global} \entry{link:RedHatCveDef}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{Was bedeutet CVE?} \field{urlday}{14} @@ -37,8 +37,8 @@ \endverb \endentry \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{CVE Numbering Authorities (CNAs)} \field{urlday}{14} @@ -54,8 +54,8 @@ \endverb \endentry \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{Abhängigkeitsverwaltung} \field{urlday}{14} @@ -71,8 +71,8 @@ \endverb \endentry \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Was ist eine Dependency} \field{urlday}{14} @@ -88,8 +88,8 @@ \endverb \endentry \entry{link:ApiDef}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{What is an API (Application Programming Interface)?} \field{urlday}{14} @@ -104,6 +104,22 @@ \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ \endverb \endentry + \entry{link:MySqlIndex}{online}{} + \field{sortinit}{9} + \field{sortinithash}{0a5ebc79d83c96b6579069544c73c7d4} + \field{labeltitlesource}{title} + \field{title}{10.3.1 How MySQL Uses Indexes} + \field{urlday}{18} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \endverb + \verb{url} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \endverb + \endentry \enddatalist \endrefsection \endinput diff --git a/documentation/latex/main.ptc b/documentation/latex/main.ptc new file mode 100644 index 0000000..2714a2c --- /dev/null +++ b/documentation/latex/main.ptc @@ -0,0 +1,48 @@ +\babel@toc {ngerman}{}\relax +\contentsline {section}{Inhaltsverzeichnis}{1}{section*.1}% +\contentsline {section}{\numberline {1}Abstract}{3}{section.2}% +\contentsline {section}{\numberline {2}Motivation}{4}{section.4}% +\contentsline {section}{\numberline {3}Definitionen}{5}{section.10}% +\contentsline {section}{\numberline {4}Andere Arbeiten}{7}{section.14}% +\contentsline {subsection}{\numberline {4.1}Softwaretools}{7}{subsection.15}% +\contentsline {subsubsection}{\numberline {4.1.1}NIST-API}{7}{subsubsection.16}% +\contentsline {subsubsection}{\numberline {4.1.2}Github Dependa Bot}{7}{subsubsection.18}% +\contentsline {subsubsection}{\numberline {4.1.3}Snyk}{8}{subsubsection.19}% +\contentsline {subsubsection}{\numberline {4.1.4}OWASP Dependency-Check}{8}{subsubsection.20}% +\contentsline {subsection}{\numberline {4.2}Wissenschaftliche Arbeiten}{8}{subsection.21}% +\contentsline {subsubsection}{\numberline {4.2.1}ReposVul}{8}{subsubsection.22}% +\contentsline {subsubsection}{\numberline {4.2.2}Transitivity and Granularity on Vulnerability Propagation}{9}{subsubsection.23}% +\contentsline {subsubsection}{\numberline {4.2.3}Demystifying Vulnerability Propagation}{9}{subsubsection.24}% +\contentsline {section}{\numberline {5}Konzept}{10}{section.25}% +\contentsline {subsection}{\numberline {5.1}Funktionale Anforderungen}{10}{subsection.26}% +\contentsline {subsection}{\numberline {5.2}Nichtfunktionale Anforderungen}{10}{subsection.34}% +\contentsline {subsection}{\numberline {5.3}Forschungsfragen}{11}{subsection.40}% +\contentsline {subsection}{\numberline {5.4}Besondere Merkmale}{11}{subsection.41}% +\contentsline {subsection}{\numberline {5.5}Zielsetzung}{12}{subsection.42}% +\contentsline {subsection}{\numberline {5.6}Architektur}{12}{subsection.47}% +\contentsline {subsubsection}{\numberline {5.6.1}Architektur V1}{12}{subsubsection.48}% +\contentsline {subsubsection}{\numberline {5.6.2}Architektur V2}{14}{subsubsection.55}% +\contentsline {section}{\numberline {6}Implementation}{15}{section.59}% +\contentsline {subsection}{\numberline {6.1}Implementation V1}{15}{subsection.60}% +\contentsline {subsection}{\numberline {6.2}Verifikation V1}{17}{subsection.61}% +\contentsline {subsection}{\numberline {6.3}Experimente}{17}{subsection.62}% +\contentsline {subsubsection}{\numberline {6.3.1}LiteDB Pipeline}{17}{subsubsection.63}% +\contentsline {subsubsection}{\numberline {6.3.2}Datenbank}{24}{subsubsection.71}% +\contentsline {subsubsection}{\numberline {6.3.3}MySQL Indexierung}{24}{subsubsection.72}% +\contentsline {subsection}{\numberline {6.4}Implementation V2}{24}{subsection.74}% +\contentsline {subsection}{\numberline {6.5}Verifikation V2}{24}{subsection.75}% +\contentsline {section}{\numberline {7}Diskussion}{25}{section.76}% +\contentsline {section}{\numberline {8}Zusammenfassung}{26}{section.77}% +\contentsline {section}{Appendix}{27}{section*.78}% +\contentsline {section}{\numberline {A}Abkürzungen}{27}{appendix.79}% +\contentsline {section}{\numberline {B}Messungen}{28}{appendix.80}% +\ttl@starttoc {Messungen@1} +\contentsline {subsection}{\numberline {B.1}Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: weniger Pakete als Datenbanken}{28}{subsection.81}% +\contentsline {subsection}{\numberline {B.2}Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: mehr Pakete als Datenbanken}{31}{subsection.92}% +\contentsline {subsection}{\numberline {B.3}MySQL mit Index}{40}{subsection.103}% +\contentsline {subsection}{\numberline {B.4}MySQL ohne Index}{49}{subsection.114}% +\ttl@stoptoc {Messungen@1} +\contentsline {section}{Quellen}{59}{section*.125}% +\contentsline {section}{Abbildungen}{60}{section*.126}% +\contentsline {section}{Tabellen}{61}{section*.127}% +\contentsfinish diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 740136e..01fb9e3 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -6,6 +6,7 @@ \usepackage[center]{caption} \usepackage{booktabs} \usepackage{xcolor} +\usepackage{enumitem} \usepackage{fancyhdr} \usepackage{graphicx} \usepackage{latexsym} From c9ac180637779c8c54bc1ad2a8090e33987c0419 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:59:00 +0200 Subject: [PATCH 34/60] measurement index MySql added --- documentation/fragments/mysql-measure.md | 30 +++++++++++++++++++ .../latex/6_implementation/mysql_index.tex | 21 +++++++++++-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/documentation/fragments/mysql-measure.md b/documentation/fragments/mysql-measure.md index a2690fb..7598a93 100644 --- a/documentation/fragments/mysql-measure.md +++ b/documentation/fragments/mysql-measure.md @@ -10,6 +10,7 @@ - [8 von 10](#8-von-10) - [9 von 10](#9-von-10) - [10 von 10](#10-von-10) +- [Durchschnitte "Mit Index"](#durchschnitte-mit-index) - [Ohne Index](#ohne-index) - [1 von 10](#1-von-10-1) - [2 von 10](#2-von-10-1) @@ -21,6 +22,7 @@ - [8 von 10](#8-von-10-1) - [9 von 10](#9-von-10-1) - [10 von 10](#10-von-10-1) +- [Durchschnitte "Ohne Index"](#durchschnitte-ohne-index) ## Mit Index @@ -63,6 +65,8 @@ 2024-03-31 15:51:16.714 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.7 ms 2024-03-31 15:51:16.714 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 181.8 ms ``` +Akkumulierte Laufzeit: 82,3ms +Reiner Suchdurchschnitt: 2,743333333ms ### 2 von 10 ```log @@ -103,6 +107,8 @@ 2024-03-31 15:52:47.318 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.4 ms 2024-03-31 15:52:47.318 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 33.5 ms ``` +Akkumulierte Laufzeit: 16,9ms +Reiner Suchdurchschnitt: ms ### 3 von 10 ```log @@ -143,6 +149,8 @@ 2024-03-31 15:56:58.724 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.4 ms 2024-03-31 15:56:58.724 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 43.1 ms ``` +Akkumulierte Laufzeit: 21,4ms +Reiner Suchdurchschnitt: ms ### 4 von 10 ```log @@ -183,6 +191,8 @@ 2024-03-31 15:58:31.458 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms 2024-03-31 15:58:31.458 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 17.7 ms ``` +Akkumulierte Laufzeit: 13,2ms +Reiner Suchdurchschnitt: ms ### 5 von 10 ```log @@ -223,6 +233,8 @@ 2024-03-31 15:59:31.265 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms 2024-03-31 15:59:31.265 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 18.8 ms ``` +Akkumulierte Laufzeit: 14,2ms +Reiner Suchdurchschnitt: ms ### 6 von 10 ```log @@ -263,6 +275,8 @@ 2024-03-31 16:01:13.668 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms 2024-03-31 16:01:13.668 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 17.9 ms ``` +Akkumulierte Laufzeit: 13,7ms +Reiner Suchdurchschnitt: ms ### 7 von 10 ```log @@ -303,6 +317,8 @@ 2024-03-31 16:03:51.660 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.3 ms 2024-03-31 16:03:51.660 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 20.1 ms ``` +Akkumulierte Laufzeit: 15,1ms +Reiner Suchdurchschnitt: ms ### 8 von 10 ```log @@ -343,6 +359,8 @@ 2024-03-31 16:04:25.587 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms 2024-03-31 16:04:25.587 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 15.1 ms ``` +Akkumulierte Laufzeit: 10,4ms +Reiner Suchdurchschnitt: ms ### 9 von 10 ```log @@ -383,6 +401,8 @@ 2024-03-31 16:05:19.103 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms 2024-03-31 16:05:19.103 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 19.7 ms ``` +Akkumulierte Laufzeit: 14,9ms +Reiner Suchdurchschnitt: 0,496666667ms ### 10 von 10 ```log @@ -423,6 +443,12 @@ 2024-03-31 16:05:57.424 +00:00 [INF] Query-Time for Package "encodeurl" completed in 0.2 ms 2024-03-31 16:05:57.424 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 15.0 ms ``` +Akkumulierte Laufzeit: 11,1ms +Reiner Suchdurchschnitt: 0,37ms + +## Durchschnitte "Mit Index" +Durchschnitt der Einzelpaketsuche: 0,710666667ms +Durchschnitt der Listensuche: 21,32ms ## Ohne Index ### 1 von 10 @@ -824,3 +850,7 @@ 2024-03-31 16:24:56.093 +00:00 [INF] Query-Time for Package "encodeurl" completed in 207.7 ms 2024-03-31 16:24:56.093 +00:00 [INF] Complete Time for Query-Search after List of Packages completed in 7231.9 ms ``` + +## Durchschnitte "Ohne Index" +Durchschnitt der Einzelpaketsuche: 207,86ms +Durchschnitt der Listensuche: ms diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex index 9801ba7..e73cfff 100644 --- a/documentation/latex/6_implementation/mysql_index.tex +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -1,4 +1,19 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} - MySQL Indexierung - Suche mit Indizierung: 0.8-1.2 ms - Suche ohne Indizierung: 120-140 ms \ No newline at end of file + Die expliziten gemessenen Differenzen zwischen der Suche auf einer und der selben Tabelle einmal mit und einmal ohne erzeugten Index kann im Appendix unter \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex} eingesehen werden. + \\ + Eine Indizierung auf einer Tabelle in MySQL erzeugt Bereiche auf der Spalte, mit denen die Suche sehr beschleunigt werden. + Laut der offiziellen Webseite von MySQL ist ohne Index die Suche auf einer Tabelle sequenziell von oben nach unten.\textsuperscript{\cite{link:MySqlIndex}} + Dagegen ermöglicht die Suche mit einem erstellten Index der Datenbank, schon beim ersten Tabellenzugriff lediglich einen Bereich von Datensätzen zu durchsuchen. + Damit sollte die Leistung merklich verbessert werden. + \\ + Nachfolgend die arithmetische Mittel aus jeweils 10 Messungen auf der selben Tabelle mit und ohne Index: + \\ + \begin{tabularx}{0.8\textwidth}{|c|c|c|} + \hline + Such-Typ & Zeit & Faktor \\ \hline + ohne Index & 207,86ms & 1 \\ + mit Index & 0,710666667ms & 292,48593 \\ + \hline + \caption{Laufzeiten Durchschnitt 10 Messungen \textsuperscript{siehe Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex}}} + \label{tabularx:MySqlIndexWithAndWithout} + \end{tabularx} From c56913fcf422cbff738c8d6a6e86d56321e3b853 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Fri, 19 Apr 2024 11:46:26 +0200 Subject: [PATCH 35/60] delete useless files --- documentation/latex/sections/analyse.tex | 4 --- documentation/latex/sections/conclusion.tex | 4 --- documentation/latex/sections/einleitung.tex | 4 --- documentation/latex/sections/recherche.tex | 4 --- documentation/latex/sections/sec1.tex | 4 --- documentation/latex/sections/umsetzung.tex | 4 --- documentation/latex/subsections/api.tex | 4 --- documentation/latex/subsections/ausblick.tex | 4 --- documentation/latex/subsections/cve.tex | 2 -- .../latex/subsections/laufzeitanalyse.tex | 5 --- .../latex/subsections/laufzeitmessungen.tex | 3 -- .../latex/subsections/motivation.tex | 34 ------------------- .../subsections/n\303\244chste_schritte.tex" | 4 --- .../latex/subsections/problemstellung.tex | 5 --- .../latex/subsections/referenzen.tex | 5 --- documentation/latex/subsections/subsec1.tex | 4 --- .../latex/subsections/technologiestack.tex | 6 ---- .../latex/subsections/umgang_mit_cve.tex | 2 -- documentation/latex/subsections/vision.tex | 10 ------ documentation/latex/subsections/vorgehen.tex | 20 ----------- .../latex/subsubsections/controller.tex | 3 -- .../latex/subsubsections/db_anbindung.tex | 2 -- .../latex/subsubsections/dependa_bot.tex | 2 -- .../latex/subsubsections/modells.tex | 3 -- documentation/latex/subsubsections/nist.tex | 2 -- .../latex/subsubsections/subsubsec1.tex | 2 -- .../latex/subsubsections/weitere.tex | 2 -- 27 files changed, 148 deletions(-) delete mode 100644 documentation/latex/sections/analyse.tex delete mode 100644 documentation/latex/sections/conclusion.tex delete mode 100644 documentation/latex/sections/einleitung.tex delete mode 100644 documentation/latex/sections/recherche.tex delete mode 100644 documentation/latex/sections/sec1.tex delete mode 100644 documentation/latex/sections/umsetzung.tex delete mode 100644 documentation/latex/subsections/api.tex delete mode 100644 documentation/latex/subsections/ausblick.tex delete mode 100644 documentation/latex/subsections/cve.tex delete mode 100644 documentation/latex/subsections/laufzeitanalyse.tex delete mode 100644 documentation/latex/subsections/laufzeitmessungen.tex delete mode 100644 documentation/latex/subsections/motivation.tex delete mode 100644 "documentation/latex/subsections/n\303\244chste_schritte.tex" delete mode 100644 documentation/latex/subsections/problemstellung.tex delete mode 100644 documentation/latex/subsections/referenzen.tex delete mode 100644 documentation/latex/subsections/subsec1.tex delete mode 100644 documentation/latex/subsections/technologiestack.tex delete mode 100644 documentation/latex/subsections/umgang_mit_cve.tex delete mode 100644 documentation/latex/subsections/vision.tex delete mode 100644 documentation/latex/subsections/vorgehen.tex delete mode 100644 documentation/latex/subsubsections/controller.tex delete mode 100644 documentation/latex/subsubsections/db_anbindung.tex delete mode 100644 documentation/latex/subsubsections/dependa_bot.tex delete mode 100644 documentation/latex/subsubsections/modells.tex delete mode 100644 documentation/latex/subsubsections/nist.tex delete mode 100644 documentation/latex/subsubsections/subsubsec1.tex delete mode 100644 documentation/latex/subsubsections/weitere.tex diff --git a/documentation/latex/sections/analyse.tex b/documentation/latex/sections/analyse.tex deleted file mode 100644 index ad3c710..0000000 --- a/documentation/latex/sections/analyse.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Analyse} \label{sec:Analyse} - \input{subsections/laufzeitmessungen.tex} - \input{subsections/laufzeitanalyse.tex} - \input{subsections/ausblick.tex} diff --git a/documentation/latex/sections/conclusion.tex b/documentation/latex/sections/conclusion.tex deleted file mode 100644 index bab9d34..0000000 --- a/documentation/latex/sections/conclusion.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Conclusion} \label{sec:Conclusion} - \input{subsections/vision.tex} - \input{subsections/nächste_schritte.tex} - \ No newline at end of file diff --git a/documentation/latex/sections/einleitung.tex b/documentation/latex/sections/einleitung.tex deleted file mode 100644 index 62f5bf1..0000000 --- a/documentation/latex/sections/einleitung.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Einleitung} \label{sec:Einleitung} - \input{subsections/problemstellung.tex} - \input{subsections/motivation.tex} - \input{subsections/vorgehen.tex} \ No newline at end of file diff --git a/documentation/latex/sections/recherche.tex b/documentation/latex/sections/recherche.tex deleted file mode 100644 index f3784a9..0000000 --- a/documentation/latex/sections/recherche.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Recherche} \label{sec:Recherche} - \input{subsections/cve.tex} - \input{subsections/umgang_mit_cve.tex} - \input{subsections/referenzen.tex} \ No newline at end of file diff --git a/documentation/latex/sections/sec1.tex b/documentation/latex/sections/sec1.tex deleted file mode 100644 index cb6c7fd..0000000 --- a/documentation/latex/sections/sec1.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Test-Section 1} \label{sec:TestSection1} - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - - \input{subsections/subsec1.tex} \ No newline at end of file diff --git a/documentation/latex/sections/umsetzung.tex b/documentation/latex/sections/umsetzung.tex deleted file mode 100644 index 1ff0af5..0000000 --- a/documentation/latex/sections/umsetzung.tex +++ /dev/null @@ -1,4 +0,0 @@ -\section{Umsetzung} \label{sec:Umsetzung} - \input{subsections/technologiestack.tex} - \input{subsections/api.tex} - \ No newline at end of file diff --git a/documentation/latex/subsections/api.tex b/documentation/latex/subsections/api.tex deleted file mode 100644 index b874606..0000000 --- a/documentation/latex/subsections/api.tex +++ /dev/null @@ -1,4 +0,0 @@ -\subsection{\ac{API}} \label{subsec:API} - \input{subsubsections/modells.tex} - \input{subsubsections/controller.tex} - \input{subsubsections/db_anbindung.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/ausblick.tex b/documentation/latex/subsections/ausblick.tex deleted file mode 100644 index 384efbd..0000000 --- a/documentation/latex/subsections/ausblick.tex +++ /dev/null @@ -1,4 +0,0 @@ -\subsection{Ausblick} \label{subsec:Ausblick} -Ausblick -Ziel: schneller als \ac{NIST}-\ac{API} sein (so und so viele Sekunden übers Netz im Vergleich zu so und so vielen sekunden über unsere \ac{API}) -Um Ziel zu erreichen: Andere Datenbank verwenden um Lesezugriffe optimieren \ No newline at end of file diff --git a/documentation/latex/subsections/cve.tex b/documentation/latex/subsections/cve.tex deleted file mode 100644 index 019f389..0000000 --- a/documentation/latex/subsections/cve.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsection{CVE} \label{subsec:CVE} - \ac{CVE} \cite{} \ No newline at end of file diff --git a/documentation/latex/subsections/laufzeitanalyse.tex b/documentation/latex/subsections/laufzeitanalyse.tex deleted file mode 100644 index 8a6909c..0000000 --- a/documentation/latex/subsections/laufzeitanalyse.tex +++ /dev/null @@ -1,5 +0,0 @@ -\subsection{Laufzeitanalyse Mono-Suche und Pipeline-Suche auf LiteDB} \label{subsec:Laufzeitanalyse} -Laufzeitanalyse Mono-Suche und Pipeline-Suche auf LiteDB -Wie ist LiteDB-Suche zu verschnellern -Vergleich der Messungen -Erklärung der Pipeline (Diagramme) (Wie und Warum, LiteDB ist File-Basier und deswegen kann auf mehreren Dateien gesucht werden falls genug threads zur verfügung stehen) \ No newline at end of file diff --git a/documentation/latex/subsections/laufzeitmessungen.tex b/documentation/latex/subsections/laufzeitmessungen.tex deleted file mode 100644 index 28026d9..0000000 --- a/documentation/latex/subsections/laufzeitmessungen.tex +++ /dev/null @@ -1,3 +0,0 @@ -\subsection{Laufzeitmessungen nach Datenbankerstellung} \label{subsec:Laufzeitmessungen} -Laufzeitmessungen nach Datenbankerstellung (etwa 1 std rechnen) -JSON-Datei Suche VS LiteDB suche (60 min vs 8 s): Rechnung nach wie vielen Suchanfragen sich das ganze gelohnt hat (nach etwa einer) \ No newline at end of file diff --git a/documentation/latex/subsections/motivation.tex b/documentation/latex/subsections/motivation.tex deleted file mode 100644 index be8f307..0000000 --- a/documentation/latex/subsections/motivation.tex +++ /dev/null @@ -1,34 +0,0 @@ -\subsection{Motivation} \label{subsec:Motivation} - Beim Entwickeln von Softwarelösungen gibt es viele Herausforderungen und Probleme. - Diese werden durch viele bereits vorhandene Softwarepakete bewältigt. - Die Nutzung frei verfügbarer Softwarepakete sind deshalb im Arbeitsalltag gang und gäbe. - Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. - Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der gute Pakete beständig besser werden lässt und nicht durchdachte entweder (a) an Bedeutung verlieren lässt oder (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. - Ein anderer essentieller Aspekt außer der Nutzbarkeit oder Funktionserfüllung ist die Sicherheit. - Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. - Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. - \\ \\ - Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. - \ac{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. - \\ - Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem Angebot der \glqq National Cybersecurity FFRDC\grqq~zeitaufwendig und ressourcenintensiv - schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. - Eine Automatisierung der Analyse solcher Pakete zielt somit nicht nur eine Reduktion des Zeitaufwandes mit sich, auch ist eine umfangreichere Analyse ohne Mehraufwand möglich. - Dies spiegelt sich beispielsweise in der Möglichkeit wieder, ganze Projekte direkt analysieren zu lassen anstelle der einzelnen Pakete. - \\ - Das zeigt, dass ein dringender Bedarf an einem Werkzeug besteht, das Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken bietet. - Solch ein Werkzeug könnte einem Unternehmen weiterhin verschiedene Vorteile im Bereich der Softwareentwicklung für Transparenz, Qualität und Sicherheit bringen. - \begin{enumerate} - \item Transparenz und Vertrauen\\ - Durch eine klare Übersicht über genutzte externe Softwarekomponenten mit Sicherheitslücken können frühzeitig besser informierte Entscheidungen getroffen und potenzielle Risiken identifiziert werden. - \item Qualität\\ - Entwickler können leichter erkennen, ob Abhängigkeiten ersetzt oder aktualisiert werden müssen. - \item Sicherheit\\ - Um die Gesamtsicherheit einer Applikation bestmöglich zu gewährleisten trägt ein solches Tool, welches Schwachstellen und Abhängigkeiten auch in tieferen Ebenen von Abhängigkeiten darstellt, zur Identifikation und Vermeidung von Sicherheitslücken bei. - \end{enumerate} - Insgesamt hilft ein solches Werkzeug bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. - - \textcolor{red}{ - \begin{itemize} - \item Forschungsfragennennung in Motivation! ABER nicht erklären/ausführen. - \end{itemize} - } diff --git "a/documentation/latex/subsections/n\303\244chste_schritte.tex" "b/documentation/latex/subsections/n\303\244chste_schritte.tex" deleted file mode 100644 index 14b566e..0000000 --- "a/documentation/latex/subsections/n\303\244chste_schritte.tex" +++ /dev/null @@ -1,4 +0,0 @@ -\subsection{Nächste Schritte mit neuer Zielsetzung} \label{subsec:Nächste_Schritte} - Nächste Schritte mit neuer Zielsetzung - \ac{API} mit MySQL-DB versehen für vermutete höhere Performance (vermutung weil db-Server wahrscheinlich schneller als lokal lesen/schreiben[hardwareabhängig]) - Analyseergebnis ist auszubauen um Schweregrad der Schwachstelle um besonders kritische stellen im Dependency-Baum hervorzuheben \ No newline at end of file diff --git a/documentation/latex/subsections/problemstellung.tex b/documentation/latex/subsections/problemstellung.tex deleted file mode 100644 index 6b342ec..0000000 --- a/documentation/latex/subsections/problemstellung.tex +++ /dev/null @@ -1,5 +0,0 @@ -\subsection{Problemstellung} \label{subsec:Problemstellung} - Das Entwickeln von Softwarelösungen ist heutzutage nicht mehr ohne Bibliotheken, Frameworks oder externe Module denkbar. - Solche Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung. - Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. - Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. \ No newline at end of file diff --git a/documentation/latex/subsections/referenzen.tex b/documentation/latex/subsections/referenzen.tex deleted file mode 100644 index 4bcba51..0000000 --- a/documentation/latex/subsections/referenzen.tex +++ /dev/null @@ -1,5 +0,0 @@ -\subsection{Referenzen} \label{subsec:Referenzen} - Referenzen und \ac{CVE}-Nutzungen - \input{subsubsections/nist.tex} - \input{subsubsections/dependa_bot.tex} - \input{subsubsections/weitere.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/subsec1.tex b/documentation/latex/subsections/subsec1.tex deleted file mode 100644 index 4bed88e..0000000 --- a/documentation/latex/subsections/subsec1.tex +++ /dev/null @@ -1,4 +0,0 @@ -\subsection{Test-Subsection 1} \label{subsec:TestSubsection1} - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - - \input{subsubsections/subsubsec1.tex} \ No newline at end of file diff --git a/documentation/latex/subsections/technologiestack.tex b/documentation/latex/subsections/technologiestack.tex deleted file mode 100644 index 2970f71..0000000 --- a/documentation/latex/subsections/technologiestack.tex +++ /dev/null @@ -1,6 +0,0 @@ -\subsection{Technologiestack} \label{subsec:Technologiestack} -Technologiestack - ASP.NET - DOCKER - LiteDB (NOSQL) erst - MySQL (SQL) Ausblick \ No newline at end of file diff --git a/documentation/latex/subsections/umgang_mit_cve.tex b/documentation/latex/subsections/umgang_mit_cve.tex deleted file mode 100644 index 21e2013..0000000 --- a/documentation/latex/subsections/umgang_mit_cve.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsection{Umgang mit CVE} \label{subsec:Umgang_mit_CVE} - Umgang mit \ac{CVE} \ No newline at end of file diff --git a/documentation/latex/subsections/vision.tex b/documentation/latex/subsections/vision.tex deleted file mode 100644 index 0c6b572..0000000 --- a/documentation/latex/subsections/vision.tex +++ /dev/null @@ -1,10 +0,0 @@ -\subsection{Vision} \label{subsec:Vision} -Vision - Validieren ob Ziel erreicht ist, dass - ein Node-JS-Projekt komplett analysisert (alle Pakete entnommen werden) und nach Schwachstellen untersucht werden - das zurückgegebene Format der \ac{API} sinnvoll und struckturiert ist - Wurde sich an programmiertechnische Standards gehalten - Models sind eigene Bibliothek (losgelöst von der \ac{API}, können weiterverwendet werden getrennt und weiterentwickelt werden) - Controller liegen im Controller-Namespace - Sinnvolle Trennung von Endpunkten in Controller mit http-Signatur - Routennamen der Endpunkte in natürlicher Sprache/Pfaden \ No newline at end of file diff --git a/documentation/latex/subsections/vorgehen.tex b/documentation/latex/subsections/vorgehen.tex deleted file mode 100644 index de189bd..0000000 --- a/documentation/latex/subsections/vorgehen.tex +++ /dev/null @@ -1,20 +0,0 @@ -\subsection{Vorgehen} \label{subsec:Vorgehen} -Um nun ein solches Werkzeug zur Verfügung zu stellen muss zuerst eine Anforderungsanalyse durchgeführt werden. -\begin{itemize} - \item Transparenz schaffen - \item Entscheidungsfindung unterstützen - \item Sicherheitsrisiken minimieren -\end{itemize} -Diese Ziele sollen folgenden Nutzern bei der Entscheidungsfindung über Abhängigkeiten zu nutzen sein: -\begin{itemize} - \item Softwareentwickler - \item Projekt-Owner bzw. Teamleiter -\end{itemize} -Folgende Funktionalitäten sollen durch dieses Werkzeug umgesetzt werden: -Dazu sind folgende Ziele des Werkzeugs festgesetzt: -\begin{itemize} - \item Information über Sicherheitslücken eines Pakets und dessen Abhängigkeiten. - \item Information über Sicherheitslücken einer Liste von Paketen und dessen Abhängigkeiten. - \item Analyse eines Git-Projekts mit dessen Abhängigkeiten auf Sicherheitslücken. - \item Bereitstellung der Sicherheitslücken als weiter nutzbares Datenformat. -\end{itemize} \ No newline at end of file diff --git a/documentation/latex/subsubsections/controller.tex b/documentation/latex/subsubsections/controller.tex deleted file mode 100644 index f6f9abd..0000000 --- a/documentation/latex/subsubsections/controller.tex +++ /dev/null @@ -1,3 +0,0 @@ -\subsubsection{Controller} \label{subsubsec:Controller} - Auflistung und Erklärung (Swagger screenshot) in Paragraphs - Views (JSON-LD def von \ac{CVE}-Result, JSON-LD von NodePackageResult) \ No newline at end of file diff --git a/documentation/latex/subsubsections/db_anbindung.tex b/documentation/latex/subsubsections/db_anbindung.tex deleted file mode 100644 index dba3eaf..0000000 --- a/documentation/latex/subsubsections/db_anbindung.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsubsection{DB-Anbindung} \label{subsubsec:DB-Anbindung} -DB-Anbindung: LiteDB braucht DB-Controller \ No newline at end of file diff --git a/documentation/latex/subsubsections/dependa_bot.tex b/documentation/latex/subsubsections/dependa_bot.tex deleted file mode 100644 index f374bd7..0000000 --- a/documentation/latex/subsubsections/dependa_bot.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsubsection{DEPENDA-BOT} \label{subsubsec:DEPENDA_BOT} - DEPENDA-BOT (GITHUB) \ No newline at end of file diff --git a/documentation/latex/subsubsections/modells.tex b/documentation/latex/subsubsections/modells.tex deleted file mode 100644 index a034ff3..0000000 --- a/documentation/latex/subsubsections/modells.tex +++ /dev/null @@ -1,3 +0,0 @@ -\subsubsection{Modells} \label{subsubsec:Modells} -PUML (Klassen) -Interaktion und Zusammenhang der Klassen/Fktn \ No newline at end of file diff --git a/documentation/latex/subsubsections/nist.tex b/documentation/latex/subsubsections/nist.tex deleted file mode 100644 index 4aa2663..0000000 --- a/documentation/latex/subsubsections/nist.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsubsection{\ac{NIST}-\ac{API}} \label{subsubsec:NIST_API} - \ac{NIST}-\ac{API} \ No newline at end of file diff --git a/documentation/latex/subsubsections/subsubsec1.tex b/documentation/latex/subsubsections/subsubsec1.tex deleted file mode 100644 index e5119d1..0000000 --- a/documentation/latex/subsubsections/subsubsec1.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsubsection{Test-Subsubsection 1} \label{subsubsec:testSubsubsection1} - Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? \ No newline at end of file diff --git a/documentation/latex/subsubsections/weitere.tex b/documentation/latex/subsubsections/weitere.tex deleted file mode 100644 index 6c4e6ab..0000000 --- a/documentation/latex/subsubsections/weitere.tex +++ /dev/null @@ -1,2 +0,0 @@ -\subsubsection{Weitere} \label{subsubsec:Weitere} - Weitere \ No newline at end of file From 8b5262bdc12978bc4df5dae4701e6e295f0a8a47 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Fri, 19 Apr 2024 12:52:13 +0200 Subject: [PATCH 36/60] implementation v2 start --- .../latex/2_motivation/motivation.tex | 4 +- documentation/latex/4_other_work/dependa.tex | 18 +++---- documentation/latex/4_other_work/nist.tex | 6 +-- documentation/latex/4_other_work/owasp.tex | 8 +-- documentation/latex/4_other_work/snyk.tex | 4 +- .../latex/5_concept/architecture_1.tex | 20 +++---- .../latex/5_concept/architecture_2.tex | 2 +- documentation/latex/5_concept/concept.tex | 2 +- documentation/latex/5_concept/func.tex | 18 +++---- documentation/latex/5_concept/non_func.tex | 14 ++--- documentation/latex/5_concept/questions.tex | 44 ++++++++------- .../latex/5_concept/special_attr.tex | 6 +-- .../6_implementation/implementation_1.tex | 8 +-- .../6_implementation/implementation_2.tex | 54 +++++++++++++++++-- 14 files changed, 127 insertions(+), 81 deletions(-) diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index ab8b2bb..f436746 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -4,12 +4,12 @@ \section{Motivation} \label{subsec:Motivation} Die Nutzung frei verfügbarer Softwarepakete ist deshalb im Arbeitsalltag gang und gäbe. Freiwillige oder Hobby-Programmierer ermöglichen mit ihrem Einsatz, dass weltweit die Entwicklung neuer Software sowohl im kommerziellen als auch privaten und öffentlichen Bereich vereinfacht, vereinheitlicht und beschleunigt wird. Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der Pakete (a) an Bedeutung verlieren lässt bzw. (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. - \\ \\ + Neben der Funktionalität besteht ein anderer essentieller Aspekt in der Sicherheit. Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv -- schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. - \\ \\ + Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken ganzer Projekte bietet. Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index fdfd390..2c45e93 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,10 +1,10 @@ \subsubsection{Github Dependa Bot} \label{sec:Dependa} -Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. -Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. -\\ \\ -Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. -Dabei wird zwischen Versions- und Sicherheitsaktualisierungen von Abhängigkeiten unterschieden. -Versionsaktualisierungen halten Abhängigkeiten up-to-date während Sicherheitsaktualisierungen betroffene Abhängigkeiten auf eine Version heben, welche die Schwachstellen nicht mehr aufweisen. -Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projkten oder \textit{requirements.txt} in Python-Projekten vorgenommen. -\\ \\ -Dadurch trägt der Dependa-Bot zur Wartbarkeit und Sicherheit eines Projektes bei und nimmt Entwicklern ab, Abhängigkeiten vollständig selbst verwalten zu müssen. \ No newline at end of file + Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. + Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. + + Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. + Dabei wird zwischen Versions- und Sicherheitsaktualisierungen von Abhängigkeiten unterschieden. + Versionsaktualisierungen halten Abhängigkeiten up-to-date während Sicherheitsaktualisierungen betroffene Abhängigkeiten auf eine Version heben, welche die Schwachstellen nicht mehr aufweisen. + Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projkten oder \textit{requirements.txt} in Python-Projekten vorgenommen. + + Dadurch trägt der Dependa-Bot zur Wartbarkeit und Sicherheit eines Projektes bei und nimmt Entwicklern ab, Abhängigkeiten vollständig selbst verwalten zu müssen. \ No newline at end of file diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index 3be0adc..c78cadb 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,16 +1,16 @@ \subsubsection{NIST-API} \label{sec:NIST-API} Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an. Diese sind die \ac{CVE}-\ac{API} und die \ac{CVE}-Change-History-\ac{API}. -\\ \\ + Die \textbf{\ac{CVE}-\ac{API}} nimmt Anfragen zu einer oder mehreren<-?????? \ac{CVE}-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. Um nun aktuelle \ac{CVE}-Daten abzurufen und zu Nutzen muss lediglich diese \ac{API} in eigene Anwendungen oder Tools zu integriert werden. Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte \ac{CVE}'s zu reagieren. Durch das Vorhandensein von mehr als 240.000<-?????? Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. -\\ \\ + Die \textbf{\ac{CVE}-Change-History-\ac{API}} bietet einen historischen Überblick über Änderungen an \ac{CVE}-Einträgen. Durch diese können Änderungsverläufe und Aktualisierungen von \ac{CVE}'s besser nachvollzogen werden. Aus den dadurch bereitgestellten Daten können Muster oder Trends bei Sicherheitsvorfällen identifiziert werden und entsprechende Vorkerungen seitens der Entwickler getroffen werden. -\\ \\ + Durch eine Nutzung dieser \ac{NIST}-\ac{API}s können Entwickler und Sicherheitspersonal auf aktuelle \ac{CVE}-Daten zugreifen. Die Sicherheit ihrer Softwarelösungen kann verbessert und potenzielle Risiken minimiert werden. Im Vergleich zu anderen noch vorzustellenden Lösungen muss hier eine Applikation angebunden werden, die die Daten grafisch aufbereitet, da diese nur in einem JSON-Format zurückgegeben werden. diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index 6b9bda5..1cd3ba0 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,5 +1,5 @@ \subsubsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} -Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. -Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger \ac{CVE}-Nummer erstellt. -\\ \\ -Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file + Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. + Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger \ac{CVE}-Nummer erstellt. + + Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index 93f01e5..6477353 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -1,11 +1,11 @@ \subsubsection{Snyk} \label{sec:Snyk} Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. -\\ \\ + Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. \glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. \glqq Synk Container\grqq~erkennt Schwachstellen in Container-Images sowie Kubernetesanwendungen. \glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. -\\ \\ + Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesammten Deployment-Kette auf Schwachstellen geachtet. Lösungen bzw. Alternativen werden angeboten und zusätztlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index 6ac209b..4b20a9e 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -1,5 +1,5 @@ -\subsubsection{Architektur V1} \label{sec:Architektur} - Für die Beantwortung der Forschungsfragen \ref{q:one}, \ref{q:two}, \ref{q:five} und vor allem \ref{q:four} verschiedene Komponenten nötig: +\subsubsection{Architektur V1} \label{sec:ArchitekturV1} + Für die Umsetzung der Anforderungen sind verschiedene Komponenten in der Umsetzung der \ac{API} nötig: \begin{enumerate} \item \textbf{Framework} \label{arch_1}\\ Um eine \ac{API} zu entwickeln, muss ein passendes Framework genutzt werden. @@ -11,25 +11,25 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Durch die große und aktive Community von ASP.NET ist dieses Framework sehr gut dokumentiert und es existieren viele Open-Source-Bibliotheken. \item \textbf{Datenbank} \label{arch_2}\\ In der Datenbank sind alle \ac{CVE}-Daten zu persistieren, welche zu durchsuchen sind. - Diese Daten dienen als Grundlage der Identifizierung von Schachstellen in Paketen innerhalb von Projekten. + Diese Daten dienen als Grundlage der Identifizierung von Schwachstellen in Paketen innerhalb von Projekten. Wichtig sind hier schnelle Lesezugriffe, da diese beim Abfragen der Datenbank die größte Laufzeiteinsparung bringen. - \\ \\ + Durch die Wahl des Frameworks auf ASP.NET ist es möglich einen \textit{embedded NoSQL-Document-Store} -- LiteDB zu nutzen. % TODO: https://www.litedb.org/ Diese ist leicht intern nutzbar und muss als \textit{file-based DB} nicht separat explizit gestartet und verwaltet werden, womit diese auch im Container der \ac{API} mit enthalten ist. \item \textbf{Controller} \label{arch_3}\\ Controller einer \ac{API} nehmen HTTP-Anfragen entgegen und reagieren darauf. Hier wird die Hauptaufgabe der \ac{API} geschehen, da alle Funktionalitäten, sei es Datenbankabfragen, Klonen eines zu untersuchenden Repositories oder die Untersuchung dieses, in einem solchen implementiert oder aufgerufen werden müssen. - \\ \\ + Notwendig sind hier vier Controller. - (1) Für die Forschungsfrage \ref{q:two} bzw. \ref{q:four} muss ein Git-Controller zum nutzen von \ac{CVE}-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. + (\hyperref[api_controller:one]{1}) Es muss ein Git-Controller zum nutzen von \ac{CVE}-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. In diesem sind Endpunkte zum clonen des \ac{CVE}-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK \\ - Weiterhin ist (2) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. + Weiterhin ist (\hyperref[api_controller:two]{1}) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. \\ - Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer (3) Endpunkt zu implementieren. + Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer (\hyperref[api_controller:three]{3}) Endpunkt zu implementieren. In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. \\ - Für Forschungsfrage \ref{q:three} muss in jedem Endpunkt (4) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. + Weiterhin muss in jedem Endpunkt (\hyperref[api_controller:four]{4}) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. Ebenfalls sind durch einen Controller die Rückgabedaten zu dokumentieren. Dazu ist zwischen Softwarepaketen und \ac{CVE}-Einträgen zu unterscheiden. \item \textbf{Datenmodelle} \label{arch_4}\\ @@ -42,7 +42,7 @@ \subsubsection{Architektur V1} \label{sec:Architektur} Damit die Daten besser weiterverwendbar sind muss zusätzlich ein Kontext \glqq @context\grqq~hinzugefügt werden. \item \textbf{Container} \\ Um die \ac{API} unabhängig von der Umgebung und möglichst speicheraufwandsschmal zu nutzen muss die Anwendung \glqq Containerisiert\grqq~werden. - \\ \\ + Für den Bau der Containers wird Docker-Compose genutzt. \end{enumerate} Weiterhin muss das JSON-LD-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex index 15b5b7c..982e314 100644 --- a/documentation/latex/5_concept/architecture_2.tex +++ b/documentation/latex/5_concept/architecture_2.tex @@ -1,4 +1,4 @@ -\subsubsection{Architektur V2} \label{sec:Architektur} +\subsubsection{Architektur V2} \label{sec:ArchitekturV2} Aus den Ergebnissen der Experimente, aus Kapitel \ref{sec:ExperimenteDB} und \ref{sec:MySQL_Indexierung}, werden folgende Anpassungen an der Achitektur vorgenommen: \begin{enumerate} \item \textbf{Datenbank} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 666724c..343d0df 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -3,9 +3,9 @@ \section{Konzept} \label{sec:Konzept} Dabei sollen einzelne Pakete, Listen von Paketen und ganze Projekte selbst analysiert werden können. Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. + \input{5_concept/questions.tex} \input{5_concept/func.tex} \input{5_concept/non_func.tex} - \input{5_concept/questions.tex} \input{5_concept/special_attr.tex} \input{5_concept/results.tex} \input{5_concept/architecture.tex} \ No newline at end of file diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index 5a43ef0..d760e23 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -1,12 +1,12 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} - Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} sind verschidene funktionale Anforderungen zu implementieren. - \begin{enumerate} - \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank \label{f:one} - \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} - \item Clonen eines Repositories von Github. \label{f:three} - \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} - \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken \label{f:five} - \item Aktualisierung der Schwachstellendatenbasis \label{f:six} - \item Bereitstellung der \ac{API} in einem Container \label{f:seven} + Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} ergeben sich nun verschidene funktionale Anforderungen aus den Forschungsfragen: + \begin{enumerate}[label=\textbf{FRQ-\Roman*}, leftmargin=1cm] + \item (\ref{q:one}, \ref{q:two}) Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank \label{f:one} + \item (\ref{q:one}) Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} + \item (\ref{q:two}) Clonen eines Repositories von Github. \label{f:three} + \item (\ref{q:two}) Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} + \item (\ref{q:two}) Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken \label{f:five} + \item (\ref{q:five}) Aktualisierung der Schwachstellendatenbasis \label{f:six} + \item (\ref{q:four}) Bereitstellung der \ac{API} in einem Container \label{f:seven} \end{enumerate} Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der \ac{API}. diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index 6ed10b9..f5a202b 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,9 +1,9 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} - Bei der Umsetzung dieser \ac{API} sind verschidene nichtunktionale Anforderungen umzusetzen. - \begin{enumerate} - \item Performance der Anwendung \label{nf:one} - \item Skalierbarkeit der Anwendung \label{nf:two} - \item Dokumentation der Endpunkte \label{nf:three} - \item Rückgabe der Daten im JSON-LD-Format \label{nf:four} - \item Nutzung passender, etablierter Technologien \label{nf:five} + Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: + \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=1cm] + \item (\ref{q:five}) Die Suche eines einzelnen Pakets dauert nicht länger als 50ms \label{nf:one} + \item (\ref{q:five}) Skalierbarkeit der Anwendung \label{nf:two} + \item (\ref{q:five}) Dokumentation der Endpunkte \label{nf:three} + \item (\ref{q:three}) Rückgabe der Daten im \acs{JSON-LD}-Format \label{nf:four} + \item (\ref{q:four}) Nutzung passender, etablierter Technologien \label{nf:five} \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index 755753d..e8722b0 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -1,29 +1,27 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} - Aus den funktionalen und nichtfunktionalen Anforderungen ergeben sich folgende Forschungsfragen für diese Arbeit: - \\ \\ - Forschungsfrage \ref{q:one}, welche aus den funktionalen Anforderungen \ref{f:one} und \ref{f:two} hervorkommt, betrachtet die Analyse von einzelnen oder Listen von Abhängigkeiten auf Basis der eingeladenen Schwachstellendaten. + Folgende Forschungsfragen (FF) werden in dieser Arbeit thematisiert: + + \ref{q:one}: + Hier muss eine Betrachtung der notwendigen Funktionalitäten zur Analyse von einzelnen oder Listen von Abhängigkeiten auf Basis der eingeladenen Schwachstellendaten stattfinden. Je nachdem, ob eine Menge an Abhängigkeiten oder eine Einzelne gesucht werden muss müssen hier verschiedene Algorithmen implementiert werden um eine effiziente Ergebnisfindung zu gestalten. - \\ \\ - Forschungsfrage \ref{q:two} handelt von den zu implementierenden Funktionalitäten für Repositories und geschieht aufbauen auf Forschungsfrage \ref{q:one}. - Deshalb sind die folgenden funktionalen Anforderungen \ref{f:one}, \ref{f:three}, \ref{f:four} und \ref{f:five} zu betrachten. + + \ref{q:two}: + Hier handelt es sich um die zu implementierenden Funktionalitäten für Repositories und geschieht aufbauend auf der Forschungsfrage \ref{q:one}. Dazu muss zuerst betrachtet werden, welche Ausgangsdaten vorliegen. - Zusätzlich auch die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. - \\ \\ - Forschungsfrage \ref{q:three} definiert den Rückgabetyp der Daten. - Vor allem die nichtfunktionale Anforderung \ref{nf:four}, der Rückgabe im JSON-LD-Format, ist Ausschlaggebend. - Hier müssen demnach sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. - \\ \\ - Forschungsfrage \ref{q:four} behandelt die Umsetung der \ac{API} selbst. - Es ist die Umsetzung der Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. - Vor allem nichtfunktionale Anforderung \ref{nf:five}, die Nutzung von Etablierten Technologien, hat hier ihren Schwerpunkt. + Dazu gehören die zu analysierenden Repositories bzw. Abhängigkeiten und die genutzten Schwachstellendaten. + + \ref{q:three}: + Hier wird der Rückgabetyp der Daten definiert. + Es müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. + + \ref{q:four}: + Diese Forschungsfrage behandelt die Umsetung der \ac{API} selbst. + Es ist die Umsetzung der zu definierenden Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das End\-punkt\-doku\-mentations- und Test\-möglich\-keits\-tool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. - Der entstandene Service muss, wie durch funktionale Anforderung \ref{f:seven} bestimmt, weiterhin im Container-Kontext nutzbar sein. - \\ \\ - Forschungsfrage \ref{q:five} beschäftigt sich mit der Optimierung der \ac{API}. - Funktionale Anforderung \ref{f:six} und nichtfunktionale Anforderungen \ref{nf:one}, \ref{nf:two} und teils auch \ref{nf:three} sind hier zugehörig. - Hier müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt und mögliche Lösungswege aufgezeigt oder implementiert werden. - Besonders gewählte Datenbankformate werden hier thematisiert. + Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. - - \ No newline at end of file + \ref{q:five}: + Hier wird die Optimierung der \ac{API} betrachtet. + Es müssen algorithmische sowie technologische Verbesserungen in Leistung oder Laufzeit aufgezeigt sowie deren mögliche Lösungswege implementiert oder betrachtet werden. + Ein besonders Augenmerk liegt hier auf die gewählten Datenbankformate. diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index 0cf2669..40f0766 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -1,12 +1,12 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} Dadurch, dass diese \ac{API} bei schwachstellenbefallenen Abhängigkeiten den Abhängigkeitsbaum darstellt, ist für den Nutzer eine hohe Granularität und Transparenz der Abhängigkeit gegeben. Somit können Aufwand, bezüglich Ersatzes oder Anpassungen bei Abhängigkeiten, besser eingeschätzt werden und die Entscheidung, hier bezüglich der Dringlichkeit dieses Schrittes des Ersatzes, zutreffender fallen. - \\ \\ + Durch die Menge der als Schwachstellen-Suchbasis dienenden \ac{CVE}-Daten und deren stetige Erweiterung und Aktualisierung ist es der \ac{API} zu ermöglichen, immer nur die aktuellsten Änderungen herunterzuladen und einzupflegen. Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis erneut herunterzuladen. - \\ \\ + Durch die lokal vorliegende Datenbasis ist das Suchen deutlich schneller als diese Daten immer erneut extern anzufragen. Somit kann mit einer niedrigeren Laufzeit in z.B. CI/CD Intergrationen dieser gerechnet werden als andere Tools. - \\ \\ + Die Abfrage einzelner Pakete ist ebenfalls unterstützt. Demnach ist die punktuelle Analyse einzelner Pakete möglich, was den Einsatzrahmen für die Endnutzer erweitert. diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index 2da33f5..fd0d49b 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -33,7 +33,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: \begin{itemize} - \item DbController \\ + \item DbController \label{api_controller:three}\\ Dieser Controller dient der Befüllung der Datenbank mit \ac{CVE}-Daten sowie der Nutzung dieser für kleinere Analysen. Dies sind z.B. einzelne Pakete oder Listen von Paketen. \begin{itemize} \item CheckRawDir-Endpunkt \\ @@ -63,7 +63,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} \textbf{No Content} bei nicht Vorhandensein ohne weitere Rückgabe \end{itemize} - \item DependeciesController \\ + \item DependeciesController \label{api_controller:two} \\ Dieser Controller dient der Extraktion des Abhängigkeitsbaumes von Repositories und der Analyse dieser. Dabei bedeutet Analyse eine Untersuchung auf \ac{CVE}-Daten für jegliche im Repository enthaltene Pakete. \begin{itemize} @@ -84,7 +84,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} \textbf{Bad Request} bei nicht Vorhandensein des angegebenen Projekttyps \end{itemize} - \item GitController \\ + \item GitController \label{api_controller:one} \\ Da die \ac{CVE}-Daten sowie die zu untersuchenden Repositories ihre Datenbasis in GitHub\cite{GITHUB} haben, werden diese durch diesen Controller gecloned. \begin{itemize} \item Clone-Endpunkt \\ @@ -99,7 +99,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} % \item MySqlConnectionController \\ %! V2 % Dieser Controller hat die Aufgabe die Erreichbarkeit der Datenbank zu überprüfen. %! V2 - \item ViewController \\ + \item ViewController \label{api_controller:four}\\ In diesem Controller werden als HTML alle \ac{JSON-LD} Beschreibungen -- siehe $@context$ -- zurückgegeben. \begin{itemize} \item json-ld-Endpunkt \\ diff --git a/documentation/latex/6_implementation/implementation_2.tex b/documentation/latex/6_implementation/implementation_2.tex index 4f40ca5..bc19867 100644 --- a/documentation/latex/6_implementation/implementation_2.tex +++ b/documentation/latex/6_implementation/implementation_2.tex @@ -1,6 +1,54 @@ \subsection{Implementation V2} \label{sec:Implementation2} - Implementation V2 (MySQL) + Folgende Komponenten wurden für die zweite Implementation der \ac{API} genutzt: \begin{itemize} - \item Was hat sich geändert -- nur code, Endpunkte identisch, oder die 3 oberen entfernt - \item neuer Container für die DB + \item Framework ASP.NET (C\#) + \item Datenbank MySQL + \item Docker-Compose zur Container-Orchestration \end{itemize} + + Weiterhin gab es eine anpassung am Containernetzwerk, die MySQL Datenbank hat nun ihren eigenen Container, da diese nicht in ASP.NET eingebettet ist. + Außerdem sind folgende Anpassungen an den Controllern vorgenommen worden: + \begin{itemize} + \item DbController \label{api_controller:three}\\ + \begin{itemize} + \item CheckRawDir-Endpunkt entfällt siehe GitControlller api/Git/PullCveAndConvert Endpunkt \\ + \item ConvertRawDirToDb-Endpunkt entfällt \\ + \item Update-Endpunkt hinzugefügt \\ + Mit diesem Endpunkt werden die lokalen CVE-Daten aktualisiert ohne den gesamten Datensatz erneut zu laden. + \\ + \textbf{OK} bei einem Update mit Rückgabe der Anzahl aktualisierter und eingefügter CVE-Einträge + \\ + \textbf{Bad Request} bei einem Aufgetretenen Fehler + \item GetFullTextFromCveNumber-Endpunkt hinzugefügt \\ + Durch diesen Endpunkt erhäklt man bei Übergabe einer CVE-Nummer alle vorliegende Daten zu dieser. + \\ + \textbf{OK} bei Fund der CVE-Nummer mit den vorliegenden Daten im Antwort-Body. + \\ + \textbf{No Content} bei keinem Eintrag zur angegebenen CVE-Nummer. + \\ + \textbf{Bad Request} bei fehlerfahter übergebener Query. + \item CheckGuid-Endpunkt hinzugefügt \\ + Hier kann man durch angabe einer Guid das lokale Vorhandensein eines vorher heruntergeladenen Repositories überprüfen. + \\ + \textbf{OK} falls das Repository mit der passenden Guid vorhanden ist mit dem gesamten DB-Datensatz dieses Repositories. + \\ + \textbf{Not Found} falls das Repository nicht lokal vorliegt. + \end{itemize} + + \item GitController \label{api_controller:one} \\ + \begin{itemize} + \item Clone --> CloneRepo hinzugefügt + \item PullCveAndConvert (die aus dem ersten Controller sind jetzt hier) hinzugefügt + \end{itemize} + \item MySqlConnectionController \label{api_controller_2:five} + \begin{itemize} + \item CheckReachable-Endpunkt hinzugefügt + \end{itemize} + \item ViewController \label{api_controller:four}\\ + \begin{itemize} + \item Json-Ld-Endpunkt entfällt + \item CveResult-Endpunkt hinzugefügt + \item NodePackageResult-Endpunkt hinzugefügt + \end{itemize} + + \end{itemize} \ No newline at end of file From 7fa2fbec6d31bf631eb6749506ee56b19184c924 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 22 Apr 2024 15:23:35 +0200 Subject: [PATCH 37/60] Validation V1 (?) --- .../latex/2_motivation/motivation.tex | 4 +- .../latex/5_concept/architecture.tex | 2 +- documentation/latex/5_concept/func.tex | 18 +-- documentation/latex/5_concept/non_func.tex | 12 +- .../latex/6_implementation/implementation.tex | 5 +- .../latex/6_implementation/validation_1.tex | 55 ++++++++ .../{verification_2.tex => validation_2.tex} | 4 +- .../latex/6_implementation/verification_1.tex | 8 -- documentation/latex/Appendix/litedbInsert.tex | 21 +++ documentation/latex/main.bbl | 126 ------------------ documentation/latex/main.ptc | 48 ------- documentation/latex/main.tex | 1 + 12 files changed, 99 insertions(+), 205 deletions(-) create mode 100644 documentation/latex/6_implementation/validation_1.tex rename documentation/latex/6_implementation/{verification_2.tex => validation_2.tex} (75%) delete mode 100644 documentation/latex/6_implementation/verification_1.tex create mode 100644 documentation/latex/Appendix/litedbInsert.tex delete mode 100644 documentation/latex/main.bbl delete mode 100644 documentation/latex/main.ptc diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index f436746..11d610f 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -14,11 +14,11 @@ \section{Motivation} \label{subsec:Motivation} Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. Hieraus ergiben sich folgende Forschungsfragen (FF): - \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1cm] + \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1.75cm] \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?} \label{q:one} \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{q:two} \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{q:three} - \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängigkeiten von Repositories zu implementieren?} \label{q:four} + \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängig\-keiten von Repositories zu implementieren?} \label{q:four} \item \textbf{Wie kann ein solches Tool leistungsstärker und laufzeiteffizienter werden?} \label{q:five} \end{enumerate} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index a5abbb9..e1236b3 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -2,5 +2,5 @@ \subsection{Architektur} \label{sec:Architektur} \input{5_concept/architecture_1.tex} \input{5_concept/architecture_2.tex} \textcolor{red}{ - 5. bleibt Architektur, 6. \ac{API} (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Verifikation V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Verifikation V2 (Unterschiede zu V1 betrachten und) + 5. bleibt Architektur, 6. \ac{API} (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Validierung V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Validierung V2 (Unterschiede zu V1 betrachten und) } diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index d760e23..0bbe68e 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -1,12 +1,12 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} - Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} ergeben sich nun verschidene funktionale Anforderungen aus den Forschungsfragen: - \begin{enumerate}[label=\textbf{FRQ-\Roman*}, leftmargin=1cm] - \item (\ref{q:one}, \ref{q:two}) Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank \label{f:one} - \item (\ref{q:one}) Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank \label{f:two} - \item (\ref{q:two}) Clonen eines Repositories von Github. \label{f:three} - \item (\ref{q:two}) Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank \label{f:four} - \item (\ref{q:two}) Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken \label{f:five} - \item (\ref{q:five}) Aktualisierung der Schwachstellendatenbasis \label{f:six} - \item (\ref{q:four}) Bereitstellung der \ac{API} in einem Container \label{f:seven} + Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} ergeben sich nun verschiedene funktionale Anforderungen aus den Forschungsfragen: + \begin{enumerate}[label=\textbf{FRQ-\Roman*}, leftmargin=2.5cm] + \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank (betrifft \ref{q:one}, \ref{q:two})\label{f:one} + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank (betrifft \ref{q:one}) \label{f:two} + \item Clonen eines Repositories von Github. (betrifft \ref{q:two}) \label{f:three} + \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank (betrifft \ref{q:two}) \label{f:four} + \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken (betrifft \ref{q:two}) \label{f:five} + \item Aktualisierung der Schwachstellendaten-Basis (betrifft \ref{q:five}) \label{f:six} + \item Bereitstellung der \ac{API} in einem Container (betrifft \ref{q:four}) \label{f:seven} \end{enumerate} Diese Funktionalitäten setzten teils mehrere interne Abläufe voraus und beinhalten mehrere Endpunkte der \ac{API}. diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index f5a202b..892eee5 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,9 +1,9 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: - \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=1cm] - \item (\ref{q:five}) Die Suche eines einzelnen Pakets dauert nicht länger als 50ms \label{nf:one} - \item (\ref{q:five}) Skalierbarkeit der Anwendung \label{nf:two} - \item (\ref{q:five}) Dokumentation der Endpunkte \label{nf:three} - \item (\ref{q:three}) Rückgabe der Daten im \acs{JSON-LD}-Format \label{nf:four} - \item (\ref{q:four}) Nutzung passender, etablierter Technologien \label{nf:five} + \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=2.5cm] + \item Die Suche eines einzelnen Pakets dauert nicht länger als 50ms (betrifft \ref{q:five}) \label{nf:one} + \item Skalierbarkeit der Anwendung (betrifft \ref{q:five}) \label{nf:two} + \item Dokumentation der Endpunkte (betrifft \ref{q:five}) \label{nf:three} + \item Rückgabe der Daten im \acs{JSON-LD}-Format (betrifft \ref{q:three}) \label{nf:four} + \item Nutzung passender, etablierter Technologien (betrifft \ref{q:four}) \label{nf:five} \end{enumerate} \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index fa0fec2..ab15ece 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -1,7 +1,6 @@ \section{Implementation} \label{sec:Implementation} \input{6_implementation/implementation_1.tex} - \input{6_implementation/verification_1.tex} + \input{6_implementation/validation_1.tex} \input{6_implementation/experiments.tex} \input{6_implementation/implementation_2.tex} - \input{6_implementation/verification_2.tex} - + \input{6_implementation/validation_2.tex} diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex new file mode 100644 index 0000000..df8be55 --- /dev/null +++ b/documentation/latex/6_implementation/validation_1.tex @@ -0,0 +1,55 @@ +\subsection{Validierung V1} \label{sec:Vali1} + Unter \ref{sec:Funktionale_Anforderungen} \nameref{sec:Funktionale_Anforderungen} sind 7 funktionale Vorgaben aufgeführt. + \begin{description} + \item[(1) Persistente Speicherung nach Konvertierung der \ac{CVE}-Daten] siehe \hyperref[f:one]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Die beiden dazugehörigen Endpunkte, wo als erstes das Clonen in eine Ordner namens \textit{raw} erfolgt und beim Aufruf des zweiten Endpunktes die Konvertierung in die LiteDB-Datenbank stattfindet, waren unter den Dateien GitController.cs und DbController.cs zu finden. + \\ + Der zeitliche Aufwand ist im Appendix unter \ref{subsec:ZeitaufwandDerKonvertierungVonRaw-CVEZuLiteDb} einsehbar. + \item[(2) Abgleich von Paketen] siehe \hyperref[f:two]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Unter dem Abschnitt \ref{sec:ExperimentePIPE} \nameref{sec:ExperimentePIPE} kann man die dazu erfolgten Messungen einsehen. + \item[(3) Clonen eines Repositories von Github] siehe \hyperref[f:three]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Der Endpunkt für das Clonen eines beliebigen Github-Repo's war in der Datei GitController.cs einsehbar. + Über das Setzen einer boolschen Variable war es dort möglich, ein zu analysierendes Repo anzugeben. + Der entsprechend andere Fall bestand in der Downloadmöglichkeit der \ac{CVE}-Roh-Daten -- siehe hierzu den ersten Punkt der Validierung V1. + \item[(4) Aufstellen aller Abhängigkeiten des heruntergeladenen Repo's] siehe \hyperref[f:four]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Aufgrund der vorerst selbstauferlegten Beschränkung auf NodeJS-Projekte geschah die Umsetzung jener Anforderung über den npm native Befehl \texttt{npm list --all}. + \item[(5) Extrahieren und Rückgabe eines Abhängigkeitsbaums mit sicher\-heits\-lücken\-betroffenen Paketen] siehe \hyperref[f:five]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Über den Endpunkt ExtractTree des DependeciesControllers ist es möglich, diesen Abhängigkeitsbaums des Projektes zu erhalten. + Weiterführend ist über die ExtractAndAnalyzeTree-Route des selbigen Controllers die Analyse der Pakete und Rückgabe in einem um die Angabe der Betroffenheit erweiterten Baum möglich. + \textcolor{red}{Bild einfügen???} + \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ + Nur teils erfolgreich umgesetzt. + \\ + Die Möglichkeit des Updates der LiteDB-Datenbasis bestand darin erneut den Endpunkt des Konvertierens aufzurufen. + Somit erfolgte eine erneute Erstellung der Datenbankdateien, was somit keinem Update sondern eher einer Erneuerung entsprach. + \item[(7) Containerisierung der \ac{API}] siehe \hyperref[f:seven]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Mittels der docker-compose.yml und einem Dockerfile in dem Ordner der API ist die Containerisierung erfolgt. + Da die Anwendung an sich lediglich in dem Container laufen musste und die Datenbankdateien dort dann erstellt wurden, ist es bei einem einzelnen Container zu diesem Zeitpunkt geblieben. + \end{description} + + \subsubsection{Diskussion Laufzeit} \label{subsubsec:DiskussionLaufzeit} + Laufzeitrelevante Aspekte stellen die funktionalen Aufgaben (1), (2) und (5) da. + Die Messung und somit Begutachtung der Laufzeit der \ac{API} in der V1 kann in den Abschnitten unter Experimente (\ref{sec:Experimente}) der V1 eingesehen werden. + \\ + Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage mit über 2,5 Sekunden pro Paket als unbefriedigend eingestuft werden muss. \textcolor{yellow}{QUELLE} + Somit erfolgte die in Abschnitt \ref{sec:ExperimenteDB} \nameref{sec:ExperimenteDB} besprochene Neubetrachtung des Datenbankbereiches der Architektur. + + % Validierung V1, sind die Ausgaben den Vorgaben entsprechend (funktional) + % \begin{itemize} + % \item api/Db/checkSinglePackage + % \item api/Db/checkPackageList + % \item api/Dependecies/ExtractTree + % \item api/Dependecies/ExtractAndAnalyzeTree + % \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/verification_2.tex b/documentation/latex/6_implementation/validation_2.tex similarity index 75% rename from documentation/latex/6_implementation/verification_2.tex rename to documentation/latex/6_implementation/validation_2.tex index 3c4660f..c25018d 100644 --- a/documentation/latex/6_implementation/verification_2.tex +++ b/documentation/latex/6_implementation/validation_2.tex @@ -1,5 +1,5 @@ -\subsection{Verifikation V2} \label{sec:Ver2} - Verifikation V2 +\subsection{Validierung V2} \label{sec:Vali2} + Validierung V2 \begin{itemize} \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md diff --git a/documentation/latex/6_implementation/verification_1.tex b/documentation/latex/6_implementation/verification_1.tex deleted file mode 100644 index b7725ab..0000000 --- a/documentation/latex/6_implementation/verification_1.tex +++ /dev/null @@ -1,8 +0,0 @@ -\subsection{Verifikation V1} \label{sec:Ver1} - Verifikation V1, sind die Ausgaben den Vorgaben entsprechend (funktional) - \begin{itemize} - \item api/Db/checkSinglePackage - \item api/Db/checkPackageList - \item api/Dependecies/ExtractTree - \item api/Dependecies/ExtractAndAnalyzeTree - \end{itemize} \ No newline at end of file diff --git a/documentation/latex/Appendix/litedbInsert.tex b/documentation/latex/Appendix/litedbInsert.tex new file mode 100644 index 0000000..cf7d98c --- /dev/null +++ b/documentation/latex/Appendix/litedbInsert.tex @@ -0,0 +1,21 @@ +\subsection{Zeitaufwand der Konvertierung von raw-CVE zu LiteDb} \label{subsec:ZeitaufwandDerKonvertierungVonRaw-CVEZuLiteDb} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-01-23 10:45:45.426 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 3527225.2 ms (1. Start) \\ + 2024-01-23 11:53:15.037 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2955200.9 ms (1. Start) \\ + 2024-01-23 12:49:05.159 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2842891.2 ms (1. Start) \\ + 2024-01-23 13:36:43.036 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2753230.7 ms (1. Start) \\ + 2024-01-23 14:24:01.824 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2418296.2 ms (1. Start) \\ + 2024-01-23 15:41:27.854 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 3654741.8 ms (2. Start) \\ + 2024-01-23 18:27:49.178 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2902944.9 ms (3. Start) \\ + 2024-01-24 12:10:04.811 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 3866013.7 ms (4. Start) \\ + 2024-01-24 13:39:15.699 +01:00 & [INF] & Konvertieren der Datenbank completed in \\ & & 2803370.4 ms (5. Start) \\ + \hline + \end{tabularx} + } + } \ No newline at end of file diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl deleted file mode 100644 index 5a2ea3e..0000000 --- a/documentation/latex/main.bbl +++ /dev/null @@ -1,126 +0,0 @@ -% $ biblatex auxiliary file $ -% $ biblatex bbl format version 3.2 $ -% Do not modify the above lines! -% -% This is an auxiliary file used by the 'biblatex' package. -% This file may safely be deleted. It will be recreated by -% biber as required. -% -\begingroup -\makeatletter -\@ifundefined{ver@biblatex.sty} - {\@latex@error - {Missing 'biblatex' package} - {The bibliography requires the 'biblatex' package.} - \aftergroup\endinput} - {} -\endgroup - - -\refsection{0} - \datalist[entry]{none/global//global/global} - \entry{link:RedHatCveDef}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} - \field{labeltitlesource}{title} - \field{title}{Was bedeutet CVE?} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \verb{url} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \endentry - \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} - \field{labeltitlesource}{title} - \field{title}{CVE Numbering Authorities (CNAs)} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs - \endverb - \verb{url} - \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs - \endverb - \endentry - \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} - \field{labeltitlesource}{title} - \field{title}{Abhängigkeitsverwaltung} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \verb{url} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \endentry - \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} - \field{labeltitlesource}{title} - \field{title}{Was ist eine Dependency} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ - \endverb - \endentry - \entry{link:ApiDef}{online}{} - \field{sortinit}{8} - \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} - \field{labeltitlesource}{title} - \field{title}{What is an API (Application Programming Interface)?} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ - \endverb - \endentry - \entry{link:MySqlIndex}{online}{} - \field{sortinit}{9} - \field{sortinithash}{0a5ebc79d83c96b6579069544c73c7d4} - \field{labeltitlesource}{title} - \field{title}{10.3.1 How MySQL Uses Indexes} - \field{urlday}{18} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html - \endverb - \verb{url} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html - \endverb - \endentry - \enddatalist -\endrefsection -\endinput - diff --git a/documentation/latex/main.ptc b/documentation/latex/main.ptc deleted file mode 100644 index 2714a2c..0000000 --- a/documentation/latex/main.ptc +++ /dev/null @@ -1,48 +0,0 @@ -\babel@toc {ngerman}{}\relax -\contentsline {section}{Inhaltsverzeichnis}{1}{section*.1}% -\contentsline {section}{\numberline {1}Abstract}{3}{section.2}% -\contentsline {section}{\numberline {2}Motivation}{4}{section.4}% -\contentsline {section}{\numberline {3}Definitionen}{5}{section.10}% -\contentsline {section}{\numberline {4}Andere Arbeiten}{7}{section.14}% -\contentsline {subsection}{\numberline {4.1}Softwaretools}{7}{subsection.15}% -\contentsline {subsubsection}{\numberline {4.1.1}NIST-API}{7}{subsubsection.16}% -\contentsline {subsubsection}{\numberline {4.1.2}Github Dependa Bot}{7}{subsubsection.18}% -\contentsline {subsubsection}{\numberline {4.1.3}Snyk}{8}{subsubsection.19}% -\contentsline {subsubsection}{\numberline {4.1.4}OWASP Dependency-Check}{8}{subsubsection.20}% -\contentsline {subsection}{\numberline {4.2}Wissenschaftliche Arbeiten}{8}{subsection.21}% -\contentsline {subsubsection}{\numberline {4.2.1}ReposVul}{8}{subsubsection.22}% -\contentsline {subsubsection}{\numberline {4.2.2}Transitivity and Granularity on Vulnerability Propagation}{9}{subsubsection.23}% -\contentsline {subsubsection}{\numberline {4.2.3}Demystifying Vulnerability Propagation}{9}{subsubsection.24}% -\contentsline {section}{\numberline {5}Konzept}{10}{section.25}% -\contentsline {subsection}{\numberline {5.1}Funktionale Anforderungen}{10}{subsection.26}% -\contentsline {subsection}{\numberline {5.2}Nichtfunktionale Anforderungen}{10}{subsection.34}% -\contentsline {subsection}{\numberline {5.3}Forschungsfragen}{11}{subsection.40}% -\contentsline {subsection}{\numberline {5.4}Besondere Merkmale}{11}{subsection.41}% -\contentsline {subsection}{\numberline {5.5}Zielsetzung}{12}{subsection.42}% -\contentsline {subsection}{\numberline {5.6}Architektur}{12}{subsection.47}% -\contentsline {subsubsection}{\numberline {5.6.1}Architektur V1}{12}{subsubsection.48}% -\contentsline {subsubsection}{\numberline {5.6.2}Architektur V2}{14}{subsubsection.55}% -\contentsline {section}{\numberline {6}Implementation}{15}{section.59}% -\contentsline {subsection}{\numberline {6.1}Implementation V1}{15}{subsection.60}% -\contentsline {subsection}{\numberline {6.2}Verifikation V1}{17}{subsection.61}% -\contentsline {subsection}{\numberline {6.3}Experimente}{17}{subsection.62}% -\contentsline {subsubsection}{\numberline {6.3.1}LiteDB Pipeline}{17}{subsubsection.63}% -\contentsline {subsubsection}{\numberline {6.3.2}Datenbank}{24}{subsubsection.71}% -\contentsline {subsubsection}{\numberline {6.3.3}MySQL Indexierung}{24}{subsubsection.72}% -\contentsline {subsection}{\numberline {6.4}Implementation V2}{24}{subsection.74}% -\contentsline {subsection}{\numberline {6.5}Verifikation V2}{24}{subsection.75}% -\contentsline {section}{\numberline {7}Diskussion}{25}{section.76}% -\contentsline {section}{\numberline {8}Zusammenfassung}{26}{section.77}% -\contentsline {section}{Appendix}{27}{section*.78}% -\contentsline {section}{\numberline {A}Abkürzungen}{27}{appendix.79}% -\contentsline {section}{\numberline {B}Messungen}{28}{appendix.80}% -\ttl@starttoc {Messungen@1} -\contentsline {subsection}{\numberline {B.1}Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: weniger Pakete als Datenbanken}{28}{subsection.81}% -\contentsline {subsection}{\numberline {B.2}Zeitunterschied Abfrage auf den Datenbanken Mono-Pipe -- Fall: mehr Pakete als Datenbanken}{31}{subsection.92}% -\contentsline {subsection}{\numberline {B.3}MySQL mit Index}{40}{subsection.103}% -\contentsline {subsection}{\numberline {B.4}MySQL ohne Index}{49}{subsection.114}% -\ttl@stoptoc {Messungen@1} -\contentsline {section}{Quellen}{59}{section*.125}% -\contentsline {section}{Abbildungen}{60}{section*.126}% -\contentsline {section}{Tabellen}{61}{section*.127}% -\contentsfinish diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 01fb9e3..6227d37 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -191,6 +191,7 @@ \section{Messungen} \label{sec:Messungen} \startcontents[Messungen] \printcontents[Messungen]{}{2}{} % \printcontents[⟨name⟩]{⟨prefix⟩}{⟨start-level⟩}[⟨toc-depth⟩]{⟨toc-code⟩} + \input{Appendix/litedbInsert.tex} \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} From 95c0278a2f9af56bffb710765e69e3a3f6de964e Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Tue, 23 Apr 2024 10:46:51 +0200 Subject: [PATCH 38/60] Proposal for non-functional requirement --- .../latex/6_implementation/validation_1.tex | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index df8be55..064b941 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -1,5 +1,6 @@ \subsection{Validierung V1} \label{sec:Vali1} - Unter \ref{sec:Funktionale_Anforderungen} \nameref{sec:Funktionale_Anforderungen} sind 7 funktionale Vorgaben aufgeführt. + Unter \ref{sec:Funktionale_Anforderungen} \nameref{sec:Funktionale_Anforderungen} sind 7 \texttt{funktionale} Vorgaben aufgeführt. + \begin{description} \item[(1) Persistente Speicherung nach Konvertierung der \ac{CVE}-Daten] siehe \hyperref[f:one]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. @@ -39,12 +40,30 @@ \subsection{Validierung V1} \label{sec:Vali1} Da die Anwendung an sich lediglich in dem Container laufen musste und die Datenbankdateien dort dann erstellt wurden, ist es bei einem einzelnen Container zu diesem Zeitpunkt geblieben. \end{description} - \subsubsection{Diskussion Laufzeit} \label{subsubsec:DiskussionLaufzeit} - Laufzeitrelevante Aspekte stellen die funktionalen Aufgaben (1), (2) und (5) da. - Die Messung und somit Begutachtung der Laufzeit der \ac{API} in der V1 kann in den Abschnitten unter Experimente (\ref{sec:Experimente}) der V1 eingesehen werden. - \\ - Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage mit über 2,5 Sekunden pro Paket als unbefriedigend eingestuft werden muss. \textcolor{yellow}{QUELLE} - Somit erfolgte die in Abschnitt \ref{sec:ExperimenteDB} \nameref{sec:ExperimenteDB} besprochene Neubetrachtung des Datenbankbereiches der Architektur. + \noindent Unter \ref{sec:N_Anforderungen} \nameref{sec:N_Anforderungen} sind dagegen 5 \texttt{nicht-funktionale} Anforderungen aufgeführt. + + \begin{description} + \item[(1) Dauer der Paketsuche (einzelne Abfrage) unter 50ms] siehe \hyperref[nf:one]{\underline{hier}} \hfill \\ + Nicht erreicht. + \\ + Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} einsehbar, beträgt die Dauer einer einzelnen Paketabfrage nicht unter 2 Sekunden. + Somit ist dieses Ziel um mind. Größenordnung 40 verfehlt. + \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ + \textcolor{red}{Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque?} + \item[(3) Dokumentation der Endpunkte] siehe \hyperref[nf:three]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Mittels der vom ASP.NET in der Projektkonfiguration mitgelieferten automatischen Erstellung einer OpenAPI-Unterstützung, wird eine Swagger-Dokumentation beim \textit{build} erstellt und kann unter dem Routensuffix \textit{[...]/swagger/index.html} eingesehen werden. + \item[(4) Rückgabe im \acs{JSON-LD}-Format] siehe \hyperref[nf:four]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \item[(5) Nutzung etablierter Technologien] siehe \hyperref[nf:five]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Sowohl die \ac{API} mit ASP.NET, die Containierisierung mit Docker, als auch die Datenbank mit LiteDB sind mit etablierten Technologien umgesetzt worden. + \end{description} + + \noindent Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage mit über 2,5 Sekunden pro Paket als unbefriedigend eingestuft werden muss. \textcolor{yellow}{QUELLE} + Somit erfolgte die in Abschnitt \ref{sec:ExperimenteDB} \nameref{sec:ExperimenteDB} besprochene Neubetrachtung des Datenbankbereiches der Architektur. % Validierung V1, sind die Ausgaben den Vorgaben entsprechend (funktional) % \begin{itemize} From 534d312ebfe249fe06d621734e304409e23a3ba8 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Tue, 23 Apr 2024 19:28:15 +0200 Subject: [PATCH 39/60] Proposal for non-functional requirement --- .../latex/6_implementation/validation_1.tex | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index 064b941..84850a5 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -5,17 +5,19 @@ \subsection{Validierung V1} \label{sec:Vali1} \item[(1) Persistente Speicherung nach Konvertierung der \ac{CVE}-Daten] siehe \hyperref[f:one]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Die beiden dazugehörigen Endpunkte, wo als erstes das Clonen in eine Ordner namens \textit{raw} erfolgt und beim Aufruf des zweiten Endpunktes die Konvertierung in die LiteDB-Datenbank stattfindet, waren unter den Dateien GitController.cs und DbController.cs zu finden. + Die beiden dazugehörigen Endpunkte, wo als erstes das Clonen in einen Ordner namens \textit{raw} erfolgt und beim Aufruf des zweiten Endpunktes die Konvertierung in die LiteDB-Datenbank stattfindet, waren unter den Dateien GitController.cs und DbController.cs zu finden. \\ Der zeitliche Aufwand ist im Appendix unter \ref{subsec:ZeitaufwandDerKonvertierungVonRaw-CVEZuLiteDb} einsehbar. \item[(2) Abgleich von Paketen] siehe \hyperref[f:two]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ Unter dem Abschnitt \ref{sec:ExperimentePIPE} \nameref{sec:ExperimentePIPE} kann man die dazu erfolgten Messungen einsehen. + \\ + \textcolor{red}{Messungen NIST -- Argumentation \glqq spam\grqq für Abwahl dieser Lösung} \item[(3) Clonen eines Repositories von Github] siehe \hyperref[f:three]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Der Endpunkt für das Clonen eines beliebigen Github-Repo's war in der Datei GitController.cs einsehbar. + Der Endpunkt für das Clonen eines beliebigen Github-Repo's ist in der Datei GitController.cs einsehbar. Über das Setzen einer boolschen Variable war es dort möglich, ein zu analysierendes Repo anzugeben. Der entsprechend andere Fall bestand in der Downloadmöglichkeit der \ac{CVE}-Roh-Daten -- siehe hierzu den ersten Punkt der Validierung V1. \item[(4) Aufstellen aller Abhängigkeiten des heruntergeladenen Repo's] siehe \hyperref[f:four]{\underline{hier}} \hfill \\ @@ -29,10 +31,10 @@ \subsection{Validierung V1} \label{sec:Vali1} Weiterführend ist über die ExtractAndAnalyzeTree-Route des selbigen Controllers die Analyse der Pakete und Rückgabe in einem um die Angabe der Betroffenheit erweiterten Baum möglich. \textcolor{red}{Bild einfügen???} \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ - Nur teils erfolgreich umgesetzt. + Nicht erfolgreich umgesetzt. \\ Die Möglichkeit des Updates der LiteDB-Datenbasis bestand darin erneut den Endpunkt des Konvertierens aufzurufen. - Somit erfolgte eine erneute Erstellung der Datenbankdateien, was somit keinem Update sondern eher einer Erneuerung entsprach. + Somit erfolgte eine erneute Erstellung der Datenbankdateien, was somit keinem Update sondern eher einer kompletten Erneuerung entsprach. \item[(7) Containerisierung der \ac{API}] siehe \hyperref[f:seven]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ @@ -49,7 +51,11 @@ \subsection{Validierung V1} \label{sec:Vali1} Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} einsehbar, beträgt die Dauer einer einzelnen Paketabfrage nicht unter 2 Sekunden. Somit ist dieses Ziel um mind. Größenordnung 40 verfehlt. \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ - \textcolor{red}{Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque?} + Nicht erreicht. + \\ + Aufgrund der Dateibasierten Datenbank LiteDb ist ein multipler Zugriff auf eine einzelne Datenbankdatei nicht möglich. Es ist also eine rein sequenzielle Abarbeitung der gestellten Anfragen möglich. + \\ + Für Abhilfe in diesem Punkt wäre die duplizierte Vorhaltung der selben Daten möglich oder die Umsetzung in einem anderen Datenbank-System. \item[(3) Dokumentation der Endpunkte] siehe \hyperref[nf:three]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ From 18b62d518c9f01d10a7dfd755b14640fb4abc750 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Wed, 24 Apr 2024 19:34:23 +0200 Subject: [PATCH 40/60] Statistic Mean Package Amount --- documentation/latex/5_concept/non_func.tex | 25 ++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index 892eee5..f3e6a2d 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -2,6 +2,31 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=2.5cm] \item Die Suche eines einzelnen Pakets dauert nicht länger als 50ms (betrifft \ref{q:five}) \label{nf:one} + \\ + \textcolor{red}{https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite.} nicht länger als 5 Sekunden API-Response. + % https://gitmostwanted.com/?term=&lang=JavaScript + % TODO: Pakete zusammenrechen -> Durchschnitt der obersten 10 + % https://github.com/facebook/react/network/dependencies + % 16085 + % https://github.com/Leaflet/Leaflet/network/dependencies + % 678 + % https://github.com/twbs/bootstrap/network/dependencies + % 974 + % https://github.com/expressjs/express/network/dependencies + % 54 + % https://github.com/nolimits4web/swiper/network/dependencies + % 788 + % https://github.com/plotly/plotly.js/network/dependencies + % 1815 + % https://github.com/nodejs/node/network/dependencies + % 488 + % https://github.com/michalsnik/aos/network/dependencies + % 688 + % https://github.com/Unitech/pm2/network/dependencies + % 241 + % https://github.com/axios/axios/network/dependencies + % 1768 + % Durchschnitt : 24299/10 = 2429,9 Pakete pro Projekt \item Skalierbarkeit der Anwendung (betrifft \ref{q:five}) \label{nf:two} \item Dokumentation der Endpunkte (betrifft \ref{q:five}) \label{nf:three} \item Rückgabe der Daten im \acs{JSON-LD}-Format (betrifft \ref{q:three}) \label{nf:four} From 7152afa549b2f49f44c193fee4df6fd1f886c2a4 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:15:47 +0200 Subject: [PATCH 41/60] time for package-search evaluated --- documentation/latex/5_concept/non_func.tex | 32 +-- .../latex/6_implementation/validation_1.tex | 2 +- documentation/latex/Appendix/packageMean.tex | 11 + documentation/latex/lib/bib.bib | 64 +++++ documentation/latex/main.bbl | 260 ++++++++++++++++++ documentation/latex/main.tex | 1 + 6 files changed, 344 insertions(+), 26 deletions(-) create mode 100644 documentation/latex/Appendix/packageMean.tex create mode 100644 documentation/latex/main.bbl diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index f3e6a2d..a74df1f 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,32 +1,14 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=2.5cm] - \item Die Suche eines einzelnen Pakets dauert nicht länger als 50ms (betrifft \ref{q:five}) \label{nf:one} + \item Die Suche eines einzelnen Pakets dauert nicht länger als 5ms (betrifft \ref{q:five}) \label{nf:one} \\ - \textcolor{red}{https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite.} nicht länger als 5 Sekunden API-Response. - % https://gitmostwanted.com/?term=&lang=JavaScript - % TODO: Pakete zusammenrechen -> Durchschnitt der obersten 10 - % https://github.com/facebook/react/network/dependencies - % 16085 - % https://github.com/Leaflet/Leaflet/network/dependencies - % 678 - % https://github.com/twbs/bootstrap/network/dependencies - % 974 - % https://github.com/expressjs/express/network/dependencies - % 54 - % https://github.com/nolimits4web/swiper/network/dependencies - % 788 - % https://github.com/plotly/plotly.js/network/dependencies - % 1815 - % https://github.com/nodejs/node/network/dependencies - % 488 - % https://github.com/michalsnik/aos/network/dependencies - % 688 - % https://github.com/Unitech/pm2/network/dependencies - % 241 - % https://github.com/axios/axios/network/dependencies - % 1768 - % Durchschnitt : 24299/10 = 2429,9 Pakete pro Projekt + Erläuterung: + Die Dauer einer Antwort der API sollte 5 Sekunden nicht überschreiten.\textsuperscript{\cite{link:ApiResponseTime}} + \\ + Appendix \ref{sec:PackageMeanPopGitJsRepos} weist nach, daß in den beliebtesten JavaScript-Repositories durchschnittlich $2`429.9$ Abhängigkeiten bestehen und somit maximal $\frac{5\text{ Sekunden}}{2`429.9}$ betragen sollte, was $0.002$ Sekunden, also 2 Millisekunden entspricht. + \\ + Das ein Projekt jedoch solch hohe Anzahlen beinhaltet ist ebenfalls aus den Rohdaten der 10 Repositories nicht immer der Fall und somit wird für die Analyse mit $1'000$ Paketen gerechnet -- der Median der Reihe beträgt $788$ -- und es ermittelt sich daraus der Grenzwert $\frac{5\text{ Sekunden}}{1`000} = 5$ Millisekunden für die Suche eines einzelnen Paketes. \item Skalierbarkeit der Anwendung (betrifft \ref{q:five}) \label{nf:two} \item Dokumentation der Endpunkte (betrifft \ref{q:five}) \label{nf:three} \item Rückgabe der Daten im \acs{JSON-LD}-Format (betrifft \ref{q:three}) \label{nf:four} diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index 84850a5..80e5379 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -49,7 +49,7 @@ \subsection{Validierung V1} \label{sec:Vali1} Nicht erreicht. \\ Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} einsehbar, beträgt die Dauer einer einzelnen Paketabfrage nicht unter 2 Sekunden. - Somit ist dieses Ziel um mind. Größenordnung 40 verfehlt. + Somit ist dieses Ziel um mind. Größenordnung 40 verfehlt und muss in der V2 besonderes Augenmerk genießen. \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ Nicht erreicht. \\ diff --git a/documentation/latex/Appendix/packageMean.tex b/documentation/latex/Appendix/packageMean.tex new file mode 100644 index 0000000..40f0f21 --- /dev/null +++ b/documentation/latex/Appendix/packageMean.tex @@ -0,0 +1,11 @@ +\section{Packet-Anzahldurchschnitt der 10 beliebtesten JavaScript-Github-Repositories} \label{sec:PackageMeanPopGitJsRepos} + Quellen: \cite{link:GitPopJsRepoMostWanted} + \\ + Dort dann folgende Repositories: \cite{link:GitPopJsRepoReact}, \cite{link:GitPopJsRepoLeaflet}, \cite{link:GitPopJsRepoBootstrap}, \cite{link:GitPopJsRepoExpress}, \cite{link:GitPopJsRepoSwiper}, \cite{link:GitPopJsRepoPlotly}, \cite{link:GitPopJsRepoNode}, \cite{link:GitPopJsRepoAos}, \cite{link:GitPopJsRepoPm2}, \cite{link:GitPopJsRepoAxios} + \begin{eqnarray} + 16`085 + 678 + 974 + 54 + 788 + 1`815 + 488 + 688 + 241 + 1`768 &=& 24`299 + \label{eq:summe} \\ + \frac{24`299}{10} &=& 2`429.9 + \label{eq:mean} + \end{eqnarray} + Somit beträgt das arithmetische Mittel der Abhängigkeiten der 10 beliebtesten Git-Repositories laut \eqref{eq:mean} $2`429.9$ Pakete. diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 492054b..251f46c 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -64,3 +64,67 @@ @online{link:MySqlIndex urldate = "2024-04-18", url = "https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html", } + +% API Response Time +@online{link:ApiResponseTime, + title = "What’s the difference between API Latency and API Response Time?", + urldate = "2022-xx-xx", + url = "https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite.", +} + +% Beliebteste Github JS Reps'security +@online{link:GitPopJsRepoMostWanted, + title = "", + urldate = "2022-xx-xx", + url = "https://gitmostwanted.com/?term=&lang=JavaScript", +} +@online{link:GitPopJsRepoReact, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/facebook/react/network/dependencies", +} +@online{link:GitPopJsRepoLeaflet, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/Leaflet/Leaflet/network/dependencies", +} +@online{link:GitPopJsRepoBootstrap, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/twbs/bootstrap/network/dependencies", +} +@online{link:GitPopJsRepoExpress, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/expressjs/express/network/dependencies", +} +@online{link:GitPopJsRepoSwiper, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/nolimits4web/swiper/network/dependencies", +} +@online{link:GitPopJsRepoPlotly, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/plotly/plotly.js/network/dependencies", +} +@online{link:GitPopJsRepoNode, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/nodejs/node/network/dependencies", +} +@online{link:GitPopJsRepoAos, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/michalsnik/aos/network/dependencies", +} +@online{link:GitPopJsRepoPm2, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/Unitech/pm2/network/dependencies", +} +@online{link:GitPopJsRepoAxios, + title = "", + urldate = "2022-xx-xx", + url = "https://github.com/axios/axios/network/dependencies", +} \ No newline at end of file diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl new file mode 100644 index 0000000..bddaabd --- /dev/null +++ b/documentation/latex/main.bbl @@ -0,0 +1,260 @@ +% $ biblatex auxiliary file $ +% $ biblatex bbl format version 3.2 $ +% Do not modify the above lines! +% +% This is an auxiliary file used by the 'biblatex' package. +% This file may safely be deleted. It will be recreated by +% biber as required. +% +\begingroup +\makeatletter +\@ifundefined{ver@biblatex.sty} + {\@latex@error + {Missing 'biblatex' package} + {The bibliography requires the 'biblatex' package.} + \aftergroup\endinput} + {} +\endgroup + + +\refsection{0} + \datalist[entry]{none/global//global/global} + \entry{link:RedHatCveDef}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{labeltitlesource}{title} + \field{title}{Was bedeutet CVE?} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \verb{url} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \endentry + \entry{link:CveOrgCnaS}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{labeltitlesource}{title} + \field{title}{CVE Numbering Authorities (CNAs)} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs + \endverb + \verb{url} + \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs + \endverb + \endentry + \entry{link:GoogleDependencies}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{labeltitlesource}{title} + \field{title}{Abhängigkeitsverwaltung} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \verb{url} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \endentry + \entry{link:DevInsiderDependecyDef}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{labeltitlesource}{title} + \field{title}{Was ist eine Dependency} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \endentry + \entry{link:ApiDef}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{What is an API (Application Programming Interface)?} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb + \endentry + \entry{link:MySqlIndex}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{10.3.1 How MySQL Uses Indexes} + \field{urlday}{18} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \endverb + \verb{url} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \endverb + \endentry + \entry{link:ApiResponseTime}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{What’s the difference between API Latency and API Response Time?} + \verb{urlraw} + \verb https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. + \endverb + \verb{url} + \verb https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/%5C#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. + \endverb + \warn{\item online entry 'link:ApiResponseTime' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoMostWanted}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://gitmostwanted.com/?term=&lang=JavaScript + \endverb + \verb{url} + \verb https://gitmostwanted.com/?term=&lang=JavaScript + \endverb + \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoReact}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/facebook/react/network/dependencies + \endverb + \verb{url} + \verb https://github.com/facebook/react/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoLeaflet}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/Leaflet/Leaflet/network/dependencies + \endverb + \verb{url} + \verb https://github.com/Leaflet/Leaflet/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoBootstrap}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/twbs/bootstrap/network/dependencies + \endverb + \verb{url} + \verb https://github.com/twbs/bootstrap/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoExpress}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/expressjs/express/network/dependencies + \endverb + \verb{url} + \verb https://github.com/expressjs/express/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoSwiper}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/nolimits4web/swiper/network/dependencies + \endverb + \verb{url} + \verb https://github.com/nolimits4web/swiper/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoPlotly}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \verb{urlraw} + \verb https://github.com/plotly/plotly.js/network/dependencies + \endverb + \verb{url} + \verb https://github.com/plotly/plotly.js/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoNode}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \verb{urlraw} + \verb https://github.com/nodejs/node/network/dependencies + \endverb + \verb{url} + \verb https://github.com/nodejs/node/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoAos}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \verb{urlraw} + \verb https://github.com/michalsnik/aos/network/dependencies + \endverb + \verb{url} + \verb https://github.com/michalsnik/aos/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoPm2}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \verb{urlraw} + \verb https://github.com/Unitech/pm2/network/dependencies + \endverb + \verb{url} + \verb https://github.com/Unitech/pm2/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:GitPopJsRepoAxios}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \verb{urlraw} + \verb https://github.com/axios/axios/network/dependencies + \endverb + \verb{url} + \verb https://github.com/axios/axios/network/dependencies + \endverb + \warn{\item online entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \enddatalist +\endrefsection +\endinput + diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 6227d37..aad8918 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -195,6 +195,7 @@ \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} + \input{Appendix/packageMean.tex} \stopcontents[Messungen] \end{appendices} From 267eacf949d692827e6cd5b8efae43da7c034b41 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 25 Apr 2024 16:47:40 +0200 Subject: [PATCH 42/60] Validation V2 and pic and new statistic --- .../latex/6_implementation/implementation.tex | 2 +- .../latex/6_implementation/pipe_exp.tex | 8 ++--- .../latex/6_implementation/validation_1.tex | 4 +-- .../latex/6_implementation/validation_2.tex | 31 +++++++++++++++--- documentation/latex/Appendix/jsonSearch.tex | 13 ++++++++ documentation/latex/main.tex | 1 + documentation/pap/Case_A_k.png | Bin 0 -> 41223 bytes documentation/pap/Case_B_k.png | Bin 0 -> 55257 bytes documentation/pap/Case_C_k.png | Bin 0 -> 76302 bytes .../Simultanius search on LiteDb-Files_k.png | Bin 0 -> 34542 bytes 10 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 documentation/latex/Appendix/jsonSearch.tex create mode 100644 documentation/pap/Case_A_k.png create mode 100644 documentation/pap/Case_B_k.png create mode 100644 documentation/pap/Case_C_k.png create mode 100644 documentation/pap/Simultanius search on LiteDb-Files_k.png diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index ab15ece..124f90b 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -1,6 +1,6 @@ \section{Implementation} \label{sec:Implementation} \input{6_implementation/implementation_1.tex} \input{6_implementation/validation_1.tex} - \input{6_implementation/experiments.tex} \input{6_implementation/implementation_2.tex} \input{6_implementation/validation_2.tex} + \input{6_implementation/experiments.tex} diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex index 6bc8580..74c26d1 100644 --- a/documentation/latex/6_implementation/pipe_exp.tex +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -15,7 +15,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} Anschließend sind die 3 Fälle näher ausgeführt. \begin{figure}[H] \centering - \includegraphics[width=\textwidth]{../pap/Simultanius search on LiteDb-Files.png} + \includegraphics[width=\textwidth]{../pap/Simultanius search on LiteDb-Files_k.png} \caption{Übersicht der Pipeline-Staaten} \label{png:OverviewPipelineStatus} \end{figure} @@ -24,7 +24,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} Das Befüllen der Pipeline geschieht nach folgendem Muster: \begin{figure}[H] \centering - \includegraphics[width=0.75\textwidth]{../pap/Case_A.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_A_k.png} \caption{\ac{PAP} Befüllen der Pipeline} \label{png:case_a} \end{figure} @@ -35,7 +35,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} Nach vollständiger Befüllung die Erhaltung der Pipeline: \begin{figure}[H] \centering - \includegraphics[width=0.75\textwidth]{../pap/Case_B.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_B_k.png} \caption{\ac{PAP} Aufrechterhalten der Pipeline} \label{png:case_b} \end{figure} @@ -47,7 +47,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} Beim Leeren der Pipeline: \begin{figure}[H] \centering - \includegraphics[width=0.75\textwidth]{../pap/Case_C.png} + \includegraphics[width=0.75\textwidth]{../pap/Case_C_k.png} \caption{\ac{PAP} Leeren der Pipeline} \label{png:case_c} \end{figure} diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index 80e5379..bbb3147 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -1,6 +1,6 @@ \subsection{Validierung V1} \label{sec:Vali1} Unter \ref{sec:Funktionale_Anforderungen} \nameref{sec:Funktionale_Anforderungen} sind 7 \texttt{funktionale} Vorgaben aufgeführt. - + \begin{description} \item[(1) Persistente Speicherung nach Konvertierung der \ac{CVE}-Daten] siehe \hyperref[f:one]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. @@ -45,7 +45,7 @@ \subsection{Validierung V1} \label{sec:Vali1} \noindent Unter \ref{sec:N_Anforderungen} \nameref{sec:N_Anforderungen} sind dagegen 5 \texttt{nicht-funktionale} Anforderungen aufgeführt. \begin{description} - \item[(1) Dauer der Paketsuche (einzelne Abfrage) unter 50ms] siehe \hyperref[nf:one]{\underline{hier}} \hfill \\ + \item[(1) Dauer der Paketsuche (einzelne Abfrage) unter 5ms] siehe \hyperref[nf:one]{\underline{hier}} \hfill \\ Nicht erreicht. \\ Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} einsehbar, beträgt die Dauer einer einzelnen Paketabfrage nicht unter 2 Sekunden. diff --git a/documentation/latex/6_implementation/validation_2.tex b/documentation/latex/6_implementation/validation_2.tex index c25018d..88a9252 100644 --- a/documentation/latex/6_implementation/validation_2.tex +++ b/documentation/latex/6_implementation/validation_2.tex @@ -1,6 +1,27 @@ \subsection{Validierung V2} \label{sec:Vali2} - Validierung V2 - \begin{itemize} - \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt - \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md - \end{itemize} \ No newline at end of file + Die unter \ref{sec:Vali1} \nameref{sec:Vali1} noch nicht als erfolgreich gekennzeichneten \texttt{funktionale} Anforderungen werden in der V2 nachfolgend neu betrachten. + + \begin{description} + \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Über den hinzugefügten Endpunkt kann die MySQL-Datenbank aktualisiert werden. + \end{description} + + \noindent Unter \ref{sec:Vali1} \nameref{sec:Vali1} sind folgende \texttt{nicht-funktionale} Anforderungen noch weiter zu validieren. + + \begin{description} + \item[(1) Dauer der Paketsuche (einzelne Abfrage) unter 5ms] siehe \hyperref[nf:one]{\underline{hier}} \hfill \\ + Wurde erfolgreich umgesetzt. + \\ + Unter dem Abschnitt \ref{sec:MySQL_Indexierung} ist die Auswertung der Messung mit einer indizierten Datenbanktabelle einzusehen. + Daraus ist erkenntlich, daß die Vorgabe der 5ms mit den durchschnittlich erreichten $0.7$ms erreicht wurde. + \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ + Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + \end{description} + + % Validierung V2 + % \begin{itemize} + % \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt + % \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md + % \end{itemize} \ No newline at end of file diff --git a/documentation/latex/Appendix/jsonSearch.tex b/documentation/latex/Appendix/jsonSearch.tex new file mode 100644 index 0000000..b4a0b2f --- /dev/null +++ b/documentation/latex/Appendix/jsonSearch.tex @@ -0,0 +1,13 @@ +\subsection{Zeitaufwand der Suche auf den JSON-Rohdaten} \label{subsec:ZeitaufwandSucheJsonRohdaten} + {\shorthandoff{"} + {\small + \begin{tabularx}{\textwidth}{|l|l|X|} + \hline + \textbf{Zeitstempel} & \textbf{Typ} & \textbf{Nachricht} \\ + \hline + \endhead + 2024-01-24 19:08:18.676 +01:00 & [INF] & Package "LiteDB" completed in 853896.3 ms \\ + \hline + \end{tabularx} + } + } \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index aad8918..7733cf6 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -192,6 +192,7 @@ \startcontents[Messungen] \printcontents[Messungen]{}{2}{} % \printcontents[⟨name⟩]{⟨prefix⟩}{⟨start-level⟩}[⟨toc-depth⟩]{⟨toc-code⟩} \input{Appendix/litedbInsert.tex} + \input{Appendix/jsonSearch.tex} \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} diff --git a/documentation/pap/Case_A_k.png b/documentation/pap/Case_A_k.png new file mode 100644 index 0000000000000000000000000000000000000000..ce0fb558823ded21a48cf061ff3e840c44ced319 GIT binary patch literal 41223 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 literal 0 HcmV?d00001 diff --git a/documentation/pap/Case_B_k.png b/documentation/pap/Case_B_k.png new file mode 100644 index 0000000000000000000000000000000000000000..5b70871a8c9447e21cbefcb47741bf925a18f105 GIT binary patch literal 55257 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

    G?t%g~KLn_cEn2pTSOtK_sw9n=L2sV{JM6Rvvh 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 literal 0 HcmV?d00001 diff --git a/documentation/pap/Simultanius search on LiteDb-Files_k.png b/documentation/pap/Simultanius search on LiteDb-Files_k.png new file mode 100644 index 0000000000000000000000000000000000000000..c191d6ce91a7911e211d32001cc2c5bf1ab0af8e GIT binary patch literal 34542 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 Date: Sat, 27 Apr 2024 13:46:17 +0200 Subject: [PATCH 43/60] dir rename --- .../discussion.tex | 0 .../{9_summary => 8_summary}/summary.tex | 0 documentation/latex/main.bbl | 24 +++++++++---------- documentation/latex/main.tex | 12 ++-------- 4 files changed, 14 insertions(+), 22 deletions(-) rename documentation/latex/{8_discussion => 7_discussion}/discussion.tex (100%) rename documentation/latex/{9_summary => 8_summary}/summary.tex (100%) diff --git a/documentation/latex/8_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex similarity index 100% rename from documentation/latex/8_discussion/discussion.tex rename to documentation/latex/7_discussion/discussion.tex diff --git a/documentation/latex/9_summary/summary.tex b/documentation/latex/8_summary/summary.tex similarity index 100% rename from documentation/latex/9_summary/summary.tex rename to documentation/latex/8_summary/summary.tex diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index bddaabd..1a023f8 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -131,7 +131,7 @@ \verb{url} \verb https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/%5C#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. \endverb - \warn{\item online entry 'link:ApiResponseTime' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:ApiResponseTime' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} \field{sortinit}{2} @@ -142,7 +142,7 @@ \verb{url} \verb https://gitmostwanted.com/?term=&lang=JavaScript \endverb - \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoReact}{online}{} \field{sortinit}{2} @@ -153,7 +153,7 @@ \verb{url} \verb https://github.com/facebook/react/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} \field{sortinit}{2} @@ -164,7 +164,7 @@ \verb{url} \verb https://github.com/Leaflet/Leaflet/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} \field{sortinit}{2} @@ -175,7 +175,7 @@ \verb{url} \verb https://github.com/twbs/bootstrap/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoExpress}{online}{} \field{sortinit}{2} @@ -186,7 +186,7 @@ \verb{url} \verb https://github.com/expressjs/express/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoSwiper}{online}{} \field{sortinit}{2} @@ -197,7 +197,7 @@ \verb{url} \verb https://github.com/nolimits4web/swiper/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPlotly}{online}{} \field{sortinit}{2} @@ -208,7 +208,7 @@ \verb{url} \verb https://github.com/plotly/plotly.js/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoNode}{online}{} \field{sortinit}{3} @@ -219,7 +219,7 @@ \verb{url} \verb https://github.com/nodejs/node/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAos}{online}{} \field{sortinit}{3} @@ -230,7 +230,7 @@ \verb{url} \verb https://github.com/michalsnik/aos/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPm2}{online}{} \field{sortinit}{3} @@ -241,7 +241,7 @@ \verb{url} \verb https://github.com/Unitech/pm2/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAxios}{online}{} \field{sortinit}{3} @@ -252,7 +252,7 @@ \verb{url} \verb https://github.com/axios/axios/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item Entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \enddatalist \endrefsection diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 7733cf6..ff8dafe 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -172,17 +172,9 @@ \newpage \input{6_implementation/implementation.tex} \newpage - % \input{7_verification/verification.tex} - % \newpage - \input{8_discussion/discussion.tex} + \input{7_discussion/discussion.tex} \newpage - \input{9_summary/summary.tex} - - % \input{sections/einleitung.tex} - % \input{sections/recherche.tex} - % \input{sections/umsetzung.tex} - % \input{sections/analyse.tex} - % \input{sections/conclusion.tex} + \input{8_summary/summary.tex} \newpage \begin{appendices} From ed39f6decfe218996efea860eca5a18ae3b7859a Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 29 Apr 2024 11:38:30 +0200 Subject: [PATCH 44/60] summary proposal --- documentation/latex/8_summary/summary.tex | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/documentation/latex/8_summary/summary.tex b/documentation/latex/8_summary/summary.tex index c9b28eb..9b49906 100644 --- a/documentation/latex/8_summary/summary.tex +++ b/documentation/latex/8_summary/summary.tex @@ -1 +1,17 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} + Aus der \nameref{subsec:Motivation} kann der hauptsächliche Auftrag mit der Forschungsfragen \ref{q:four} umformuliert werden mit der Frage, wie transitive Schwachstellen ermittelt und ausgegeben werden können. + \\ + Die Bearbeitung kann unter dem Abschnitt \ref{sec:Implementation} \nameref{sec:Implementation} nachvollzogen werden. + Nach anfänglicher Umsetzung, die die grundlegenden Funktionen vorweisen konnte, musste jedoch festgestellt werden, dass die nicht-funktionalen Anforderungen mit der Wahl einer dateibasierten Datenbank zügig implementierbar, aber nicht erreichbar sind. + Somit erfolgte eine Version 2, die mit der Änderung der Datenbank zu einer MySQL-Datenbank, wodurch die Ziele -- insbesondere die der zeitlichen Vorgaben -- zufriedenstellend erreicht werden konnte. + \\ + Während die \ac{API} anfänglich ein hauptaugenmerk auf die Funktion der Analyse einzelner Pakete fokussierte um diese Funktionalität zu gewährleisten, ist als zweite Iteration die Aufgabe der transitiven Analyse angegangen worden. + Da über beispielsweise die NIST-API (\ref{sec:NIST-API}) eine einzelne Paketanalyse ebenfalls machbar ist, lag hier der Schwerpunkt des Auftrages. + \\ + Nach der erfolgreichen Umsetzung der Baumstrukturaufstellung in einem npm-Projekt musste anschließend lediglich die Verbindung der Paketanalyse und der Aufbereitung der Ergebnisse als \textit{Dep\-en\-dencies-Tree} erfolgen. + Die Ausgabe jenes Ergebnisses geschieht dann im \ac{JSON-LD} Format, damit jeder Identifikator eindeutig und weiterverarbeitbar ist. + \\ + Insgesamt wurden die Anforderungen aus der \nameref{subsec:Motivation} also erfüllt, können jedoch noch weiter ausgearbeitet werden durch zum Beispiel die Erweiterung um weitere Frameworks als das aktuell einzige npm. + % TODO: was noch? + % TODO: hab ich was ausgelassen? + % TODO: war das zu strukturiert und eigentlich gar nicht vorher beschrieben mit der Historie? From 7bfbaf396a3d679ed53824b5a69a541f0fd260a6 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 29 Apr 2024 18:51:13 +0200 Subject: [PATCH 45/60] meeting with both ' to . titlepage picture --- documentation/latex/5_concept/non_func.tex | 6 +++--- .../gitmost_wanted_2024-04-29 181855.png | Bin 0 -> 381967 bytes documentation/latex/Appendix/packageMean.tex | 14 +++++++++----- documentation/latex/deckblatt.tex | 15 +++++++++++++++ documentation/latex/main.tex | 2 ++ 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 documentation/latex/Appendix/gitmost_wanted_2024-04-29 181855.png create mode 100644 documentation/latex/deckblatt.tex diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index a74df1f..79e8663 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,14 +1,14 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=2.5cm] - \item Die Suche eines einzelnen Pakets dauert nicht länger als 5ms (betrifft \ref{q:five}) \label{nf:one} + \item Die Suche eines einzelnen Pakets dauert nicht länger als 5 ms (betrifft \ref{q:five}) \label{nf:one} \\ Erläuterung: Die Dauer einer Antwort der API sollte 5 Sekunden nicht überschreiten.\textsuperscript{\cite{link:ApiResponseTime}} \\ - Appendix \ref{sec:PackageMeanPopGitJsRepos} weist nach, daß in den beliebtesten JavaScript-Repositories durchschnittlich $2`429.9$ Abhängigkeiten bestehen und somit maximal $\frac{5\text{ Sekunden}}{2`429.9}$ betragen sollte, was $0.002$ Sekunden, also 2 Millisekunden entspricht. + Appendix \ref{sec:PackageMeanPopGitJsRepos} weist nach, dass in den beliebtesten JavaScript-Repositories durchschnittlich $2.429,9$ Abhängigkeiten bestehen und somit maximal $\frac{5\text{ Sekunden}}{2.429,9}$ betragen sollte, was $0,002$ Sekunden, also 2 Millisekunden entspricht. \\ - Das ein Projekt jedoch solch hohe Anzahlen beinhaltet ist ebenfalls aus den Rohdaten der 10 Repositories nicht immer der Fall und somit wird für die Analyse mit $1'000$ Paketen gerechnet -- der Median der Reihe beträgt $788$ -- und es ermittelt sich daraus der Grenzwert $\frac{5\text{ Sekunden}}{1`000} = 5$ Millisekunden für die Suche eines einzelnen Paketes. + Das ein Projekt jedoch solch hohe Anzahlen beinhaltet ist ebenfalls aus den Rohdaten der 10 Repositories nicht immer der Fall und somit wird für die Analyse mit $1.000$ Paketen gerechnet -- der Median der Reihe beträgt $788$ -- und es ermittelt sich daraus der Grenzwert $\frac{5\text{ Sekunden}}{1.000} = 5$ Millisekunden für die Suche eines einzelnen Paketes. \item Skalierbarkeit der Anwendung (betrifft \ref{q:five}) \label{nf:two} \item Dokumentation der Endpunkte (betrifft \ref{q:five}) \label{nf:three} \item Rückgabe der Daten im \acs{JSON-LD}-Format (betrifft \ref{q:three}) \label{nf:four} diff --git a/documentation/latex/Appendix/gitmost_wanted_2024-04-29 181855.png b/documentation/latex/Appendix/gitmost_wanted_2024-04-29 181855.png new file mode 100644 index 0000000000000000000000000000000000000000..83ed07dcb49cf390604de28ef42f7a50384850d1 GIT binary patch literal 381967 zcmeFacR*8FpEnLNii(1cgQ%1^<0xYT83(CJETfErf(=nxR7OD}1PDD%Y^Vs)K?fB` zR8%^M5JF3WB1ENx9!P-DLx2z4@xKbab>Y4*t03M2z2*8ue=0BX%^={bp+R)X6ie ziq_m*bp6}1B`ci1;NK)aBrdl(P%w9F$)M=saf}y#c=Uecvu9DM9yXiqOnrvy{`%T~{OUF~%z*Cu}{_xGFpSEjp)lXLE|5Llp zn)J-QnA)nHX^Y~$*rl0yARNEKrHp2p7Dtnt-Xr^aA&OQzGPfz!^tNOSA2MRa-<&sO ztL*emivnGF6TJ?nw8tbK0)p=$LfFVgezdz|PDZIiGs4pxS$|+E zli$R61h&qr{@9_gh_fxsxKm?nNfH_HyhT}!)#9(}HNfAck-#~Wr z_K&vOXxV5=T#QomM}0srU?WPtE33af6?STw6Ju&sxOkFkgO#>X_{&hI?>CC{8*oQ< zbXDHR^n1I(>17!Hui7q@yC{;ca+Q+u3af%jKGe|{yKD2#ND|L#49=po_KqO2leTV{ zVDz|?nhP69()eVYNUejvDMlu{MCB zclc?|*Ayv7Q&)IKpgqtI+r@Ca$f##1hD~77<^7T?NcKiksDBzv$yaci z^TReL;9P?vjfAoi50W^Dz$i?NY7bWw?i8^5I~K(J!L^JOL4C(%z)BtpgfEx z$={t*k$75k8!JhV=u&+zisd(HzXUPR9!@yk;URza+AQ++480;(n(X-|JB<*ZAn{g% zEy*ctIkHJq+uhVucj1E7K)BHyPn8|{Z`xhLf9X%LlJEB!RmaOtbwayAysUEEMd>DtPITw; z2h@-;PpZaZD~+h!S+$rGeb5Onwv+lQpi-`UJC@K-y(%mmn&2S!JKH z-qz~;EdKm(vB=0@{}BzG2UA_FF3+guL-$q{`OdM!H)vP^%~nU5ij5s$#+*^zBsNxa zuSq-C#D9QrfJb%Z^>fKH-p+J@Rk%4Vg2WALDKeofMT@4JJD6Gv#j-#lx%YjhaSArE5O)|yt8Kdkj#KJ9U` zdW9@En!GbP-Onst4#R~zB1)g-*F-y+0GLUEX8)ZHEY ze#W(xNw5aVoiIO7Q)%*dDpfmiGrvvU|6LKB_$Kj|s_IR-unmvuAJL%_RmY#1O;VSm zY@xAHHorj>sEu>aM%tKRaA4u0Jkl^2F_IcEkhp32z?Hc(XE~82iSK;_B-iQBh0>@* zWHo;)vnfDX!iRmEHg(ZbOPs5eynEJ4EuXoT4srznF)lgxz^fanaZ+!VR5I??~5t5 z*&*Vus6Njq$}Nl!HIdV$*2CunxnAvy1*(1dgWWTI04qR1Yi7!kGLo+g9sK3fFAMsdCUUAs7K zK5z1x11$xodvVU1Om?;Fo4To9J(D;(p%ABy$U_sYDNJ3&)@aT{f|WE{b^K&N>a1+> z@X+DF*VhGHHbl}>hM++Oa`goz&NZe0Z;fReSoO*z^TckG;GClq6~7|2pznL%lQG0# zVs{SiTShF>39c!wvs6nqmVj=np*XY_*$B~AMkn_`?+!f(K=&)^{YB8#7oZPKbDJ0w zn}nVfLc32C4kri#^`?Sfg0~OWNIm5?ui9PcZa$sO+EIblDP0Ei79V$lT@|tCj_YWb zh5RPP8||7R-Ohj`u&ORt1FGK}QYku0E=e6JQ|9EAkZq0T$iKXqx^iMV{X*(fmHjX; z948cL$~@h0xx&kj(0H&pu0f)D!whT^aO;_h-kyb(YI%nzrHT^c((Gh|+7PX|VcmQU zALTdJ9kouNlS)nY_6HWKa$XT|Zq}?Q)H34b@cJygH8_j*B5pn6RWqj>JXTs~LNLix z7OTd#Xo?4oB!1%748&gH| zq}cnuv5+?CpqAH{cqzv>&Mg{O2_6!#7nS2!>*nqAY89uMrWuh8$z8_$;^tKj-08@G zj#&a_S@e2D&$P3mxUs}WSy99IAm>-6_&E#Y^HP5`uE97}nfe3vutjGf`zcA6#zv{Rh~W5PNi?B-ut ziABRF?ML3Na#!`EsjJIR^$H|wweJgN4@Ubs5w)_}eG1&rH^_Zho}i3QdqT3qiRw%_ z(`uw;XipUmtr-3wTxhi)r>u-(-4H~Y!c+kvD!mJRu2y|)w|-|!2piRD66jY{Icz+0 zSksvKa_5=k$EzBNL71Vi$#j1LQZ46yD~D~>*b=CIiA60~nD<$lz^H!&yjbIM=yzg# z#a?^+M}5|O%8uxttKR=+eZDsCj+NV|nz9TVpSs??D%pDB5aP?>4GF2RFPAwrJO;tc zK2@~Kcg|F5qYlDVfy1thK)N3WYxPU?qyMbDhk6c~)A}uNZ3p?^CZjLS7N+2>4S&z$ zfOh(Ri}<^!{U2WZUYVIUBBs9iC$&-jcw-ZMVn-iv(ioo(70{6#3B71x(;w~4H-BWv z{wv$)kJtN0i~UC$a__&ku8=gfBuBc$oWNw&FpHyIQLP5pXW$FFXoVES?L$*N zY>2jZn5DKM)**suH@$+dGfUecv2W`5OJI+!cRdvERu>}oRgI{iL7u(Nu%!v$p&b65 zl;l9Z!j&b*q4%@zJI~ngE3&}o$EZv7YPLT?`EHkIFJOihar#vd9RHast5!2n7JH-{ z$&omjLicH-WWsiqi(hDrvYm`BrbJmBpDCGR&|b}A;6}lAQ2y7#J|0T`QhAsI)l#qY zFuIpKjKtm$2W@7fVFW-#JvEIa~Xk_AcuxPPd}MN@*!z@mvspFEmxaQ(F&4-Xfr## z8FkD#cROkqE{vAIdLfC>jT5`Ch8(F-ttgDc_y6F_+^AM?J4&br z+DW^+(4{oR9b9N0#fOny3yFxeM!4|PO`E^V|pR_+*UQq-d z+-^dy-9_KX_l?U@+)OAV_eb#O{8GXEhhQ=(55*!dnTU%5Hj)w5h(0)toA|)SqUIE7 zG*Xjm(`{2$k}0gLR`X${P@KL2)MXLT-Nb)s%7qVqw8jPxyN1V<MHzttg>^1_JkfJktjn0w6$m9a)3s;0MEG_;f1iY8+3j6i zg7@lQ#HMzb&CK9#(?H4(lEJN9Q~r&p5Bp_KCD1On{ttVFWHcT<({-38v9lvd!6Q#y zp&LLwvP$a3RL-{!p`$8^hLmMdUv)=r2U8?FTJcT%3xXNX(S_Fj?~w zM7~65FKaWgqZQqRD#Eh1)k$$%do^WYA3{{7OFmf)(TfZ#tZ;-hP z!xiGX`nAz6B$(`x(+KZVF>U|d`#-9Kz_IACPZTuZlz;cHb#(qCg?ae<2cCX%iro2= z!3R9HhRF8?a75gm)OAfS7AYM$hmRzX z+FTUfoBxi#A$W*k1;32FYfNc+EFW$-{q#HO;^CWvEAH61fa8PACgQ?syjrr|kfcqK zz4|==$5%x*Z~jMIAV-7RJqj=Hevn_cc&YBxU}#KGHR~!Fba!3nW((7c2NgeoI6)^(#2vvnirhexKsov~W*acufTI5TgW)HWR}mkB&Qy&V zPwra2oT2lozTgLG$5m8ku&sZ7l^Z|u31`cb!L>SFz{(c=GadKSMOKBE4;xIl3eMv2Z*-HEwY*+E-H$ipwP4*2JDGEIaS#fiv09^Oxh@GW55 zb^dA#%0oeWR<1!VYpL4jI4`Gl&7^d^4o!r3_#WvzInI6jvwKqgDVmG*m{OE8aV58G zFO+#AF6f7P1$e$rcMp>jBx6Oz%eLd0HeG_&L^%YLTlplnpoL-kfUqv97>oC7l=6;u zF8tiI&s6(!=i2Mo&E88Qea#o!SX@4WXTzRgllxaxLA&191=|rOYHbsk-1U_bM;)7~ zDx;r3t4?jO1LW{-jN)OP)oLzvy~@7{t>%LWFF3bsz)~?UxlIn|RxBfFbF0 zWZ{?O-%A6y$P)dQ? zFM;=eylhwV#ky~mkQVgn8VjWT<)Zjz<2aqbh=Luo+b{5_s{)<6dX6#;zb!q4MNISREkXL&tTWw36Pc zw)_TZOW0?mlT>It=2;A^EVIA3itabv^r^$AA1}zzgH;tj)-5y+UJ=%G*20fdaCx=7 zW!4x5)oXn?iRN3})N6`vqd#{C8Dtdo>4iO!yD1)uc>Yg?B-DDtA2P4=j|I>12Z@l?j<72Iq20m^kqxh%zLyJ^ z?ludgra(4f6sN}js>%Yg6!slW;vF7mtq+vG%7i>Fim_sDfE|ksa`SLUo^Z;|`h4j# zCH{NOi3z7F*60nxe%AMeJGpl77N?y=jLtdhrrs~0Pvo-DpBzofbXmr%fi?F1X$BMpqOn3 z{!bBx^$^3(>&>>Y=A}DkDnKXp_`vnV$E{yPOGL#!CNgKtHq>TbCcbMS#2wV&_p@R= zGcumhPJf;HD?}0KJ0KJlPrZ1Khj{(%Z|yy*e5gKrnqppf=4v!Fgnj)@^agkI}Yq!0G@STy(m}DW0`x#)?C3GYm42G zv3W|4`y9pK0rD_}<4X>3+e#)spM!g<7hE`dJJe}v5jA1o>oB{7-!k_a^|b2%GUajZ zAjBVgVE{Eh2@7)8P465FSVT<)2H~IXFTkl)g106x?BaE<>YrV3D0T*c+kFGvd)(CB~ zk=vi(_nITu7NPBd4q&lprG;#)Ab!0A3 zeAi)w;Fz6#GTGWiran0&WuB5K6m8vi2MVl z7I9P>RO_2Ok+7vVY!)ews%wzT5ImBfPZXVq(KIM_umRzknWCret zewY1QTz;;{MVEe^uw;t~r*kJV^ZP4u6k=pPl9w-9(Cxa8_n|O%#8w z{{KDkg)gUkS5P+_%Sw9_5)rA~9yF4H~Wn@-;kHFk!3H^M0%7hyYJ=KVF;ll7FDDA>M6=6S!RL=Dz!)LVgoACQb8v!w8G3=#(5R~_KKRTU- zuilI@8F{|}->dq%#^|8tEax@o%P90oFGim8?7MkA zG8E7Fc{28aC1GAi)R~?=eGyzV_ioj^)>#9FY%Sn=5Mt&vbKUa)Q{lY6t|OJ@ml8Z< zhi=Vl@dJNKW#wBX_kiTk@>Oqe-IrP@6PX#p;g}(tu8w<< z-_+%s94+Gv6G$Y;>>Bt4Fj=rZt1?!B6KYvr#F#s_k6Uf#guZ!pZ7Q9E1J$s7e23j?}q|GIXo*Sun80vl(66Accpq+jVbwzY^xHu>S zvZ;5~bNo8I$E3(+kgy)p@n03`)JOm3%f02tTa+75#KYFCc~GWUII;ubaVX)~C^C5s zeM=kt$4J9xHs(J+U^tvJ%L9D4oenqaBfj&1aBqg?e*>t2-1Y0)pPrDXZ>TT64JeEm zR|EeWKg>mZ>|fYZ6)l)bh=(rLDif$XP&b?)T1E=?7YSt)8dW1GnJ&2E5c3T~%hZ>w z9ey17sKJ5xB#UYG);{NlyfcQAfPe1IKk~3Zde60|YQ2j^>t{qU54Z&OesEs{ zT-3GHKPImFBa*>?MwlM8je}peaR&R1R&b+^x=ZKQQAlss5G;!3dXZJxS*X~gey_93 z-0_~V(-poQ?Ud>Rh=LtAvgmov(q5|xo}XVP`Q)0~_TkUf{}T|u{^cZR#oLTUs^R(? z?R3omOP_Svv4$J3Sun8&r!Owu6frMd^7Ygifb1~*Lg56QnJpGY1G33}#W>({6@{&D z0bI1a;oVPYKxmg9zZ+)>ctiB!HEw{!(qHiJ4-OAZZ2$n2y&v9em6~0nh0Yi(pxrf_ zQd;AK5Te8e(lr_yP$bfyr_P(|q4S9t`*I{eJ@fp<5BLTwN*3V5-T?5IdDH$m{#KCn zyx+yb(=BYUm6#Kk{C_HX_DeDjrzE>6ybwC zuWU356Tp$9Ry&@kqVHzGc&tTW zw!g&@BQZb%f50uytCgZI?FYO_2?A;NZ3rOWIf7zi3_ubp$A7B==sKE4KPdueBE#Yf z#sQ^kMs4BU3b?BVmEf{x|6ahf4(5{bm_%VzR)QN%k1F*;`$dJISPexzg13=Tv8dL~ zd?P>M$c;%B?|bRE0c{?voaegea+b462F?^VXf ztdCh`3yQb6P{72`4gB9kK|F=`ILfqF#!F{G)cz6G$lTrvd>d~T>CDeH0uz%$`HGD0C!`?87`;%BJ85I0} zoO>HZk!=aB7ujqA7!tV35cq2X;Kok_n0uD@{5&r%L{pC0Uwh{OQXzrht8e?u)<}Sx zx0FmixpC>myl{w%GVi!s&@s>G8HHEZy?)>bu(0u-$Rqp8jsY^{j}+QB?%xxZYOiUu zE6t*D&kGys>#lR}G&E=QKcfs>iF&gT*Wwo=ZWuFpWSUDqgP`JuQ0%%AOz6d`v9GNk z`%Xay_923}r6z82T5N<9H{EEL-%~0%}K9XQN=$u(A#A zAzA4$hpR3`eH|BDB?DWMj$=Psi**>Urf~A=P4%Ga@#m6$cdH4i^jVkRJ9R28hh*Xw z$wpcAzpvfM7exuSapHQG&*<4I2JP49Cie7PpGsxvk2Rb(45ot^2F*!NO^QE~Jjr+* za#-G!#?q=&+xK&)3VNWG=lpv+LLBGbH@UV%5xWX|yR}dacg}ORk#63ZOp7E4UkEOB zj9#BuB$dBOdj4UO)l(;6vb5mI;V#MS3p-?3F^Ut#nWRC4v0QO99N$+R2rliDvY8AC zRMV71wQ%&EhD^UtBH|kc)#4<9l)@e!Oa16{OZ&Frh(uhiHe;7LdP2%ccP7do&3cZ=FBqLe&LOV&C>~nR`Z?o1(*ke^{}a zcV1hNA*ga54J}(xu zx|yj5au)T!1@k&mvdE$C_IbWLv^Rg55z!9`h9Co9TQ(7l6MK)d+D)zejS!YZ)=M&` zh;xb<^RrWhkc^03B!+6PB|QcTlPXbFLazjPRf@QRB;Nxfn`Dbm$-)#+8m!((qKuG*9lh%+9AThtrvh%OVSKW_t*>S z4jLCl$kq<&bTS^)8^`T@85wsqv_COriytrM0AV9W#CZ9?>ip1TFzlnBhKgKQXl9LR z7iPJ>lkXooXdTzu#z~2MiMPV;Lsk0OLxz{9AyS*`AJG}m1G0&wd)b3S_ zVo>7qf;X2ce?-^r-1SnJ*jYjxF*z(u{8{c@yvl`~iBG55DhScdTI|GgU)6GE7CE3+ z0Kf?AfbjJj@7z?shz}wgT8Z5W{_s7|SMMq1lxXbBsF4(Q3BID7B7D{*A0M)D$L;Fx zq7?gvx6Y-#_P1zBh8%@lh&83;8{l4@RA25}S(BD6h0Iasq&|4I%DcqYu52-|O zfLh2cr#mgWsqKZsoN@|-vWsGYCDxf1DUonxeQ+WxViN73F zPhZC%N3T&YtPyP2a2E|q(;c;=mq~Feroz_adujcK}C!UH^ zmnrkYjM7G5FfZD4#~(mepP83*yNg7{I`gKdPTULp!fwD8)oa;`*;X@eoL=_h`RhvB z=)NWR^POG;g8ZRd20gsP&BKgzTAx>V3~CN8LVP?|U1F|Q29QqIF9{$)V~)bPs-+Sl zr`cg_d3)XT6rze6t;ilmdO3}*E$|hNs;%G8jPXsAAK_H94IDN>lZNEjI`AICS!uU> zhe61Qs!}nuvV0K;bBAV<=-1!D%5g{VC*Ut#IS;x4>;dx<8bj`CI5`7K?;D2mwN#Zi z|D`<0@*(EinJEFKOcJk+J+GA60UDr_R(4L6#Pk3ep!@06ek&SXwE+(bCr8OgJ;}nc z;wW|>>z3-f5jm$ISV?WCcJ2z=rq1y8DI7v{Ti6O?CHFWNK_IO2PR*|1G@=l&l~L$C zHQqNS(?pxC2008$(@-%A#^nj)CS8@h)s{GYny)J!$?n?C6&<4}^ZZ)PYD##I-KF`G z%W>f+;7^coIsIynqCmreo`|L_)JfECutTnGiv#6^K$GkFgZ|8=%CUBE9{35ttaIIX zx?gTIu5;^Sy_j9TLLQ;h;)r{4(DDd3>&`0Le3i~=fNjkPGRn4eAuV#uN}cF~iEoeT z5DqiZl>sFEj+9IPdO#a5;k40q=!i1%gf)2CYRcZ1f;HATw{#U{5jZ8~>&7Fx@j%pof3yI$twc?0Ta#i@DY zYvUh46$!sWew#O?4uTry%`hNj0$5u|+UVZ{4C_0d|095>-LDD)r8q8bclnMs1s3An z3tWN!b$3P0D{g!ed344v{MIb?QIC}uA zczEX0b08x#IrEB==YOU6-X_c;$K<6zZq$;$!vo&D4gcnR{{XrVMAx``IQI)QZ&qo( zoP(`y;hpipT?`|x+q<2(&ObTmA%kKuo%tMJ_bB`8j=3Bgz;7h)og9P!bV|SV`KJFs z0x+->UDf*X`<VWc@&0G`Hu|MFlAFgw>xwhAvK(*bv6 z%PBm;4(Ut)90B!lqUuM(v%qBhq3b^tX{N%cYFuH8wvqs+L91HIbYxLa3Us}Rk2tAk zXYZ_o`m9T1fPoBCpMuoZJ)7*eUQq)x>lnBGsvz@7-Wem>-LLX<3c@>xNG9(w5^A*j zjvlZQ;w`y_?Y3O3#pN~n^I=o>X5TD$v)Wn5#_%p6@B!iP#!Oen>YOv14@^5dL}wH_ zNQFA@>~{lwhzXx|^hHi{b#I1U2HHF`(i>Sh*2~aaF{}f0d*DOGWJFU1QGb2?eEhm5 zV>I}&7qrw-H!RW zFd%44-*U3EXx<%eoHyYKbg=lghj=Sc{i(WKg)z{o{Bs`a+dyMa7UyF31AWLlFzal6$bdg3j!|cs!{Fin$W+j(*<%C}z%ZYx`iOCS= zf4=&e4*&h;!|wk36oa>R=l>-kLpwK;(4>(bz(-=k25jTB*Pqhv{!kD5+4w>90~dt& z4G>)igy$B)7JUE2RUnoQq$8Z@_pqRJ>I0E;AX_1)I?p*S&j<*;e}ma}Jk~Q-bP|*g zWK1efy__qY8!v#I0@5Ny#fL_HM_auyuYkBbAbmepeas{)&Hzz(KqCJs70s%r0oivW z)Z_|H=fDZtFDFM&ygKQz3a*+v?z8jRTm(=|zDMV~`OM>jj`jbb!%8N7E~MP`GRQGG zl)IOfrE+Not4C`pG}~gVNJ}*)OCuf|0U*q4kOv^FO&AQ>xo=npE`E2$O8;oVuaMR5 zfTrSX^RQvhi9A3^A3q2(a9=hSzM^vr&wutr8~yF7s}*KHk^pJ#{6JJZ^LKqL7cw_n z7riIhe&{A3VwTBeLrz9o`7L^LfRjGfO;&OR_VZGS+GHh3c3m&K)hFlz?bMU!7zz=3JPkGv{^>a~O} z7o{#dcS@ML=uEoJGr~jy>?cAId;or(WLB^*sq4BW6A%LS`J;j6L8VsC6+j|-?b+=v zlSeWm2R}pt^1u-8;FYkhz`%VzAwBd|L#ty)pl?ig1|Xely^_109+-TaGN0pa))iiA zXzOJ{@R^S!zWOaQGP|{MW(1gVMhSmXRo#9dC2?0TuNAaf`(|-8T4l0#zt~lG2Ltz1 zXKFSzwLT9VqqP3!Zvw#whD(n>mCYot8b<6T)A+`x!i?**Ou=n`uOH?ti_~m z0XFQbjycEl;{e9cWnn2mOdxG05TF&1ank~%s@;PGJps^(8!#Qa=kHKt$M2dCLm$-( z2JYZxE@A<9w7D!VZcP&pl?CM|w2|Xi@l; zf2aWRXM7J22>eezb^Olg^{Q7-3!dqBX6+M*iYfch*-@z0%Gm`v&5Xe0(_4R`z%+B}~!@7&bya9^|ayXIS)S0QrAER67A$HCC`JM(@y* zJ+B3NO#!-7HVJyNb>lw&K)m#y56L#agK6x)|6+5C!wktZZ|#6r>!OuRv#~*O-_pQ) zM&__t@y-=V75^`w(tjZ?J1Q5yug}NmxUuBij|NT?neyA*aPZv52U%k$#6P%@GUGm9 z`b>%cUUQ;=T9W4*GCokSeK^iw*^wg%OsvkBjpwZQIdJ)|8Z=lh2faiXF>k&6Y4~Zt z-uS;mu!qk~4Il9x_eo*yG0-C__ZYt;?K%P#ABzhB0M-8}EcG8nXn!;(;d?muJK2LD zzdEqyX3p$)MUFaWm-!3V3&puF{{rmvp9aH@PKR7TeEde&|J!d{Rx$j~K5;x!H`7t^ zOktrK(jDzUOr7n5s422l3jnnoi79kz(> zf|t+i{3pj$17`5Qw=fzdwNc83)80FCs*k3kHkvwEAC8ecp1B!`|*8(d$Wf@Z;IE% z56x?i5RYQs{a`fivsOOyp&}?Ab<8!Rey!fb&RqP%G2M)<8$b{T&+Vb^K{@UA{<|>; z#4FpKpCHeV)LL?L7fv7C9=R@HSvDgZa_+HyMByE@Y{Z9D1I~HjHhf1{yteamqd!yn zpKN->_oTh9w0Y+E%5cc>Mb>9j^=C}^-w;s`QKr2P*}eYAs%DRd-U;FTt(=J?HE`YP zbISlAwpjQi5*CJ-{|oR=&quav7$3`-3wZu(rDHy%#`)d$03}pcm464d{VwFUztydi zQk&}g3%{byxI>uznw}yOhKvm;GxV4A4u|k7@YOgcE*BfYGkrGBOy_LFTA#!~53Fax zSBftjz7Ac#8}}rBY;&)^=oj;(%{>3Tl+!@WXw^UISo5B70Ht-u_@3#w(MYHGYfJUTwe!T(&u@p-38OHyqy+HnJPYX9VyP4xL# z(iS6N5x2Gj@w)g}V2yiN%m<{hfV3PvA+YRooq>cG7x($?sKx*-`9v&`@Pa4I;|Uvq z=vMYzO_Xxn@8cG!J=cA##NxiNIRr^Ik=5lDt1j%(8?M0si-=N(+{k~VNZx{@nbD!>UtJG4sPWlqHY|M_< z6G9Ppsj;_udukXW@N^hHim2=bURa;>~o3O)eOVgHzwQ){8^o=m}g{mP_4nfc> zk9jvJ^{RY0%Dg_#%%YR2;sOaD!HK0EFow#mLc0x}rd~A>H`X}Z!1nFnt`mtK?^|Q} z;DT}ES&GWZ9dsw<=aQvkujbR0|IUZ~{2uz(*;QEa%v@7Q%Rq$8+&|8eVyj6=PE44RGv>`6+{lPSD+`q9;EJ); z4@b2v9CE6L?oP66mX+>(00Yr4_&U1h^j0sDeZfXG|_RkeEAlSG zN)td>8Jc7(f=@s*DMi|oRM5|#Ve$X-HwCCStb3`qsvf=3MD|UU z03f&P;e;-?z*Ne}8@{YZ<;0&e^>V`2;w<~`*8!eCkQv(7hRaMJ-`F~?eClTy>H2t5 zQ%zCgeA<&WCX7qkOM+6{tI90sQ<4FLgHDvZTIGgdT$!na!Ub`h(csx|J|RlQGqrFD zk$of0EHKA#8rY+-{>5NfM^qPsEYTpXgP3kZJ!$0uYSo5-c3@K&y~am^BSmKfd?Mf1 z331(&eI9}KQ@)2ar}Cdmu5n@yJDn9h8#U&ZX=k9xApw+;aS0Em#<5o_dDaM%2TE_Q z1K$2ziI%VO!Kf!;!~$}Y7<4H>`_X~lCjZr0ZD$=Aknw7^Q`yqPm&4+sss!Vof!YkH;`oe;Ml-kJgrdIZ2tTo#INcRjOYc6>j-lflvn z2mdQCBx42O6n*oi(1E zOHwC=3(Ljr5iV$p*gI~`Cu zYy{`WLxJ~EkNGEG;wTjnUsnbAC)vRnj*}+rB`680!CF;PmqxOK^%qtM*7BKHK9hAC zN+YX#s;q*PZub7X!@bdJ`Gi3$N!h(S^2bPvBImMNGDK6w-@xC`&*vz$Ww;WXX2(1d zUd2Y5n6&ImMr3LF<6+f>dI}~XI#(qwaegv2|xxm<6 z1vX*q1O{|Z8~xhEyvrXjej<6p$sGFAa)++8^Nl@gLQ+t-yoV8NrFPnhFVkT{Xe`29X1gYuhKfPS zS`(Va&TNT1<)i>oxkc?gujr8Epe$!)z9b*Fi*l=cCuYh>>cN#ey*bSEW3gIY$S4L= zik*V9XmU!)F07v=RXpoS*3RTE67%y3kjIw9KEIdS?66)XIb zm>XngugY?}Xo;D4Ea^;g=)Z3d8odv)T!}KtjrX)m+qcdvgevKrSX+Yz_g9 zP&DVcA=6Dm!d^XHwPz^EJ-Ldi37kMxj;(jfrU~JyN|$@m%xs>TgrsjEL{yiD*o%DJwOQ)@n{{0(S5uAh=wuF1I&k7%|SRWx-VkS?S>9i zKT=ZsrkloD&UuJ&p4}uHA5L}7!65w8Bj2GBd5u;mL6@7d;zPn!Y$vBUBSRXs2sT-O zhKlqr7$<02HuE2;P_LnhdGFHL0oF2#1cj4*P-|Xp16yhtBq#wkLKVEO(_brK+~X6~ z?fPYD)+iWi(woC-#&GNSj!sbhfmN4sjN}OmA9{}#O;#8hp}PznVl2Jhh#%yk(Np-e4hJ-sZ z7hjw~%=1GV%N`3@G@-~Q4Y4rY26N}n*lhq{ynp@{234)}r}l>;&pZ+8T@cQR6WG?O zBWaLlF^l>yQ{0_KH_J>5qv0ID63PnptJn0dlF~-0>*a0pR^@(8^QwQwRWd zJd-v6V+Z96)ip*}BB)LITf>HLy3v#oIGZ`_yBf^{M=6_U%OM z+o8ifa+}|RZ~_-%8&>RzBdI6aEqV;uGhl52A{e2r;cUD3gTC1j5VAvW2S;eQ4E==- zv{IJHHwtr5)*F=}f`6onN!Dc&gRDl*V=xswW#Uye2-lQtD=+p{L#>0Ms&-3vL@)4u zO67+hO?+)p7Ir!24z@7rhAZ2F_BzHuB1Z)AuUn(Ty%il}f7m}k)-QS8nt=@W4=RU+z09Iu z#FT<2bO88fpdorzJWl!sT=ZBIwZt8sq?{be9J>k*_w0LG zY&Yi@8P%NYlY{&ZMT6e2t0E?)T^|es2*2BhZX8$y+{uhV$%P;R{471-6}T13`4$1b(Jw= zB~5qJkZnrrOj@<5sWdHm%tHPU$Fe9Fyp~Xnto&|ejB1*+mr^;Z%My3c&c1ZMbOTao zcfq7$;O@cX5>K)8Swqq$d~N@mb#qz%(F5q3PimTd#Y98m2Gt}Fw%6ck5MKv0yfQ9+7`NKFDL4ycsaL6C$p(jn4&(}AdzfRxZfQ344N zAS59Pfqx&Ixp#V>d*^eVcfy7nEly9$zz_s$kAfxZ3SNyqz|)>A0*$cOGpX z4laTL8#uUgO-EEmVZ-df&PQ0K%`=f{Ot)MaS--&<=hLMT@X6Ps2NSKkaN0mHYQ9^T zx2~om``*{7YGu)^DDYro)F*qIGt@8IA<80TUy&rP3hZ)uytj^=*=UB1p=ck3>k$2A zb^|C);>a%$CAjO;KL8%`bk{i5FJP+RJpG#V?U>Kum$|BQXhc*Qj(4o0gCkTv+rrW1 zsNI?qx_?jGSczwQEYvZz%UEtjM)G@k(e~Gfo(WaaDdH{0DlO`2{f9OIjpXG4bUGm% z`y4S;n28y0A-PE6c@VGPNtcZTQcr1b_)Qy=D|S4N@biS~+>>KTVvEVmSFymE zsyd^?8zNWsMw*Yg-kr)+TYeZO(2xSoHCzn9lI(FpjY6tLGQ`#EOD@fAUl!*wS|O^y0$@2y9Ry2mip+}v%b)-sM_I-}tD94ld8 zt5Wbbf{AK}=eyatkn1VWot2!FG%A+2%X?P&!8AA>r`?1cnurTR>7PCXM?^q1oq4BY zT;Tx#4(^Do6HYn?TfR5L4gkTgI;W`%i#)?l^foif+ z@dOp5g}^stYS}eei7pOoYn(S+yrS)}8;aw~ft{X-FWIx3hPA==keBy5J}WN}J3g*z z51i>MC4;X=bqMEk?Pd*FWyib9_ssH*_7bSV|1BK4XBFaNcvivF-u1is+T5_kb)GLz z^^r3;$3%Fc7F7OzIcBqr@(oNzG8IP`!br3TV-?5To=>@s;83-8p2vLzTr!A`6%gTL zT{iK{rfTspG)8S&<+E9LQ&Ul`i~`aSzf$<88i5W=j3LBn^tx7I=ChPe&X+d?rmcV3 z9hyH;f&&~Hkp?qkx$%O22t*{r`#eQN-mD8EP}8wF=w2~!hYv+|hf(>rWoA-;pDF2M78#h%3 zlNyV4tUYPb$Aw1_sMS4k$yiZ24~|ETwl6^-aHcp@taSbKgSp11@l3qYe&v9n{LDgv!TQUevxYRvL$J0Z8ev zuAp1Sk>?$G>7y}vPB)Q|HdTUD6S|U0gaYKcftdQZJA{*mPv$_NpL@mXS-+t7? z$NBKf&&6|Y!iYwoS7~eLRE+e%S;cP<>?)TNQC@W^r~X=a`d^HLN0;;4&?b+suRb|( zQe6TYUg!P5w)}%8141BYD;1cxg|f5J3d&vl=l1-c%Nu4 z`uqNG1#Z}UazHiOPxp>{T_t?&d-=1n%Ca{AVb2z$P+cn}vD3??TP|g^eig=Fk1=q& zi`e{s;)`DP7_#V%#HytGxl;Q-^M}id8HSpn#@Qk#{`lGRz_$CX!1u$j=A`2jZHJEn zOETt=`yJvT^ZUTQR7o+>+V}Q;Kq0p8SsKjee1hS#4&+LXXoK5Uy3ZOGN2640j9?M0 z(go8Y#ir4ZHB;zQlLh6MceGyd6M_e2WvCka5t?cSW{Yx9zZ3{h$-XJ-(G!#&SHkk? zt>->A^ifBD=RB%qPpe+Im$aZ>QCCNIU6r$PZ~El*7e!j4xbf;H$Fp@%9-IQ0@P}cL z1NB?~C00_1X$Rbmr=8avR zeLOtgFtqw~xjv+hWZI3CyaU=~(~pP8|K7vn|0!DAr*uIvHX~K!vucr5G*|xeW>TZf zISx^}uwb;>1XD0L&Xd(6TZ^s_#Be~U@yBP+|8@?AUpda65{lTTT~%g>|E;?wcP5jp|q zDWZ|21#L(%(Q%cA!UKQFY4g9IJprUw^)-m-#5;b;J-Hq1wgt%xNn0t_63&6WHnl0C zh9UE_z7m>J{D{(RM@?efdL30y?WxF(Te%@az4j%&SfXJAOrxxyZns|A?H_$?{r9;T zMoeKrMTPPSpN~}CTIbQM&y*m&_jz~pbHlo1+NCfDeb&dXK5F8BYfhMB#0%d)wkS)K zS?JhB^BvrSf5N!A>cEoEzVpwOE0ca!f>!SKo846G@wx80qh=VBQw%HD>owewfnd7_ zg%vI+*KPbHeYiu}n(xlg+I=dr@yd7l_@>L# zfl9@b#~=BjPBF~Y$2X70MmF#ja=t6fhk~205Z{Dbb2k=vx+f@huJlqqdan#F^MkGr zEIBJYc7hw|^kq-3e2Qe|k}E=EK|i>+RR@w9Q720st7IkfkDBFoeYNXHLcQ>rK1wL@ zwDK`IMYWwOa{iufpys+HxMQB>#gy*PD>iNCs1YN&iw5i3e$>%vn047H$!u9$k8L%f z?RKAb>Pr^y|8Zk2eS#G0lF!SuXVB+LV^;p?-k+nFT3FSd%b@ED7E9v&X0UV9*zD`x zKWgaaq5|am($8@PE-jTu&(y}kAIk8E_S?jM+~A5aQ@NhZQ=GJ*{@tgP&c7b1_CWqf z3u9U(?_SR(W2Qf?87S8tTgtRQE!sm^(34HOkmhIZ%4vNRp4-_!>6x>obnJ!4OLSo> zTJVA$xdomK|DsxRC!UyBxl*$1q9B`s!vy|7H&=ADVoUp`=9+Ouc4ceDG-=@p%R9Dc zdzP&^G-Q$K^XYQ0GpYQbq9x<|!k3EfD7cHMCw3w!6S3@A@j9ZWbt8iFVoNUBvY<5e zt-^7XJHJ8E&{4mZ{KGr#`qXQ10N3F=ITj(%<=f!71x=C?w*xQ3NJmz9^XehF{asZ!Q`v%@o<=nBz!D$ zv{AoKwZb?t*N=I}r1KztdbxK1D~m10@{*BzJ{RWkSx;EiEPbbw4Z!l)QG1dS?QD0l zt-Y)rVJHkL@9DN5DmwtXB?n(dDZQAjWG#5h&LY(%q(@J`VfP{BciG%@2cpuqh|@1@ z$K7&;7e8bPPixs;bjdC&6AY=Nqgc_S64>IT(%Bsa(^_$Go*k!LM-WWW&V{qLghkk( zeKShWF^{#W=I-hA9zDnmZd8z;j?X^YsGWyZwD#?kkStenz@w@(C0PWYdzK6FWb3&{ zcE>YApYrQGC7qi2FGX`akBp6+V^33a#G~CVI$}{(hep&#Zx(9&;69w9$z|-^QF%@Q z@$Izd+!&=UzOTYtNAoKC@rYTcjh{oF@9^V zRXg#B_~VX**@mDFw=g_`Dw+B27T(KAlZAx2_$i~@JOXOw;-ZQ9Hm(!gShM`5eUzK< zSUAsY(B%1QKdRz!XKLw{*>&_8XL8jd#^UffSCoKQ??loHg&jugX^uXEIS_g*^F0P{ z$1Ap&bShd`Ebj^JvO#3$Qs#n7KK;RB@;sn~c9P&wJ|R=CY%^LerdfsQ6!E==a7TC^ z=U0iBVak?RTn{IdAm49U`#`S1-736Fe~C7qC0WPWr$%cW%>+Y&nNdniZLUGMTWhlH zVDR#V(F!oXnK%lbQTL=&LK79t(j7fk@H`sxbi986>r%jWONWmMJM)#S=Il}azFLz# zqB$m=)DAQ6+p<4c>O2-&e?54>L)8n#r(?W&QU&iaNztQQmAt``f=36L&sDrWtMRUi zElJ)~l6&w*+5TdT*QdqPOU{;b7wKrfIE^Th8sB{iG3(_q(b0F4dQ2LfHhz#WH&9Y1 z{r!%vh$={C6%%C$k$zeeIFpVbeC5$LYF<8KKsz^a%v%RV+vA&B8p~PdeENn<<>Z0K zBI6J46yi$ZHK7h^HP8aU(@d4f#wt`(tgL2V*8u(+_5TIU3{~oPD9Y$PRJwF>skGHk+lLGsk)oo)?a}oVUdBMa>y4b%NU3a6(Jf_FgxM>|jH#X6p2kevc86b+G+u z;c?;RNbW#z<%~jz&74n-h#AJ6>GCyL(IzIUnkb&7LoCu|Mgh7^g_U@}ymP_Amu^11O651OKHS?KJtAH6h0H{pG(Q2nS` zcRtBxE{J=`(WZoF<1zxyrc>;de)nE5v$b}JCV5tpew~@8^0=xqo;ks8^DOc4q5p6sWv}%j=yOH9bmqw=#U%b* z6~n0~{gZN+mZR-;9J_7jjFf&T0GOZ#P1Y?79s4s?rbV$f_3$ ztlwz(P~HgdBV2ZWu-KCu+&;g+7$J((epvXqKPRcgW|0O5)vBv6Ntp9v&o1i8O3`2j z>OV5FeCM0|xx_M~%thPAKK~^C#^GLPi%PWdh~6qD#yLc8@9O7ugyP02M(B<&l_Rh1 z^|m><>ymQx!gG7SyydUA`jKYU$@eE>OeMnmk6XpiEJ)_`c7FRnNFiGzNFyjtYHsX_ z3RRZmRV|Cc_iyJQ>|nPrkJkG20)x%@wMKJ zOg38Nv70p=W3_9^8JYrLVK$8)P?bcG|6eo z(_=qbqTg^sD|`j|;e>6E!(y4Al8}W~4N<2p zH64h}SSy;gD3rF>%<%*fa~HGM4g7t+Zf{DHW%?I#oc-*^TJX2RydmkhTkdA}F41=V zJ>aj1C@ql&%@fG=o~uj=ut3M0n#no5UtNP zfx&i}FH6<_Xq8^P7fL#q7Nn`@2H|$57N_plBg? zP=!&xy|1KM#b(j{H>ACfD3=?;Sf}DTmI+EWzcqA^2ZE0_Z&1IxjvO(zX7KL)FchLywLFKgUQ7;tl8|}7{KQ*V5|K9;{%wfq)TG%F zjWO%rzh_?!;IOPZrBTIOy84DKj%n`*4?!?4vyA)f+hE+I znMWUm`lzX2np3q@vJ3OjVzej}4=fkoi(mAdC@a=W)}bzg3+*jB6#=UP@7I^QAA*DW znc#^T|0Y^zyd6AVTHi$I*4BUrO#DAvWnVRdM)|Nw|Np$NVdZKeaYUTiPr0cJ061ewHi zWL#HkKpV0fhqAG;|GkPbDcJTNOYt=lY!Dq}Ct(K_5#jWmHlKJq95*#|GwnQSh}mm1 zQE2JOz5mL@EzT!0z9VCvl%4dxs3u$w7rCaTNw&qK#ROJohTciGD%&{O{4@zSn3R`_ zyA_U2Zn~E^s0Y!xTg}HB@ip$@O1HICwxlGgr;Mf~A|eUXmKnw9FWx1q8^i02 zoz38^MsyYRYWMr28w~4iLs80NTJlHHK5Fd`%(YxztIOzBT~SKz1xw1J#aojYyh)*2 zWJW(_Q)_^u2w-@+`zm~wA>$e=&#%T|^JMmL~p$E^50MKYDy z$`+CuWm}ULuGD&!!ZO^jpVDawP@!((UBW&YC^aa`^#G%rMBk>`vi+pjI z5T9-B`k$sRpV8t=u}%Po#awdQo2^WH1{{@~o#V_AWb@J2h&T3Dz0`JMQuuw$!^WZt zQa09DX%m0zZ*Le!z%&C_gd!JaaQ5c)2x-sv2SwM1oLwRIHiM|LDCq)%15B3yoR$cA z-eEcq^EV%K(*}$1(Ca-{qJf4W*XEBDBQg`Q0Qq{)zi|`bX2%m>=(w-H)0g6QkhN*L zcb=OaG_GN0YO{eal}=?2EiI~lW=96p?Vq$0?csQR!v^;cWbNU=t)g?ad~Rg84Y#{z zB$es0mCZ@i#x>WXkCHN=_Oh^zJ_sx>hHmNO5v`b_1l+b(ruWoBE9%>9x}`DZ_6RZu zM~dGvq!Es@qTZn$1x_3bEf3#ME(9DP|40#hc6%+4_;TBe;+H)YjJ~^0T~WF2E3a_#qUvJ>QO?*&XG(sPK-SDRNJ2lFE z!=-frN+f8f(jNz=TP(1%r)t5ge-qz6#tuBKz`YiMgK4V!8X-OO1Qa{MZqy+GtHCG> zyV&O)7Bk{r$Bk`Z5RKhLe3%2m>b+q{Qw;ZmBledn6j{n2e zC=vXKTpt!qT<4=h%tYniW;Uh!^#nh;3dIX%_eKE;$33!>3JP*@+iKjs6BS| zhs$-Syn-uY5dpFM3M$fwn(L2P=3aY2YqGD4KV&J`8?G)@B#uTbcDG(W6mLYdtX6>4 zmtyN%4BejmldA}!99z>eiSnr0Q|aa^{T%c{fip-!VR1U^R4M2e$o}S~JRDbMh7_935(9r%jrfIUD$-doTx0VgBw@!SRW7Q+% z8ukgT^Pt%dmXw*|TMuuMuhowvxky^&HX|+54|l#_xr(|qw#@2U%L%M&?gr;@Rh_5t zH+de7Cy&CbTkhoCQ|-BHRfaBvbKgCP#*ri&M10QVIXy|YE-mVgzJ)+o>0zIUy=ApM z`tx1=VOjg&;{x_9pF!DZy?*hKaA~jn0wrH8s&>jXzLjdEzoTDvQ*(ZBhB-|+Z+rk#Je2ZGe!$^i$4(c2HT|Wm(YVydJ|U?Rmx@b- z|7-&j@Jl8$l>8ZAdLuD0ID=>aFOtu`|DWjjPmBKR4Oq_|JLB>#Rs0b1p#o*dsDiv; zS_0Wy+G3_HZqAWl)D=2Bi30D@UTy<1Kpb&;4qI|;^^D#`M)8=&kal@SmUu5fZg<- zD7Ti~s{A2}e)i|R%OBn0Z}^&6(7J!B;cLf-84=*kJg%JKes=_^MRJEl(dKLyO?w^g zg$3=z(Wx(gP@-Kw0PC6_a2__`9XnOY_#$dUN0eVJXbe|F6){LyN7gvZRt9hWN~nV@ z>;y195Y@S2lLv;7CbPbpPYgTTPUEn*zSrx&+XQ9-I>b?KBVP)5_q|9<`g*0W5EtQs zsipvlfVD%FGdNYVbW*UEYt=a8yqnlw(Sav+xMZ?Fs`>M@MDEv&3F%81>vy*m4*~rO zjs5Ei95oZZGo7%^xAQ`jbKa*jQ&s2pml9!qC9~-<)JU*IJ2$AJP94F@jiX8qnd3cc zwf(-bIwnq0A6q_}b{(!~$3#6CR+#)+LSZi24(2~!NYcCi4&?Cs`zlj;Dl^%yyc>yy zceK|cVA#3#)Xw&)=PZ2}+&#pSNi~0m8F|9JR_Z}q!8vGrdVl6>YIp#L8cQa;NthCN zRNhz=fRjL6M$4KGaAuGR=6K>ngRXdPag(U;^3#qtR(6XvphIRnao@e+@8A9pt|n$i zk^4d;^pw{KJy`4Dp5Ykh)-N9aJg;>NqB>FoOi}HO+x53`FJE?;}B}`Xx zlbi79XZ(m;)h81XK8st<*{6f`1KK;^mDB3hLQG%_9%CGU@`jMf<|{C@oB8P4g-JCX zK7lLSMFmNVQp{XFi1F_pp=ClBq%XWIlCglj0S&Cvk|YrgdP(`27%SsM>H<;~b3Y6o z;GmpyimjXmt#4B1ihQY7Xq$dT`XkH=`sEPJTEBNjQR7LUjXPG9xGKvXc}P+}Cp+*8 zxCCyiLWhmw(Dkbar1aU1tD*z!4T3&tsnQ<%aF0Xxkg`o&bnQl&8uFttw=gN9S{62N zNLCN2@o+2N?Q6B_dzig?)b-L$v3lI63f0PCz?aYvZHy4x^oA;{9Oi0}AfA z`mO3~Ta6LaTdpArz?rGv|837mu-Bn`O)T!`G(fCwBRVN9SjF3)M3qp@_X!Bbl()*R z;3-S$x|i+bT*nI6oivqsKlF&YzK!EpR~Z9yQ#Pg2ufnFK8Y~ay8i!eXi{1EhRR$A| zOtnoa8znUX86IJ`RF>HoswS;&X>R~jk&6Wp!Lb@P;rt4s|KR5-p;xEgxUCxD=MLI7 zU<;*EnC^w*=oR)EaUEOr30k6{s^fpHO3}9LOf8sRQaA*hH3 z_|{e#MH6Z;y+|E5iIzj^KJV3+um$FByM~CCD_XckU80D^d(DjhJ5{VqIbZrC7T-b0 z&$`Cq%n-PRd|$bih@}as;`PJ-0Qvs0ii;*_zOpIy7#-gzv9|Zf>WSAn%e7>hn^0Wo zXSpw=G7$3by-CS&xSksF)^v&LE3ApFB-C*U)|7SGp-btz0#mX2-aT$9Nr{|El_QQ{ zDqCW--Y{_{2jRo+BsizpY;rQZyd>ILYOG)&%!A$a+_v%tPa2+aQ`u6rndv&Bs@+k4 zq@-nC>423-!{BJvg<&gLp15WAPK|=`XuOM^ZbCd3@#Drz!wJUbiXnZp0b?BJ>F2cJ zQgrBB^Rp|=VA#nLs;RLd&hWg20xIb5X zK4fTMINhCR{HBx#1`ZyVpToh-ey%yCV3TcF=1lY;k37z% zTuu}W#Cp6@$LGX*URGT`?!rE92ebN*s`a-{n_pK!)oDRgmamXCcWh@bt6e^Ap#Ywg zs1o~foPpr)-|-5uSzG|0-&IRk#;a;OjmHuhb6YfNFzv38;>Ybb;B!%!v{3g-H-4p5 zn^alGzDIu0w(*2hO!*e@#=mbjhj!Yo)rpviSy%gxECJg3_m8-hQ+~0TnFyFlkgNkc z0N?S(M)%J@A7tH_VrmD*!1(-*8oCm=V7G9Jk-8i#6{+w zM@z+T=*cz*U|gg}-BsS@-V8cm2{StJ1}P3+ayj7`Cm&2ngI5L)Yi)@M+L1fzJliu` z6hKW8Cv19EsUw@KY-;fa3N`lTLRotc?HSxQVnVIk1iE%_QwuR$P;`eqw5IQyAC*86 zoD#-~re#Lb--43A9MlQVOS9^zGi&3PdzZ*jcJgv%nPmkRgQ#68X0xrk_{?j8Q z5}O;bHmIa)U7JGQh~21<$fOhBC>on;_)h1qp+avM&-9f{^e_7n(Y=9|Q)#ioA zjyh#4_+IS9w}vV7*gn8q%o%he>kq`T&S*|fQWvH`_X~DSlXmjk_VU_HpUihNL>$ZG z&5`@U7AJn>S?PFjqnTCTA*vPjxvI5rnT}S|> zcVH-@&0lyr-}Co;tgy!6^j+x|A3%|wfiBCgQz3mF>-sf_`Ub=+`kBy>CZeSXpg&k% zJIl&r!ey3laYUW+xQC@ZlI@%p{A476pF)2_Cd!N($V%%&F=4f$Nw8Bpf>hf8H97NS zWZ=tNh;_0uJnj%No;~#p)u|BN;W~^>OKuRy>65Zz`4KeoNwT_DmzkBBFT3$Bi0Ull zoFqR2NgC&2FINM?cK7#u#J&r_5sVk-m&|%;&JpuX_n@y$On6L})yvM5H*uQ_}6N6~Tm-=D(2g!RL zV4Obh&BVQ?#;fw>FB9hmBs`7^8modj5u+Y3w78Zwp|_oF{Dx}14I%bac`n)$dZv6l zT_-zjxiEEGvIPB~QGH7m)%MNwvLI#cPEAOTU;a2K$DguXe z;X+ImacQ3L7*p1~6Fcuu4my6@!z)DGysyiRB)1Tq=E=cvTjhsywpEB8Y%Dn7Qk`@B z(yIESuAfvXK=j$?Vehkt*FO#K-*`t~19#8PJC>c99FL6^d*Qw9c%0W)ittt$X}D;^ zp5bx5iNi!h+tFD~CHyhbzLK?DjJ4iQglHXQ8zZ8=Ek5w6_v4Xx^gg+p%o9(c3VSBE z%Q(W6)=r-WZc;K8SrjphP*bY(G~)0LWenu5j;f>Qaf{C;p}AfRa1wEs`^JraLLoRZ>v`_6*M zu#Lr@K1T~Hs3Os8SlDs?tn6108KgdD=FayE@Z#5wH*3FO@ZIj7DANui5sMx!MGf4Z7aA#!^F#3s|<6Ir8oA3nVC2q zavH8V8U@Q6*g0oijFTl135vh5p}$K?XK6vcYIW?i^2d-EX3RU4<%9_!}gF$U; z%yJ!#7;;F%+#1)~Yp`c%KQTPkeVgPoI>s$-cC{}BAMkKeppFLl-j=<92K+Wpe;VT_ zcH#|(I?g>Ee)T#@RAUPb*2fX3AKpg6zoa6q-Yi1EhMp$*-K21+>;GVba|d2%QcfO8iDCFgt{%I@s-rgYo5S@rGOQPMkK7kg$G=To&yV;I2+0+ zZUEa6H%gy?7keP~wE^PzG}wYVgwlbl$Eh@^mzpvJCkggqz3tcPQaK@Pf1j&*jxlaN$vym3 z>qgm%?BPf=a5j!G>)owZ9qQDHQjS?^oVveVlM10{PlpKY_3HHN^~2A67zCe#ZbGC4 zN9$6%9ML1W`&4oaqnXNm@)@(PpTiGDicCw8&8G;tW!9%DP}-S9Q-ZL~Q1Pr!sk}01PEE&9St8 zp-;l_(96GjpntEd|5mnQq=?r(D<%yd50AmgHcAgY{kxPbyx66icF{~2Tm6JlsrhvS zcb-JM3}Uc0$B0U!x)P7O9f6puK}yFw%k@Q=F2slpSs-ByKj=~2Jcn7)2zanxBM!}T zX4fGCzh6Pg;Nm1V;y6y+#tb6J2I(jBWZLb-RS@wu$Q_yI%N{}A0^Hhf0)g%NC7d+H zR9;i72Se0bc9RPU5ZgAJ%Vvl`4Bc#HJ&0HvWVOtbaPy_&Ai{2tk}}V;{e4+5Wh~`l z`mV#xHiAV~K8rMfO&KoTTykI3Hti@#AB3(!CUJ=SrG1YPx3p`r&+7U(FKKfbo>&03 zBAx7UsfdEP13ZrLq!1{Rg*`-ET`2%55ScrVfowxytd=XY`*KNvD~DN5I_0vfyYRQE zNR2125!Oj_h_z4wU=8nTeFowfa=<#y#xAZd+ADJuChwPE_cCzGXWw&5Mp+`08}Y>? zML&MvRxdE5D^7=R=G$KbjRA94ivAYlJca@D7o=z)ts+O_8(sCT%zfFWFG$$l)AxS; zu0~UTdsk4`kTRGgZUPN=VgRL6g%1*!*le66iB;nusjIV}}E& zQDcaq{Sk%`&oxnk0hy;iSv`ALw|#9nCCg<6V%<%w2n+_5f3y=nY@5LI+Gk^SYxRiR zF*v70Y@SHlwTchLGUj==2kvknOLv}0n^*~Ulv}ms_XyAiTS$on#eU319@iED5q<+9 z4WT6&V&6t&c;V;Y27s&^Z8?FMU$g=J_H;o%2DpW_39AFkENTzPrZfqAE!xX?Yj402 zW_mA*po@HA8t)5A$MXHTB@1d*zeKze5!bQ>2^K@I)VD0Z+9ym1T{L6;s?`xO#CVZ%$jh(=FL4krYn^6m7k@&O}bJ;Ei6FoEYiaB4E+9H1q zrWJ)yo1}REbQ3@Xt*8!;#eAo}2w!fEO)GP_B<}bu7@cddU3fEpZ*bfGJ435~{Yo7` z0Wa1?9?{N}s*FrPKs49Vq4Y?NMatrCLQ_(#{i$$7#FTNg^>v88dj59}&`mQ1BEE(} zwA!Vg@lF?A8@~DU*rKU|&dbFs2iN;Nok8AI>6iLY9EwY_I1m^1Jf}85#RTzC5R3La zHFh@k31grK#gKd5{ZNNc%qT`2gt75n4Oj}+hrwn8#l^GzLikJ(&Gsis>`OrGd(X(XaLzp`5O~PSG%@#Aw_qU@lxs*T z4Dy5qq|CH80CiU@XZY%Y`w2n5V9dO@o1j76ujY^4c6tw9qdyn7Rn#8mqi^0#Rwum? zMjKQ{a+_BZSbFL@%x2BEw6c2dQ{erythF{V%qxA%8{x>ro_nV_?)BMMgAK1RF>1XRf%u@9fAH5JBs~Uq{9jMQ77ZaDOAg)b&VkkFZ zZun4SuVJY|`WXGG-FqQKf^8j|c8ly22a$x!eM^q5yvT9TM8BkU&3mCb6UO0Gz6SM- z`hP(9+gJSulRdv`!9+9DWNka0^W`RbOmz%9UCITv^~CGgMW2#U|B_!;UgJM4(jU{} zfZM+JbC_V%?Y9F9uh~#vwfv<6{ym-jF#-Rp!~9*57ng7AB(5sArhlN`R@lJUitV8V zsPshd>~lN>fY!#}eB;h;9Jidx^cXcqy}PGR!*AWmh1=+8PcJ<;gPqus*S4WN!~A=t zK?cMp-um8Cr(kJdZ|fKcS(R5&zUl;l<;!K?h;p7*rTs7iYMq67a z97&XtKP|s5$%Pzn+>|kaTMrByZ;-5!!tpW$n`@0FBgnNasFE$fA+on-E8n5Pd)Ax> z#+VXc>L5#=u@tyRk>Qw-I3Fx$Auz4LcF!T>QX=XGu&V|yz~Ym72H^XF>BI!0{E_A_ zW??nrqMkPCg!(&3MCc}Rb>Id1Lullg*IEvU^9x5C2v8d}ufPPr?4%BltsTlU7(! zjRE0E4)G(L|07eu{{)-E3C4uWn+?W`p6Uns2X4RP87xdW>6`a_C+WIki7PAj`Jfgs zRf{0|^*hjgU_So_wEwrhLmYkjseYT3HH5$u3;#@NOFf z$#1r}{SmqUkyhaUA|bQ+ZeF`si+} ztoRy2$|EQkFarJ@fdAKM0SxtF0a&G-#=-A&%q@{ch7r0SvHKqh1^(x#7nJcf<#jTj zj?39DSb1N7Xh5&4katt_w-Jd}{4YZHfw}M-I0ZVT_(^^yj}vsL6@=2vNZ||#=T)wC zXXSk{ste5D=@M-wSb+AM`9A^a|33SGQxf7L$_;K{+9s)B-WLBY*xrSV(G(JzoBBd; zzv)Nd{YScj|05(1G>h`wnw4^B@?%$wq*P2y8NEhi7q;+@U-)V9jFr1=NIDyAUTDdI zUG(1#>Hm3Rfcdm|t0Bt={FpDV)GoN5y8pk4;s4D<18C&fz`;3I`7GIxw)j@<(Zx5-X?yFXj9}3y__;{Y zYZ=$L<8KNbu5-S6tP#3radToS;^WsJb@FjS{NbkoysTP6cgBg({~B2SAI8dmi|hZ` zz@7ghW5M4#3iR@A^p#5%I=ld&dl?Mw>N^>^Wz*(D<>ywEcQE_E(&WCpzW_iF>FeKc z`hU<>_4yBs={`Zi5^Jjc0g86QOm^|~i-r7JrT4q5a}Vq|D+gb5b_GDu%KAaLW$UBL z5H@s11w=5sc2v#RAOnNFH+QWFfQAxnKvq})`NV&!Lib%vt$C>rYkcF5CF5>km#WX* z4D_#B`%d56UwLl5gH;?i0;>tQ%2q&mb%tzZ2v4QePP_{w9tX()&<@Rm-|!=;xWj1G;nwy^$Yr_}X!Xidf6EPa_x5INTe0 z+T$pjGQo;t-Wx$~XjCsHtCGwcy-Fk zY6Q{}8CGdoU$}Tv>ENpBFTVOz)a^8soi4TI-bLBkvrrzp?Nhx-*Ihv@DEjRB$))N_ z*;WX7^S2jv+02&$A+r}7??_Z%v#G$&^*zkjAek3=^*l@&WF$ubN`w%Q5WHER zy?WqJ{tPlQFAk7hxr&84;%ij&O*VDVHA={z$gg#6t~PSshJ{1q3=quY&;GAv!;A2W z6q|{)mzUeFahHa+#B9*Mp%vS=8NA>() zoD`X6erV-2GeRW`HtHQ(J!^L3iOhR9!djSUeFWy(uYzd7gQrW%2$0_WL<7o3wj4C6Pz*XtMrJL+kZp>IwM1ey&7tEJ^vPDtlh9uLYxB<0y-{bAf0d)HUdZ{)UFR5 zpaH540=}>`6~|Un<{-A-p&~wLQN!6Qc*h%i{9+YiKu_6uS_X965M6M+<2Bow+ULa0E0Rs3Ve3a!wC4OsV5LrLpkNA|=EI&$;n ztJ9mGF$UUPd~>W_?AMhKkm!mI_Exp{VATr(WSDwI2XVuymtF{r)xidklk4C*e|kYV zASkbboC_fVfDdV!xSV(#F~(O#gh}mbXPDx}t(gFTB0Ln1S&>@+DLcl7t=!xn2}al7 z*9ueHO!s_-2;)+*&CHddWr3onnS~|Psx!MLDMTY67;wXQ0LHi@qn%jGGM*Dlm(*Jn zcRohlzsmiu0W8i#<(?$f;8YiHW}>I}=>JpUiGLGfZqNQ??C?VPanI15005M!1n`{R z7hCuUQ-BK9kq`VaO!9A%pW(%Wl_@Vh6ERPFiU`cJqlt~GgC}2{lxqzDaOD8R^yW8nNNMn{8DkGL?Rwzl&CIps>`YTq&7_Z zIYCJ#{XOXmTq-p{qi$O)04BabT)c4t*0fZRJNFi;+-)$(9iMQ;OcPfFDC4MspVfB& zmmMDt4?BrEV zo=kq{OOJd^5rV@>ZR}EQ;jy*S3itC1<{q=HN0;$=m}9e9HNI^<#U}@D6ypJ<+)e6) zx5+TFMJ~Ssk3&5f?d~a7nog}5jg}O=eTU7VyZ`&pDIAP(<1?Iz@qjr|Nlel|4`yV;2?r2%Cgi|!f%l4`d% z_Feb~wK&18XipC}(&X6DD2hhO-B+G54=Du+7zqy$7$bbKiUCY|B@KzH8*iDt#}BD&qBHcpbA!{^4OHF=5Hj&?`- zg}NQ7s`+qg{&G>Y`i24<2P5VYd4GWM)Sb}@6@f6K+H^#Rqa+V~w}qp1nTp(vI@*~y zZYjhz(h%X;^>c6WB4YeT5Sok^Hf>oRU&IV}Wo(0=l3Bo3jaDfd;!lG!W~y1S-kZb$ zwljfDJ}LY&$WV}O0%1V$h@zN`quS}1v_kUi6oc{HWX!MQ@`c+et#6$3^5jyIFS@s! zPdnN)HIW0K362^)Y6iDtcneZc^4ZIGC6DD>%k{Wa%}#kAFUvU9b#ZRElhf|!XCK|& zet8GVCwjE7n?35V1iDj7JF(-DM|=L|Ec$Z!n0MMHwdVyx6rw>a#)DN0V5qcs#=sH? zxQc(^2b1^)Kl=eM`$H@&AmzLw5KI?&7{-#aN0B-~7X#q1R9KE9%$Y6j^955meZVs3 zxY;oX|N0e{rd~J|rFz`!_|P6Mb>NbPhd{-HonCh*)3|P{%m{Z0qyya1i!|9ZrX>sh zgc?r|!SLEnmt}kymk-$6??G#AZeg0iF_?1JVhbMhoxWr?dv3IMW!8Y?n2Vv`)L|6w zB_S7?_vyL-$zWvte%KATKfL}n%^yO_(vUhAj><8cJMq}>LTC~D6o&$G)$azl(kBz8 zE4$=ITGGST*Q>C)m>M4dtrCnia9CQMupE;{FWNHlxW?B>-;Z@lbE2#z0AsICjUgHs z(U2O~{R9z99uT~PG29W04(_{#4)bs| z4wpr0_fe|L+$N)(>bALL!C>zxt9PiL;G2%4s}S;nM;JkgqElbKS=%#1F{am|{OuMk z27{Mf_@;ax>rdFmmApG74#4ZK<=++Vp2WlLZK!jDZI{jX?LpWy`Io94RPpwNZrKHJ zQTP(J5a!XLAj!pqY|l9si!I}sk;%Rn>CdZOXoWFQO&cXOU>|ujwo9Iz^PHSEpXHvI zVRmrncf4t#;P6axvm1&2Egbo0k-joz*hFXbGML}6h9)npg>6dz7dSaoC%=zxKPXFQ z_}1=B_RP?yhDYGlY>=;2z}Xl9rwYaAKB-!UUg@Ly8uNSd0two!gt% zU=k9=y%FZ(FVOP{V}#W-(-ppkRV8oa=@u{>L5uVqu7@za3h zy@;qoQoPH`%T)%xC}zIiXXM(@HHb|hP(}{2%$GMc%6k;_Zp96)Ux4p^9;KM&9`|GJJI;BZ0amVYFy^dqZIP7rF6N`&Y9-FcWI z%zDpEPRI@$C%#iK5tUaL+0=y!GxA16Q3r_OU6;3{dv!cU#%lyRL{0d2cl5Z(nRUB3 zpRsDOxQ_FJeaWQ-a06$GiWv72JMF8)Iy-PteJi3)av1S;!n7Kd#)z>1o|EF`e3P9P zmn3tDl|2QBi+8}=awT3gY$7cuxZbN6!@XGRnL{oc$ZeThRFKHO%JSn^nwzg-&M+>s zg^Tunt8d7i`py+GdnlggJ0se{8DIu^C`i|lF-FuH36Lidn?$(=hk150^_VgVolZ!U zb7Qqbiyowr8FhYYT${4lcg)&1y~`P0bJi(fi4yC4M|Ws{*ZIoRPts8I`- z_nz99TwMH~oFfKME)bl3KkK@z9>odlwwJ4Q-`dE$?mg?N$``Vd4jo3=A_ziE$l3e% z)v;tO@7NjHPhM`hv3dBC#U_|Vi7zI82Yq6xo33^#tpWZbz_mVAtRG&)OS0^66k*k} zp4Zn-H6Ax_^_+_J&f}de&MW&g$~kDX%p}qGB2S8?Q)i7aHG&;>Ov3UamL91_&|~MKJ+Ps8NIDyfrVX(VmR&Y_0C&W^WubQk>2j7# z+Og>lIfz&Um?K%(ECj#p8ei(H0v*|sVn-_tj5TZ`+8-MkUf+|SDlX1)A4_@UF*?u| z?d;N4DrnP6)*Z5-zG{Hqm>HfeGS9s@t$iS6#K^GOkf3o58`EQo!#=6NKS6G8oGor| z44ZAv9~rkf#kp*k!@2A-mt{58jT#wu5nOh+Ba1iJ%#B@y$DrKRp=XUVB zF&2$drw!>eSv`_yhQ=*UTU&X?m6rV_;0Vdq`9v?{R>Pw(aIC?T)0qnvuj&;aD!+88 zcvx-BUu1+q=_;!VC|7WQO&SUI)Vf4vuIx$~THWb_glWvQcyuY|;jV18;C$8X&Qcn2 zQ_aY!!VaoD|otdd-g4 z<+IB)J@V6K&emixY|bvvaJk&;RB4?znC>=G0#N9)*Um6GudN0B>7%+qW6m%Q+bQSI z5o&a@)_Jp;UNJt+8Qa<4LZ?yMyjbfjI+RhQTy38L>wPZFJ`s&KO?e}OouebEu;&Er ztc;A4oZOn@9xqlC@)W42Zc79ZkyUlD)BKW^LtjBOpBd$ zzSn+oq=4MMwAeZDQC$&Bx>FFRpW4>SjutPg4{M9-FeNxs+e2N@9kWx#;vHoC<@)g; z7mcpjE9IMEFtTSQ=Wz$sSA8}!Eg46!@I$9!#sd2WjJ1gtE|-XMyC+;_ugt+cdc^%M z+08jTvg(+9TYa|E$(iBo7D>GF3?on^x8I&zAjZjKr=m zj4oyLyc~U4TxM%iP}DJ9caWXiU3QkipE=pm?`6?EP?hoj*n8Koq|>);w8kl?DRr8r ztW231|C2LWT2o4jz%*@~rj6~~l&LAXMZ`_w27$`b%93fyEKRMfEO&?~s0gHHRBo^o zK@f0{vR4EY1Qzo=>pj+gt>Zb~_se?U<2{bGKJejY_uE|eb^Y$^y3YGNOVSc>XKJpS zA^FBBUw+BA3`E#sPqwVh03c?gI+4|oNRBYEvP4VTdM;uXWNIxrcJVyJX5mhr&cpb3 zr4m^(tc;|EpklEOkS{Q>@14Mab*2)(Z>R1{d{v7l-YtG_(LlYl`@fL}Shxqm0j@H1 z-i9F>)2&|T{#XGiI%i)SQ+UCAFaDE3TUF6L!)M-7y44@#IL23$XalMkJ(L5GM$`~7 zb;sLXFNMBu1=<<+;n?T_wZt?=V+7#JP3sjVi;kh*t#_5j4~zVDt6h|yEJ)^rE22z(2r9TZ zsIQO>O19w06G_zh*HfmGVSaj}Razx_Us(sC3N7o$Ev^QYx7aUE6KHLa6xEiCLwNI| zA$vE6a71CK!zkL(vOGCvCLELyjT;b#{e71?OSF!kwNuuSlv$tMVw6W_H?wCAvIG}~ z=_m4j!>NgD;_{DF)vaxQifD|}{6?t0;)sls$NEq#XNzdI@A0uTV6s!_i-67*p~bz-j1w*Tdr=am;f{fqgdSC2Y}thKyXLoQF-LB?E0C`)6JtbZS?Rsw zq)g3S!jOw-5EK1ecYtS2uQd^HiyfZds)LcqlRg$!1m}%{7+$^o?hZTS@k+g3HI%{7}gw;Ja`s`?1KRgi8R%} z{owTS5vTv5rzhOFA0;%?h57Vjp)nTxuY1ViE1H2HI8=e01gwM?hw7e$sM4UsK;!g2 zLxdq`dysbC8-$+0kj-AudNmJ!%ee~4=oQYggXMxFeES=}S?T}=Ktr0T-%pke-GU`m zq5C=rtt?1-F9J12C<0z=tMT)R1uSAy6}V=q$q=}gGqOAsRb{Mj4~a(7M^A!^fxoP$ z)P_dl=oeq_SSSYYq3(80Tjn*50PfYiK<*~C%@1%kW(WEWc3cX5)w_6tboM0nHfN|K zFbw8mEBs5)4beVulN2z~}iE`x>`Eg+BQ%rVEi(j-CybElEpvkW1~y zt4nv&e^^}`pCY`}b}G0AZ`k+*W>d5K0j{-Ob{{!J>GkTgH8T5UYVBIXAZ5eQEE^$M z4~E!YixHSKl=^IPYe&AGX~z!}AyIvh3NEtou8l3^*@7HN@x$sWPRDg8fv&=I94D|nA8oMNfBax4@v*-LS+J(dkt@9Jy(hl*zQRoe4T%s)NJ0QxhE%}$kRFB!e zVZPK@!hQBbskdez3jP}A%-2%rla1z7xO$u21r7Ez%ZmQCaPoxWoB7FgN(C1el6{`gsCvY`==zW?Gpd5pDqqh z&slhZiB%<*#iY@-s5pmE|AY}^ZCdy^gNW&IcPG$Yit0HB#V~l(I3_2mLku&C%R}U z=p93`g2^Np-@?Ez7HGx5npjo<_^&D@(QH@>8yb?YKItN(Qfd}X_)GWa^89SMJll?` z7Jsb*N3W&NL^$bN6#NeQ6q1o=oOll8@$gG6V3pEB63R=#PF6Zt16_}Wf*qe?XXUwg zet{;AjFIff<+*G~@RzpfHTa<#Mm+Rgq!6Wny-QgWMD48|&H_%%QOo^a@3!VE3FmeT!Gn8V6w9%l({Dh zcQ6{Lnl-KoB=e=A@*Yuc39T73!`)vbmOTf{P9sWO3x(mh%pOT)nWOC5y(;cqzQ^)9 zfe%$z?i&zo@IbTNdI&e|ddpMwiSI{yM3LN#G`_&LvBU12-(U|#;F6JYaBHCX7pk^* z%0+5oVUEaWdnlAPyO$gKoEm$%MIZp8tU4h8x=1dUt3>g-bGDdqxP1EF?AX+TXw4wD zoHXKc;7?YrsDIxQ1Y1y+qCe#QOl%d}@lbMRe~3k*=^u(iLio|t%BOA?6)A&5D_-l; z@uYcn__W;8nI-l6L22|-edAA!ig$#PH~>hTa~GmuENllEk;uxFXaVkK343Y}>~2Uh zE*RE%2i0?{8TI~(dSx>ys)t0OnS+X{W1E9d&1@F^ggPEfbt*`^XQoM_RA?=Y;32Fq z%fAi2!ix@x&{4#DYrI{0O+-AV+9`}ioLNOYXkW9FYT5#7oLlB#T6|TDSaU*}`eoy; zfRL1O+PJt!6js9M$wy_RmXW6J19_i;@%=&oI8tdEJcbI?(8`?dwfH@z5R7G#(uq>5 z9G$%eSurB!W(UVu&LF|Y}s@-2UcL`Mzr`dZV zO!@?tdI|rPB?PP`PhD%yP8p#*GTZ3mvLYC>=3c6o(AH83sA&!ZnKVu4p-(8$I`sH2 z>?zaU2d25zTHMZNy=`zDpT9(t%0rLVZZOFXq~cI>pR_!n6Hn2&G&PFa1Np27Heyfz zE{&Mb{of{x1v0P6%aLBNptmJ`!R?iHd6B+n+3nZIJqBos zCJE%V9-Ea#`(okJ+F=l_6GBXUAlFnn%5Hcjw>fsjd!+>WT*#A(p8Vv;!{g|5W6L>M zplR#_N+jD)cv}(IkXKY8Z1t$^^m0Wlwc|Kk zBnD~M6JkQcK$FL`+*!4ZhWPj*Z8#DaXyI1y(`w%f@SbHc^^19kvW(AZC7%*!oU7uy zz}mVO1!5jFohEq0k!|ax>pejPOekDrDCWF!t3tw}_%6b_I=Xv^y6w8Qgyu=gV7n>S zi;Q-Z+rwSGEoSW~Jor5*%Y3)B4Lk)MJ}({>F{M@Fi*mI1&am@LO1(Y@B%jxs7Px`* zdh8t={D*R8kE74l^qRTWFtWMV-szMe%rQosz<;|etT-fP$w}i?APpdpXed$F1KdIn zo2Dw34LkD)20oGm{fncOh{r6?gai>XU1`)5 zWZ6#EnzM`jI;Z7W1%6w85E_}A)GzWR&=w6Z})X~->02cGL zB_neIhd^_0wZdAX{48A?$f@z^ZGE*!e5UDgC+}vpHem(%(e2=$Lr;I%MOSYEX@(u7 zyXS_*!fW2i$h6*A@~aj~6^m#4482jGwTAAT46E-h($wvs7o;Tx^K-F?TEr?&4~6I) zdfjd*E+e9GHo7JXOdjZ^mp8Af8{%`zTE`1Kae3QfwHwHsU>zAcRJm$sogHtH4gCEv ze8{hmFXr8M4qg1((18h7hJ=Nec}Mty>Oy@GWlM+E#f9r$NwOph7%BchD8qEn(|kEw zrY21Jt*#}Rv4YQSiwb>P2NqWc}!hOQMxnG%PzQl3(=h z4Af;z1k}9idsjJ6+aq$Gl7BwBElY|^pN7kJ>UQ;Y)o#XYH&1);J;B`qzKMCagE@D* zY&Zn^fX&GZ$x#1Etrd#8vF21ljFX*D*y^+`!ix~LDFE4(>R+Pfc{62(ZJ@;hc?#JW z%5Kg9IIAmw0*`bVFkmHXc1>F*ed=Ow9Sd~)ZgI=F91KpF`19zCGiWtIsC)G_top!Z@n!7iq^t(aP-hF)H&n2q&yi(85V;w2Fj~| zMLT@zibRQx9+cA;t_#uyU-OkujFrC#_t5&LO3zGYX-PfEKf8m&^H{Oi)q_*LRSA=o znzRSEwY!u*8y2FW3CJ2~dBXLOtf@dm=O^~Dhf4>9&y?getgBlCd2;Jt5v$mj0%fPH(GY(LSG! zA`}VQN5BR=6Xo7$*Q$PjN?u2VQnlg^(Zio0+!ywl$wSj*WdLF7?$cn!>fN6liBAFDLZ|Di=!0`-U1{Acf zNDP}7End{i)e954wv$1wl{f#{a((pW%J7<3TL+8d0PHAC8%+>c=m=_}1YctrY7~zW z@n=LG{yG%U#wU>b_lVFoBf7+2!0!nOxBo~JwCaVmEr-uc(b>ld4XqS|@L9?sg*+dj zl%GHh-s(hYmimi>jKp+ytu{cA9U9bWtwV)%I*?N2H5LB48wF-8d+0ctugcCZXTBrt zE5)w>@rX-m8$39U10I}!X89UkR;c`rD60shL3ffXKlog0DT*spELQGCi30g93nwXT zTK6jR=nIRKh!gq^-K37vtI9h#w*qQw6zsv#C>R;h$b`%Mw3|#Dl=jGtw0%^mNegsO z6TS--bQhhIw@!6Zd17-%sHUvqq2`%ApYFTmLRp;fr|KXW4z(T}$bV62j8ko1-)nl! zQ49~~B8Vi%SwJW(k7uZy#8=m`Le%M`--MI8I}^s6EI5vGVW^`^&Z>

    &b+^-&8C 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%0DF$_oNun=y9tX+LnFYQppuRnR*Ahe8OT9nu z-aM6422uc&U12x1C>G6&7BXBR{~ z6&hEgFddFo$skS=h!I#4LR{VfCY#%1oFIGMBYWuIzv_s5P)JR9%ov2!RCuEaBx z+nLcD{FLd*%ppp=Q#Aa0H`4Dj4NyIKdQfkX2n4WkW$s!35@*y@^(n8^yLmb@F*KLP z1a68A2fE!qtKp1@vF3+R63hX?H4;fRz$T-Svk67a<>#fM0x6hLhBxgiVX169T@}M2 zO192gYxzc8jpAM*wSw(yI8`>O-ei&fX8MvXB*db@oS9Rjx-M6Yh3W@nVo$#@8E?2p zM|{$4@;a<`%#~*yMz$*!ENJ%$Q-cS4*1>H<>dv8_y9{2zuHAt-{pjR2m%C*p0jJAb zp`thHSbQP7$NbghTvw5zpJ8xz83jRB4;y1U_ICB4YcItj^@P_$yuWJd>tqUpWX&h; zUp-}EJw~4CTQN&miG7azVun0s-2^=1^~K8@CzKY9jC#L+eVmzHvSqW?wtLvmHExPe z$6o1h)+hMSi*7TR$~a8UmuvJo3Dz6)d)sl68@e7#C5n^}+)r_=vVa$ecc# zBt)M{^&au)WDw@=pvua$5o8wa^{v^j3f*K$>h>0D72_DxSpTYkr^@U{A!My5V@AS^ zb-3mz3%~rYHHmKGx~;zRC-WZXUZMaL%@sva1(w{$zEXbk1)*1L`DC9r{-l3xmRZ%T zi}r+WRF{TN@Q$(D$BQ*TBQdjf)+D{qlSG$w-K~#Zc6XZ~Kj!K(`5q<-UHb5-0aM67 zf!nRHDMc&3c*QKn<_*T(Mqf`M7!npttz`*cx zjgp7z{^mnIvJo~ZqYVpQ5tA`llJoT9`neDr?jdIQ_(0O6rAx`qNs-^vJH1Zg2bT70 zwO7gywPPX0#fZtB-9$J|&1TTs0XkyFoFa*E6E`OKT_FMOZ5)FpTp}_s?b6++6KVNQ za^cYv*?rctAX?fqqvF+2z*C#4d*>1QZ9c9%f*kdh2cQ3FWS&y4AJ}IuTrGXX*m;z+ zaM{_EXP#>e(PYbg^Si$ItZ?g#Ly3c5=v|!oCiz82Kv>qz!egofw1O35x5xI9@myp~ z*7qY@+R|c9RXS_<3z8rn&RWOKOZB}LN;Vna%x6wpt9v{&dRgeE-mcSeEeXaXsn{H7 zJ(6>1?X$2ti~cb~1oegOqga10+G4?hpp7mR5y6c5b>Jx4iPe@J-C6m>ZZQa+bI#c8wj#)jS1UR;@$ ziTrwM4RfP#lPEsD^CGELJOzRpnO~K?1X3w^qWUq+_}qPI$NlK6nY+=kMfwPLah#mt zt42Q%Lr_`wZs)N~9a}}jHQf9ZQ;Z<~r4U5ld!IkUWL4LS)L!4qDjc`IED=h`?~8W&B(@wTZr< zuC`I1$~s8q(XJK4&$p#8H<%mM?tY%6-sLLR54=oKh;6i78h4>8UaI2sKtt*D!$;y{l$3_g5IOR;Ab@L3! z9p~1~KWG47qc1bEEbyQq*}iD-%bgTTZ+!htF3-2j9YCc9o_#uafpmO?*;M=W{-mw< z3oI9%yS%|$p@AM6QwcL>R7_pz-TgS$rsSUZj?R@%csP@~&wIAhrL4mzh0|3bER9iL z+l>_(?c{i|v~Kx%^u?_VZ}}R4&d95sozIz2C;9rpV9UIGf^bB7U%cHn#U981xp4f&&Zudkzbc*SJfizu7B!jau2&l6!4f^ zB==yI&**d+3#BUxibmtcdmU#=yo%-5NPSlbG(>DO(806 zmAN3jW6pbVJh0%YRGgUC|H#Pp)Z0s*|8Z5VZBkc*d8I&K2%>p_l;$Amrfh>$V&0YW zDD~4pf1~nEUJ5&lugNclA<|+C5z&=QH$zc&XQZ|c@pS14okwZm!Vyz?D%cQF zC#oVkH|U^b&2{9852p=2)mkTnS%)p1cUMad*FL?)BGi}N0Y^Od`ep|HlrtG5tiRJ6 z)I1Nn0%G6*Yvr7&oP%_{VONki94k>$F0Cadr=(7+5*bpG42|8L$hjpDIvX#mbX=-B z?p8Q|Dkxv)(~512#OKbbSzX8{I@lz})-{^>N^`#cjc*{W(X*(9JDf7VJHP159g9xQ zHyWh+4-U>7aITM;&x$)Rqg5&13Z8p?eE#3Whx2o|3dDum6_3c}6Ij2E7AurvE(RQ1 zRrAG>2TBiC)}`pXuhbhpVH?s}%?{f{T=D8F<5S;Q7@ab@$u4H~(<5Cq+*d|?H@x}T z{KD1OP9Iy9wEM75{?TLFi+y1HOwPk}s=dT2P>$)asBLEoOO2Y3FSI&t?>+Du#w^iL z@04|942Xv~p`?I?C@w63*Fe6E-kw)6uIG@0o6SL)nEUPo;czKq2mgi2)wT{@QT=4o zX(DU4IOo+c?xh|j8{(dh{jN}kRZM!^Ho=4=W|C8UTd0(s*n6mgiz~xE#6BaQ48j}F zssxXZneWK0bLlY+Zy8XjvN2c{Y_YlaaXRj_j-cHV;VX%1DGP;I5hYfgRdcP5hag*B zvT;~ERSq^)#VRN!mL^l>yks~qL%L)`oOzhPfWDdX>{&!n3f@HK6(=OTRS9HY;uh4_ z&xQuW&n*Yh3lVI|8=1!Ny;Hsx5Uv@9h22IX)$wDQi-8l{;Lx4qB|>LsbgxIb9c0Fy z6CC@-o9GgY@3`Y@X;!32tgYua)8AGe{7+TBYAqR}%9B3ZYhn?$H)Z(&MMl54G#BZ` zQvM`6{F7{5a&w4L&B$5s3DzgkS9hJnHcXVzpFM=H@$jH5cg@5ZstJt^T1ie)>Rx;(i4i7~F1F6f zhMC^Wh7SUW!<%D}sKP>*#RaXTb<#%NAhzfF#7&cm;r#DgAonGCsEO_bt0Gi|K#!$v zInyn8MUvNO`Ff72$9m|a6oyDABFA$bxg&z!OLL~^x`Vpe%f*NL;+A51C5Q z?ao{xddmBtUymQfN5f*$(Y@06TmkM{o1l3EN{chbpjCmy6oru1%%seonY5s<(O(&# z^S5NBTP4m?OniDp3CBg_K9x@@Mz8NK9!O%)WGyhZk_tr$uF~GQ9$xv{A*{a-HBgit z-t92c3Gud+%-lX0e%lQLmopKovc89e1fpL~nB<7ZCt6vpkPtVtD1d)q3SY(54H=s@ z-{#22J9^-Pt0!6@t)nl(#n1Yxa2`yH@*&Q2amCq5J6M4D{&$t$iv*sP-$l&{nZ@D! zoUJYsTU{s|PIkqjq(UZ=y7^5vS`9f2`U=xfNDILs(q;zczUPd=yv4~CMrCfJVBwQ) z&(d@bh3h~=qQ*MH#E;Vp<>!P7oe|;F_q}r6Fak*kVta_(WvVYAr))gJeXk99_i&4&SZ13rEpw04iG-nNlLm;MVGdkrtuSsL;l9{}5 z1JO+pm!PE4M!~B7`a-D4<`e4M&)gcKi?`PDV$Ve{C8L*xI#5iPuWdO7xfFZzSqLAx z%k$t->{27MMa)*xJOcC(A3CI@oMZ)AP+hyDm2?m3?CXGC`g>mJN`h~G{;()LWp5hS z76LeD&+Daou!>WRB;9u{y>i2bjA>WG1yNp>LW4tW^08$oPTtW6mwUSoQY zCld8l23ONK*7i*%vzu5#IjT&wybmI*E5s|;aVoz~m1r=NoMo~|$7JGrmTDX`0M|1* zGEvz97v7v}qWR3c9+#YS$-NN8Q?YJ2G*{e0YH)e}oC^)gRAfrs+0Wx0-}nWSI5~mo>JM;`Nt2 zx^l%C@M*gn6wQJh_#=5}+C)N%?Bty*)K+u;hT0u!+<@Ki{H7=_+N6)#7s;6$bCQ*2!AvBw}z2N_U=V!y6zb|!AbG}_H%ka-bv_I@DW?<5Nu zw9Qln;?NdxYE7_?Yf;!~mTb(@skxp#`~Ms6t#1jiHF# z6@4GeKY}d@=TX%vl@>THWwmvZTCE&mCs!xdsG-LQz03tKR=o0foq{ube|<2@s+rVc z!BmaXa-^#x-~by^QApB}c1v;wYZuU{mw&u>j3{Bt;^Nd05u~H)Z;QlSKV3=5bZ%$v zEYE{xIz}4!%xywlXHWEf7&a+ z!){3=q^97MPF{KYbOfnfKjLx>(n{JM-%81VKf;~)Tf^;abl925hqzNAUg=TAdKz7ez_bv=xPZ!ilpt2S2v+l=w_!#?v`!e8*NC7!^u6+|7Kt@C4h5q zlt~=SS-JulE9g(Xlo8`>_?+8i+yaEE(yf0YvPJC^T}e#!`W1L)&mAfSt0fQFSi6o@ zXD)MOZJqyRW+^I-AK(~Zbu|)dj-G7Z{n{*VU2h0G*=?q)t?SzjP7Td?%(>--H#NP&Km($>*X#4YlWnwD{u7bi2MM3XG$P6WO%wTtEITUkXwYg?EZS?w zWK?K${aNQ88?_#GY6U!*y~5*c;UnC>?Ho;cA7L|5tds#?Q&*mEQr>MY8A09?TYt_a zPmTvcSedvBsvV@`R`z;ehq?j?rc%t~(*t?U#97QzAlLsu6U&Dl#%g{O;t~>Eh7+`s zcJT@O2a^YSS#TPV-x52_D|8xqjn6QU#o(jeA0JUHadixbFZ$3fj393|7}r-N&d^XV zS1PG*C2DG1vb8zH;@>kkqH8v&3@#)0PnpvIlbjo2+>!bJTIleQgN^= zpu38(2Q7TP{`UNwKyY4;9fJf|F7sD@V+#&g3J^NpSLBi}+2RckE#EmR%0PTT{hyN3 ze`S7?fg>RB9gHE{^jS=U3n)js->9G0X4Fc;1UYEJ&oS!So*A-h!CTiAR zh+1M#Z4N14Z)?Bz-h|zbmimrR^9M$+AAyawaZg~zaj?TDUKu%@33hmW+1C5iMiyfv zGZ&9vohXCov&a&P=It;N@?-acs^LHPj=TrN${}RnoV{irhefS#41q7aE9MdmGvvTh z9YN+FR&_rPrtIwfAGe#;Ly8~GtqjZS=~+(TC?`GK;NT^UotcF(7B|j5u`QvJ8%1{gbd=Q8Ikw#p;_Q>mzJ9yv(!OB zmFWbI%)z@JXEkch-q-2!;)!1D`U%BE(UX@yee&De=o{o6fxH|XBaqZ&aT>U_xJ)pN z)=~Fg>DmLa5*7U2i{Ft0@SN9T1CC&qdVs&f2UOZZa@zKiO4~cIOCbX)pE=h#EIqb= z=-};^v5B#RJrfsQ?U>c=32OjT7sQMvDXneU0}kYSe#r_*q%Al)<#*%+IC&nFEj|XR z84L)(<1*gS5*$gt-L5-P7 zeehR!qN9JiF&O@xi$P}SB?-x>!h~#lo0>u=qQvW-m5Hrmq!$`n4{(x#?q$q*yr+moZ*XUTm(NAEjv3044|IUHZ_mL>k`@$~~$ zn+nMOUFhg6Wwxm|CBm*xMM@eB)btp{Q2JB94A;nf9@N(xQC#K1XcyX-^{>nEO0Qs# z2lcs}?R2O-jE%<(;fNiA$EUBo<5k>1) zr7!J?0}%1fCE*Ptfyc3tf2(%{{8UdDm$3NIu7<-a7sRg~t?4s_chu}X(fLfreLGAA zccju>XANbdZsdAa(Iv;%&Y?ThQp0c#ns`QB>uMV>naYeho~w!3j9P`Y2}vV!YaUH5 z>`2^jb8xg67D@p)_*_bVN8LZPLd6 zW^2%R)ZK%)TI6d^b5uPSTNMau6%SQDrW!+<6yG?!wlF{!#b5@jgLpN$u0AL0u}EWUXo7o#w}Pi!1hVY1DU`?BOIF=-g^CSkYakp;4^rUB^`ay=?y79r}0A|NA>e zrbXo4X%co^S;hF|Jl^s_x6Vq$Kv02|cFNaf@@TUx$~-#BXb&{m90E>q*W51YS2C1| zo6q|8B-o2SnE@hFVxzhPSWkjGWy=z~Q`+T1ryq|c%hNZY&5Va`F**ZWG&%`$H(9sZ zAhfd`3IZ>QTqVte+?rm9R3x@IJs;DYBVRj^PQQbm>eXQ1(D}rhCyJy*30`Ic$v9${ z<9nO^66*<%6NYLW>={)(!{NaL%+T^2W*SG9-a?L~tD?7}eKdl{W+u2ZvBB^W3TZk= zg#cfGfs8J$Ij4r*%ZJ{p@Rw?5?&ZQ46k)1~jzD%V^|?x_qwww&XTTTz1A+GWb~89ubbd;w94)*k;tIE$c0U)92Xj(UauKUX z;|%T>rs5TOibV=IgH+XXdDwBZY!%WWH}lsB|Hht8ogPM-`?4fG?d0H>M_5e~vfP^q zNfGw!0l#4@R#n@{UUb>g@adpx?)}0)o(u2mY&z$g{Lht*US;euQN&ZOoHLU%t*#g^ zycBVxRwyU3$pUBC#^A+n7|xB98gM|UUwmJI_cE-f90sZt_J(Hc7)$IF+&bDrl@kv| zts#2!!AL{q>X25s7&;6s`y5%OOp#IBqe3_CcOi(mN3eUxm%p0o*?@=wqP_V-`3*4~ z)yaHoutI)RkjW(`HbPie=n;#{HsR$3&)ekwMhbi=k#9D9H&J04wk8vt zwTpkD;4bS+g?@!o<}P9LD-B${wIAU6jG|JuNoWx%!WV2?>{1tS2Hxy06f2RXLoV~+ zLzB9b;QGnKxOii*JYEu_91o5r=SFqYi1MzitokCdAR8tuVRRA?gi*$LWuEegqGUm9 z$1}P9K{zA}I~9VnHuc46rs>v9NIx@kv!J#Sq=B@bV>zuP-xJs_eM!4#4vZNcMD5Th zP#iXwgK+WGg0OBkFR|q)nOM+BZ!9e0V40Av9$HW5z91_1nPCV~(94A7m7Rc8*#L$) zqq5;w^8q7%7z0V(5(1*qF5VlxB)LX*$x_`e5;r-aKCD4;yCtP=BqY{@G*XIV8bfc- zBMG=)j5g3=SLGz$kt!YnX5XqcNBV;a+KI3CIh@GiZcR zHbZ35a0W3bdncXg4Dve{BKaTOG5Y>(mj1jfI2eQ;B(QEB<;7WSW|T0C1XET8#TBzn zMV+%Uh0LM@o!^U_^kxDTi*tlQ6NJ+5@wmVCoPYRCbfd&8w#mSG!;jDQ&AJf|@18rC zAbZ0+Ck}h}Ab#gAB7OdL$MqDcI6hAV6d=-j>kUV21JEoJ;QF^cI^8sqw#~&xb{I_P zR&Z@>UtVEVS6L=ab1u)|JW0i=E+JySARiC&TKdtlIWBE0Z3!zzfQ<3^Dy-en3Rt!$ ze?;+zCdQ)SL2~)>_PB)dV&lHcMI6661g-4bieknDm!ON6AGkr%d?7U6H7MIJl3u*m zSAvMT;0vBNnTdP%U`{|I#d~!Y9Xh_)WQp!KPJ~EwiRE7C@WTA{B+4!q0L7snz ze={}V+(nxk43~S-9l$pw(&^Qbv%6zcE=aeqD(uGVUuh(KY8bZ2C=(v!0I{+UY(1x~ zkAn%?kyVt4x1{*YUwIGMFs^OcoP26c|CI7jmbl&Tovp!MYHJur?+g-fH~g(|7O;Y? zaO9xTGtCzhx=qsE>BqeW+iNd;Ma_2#4HwrT79@k6KSHv1Rh-2(S^w#!X+7e@CvIOD z+jF$ndCTCH+DSXb4QaiKua(fd9>inFK#W*m$$mK@^<;DO-=~Zo^ z?WCd9P-9ZMKr+H8Y9VQV?i#&hcW7kDsx>(ZHV5-_RojGbo+-R+19!9xIEGb11S`i{ zXR!B+TJ``+SjZ5o0Vjxxgot#dvfK3Tw%AcLxYhBU)bLJY4q+%q;~b8k$5?7R#+%HA zrh(rW`ssbz{)Tof)>jbo@8~fYZfSzb5-IOBVNDQ*0GpLhKUX6K>_%Pta5ek*J zga+wUmPv;I?vJB2CMGrQ71L~KO>p7NQsj=WLJB9#Bs4!Pxb6}h8mf*)ch_^+?;}u> zEg%S1Y`d~zxTV*1Ipy3}D!9Q{+qX}D1B;17&C4BDAz!O8jtV{jIQ~Y@zRHjg?6QIa zR^fv3G!FxfH5|=8>3TTdc5WH7x-WU3NvAS)Rbtgy7-V)D`1<&Qr~Rt1KARcv0X+41 zay7tdg1iwA)`(2-p*CL&%^sU-=@S2OL#yiBJ18>nyJ(daoOuo{dPxdVs5KK(+2sQX zO#2E60^>8POLmkjUb20_X~O@a32%K$ba34nA}mD>ui?m+YB)ckNWU#0ZkkAqa5mrL zw&s@m7k#NOI}=$3uIo-6T+GQ}`)g;2(gl7DvLN^bSlPg%;f)P;tOP#NX4^lNn>J6a zCDi^n1o@syT~EZ;hb`qdFCr){x^v|7!OzG$TqgEsnZ~l?yLBD}^Px9d-y95Bg9D_m z1FgEvvbW_xy8dYqT}8Y_9|x3C-a6n~j@&gdf?S{Z?9QO3+C%uFRX_yKQ%Q0o_uc$S zQE3J5$kHLgqqf#vCobtW+L(NeUAhIhTR7_(v?SH218KbvX!U=tsCW=wWQXbwY}rpa zd@b7g#i2S=#llY@GODH3x)5qJsg2Dn?RT9jjTEU2Jvi}(aZmkr@L-jZc#1Y-a(mq} zgd)^&f&J^xFze3sucTnC%^{9uDa>zDdzl*tJ?=%>Ucg<7wd=bhKRU$l5OVGOcTC$= zW0svevUS|A>E;0w?rBvlh82cC5PLNxDk1lRw)>}WIV1mTF7T{WTy8fdpssm5UXL0|rp8WaPd4&E&VgLtCM;mdcYDnLZZjd^939I|>|Mh1159aOa%-l{d`1ECC z!b>i6#=-`nv_So-=3TSomX_EM*&1b77b==y%O+%p!cjsNb|G!D4;l|@ zt#aY{(xJ8PrKCLDJ3$R6w~&W=iOA?yf83eE?W~02!%59mSdvoafLgu#85-2*zCmh) zBo=z29v0vFvH;n$$Inb&sEW*rM{8z&>qaWS(ig49Hm!0Z0XPKrmT#S~J^*Bqy*|{OO~pVP%s&E@)!b{9C{Gy0 z9K+r>BeMQHG(SkI6dYV{^}y9-D{+N;fr6QLmSqc6H=RKcezKAwX6HUkS9L4~em*#B z6VUT)Y)&lnsLKXYlT=l{vFBUx7?^Z_Xx%dl7aCq98q(;>W{Q-8RQnWiu_pD`cSRF~ z^TXUCRa`WICVP=nbcH-{3jxPuwGtWvjL7L?rAVj%4s6h5G7y(0s!3fb5lUqh102FKRQhmBtvcJRGQy^m*_ znjpyqP#x~;Ea`YJ>JA=U%iV6-_*Q*x@cts6U!z{zK}uAk>0F!_aKmYM?>I2%@-DZ75UZj&kbF%EcCcub-lrB0r07M z%>$yRm>}bLiLSoKD_0(Bb_f_-A3#8rDcHu}Q6;tA&$E{M%;TA({Bq<=Tpc+2bQtmE!h<&+mtkC)(pyAv=1oh2|}iJJgE_k@$^02lOxouZ}|&NF5%Uj{-{y zG+ydGG4#bFT#{0~)F* zT-sJ0+A(ua+>Rf^H+v}OT;u0ScJm3a4p?g2b~}a9Gr~(FNOT_BEcZ;wW@e$K^@x6Dgb;=;eAf0i4ng$=czr7BReb=rTM8^s{+{x`+!kNw@ zuQUa|;)hW_3j2djifIINv>U!?Xh22G+~nIjh`%SnAdoX_{uU z$nZ7L>dE)raEsq9#|K~GrGH1VI8@?4{N<U0-rQXhq1TLVkA%4+U3uHHckj#q^3ybfmBI<*)T=@vVo zsT1nG3d}RX%!jkQWgWxDf!DR=V+a149B_4%TDhlCFLNd_o~6B4*RI*P@`-gyyF{6L zcXzPU&g+;RFIXIr5cSHhG7V)hI6mTA{^Yj76~gkTPK0(VqjdoaXZeCV4e;JXL%!_z<@EzJiP z<58({184=>q)G}PpyWum0APf&vjY7(j9pri19pddZwV0ENrM5WjVH#Doo=&RJrDs- z#?#|f5q__(w4{2_QDf7Z)k(6JcS$%by)enbeO-^mbc1KvXI&c}64b2+MD1*nqO4`K zWxOD1-%-l7z4C(%8ujLh_pRd@JWQ){?m8IRL9 zC1{c=kZ{AC`5(LYk$bKkdH5zLdC$nKV|xdx*4pp3A)9NyR~!NsGo zo;cUGq80~XE!6=Um3?2{hTkdF3JsSo-`su4%+qkZzh^dV#ty#qIWn zTx3rRO=lh5BBXB5w}+5G%Wd5TZqySspI2{4xUzD4YV?#At^X{5d-T;esb=B;eqp4F z!(Ol~E8PNo;#1w&dl&exrA{`LW%4^71Je2UlBI?m}@Fh>P;Z09NN2C%Py<0}b z+A@*jId1B zwYaq$r4v{n-$$vV=Pz*_tvP>l^jxj%rZrJlx=n9zLS9YD;sV&cg$${sVK)wU54aT@2QN;1_Mivyo^viHhiR~m;uFFXj2SC* zj<7pvyCK--=csBTQwbZvI?@T2hgMxE9w#y{)D5*L~g6>?05UQtJSz7qn2)#aWUKJ4Nq^$dMFaA#~dJjsurkJvtF#1%;Q?ieI8i z*;D~`mxqgeQDBh|tCXZl7hoA{JKfYP)lg#lq6kQ*g=A#xluTX^6Upje)|s!1E8yG_ z!XL_%D?f!3BXupQ%~tzmgUw*JtnLNpq~hi$xd0R`-8@a-9LF{^OD$T9%OBwkrJJSv z1uH((T)Iha7=HvG1h!IOU335z;e@uF<<_4?kp+D%s2x^5GLoO7&eD>OA!h97-V<&+^VRt z=5V3MCoYQ>s+EHuFbprsPT>th&$>K^DR($bspzzshqoEy)k_jNcT!z~Hh0C{WL?Rf z@W=8{6`*pN=ws!N-1xt=Hc+3HL1?i?Bd>yZJk-k((z42I)zUf5Akp`%tU}I%E3%!} zB2o-6k!8S{aw>>7UgnC_9-Au{To2lVPMxu4oV*SM7%484iru`8(PAfXc-puSieM-> z%_%Ot$Q|nSW$UR=Uh9!V$7)_HjV`HAou^~wo*C+RW4@&p;1Brs?*zUU;RDNYhoj#bv~))^xUkV+$bBU#Od;Yd^#~J9oq+FwUX^}{ zjajK=VHN{>*=ecNuygl!H%xNJVt{Qskz6zQPQQOwSAg;C0K0@B_wtg^2O$s6V+DOH zj#kwjw$s5Ua6+I(pZy$e`F((CFwlR1L;nKs`7MEV!*`2BY|+7gJavS%5C%1=BMx49 z_7N@nUxxkuLm>xEv=lD$uRx-I9e11ozgh^)9~qlsMorp09x&{VL8@$lUF2WwMvd7!Fm|R> zetQ4~*2c#yg=DV<@aEb6OP?)C9M(9 zoWOW9!G@7NCZ>|}vc7sPJ8xA$cI3X`-8XL!xLP_y^KVccvtr$AjIx@6hp7400?-n$ zp6!=9?6jK4{>J~3vNLgo^e>|3KW5(vfiBY~o$=9rJ)m}XAls1o3Lgk4M@xm8R`V3F zA~WD(=}$he&;h~c$LQ3NR7+6x9pLpXthGxlNjULB`{h3U1uC{WVMkKbgRLN$(kgpA zVn9F!K6I2ywNV0)r%08*m#5Ef@n|%F_)Jb~?COu0=-yKhI zZ+Yb_bH4)q?O+4UpdOyR*{u7xd+sM;^*62>F9zNbBdIcfqTfhJm9S66$oc%rt}U;m zaM7;Lx_>XI^!=d1KLOhHW5<3gKKRefF&CC;$H5`V*q-Zt^LOQ1hF_8Fn^x!>%B}F{ zyA_`mo~A_dmETCL&9|g+ht$Dw@&h^*#DMuZoTt=9@B)Z3)8z2h#jpt|K4@Eu!FI7w z47||M15!u%pTVBS4k1}2MPb7Au{{o5$S}G7U6v%9=m~*5YHOk1Y6;tODzXl(2?G1#~4zaoR{#KV^j&Q)_ZfianHRzyeXcD-Dzq& zaDY@iRcm~n^gx@P8qxQh3m_r@-aYuF1gCagmI5#;mx$to(LQ+S7Hty*0F!_ZJts;s zbiZVLdOry4nTad?&%Kz~O44rb(urFgTk}-b{Da}A9}Y$QU&h6L?AUKb690E{tc=4; zwU@(;Kh*M@TV!wffqcRcaN5U~=R|^lFwMYgUmR?| zq768f-#&`vO+49{lZo4>lP(@&1n#r5fxOfd3MDlxKYA+k4Q>3x_uh9NE9M=~d0^@x$NjP;31DjPul{-;M12Kn$wXYCnEA zr#H#EJU>!uxu5@gV5C28EGP)l0&z4snY-b_BE=26)9f@IEN(=o^~bHyDQzfbwp4NZ z>no&JVE_(21_Ah#^Df}}4dM~c!-MAk0X_Pw75*UPC=knk4pjQ@Et<+M#Tl22TXW%5 z`Mqa*bmtWenOGbw!R4kpKq(5upju3VP1%XPmhT=@tg$sFmQyrk?r8u|S^;Z*z%_vO z!jb&dT$5f8mxhQtg&zBOd!xvV>dTVoR;vc?<=kW_I0{@XF7A3N~Z-~dK!d?t1N{x_Sm><@SgxVLoa zV_$Eit`x69uBhm43s);hG5$rA==(9M0JRE^!^mK(K0-Xe@m=eYQkOoFieD2s)krNM z+N`Xw0SH*>6REzr&;A<8_5p}o{0_-V8o@3tlOr6?4c7cb3K^aHe!~Y~LV=5p6rS2j z0%GO`B_s#nI(`Xr`V+Y7dqJlEpP;uF_ARJ}8nkf5RLzforj~g&vXthjXYyg&x@E~t zMz6V;$oC^T-@0Z0*@~zw?;`Mq?s;0X>tJ=lc#^^B_Kj;6CCAb0H`Vs+mVG^8JRiCO z`8=S{4v0Dp6$z2hUPC`={Qp6RclCh_iA;dbW~YO}7D+(Mf2mYa0lL{lgAAtiSy$9G zB?Y_!6HN0db`1z-MY$FL7Q!~6)5hA%%<57ghbN$aANj-%&~uQ)H!M#1v+;mfXsXhw zEn5b+AnFyW`z{RyKI0ZT1cAFrg4C-YM9YwZ1NH(RPtdCsz&I(jqkQ)vg(p2A-STJD zWxx8$WM!gXBwuC4^)p7vZWJZ;|4TT_UqX^TvwoLh!3O8p^K4iCuXWwEwIB0{2DF@Wd5;-*2O6 z$J@UMgtFmxAX_L5Bn`yT`YoW!UqEGg55tQ<{QBn#$T++9kFdv&sLcNpnAWxq9!W87 zImmkSKQE%U_Z2UUOB@KGM(LQMvf#D_6MnZWT4_qq$-;~N-55zB|JqGSEK;DYTfCIVw?_tV8V2yXe zzf>{!71H&pH7e+d8f%LuzcD)n6my4{Tf50+d}uC7of zH~-ODIsZ#AZ$C{n`hkNg)e{m1#G|>6#@BX}4t4GS0R!iU-MUSFVbAQ-#ctc_4qCma z)?JxD;O71<@VDPU)CJqstCt(nNLcmxn<=7;=C-|zD@`Pmf>`poBj)G=n^?(T01Wqw zD7>*qc#$WFvL<<{;JmJ}-R1V`x1hM&F(SMoGV}3|l7s>g|2JaZ{vpfg&k^WSkyuY> z1YKMTawb_D0w5iL#7*@-P^OK*WW zHD;aoNdnM667TlQsYXArrKeimq~DiI6zoRt$uRndK4la&lX$P=tVf;TPYYw=$?;_F z6}0c7Dd(^!+nD%KH8n+A*{`PV{DrKZ|C>c0nn5%W&3T(KGb1>bj?cIl^rE3rFeNckZs9$W$XQa z0^1pR*W#IK$_&Mdd?JzZkTM%Ld@#iXVw_5c3A+MV z(5uH&J8 zzQN8!&4w#ESp76h>OXZ>nu?TwhhN3{FZ(plS!dCgpPx&scM}8$ZRP~;{vo?4&=dZE zt~(9Gj%l7K6`pNI!@a+taxrfs8%O_K?ob8@rAu~lp{{(y)C&PGltj^o!H_3|!H)B@ z8Ap?wN#s*D5aUlmyKm~%f^53dobo?Odm4m+q(WZS9>CoZjXAr#j-1^SdNu#i&XVw~ zmU;%J)%M*J1>s2q#;mM9eAc&&y9DBn!U${fTMXHdQD@Z3lSP=+ikU`;Cn}UN%o3&R z%tlExBUG9ln@k((F?qVabJpp%Nuo!E87pS4@Rqt9_W@5_G=0qTbv@|cV9oR=F~0bk zd|mgw;TvF8Hmz&B5Y*uTKcc(V|JIX36ht7EhrQOr=@NZMDaiI9_!OX$b{MvZoTs0C zYMh5VK!Y@lbcrtG3X2_y7vP>jdHF0!3Bi7P7H2U!T0xhEPsXq&Pw*EBQ`(e=2K?9) zy7ZZ6K_rCe4bPi0H(r?EGG96v-0&2y)T?rs5qiQnU~;bBxiJ3+_Jl!4 z5Z*41{P>*@N%R&}DA$EHkk3tQBNes?<64APkSAx$%8yrEA(}Bc>QAr>4IB&Cz%VmB z7QJ{s#TRf$6g~|DH<3yB^lkW#a9kT$Wfg@%pPQV>Lg|kr67uh#Jz;FjAiPx506A#> zvq@!XoRvC*PRp>gdS9;Fq;{3d6U;Yb&W88wZr1D~IOL3cy|!t4K=>lzHPmyfWeeNbzkZGEUsC%oDfY z0om}JQYjHm#Sv|*!}bvN$1ixf+GgphQ7JggoTL4YB9P^Wy7xIl4` zwB(`VWBHh!1YEXaArc-?^%zfRh9{IFkl8q2jp@ryH(8d0TdbUgmvww**y9N^LonKc zv6rvA-LPBI0}c&bC%{+L_r2~0N(0wW?AVr2+%UNhByO{jYa+EHGpuz`F2tO?b%%3a zINh_>k)qZ@Q7eAv8ORm>MRFHk=y$YikgHfQCxqm%d%p7gA4r>h3wcKH_;uS;FoK*{ zq@+d++}rge1(BY7u6g;%QKY!i@MY($MW%2=cUHr#L~k0%6$LkiaGzoG%GmpZ&d#mH z!g*7Xgt9NG_4YG?-y$IFsFcH+-wd4h-?wH#O{f$|*IX9$4}FT7aMM$DT3<4h&=LCL zv)oTm*8>)EIzu78`H~WzG3!!GO*bu0&A?vsajN90p*u?w1;EbF)y$v4`FE`Z-f4+ z8j!fQ;~{ozS2<4g+O$tl3?->u8uhk9PM<4kcZHOjfyA~a^F4l=`SyjGB*D%}zdIUE zoZ$-u#o<{nakzc6#T;An@$M5Nj8~k3mh`By9PBd9p709n(^s@i-+|kmkQ82X5j~=^ zwMctbQvQ8c7u=s;dvh+$Wb^1=m|NG%LLa#{BBwft)+fKM>zKY6Q{5IZq@>Y!s?hz)}Zj7T)@rd}2H1xs|}fE}ag6$y@*xmCnk zjetcn$9BTha|k!#+C*LoEySo?(oI{y*}g2dw+ES3EH6#MTl_7vs?-oWwzNbZ#f&xn zriV*N0$Is&jWL2N1>H1-l$q+fx$E!ZQiA|(mXr-If8nf zI~DSGqv@fqHJ7(1!P)dMNrownALmzSIJWaGg6@P=ZLDvc|^@EMnh%*6hr0D$68jv;RIUL-3GlAlXD8jNtWIwPc_W7^bbAB8?RGPN z&LBAO)CR`muIBo)1SQNu4LQWq$M(T19TiTJ&w`H~^0L%0cPn8`bl4ljwFe&;h#Qmy zNrPWaRQ?~Qr+H3qlM9z6{Bqi0N@8p#GBoT&$O=oeL;1deg`4AS_Ks-$5$s{SU(bOq8kSHRDa zUp)O^&KTWn=&+zNxUxY$CSr4I8EQ3HByA2z$rG_kJHO>y;-a9reuqyG?8TiDwUNlhqDRB*`G) zEYfwL+hmND#dYEgeiV143gA0MkrG;R1=5mIbu1LCwGyb|^IFgmsf&mGju3?t~xrtK*K(Kc349A zYLg<(f6bZSpZR=I5T08_Luk0jt5rpH3!RkoBt4nTP#UrYl~GW{ zp)e(rlIKxU>zI%mA`lytj?~r&q`F?-KT{V;91Cu>8$&lFfI&8Q26;7{sR-l9uSnXd>^pPU&Bs zu?z53n9t+5R36>7hj^mfGVL7ndjc41=I$dldCKI6#qqH`;`F znc}Hl;J#j5Y8>i^4ucH=;7pi_zb+8ToSez|gfy~~#o!(5!Vi9FyesDaI-QPv1fPb9 z_KkQvVNOhj37*uFe0gDNq4o7>DST<6ob4W+E}EGIG?9oZz?8+M;S}08C5T33gGOAJ zTkQD@=b&nYw72MY4pdrJ*%+P9`pVe#_SvBGO9c;lNMAXU_{lA7M7cHXp2r4#0<>s# z)IQ&mZ_n=>>Swr4{ChR)`q`@$L8`5lS4-LBYk(Sx{uwyoE&l{}LO}}$bc~%Pg6rPU zKGFPyRY|@IOnj%$MsXjyAV=w7*l&nF~ ziCBs!pH$csiPw1E(pi~8lP9z-8T{2?6O9>mdgjk1hTVq~x;$p4f#j%I#a&Y0Q0F(X zaf|aNn++7Ql%Hu{>;_N#a6;tIG;-$02c zB@9skPxF2fkvKK3j&UY*66301yG&Y58xAp0ycg$eEaaS!Q_XICib41SVE2kpo>6oh zO`O-H#`k6@8qvC{PoPh@h>fqvEL zN_d3>u5A@iK62JWT|dZvgZ$m1%HcQDFgu~RPzCC$B;~(yK0^nk?TtNxJPXG4Y7m%5om3m zx(lS{;EXzd&j#bTEaqaQpGZ(nD4LJ7?B`7jEg;mCXkz`UhzoVcqLicasnnZQeSrQg zS}1em_du0#aneXQ&+m}_H3*_a2aSvnBwg3wiAFgeoV*0w_f#BY=GHOrxoI;2pw6BrF~RD>*<`|CPUf%6QKRKv%pU1>bE9ydej4Yh)TsyevP1a@?e&Pen*ZhC9B@gaKPk<#|cyLUYC2R~gWPp~|vQ0SITO(;4 z14@W9T`#Zy)Ofsz8}gAjVcDjXl?80@7e41dg@l$RWM@%Q=K|1>qq=Jvf83#q1HL6A z%8C+u=h%slh%)@x;Y_gz0~K=aH*>qZ?4S zI33)jf9RGrcOLDB%BEPGAe0Ed|GqLL=6u`lhMw7?d5s>O%=){1fdds5Q&p4TYl#SP zyOK?27GqOjrcb4GW~Ak-#*2(imhO`6mAcEgzF?O*!ftYy{5smHNtR#j2`t zqtLA+b>k7j1x)iw;M2L5)lmH#uuJz{*G5PIqs~!ax8Hnu5fX073*k96{n5VTf*C+N zK~LVPx*#xR&wHX{GGzxA49&j-B=b!oYGe@bt#$VJ(i2hTXMHNdCK=eZ^KiV!aFt%=m{6NVO!zqd+=^q;}+25qEhw z)#guh*%2xoOe5o#HT(nrI)X?6pO4^TEe=?b)b&pNxb^`40(;LnXyP&0)f%GUl>gO8 z!V)ylRAgLGHSWcv2MLUG9eNIi$tV&)hD_RKf67W-+U~hoE@y8E!sM@5$8AXYcMZ)3 z`WGYPIPzl=CXM1Q2{a)3UMsp$AWLsA?{I*Kz-8b?R0A^WiY z7(?t=3VaV2OwuVU3Q_pd)yNbI@ zqUn{ThA=&uQruMi$)#bjMd^Yit3-5PQ5e&FXEqFGWDr`0?Biom#iRO2v8itsw<0N> z%?j%*rzZ@q%29urV=6u%C^Bg+ZOZoV^Ym3D&V~bkA)^Hb4A~SA*L#7Qc4F$AK|tPhzyz$?V)ooidpL} z=>o=C>9exWdZTlTlh4D@i=yyBBzrCHxmu?Wd;9-2H~e>|CQ1q{PzEoQe*$lH$o>T_ zCMyeQX^}qUiu$zALiaEHLwJ052MJ!{or4V{oDhRoj;CK7(?^nOjI~@_w(VsKPBsKj zx4emY_Ez9ZvHWX(8V`kB;wHO5OoD;P!m~N&V%9#MQGai za`I+kWDDD~-l*q@QBl`&*{IZUB~Kc|zqz+owq3f)8@Hco1w5*fx_dVwIvX z89q{Myg3pxFK1B6rml=qE+^dD^7vOr%>0hR%2{gbv*fE2-rC&Qn(B=E1t*oI)~Iki8jm1*eG>t_{3%Qm zxUNh&YN@m$HHv<)sOcxX+9;Oo5Um~@0GMIg@>9qbgeIJeM zRm$1fOc@!BhCg+1$F>qWeQe_V@tx}bidFGQWGwyH`G=oi_|;f?usu zxA1HrM>dOLlabXHf#uJ!tdp6|oB;67*K zS%LIUGJj>@M@}ifBPahg%pncAaJ{3T*|yHMTV9ep2-mHF7P4FhFlRr>0#FXoKFNy- zgHbX~|BlznOt*(EQ2RB&rfu?@RYlEVw14J{yI6yMY>q)8+bLtV51~RuA`^B!5)-A* zU~AK1QJR=0W`a4Bwlfrt<*F7P>uPP91O~+<+r6qtD|~h3JPNi!msjLF!Xn?k1T!|m zXb8MclF9C((7kcJyFOOxucz)j9=^^Jjia9(IpQAx2NtXE!* z(F-%C#T7H366?FRD}4Pn}H*CBqr&Lk8v{|b+Mv$@{ zs~(v3+mYw>+vHY6Lnv^6M8`zxEQbS*HO(%T@n0$FGwWG`UW12XD_aaVy&Jh3+tLNC zQPdF^_uFzak$Rkf536J+>-#CVmihejaU-8yV6P zxSX$Vsqg8&OJ8I~FNQ|zY!+F1KkiVM;lP^-&q|A^k*e$e9sU8nkfoq96t4pZ54K96 zCVcl$*a?z>BH9jDKJH*d%&Y<)a~uxgNDYSEi=**oNa5Az|2iLR%~Cil)(%&^u)Tjw z@4sOBsfnG>qT>YfaN81v#h<4%vcQ%maZDEp90*JHB?{oy@XA^>8rN%c2BiR(w%<~t zDNTiNr>lJnCjpjJ0uY=8Im(kh04%`W5BrF0H$&-X(Np7Ot|EMSZU(v@I zS5yvL>y$<5vJ$B2va^&%@lA)aYQvL)KD=FOO8ZZS>e+7I7c$a ziWn;fALV+c>WV+*=*3uF@vjOOBu<9~20DUwl00TKVJRUn^4u!fNBk)Gf}D1nwJ`A>{Yhez-xQo!EU-zRegX`4;BtQ_ z8UL7vH1rQE$8qB^*8ejIrWCeKFaDbv|MkTC;(zAMFm&lTUqI#XG9C4e7)khTCP(cb zqP!Vc0Fok6V{gVIlz`8iXX|?#xtY;(O-n`<*Cr zr8Biv0^hLOs=lZVfh?o~*b$kdS?WzkVXi~W<4|4Ep#}3mN7Z>8%CX7Tn`}kys{>QQ z*G{e<8)Ef|^c@NtR14ohfHE&V6XYmTOOG!W@d?C<1>lA?cb94QHTt6?y{AX<28SEJ zgsUL*#Y%^&>Ky$% zFwdLD3+}~njlHq!|6xAf5ep2GmY(t$TocF-dx=}GAMzvidIg&vln+yj z=DCm&8^bBWOsj)H^<#vk%*K|6S4Jg<9Uo}r{t%aE^5!o|igKQAggg>Pa?Eah!!3brDD;SnHY;r~}(2U0h zv(ZOkMWjob9tCwZ)X7L zXAR>lwDn()vMZR7A&#S1XAewPWKzRK^S8#4?G6hshv3*GoOCkl<8rd+W2%xHpAI`P zz0G2}slM4>8b_ z@>(tn@TZu<;udLdEclS=sT=dAOSDINQ^nD2ZJ(C=`Do>&?4o`qwc7UJ{B_&dD*UA9 zExlO50mV&Fz3;;LrdK(L$-LC-H&!UZ&t(wk4Z*f5o^s7o$I<;sU4 zIPv)Lb9h@Y12ihQp~@WI`>mNm4A45$1$Yko>g7Yl?=ok_rn4{%+LYzoW2%0#P}~(! zRc248k;csGktsQFyw=R#7N)WAu+T`{!bis~!=a1!8MXwO>OKg|1o~_W-t`(j@_6to z;`E^@z(0c9yww()fSWS4LbL5Lq?0(~Rz{C$xnvEHN~ymBl=kjoQJFC~<0UmpU1&JB z$om}>3xoeKa5>Xo$IOe%2C={3M5n+PJ;=1?P752pLQSE`w0UOj#^QodXkpGw43sF^ z&e*Abf7xQLXK~UJ9ER4C@?O{;5I3sM0iR}ZWgU4;I&3z_jpprnR+?L?{3gQM2uFd!3~!1Amp8g40b_ z@Un8)!6MRVF#lTw?u7msLig;p*abL;Bz5s|jNO5Shp;F&y`R9&;SKmeIN*QRpG7T7 zr)*Vgo>2xX)1)rI=1^k?rAey-kjrd3PS`WBDfrQi|b)Qlx-Ym zqUUsz4?i`>!=+$4fdyDpv>5h!b2i{_i@N}eg%TF)eFUi#YZ^&yE+8=#4iw#GSn481 zeID9x4*9p_^LDrx?48=&X`d4Df zSQY?K^nBR`Vj#7jy`N-OFIvfAA>p9{w$m7e&jY04VoDRTh*jBwqgEg-1?dUq-Q5)$e!~%ze$3vEB-&aB0HNP?)r5^q_8W0DY=(vT%{wlSx59%w* z1rA`H)kEXZwhDqUeo+)ZUTMK^h}u$l;$c{nj>?uqB9<%ur17FS{xSZjSC-vb#PDSo zzbAVXUkLvcR#V($ZDfq_088A7_RdZP;OLQClDj7f(-SzDPEEB%h{J)y`PVI7N5!lf zLZNL1KSXfdcFFF&1HV=Mk9mGPfDIA7mnrAbqsx`hux`Db(do9E>7H>tZB=NXhoV_s z(0idy7$=@B7`|@LpUv%N`&@i-bA;@d%uZ%67Ewuw=0g1_ZV^oR6vyYpGpLTro!^^g zVZc+AtqRRl8dj>Z{Rt&Pr7twv-+iGQ&&@DTI05qhi+aX#U}3B>J$v@Mu_ zhzCjUg(U@r&?1jYkj!2>zo7V|9xrt(L7l!td}gU#18yW=Uy2!pq|R@~%d9dv5ub3m z9We(znAx`J|n+j5)S_#CmlH81eDdcD}ZlEnv5qUzqb`F!fhJ~YAL0}|Q zO?cOG;Li^GO6CsKTa6voLf-NEu_c~Mw>+i!6`}{b=xOlLcX%5=@$CkB4V{BAh`r8=i*KuhQZII9O0StCqAZi0`hBEj z-tWqp!z->_{PO$mu&>{IYyI%roexH#;*agayMH@*N+FI`uPmGjJiJnNScj&sZyu+e zI5IDiA3JsZ#^HqTR%LXr+PCT2o`XNXorFmXYhRxQ)B{S^s^!h_o$jbXOEH>CWXUZjy z>~`6vre^DJ!=Th!mwkr@BG(7NpB;-@1D*-UVD9E!R3N4g%*qGY#PEQOtj$#4`K~F$ zjgWNv;&SDcm*dLoLw(YbC)kBuL7SsDbni-Ub9&$4m-pr-^FQJzr;l`Q$82+b zFWES&I|-o%rUir63t#`>NBv0~U_a5m-<9giDJJ25L|_-w|`>$^@7*; zs166!qx1kl*7fbqZ#(owQGHU+-*O#bGIAyR7kfz zXj`ajI|%JxED!bUq~%IneE#+rb&nd}rrNHE+sS7HAR8MT-mg~dJxdn$X2(1Is4ogZ z$LLcY!k>F2d9O7BG%DemxOL~*;c)GJ@tmWac31ANtp7r~7W@0=?2{q-pYvgt3sTB$ z=Mzs1$KOqJi@KY2h}v^h?J>aG+kL%@(BVKnfGOnuU0L9HbV%1cr>D) z=X>yzPWChlS4-fyI(plU8ZY91@NN_O$YMn)>*m;2%8-s9dQGbF>|EnmB+Z2AiHoM% zvg|NHl2Qs%=kL1wMYSJG)Zq9LK%SZDsrVZ`*7`)T*4hd(otDoKFi{ zaL*tQ`k8Qv#ib*mFQ)o)Ip2joZF}WvSv$`fGYmhG`8%6->od}Be_hJ|%kU~|&StUH zBf4syCbOOR;kUx*fW=bR*Rc1L#h1($K@H;1+#eHP`*u+HFXi8nI-h}GqPk4~n-79o zuQ+vhQ|C@~pyFn_Q<#Dfhhm6`sf6iH4scSCwb`sodjJuQGQV{BV^|q`y&MO`{M5H!`IeR!@4a&;)vnz_!W{g>NJE7=&qztiuqq}THRIJH3+&) z;dl8Qe7q*I!G$WG@qYA+M?}9ryW91PIAhg?XsJ>118w#Z5Z1cE!vMqW5*!u$%x?XP zaL?t$e<1IH` zh%^;@F$RZJ2Gu=6_dooG!?KoNq$FEoDv1URcvGsN=2G@EdP?NsDty0VGWA1U7IFZx zf6dnM&J)c1ZI?Xl>BsF+_awJVKabCFW_O%Zz`85XlnQN9KnTl37=^9{Ux$EDf+GFkV0#?;FOHZ2iZ5UI!Go`fh9 z^ebYP^*_OS=s#@yLJYkjj@{owT%0D+D6&1xa+XpFVzBtN^&ubB`5K>~K2{)_4IJu9 zfBqO5*IGf=Xz%ZgIQB4;z4;5*I>|SWjroEqjbCN z3Taln)8v1){rM1(pd*tX417-G+^~D+o^&j>k=S(5X+rJqDi+6m^Rqko@NjGf?TfaX zp+$qvT_2QAK_eUPtxbLIEMlkgzDeX~usadnGt-909c-(=}~KJmncqrp;Ud+I;xpwf3g|3xav6nvaP1$5Vw1 zUMy(xJ8&;I_G&?w>z8k<+Fv9Zs!yIr6Na(slL(g9*R?0UnpEIcV^#1AmT+&Gk3ij7 zIeXpLa*9i}uSL~|hkx1CKC|2cj&;wO?LYsOw(9?i1@r9Wx)SWYw`urYi5_qNj$!=C zj71cF>ZS@8rAOl2!V!Yf9PgLF;`Ij2p+B$fAQ$uHn*K%U56@{krysC84v@#z`Q?~T z3OcM{u^!QkAAI_STWmh4flU?UgSiVeS@~jqmg&~BiiVQiUo8ZkwZ4ACWf%6-ZSY|C zv~!e{@wqd#hp)^>&!C9n=?9!^d-i^BOa6wF2D|DwWbZ$G)UDL*Qte% zbWTY>k$pYOU%ckU#!zb1p&xH2w(wjJ=fx^d9@%UqKi{|Ev&^^$#onVKP-hxg{HQc8 ziZ$Mvq2O(AjCl-X@vp-4%8KNfSKh!wgYMQ!H;>rdckZ=bj=mdfLND9!7Y|;q?t4bB zwcYXoSq2!gunTGb3`Ijs%7xfJT)t9kKfMcZuC+>#Nqeejx5>!x+KHHrw=#+Fjjj0? zk19h)as}wdu#L;p5i_2N8r3=kbfogHOedeGZ9X6T1PM|rVhm)}0rK9fr4`c)r4PN| z*!C~c-`$s>mzM=9!u8YZi{7BJ1*wy_uAMlm;v<2hKq6ZHc#!hTe>L$%eKTpc5|-+pPDw4H}0g&6@Gs&h&EuV zP2OtyO+S<>-1+)R8Eg5y2hW^0psdDz{>Y!H?j&;6Ox6`^y~ZT~@Mbg(+dMj7(fqm; zfL1XEZA{#yFWfGw?$YW0Uxg{vtK;RvY5S`sS3coNM&2>NWMgYfaN`AxXEAgEyeuFk zF$~ADmxjL{rgqJ*3Qo`~_*VGkZoAK2&V?7k{^;f3_lxpWg?S2sZ1CIuKJc3tt$B@_ z&vhbkK=4tubR=HLJ>NDVHnoeiq{?d2dj)+B)LL+<-GnwGW5X#9>!+13C#JmvhnI^P z?Iz{;fe@MvZp(V{z6TKG-gX<4j4g0kFxJdEe6tLY>IIOku}{nb$Y<#$UhHkhl|h)^=VXl z$k9Lc?n=vYon6``BDp z)Gvu+p8DF7ugVoCbC}}@xvx~xYz=H1V)?@(ELC#c>6FIN11^!{f22GZT{#>5Vz3}K z+#me%76Dk9Evssl8-ys?OS4`nhXLprgx`M*VldBzI z9`@x5`H#>q+x9+2R`Zcr28ooNG3X2dHZ-e`6g z_I5pMU9Md-T3LMbp2Zh>UfRkSE%9JQ0<~& z%fN+o?F%lLE}2f-H4&yby=C?YLz2CkDzxw4eyf1ryH&S_8j@}qV&sNs#&kF8{+jnz zNfhrpp6@7^H+@M>qYY)Qki;~?@2}9NUk#CAKmXvdnDYE0B&Q@RCbTMbx(6fpTAvk? zYE7QMM`Mpf>gAZZ5VBxp;`BT4bw}ckZHrS{xMsj2mr$4IPQ8E9>sI$q&-S9g5wZBs zZHuCl=7gg7E8hNsj}_!a{3?5Zs(5?8!aa0D^no5LWd^P6Nf3tGmG5jJMtVA4CRN#) zgCX``X%@Q@03%}G+bSKXRN>xqy?BXT^7_BSRQH5<{lndW0d(4tj#r4y0{3|D=iVF5 z{~17c6-dx;=LUK2a;jefe@_ScX!sVDLZrB(LVCn!@+;lr=@HnUnK|B(#iY(_@?VF% z4ReG0sArzGyi|pLf0SF|YUfPilA|P&wEnQ&EkT;g4tA~&+lhl-XpsE($Vfb+K?lNQ zcil>NRvuzaAeUicOUmX)&Q|D{#?Z<$;^@|t#RF82FTPnE{!#dTU83ep(^Z6Ldi`G< zPU|6m(-DX?E@Gcp6A5P6`q4QNKsbUlcu?PYBP*8lQ&44S-N1%uh?HE-Gipt({O-*7 zpCiAW@~eff;B~vPE(bXk?_tJ75fyV01+JKF+sSKwFt?VRh+2%0)TGU|TJt$zH}0$QB@O;8W|z(316)*=v~D-IVwt_OfGD*uT{#y+s`6~ zE1<(-xrv0SQ-Z`-g!vzy2^fdGOk##h(W40BXV~J^d%WxFnbX=xdu})K&~l^V$&bjK z3Hz~{csO+Vz3YizorikS%DxNE@pxO&*eNNPxmn@*c>0ubndR{S`80$lpl8Ddi4T#J z+=UzAuP)wI*x&-2e2yq+f0`!3~_}32R zsTAI465qJOxb*|MB6eH*#Fq`>>SGQ)*Ii0}{fMv0O0I@_LxYAq{1 zy{E6o3aiKm2e#SncW(<_A^*+Ko!O1PT1@;pn))K?$nG%Jvz-Or8zlcJtC%=++!Xv7 z(rd*=NRh|Hg%#<>uF??bulHo+q28Fk5nYi zE?RPmTO6C3wV55R{6g%bVD?8SH*>PQn2jO5Va7MB-ZfnFZ66V4%z>>tI+MCwm#0nE za@HrU;JF4l4<$UKobPMWr_P-%h%6r1ruZ8+tS6`WmN);+PPNms16Cgx?wOrvx#|}E zN6+N5b(HjOR>BX88^X6BW$EkMB4mVjJ8R^en-dMX*rvX*TlPpwHYgv=-`Gw3Zk8q( z{LSOLAGZ$_+n0Du&JKbNJco_B(CFzWT`DTNZMf;H8dhez9ldPy+5?WMyAR)+Y_*Z2 z+_3OR`x&prxAI?`!@Dlr9v|W~iWMc(*wm0c$A*(b4bjZ@72(5h4IU)JdOfbUW}lrVhuYg*oWsKsn~K+ln-n# z@(pcL6b|;^>;lR)PUdSaVY0V9sf6!$3@3}6trcHU`PSL^xbi^=KKS*Z37t%8l8M$$ zEyQk{eqjIBQ0)65Fp@A?{a{=1wQOpanUp2EX#8v7*n1I^W3!h8qBj-lgHt^#Hgwg>di5h5@CwV3!%#d-OQ3pX&DygiG2p`A#RWqkdbX zCOs||=zL8LwC!o5PH)g_m5+Uw)i2AA@`5b*opadu$8OqvOs1)K!|2H8mQ^7^H`ARv z$j!`d_&#&TuEXDz0li(Q>h(dYIL&Fj?8Y}=v4;H%anC}O4D|Je@XNKR^8=#`8y6;x z=%|2ARgwKPTvYAh)RXVS=yBL^!jJ88(vOR-JI9A^f=QzYYf^v>4He4++Nh`1235zjvrtMYtfH?0d{D){tynPts~F zdyz8Tet~D6UV{#-g|{rxF?_@YZBV))^zFKww9I2aegP%C^~)15Luko75Cx(6D1LJs zYJkg|jO!TtdvC^JWF@rVV)eBweuW6H>~%fJ#=5(tK_q@Nc!h|LrO?K=;C%63l#&nD}`203{_%JB~ ziRCUw$EWus{vwvt765bDEDC?YJVP436r-tke>#F*Q7pwvW?JK*8IKp%j8uL;dFtV% z*UB#k6;_7RwifaIUqYP{`b0<2R6Ve^`D=G=jNSCMi<@lTzQ~CD1wU}XvI+YDj-~jW ze-hpMdiBVh0kw=~(qUV_Y!1@J@U6ohHNVAzFvyWBTLP`$BY(5vEPGSG(|{ zo$;X7yNO4dIS7Lfw|QJ{ICzop{t@ok-^j~$A#S}k*s#VNJM>S#E;#JDsy%({RqxI- zY}-V_r1sB?R*c`vLL>AjvFJbP)4q2@JeAKwk|kk1w>!KrTTrlH7)MM_PDkx=g;z8l zi`{R2y)(9@+V=zQk6y}!(Sa-F3Rir`24CN4DML*5c(ct_P+dWF!WRZ^XAOrote@Bv zsgEy+ndO}2pTky9IPs^)MxMK%_jdstQkc@K!nfSi$^_NsZr$RS1q76RnUi!S#`CJu z{J7>3So;pR&G({j4hy@Opq4aL;;I3*SDCrZa3f$p9>r*AC%BtM~uMX6r$J1vWhOXmX3 zqHx#Ds-=y_%LR=N5$!jk7(K{zh1IO`0Z;i1!8nAn&mE@Ci28!X>*s8@%qBltgmy$G zha6GAoTKDFh4FJ%~Oy_GnthIW1^rVY`K7r?~<2x+k<4(VETC4Ck)x z@^g25UF5bSa3knRQ8?x}KEwxR>| zC;R9A9?1*z`_S^0#k75vs$FEe_M{?~9gcV2<(_a_GyOulahO)%#%a2?wQJJ!0)1{K zzt$1xJPK?IA8<{Zu$GPXe_?-OcsAUE1vtz3KDF+#ABY&?L-0lvkrxxCg+G8IN2k|0 z9xaDZsSd1|O0ToVcE6^%zLH+k+g?E%FXMo8`?A7&78;^zqaskz)HS_^)bhbl+Mp}? z{XK%rhcp#UMSSDb(rpU;;vhy&qH`MmwwXN%*Dl!%R=1@p&oi-d3d1$LyQijcZ3H@W@b{2#$Gg|bT>*V-eS zC-9x+eO>X@WTy-Nh!4B);V=S9uR+F!k-W$jp2snM>Md5^nWzp|^D~{XZz1oxWRwdL zcD)T8)?f77tAg**TWL{YgZo=Q-S==UZloI5pr~Knlz2OZe4H;f)_&`IN@?<>(Sb|! zaS*)}@3E}*qn~Cx3oQ&A(FU-qE%lC%g)a-=q^1|Xf0?yoq+IxJNBQhZ@^r@W=7=Z5 zmX-*$(?#cmzdzhJl8{+xe!J3~NU&^tJ7tmQelyqa)V{v3mb-<0Gzamf@2?6Os=%PQ z-KARhT(W2$3(c9(zyGMyFhdA^Md-_LF5DCzJo3sM_qvGYjk`D}vyWHeKP+3e%)E5` zm&0dhwYl%Jz3`Xynr>TCxVb_0YLDTsiu%OsgnBG_TD0# zFezuq+K}*jfwe2kYs82*?@h_rZ&sE^l32!wE@IJ*q~`4Pfv8_rKk7b{}91(<&~P&$`TxEH!_j8iPe-lOuE z(zW)f3sDQF&>RZrWpA!rFH=d@2|mLa8MX(yY9to;E_a_i2>bp_g4?8>!V16Cp^4Jh zDH4RzA8|am+obo#OmrU_y+X8`COgl#Z|y2Av-Sgw)zFA4bVwOJ zt8+?J*8` z5^Of2oS}LUx#dvxmj_wKosM=y=xMuQ6w6 znA4CefhX?0UYC}B9N)>gB%r%w3p#C3@?*Wjm-iKHm^=9CL>y$?=N@f4W~8KN`@kC% z|3TLh1{_}MxuT2 zYeIA#L&ZWz-HgAS$8%8uYZ^Ly;?x%+x82GrIZ?;0`5cEoSKfTKyj$?7tQpQSY9a(H zjwz@w2p{6U4xkG?n9jV==zdxpDaKNV&6I0DdQgT+*;~&)d3raVH3(NKFZ=>eCmUPe z+45}zxS%*O2DWFWu5}<0G;QgBK^MkTv`1?;sfI7>dD67at^>5Kip3D`RXv9~H`a*> zv?uTbC6TKM6y?m9#1X5Q8u$eIQShqC<~o1tPr*Y3X@=x4ZQgRkS>;RY+PQ$#gMR;z zH_eAh;pByCnwN2dwCsZ5$>(>dgQxBj+=na`Sb2CH{jqy~1kShTQBYpXuJ$H1BOuN$ zx<^5hbl7c#bMR2tnK>{HQ^O8lw?QLP8PBY*JWu@yVX2P6#(xXVJIIIYJBub( zCI?}jd801nOs%^VD9&7O@)xXU|FoO@WcX5UPkv5w&*DboX;>`ZC#)%IL>P|jbo-&) z{Aeezt6??sM%Gf=xynI^<+>gteG<-i9#H1{9=k;9rNr&AHJ?j!UEp*+3R3HZPd)|z z{ok3|RPUJy{jZdwdUa?^X*cI9O|^y3xsZ1!8;2}o%u?N2_5RWy%&kzm50w{%Ry^Tg zqG9tuE$TJ3-CxLHj>W%EWW)gno7`M^==zh2A723p7o2E!Y1J07wiCREm4$m#5?=21 zTC*Y5k9v1UlK`%3Uv<-?Mfa!YIj97zIfdvpCI27ny$4iN-L^0af*>j&qJjbmiU_EH zC?F+-VnIa-hzd%TfYi`ifKa5Vlz^c0CLkb4C-f#I6zQQQ^w1&F1BCW=zH{EW-+A}^ z|2zM=_ndRzc;6U|!Oq@0Yt1#+oHJ{7J;p{F?9gZqhHmV^05;>(HO&u^^nyvY^_&t5 z4=X4?5(y56oZ5yP6f)`dvbD0+<`<(1*XVXA@xGgWwcS#e961j>rA!B1%}OMQXwE1H z`5I2MGgkFLOIQ;cozhVgV2&Y^$*Zy)3%) zoOS4)iN5?LuBIBJU(Y3NUyHb0QT@O;bE($xS1@@jV4{34es}1aJ~#Bb^O%8k<%(j( zb)yv@=b9dtq11M8`{!ZPWr(wxy`~@bpl%B`DxN8=PH7O$&5zI7M!Y&m(YKVBp`4w! z>U-X{q-}Cg{<6eHeDwP=o)0Qg7T(sxHOQ7MC09{}EU#nJAY-gyW01zPHz;+nOW((| zV@|k2F1f{!z_aX6Szvex`<(m%vXu|lpz~-!4G)|A5)yU2tPd(atG64ebh6=qU4YPt ztfGSrmv@bNtRAm0tu>UlYlV_W=t?3wl{@&hr$ZK#16*3>3Il{O4@v@Uc=$l$U5D#o zQYgul#6uGJg6B^zt?Ei?_L03D684m-CubZ8fwI z@EU|;d%%fr^!4(r1()itr{_vZv zw3>-P664{rhtq>~-v}?R8G?W08_(E~5;qf4^#1p}<#@5NkXCfv{*vM?V%Fsw9vvm; z@Un$1vw8uVkBg9|?g6l9^I4u!WFh2Pf9Cfkk=@DpKvIJgc)_1fAHK|)Sdt|_Y;w50 zNmxp$^twhYWbDX8li19Eto!G-xT7A;QA#OqRg{FoXZG!;WvUN*uHjv;j@POw9|{h1 zlc#vd-MJ(1!%)}N=NvWLfVwA(P6K}al8>8S2uVR@wCj34qim>r=@OZhzd#*@c9&yz>X=gDyiEw?be z55~p1j^5cdUNtC^#Ztt+{9@tVHr>hiiaf^8I!=CwiX=5{(cR)I(vq>$ z>!oZHWh+c;#|KRzC$R}*qUEUUR^CI=M{!y?FyGF$x{384>?@!QM9r;~?`@wus_Y(| zU=h zeY{yRMs~t?0E;~w&nx!(qkU)sOjOHYxqNG0 zNjKESG=r{#$x&f;cd!2_c`XpnMRQuRxJ|w?v1*N??`YBGylmw%D88;BoHsr;JJe-7*@m9HyNRzK&+{40uEb0kcGpK@CGYlZ7cBITLVX18A#t~yZ`pAL?XY)`x42VyAJ zpHLG8i!oRa!LOu}8eQk{b7Wf3@bT(5PloY1@(a`CZ;?*Kb-@|2*Ur0SbvHb#6EdGi z1onK0)F_I{{TXFwKi$B6W8t1QK6%;Y`-rT)rF;61Uj?b;F&Dnw;fVO9UoU@+6Xt}! zw9C~oEdT6@oK}v_lpU&CMj|2awO@7c(C5g@uSrxL$jcflSIkE3UpQ1*_7LYu!f&Tx zVuxRMZ%5^&qqaue2!|t^{3Cn%AJ-BE7#o)+v`M~MYfLZCWZoiMfx!^hxc1}sbnJUJ zR*lIMDtJN@S9VEsJVmntU&emh^mF|$QRMr0kFK^@pBKY7P7r2K1zjl4CmnvxgXS?W ztkp_N*z#)+U&TZ2hc*||YEpDh%o2q4aaM>Jb~yeu=^i}rUCYkG1#8^1ak zRWluHo29FGT(CGAEh3r9Z0NQM6)kBS%MVAHOx|}g*zJnS(~&H;Kb$<9kMZ+}4dBh4 z4Rh}}jHsJ_J0EJi!Tok|0$n_o_N1`pfjH&GFbRzej?o#DK3=9w^`a%!)-)c&*FBa@t1h0lMh*!a&ff2Ddhc_ zw|ujJkt}klyd-}2o0>qYGx>lkw_t2GaD@`OcC5HIN7N!ggpnK5E4i9^K4$h~1^5XX z-Xxaygs67c7Ky-o-(RkYS_Oj#Em17Aav&krlS4_FVCvl;qCdhSAaQXs&p(pjtl zE#|+CJj=;vsw|g#B2-yX4*yhdassj`qj_fL8c5(+BEHAJ@^}#2|2;kkAtbtLGrB%k zxt1x6=yKp*A)DgX%W05ja4Evm{GbjuP`oCzIE^_bgl-fR?5fAXi+<}`lvdgB8!WBq zm?Fhq+gd`3dgtPiDRnh8CL+>BY8mOEw}bmEX)43w;wHX;)b)ZKU+Dh4cA9lo4&8AL z0D|EOmev}5|Mx&v&UPcGHMH?b^HSra?u=PS+BLxpW$jiKNZb}gCfD6ug-e`=u~P2B zW~GP%=;)@Y3KGCTg7WMq7{biwE77Y&`OirE{h~-cfv|jy*<}kXkF#23tkMLj`_Tc@ zGC1k?Fa1+jJ|b&OkWJ%4Qupf{;~d1X@}D~0zZlV2haFh8WqM(5&sBpmPd34tYwtvx%vCfNK?yH$)|ppHt#zoQ&$+?sw{FHRD(9^(3mNAgYkTImd< z{d9{^IBEWNT5mppw8}MGP||;*!HKffSA<{b=rk^YelWaduU0(vrnwPP=hke`jG3TI z`A_Lvk`^v!M?v3LmmO%EaSZ>uP5&3~!hhmn6;Y@}pA#6d9Kqk5!YlCgDmEhSZe@-N zBSZ4k1Fnh9GpO=AkGVxR1}RCEKI77J%KNnSJ6GpfCK-557Jb%Oe(>tIipAxA{KacU zV~5c@w#<8S?Ve{XuRf~Wr#qw8}H;UV|x3)5hxYM_lmNC6YNLw(>{m{2ZTrCTYIf%qWAP!sp_^YH|IPzu@i}1OCSz{;pFv0}nHsnjv(<;6 z0eq!lV4HHQn`XO^ z?B2?hF~X~#r=goP)BOXT#oDAIm}qyz{B|?P(ld?>WYG%oF9S2L9hL1nY7P?KE2S7z z`mPBHBsuxG*Qq*s$0(nW&w+A^{sY7LxAVcg0qkJ=uwZ zPTx-8Ag{J#l z-Fe5|xQiMFlDPhN0jRcaI)Ux``_@|-Tu#H!IHxe-^UUS^F8-J@*M#F4A0tpF0`y)J zTNyHBz4XPi;%EP1ZQ7qk8KZI(WTzY0B@ zXH5huEh|w5V;fMn1#`X+$SE_XQIAvo;;gJx2$GRH`(RDqX|Ybs-c~?Nh5uG!X*`c~ zzFg2ENqgAB^RP2=(6!LIgdI4U1D1G}G2=OJi+l28_*q34o<`p20Cd?*SZ%fBml-h# z5JjTb^jDXYHBUh)`{#AycJ}MR2dB7Zn5;9r;c+N&n*!RYXV8V>g4!@+nyHP4y5!eB zLSCyJRde@jkIQ+w$T1*R>kEN*tEZyPIpdkW!IHRK6Cn3fQsHc&r zIm6=yl~kWeM*7WZg%sFA0jus~+Moeo3G|!KzH*yVAxaJeAd&}=e>~gu;%wMo-;Ysl z_en}%nk+!|Q(^vGrrCFKZV5B_eJ@1w zH~KXTnHGaFFWE~l;2K9(!f5|Zbargl%u(H@HOr|w231J~I6nXu9(JKd-Cf{DUOk0t zkkKjL^3Y@OGT{c6Mz`rm2w>UV?*P5~=(~@#e6v1!v+t`_6s6M`WJ!gaafVHSXT`N< zig)frt< znY=2X8@MiHa?;Wzt0|rzH}=AB3(;L>Z2Ck;ELtv1dmPT6q0)tJx~s{8TCe>XduSi;RVmfta(or{S z+h~ecd#Pych5l(GGXTgsv&54tHx&?jMZj*27s3AVX%=sy)nU*bBd&)G^pIVZn=*V4 zj&(&JA@j?6-K;s)Cz?!-0t4X(?J2cCoD0J(<)AP1QA9MzJe{P#Uxb#G7E zO3hZrX7FyUvLen4j+Pu>$!?UdkthTXl^sEmX7fBBz2ts*k$RhgY}6qvj6 zEq&CFkSPdPkZtQA7IFb0-3jeV&y}Q~zWdNbs>}a?YNu>{|FOd+iFv;d*qjJ<{`d(6 zE(+EAAt>-jrruj}Llf9MHPr|Qe>%imEWy>lw3n4HoGsW zx42F3cv7kGADv*i>}Lux{kkIG)oX&iw)}2a)KojCQ5&0QBVI2|^UHRYVg9)B2R{A< z?%-}Mv()(&r1TNkWf$3gl}0vR9woEx1$ z3{ZC|Ph`o|kqeK7q(5GL1owHnRZdUm$6ek1tfVtU8V6WT;Q+rWxAP^7Q+>_LqR zVu2SpvV5b;ic`RWtdA-{-o+@tU7$)8zF~DCbvrQJ`*R4deO)*gr7)?;``Omb<$cvpb#CQ3JJ0SL?=3KPG&X!&0W|X~p^> z3@HE`b`2J*2WYX&Q;%3pIl(dwG258{FN!-Ma2NX3;iu7!hdI@=jB-!(>$7uE~yTvx2@C^r_TkJ z*7RP*d^W(dWDeq|j&J(s0gL`T!mB^e_x(>3c)$1)I0{*Rnm?)UPZM_i2A-Z2(t+>T z9G~$G9{59=eMMTNo5C#9v}hfASLz+q4IEIST+?}Oh3wVA-m3o=yk&a|MTW9iqdgLZ z$4RvD0ueRz^1q0@lqD4RC}hlD&;6Bj8_SxLxS4D>Ah04 z&s^b_t&7{nt|hHC>l`F`kAK@1%-C(ROk5$)Z4CjH!Ml)3J1Q$gD9e}5Q7m8!UoJda zDVMbFyB0Z)MRDIvtU}ilQpQY9xcmX=9~k}D&?u-qzQE?>(YVc{H=1Z7BH;8!fHs^I z-};CbyziQzxKbWP)mv$H%mFLqS1J=LRL3Z11yVIr+R)sY?gc}t#!EAmg)I6yH} zmZX9ALemop#Tf(zv@-!VEqgY$o>i@cplSMwQk63?JE^9Mc?#}A+GSSHYNGt`G(k^x z<6Jv>IFsTm)1XP~Q%_Nyxs>C@w4AYI>CLz_F$L+NM<|8amNZI&{^nV8x*L*zEZ~nF z`2RWyNhXzvYBDlPuc%3rf7 z8Ik9%4sf0UV*af+hG-W0A+IuY;A%KXd3Co5U556$X|i3gqWbzA<$fY_5|HNQ_iz1j zV|golBgw#^nSgk&NI5>2|EYGhn!YawO_yXDs@l#sPrU&|2^jl0n1ddozte{R(Jq2q zsT%7KTrK%+fM6GeA>Q~HIQ0>-xfk-;<%&95zG-x4h>>2ymK zd-|n+NSB;;%esKk4lFb9v#h5>FQJ3mLahiJWk>ss(WOiY2}H!*Y}hu9#WD}z88}A! zw%_$^KVsyl<*DgKgDzfP~ z@;VTExcOFARwskh@rt4|wff+l7?93=8NKLv7EPe-@)nsLYWBvjSaQdnls+=`yeq*g zuGr#-F1fK+v`}<(g)~7pf38MKU zbJ@nn(wPJqOj4Ge_74KA+ql`N0lMZa zHM!chvkBA#Kh59#FzfdbYkE3)e#lVft<^JD?r&}9?!9*1^a~{2dR@&l1%xwNEL+9f zAMg77MA41;^m;k(`xhpDx^@9W6BX9yc0#dzCGu|)N6dCJQrdUl0IE#0+yiA}8J4aD z4VrZypa#I_fq+i9+wQh9OM$&f>M*S;tz8MFa{yA#Jbs3Ei)+A=061+ys?~?DZy~0;-3EOvYgE@mzq;aS02o<&)T2Y_ zie}H$0w(Jj+LM3h$2}kn=*D0cI}B*g{xlZ;otvXF8IyvlXZPB1jKTJ(5x#@qx3I;M z`51z&A;!E+NEx1ZEalD=JxLm|wyQCiW98ng8dsV|0?)*{o+f@taTg8h#B$0`&P6-@ z3KHYtndbV4U5j11Ga%=us%*XK*aqy=PUX#?bew$6-ziJ%S9@)}$QSr#77xDtZ=ojc zL@Gms0(rYDFDBim*;EOkSx^}b1|e`SW@#CkkgCOO!q^nd_G+-@u5dK=c!hlsRYKz=-q zGvT`svghm=uFO5BK%yDU35R@!zUBx)z7Ot1>3DHiRIEByd_!(5Qi(tU?XeFik0~?V zxrgZ=16mzpUPYn#bgSMO9A?kvFEPd5nrW2GX(3K%5lCuMR_X2}@gk`d_z1*cd7Vay zAwL(M0B=Cjt0iJUIMLZK%Rz@Auc}V?{2kcfM6C6>-3#bhm+D#XOvxYiCx7z6nC6BL z$Jw0*qn@-+(b}6~$vjVd<5I4*ZuIV(fG5$0v%e0!fav72PTSsa%Z{|Rr61RKfw*lF z(QTT=OSxBfP3srExX05j&CW6$OWs4wTAoAtU3yEau`fK@WD7TfXH-0B$>s*Dlgf;q zF*^rF4E4*AS~1~qrbd(2p}CvB%|%Ey|Zc8cOf8wo(vgAa%&EFtB?egwd`j25WF~ zw#FCOXt>m0UCb(jEYt}kZu1I4DvJVh5u!=tz3OVkTvn9dJI%OI<(211yU)NUxNL!5iuP=yfyQAmVNpBw}W3-pdE7bUW zTidEPV0PJ8+?VyGrkP}ag6TeBN&fv#u6x%FYi(u6P3%Pq&!?1QNjXdsO=+?xVCfi( zMbQ(R90@-dP51p`Mb)(1qt7(SU?<9vt6DMg{(eM5DNF#-#6Je1^DXjgS-Hdz;tbMe zz}Oj;Ds?`QqQZF{Jsc=mSQh?b@Z>P*d{_uiN9Dsw$F^I21-GO38?#8wt2?C`{o!}a zx4c{+EN$T2RBhAc1zgjh)r!>o(TOdZNZa>(JQbEuaN1^$gsGQ2Xy`yhko%UL9c!Vd zHGF(6`t}Z6>}Ym{)A`9yd|Y~05AKA(c&hJ2DefOGmby=hX(>|Nar=EXoE@H2s}lCF zFFLW1p3GOY#~#Ma5VLhlZSqHUKKLxnqq&V>Jkp~qZtl@2!D_5S5RdetLIpS0Qu4g@ zmd8{v`QVN|{2D7>{A9K@&^-F2tO?~!(lM9TQOEh?ZoO=P=nqgjAtRvoadh?+Tg`al zJ4x8VW>C_t#%g$*<(Eph;bA>%kRLtq?(Ps`UcIs5V=PE4w&*$JBG+!D?)eX~eaT(X zW-!#Yf*Xa0h&X_WB1Z3tc~G(}_1+ye=nosI5S1$1s#khf?tzb=I^(9pAfWe_9eoRK z39FWK@6|8qszM`-1x0MsSa+)Mqfp6)67jRH=RUMV**DKupsyEf-l_B2l2?P06lNf| z8rGtobS?+1*cDxdTD`9diDVpKWsY(SgPQEL$oxWS$E_EVwQXnSdJ|lI2Q~$VXw1`x z`E_{)kWH-&F40F&cn$PQIf$Q2ffP}Z3g{J`T0=CV8c8s>1vb5b6eGHfc)LgkN1fU8 z*SN-wk8ha4ult43FcP$J^ z0MRyQ_q1_l@4R;Cmf_0eg z;Lczn8+Rt|Jet72phK9Z&=-%Gc(|Hr5b`|~8Y`>ZDp4tMXq2Ld@6Nh3{_ zQv=Cwju(%-_{g{*YQH%^n6y=<)o6OC8y6b9ld46`FX+uJPCQz}uH!Mw6J>SvokASE zq@ccjO==Z``Sqivs_oo&ae`G~2iyh@sv9E!ZGJS;(Wq-)YoxAk5KhFwJK~ddrm;*%a z5G-Edb9|Uo$&xsJ!f zmf|;?epz|Sik)!}1UCyX+-WnHvOgJbq#PnyTK{#4EqCby(QTOnHZy4?$nsGbD4w|D zoU(0NZd6iMMT}DWIVFm3h%NodO=7E93}cQ_K6}Sxwf-6ce{TNnjSn@qa^0>{8p|4@ zh^2C*4I!?@GCD{!|JX}4VV|2SUXJ_bUg-!S>xrSx<5*lHpymwE~>TT|=JLG12#a!g=OxBcwRBX7@`RHI@o7 zH3X3p5;&kylz!#9WH9N}aq^yCfST4py_}$n9{T{7RT)UaqcdtZ?x=IaFxTT@%*zsX zr?Knj9tDsJ-5}D;L1U=LoNleZbVi#_4JaqrK^waylSXpv-cus;nPb2;`tOc|4Nj95+Du2hn+r_uru94I`&r;q&ci-&dA&vP-K1 zmbO3ns_IWN4nHNak0{&l7!0kbvh=%WaA}O#N5R*j*PI_2D;pXyU!G8%>a zVx+N4h=%t#NjSZ&Vq!GAecmKJKx}TX^!wzX9~#oX+IfF_l_CvWk%`DmSWwFaa6`2x z=>^>E)8GNz^{4j$TT|Vl+E>?acK}cSTks)#hK+530}_3`RS7X^QQ@0|0Ln5PO9_CD z6lUrJHKvn`<8h))@X1DZN(1{^FLoiVCVwZ^%95Z0a)z!&kSeBUUW&3vNT_nd5so91 z?!zLD=Ps*zv_GHMBFL?(w$O7A>}JcoIlLjN`%E&X@-@h#uI?a19loTX)9l=NCk#C9 z=bktsH2u*~g_+}62UBs6d?VNGr=Zn_<$xZIrJORm%=V!(tEsXo7q?a~TN;cZpM2Z2 zSt2FPnQK&3w!nAA$<5ZWo01obm!l$^WNy!dozVd8OkI^?O0cQ6xmTX$@B<`uZYxUn zoVg+mx0DdnBwS3AU1IO1UD2krxuVU_m#d~ryPF}?&Z+$yZIPEl4h7^^`4@c0IA%Re z-&8#D&#zB^9MX1ehE`r(On7lcz~Km1KULN%dA;>8gni)k`I!?(&5kI5(p5ac;9%z1 z)LzM?U%CGY&w#z}_ayB30VytEEZr4Q-(-n@=+9|%>kJ@(ojMtDc5Zzgu`zN7ZWXs4 z*j`#*aZmHG-?FS#0NXWko`T&REzE468aZ|wVkGdUhJNkAy%u(-*#dEYL(~3eai(!# z@HBbIXM^oBlk07fyuJjuQl&Q^XhQ`qWpIplraQ$}!az`FEuQBINUG~>Pr_l>@xm&M zX-?4Mur8ZJibsUJ#9fw?x?uQH5|3@b!X@oxu;-~zqBK9FcjPD4xV%Vq-OZbPI}G4wr0&0cALHIDl{(zTiIINm^8Kv!*-iMoi> zxUrYa`Ho_j2-?1^ItBD43tK^DTu}^Me$fssFV||}BRi;Y6`XZ8yeZbR|{hsx0^&@DvCv@7j6cldzpc;=nNXvlEAn%wW*WT)T_u~zPoU4{I7MUbc?ZwqpfnuBJCwO-{&B&uK_j*NQ zv#i~&BJTZPlrsOmh2{0jE|1Ku^LD)AlJ^)wJDeI41O1i zVvIeqUtaU=FAJwyeEJ(074`WO=LR5poX7@siAl&26=C}G{7m1n9t=zun}kG1t~o^G zc`x`XjaQ-{V>$u19{BEQcHxPN!KaE)A@M=0R*o2BMBqGD*Lg8=rMj%fo8aC^I z^7WQ$z7AKwb9hYK+cxi;8xe)c?POub>1U=Bxet<4 z5pMN6W#q2RRXoF{YM!TgpN^24bDY1l$bFLAFFXk-J|+5@PzT)!Gb4|v{Terv>DSB% zKCLW6<1|TfiMs%s`&z+r4svFp$+)I?=Umg8?vL)vyhEp_H}hq3SbwJBPkX$Koyf1_ zD4(VkN4iw!Sym@50^JoO949|H^%q!OFCv~=zDj%JUN7V;qGQ0nXzk)VN`bCKy&1O- zf}ROjYF{U^?frdiNhQa#5@@GyKJ6^6wwIK&NQwv&0cnh6Bl) z^J3*?#kgs zS-4o5eN}L3uXIu2^uE8bV~0Mg?sA59_>0=F^AB%>gwVq+i?=#j)>d{>I`gHNm?^;z zZ)rg5SaJK$Wr4kZr7DguVEdK@U_%4g>*>2G!d%Ja05)Ww?+MMa!CJ{|Y3F9vIUP8k z{ZJE_y1LEEDH8>HISeGWlSo9c>T)Ph|5QrNPxhk6*=5S*+ul3dQWe4kS#gld%KHwU zSfLQ+DU>e0r_V@7P*XpzS+(IOv27_=)JbGC{>nzFWyf^i3iXRSZAWCT#-AMZ zbd82O+zv#qsSq<)c7DQggYF@eT(7@tg;ieW=`vb9E^bTOU(4pYFq*u&{WR9)BFkf^ z?wQZad(E{nS59xSV@w~uTDGiR$kTCdMqi`nWI}eQSTQQH#NQX4n{(=G>U-;1rb zK`W{*SN7oF3%EIR`fRlxG<_bYU%JB8Siy>6h1;JSvDO^(#hy>kmqbhI-N@D>^#^3_ zXlWNz2QFI$lKNI{J^3RBunk&UR}v~Ml}6f}J!lc!wuS@HDD!82Gh&CYhrfj_IaJ8F z|Ll@Yxp?Q=J)Mp(9v#yE0X7iC^u(BcRs#BoF4T-Ji5gm!lo>Q$*_3Waa}z-WcmYK# zAzlV&)AsRNt7HDNT}v%8)WSmCVm)!#VwSHG|B7-f7UZlkYR5~xoPv#*+) z3Ol?jucF@eRaqYU+6G(Z+czLukg_sp09uD+qasDUr8a=V%8s0|mTzuhej@!lM`Q4sl6xK~-_M^lWt)U%Y2z7R?R?mX!O-Lc z4!>uIT-e2{4cPC@QFxo5fBe+sb&>GgRA<=|*i)FEDC1KQf-dQfhZpg<-6x|oF>3i+ zYD8Dpv->uBL=9=0Xh|BtyJ?buHHCRWu{WNW*wwp>{4(Wa^M5eR+g6c1{$uQuB%?Ft zO|4URJxOJwrH|o4^~&m7*WD`N4(B!}?ea?tj=L+C_T@)l;4n*~WI?^pm~15aSHho;-0?&;tpF>fgax}RUDodYLJl&EDHrEk z_}VgIf&z-#kB53Fb0N&;3hjKfaNrlw9Ax>s%i0qc(Wy}mgwOuc;h=(^O^%CDWxorr zJKE=UHE3LH>bRG0D%8XR`{j~Bnp^}=z0JFV<^mUVJ|4a~DjjACE>Pk4j;VJhWKXP> zO-y1+YGemg%k<8JH(1@={o;{*e3Ir^gv@fx{_Z^&9c@>L-A1$qZqs%W;a;izK^PP? zMZ_r~&Rg(l3gDU75%r!iW4O=sMAiJ6d_z$3FO*x^ucP`AA0ED=3%L2dm(EhpgmiDBgW z-Q~*CRG3Ktv`z$hS{#kDUOc_=0)MndmBTAv*a=JWlB_1d5gg!KabvTr1{c=f!3r%b zDrQPY63RrvAX=Vbfd8h3b#s7I)~5NWHQbUB!b#6DJ{@&>Al`{dZ!_;9{4a967a z_)aG4crj;UJzr4n52kUls7=Bj6^N2T$ExjbI-J`Jf!HiXHLhKz* zfl-g|y8cmDtotAz%A_&TusCIL?hzMn+}J48c4~WO6GT)uf$N!T*%T9AnckRjw-jrO zGyib3m}2}|)_gT;%KmV-iRQ=gFz5qDO!Nvn&`cAp1uR`b64HSOD$!VB6Kj+(AoTIT$Gd~$#X zfRduf)3?ZbGAkQ~IHm)#KR0Y@GV3FdVPS~aS|Gt8Dk2p(_2{?k-=8lYiF<+-XGDwp zCpJ1OwVXXj#>B!iSu8guTVRAzw347Ey72*l!*>*l}YvI$& zLD&=0h`}=Iqb7cAWP}V9s0|N?YzNxr*AmEYWqY+u1D-H>uZ=L7h!&brOMdzNs1+6P zI^lxbmRr)fEV%3wzuGKC^{uA=u**durWLucKu^&xPjpOQmo3G9sFO<{3TL#!RhFET zA&A`A{UxghT2`1h1iWn)-%wj&_n0~CG22jbw!q38E$7*^rOX_v(?LsEJgM*epU*|^>+^zQ{pvG;&U9n2?pE7v+965 ztWt-4*WBb$PTb&3QOe35&Bo9fzUeCwW4rT(#O(*D?todwq|UFLLbsFmMq!COSmlL4 zC`6tHCE56(jA?qygR&$AeX74Pu|qpoD0IK|iD1oEuL*WFjPixGlT{({iP%#sr5ynO zvLR?32g=2RhGO|4%#OWvd4FTb);+a)u6~`a%S0n6B38{~IlVK4$hUb9oB;NM#v1+& z(D)N>a0&okrK&4KCAZBiWGOqtI58*1jC{jjoA+6yH`P~g2ANIcyPE0*T``MJEylXT zK8`C;?z`po_gp2E!UJ$l3O`>jW1Jp2wi)L;QOJb!M!eALpeG;FSVzUqG9Hl(c8+P1 z)tgRA*4JtFc+k$VkN}%kWOJ}uFx#OboHCyE^kPfE8hzErW*#%$kT!8T^u!8(Yau3;j+IkJMtG5W=dJ zDo%8Ry;JDS} zD$xz;!=)*2EHkUzpyX-DE;4oS++%7@#3;~VPa+mi9O~qw{Vf26s-*(aMt}a7-3tMn zgZ+h{fgTUd-Fl~x^r4*t?x88)vmiF1H$ghB0uK|bAmv`%2;FHQ4VtR&Q2z4IC1E;$ zV}MMy#}l1aHixHdOMa`!S!`kZ^E*Aom^+H4m3W|%`;McmeSgs`o;{-oj0APIJ2|$q z&fp#5R^p4(gTo>HBNP{_wc2MW;b^z#_W2i=wZ1af?##M@Y7>7@faDqpbQtwV9B3?) z5}~}Ic09s6`$Vd*oe6W2_X5tx7D_;_e5jQ0L+itz0W~(-JS^7hjqsoOM0M)cE8F10 zYQQ&XsAcdSsAK%qmD{hi+W6Ynmz)D=pdP{Mt9vaeC&4vM8GvQ;JT-EYW*x}65&4g+ zeo59zzl4C_X42cw)5Vw?yURt&U);!%PCP+b$@9yhFx&ION^WEnt;NJOOG zRG1>@C@~oUrshj^2LQ*tza%DgJ_MPjBrHN+UAARlo0xuYg#vrb}15XF$;^xSmj@=lgZp9zbHn8&~HrzfJ~;}#$46E$_lO4YB6}% zFF0-X{*+f`=Xr(myAM9B-)+&OGlqP_B3o&u8(kiL1uor}lD>%fK^&q3s&N>AYFC@anR zCOK9>%ToYjsN10cSp1Jr@~8z4Xn+X1(_H}w0Oz!7H8WveP)q7+y#U3Ke&e+^l>l*o zlO&0iKt&!9Imkzg8vHG(WD{^;&DCS5=*ZCj-Owg{=o!@^=v{uM2k}{tu}t_=C|B1^m7blkVx0;tEmL=d*pGL?)X9&b)oR_)V# z39k79L&NnXpYB%M9-ZpqOJB&!M(cN{W5qWytrMbo}oT%u3n>TNX;1Y6)$sXDzM1eeXDMzY@huD zyg#t_U#30eu1ieG-P&8V^bQ6~SlZ%rx}a`<<`p2d=bbpn4x}8i%6X zB-BG{;{XSRb;c;(R6iJza{g(1ekF`k%dMEuh~_7nVQuNX{J?B-aU?w z1WM?{1Tad|%$e#d?tY|}&0pbVq~Rf5Gu8h{&H4uY7bkOr&aeS>&xDfJy_Ve!`RN8V zP2YxQF_Ua|t(dy}-k~WW>)8Kwim> zZE=UvnJ)u*>wp+}(YYnZIOT`uG{E`pw5Xyi zf_hF++>KEtP({;QvIH7Kl`r%p3lQSBGX2z!$GK)F2{>$7H&1Nu#3)Cq0I3TBl%sn<#>e02-uTxoErAxKWxxs4 zBjf*I_*JELzG{sZoh*?L6nz<@PqP+WJF1}O-%tN>x1Rr~S|l0B62n27TQ~>*ls^HS zmdcA}e=A9)+En|e+zRTkDNPQD@sVJ)yU9R3KvL_4&?SkGq^WhbLc_)KsPPC?orcEI ztP@C9Yxju@^4^cZo)AF0q+dVT#UOOLOQ4d6hwd9=gi+K&rPAhZtsi48h*MSC1mkfO#@Hd-P{qTHLjke4DdH>RnFX*S7nFUQ44g3m?)5wpW+;lXOj34+6cyPS41+8~gRx~BjD2ilFqT>Q&HMBHt@nLh z_jTR(b^m*=nK{>-^E&7CIrWPjX-CUHhj|C~oeKKIh$eeHLGIdjy8p+GnZ zuJG%xI0c`g7@AvZCMU~&rJm}n)}W_}0Gqp33BIZ_8Y1k|rwudGr3BgkETpstklGif#+f_B=+tlL&CK;EiB71$a=ZxH!+!TA1%YVFfPB^g?us_dRj=g z!-C&xSpVVQccA88T=z6 z;o5=D;w|>U0CEuyuhzmK*a4U2(curl6#R*$uX(B>*=8}qRy+~uqcxMOBWgv$KZwE5bAT5!?`Yf7IptSkO?xJ+Cb^LIw$FSRH-(UN3PT?KEn za3T5Q9;2E{)x`>tv2l+>@N%5F<xj~aep1Z^xM%!W64SPSxPrfQxq45#Rko+CD?j$@Jy5b@z3 z>f>FH%$|kh=y?ci-QCzrTb@zSryJmgRr9MtU-%wB7b@2;b)0&7_L!Sw(cZkx>UTyi zH}xml|K7qsx~kS?L+Wdj!-`8V-w&8c(8_T57s;hTOUdl22dvt$A}Pnnf!5#O)j#}q z+g)zg-+J&3`HQXrkU<^Y8mk3QWaa!%%QkBEQQv(SiGU3W2UlpFd(2rQYXbcqn6C*) zDJro<{y2@lge8Z_!CfM{!(>C7BJNAt;3z;RN(S13P-=tAJiUBK09t}|`e@ZAT*&C;@cRTlNI=Br^E{*%m34KEsM`OCUY)l|DV?M zzgw7op{(p(+1-1Pj-u+hQ@C>#>0bB|&)UVjG4qn|cT|3n_x&pb?{y6P472;OE8uO< z`2%**B%uvoz*}rZHt4^k&;g|sljf^z7rXNl;;>piB@2t-z2JBsh5G+f~?vO=nv%Ppe-$zvuKkR;`wwXy}=2Km{D=M2uX*}N)t6WnOA20u75-* zgJ=iS~? z30G7)42;tV8;8NqF=^VwZZQri-OCdz-i{%`TN-kAHwR6C^8EC{N5p^N1G)1F0xX8Q zc)Dlc`li)1x1OHy8)pRxEa?H{RPsG|yLr7cfHIxhE zRktDnQfCkb0nLDPROZ*845J`0hHvp~#D8@ANiN7pO7O7wO8VBR40aV$Ml8DSzQeBQ zw+pOEsXQTQd$2M5FGB}AU@Eo_T>GEKb2a>vk>Ex^k_jkvQwzt7vDPB2de+Px(q~mE zPB-msZ%$f*iZ_n__d$9I6(@{(hQXsULG*{XlLXHjIMzIo#=y$C;-;Q{$S&W8-z%5+ z6}Z)#Tznm{fqQDUAs`=>MbNVc?hY@YfTF}g+Z}_%EkQ$vK`0tap5^B^57Wj03Xt_CueR1jFh5Yy-FNRCa1wzU`WJN%NFmJJL=)R@7 zT=AaAY)-HOHK&XU7H|I*-riJf2>h90!j+*u*e;wuMm;|0foy3YF}Bn{fOg%H-47lz z7GC)-1@n_yLrQ$j(y%k|Nm94|X#7xD9|{1BrwGIr2LRv` z%NH)>o8JlZ$1_`&pYk6hjWSR;es}75hCrA-Rq&(#iH}x<<)97kS}Ch+%$r)-Mvac# zt$sc|EJDk{uZs~JSXFQ^KUZED<`1|H52x02D{_xP&dKec8(3$PlDF>n{pasME}$nB zEF`ics#Y1%5>oT2Isf@aH2g_}%zV8nBH$>SWDX!9kbj+$`BM(Q!tb8ON-?nmYN8KF zg%W2U&NJ`S+Rmqb|G9Hwfd;fp7cKal)ftwQBZ;J>3E7C2~{P_X%iH}cF+@!4Z~16>;_1SWR4L&*XQhtw%g>_5FV$lNhm^)K-p zGD#bw`u}I# z^FHS;BF6(_=CRqk!wucJANue|i4KcJ1x` z+*709Q}q{dCihzj2Q%ClVeq>WLZhxjRq*VQ4=0?bZ!br%S_t>*god`eD=oTQc#7!i zl~<}OYc58hqU>gwr)^O2j+*7~)w`$*A3UXr%^Qsyj^US?X|f;Gl*>0=R!WLykJb3d z_~<^7Qxiy@nPl6%0a4NiHC88s_g3jxMzH||T=r^trk<)619@^KPxh}3o1;~S+tZ$3 zMBhB0W~NaH1iw0?TK=4>y{zEljm#q$wCKN?NA@}3mN_fjuXb%B!3aRrxV@g^i^YT? zTxL~CZ!1)%1jZ+Dzj`6_j###K;pn86a`Ov&EL!7Xi|kr;%A|&afz(q2`L(R$hgj8O z<_5)ZkNpt(`hEBaBw1!qriQgp_j+CZ_nmHn$lLRr1)Mr(4 zsld?VLvnzQB*qS25LEU8TY{LaGNmWmYET ztgPYpZ5P1hta#DevaXm&r09-Bp~ZC2o@3tVOkzI{J#?-bVz6cHy4S_K&jzfZuv6+a zv7&g^u)_iYnTJz6yVOQ^Sq*C5;R8W0H151YMNJ+1QSv+n9!Y+{ z(x>(MO>H0Jrp#=@kZb-#o7Rb^%|U?oh??3qp1HuTr~YX;Cct??mHEvvH!R$ z0)beM=sDc*6D%EOTW_G8sHTZNBfLt~y#8Ad{TY^Qp|(Md5@mVATTd-PJh5Y10R}A; zU_J^mcse2X5us*cj;*7zS0&)gq)8>4ecPF?bs02y>~PZ#SYv({$wFiYfEC5xki4Sz zUTtgJGxUEC(VT2og&6VV!T}3)@tx}5)e~i)MgJjTtdFPFa9cp=OjVDv;=s031+Jdo z>Nfl>ow1J57>LVnzv{AWz3%g_3_QE@WVW+G0ivr&FMfK2=6phBcl%&&iR&aDVqS9z zEqtU)2!j?{=}(U8mNtph>D!Jo`I3wZmB+lm{f=8!^^HRMam}L}a{H+X#Iv4OH7wpq zdh}cPEG78xMp-|_+s8I`V-@w8fzw*6FJ|bUTd&*U?l%Mbz@sP)Y#gke-QIw%&Z>#k zM1%bY2?D`lTVG}WACM8?3;!Y`zREHh7yBcS(HxyqY~es;pSD`M+!X$@BTlRG9hgEo-+ z6Ns=Q*2&pPM<_JO?6$i#omu0^Th{x6Z;1Wv_{lpoe}aY*Z-eO!Jfu_Eh8ZtO#i5hn zfw%7o&xdz+oic|34R^^au0wfgDexsaI+`2$wlp*3T++h9sp%M2u04KuHTijOhf%yr z8)%FjZ6PfZ(Cq#zFse35An3;kcfI8!mO|av#XhL}dE1=q=k}QHWcz~GJQv08b_*}OvaW?Vc zUIrc&_;*>29%CYXV{z6ypih^THmkj58_($m>-|oEzJpMulBhiO3E|I zZ8lQ+(5Vm)@Qe$~@6}cd=tD!r&+l@BurlJZ9{L=nnVL{FwaJRWTp(@x;A)o`@fw6* zvK!mutB^h_|9s9KlP7Te3gNil#B}m=XXI_uI=gvVU@OuDxAK^RVm&2a^2tL@6ML~Qq;1ta3n+Eso zs{gr`kW7hlFKhTvTl7|Ktxi9-lFx$Ww9Vs+zbiyE)Ol=j6lp=vS##?xm(`1%?5}cn zOm-a((HPcqv`d`nAZdmhUT7n*=cmLMV}DJg5_&9+zLz&YwPQsj(#PjHmxlgf%k}X= z%lbFE;sg3nj-`19x=3+nbI+(rGorGJbz6a%`$^xjwk9^To{UBGg|HEf8rQ1cy4{@S z+H~?@52!lJ7f{ryBV^HeZcjCOow|kAI{}R=&IlU=+XL9C&+PjLt;b;*86ImRkJ{j2 zpORj#=)Wo4Tcw_`vojwSgQ}KRZiQmci>kDA!Jge#k!!0Se`4EDiSS7c*jR74xPf=u zz>!HPm#)BxLPgc|D$k+8w~m8^qgnHe9mAQ+D(PI^m!KSqkXAA4@wR zbix=%eilSYdium5eMg3^YeM9B6l%~9kM(Npz41u4pGaZ^zAJS%zpK@?i`LcR99>=R zuT=>X_Z_JsdzJ5fs;%Rhb8e+at&~3nctQmAS8Z9W82InNW_rYnu#*hWoy%k0eJJgU zg&9T{UQY#Ef#@J?Wo*=_6-VSyOuL+)@x2-OnZx%xU-T2qsu-^dcM5XmN(i111Z886A^yG}|UJ}9w(*_!zW=r|neWU<&53K6{ z!3=mxxyK9hOQW@Jgq4|JJHU>V+vzZ?Pe%)XrHi7RU(+HgZ6_SkX1tx0VOF%DKn8CB zfv%{O+?jLf!fS;AeZ$bSBY|UY8k=Pw0k4=Cct)ex01v`K!Mez5wOwD?JpDpZOq+8F z9R*HA$v8_9$>MFs|0GAw9mUe$L(6}zGYB)39H&BtK?-5yF6aHnpdSgJus>gpjvmsQ zgaxO8YAY3nAlvq_ke`HYzi!wcI%L5bt-DMYtEvXS0$_9cSmH%9DFuc4?FV?^8LB;G zFTqNOsr!OkI`@2N5Vz(9+?w5C*|gYqs@z zSl9voCS{{R)dmF8XX1WTTEMZbM>xqrpK^Qb&$x0}TEuU4`hQ>j&d6CGSe6VMh5P*T zf9wMPwO0&*-uN!1B*Xt}tAIkr-N`}*{W1#9{vsJ8an3cjHj@L zc6ulQS=z8-ZfAtgrRiijS7KvHuN$@^zx(Ftn4dYly6->-C@lr8tM72^&F(i5uS#)Q ziKm>YG5VF5Y5)|kh`aG zwC!pSnVZr`If-OgAEj?XHksBM_z1rgo%O`1lR4e1b#5mga6%FLXfJ6{KRBlPOo$mQFxR0-HH}R7m<*Z>~r%owL#M5oZga3I>_@c!@ml{dG0aH!q(cQjUJ zOGM*{>Q>YOmig(|Z5k)aS0cPduacrjtWOFLJwiEE@K|J5lPehqVHg)x>?WE!48eIy z_spQ!iKHY3KPT7lCO~~Tbi)(P1G`b*1iT~xi{eLL5TtYbeCpB;=_=Q4-b+80baLoq z(KX!4=MrPF)MJBGU(W7O$yj$hop#$N64`gB`V})V(3o)>sFU^_s8iRKV5(%_6?_vx zT0Kd*y<8F5o=BB=HEtb2-^sX4Zhlu7pL-UETRi z?4xQSs`mC1S1I^YJNCz%fXvrwZz?z5YV`j};zy{cDhn|TY(Amt?WyX!r#S~v4riXp z`9s9VVHc3yCU|@Jzm%knrIexjM?Ubc>yFpOB4K=%NiYbw;Zj0rn(_maRl7Nv6_{(G z&F-}vxfN`8v$@T-?fRu*QWRT}67cdeL(&njy{hjiF(W0v!FjT1_OmLUdm(0&r%Ev+@v`@U82d;a zWnSjGdGyz(ra~1O7~kXck;NMvTbE*bRr%AgGy!7%Zu&w=dam;1pImvh&G zJd0ozVmV0Z$4Z{5Vd)iH<@|bAxO5b_jY$^bh%sH4AS~JxBwyrv-ctluG*5H!<4pIV z$07yRUa-XGvP`5%^5{MsGuBc#s+3Ic404?gTA1r+pe_%rG7VaI2>oVQSUo4a}}UH}Y;Uc^iFZ%ATe)Fy_C83S|j+4)vAd+(D4{~n()ZGAIQW!Wl{GOqH zT#}CWRc9F+ZlHI#t!T~Sk;QxD?=Iooh;D%w|h^WT-UB^ZOlp0Eh0#NR1Cm0 zNZD41^%)h3UhkArY((C+6{@T}NguT^RYp#H@G_`M|03clcwKl>u@)NEkV`w;f?2*b zDEE`{J+rpCxmdg~wtKj^kF)74`wsdRFcowag?UZ)^DI`6;>z?5y`TM~j)=dHt=RH> za*HRGG~dJ;{z2HN1NP@DenGbLy^(dm#vgl=MeQYNGhXw|=MYdSD=rrA4$vE1h^2IF z7-7$x%EreA1Qn#Cb|###Q~cl=rlkusHXP%^-c%NJq36t3>gL{@Vv7qL6uq zy&ozcTm?2ibjt+>ZGNimIJO%_2}^`6KQZl|1*-q{`)JC$-m=Yl+jYe@9k@{$}$a{ncxQC=42Kp+l+#_mj+Exg=0%EQezA@i|*=k zhb;bVssGNa7jt|QGcD4{Y`$_LQrPqBvZ9=_;Co7p!{%q5*D5{pQ`iDIsMvd<_3Zvl zIhbv!sUMAP2&B^lpE8A4p4e(5+7->LsW8>AQU@Z!i7te{F07Z|0{7hGm$e)uj5G~TrDC4tAba zjzHa05^hC$Bgyf1}8H4dB}z68$exS ze0wU`Yw{L3Fu!6K+ri@po~HyH#rKrCPY%8wRj4_b-#wv$79&$>ffgwi!h369#l*Nh zhhNW?Iw>RGP*p?&r%a9<8i;VzP>u8s<4);8^J#yp<_H$Fy(TdQbEMcEm8HOA)1#{G zsnF4))skXBXgJbsLRnu4F=)f|8@W=PVv=$`_V@D4%UOMTVml|QwBJgh^Tv@t;d}3h zl2T=0U!bDVM!2b`^-h&AMj^jJW%~8$avH%Yj5|5LSZ-h-S$Ppn^Z485RJ4%Ry0Fvm zX>nHhDiyJ`+y_3oEI+TeW8}|((1-5$8u84Qftv~JT(1P3T zFiI&hzOXp@oWO0HbT&RC=U66Ne_o1>MA*2o7NoaW8KpkrQB&wygnStV*4)r0uq@8c5h z_nlUgzXO(Ri>T2MO9lAdhB_fV0-k_w2NK4`Z`rG+zo>}~Gv$hMt0qJL2vJ8vKQ|10 zvEH~DFASRyFBQ$_Sg*4Mk(J#_T*z>Blx4ql-_gM^-1x#+-#TAhD_ zYR%4K7Bvu2?8bJ7 z82S0!87_+KcU` zCpZrJaRnG<(@Hxus#B91{Mn*RSk=Q>Vz zkt-L7Lcaeerczx8t)q7jc}p&~73n*?*ZmRtq|OGwIR$Vwv>*6heEv(KaLg)PXHKvi z(HR5Ydk>ZueKW7#{Q_{Be+9HY%VrCB#{+nlKWM-3J~8Hi#k2fd&d*hc;o-*#yjO)? zf`DIFcK2gSDZ1SytJ}Cuk+Y8DpwDNOy`KE}fn2Fh_bi*qe_4#24Mp5Kv8}SEscLWO zJO33C(Dute$8Oj2bp0Rl^sboXMgGC9e)mkn0oB2`Fo0EjL#rpA^@1OAmEY(}yuwkN z(lFR3$??kQZ1kPn0rYeUDe7x#o(i9Pd1RCMNseJm)^4xaO(lHBJ%XOoER@)6+7EF> zM$(p&A@3-*`kq63tmyRRFF&V2$8NI3ulxar5LH;OTK2F1c}Uxs3;ZO+%H}pQ| zrCc*p%Fh@;H2C-!9qqLIVL)Iod(y2zI4nhN;&Ike@{a83Ar;s)@l~Vg{X&lhxqw*7 zTcuTZIY-%TUY7?SngRNiMjm?B2z=AL(niwL72s;!18Zm>fQHq){`(5b)ADWp*0HLB zHT}Z@!r5@<)_u_4dU82zuwmT8Q9mOf^zZ%JeC$peU1JZ~P3cHhjt%+BI~ne3MbGjn zwU_kgEEjAu)VI4R2P=1Mr@_99aQfRVRdoG6JFQ{kz(dQok;W}3J=KuT<(;mYFI%Op zH@R#v;)NE|My>f{en&9mYolwQSzArJV8RqXpd@eBs^t^J^9gU13MaJX^a)<&I~mxD za`17JG!vS+V>tSy?iF-5yPeNBbs^=!4gZUm${k^Yg_UHoOOO9wA*Xy;tFfQJ?@Koo ze_1jGd2k%)#8KwoUgV)^H0Bvr8E<>o+OajWF|=D$zv=SKr%R&0lADJ-+a72*`EzXnB(-fJH z{;RkMTu_J4KcVvP)XPOjixx^_zQ|CYB+vIzKw=A^-nrE?tZq5s+2T^ofi>VL*Q&26 z!#)U!>uRIQdvK~lQ!YdvPk5T)Mxgk^xw4%+rh7kC(R*EbFJi;x`C^oCk&WpsQS*Cw zK+~YH$}x`)S|Cmi>UE@5>0U0J>(h@cHUvq%PV}F=<^ECPZt0WQ86R-h*M`rOQkdAA zl^4aLJPaxGvH4Z>0E+@fxG44>^ZvzG0(Wf3fmbmPCg zV+||$XYuE3!ImfCV2l~%Q;%cKgj+ou6tix&CQ7aeX*swYpX-2Z2%IO1oV_tV^=^>Z zaFjVeWf1BLsZS4UKxbbwKGLlye$e}jHPjS5Q}`1#S;g$OkTra&e1C|iBRr4X2tN_z z!YrChe=*&)m!#75N*ZZen+B zskiOZv&C*rwz(+WBQEA})A&Mu%tm9^4nR}#_KQ$M_^{G6--=|fs10caQy5L9Rk}I@ zTI-jB2efqLljvV$(yre~G>QGWoDBB4ugHl*MQ9a?xm<2Au-VgWFerJZ-v#s_9xnh~F{oZAl9IqV`8>>0GW1BPe?CB2)bcsejX5i=e;nIbxjknG% z`eDL`RyWf8ebvJC4&j%@w~h|d>mE73rnDzh_4CQk+hHk_8(q^(4%(-rk^;Q$w4LB8 z^BZ%gLXix8B$|zRKQTTue{4z9;p`)uA>J?{BvmM2px5zi+aSyz? ze<}UreRV%kTMn{FiV$_--VNOyI;SbV4+OG?&%Qoux?a|r^Af{&l8~=5a7v@1Yy5zoMeG;VMIv-19pX|=)CBK8 zH{s*1wVb_u@dOyXrevF+VxV(MZ8(l2Hh69<>gDRfzNq(n{IL>6 zZab_|;vs(U@Cl_jpOur9+OvR)7>297!-`bcNHi*g5?H4HCjF`My07$-?>)lzTY)s! zF0HjHufS#ECI@=gZ^bSw1~W~s5?`1-rZnoc#d*4){mcX4a3GX&0NJfRf8Cxx4V}YLUn*%P@7s9{ENOp z`4s_KQFO}_r?`xhc!cL~M?>tJfKQ_)Gk@-{dm1miD62p)9>fZcWxb&k^(@c#iu7EE ze^fg@$0X040nc2MJR)6vIt}?_Jzj3E@#J;p2M$$ZExNYip6BnN@I0AAeOFH`Enp=a zTavbuiWxB=WJiY2Z0O8kl1%tn3H1Z2kS8+SU$r!?P;Xb}Q(};|hveY?qNDcSCjpOo zC)SVtMC&TCW7OUCi;#srX-=Ee&YvH)4X=oN>TW^1=-c}JQ0Ig5of3ydU&SxM zZ{A4?+HCAys|Yf-R5I&-z+E@r5{Q$OB)7mmvk*`G2j2(0A6<8%XJy0P0c+Y<#1jg# zHoTYkT59}A^FvnKesBAdgsA^0YYhxx{sF)NW&Xcr2wGkv0qdpNI%^WT(or(M+mkx9~*&>>4>c0^kW)E1m&_*9zoO$OFcR2du z%C(UyDQ#T<7Y&c5^zNv|D_wlG)AoYhk*v+pnt!>i3E#YM#_g#D-W;HNjklW})&-4Q zI_~{?;&uaMLG8>$&0O|I#Yc@Vd0tC_%8CBkr{RBwT&UVlC!U5H4w*zlGKXF0*$;}l z*hVHyZ|l1<&e9(X0Ng%o+k5}2duYKpT?c9LhdE&Vutz~PLLo!UVH)GpjC%66Uy+hz zB1&&kV0Rl=X8-0~xU&mjao=}%@ZP~eC&cG&oAf#>rVGy>^$pg2gd7|ydA@f9b=BGq z?{gszt818rz@nZbqeUmT!uM0|{Ckv}H2*zdrAY=tnt1 z7x(Gg$=CLOS=S0Fu>U0mFu*mUq};YT$gl)okxG4sk;YLu3$Lb3OS1{P^Mc;Xj7BPO z-M!g)a(RPgvJx9MQ0aUc(7T)NUZ{ciC%!?t9QhHGhv$?2D3v6rDOsI6KbKo9GADf! zbNbVEvZ(bu45>mQ1o{GUx|qM_T6rXEaZ}E?joK>tSG2rZ|G zz{z5qiy2p1oL2`}k5abd43)(1ZOB!`krd#D#rCT=%Ms1o+6g*1STO6jj~mw`a5h7g zho2J3UvIfHS-X|KsLoluth3m7zCKVnGvyJVtngZkHyNz$_mMjEHWQ>q2)Lo=l&E7| zVqcGVsJEB^3^;OfuVw#hOMm83GiT&qJ!&N(TlMQtGro-MBMTYUpD)rum>@14^t&+E z3rJo-fnWVyr=x731y*qc;7ncMk+2IEhT7<7`KLFFd+0*h9fH@K>RXssm3q2xbFbcg z6BUdnjh!c~9PEOA3Ap2%$)25-*!FgI4)I^@-G1ZBTh8Sgq`2$!HiN&gGEAFuQJ=)u zufb-MIt^~RrzXT}?QJ8~ZZ*Z4}ibq*pQXT0iM&&#h@ z+^mbJ%K2Sq#7KGJ1v<|KusXPPT=ZLu@3{_%CZ3E2-o^CGO79`3{8^#*YL3}^0T7*6 z7}*X?zFK^hYg|r;u6f9y38Jj0kh$QVp`il-pGhTrZ*cQE)F2eKyL+3^-H+1dY3VbH zCn#g>!k<=Zqmz`nB%+Eramj`_X7*~wF7@{SvhK=2k8uT zv_AzVm=+mzeBT0ruvbesHGI5|F28khHrCpswLs_8h#avtn;X1jh7QjU4U^-kN9IB}i!U^nMkDbTS)DCX@JKDc;KW+v2zSC&KZ1i4@kZB4+t*@A<{h+Ise&_2fvg}OhUH8JreKYEaJh7|Jh#*%7$=@|x?oL}lWWtsX zp5lLJ8GEt%P$|5E`~YBiq$8Is?DFuV=9i1R->iCs*efHaThz|%iM_4>A2l=4ZuSe} zK%0|~te(QSGm*WL!UEFd;b84XG;BLaRZHLh1!%1;sB4#aYjIT|qeM7t^o?ivT;_1! z$yvhhlL^6RH38aWR5!i+Rx;F&q@-x?(Q3n}`1CcXc_Fk*K87AaWE|@HGzofkKP{jt z7So#}teq4Egy8C^cD8AZX!^MnB)?LuBQI!^KIx-bJ=wR zl~X`hp|f`k-(Lp=^hEPsd=;u;)mPnA5?^x$ijYTVg}A882r!`f+ODOlgHt|O2mxG} z&51@wxnp&!m}04xucizhjAeOC-gT!SwR@A+kDbSgKN4mN)^a#_$_jRrR5PD331uL& zwb25fT&+H?=!#2|z4?^zkJIx1rzeRQ*ylS`m)gHJ30@E^LtDtQSjtnna|!Uyl6ZVcM= z8b=LT{FO=ixU(r>I`cYUP2|^Fy}WK!=~t7^%!k!6W%lzveJ|U-{fz7jP8Uu-cx8hw zo@JlYc;^`_G81^4B8@fZ>Ea))Ku>(zzwC#a zkss6+s9tx2Qp>$k1&y#Np7Eo{+eU30;GTsf?^UZBGAo0imFN+IkIBBpAq&}5ZhhIT zC&QE78jH>2h?dwJTen;a4GUr2hA<8NiBf@pXJDm8Q)POt*dY!LyEgA%1;zzs=OZr%9PAF- zkUBu4*1eDN7Q&17cD|`VPIs=p;Uo`l2b*^N1Rnf#S1bO3?s&F^tGG{#89|T)ie|LT`*vC%qj^Nqu z{o6BZ1^~uEm8H2L)2w57#?zvx?oL8TbwhJde4+TjG^?mF+Q!`@Q(}?nHcWo0W*I6_|LUQ%g8X(gFWCddTgb|v z7mT2h8D{r?D{kH}t+YmTy>2_@-jcJ15xH;)0`@#8rfOSJk*7g}-9X-BPdkRT`Y_j&g51^J-rQp{|<;ux49O-i7S2mJ0&Lf zM5d)sThK}#Brr&T`>y$F48?8%x{ZB}PW$oot;S&Lr zR=G@?q;Vwkz%}Ez%TB~iBkyf=v!}sS(_yeH#`yle%x~mQEf-xsKv-aGCP)q~ZE9V0 z9UQXjx_)aS_*ht-k>+wYuO*-VdSUTV&vt=TUvB2ar>q9m9Ao&1^Nsgn2^OJ4ceHpL z7G%Nv$|(1FOh{x`RW6Mel^+yeS%b}p6%DeD1sH&lg2?Gk8>!Z<(pk=S2Rh%LAs190 z9h)e{e^U}cLW(E7l=Zgt%|h-&%j<7j9vgoTxkh!2KlA# z!P8>TnDL7Q49sLk?jT%dA2q@cd=e~SLKfBwVs%z2dVg~36kJ}94z@h3S0bqMT=uUv zBxEtZGLum?gy>Gr^un-j;%EsH%aD1#6FuY&iaBFk&&}mO5DLzC%8oTw79|Hvg4sw{ zPOKJZ+Q7$oG_^dR98W$s$lT3?2akEz_9;6R)^G7H1jm=`%;{HKf-?3N{gZXW3a=he z6{dB?Nu zdP{Ffmqc$=w?%LPQb1UPvW^cHwyYp6KW~$CZoLt@g*PGJVS0pJvJV%;?dN)Eppj^7 z`HQasJu8YOVqjfTJa}8BRB9k&FJwZEAgCrZ@Gz(LoJ{6b zv3)c6Vl9{1T$QvXc!R8P-4RRM*Gowr{=an&#&YnZ*$L<>mmgG~uk6}YL)gh5wq?B+ zXXLM}a@-<}!K0tQXYCMu8i@jx559SJ80W`EH2$xSjJW)AoY^?~t_Y`tIZ*;in;jS_ z8}X`FTUkDCfup3I6c1M}=?^3{{Rni7Mw->h&u4EY;(bzc))zt9@SD#bZPMJLznf&r z?lc$centMX@v1*Qmf{XXXrK;aIre~?Eho2_Vj_Mc=VzHL5_vP5v8&66BJ9uSJ5srR zM3{ilkZ==73i_k#?y{o!XD>rt`DcKeWpb3Ox1Gjy1zTx!>wNt#;+=gIy_>$Zi=C$_W1h8jq;>WWJQ{hi zbRUD2&e7Wa=*h3A-d78sO%-VSJ$HQQR+R~A)-G@tLSU~<{*ue8i0fbXDix31nCfh} zyLGjPyDjjld&$SED$zU(kTk_vsXI4&n7CHlUBQ2QrU%SESejEa2YH4x41&}-yH<6H zHRuLM*&~LY6~X#0D<5}`uXy|DWvPyGSzDA*A511yuoz7N;36r|Z+mH!`%~ov=Fjh}=fxbU2A{BshY()8 z<{kwmph7#{P@$84vVIWHSQdGvzX1$m#A)Zve6ZNO~_;7wW_&!wpTzDD`>>Pi&D z`AoOMpiVLq@Qz?%9z#!t;t%5^B;19A90)f;&sF5r^&orZl2R?K#42iB*L(vG(FauV^<0o=wTDM|ho< zp|x53dfPJ+=)>fitRlFV&T#%5lqS`V(tS@SJL9EbbP=O1Iae<{KbTF<~%q9 zb=%cP<00J#;iyYP_3Gl^OAYf)ue2s};9!-xk-(b{$z3~>>c9%DmJ&Mm@0(Cy4?j@O z`^UD!=MBP#w92YJrSmsYYvE`QTJr2vZzs`DHrGm2oK<(rhjl#7Bn@4DtmBl>ov4s- zHZ3++3v?cl1P*ZU`y4ivysm%t2{luXqHsEF+KnOqoG6#H%;}>_+$Qg-`*4J>9ca`0 zPytmLBTO+`2~YK5{r-TlbsTF(`T+OE~#*lXIA|H@sTP4>zRT3Un98xrUvJ zbm#Dvti2ausj8j%pwIt2efzW}{iLRGY|eHXpbCa)6RbNV7Eo={S<_!8AD)rni~IWv ziitdhR>2$0-U;*dP@k2CSshO(j>B$=#)hyIYUaHxp8kEHqKfqjYtiiqp>}zZOZ2M~ zZAB+HTo6JupZoY1UjGzXPb1=!`R*?J`5-gd=d+5=$>Lp|wr*Vo-Y)g^$MS|z6xh4e zD?}E7kG?_=yDypO%wp{wPr4bJbFSHQ!zIaeUz@sdwuOCngyh1kLdd3>LA;Q|fp0%= z1ej{+{m1z^!g|_GY_I)cpmfE8rL(IJ{ZScN_~>&~Y6n?)T@eWD{fESv)0uo8K6>e2 zBe!b1{$yWNaXV z0wP6?3WCx?3y=V!pi-ivg3=Y0PADRTjtEg&KuYK>CZVJNAqgZT`8{!F-+gCyX5QJ^ zHoHIn$R|&3?sNM+=iGDd_nd3VtLaER+H#;z zgcwo!Mw1wMw67F>lQ6pxG+OC#{I*`;)4i2yZaCb5HnZ&5suI4ui1iV z!y7GRM)P!+khi$1+4E>cOOKyI_}D?!tMgy)S6(8l-!l@!PP%m3u5->!Ct?i_1NI8^_b{d!;LLYgX1B-VCI|~ zvykIa)NrnHbxiRK-?{_z+pV>S-+sHbu6XZ&`GFs`%>;gL z_P)=a1C7h=vo95Eoq1LuA@U=Jh*p$)%vxE6IOk(Ubo@nsdWeM=$o8b z>I)BG)B8yL1Yf3GvPD|Mu0Y9qPkhlJA3exT!kBi_gcAvJ?m<(A8ygsW(S9%(Y*;2T z_YHhdOiCD7zT!>cYpvGNl~Lq{dIs@361N72mOzJCBg9n9$Ca0x8K}vfR6Pi9kmaDj zhbF$%oz&tCK2I!ycfIJt!IB2p=-o`M7Plb8hRWANoEI}`&9$Dfp^)_-`pal8!uPlJ zDBGIJK73(G7%bXQCFn?bYDLvtzcc#)B^2`L&0z1)BMzzxVchz29iIZGmtLu0t31`}=VmuSn>YSH<#BW(0c=csxj5O&nRB ztV@l8T$d!s7Y51P81n9h2Q(#SB~z|N2xJN&E6Xc|6#-SG=#1s(9W| zqyi^Z9n{=G!q#di#g5nyvqf;ily5`gOc~Bz@JM106F3eGEtkW>Kb{b&)@-VU&8d55 zL0}3p`Mf3(-87(HoM0gq2am1~njiF}lei>^*<=!ZO3k{c3cIuf?Hch_#o>;#2=M~B7cwrK zAWlyr?Kne=nst_o4_r*<5W!4|@F{z75K){TWUosabDMiNg|wC>MSCEEw(s>l@;0vA zFxoK3cAgd9gr#p6w+N30z|;~e<2l%2_BXS)s+N1u(iS+VhRp(<;#AqHJ z^s9m;_p+Y6O4eWoKO?Bu;1(;>YVCbr%4XxBE30Y?c?)EbbBsb2WG;4UfCG~Bjn?_j z%!fjoi6dCQ{34)*x-A8{80|{5K@6MmHh#_Vq=CkOGRgjjj=t4u%`NSLxuUC_qB9>S zC3Oz2V&$vibL(}(g>6@R(UPI+xpKE;e4OKZj+wxTZ@6fFyE`QUo~$|(r(O)5q6Qrl zHwjoxLA`Gwy$PGVwM+4j;2K($S}YJ2GTcL5KQk0=HjfAIaqL4G)(BFP>*)^TVnZ;W zGNPsFaJ?!F9509a?|bXJZQ(e7cXwjp!zyRk_PH?(H;%Qk(=a*!Edgtm!im!q zZ-?s=QLm^N!Jl;N#e2`{^Z7(ljBZumg5D|0WU`fi5{tus(M)_EaNVTJ(7P+VT%m2C z_yzu;S2x`r4zgoQYzC(u#kTlYZ;~v;iZd6+Bf7Xj_A4DgiVGmMxx(cVnR=mqeNx4A znP`fhHyE0$A}n`y99XF4aUTR}XwgK~^ylT+8wq2a0+G!<{N?CeoPbPVWvEN{q9f*A zf_9=>{efr7cF5t~J;bkt)j>nNpuu6zEr+$tAc{S7L4_P`DUP77R8NEpXm*eT(A3LPyt^Mf!4U6S%br;W>0QQLy3#(`L^Gf7^~599bsnDb#;RV6}!lY|j) zm80wHBg}5&k&Udz3RPP8YZAEyLnNnK-z#hj zWDWOBI0W%sYA07PgBQe@N!t1IBb=gY&$ z>#J@+()vWsSzYlY%jV>xV;8y*l54k=#RG$4w<^S3FDtKI$b024Drc|}LYv$L{u*)M zPB%u9;~e-(5xAxAauvd?Lc!a>`kceLL%2e?uaLaqzVEEoaM2J8z0oZ=b0aO0tj#nF zA91PDe~|P@E&zwt9bDcQKZesSt;}b_nZM02d-;qVsRvps2 zwhs&Qkt7}QlQ4~>M7ZEZyJNE497pUZz9z2XN6!&P=4V{U105ADQ>^fYAiWV%zixB# z;TigwAXj5BUxq|xf>HHemCtcuI}l{Wh3?6UVO0=6nC5O~jHW7|Z|OB~JV9s3h8}{J z)>oe`z(Ft&m)F<(_Mdicy%a3(<+lA{Sg^C@BKQ`YEK1mnpe$%z};F2`_+c&l|u5(oRxOQahRKg2k-DzS#>UX1si(0-PfMJuC*n zTTOxW5NF=OF7~SntyOyvk-|%mMm6DWk7NcCeF>t?dVtxDW2n_*e2zfobWP?!>w-j7 zi7#(ENf8Y%z}-Hsr`%Tc1YUln%#gP_AA=cI-#fgr4OdiUxW0sx+e19bBuFM}C8dD` zi7A4J@xcl6*YSIF1=YBtLC5CZ{0{P8A$=(@+Iv_5E@MHTo4?;5w9!OS7h$ojce7zR zeU0imkB)k4l&I<<_+j|#AOhKoaUqs<(9@-~>^n%T?UWn!0KZWv`>X=syzgKJzx}%n zCdex6;{rgz?;y$0RFUfe@tl=AF>TOZJXvLwVBNX#!OT)4zwr!eWxHd;wqAoEmx<^uY+1g`*9)x6M<( z6tTaQYrSeqx0pAd9qBI;mb^-kJYo^EPF^50rQ@s;7mK+B`ARs}S`PGMOAjKPb{WzG zdJi+$rv;S#EwAk>I~>Cq<7W$` z7SKHKnh;E?_}y@LtQs~~sJmE@wZDF@jqh<)=rT5iEQSaM;qfBaFm)!Co!WjiaCdQi z3!Cy`X8XdDVO|<)f3jXPF^JDV?(89&NUMgoV0O<>*O}ZJ{0f{6J)|2QFr_qq$e(s( z%Z95RecTQw1@kD1YWWe^{UpNb+lQ67KE}Fn2TxN&0N0gfRDka>W%$QIxp z|L|H9tCbkH=iKXk99C?Lb9GzoqK_BclU;6L)_qh37cJqoPj>e#83kTheIF=N@rQcO z|4>TE{U3@x@COw;Y@)(P{}j|S@#;!8eT!~IaxK@I{HmI3 zLO&!@3mhUHaQ26XPv+-d4VesSxg$W#RVIga%wiSDNW1n$WVyt(T-+1}4$2r8Dd!SP zUoOrC8K_S{Mub>}@7je>Tb%dF<+fli(+>C>zDW7`OFpVZbuw;4iRxHFdeBX_5c=&& zHr?I0OLvdEaVykZvSf&lx)(P{8u8C|u^Il{u+Jm*H>|OtCz!O|%hY7qf<=sJ8RrJ$ z8;U4`e8<(@H?Y~0Fr=Smu5`PN#bQ*M71>IoHFOOg(}htXV+&9aZ>TOn{mb#l`~2C{O0mvS(nhZy{KR-0`J zaUm+meOWaS6G_#0N4Y(W%{kBscs4~Mp*@IL;_4a^BQ-QXKY@|jDE*VyR?}^5%4?%~ z9CC*X$If5dtu7p!(cfBmI;zJgAwF*}h|;@)|K#A~#;p4EHsuL| zRV@Y>BK@_fB`9>KB5*!2<~x_*fFqRSMTHBRc%{@MsC2shO1^mkZsbJMmrc|&NZ??@ z?avy40aKW82YQoG?i{Jq{4^;*w;%By7N(;ezBkq?$~+a?fx?Fgf$4DHPFqEr$<%h< z7w*sMbcbvcDz>~;eq(E|dnAf>id3P*O1%WBeFEIC`R{0y4;9vRZJ^ZqHRZtJlO0Q} zqB_&j78H*_jlJ+yvt8g7CZ-?HWi6h~R&1&}gVc2%?C>)JWYK+=skD<(#6le7;J-R? zg5p{=A73?Zu;G$Pn|HHf>piH=?fG0}?hRw*(=~B~`$t4jzL6b@MVGzp0f^4R>PIM2 zyDlB88mtJ2%LQQD|BSy?+CE9}yL0+wka`pYgWXOm<3scnCjC3n*Oo<0AOPu~xOGD( z4(Jl@@a{~ARFIFbJ`LXrOwWe=bnGEO1lfJjTqHe6SigNHSPe)l`L_>q)qwK?a`kU0 z;B9UQxUv*H5y^yp9Svn^DPY{M>=1Ia1IULj~<)|_2#wR$26_|@$Vi4f~Rfv zQDuBA2WAbh+8(0Oec$J)#e(yR7%xDm_!qsjkS=@-oQ33&hw3(7-D<6oc}Ewv<1RgN zHQE4ZQTF=Iw*~;giLnUHvpl_aQc7z~SH7_^KbZ~i1|(E>iOXT#{1$*jQ9HK$Q!@MD zV7+$hJ)%R$x5Q-)4_y72p_&fjF9CF@%8!MaXTVW%*_~@cZ4{mn013eM5d%5(HYFz1 zDHjkLtN`9_q@7L$UIbYBnfEYxvlY(J+q7MP6mX^hSM%?9t)XQM$)iMAEdtBCTQ3%3 zO=zQAf}xq0O#}3wu)jSOUL>X7MJ6g;4ZxUoF7me407l<(dB=qu>Co@_hhzZk1TL># z2YQ=gmA*bpR_;G&&RSi+y7o)O)FZ|rH2tQmI$4)55uDRmx=)Chdl)Yi@X6cYxzDV~ z<^j4N)Pv9iKA`{DEO~{(vB8G*t8TxwiA-5lt*Q{7RiA3?CzO4XioQ#%_dE(P*1ZVM zI$RX>dtlJdN7HtyZf@KLu-6*pW(%YJF~@;93Wdg{`CZ!`E7j4V_L)t0TWdY@zlN6=qzXF^A zu#@g%qif?x8}Kj$((# z8_}J~5_?mK-k=|{>R3!;2uQV?WME0brh{m4L@3e(lMkuuIOq{HYLE+bP%ho-rf@CU zL)t%+imm<0CDGFE$xN&tkygdl#PoZ$pA_vrs~PzET(j_iEzukM^I3n=D(ij(tS?6y zGvL}F8pE1+%56|SM8+1%UhF0-a?F>cC#Qyc1Z6+1Q&-BJsMQT8)3=oJ3}mz!WnjR% zoENrVI-eXsUy=Q^86e5k3yf5`N$u-jM|D<0=DEPqpaIgB^}%?cCBgFmBkO9FYIsj! z3OwiX$+)!K*Z}y0bNP8Qm?dEO@MMFFN{Yl!d;^7=3|>GEndsJDKzJ8 zS8B(6voeF~K|)$^i!h5lKDJqKbS*hn&ggzl_i4;^hXcy!*^a=d&V@%ds(hpUXB_&h zRv}c4bsdnpK`&y6#<-K6WZwF>_Yr2zWb0;!e@jte3kw^4HPQfC_R==~!HjVi;j+

    }nCC4jYuZWk2G5htq6~okqPVbdg;q%hxJDO7fYAtlbL_tlWguD#& z@D++XXe&9xRB}^JKoojGr_0?6Dv!X1I>Y|F4?Rj>Tc0HN?Nx!?E z%j@mqxH6nhh$Lm9xNHmeCl|EAR}w zF>;sUYZBk=r|IKax!RF4UTNE{$9cunK3(ms1+DZImcfLaHM7HmX*UQK zfz-1wowXPFrZ3focI+AFQEw~Is#2P7C^M%^v2Xa2NAQ9g{~4s=U~s%;LcY&8-Jm6a zZyf9??pynVJ53Gz5|PVId5!AjFLVJzP9C1O8D!HoP7EXWFf|H7_ z>0u-DxNdeOTQ_I7T_U!Ffc`fI@9<{C*!cvBuXQ_#vB$1pY_{y@e;Rfq{HgE0ni8&R zx}4n6PkIhHrDgn8+g?GG)2D;2GxG>jl)YvkCyE4H(dxy_HX-FdT@LoLj%ua<<%hfUdNv?JwrA5b=M#I~uj;1w>?YoLvx4EH zZ1-9FX!kKXec&a*mwH-^U#R=HuQu!6#HhzB-umCaHI>T0wkz&AV!+8g+aS>X@1qeq`s0;|08n&Xo%q9)l<-6#HP-~#px zwoLy^J8$5*oyHV+1Dv^{;#uStB%%Db2YXt31~KukG+Lm?mi}{(V%^ne>EgcQ2Oqsn zN`#V&Oxs*Bvu83z*UQHJ?Bl@|%q@P0NhSKwzPJx|f}taQ0W+ME8rq6ariLEEx6sk=mza=-f5 zVU_LE0MTygvFH(B^=@MPg_5gyL*A;N8-V*eRO1tVN9PQ#=4^gSqN|(ja*;8Ti_p1Z zcY_%$Z&_tx2|Dz)eVfi&hI;d^wZT+fewEz+bII=sVu^<5)6aymv}Mj>%|iS#ExD(9 zjxDGCU7MUkCl9O*-W1d>pt{_bO<231kBFOD-qjf;9Li%~ovgpQ?3o!@vZ+tJlcA1ubwJbt~%?Q zw!>@psS&3X2w7s9bn=Rw<%zp8y~x{B&k6f!Y6kd6O0oxB$HD3{a^2`F7?rKFo8o^~)Tzc4U8W!Wx4+bz z0D~%fOpfT_15dDz;4%5n<-(hLf#+xbLvfp9>)%uQhU)5j7Md8+Gza({ZI%NaZM4DB}Vg%f&+O$>uP@iXx)K)=>7t*s`N)8GQ>1us`ZHH#4Yu2C+Z~&f|0a z67nZ^bjFI^$4XE%_vL zCawrr{=st3)?rUS>rV7Zan2H0(`_FH%bRzk>N8)JawdX;*E0Nx5BMd- z^1?0psY%8d@&Qjq3vUa@oEe|Pb;H4)ZbkoL5GO2F80m{Gj-)TUN3(k}{p)H*k{cHhaJ|7kz30x!L)o^8}tOnsT26Oz@PZ;nYiI;YUn zGUNDT&eEZ`!#f!7`n4kl_!ihwodp773?*OIoV^YOuADP~Fpk($%TJHHW&u}50KlU2 zda|n6T^r!);hB@zNX0#l^!$bSIelLI(4-tLeoF?Wc#t-}RiO_{(EQt&9ne>O|ag@6XAF8zSx{9*SV6Vzoz z=77WTfc8EFoQy0)P&47C8RH8&e;SGpzWa{OA}xyMEWUt;>!+R6~=$W+{wkNRp|xmhF`c3{ko=S5-raUI~x8Ua!Xv$2VN^X$0tiLOJNJ)(ErM; zNdL)6m;R^t|Dx1sQR`Q@n|>nEb46W!%c2U zazOpkYWuKL9{FOgh_vC6)m~effyeSP+&9LM4I@2loq0d0h)@eF$ypmSw!jV!WRXfO zYrIJyio&z?sgZn8^8@I?HA}${cZPljSS6ty6O8x4w3%-v3od^HU&w}m z9CybRkC+bv)IyL>PEpO?^`-SB1p23k-DhX1c>i)oV*n(y-R}eEVVJi~eBi^k^5qEE zHpltEXFMK5_TzCnYc5*di$ML7gZRCq#k_Qo+@YWE<=Pu1s?8`eSzq^y{AI?jlPi!w zjoUa;s(#tCBWg=>BDGF&Loc^JuqbibnNZfUbDn>-clP|^V(nm^oxFw(SKh)@11;1x ze435`J0un9S#N&$K2hMYDVr^RfcX+2V0tflMGkng8Ur%fYGw$$MmNQ{rROfNt^xQ( z7wOE3rJwPhZa+v4^k+sYIevgi=zNU%%1{wU_G{Ni!zbl-{;qV}FRFoh=S!FOYGM7X z!nAhMqdvo*C%75Yk6r#Vv6guEhz}^~*GtA;`cXopoJu3(DUS#)cond?+ zXh-*{`ZSg|Ry`=e%d&8A=+Kq=M z;@^39ylQbMlNG6b?msTw)9Ha(Vl65oY%j!1pyGU|DWwABoD7@_b*@Q1hxM2RpV`-g zSwJl3Dj2zybGbqobd0}*ndm!>)rdc`Oe|(uIEW__s>Dq4 zXYjcQ-@ZZiFo>=4`L}WSBXPd-xU!x^9nWh%KE?SKVtvg-ri{JuA~Fs7sQ!qP=`g5r zj6b9h(^Qf3`Kept!>D$<5=y{vwse3~gzj=d-k^DH73C&+O~74_v>_DWYJ_S?PJw7c zr#+|HSL%FeSej>(Y1{lp;ot)3meeD}^T5$^uR33gOufJvv0B}u!Jcg;UC-LC6;n3n z*p(IqfLiGgo; zh*J`KS|73_Lnvrb7oc$AmuokeQD#gPj|A7~R0~dBU7ez-0x4rc5*N7}Rkeo|~PAqLfp;RXYu0UuNRbW>zN;S!>_1q0qU$1?rwiLYc zn%v9HyaVDWt;kI#mf+-xC@00b*Dreij_`UWQ28fwAz@;1o{r7eTqHwn_U zubb8SO>wri@4|D=N0w$VjQGsiK}lv6NzSc7IZpGixIK{Z`#MA4?dJMPQ%PgQs!$3n z@myWIdDZw*1P?tsF&<*;{xWbx(b+UEaL%IAhMMJX#A%1mgDa$@P9}~<$*TMztj!!5 z`~Hp)`&5}Jln^>lW>H~-4={+&0z!5o<$G;FM{YGs$~%b9HYv>6=(mBUMA=Bhs=gNF z2_=gn@VA*c62&#fcq4BhL{QD`K{Fb;X23wYqUCfVovjkVzI%nnupK#wT|F&LJIV+4 zaH@=n3IA#fW#l01im}Z>`hGs%1}gZgx}MQRX%UfXXh~y8O`>*r*)geqESgj`>fedR zj6|83b4h``rC#p_LXJ&TRDL!+NT)-6xW%1n&7NOf+E&b!q@*SuEBCO~wUFd#X_`jo zr73BdDBe2e;U zu1A?jWYvi!FW5bDvpZHz-J5&4&tdq>tM|q9!M8=t0~68FM}Q8ICj8&^QfF$-4dnwg zOO7nMrg6m(XBIov!kaYgSCDX)+P<^>whPcL&r*P~?C$>jud)31BL&lCaPA^WM2SKd zSFc^XAAL`4lyO*L!1CRH0rQ5_H6S~S%5WLAWvb~h;;f1OQRw^+^zVlt*6gciE zJsyALvYzkc8%M1$gsWKaZci?7Ki_NkQ1 z9?k$sTdg%Ll4i+?wLNCK*o{N44z6U4+R%?{yBA%WESMUbqm8FAEJvi-?y}C~ydlt$*e{9W?J^L#~8`A`P1XjAANZ36YQeIseR$lq5qRi6~ELyT$ zXzo78iy?ncyN{*gwDS`BhcZq-(8he6=Z;&w4M#kHoT5|jyF|}c9R-EPE$xE68@e)- z_vstwnp{Gj&2vIRjf4_;jXC#v=5+uVsOC+FtgroYXv|Fv@nQm7XYyVgW-?4$jSKEo zvFm!ckwjD;wUnx}!Wljq6PdYc6a;3(sN|7CefUdY*?y`$($0(uzPc~L^M!Fde?YZ@ zuu~}_T`b~V*huxB%5rlZT89>AiMZofV`qO&@*`XJmSQ@6s9DxyA-==2e`wl6yMpH$ zC#+YPv$MGP>i)+oL5*kGbzIGpxwOWmGAs_r$DaQO`xWDR;EA*2MUQH5exJBu^E&=n z1SQydNb5bFYeeFJJcFX5g`~EP zdjMm^RGarhZFwD*djs@TnYoW@ymKz%8=q|p?Zz{shzp9yi5FU4HMj-k;k<(=344&f zjSKSaN5j)f?Yb*}hg5h!Z~{D%Arq=@^mmH!+rPCICX#9ZpK^6u2HqY&vbA$;|$!^yeue# z0x}5ezxi0`DDXx7V67QH#31d?>-#H3_%b20hh{3o*K1e9eQd85Gih7iCQ})}8VMMn zuAtj$p(Y_?;u&bQ%Nat2w*~Vp%jYV=LAw+Oi=&;J3G-iVgM1cuJNT}P=(-Oc^0!_M zDN-FW(~X6v4nCX_!!=4sy6fquRa{0#;@~82JNYxjDE8b=%ujJVtU1*%wvq592vcaR zGxlM%p5yg$eH`cJPRijU{*DwXayIaNPP$6_3YqXWZukcF&?8uBbbFxU8J#y}v0J3j}WIk#bit z6OOmvq9K{D>`&|tll6?Q)2z4W>PKUCqMDDI#|W$?9Y%E}tB`wlI^L_w+e^s=^+GJjf1z zj0RbmR#?zr*wM?HBBgWnsBDK&_@%N*;vXDXunpRGdD5{TA@RBP9O|fJ*}#+Xk?hy< zjuM;$ebg0W|MKFq;8BM*RFrV+a+sjNjo#R72}%-_WO*;N$8|@`eW(9<%R8f~edM_%mcNBkU z>mryyEr@fDwqCQLDHztssSlcev#VfD|bqv zK3=^d7OIR6!`?Eo0Z6#N`o>?SHry$|XJ~~J%<#KxHm-RIM|h_4=G$C8_@ zZw@PDOx<*rRY7KI=R?Y3h zZM}z8Va;(P39wyulk4i!b%lQVNfp&AJbv7+ut<~U&z_AFv^tJBC5Q=>@Ob60P2wzi`mzif!WP>i!guaE}6f55}jjPsp31hgaHAv0M*i8pX#wh{l zA2zrs*evH2q((C{MSEL&l!KU|To0OwKV28Hl}&u;If)8P@LZt;N*Q5eUWC=AGUM?w zYn=++fkpcQhp-lZB6q?V{4dl^t2bwl6|~L9pBX+XUR|GHVoK_*zVUH$QVqv+qmTg5 z57P(syVv%P)!mpL$~M2$wQHsr(9mungc&zUFN5rHWhRM4VpWx%pbY;-ONI1twEQhWQosLvA`UKbwX`f1R zeJcz;i(H&w+_goQ218!auCbQ71MVtbh^OIw<5u&7Dao#_THmhwAmrLc9I=Bv7Me$D6$y% zyT+CGqnXIn-&IO_8>$hMnAs7%u>#2=-)#7P^#ynVwXjaz?-7c>0L0;2J0ySBH=#Kb zN^ahO6VNtro^v^3GuL?6)1S-jG}Z^>PKJ6BrzyM(EdahB2zi8;h`70-^Y%5bSQx_1 zTupizY9}H}8ZJan^NQ1D?0MzTbv7c`jMv2kzp-4JGT?BzUUttgo-yxtBYd!zDCYCq zCcFCVbu7{-fn@Id`MC?To8UzBW5(3Z`Iwg`)Ond+ zL|0du9Guu>lza53--)|1CcKlnZ%$#O;A=Rie|`Chu*G&~w1xUC7IA{l>EzUZCGXWR zwM*3f%`O_?zZEuDzZl+J8pjxS*LK#17qJ64GUrsxSqDHQbI#zerH+1Mj@i z7Qth`VU{-seH@<+h#TqT7XFZmKbGzn!E(S-zeJKhTw|aCQr2k?lAUG#03Okp%mS#v zIp>PTq|~_hlO%A{TubrV#k@gESGW@UYGqoUO>Qh<*vtzOt14#N92`A{71m!KP2Bbz zGPP-ez4;-v8*PF5&_x>MvT1{1%e%P*%14ZPEZn z&gc^#ZaK6lwRjiKvz@>dwlF(!+7COnn})D!Hq>aIRo=mLgkP zR-#ZHp64xj13=-3obepXU2>)YKL*Rh#E-5^S1+NO{-{SJ@e-w5+a|N!8*7Nw{iyC6 z9k(hVT=NlvKUNIQk*Vi=h>stGXhB|MtR=*qpTs?qEgjFD`;ka0sje`+^ zj`x{a7VDb)hBm`;(^Cre<5xw6j?bVCmHkg`F1xgGr+=3O&$F37<7;L&x8-%8JI2Fo zYSh?v?ovxh8?ON(N5vnu6n0(+fW<4PAk%? zkHVZY{+8RpvHX$K>BZELdnGwSytgp#=4ZuuxiV*Ybhhwmw;~UxalYWw)#Qgn2DvbZ zEb?g^Zf<(zBw%Ha(Pc!Y?qpXd6rrCJMx!v-(8Dm8PHDjN-BY27Im*|zJyMR2Q7;mG zHgH9Y@MJVN$|ligaKf!eeROgHp4G(~xJ5TPA$W;J){}>AcG2JDbeDj}4b;HZ>}`gW zu-!rxOp>*y&bIns1ue%hm0TgWHGXZ-llVoE$79%%3kS^4PB|a3!`D1jEsRBK%(n=s z?|uky{3s|VIPb=c6gUTyHC!u5WKeOPgiF3$=J+dfgJd_K{Xc`;mhv@4ZdY(6Ck>X_ z`tkiMM!owYe=cbfWF(Suj2|bQpk1n?65uJ;w!9Rt2QP9UiI@^*T}xW3wdLbjeZI!W zcKBD`Qwf^cR1Y>ns;l<%renf!io8l0U-}V`ZAN+zG`j2lF%jyzG)H?a*vYj)W8cjT zY%9fAOZ_$#5zVEuSOVKxDZZ8yk{odex^DRzv3Lj}F5t`@BHZ2P0EiWOPRHt}9KMeq~yN#$WrqKdfHeLx_Obmwm z`r=IA3*zn~sT8eG&8LRYPEc+pXn|F|F5<}v!=RJk-yF?+&`X z!JNbA-?!zRgNew08KEoM47(Ui#`wM}TrVyFzI!K65pG>$OJZTa{aAjdBTNeM6m5f_ z0I7|KP3S6nC7>(%a=61Pb)oKbaa|uAq3DCs$)MeuGN_y2|r(g8r$+EtJR(xvn zj{dGi3e~(=)#-ji8dK!{t6+9MU&nWh4Cl!Wj156jnE$2%`9Ixn8`Xo}u= z{DwvDwCADdk_J3sNZ~JmL+WopFiVu)Q{-` zYB=JT=KB7%w6)NgDFYXg1;ScGw2HG2dgWXgm%y}UR#kEqIJRVd`X2g8R$>@f26^v6 z-GvEx^WE(8KPy;g7d4BNuQ%bPFKr)FdA4=G!n+MXVpGjgS38{IO}eEgvdA;(9v~0a z@ERSep5VG-E$b(z(68$5lNM5(IAuEUJ3Qx3^z52H=#(sHi%lkCe}?_%@9p*`VoPtH z*Vvjnp}+Y}ohcnvhanbBW`<++-=^ovBI6UGe8w#;BEAvCxP`5K2=#(K9eL>F=Xay+=Y zz5VU!At`Ah)JlW#DjwLhYbx7Mfk3GE3)~|YSzEExy`P$bd}ioU^YiziX@ziMcm9H# z!X)+DwW&(W@*+}ig73}RmBN;gsE_jpO$vh*vZi`QKOUXXJq>{)tAx!>lL;z5jmcj7 zoM(d-crPQ*_eZx%2x)_Jw|;jc3r>PMH@}AHF-+WFoOU>q7niMjY!Z7KE9*9(~d#`BVBsXFfB*pIxE1vQKbiQ)APX8n@B|Hj}^@FLemVN@H=?MVJz_f(lj za*+^PlvdoQ#FK|F*Ih$k)zB4oUZ-!x+^Pwm&ZIWrLvm1?Qx{8!4(DHd{+dodwBY>? z@k*@T;Y3&JE}u(?+rwUXdbgIx;j+|xLFz*MTjm~h(O*4M%9q+S8%RH2<}@3&xos+3 zT`~*-)wrO#q;gy&3VuKM)o(hr%!S`)s+LD()R`+IT^ng}&)bFlE$rZrVDoQ9TLuD@ zGsJvS^~vkPd^`H5;3S1qUMbr(wN#{zOOKo}GwBd2M7!1Ze%TTr zB|q!`f>2`ZsUF=C*y!=RgY1dTFS?dreQ6LMe|q?N+hRF+nrjqXjV|u$-VHdq zwJ6>Bq(BC@a6*1{bp2pxSv{)lQzFX=w@3w*S{ge~)Tm`|pK_U+UU`Le{mwcO_ZqvI z(d>PY_LCI7_E^z{x4b|IvAqkQhD(oP-wSzob!2ObG`1#Wko+m zm}ds;k4ja4@I~hhnaND-77)zGUa$7@rrK^J!qxOi!U?#@z#R#(u&^Sv^2zqLGYliq z&GpNsiWfY8)~fYB!Ya)z3y9p-6S1sZZNxZSewki>>do!?4xz)go^t{6NB{V(!ma*Y z`Zzs#w=O8#Xdk#IuPX4Q1xS;+n0PC!M(5K3g0oxxM_-hSVo8bl^v#8M*v!_&toArV ztHxGUgx_;dk$XD9p3%NU33(U0dedu!G%qg81jw09YERMjF}B3S;XM4a>a3X=wVGe3 zwOj)SR$b~O)J|PJ)#`U>W}Y6|O~1QxOQUDqh3vJ}N1BP{t#J)?V-yNgxM6+@a&$xoaEgwLZ^0 zCsy0%jvYGPzwgINy|mOw_c4f-W7M!1QSP@tY$e}T13PO=+}@OP8(h+57>D{s${=m) zkHLg+?5%pu1+EY;PYFiBN(T1lxaIDWsbphwi>gv`VjIWRt&Y;!Z>2l2Q!+J(tKA{yqvQCkyrX*XwBG*AS@Fr?J>}O6or>=}8)S^3`b{50B%7a85oyQu;5=yDUwz_* zjhIyiWLLW)Nt>0W#a-4s84I4;pq&5(_Eyds)Y_D1H-q?tD8&4YgTe2X$ud12AsF)k z?~YjxAKGF*#t)jXkg8)*J=3^s(psyTb7-8?yMcRhofx0OzO`KGiJ^no#EgLBN*^@( zssu;DCqb!{)lk>jwZLKDIPY3;#4RL>c+CNnH@jLfjQOH0@9Z2|r@&=$1jFejexJF^ctO** zHqPvf|8ID@J3=BL3t6A+j-X}c5!Kyc1&i_VPA^Rb3}|JUw;!Sy&q%FAY*CHy^iCijVno zq=Y5Xo%H<=#xlcVR5U@5UwNuFT3;?%L16=?O-zI|BYKvE&SUkmL(F;8>`Z0Zx15u- zg$XD;UVB{ST+uiM+`evKT*_mY>TUOw9QY+-zHUrP1@5x-kY;9-taMb!Rm1!AO!Dvv zE)VpUDiTF@@CYL~*ZX$M$@~0FjXI?=E(hKuFRHcnzeS(!PNoiY^)N1gRU+{!4l2~U z#LyN-KNEDMg;Dk9`CKzAddsv^lw?4mc`Xm1*zmsf3$qa-ATW89N?x)<<~oh8oHW~@ z6F9R{5DnY@2v=`VC3l+tS#UdJCKog78W7zNW=)9P}`8 z)zNC1fgdhEv~+8yE_)Ec+!3rn6NO|wO`l8!FiSL}B#=YRR32%TUGzU)9(1$1t zPZ(hrKbgHWPTUXfe|Y(;3L074UU3K@bZ2dD3qQULoQe!>J5X15cI|ESYuf$GVYcu2 z?u8cOyIb)Ol`TlL6--Ea#&Dw^Tbm#~ z&OFxM7ha(!ZGO_}J!vd!@ffccyX^ee0}BPUU*;2iH2i*Z`eb5l&dv3CyGi0Z=y`v> z7x$t&FiGmw1eov0mWmHMFP`98M4Jz3CL0VtCp_l=x>8#Kwh%0DPFXzG*5~?=p&fVS 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/documentation/latex/Appendix/packageMean.tex b/documentation/latex/Appendix/packageMean.tex index 40f0f21..59b7e2e 100644 --- a/documentation/latex/Appendix/packageMean.tex +++ b/documentation/latex/Appendix/packageMean.tex @@ -1,11 +1,15 @@ \section{Packet-Anzahldurchschnitt der 10 beliebtesten JavaScript-Github-Repositories} \label{sec:PackageMeanPopGitJsRepos} - Quellen: \cite{link:GitPopJsRepoMostWanted} - \\ + \begin{figure}[h] + \centering + \includegraphics[width=0.85\textwidth]{Appendix/gitmost_wanted_2024-04-29 181855.png} + \caption{Quellen: \cite{link:GitPopJsRepoMostWanted}} + \label{png:gitMostWanted} + \end{figure} Dort dann folgende Repositories: \cite{link:GitPopJsRepoReact}, \cite{link:GitPopJsRepoLeaflet}, \cite{link:GitPopJsRepoBootstrap}, \cite{link:GitPopJsRepoExpress}, \cite{link:GitPopJsRepoSwiper}, \cite{link:GitPopJsRepoPlotly}, \cite{link:GitPopJsRepoNode}, \cite{link:GitPopJsRepoAos}, \cite{link:GitPopJsRepoPm2}, \cite{link:GitPopJsRepoAxios} \begin{eqnarray} - 16`085 + 678 + 974 + 54 + 788 + 1`815 + 488 + 688 + 241 + 1`768 &=& 24`299 + 16.085 + 678 + 974 + 54 + 788 + 1.815 + 488 + 688 + 241 + 1.768 &=& 24.299 \label{eq:summe} \\ - \frac{24`299}{10} &=& 2`429.9 + \frac{24.299}{10} &=& 2.429,9 \label{eq:mean} \end{eqnarray} - Somit beträgt das arithmetische Mittel der Abhängigkeiten der 10 beliebtesten Git-Repositories laut \eqref{eq:mean} $2`429.9$ Pakete. + Somit beträgt das arithmetische Mittel der Abhängigkeiten der 10 beliebtesten Git-Repositories laut \eqref{eq:mean} $2.429,9$ Pakete. diff --git a/documentation/latex/deckblatt.tex b/documentation/latex/deckblatt.tex new file mode 100644 index 0000000..0c70d30 --- /dev/null +++ b/documentation/latex/deckblatt.tex @@ -0,0 +1,15 @@ +\begin{titlepage} + \centering + \par\vspace{3cm} + {\scshape\huge Am I Vulnerable\par} + \vspace{1.5cm} + {\Huge\bfseries Abschlussbericht\par} + \vspace{2cm} + {\Large des\\\textit{Masterprojektes}\\im Auftrag von Prof. Andreas Both\par} + \vspace{12cm} + von\par + \autorFirstNameK \textsc{ \autorFamilyNameK} \par + \& \par + \autorFirstNameT \textsc{ \autorFamilyNameT} \par + \vfill +\end{titlepage} diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index ff8dafe..6549717 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -115,6 +115,8 @@ \begin{document} \nocite{*} + \input{deckblatt.tex} + \phantomsection \addcontentsline{toc}{section}{Inhaltsverzeichnis} \tableofcontents\label{Inhaltsverzeichnis} From e0ddeff48c4bcf9fab876b0865074e60eda5f665 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:22:36 +0200 Subject: [PATCH 46/60] discussion save --- .../latex/7_discussion/discussion.tex | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/documentation/latex/7_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex index 0fda6f9..1ea7a7c 100644 --- a/documentation/latex/7_discussion/discussion.tex +++ b/documentation/latex/7_discussion/discussion.tex @@ -1,11 +1,15 @@ \section{Diskussion} \label{sec:Diskussion} \textcolor{red}{ \begin{itemize} - \item \ac{CVE} Datenmodell 2014 umgeändert? - \item Manche Pakete haben keine Designation? $\rightarrow$ Bereinigen? Wie kann man damit umgehen? + \item \ac{CVE} Datenmodell 2014 umgeändert? \\ + auf CVE internen Standard V5 gehoben + %? https://github.com/CVEProject/cvelistV5 + \item Manche Pakete haben keine Designation? $\rightarrow$ Bereinigen? Wie kann man damit umgehen? \\ + Wir: keine designation --> N/A + Wir haben keine Möglichkeit gefunden die designation nachträglich herauszubekommen \item Risiken ausführlich betrachten, Kritik, dort kann man weitermachen/müsste man, was hat man nicht in dieser Arbeit adressiert? (alle Programmiersprachen) - \item Diskussion aus verifizierten Sachen raus \item !!! FUTURE WORK + \item Andere Wiss. Arbeiten die im Themenfeld \glqq state of the art\grqq~sind \item Paper: On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem \end{itemize} } @@ -13,5 +17,24 @@ \section{Diskussion} \label{sec:Diskussion} \begin{itemize} \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden \item Abhängigkeit vom \ac{CVE}-Daten Provider - \item Sicherheitslücken in der \ac{API} selbst + \item Sicherheitslücken in der \ac{API} selbst. + \end{itemize} + + Weiter machen: + \begin{itemize} + \item Betrachten auf Versionsbasis + \item Betrachten auf Commit-basis + \item Zeitlicher Verlauf von Schachstellenzahlen in Repositories + \item Mehr Datenquellen als nur CVE Daten + \item Andere Untersuchungs-Projekttypen unterstützen, untersuchen ob es da unterschiede gibt + \item Dopplungen in Abhängigkeitsbäumen analysieren + \end{itemize} + + Was wurde nicht adressiert? + \begin{itemize} + \item Welche Sicherheitslücken können tatsächlich ausgenutzt werden bei \glqq Vererbung\grqq dieser (PAPER) + \item Selbst aufstellen eines Abhängigkeitsbaums + \item \glqq Most Wanted\grqq~- Meistgenutzte Pakete die kritische Sicherheitslücken nutzen + \item Hat das jeweilige Paket noch Hoffnung auf einen Fix/ist es deprecated? + \item Was anstatt einzelner Abhängigkeiten mit Sicherheitslücken als alternativen vorhanden sind \end{itemize} \ No newline at end of file From 3c822243403e43272b9121f193c90d080a19b510 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Mon, 29 Apr 2024 19:28:14 +0200 Subject: [PATCH 47/60] non func text --- documentation/latex/6_implementation/validation_2.tex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/documentation/latex/6_implementation/validation_2.tex b/documentation/latex/6_implementation/validation_2.tex index 88a9252..589d81c 100644 --- a/documentation/latex/6_implementation/validation_2.tex +++ b/documentation/latex/6_implementation/validation_2.tex @@ -17,7 +17,10 @@ \subsection{Validierung V2} \label{sec:Vali2} Unter dem Abschnitt \ref{sec:MySQL_Indexierung} ist die Auswertung der Messung mit einer indizierten Datenbanktabelle einzusehen. Daraus ist erkenntlich, daß die Vorgabe der 5ms mit den durchschnittlich erreichten $0.7$ms erreicht wurde. \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ - Lorem ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? + Wurde erfolgreich umgesetzt. + \\ + Dank der mehrfachen zeitgleichen Zugriffsmöglichkeit auf einer MySQL-Datenbank ist dieser Punkt umgesetzt. + Die einzige Limitierung liegt in der Hardware, auf welcher der Docker-Container läuft. \end{description} % Validierung V2 From 1f41eeaf6eb496866c5bd79db2190d2936e000f4 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Mon, 29 Apr 2024 22:02:18 +0200 Subject: [PATCH 48/60] added discussion and reworked summary, removed typos --- documentation/latex/1_abstract/abstract.tex | 16 +-- .../latex/2_motivation/motivation.tex | 14 +-- documentation/latex/4_other_work/demyst.tex | 14 +-- documentation/latex/4_other_work/dependa.tex | 6 +- documentation/latex/4_other_work/nist.tex | 29 +++--- documentation/latex/4_other_work/on_t_eff.tex | 8 +- documentation/latex/4_other_work/owasp.tex | 2 +- .../latex/4_other_work/repos_vul.tex | 13 +-- documentation/latex/4_other_work/snyk.tex | 16 +-- .../latex/5_concept/architecture.tex | 3 - .../latex/5_concept/architecture_1.tex | 4 +- .../latex/5_concept/architecture_2.tex | 2 +- documentation/latex/5_concept/concept.tex | 3 +- documentation/latex/5_concept/questions.tex | 2 +- .../latex/6_implementation/db_exp.tex | 18 ++-- .../latex/6_implementation/experiments.tex | 8 +- .../6_implementation/implementation_1.tex | 19 +--- .../latex/6_implementation/mysql_index.tex | 24 ++++- .../latex/6_implementation/validation_1.tex | 6 +- .../latex/6_implementation/validation_2.tex | 11 +-- .../latex/7_discussion/discussion.tex | 99 +++++++++++-------- documentation/latex/8_summary/summary.tex | 36 ++++--- documentation/latex/deckblatt.tex | 4 +- documentation/latex/lib/bib.bib | 36 +++---- documentation/latex/main.tex | 44 --------- 25 files changed, 205 insertions(+), 232 deletions(-) diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 8687c1b..6eba3e5 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -1,9 +1,9 @@ \section{Abstract} \label{sec:abstract} -Das Entwickeln von Softwarelösungen ohne Bibliotheken, Frameworks oder externe Module ist heutzutage nicht mehr denkbar. -Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein sensibler Punkt der Softwareentwicklung. -Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. -Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. -\\ -Diese Arbeit stellt die Entwicklung einer \ac{API} vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. -Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. -Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file + Das Entwickeln von Softwarelösungen ohne Bibliotheken, Frameworks oder externe Module ist heutzutage nicht mehr denkbar. + Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein sensibler Punkt der Softwareentwicklung. + Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. + Um nun also eine fundierte Entscheidung über eine Abhängigkeit treffen zu können muss die mangelnde Transparenz der Abhängigkeitsstruktur von Softwarelösungen berichtigt werden. + \\ + Diese Arbeit stellt die Entwicklung einer \ac{API} vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. + Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. + Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index 11d610f..f40f7f4 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -11,15 +11,15 @@ \section{Motivation} \label{subsec:Motivation} Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv -- schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken ganzer Projekte bietet. - Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwandt den der Nutzer. + Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwand den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. - Hieraus ergiben sich folgende Forschungsfragen (FF): + Hieraus ergeben sich folgende Forschungsfragen (FF): \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1.75cm] - \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?} \label{q:one} - \item \textbf{Welche Funktionen sind notwendig um ein Projekt auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?} \label{q:two} - \item \textbf{Wie sind die Resultatdaten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?} \label{q:three} - \item \textbf{Wie ist ein Schwachstellenanalyse-Tool in Betracht auf transitive Anhängig\-keiten von Repositories zu implementieren?} \label{q:four} - \item \textbf{Wie kann ein solches Tool leistungsstärker und laufzeiteffizienter werden?} \label{q:five} + \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?}\label{q:one} + \item \textbf{Welche Funktionen sind notwendig um ein Repository auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?}\label{q:two} + \item \textbf{Wie sind die Resultat-Daten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?}\label{q:three} + \item \textbf{Wie ist ein Schwachstellen-Analyse-Tool in Betracht auf transitive Anhängig\-keiten von Repositories zu implementieren?}\label{q:four} + \item \textbf{Wie kann ein solches Tool leistungsstärker sowie laufzeiteffizienter werden?}\label{q:five} \end{enumerate} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. diff --git a/documentation/latex/4_other_work/demyst.tex b/documentation/latex/4_other_work/demyst.tex index b083b7e..c343b42 100644 --- a/documentation/latex/4_other_work/demyst.tex +++ b/documentation/latex/4_other_work/demyst.tex @@ -1,8 +1,8 @@ \subsubsection{Demystifying Vulnerability Propagation} \label{sec:DVP} -Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq~von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. -Betrachtet wurden auch Versionierungen von Paketen. -Es wurde ein kompletter Ab\-hängig\-keits-\-Wissens\-graph des NPM-Ökosystems aufgestellt, welcher dann zum identifizieren von Schwachstellen sowie deren Propagation genutzt wurde. -Das entwickelte \glqq DVReme\grqq~Tool verfolgt Pakete und ihre Abhängigkeiten zurück und sucht diese nach Schwachstellen ab. -Ergebnis der Studie war, dass 20\% der Bibliotheken im NPM-Ökosystem Schachstellen aufweisen. -30\% dieser Bibliotheken enthalten Schwachstellen aus direkten Abhängigkeiten. -Ein weiterer Fund war, dass je länger eine bekannte Schachstelle offen bleibt desto mehr Pakete sind im gesamten Abhängigkeitsbaum des NPM-Ökosystems betroffen davon. \ No newline at end of file + Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq~von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. %TODO Quelle + Betrachtet wurden auch Versionierungen von Paketen. + Es wurde ein kompletter Ab\-hängig\-keits-\-Wissens\-graph des NPM-Ökosystems aufgestellt, welcher dann zum identifizieren von Schwachstellen sowie deren Propagation genutzt wurde. + Das entwickelte \glqq DTReme\grqq~Tool verfolgt Pakete und ihre Abhängigkeiten zurück und sucht diese nach Schwachstellen ab. + Ergebnis der Studie war, dass 20\% der Bibliotheken im NPM-Ökosystem Schwachstellen aufweisen. + 30\% dieser Bibliotheken enthalten Schwachstellen aus direkten Abhängigkeiten. + Ein weiterer Fund war, dass je länger eine bekannte Schwachstelle offen bleibt desto mehr Pakete sind im gesamten Abhängigkeitsbaum des NPM-Ökosystems betroffen davon. \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index 2c45e93..2d87439 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,10 +1,10 @@ \subsubsection{Github Dependa Bot} \label{sec:Dependa} Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. - Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. + Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. %TODO:QUELLE - Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzen Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. + Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzten Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. Dabei wird zwischen Versions- und Sicherheitsaktualisierungen von Abhängigkeiten unterschieden. Versionsaktualisierungen halten Abhängigkeiten up-to-date während Sicherheitsaktualisierungen betroffene Abhängigkeiten auf eine Version heben, welche die Schwachstellen nicht mehr aufweisen. - Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projkten oder \textit{requirements.txt} in Python-Projekten vorgenommen. + Aktualisierungen werden auf Dateien, wie \textit{package.json} in JavaScript-Projekten oder \textit{requirements.txt} in Python-Projekten vorgenommen. Dadurch trägt der Dependa-Bot zur Wartbarkeit und Sicherheit eines Projektes bei und nimmt Entwicklern ab, Abhängigkeiten vollständig selbst verwalten zu müssen. \ No newline at end of file diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index c78cadb..baeded9 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,20 +1,17 @@ \subsubsection{NIST-API} \label{sec:NIST-API} -Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an. -Diese sind die \ac{CVE}-\ac{API} und die \ac{CVE}-Change-History-\ac{API}. - -Die \textbf{\ac{CVE}-\ac{API}} nimmt Anfragen zu einer oder mehreren<-?????? \ac{CVE}-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. -Um nun aktuelle \ac{CVE}-Daten abzurufen und zu Nutzen muss lediglich diese \ac{API} in eigene Anwendungen oder Tools zu integriert werden. -Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte \ac{CVE}'s zu reagieren. -Durch das Vorhandensein von mehr als 240.000<-?????? Einträgen wird hier eine offsetbasierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. - -Die \textbf{\ac{CVE}-Change-History-\ac{API}} bietet einen historischen Überblick über Änderungen an \ac{CVE}-Einträgen. -Durch diese können Änderungsverläufe und Aktualisierungen von \ac{CVE}'s besser nachvollzogen werden. -Aus den dadurch bereitgestellten Daten können Muster oder Trends bei Sicherheitsvorfällen identifiziert werden und entsprechende Vorkerungen seitens der Entwickler getroffen werden. - -Durch eine Nutzung dieser \ac{NIST}-\ac{API}s können Entwickler und Sicherheitspersonal auf aktuelle \ac{CVE}-Daten zugreifen. -Die Sicherheit ihrer Softwarelösungen kann verbessert und potenzielle Risiken minimiert werden. -Im Vergleich zu anderen noch vorzustellenden Lösungen muss hier eine Applikation angebunden werden, die die Daten grafisch aufbereitet, da diese nur in einem JSON-Format zurückgegeben werden. -Die Integration dieser Daten in Sicherheitstools und Plattformen trägt dazu bei, die Effektivität von Sicherheitsmaßnahmen in der Softwareentwicklung zu erhöhen und eine proaktive Sicherheitsstrategie zu fördern. + Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an. %TODO:Quelle + Diese sind die \ac{CVE}-\ac{API} und die \ac{CVE}-Change-History-\ac{API}. + Die \textbf{\ac{CVE}-\ac{API}} nimmt Anfragen zu einer oder mehreren \ac{CVE}-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. + Um nun aktuelle \ac{CVE}-Daten abzurufen und zu Nutzen muss lediglich diese \ac{API} in eigene Anwendungen oder Tools zu integriert werden. + Dies ermöglicht es, automatisierte Prozesse zur Überprüfung von Abhängigkeiten auf Sicherheitslücken zu implementieren und schnell auf neu entdeckte \ac{CVE}'s zu reagieren. + Durch das Vorhandensein von mehr als 240.000 Einträgen wird hier eine offset-basierte Paginierung der Daten durchgeführt um Anfragen für große Sammlungen zu beantworten. + Die \textbf{\ac{CVE}-Change-History-\ac{API}} bietet einen historischen Überblick über Änderungen an \ac{CVE}-Einträgen. + Durch diese können Änderungsverläufe und Aktualisierungen von \ac{CVE}'s besser nachvollzogen werden. + Aus den dadurch bereitgestellten Daten können Muster oder Trends bei Sicherheitsvorfällen identifiziert werden und entsprechende Vorkehrungen seitens der Entwickler getroffen werden. + Durch eine Nutzung dieser \ac{NIST}-\ac{API}s können Entwickler und Sicherheitspersonal auf aktuelle \ac{CVE}-Daten zugreifen. + Die Sicherheit ihrer Softwarelösungen kann verbessert und potenzielle Risiken minimiert werden. + Im Vergleich zu anderen noch vorzustellenden Lösungen muss hier eine Applikation angebunden werden, die die Daten grafisch aufbereitet, da diese nur in einem JSON-Format zurückgegeben werden. + Die Integration dieser Daten in Sicherheitstools und Plattformen trägt dazu bei, die Effektivität von Sicherheitsmaßnahmen in der Softwareentwicklung zu erhöhen und eine proaktive Sicherheitsstrategie zu fördern. diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index 167ed51..ed0613f 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -1,5 +1,5 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label{sec:Transitivity} -Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq~von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. -Dabei wurde auf direkte sowie transitive Abhängigkeiten geachtet und die Verteilung von Sicherheitslücken im Datensatz betrachtet. -Analysiert wurden weiterhin die Erreichbarkeit der Sicherheitslücken mit dem Ergebnis, dass nur etwa 1\% der transitiven Abhängigkeiten mit Sicher\-heits\-lücken diese ausweisen. -Dazu wurde eine Datenverarbeitungspipeline implementiert, wobei der Abhängigkeitsdatensatz in einem Wissensgraph dargestellt und analsiert wurde. \ No newline at end of file + Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq~von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. %TODO:Quelle + Dabei wurde auf direkte sowie transitive Abhängigkeiten geachtet und die Verteilung von Sicherheitslücken im Datensatz betrachtet. + Analysiert wurden weiterhin die Erreichbarkeit der Sicherheitslücken mit dem Ergebnis, dass nur etwa 1\% der transitiven Abhängigkeiten mit Sicher\-heits\-lücken diese ausweisen. + Dazu wurde eine Datenverarbeitungspipeline implementiert, wobei der Abhängigkeitsdatensatz in einem Wissensgraph dargestellt und analysiert wurde. \ No newline at end of file diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index 1cd3ba0..e9ebba4 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,5 +1,5 @@ \subsubsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} - Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. + Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. %TODO:Quelle Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger \ac{CVE}-Nummer erstellt. Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index 3b9cc05..a912b6a 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -1,9 +1,6 @@ \subsubsection{ReposVul} \label{sec:ReposVul} -Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Repositorie basis Schwachstellendatensätze konstruiert. -Hierbei wird zwischen Code-Änderungen und Patches zu Schwachstellen unterschieden, Aufrufbeziehungen von Schwachstellen extrahiert und ein Filtermodul für veraltete Patches bereitgestellt. -Analysiert wurden unter anderem auch transitive Abhängigkeiten -Es wurden in dieser Analyse C++, C, Java und Python als Programmiersprachen betrachtet und über 1491 Projekte ausgewertet. -% \\ -% Als wesentlicher Unterschied zu dieser Arbeit ist, dass die Resultatdaten nicht als Abhängigkeitsbaum dargestellt sind. -% Weiterhin ist ein Framework und kein Servive, wie z.B. eine API, zur Verfügung gestellt und somit nicht direkt in Entwicklungsprozesse zu integrieren. -% Resultatdaten werden im JSON Lines-Format ausgegeben und nicht als standardisiertes, maschinenlesbares JSON-LD, womit sie nicht direkt weiterverwendbar sind. + Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Repository basis Schwachstellendatensätze konstruiert. %TODO:Quelle + Hierbei wird zwischen Code-Änderungen und Patches zu Schwachstellen unterschieden, Aufrufbeziehungen von Schwachstellen extrahiert und ein Filtermodul für veraltete Patches bereitgestellt. + Analysiert wurden unter anderem auch transitive Abhängigkeiten + Es wurden in dieser Analyse C++, C, Java und Python als Programmiersprachen betrachtet und über 1491 Projekte ausgewertet. + \ No newline at end of file diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index 6477353..25c3219 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -1,11 +1,11 @@ \subsubsection{Snyk} \label{sec:Snyk} -Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. -Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. + Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. %TODO:Quelle + Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. -Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. -\glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. -\glqq Synk Container\grqq~erkennt Schwachstellen in Container-Images sowie Kubernetesanwendungen. -\glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. + Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. + \glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. + \glqq Synk Container\grqq~erkennt Schwachstellen in Container-Images sowie Kubernetes-Anwendungen. + \glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. -Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesammten Deployment-Kette auf Schwachstellen geachtet. -Lösungen bzw. Alternativen werden angeboten und zusätztlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. \ No newline at end of file + Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesamten Deployment-Kette auf Schwachstellen geachtet. + Lösungen bzw. Alternativen werden angeboten und zusätzlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. \ No newline at end of file diff --git a/documentation/latex/5_concept/architecture.tex b/documentation/latex/5_concept/architecture.tex index e1236b3..9bd8634 100644 --- a/documentation/latex/5_concept/architecture.tex +++ b/documentation/latex/5_concept/architecture.tex @@ -1,6 +1,3 @@ \subsection{Architektur} \label{sec:Architektur} \input{5_concept/architecture_1.tex} \input{5_concept/architecture_2.tex} - \textcolor{red}{ - 5. bleibt Architektur, 6. \ac{API} (kann umbenannt werden), darunter 5 Unterpunkte: 1. V1, 2. Validierung V1 (fktnl, nicht fktnl Anforderungen), 3. Experimente, 4. V2, 5. Validierung V2 (Unterschiede zu V1 betrachten und) - } diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index 4b20a9e..bd4cc09 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -22,9 +22,9 @@ \subsubsection{Architektur V1} \label{sec:ArchitekturV1} Notwendig sind hier vier Controller. (\hyperref[api_controller:one]{1}) Es muss ein Git-Controller zum nutzen von \ac{CVE}-Daten sowie zum Erhalt von zu analysierenden Repositories entstehen. - In diesem sind Endpunkte zum clonen des \ac{CVE}-Daten-Repositories sowie zum clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK + In diesem sind Endpunkte zum Clonen des \ac{CVE}-Daten-Repositories sowie zum Clonen des Analyse-Repositories zu implementieren. % TODO: clone CVE-DATEN-REPO-LINK \\ - Weiterhin ist (\hyperref[api_controller:two]{1}) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repositoriy den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. + Weiterhin ist (\hyperref[api_controller:two]{1}) ein Controller für Abhängigkeiten nötig, in dem man aus dem zu analysierenden Repository den Abhängigkeitsbaum extrahiert sowie diesen mit Schwachstellendaten anreichert. \\ Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer (\hyperref[api_controller:three]{3}) Endpunkt zu implementieren. In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex index 982e314..f8063c6 100644 --- a/documentation/latex/5_concept/architecture_2.tex +++ b/documentation/latex/5_concept/architecture_2.tex @@ -1,5 +1,5 @@ \subsubsection{Architektur V2} \label{sec:ArchitekturV2} - Aus den Ergebnissen der Experimente, aus Kapitel \ref{sec:ExperimenteDB} und \ref{sec:MySQL_Indexierung}, werden folgende Anpassungen an der Achitektur vorgenommen: + Aus den Ergebnissen der Experimente, aus Kapitel \ref{sec:ExperimenteDB} und \ref{sec:MySQL_Indexierung}, werden folgende Anpassungen an der Architektur vorgenommen: \begin{enumerate} \item \textbf{Datenbank} \begin{itemize} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 343d0df..5cf5ac4 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -8,4 +8,5 @@ \section{Konzept} \label{sec:Konzept} \input{5_concept/non_func.tex} \input{5_concept/special_attr.tex} \input{5_concept/results.tex} - \input{5_concept/architecture.tex} \ No newline at end of file + \input{5_concept/architecture.tex} + \ No newline at end of file diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index e8722b0..734a0c6 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -15,7 +15,7 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} Es müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. \ref{q:four}: - Diese Forschungsfrage behandelt die Umsetung der \ac{API} selbst. + Diese Forschungsfrage behandelt die Umsetzung der \ac{API} selbst. Es ist die Umsetzung der zu definierenden Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das End\-punkt\-doku\-mentations- und Test\-möglich\-keits\-tool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 04cb154..8534dd7 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -1,13 +1,9 @@ \subsubsection{Datenbank} \label{sec:ExperimenteDB} -Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. -Aus der Gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. -Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen 2.5 und 4.4 Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. -Dies wird deutlich an den in Abschnitt \textcolor{red}{Einfügen!} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. + Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. + Aus der Gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. + Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen 2.5 und 4.4 Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. + Dies wird deutlich an den in Abschnitt \textcolor{red}{Einfügen!} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. -LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. -Dazu wurde MySQL als \textit{open-source} und \textit{free-use} Version gewählt. -Diese unterscheidet sich grundsätzlich durch Indexierung der jeweiligen Einträge sowie dem höheren Maß an nutzbaren Ressourcen durch das laufen auf einem separaten Server. - -% Vergleich Messwerte (Am besten Messreihen) in Tabelle auf welchen Datenmengen? \\ - -% --> Einsparung von was am Ende? \\ + LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. + Dazu wurde MySQL als \textit{open-source} und \textit{free-use} Version gewählt. + Diese unterscheidet sich grundsätzlich durch Indexierung der jeweiligen Einträge sowie dem höheren Maß an nutzbaren Ressourcen durch das laufen auf einem separaten Server. diff --git a/documentation/latex/6_implementation/experiments.tex b/documentation/latex/6_implementation/experiments.tex index 279b31c..43149b7 100644 --- a/documentation/latex/6_implementation/experiments.tex +++ b/documentation/latex/6_implementation/experiments.tex @@ -1,11 +1,5 @@ \subsection{Experimente} \label{sec:Experimente} - Aus der Forschungsfrage \ref{q:five} ergeben sich Experimente, die auf Skalierbarkeit und Laufzeit der API abziehlen. + Aus der Forschungsfrage \ref{q:five} ergeben sich Experimente, die auf Skalierbarkeit und Laufzeit der API abzielen. \input{6_implementation/pipe_exp.tex} \input{6_implementation/db_exp.tex} \input{6_implementation/mysql_index.tex} - %!!!! SUCHE AUF JSON VS DB FILE - Experimente - \begin{itemize} - \item Laufzeitmessungen LiteDB (Mono vs. Pipe -- schon schneller, aber nicht genug $\rightarrow$ fragments/searchStatistics.md) - \item conclusio geht es schneller mit einer relationalen Datenbank? - \end{itemize} \ No newline at end of file diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index fd0d49b..e48a9a3 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -88,35 +88,24 @@ \subsection{Implementation V1} \label{sec:Implementation1} Da die \ac{CVE}-Daten sowie die zu untersuchenden Repositories ihre Datenbasis in GitHub\cite{GITHUB} haben, werden diese durch diesen Controller gecloned. \begin{itemize} \item Clone-Endpunkt \\ - Bei deisem Post-Endpunkt wird das CVE-Daten-Repository bzw. das zu analysierende Repository aus GitHub heruntergeladen. - Übergeben wird hier ein Tupel aus Strings, welches die URL und ein Tag beinhaltet sowie einen Boolwert, der angibt, ob es sich um CVE-Daten oder ein Analyserepository handelt. + Bei diesem Post-Endpunkt wird das CVE-Daten-Repository bzw. das zu analysierende Repository aus GitHub heruntergeladen. + Übergeben wird hier ein Tupel aus Strings, welches die URL und ein Tag beinhaltet sowie einen Bool-Wert, der angibt, ob es sich um CVE-Daten oder ein Analyse-Repository handelt. \\ \textbf{OK} bei erfolgreichem Herunterladen \\ \textbf{Bad Request} bei nicht erfolgreichem Herunterladen \end{itemize} - % \item MySqlConnectionController \\ %! V2 - % Dieser Controller hat die Aufgabe die Erreichbarkeit der Datenbank zu überprüfen. %! V2 - \item ViewController \label{api_controller:four}\\ In diesem Controller werden als HTML alle \ac{JSON-LD} Beschreibungen -- siehe $@context$ -- zurückgegeben. \begin{itemize} \item json-ld-Endpunkt \\ - In diesem Get-Endpunkt wird die JSON-LD-Definition als ansehbare HTML-Daten dargestellt. + In diesem Get-Endpunkt wird die JSON-LD-Definition als sichtbare HTML-Daten dargestellt. \\ - \textbf{OK} mit den HTML-Daten als Inhalt des Response-Bodys + \textbf{OK} mit den HTML-Daten als Inhalt des Response-Bodys \end{itemize} \end{itemize} - % Konvertierung von und in \ac{JSON} zu Controller (oben die Punkte) - % \begin{itemize} - % \item removed Controller-Endpoints: - % \item Db/CheckRawDir (check if the downloaded \ac{CVE}-dir is ready to convert) - % \item Db/ConvertRawDirToDb (Convert the downloaded \ac{CVE} to LiteDB) - % \item Git/cloneStatus (if the current clone is finished) - % \end{itemize} - Um diese Applikation jetzt unabhängig vom Betriebssystem des Endgerätes zu machen, wurde eine docker-compose-Datei für die Containerisierung erstellt. Dieses referenzierte ein einzelnes Dockerfile mit dem Container der API. Ein eigenständiger Datenbankcontainer ist aufgrund der Eigenart von LiteDB als dateibasierte Datenbank nicht notwendig. diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex index e73cfff..a322b74 100644 --- a/documentation/latex/6_implementation/mysql_index.tex +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -7,7 +7,6 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} Damit sollte die Leistung merklich verbessert werden. \\ Nachfolgend die arithmetische Mittel aus jeweils 10 Messungen auf der selben Tabelle mit und ohne Index: - \\ \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline Such-Typ & Zeit & Faktor \\ \hline @@ -17,3 +16,26 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} \caption{Laufzeiten Durchschnitt 10 Messungen \textsuperscript{siehe Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex}}} \label{tabularx:MySqlIndexWithAndWithout} \end{tabularx} + Graphisch dargestellt sieht dies wie folgt aus: + \begin{figure}[h] + \centering + \begin{tikzpicture} + \begin{axis}[ + ybar, + bar width=4, + ylabel={Laufzeit}, + ytick={0,50,100,150,200,250}, + xtick={1, 2}, + legend style={at={(0.5,-0.15)}, anchor=north,legend columns=-1}, + nodes near coords + ] + + \addplot coordinates {(1, 207.86)}; + \addplot coordinates {(1, 0.71)}; + + \legend{$ohne Index$, $mit Index$} + + \end{axis} + \end{tikzpicture} + \caption{balkendiagramm:A} + \end{figure} diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index bbb3147..ee64dea 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -19,7 +19,7 @@ \subsection{Validierung V1} \label{sec:Vali1} \\ Der Endpunkt für das Clonen eines beliebigen Github-Repo's ist in der Datei GitController.cs einsehbar. Über das Setzen einer boolschen Variable war es dort möglich, ein zu analysierendes Repo anzugeben. - Der entsprechend andere Fall bestand in der Downloadmöglichkeit der \ac{CVE}-Roh-Daten -- siehe hierzu den ersten Punkt der Validierung V1. + Der entsprechend andere Fall bestand in der Download-Möglichkeit der \ac{CVE}-Roh-Daten -- siehe hierzu den ersten Punkt der Validierung V1. \item[(4) Aufstellen aller Abhängigkeiten des heruntergeladenen Repo's] siehe \hyperref[f:four]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ @@ -59,13 +59,13 @@ \subsection{Validierung V1} \label{sec:Vali1} \item[(3) Dokumentation der Endpunkte] siehe \hyperref[nf:three]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Mittels der vom ASP.NET in der Projektkonfiguration mitgelieferten automatischen Erstellung einer OpenAPI-Unterstützung, wird eine Swagger-Dokumentation beim \textit{build} erstellt und kann unter dem Routensuffix \textit{[...]/swagger/index.html} eingesehen werden. + Mittels der vom ASP.NET in der Projektkonfiguration mitgelieferten automatischen Erstellung einer OpenAPI-Unterstützung, wird eine Swagger-Dokumentation beim \textit{build} erstellt und kann unter dem Routen-Suffix \textit{[...]/swagger/index.html} eingesehen werden. \item[(4) Rückgabe im \acs{JSON-LD}-Format] siehe \hyperref[nf:four]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \item[(5) Nutzung etablierter Technologien] siehe \hyperref[nf:five]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Sowohl die \ac{API} mit ASP.NET, die Containierisierung mit Docker, als auch die Datenbank mit LiteDB sind mit etablierten Technologien umgesetzt worden. + Sowohl die \ac{API} mit ASP.NET, die Containerisierung mit Docker, als auch die Datenbank mit LiteDB sind mit etablierten Technologien umgesetzt worden. \end{description} \noindent Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage mit über 2,5 Sekunden pro Paket als unbefriedigend eingestuft werden muss. \textcolor{yellow}{QUELLE} diff --git a/documentation/latex/6_implementation/validation_2.tex b/documentation/latex/6_implementation/validation_2.tex index 589d81c..9f6af3d 100644 --- a/documentation/latex/6_implementation/validation_2.tex +++ b/documentation/latex/6_implementation/validation_2.tex @@ -1,5 +1,6 @@ \subsection{Validierung V2} \label{sec:Vali2} - Die unter \ref{sec:Vali1} \nameref{sec:Vali1} noch nicht als erfolgreich gekennzeichneten \texttt{funktionale} Anforderungen werden in der V2 nachfolgend neu betrachten. + Die unter \ref{sec:Vali1} \nameref{sec:Vali1} bereits erfüllten funktionalen und nichtfunktionalen Anforderungen sind weiterhin erfüllt, da an deren Implementierung keine Veränderungen stattfanden. + Die noch nicht als erfolgreich gekennzeichnete \texttt{funktionale} Anforderung wird in der V2 nachfolgend neu betrachten. \begin{description} \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ @@ -15,16 +16,10 @@ \subsection{Validierung V2} \label{sec:Vali2} Wurde erfolgreich umgesetzt. \\ Unter dem Abschnitt \ref{sec:MySQL_Indexierung} ist die Auswertung der Messung mit einer indizierten Datenbanktabelle einzusehen. - Daraus ist erkenntlich, daß die Vorgabe der 5ms mit den durchschnittlich erreichten $0.7$ms erreicht wurde. + Daraus ist erkenntlich, daß die Vorgabe der 5ms mit den durchschnittlich erreichten $0,7$ms erreicht wurde. \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ Dank der mehrfachen zeitgleichen Zugriffsmöglichkeit auf einer MySQL-Datenbank ist dieser Punkt umgesetzt. Die einzige Limitierung liegt in der Hardware, auf welcher der Docker-Container läuft. \end{description} - - % Validierung V2 - % \begin{itemize} - % \item Endpunkte Ausgaben V1 vs. V2 vergleichen -- Überraschung folgt - % \item Laufzeitvergleich LiteDB vs. MySQL $\rightarrow$ fragments/mysql-measure.md - % \end{itemize} \ No newline at end of file diff --git a/documentation/latex/7_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex index 1ea7a7c..ecf8ea4 100644 --- a/documentation/latex/7_discussion/discussion.tex +++ b/documentation/latex/7_discussion/discussion.tex @@ -1,40 +1,61 @@ \section{Diskussion} \label{sec:Diskussion} - \textcolor{red}{ - \begin{itemize} - \item \ac{CVE} Datenmodell 2014 umgeändert? \\ - auf CVE internen Standard V5 gehoben - %? https://github.com/CVEProject/cvelistV5 - \item Manche Pakete haben keine Designation? $\rightarrow$ Bereinigen? Wie kann man damit umgehen? \\ - Wir: keine designation --> N/A - Wir haben keine Möglichkeit gefunden die designation nachträglich herauszubekommen - \item Risiken ausführlich betrachten, Kritik, dort kann man weitermachen/müsste man, was hat man nicht in dieser Arbeit adressiert? (alle Programmiersprachen) - \item !!! FUTURE WORK - \item Andere Wiss. Arbeiten die im Themenfeld \glqq state of the art\grqq~sind - \item Paper: On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem - \end{itemize} - } - Risiken: - \begin{itemize} - \item Bei bestehender Schwachstelle ist kein Eintrag in der genutzten Datenbasis vorhanden - \item Abhängigkeit vom \ac{CVE}-Daten Provider - \item Sicherheitslücken in der \ac{API} selbst. - \end{itemize} - - Weiter machen: - \begin{itemize} - \item Betrachten auf Versionsbasis - \item Betrachten auf Commit-basis - \item Zeitlicher Verlauf von Schachstellenzahlen in Repositories - \item Mehr Datenquellen als nur CVE Daten - \item Andere Untersuchungs-Projekttypen unterstützen, untersuchen ob es da unterschiede gibt - \item Dopplungen in Abhängigkeitsbäumen analysieren - \end{itemize} - - Was wurde nicht adressiert? - \begin{itemize} - \item Welche Sicherheitslücken können tatsächlich ausgenutzt werden bei \glqq Vererbung\grqq dieser (PAPER) - \item Selbst aufstellen eines Abhängigkeitsbaums - \item \glqq Most Wanted\grqq~- Meistgenutzte Pakete die kritische Sicherheitslücken nutzen - \item Hat das jeweilige Paket noch Hoffnung auf einen Fix/ist es deprecated? - \item Was anstatt einzelner Abhängigkeiten mit Sicherheitslücken als alternativen vorhanden sind - \end{itemize} \ No newline at end of file + Aus der vorangegangenen Betrachtung geht hervor, dass alle Forschungsfragen erfolgreich abschließbar waren. + + Aus Forschungsfrage \ref{q:one} ist durch die Konzeption \ref{!!!!!} klargeworden, dass für eine Sicherheitslückenanalyse von Paketen mehrere Funktionalitäten notwendig sind. + Diese sind in den funktionalen Anforderungen \ref{f:one} und \ref{f:two} aufgefasst. + Es handelt sich um das Einladen einer Schwachstellendatenbasis, für welche die \ac{CVE}-Daten gewählt wurden, sowie die Überprüfung eines Paketes mittels Abgleich dessen Bezeichnung und dieser Schwachstellendatenbasis auf Übereinstimmungen. + + Die Forschungsfrage \ref{q:two} ist aufbauend auf Forschungsfrage \ref{q:one} eine Schwachstellenanalyse auf einem ganzen Repository und somit auch in der Konzeption aufgezeigt. + Deshalb werden hier auch mehr funktionale Anforderungen angebracht. + \\ + Diese sind die funktionalen Anforderungen \ref{f:one}, \ref{f:three}, \ref{f:four} und \ref{f:five}. + Somit ist diese Forschungsfrage auch in der ersten Implementierung gelöst worden. + Für eine Analyse eines ganzen Repositories muss nach Clonen und Extraktion des Abhängigkeitsbaums des Repositories für seine Abhängigkeiten auf einer Schwachstellendatenbank der Abhängigkeitsbaum mit Schwachstellendaten angereichert werden. + + Forschungsfrage \ref{q:three} handelt vom Rückgabedatentyp und der weiteren Nutzbarkeit von Resultatdaten. + Hier wurde durch die Lösung der nichtfunktionalen Anforderung \ref{nf:four} die Rückgabe im JSON-LD-Format genutzt. + + Forschungsfrage \ref{q:four} ist durch die Konzeption und Implementierung des Projektes beantwortet worden. + Hier ist die funktionale Anforderung \ref{f:seven} und die nichtfuntkionale Anforderung \ref{nf:five} zugehörig. + Letztendlich wurde also eine mit Docker-Compose containerisierte Applikation entwickelt, welche aus Applikations- sowie Datenbankcontainer besteht. + Diese hat mit ASP.NET und zuerst LiteDB und dann MySQL jeweils eine aktuelle und weit verbreitete Technologien als Grundgerüst genutzt. + + Forschungsfrage \ref{q:five} war der Grund für eine zweite Iteration der Implementierung. + Hier wurde mit den nichtfunktionalen Anforderungen \ref{nf:one}, \ref{nf:two} und \ref{nf:three} eine obere Grenze von 5 ms für Einzelpaketsuchen, die Skalierbarkeit der Anwendung und eine Dokumentation der Anwendung gefordert. + Hierbei ist die obere Grenze der Paketsuche die Ursache der zweiten Implementierung. + \\ + Die funktionale Anforderung einer Aktualisierungsfunktion (\ref{f:six}) ist auch hier zugehörig für eine bessere Nutzbarkeit der Applikation. + Es wurde letztendlich mit einer indexierten MySQL-Datenbank eine Suche von unter 5 ms für eine Einzelpaketsuche erreicht. + Die Skalierbarkeit wiederrum wurde durch den Einsatz der MySQL-Datenbank und der Implementierung des Webservice mit ASP.NET umgesetzt. + \\ + Eine Dokumentation ist durch die Implementierung der Anwendung als \ac{API} mit einer Swagger-Endpunktbeschreibung geschehen. + + Es gab unter anderem verschiedene Auffälligkeiten die sich während der Entwicklung dieser Arbeit aufgetan haben. + Darunter, dass in 2014 das Datenmodell der CVE-Daten von der vierten auf die fünfte Version \href{https://github.com/CVEProject/cvelistV5}{github.com/CVEProject/cvelistV5} verändert hat. + Außerdem haben manche, sehr alte Einträge, keine Paketbezeichnung und sind somit für eine Analyse auf der Basis dieser nicht verwendbar. + Hierfür mussten diese leeren Bezeichnungen gefüllt werden, wobei die Wahl auf ein \glqq n/a\grqq~für \textit{not available} fiel, da es keine Möglichkeit gibt diese nachträglich automatisiert herauszufinden. + + Diese Arbeit beschränkt sich in ihrer Implementierung auf die Analyse von npm-Projekten, da bei der Extraktion des Abhängigkeitsbaumes dieser Projekte auf die nativen Funktionen von npm zurückgegriffen werden konnte. + Weiterhin wurden ausschließlich \ac{CVE}-Einträge als einzige Schwachstellendatenquelle genutzt. + Dies führt dazu, dass Schwachstellen eventuell bestehen, aber nicht -- in der für die Analyse genutzten -- Datenbasis vorhanden sind, womit diese unentdeckt bleiben. + Somit sollten also zukünftig verschiedene Datenquellen für Schwachstellen genutzt werden können. + Weiterhin ist hier klar eine Abhängigkeit vom \ac{CVE}-Repository für dessen Daten vorhanden damit eventuell eine Suche nach Alternativen zur Absicherung der Datenbasis vonnöten ist. + Es sind außerdem keine Sicherheitslücken in der \ac{API} selbst auszuschließen. + + Fortführend von dieser Arbeit können nun verschiedene weitere Betrachtungen vorgenommen werden. + Darunter die Verteilung von Schwachstellen auf Versions- oder Commit-Basis oder der zeitliche Verlauf von Schwachstellendaten in Repositories. + Weiterhin können Unterschiede zwischen Projekttypen, Frameworks oder Programmiersprachen bei Abhängigkeiten betrachtet werden. + Zusätzlich ist es möglich, Dopplungen von Abhängigkeiten gleicher und verschiedener Versionen in einem einzelnen Projekt zu untersuchen. + + In dieser Arbeit wurden auch verschiedene Themen nicht adressiert, welche durchaus einen Schwerpunkt in der Schwachstellenanalyse von Repositories bilden. + Darunter auch welche Sicherheitslücken wirklich letztendlich ausgenutzt werden können, also welcher Sicherheitskritischer Code wirklich ausgeführt wird. + Das wurde z.B. von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\~für das Maven-Ökosystem betrachtet. + Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur 1\% aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. + Daraus resultierend wurde vorgeschlagen nur eine bestimmte Tiefe des Abhängigkeitsbaumes zu analysieren, um Rechenzeiten zu verringern. + \\ + In der Arbeit selbst wurde außerdem kein Abhängigkeitsbaum selbst aufgestellt, welcher die Vorgabe von Abhängigkeitsbäumen durch das genutzte Framework notwendig macht. + Alternativen spielen auch eine große Rolle bei Entscheidung auf Ersetzen eines Paketes. + Diese aufzuzeigen bringt dem Nutzer letztendlich nach der Entscheidungsfindung den größten Nutzen. + Viele Pakete bekommen allerdings während ihrer Lebenszeit Aktualisierungen welche manche Sicherheitslücken schließt. + Hier einen Hinweis anzubringen, ob ein Paket Hoffnung auf einen solchen Patch hat oder veraltet ist wird kann mit Betrachtung der Alternativen dieses mit abgehandelt werden. + Im größeren Stil kann auch eine Analyse auf die meist verwendeten Sicherheitskritischen Softwarepakete in bestimmten Ökosystemen angebracht werden. diff --git a/documentation/latex/8_summary/summary.tex b/documentation/latex/8_summary/summary.tex index 9b49906..85c7f35 100644 --- a/documentation/latex/8_summary/summary.tex +++ b/documentation/latex/8_summary/summary.tex @@ -1,17 +1,25 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} - Aus der \nameref{subsec:Motivation} kann der hauptsächliche Auftrag mit der Forschungsfragen \ref{q:four} umformuliert werden mit der Frage, wie transitive Schwachstellen ermittelt und ausgegeben werden können. + Die in der \nameref{subsec:Motivation} aufgelisteten Forschungsfragen können wie folgt nach Bearbeitung des Auftrages beantwortet werden: + \begin{description} + \item[\ref{q:one}]\hfill \\ + Um die Pakete zu untersuchen ist es notwendig, die CVE-Daten in eine interne Datenbank umzuwandeln, da das Suchen auf den Rohdaten -- den CVE-\ac{JSON}-Dateien -- zu zeitaufwendig ist. + Dazu wurde schlussendlich eine MySQL-Datenbank ausgewählt, die dank der Indizierung einer Spalte die gewünschten Leistungsmerkmale aufweist. + \item[\ref{q:two}]\hfill \\ + In der umgesetzten Version ist es dank der nativen Unterstützung von npm gelungen, die Abhängigkeiten der Pakte als json zu extrahieren und dann intern so weiterzuverarbeiten, dass eine logische Repräsentation erfolgen kann. + \item[\ref{q:three}]\hfill \\ + Die Lösung dieser Frage geschah über die einheitliche Verwendung von \ac{JSON} respektive \ac{JSON-LD} bei der Rückgabe des Webservices. + \item[\ref{q:four}]\hfill \\ + Da die Aufgabe darin bestand, Github-Repositories zu analysieren, konnte in den Docker-Container der API git mitinstalliert werden, wodurch ein voller Zugriff der API auf den Funktionsumfang von git besteht. + Durch diesen erlangte die \ac{API} die Möglichkeit Repositories zu clonen und anschließend intern weiterzuverarbeiten, was den Funktionsumfang der selbst-implementierten Methoden aus den Punkten $I$ bis $III$ der Forschungsfragen bereits entsprang. + \item[\ref{q:five}]\hfill \\ + Die Frage nach der Laufzeitverbesserung stellte sich nach der Umsetzung der V1 (näheres in \ref{sec:Implementation1}), da dort die Wartezeiten für die Abfrage von Paketen den zeitlichen Rahmen übertraf. + Nach der Umsetzung einer Pipeline zur Verbesserung der Laufzeit überbot man jedoch ebenfalls die selbstgesetzt zeitliche Beschränkung der Suche eines Paketes an sich. + \\ + Die Überwindung der Zeitmauer gelang dann durch die in der V2 (\ref{sec:Implementation2}) verwendeten anderen Datenbank -- dann MySQL. + \end{description} + Der hauptsächliche Auftrag des Projektes bestand in der paraphrasierten Frage, wie transitive Schwachstellen ermittelt und ausgegeben werden können. + Dies wurde erfolgreich umgesetzt. \\ - Die Bearbeitung kann unter dem Abschnitt \ref{sec:Implementation} \nameref{sec:Implementation} nachvollzogen werden. - Nach anfänglicher Umsetzung, die die grundlegenden Funktionen vorweisen konnte, musste jedoch festgestellt werden, dass die nicht-funktionalen Anforderungen mit der Wahl einer dateibasierten Datenbank zügig implementierbar, aber nicht erreichbar sind. - Somit erfolgte eine Version 2, die mit der Änderung der Datenbank zu einer MySQL-Datenbank, wodurch die Ziele -- insbesondere die der zeitlichen Vorgaben -- zufriedenstellend erreicht werden konnte. + Die möglichen Erweiterungen -- besprochen in der \ref{sec:Diskussion} \nameref{sec:Diskussion} -- sind aufbauend und benötigen keine konkreten Änderungen in dem Grundgerüst, welches mit dem vorliegendem Projekt erreicht wurde. \\ - Während die \ac{API} anfänglich ein hauptaugenmerk auf die Funktion der Analyse einzelner Pakete fokussierte um diese Funktionalität zu gewährleisten, ist als zweite Iteration die Aufgabe der transitiven Analyse angegangen worden. - Da über beispielsweise die NIST-API (\ref{sec:NIST-API}) eine einzelne Paketanalyse ebenfalls machbar ist, lag hier der Schwerpunkt des Auftrages. - \\ - Nach der erfolgreichen Umsetzung der Baumstrukturaufstellung in einem npm-Projekt musste anschließend lediglich die Verbindung der Paketanalyse und der Aufbereitung der Ergebnisse als \textit{Dep\-en\-dencies-Tree} erfolgen. - Die Ausgabe jenes Ergebnisses geschieht dann im \ac{JSON-LD} Format, damit jeder Identifikator eindeutig und weiterverarbeitbar ist. - \\ - Insgesamt wurden die Anforderungen aus der \nameref{subsec:Motivation} also erfüllt, können jedoch noch weiter ausgearbeitet werden durch zum Beispiel die Erweiterung um weitere Frameworks als das aktuell einzige npm. - % TODO: was noch? - % TODO: hab ich was ausgelassen? - % TODO: war das zu strukturiert und eigentlich gar nicht vorher beschrieben mit der Historie? + Der zu dem Zeitpunkt der Abgabe aktuelle commit im Github-Repository wie folgt getagt: \textcolor{red}{TAG} diff --git a/documentation/latex/deckblatt.tex b/documentation/latex/deckblatt.tex index 0c70d30..770c6dd 100644 --- a/documentation/latex/deckblatt.tex +++ b/documentation/latex/deckblatt.tex @@ -8,8 +8,8 @@ {\Large des\\\textit{Masterprojektes}\\im Auftrag von Prof. Andreas Both\par} \vspace{12cm} von\par - \autorFirstNameK \textsc{ \autorFamilyNameK} \par + \autorFirstNameK\textsc{ \autorFamilyNameK} \par \& \par - \autorFirstNameT \textsc{ \autorFamilyNameT} \par + \autorFirstNameT\textsc{ \autorFamilyNameT} \par \vfill \end{titlepage} diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 251f46c..4dd3625 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -3,12 +3,12 @@ % https://www.cve.org/ProgramOrganization/CNAs @online{link:RedHatCveDef, title = "Was bedeutet CVE?", - urldate = "2024-04-14", + urldate = "2024-03-19", url = "https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve", } @online{link:CveOrgCnaS, title = "CVE Numbering Authorities (CNAs)", - urldate = "2024-04-14", + urldate = "2024-04-02", url = "https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs", } @@ -22,7 +22,7 @@ @online{link:GoogleDependencies } @online{link:DevInsiderDependecyDef, title = "Was ist eine Dependency", - urldate = "2024-04-14", + urldate = "2023-10-03", url = "https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/", } @@ -30,7 +30,7 @@ @online{link:DevInsiderDependecyDef % https://aws.amazon.com/what-is/api/ @online{link:ApiDef, title = "What is an API (Application Programming Interface)?", - urldate = "2024-04-14", + urldate = "2024-04-09", url = "https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/", } @@ -61,70 +61,70 @@ @online{link:ApiDef % MySql Index @online{link:MySqlIndex, title = "10.3.1 How MySQL Uses Indexes", - urldate = "2024-04-18", + urldate = "2024-01-30", url = "https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html", } % API Response Time @online{link:ApiResponseTime, title = "What’s the difference between API Latency and API Response Time?", - urldate = "2022-xx-xx", - url = "https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite.", + urldate = "2023-12-18", + url = "https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite.", } % Beliebteste Github JS Reps'security @online{link:GitPopJsRepoMostWanted, - title = "", + title = "Github explore", urldate = "2022-xx-xx", url = "https://gitmostwanted.com/?term=&lang=JavaScript", } @online{link:GitPopJsRepoReact, - title = "", + title = "react", urldate = "2022-xx-xx", url = "https://github.com/facebook/react/network/dependencies", } @online{link:GitPopJsRepoLeaflet, - title = "", + title = "Leaflet", urldate = "2022-xx-xx", url = "https://github.com/Leaflet/Leaflet/network/dependencies", } @online{link:GitPopJsRepoBootstrap, - title = "", + title = "bootstrap", urldate = "2022-xx-xx", url = "https://github.com/twbs/bootstrap/network/dependencies", } @online{link:GitPopJsRepoExpress, - title = "", + title = "express", urldate = "2022-xx-xx", url = "https://github.com/expressjs/express/network/dependencies", } @online{link:GitPopJsRepoSwiper, - title = "", + title = "swiper", urldate = "2022-xx-xx", url = "https://github.com/nolimits4web/swiper/network/dependencies", } @online{link:GitPopJsRepoPlotly, - title = "", + title = "plotly", urldate = "2022-xx-xx", url = "https://github.com/plotly/plotly.js/network/dependencies", } @online{link:GitPopJsRepoNode, - title = "", + title = "node", urldate = "2022-xx-xx", url = "https://github.com/nodejs/node/network/dependencies", } @online{link:GitPopJsRepoAos, - title = "", + title = "aos", urldate = "2022-xx-xx", url = "https://github.com/michalsnik/aos/network/dependencies", } @online{link:GitPopJsRepoPm2, - title = "", + title = "pm2", urldate = "2022-xx-xx", url = "https://github.com/Unitech/pm2/network/dependencies", } @online{link:GitPopJsRepoAxios, - title = "", + title = "axios", urldate = "2022-xx-xx", url = "https://github.com/axios/axios/network/dependencies", } \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 6549717..db96a98 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -60,11 +60,6 @@ \newcommand*{\QEDA}{\hfill\ensuremath{\large{\lozenge}}} \newcommand*{\QEDAa}{\hfill\ensuremath{\square}} -% Centering table of contents and list of table -% \usepackage{tocloft} -% \renewcommand{\contentsname}{\hfill\bfseries\Large Inhaltsverzeichnis \hfill} -% \renewcommand{\cftaftertoctitle}{\hfill} - \usepackage{titletoc} % for mutli toc's \usepackage[explicit]{titlesec} \setcounter{secnumdepth}{3} @@ -123,45 +118,6 @@ \newpage - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % \begin{wrapfigure}{l}{0.5\textwidth} - % \centering - % \begin{tikzpicture} - % \begin{axis}[ - % ybar, - % bar width=0.5cm, - % width=0.48\textwidth, - % height=6cm, - % ymin=0, - % xlabel={$x$}, - % ylabel={Werte}, - % xtick={1,2,3,4,5}, - % xticklabels={1, 2, 3, 4, 5}, - % xtick=data, - % nodes near coords, - % nodes near coords style={/pgf/number format/.cd,fixed zerofill,precision=1}, - % nodes near coords align={vertical}, - % ] - % \addplot coordinates {(1,1) (2,34) (3,23) (4,123) (5,84)}; - % \addplot[smooth, red, mark=*] coordinates { - % (0, {(1 + 34 + 23 + 123 + 84) / 5}) - % (6, {(1 + 34 + 23 + 123 + 84) / 5}) - % }; - % \end{axis} - % \end{tikzpicture} - % \caption{Balkendiagramm} - % \end{wrapfigure} - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - % Lorem, ipsum dolor sit amet consectetur adipisicing elit. Molestias aut, repellat ipsum facere voluptate dicta obcaecati deserunt nobis suscipit eaque? - - \newpage - \input{1_abstract/abstract.tex} \newpage \input{2_motivation/motivation.tex} From da91c688f90342d16f773abef7d950b7957a0245 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 2 May 2024 17:49:48 +0200 Subject: [PATCH 49/60] Map's for statistic --- documentation/fragments/Mappe1.CSV | 109 +++++++++ documentation/fragments/Mappe2.CSV | 366 +++++++++++++++++++++++++++++ documentation/fragments/Mappe3.CSV | 366 +++++++++++++++++++++++++++++ 3 files changed, 841 insertions(+) create mode 100644 documentation/fragments/Mappe1.CSV create mode 100644 documentation/fragments/Mappe2.CSV create mode 100644 documentation/fragments/Mappe3.CSV diff --git a/documentation/fragments/Mappe1.CSV b/documentation/fragments/Mappe1.CSV new file mode 100644 index 0000000..6b669ed --- /dev/null +++ b/documentation/fragments/Mappe1.CSV @@ -0,0 +1,109 @@ +Erster ;4147,1 ;Gesamtzeit ;28173,5 ; ;PipeZeit ;11794,7 + ;2866,1 ;Durchschnitt ;3130,388889 ; ; ; + ;2776,4 ; ; ; ;Faktor ; 2,388657617 + ;2796,2 ; ; ; ; ; + ;2779,7 ; ; ; ; ; + ;2779,5 ; ; ; ; ; + ;2760 ; ; ; ; ; + ;2864 ; ; ; ; ; + ;4404,5 ; ; ; ; ; + ; ; ; ; ; ; +Zweiter ;4004,3 ;Gesamtzeit ;26302,1 ; ;PipeZeit ;10146,6 + ;2866 ;Durchschnitt ;2922,455556 ; ; ; + ;2799,1 ; ; ; ;Faktor ; 2,592208227 + ;2780,3 ; ; ; ; ; + ;2770,9 ; ; ; ; ; + ;2758,1 ; ; ; ; ; + ;2774,3 ; ; ; ; ; + ;2803,2 ; ; ; ; ; + ;2745,9 ; ; ; ; ; + ; ; ; ; ; ; +Dritter ;4102 ;Gesamtzeit ;26178,4 ; ;PipeZeit ; 9281,4 + ;2761 ;Durchschnitt ;2908,711111 ; ; ; + ;2766,5 ; ; ; ;Faktor ; 2,820522766 + ;2767,9 ; ; ; ; ; + ;2754,5 ; ; ; ; ; + ;2742,7 ; ; ; ; ; + ;2759,3 ; ; ; ; ; + ;2754,3 ; ; ; ; ; + ;2770,2 ; ; ; ; ; + ; ; ; ; ; ; +Vierter ;4750,3 ;Gesamtzeit ;26566 ; ;PipeZeit ; 9566,3 + ;2777,6 ;Durchschnitt ;2951,777778 ; ; ; + ;2752,7 ; ; ; ;Faktor ; 2,777040235 + ;2712,3 ; ; ; ; ; + ;2724,7 ; ; ; ; ; + ;2715 ; ; ; ; ; + ;2708,1 ; ; ; ; ; + ;2706,5 ; ; ; ; ; + ;2718,8 ; ; ; ; ; + ; ; ; ; ; ; +F�nfter ;4087,7 ;Gesamtzeit ;25715,8 ; ;PipeZeit ; 9233,7 + ;2716,4 ;Durchschnitt ;2857,311111 ; ; ; + ;2697 ; ; ; ;Faktor ; 2,784994098 + ;2696,4 ; ; ; ; ; + ;2714,8 ; ; ; ; ; + ;2700,4 ; ; ; ; ; + ;2701,9 ; ; ; ; ; + ;2705,2 ; ; ; ; ; + ;2696 ; ; ; ; ; + ; ; ; ; ; ; +Sechster ;4338,2 ;Gesamtzeit ;26229,5 ; ;PipeZeit ; 9207,4 + ;2753,6 ;Durchschnitt ;2914,388889 ; ; ; + ;2744,4 ; ; ; ;Faktor ; 2,84874123 + ;2729,1 ; ; ; ; ; + ;2753 ; ; ; ; ; + ;2741,7 ; ; ; ; ; + ;2726,5 ; ; ; ; ; + ;2728 ; ; ; ; ; + ;2715 ; ; ; ; ; + ; ; ; ; ; ; +Siebenter ;4183,9 ;Gesamtzeit ;26243,2 ; ;PipeZeit ; 9372,5 + ;2882,7 ;Durchschnitt ;2915,911111 ; ; ; + ;2729,3 ; ; ; ;Faktor ; 2,800021339 + ;2740,1 ; ; ; ; ; + ;2722,7 ; ; ; ; ; + ;2721,1 ; ; ; ; ; + ;2740,8 ; ; ; ; ; + ;2734,4 ; ; ; ; ; + ;2788,2 ; ; ; ; ; + ; ; ; ; ; ; +Achter ;4080 ;Gesamtzeit ;25683,5 ; ;PipeZeit ; 9369,2 + ;2699,1 ;Durchschnitt ;2853,722222 ; ; ; + ;2703,3 ; ; ; ;Faktor ; 2,741269265 + ;2711,8 ; ; ; ; ; + ;2706,1 ; ; ; ; ; + ;2694,4 ; ; ; ; ; + ;2689,8 ; ; ; ; ; + ;2699,5 ; ; ; ; ; + ;2699,5 ; ; ; ; ; + ; ; ; ; ; ; +Neunter ;4061,9 ;Gesamtzeit ;25811,2 ; ;PipeZeit ; 9380,2 + ;2706,6 ;Durchschnitt ;2867,911111 ; ; ; + ;2739 ; ; ; ;Faktor ; 2,751668408 + ;2746,9 ; ; ; ; ; + ;2711 ; ; ; ; ; + ;2721 ; ; ; ; ; + ;2714,8 ; ; ; ; ; + ;2703,6 ; ; ; ; ; + ;2706,4 ; ; ; ; ; + ; ; ; ; ; ; +Zehnter ;4049,1 ;Gesamtzeit ;25773,5 ; ;PipeZeit ; 9516,4 + ;2746,2 ;Durchschnitt ;2863,722222 ; ; ; + ;2711 ; ; ; ;Faktor ; 2,708324577 + ;2704,9 ; ; ; ; ; + ;2707,1 ; ; ; ; ; + ;2706,5 ; ; ; ; ; + ;2700,4 ; ; ; ; ; + ;2724 ; ; ; ; ; + ;2724,3 ; ; ; ; ; + ; ; ; ; ; ; + ; ; ;262676,7 ; ; ;96868,4 + ; ; ;2918,63 ; ; ; 2,721344776 + ; ; ; ; ; ; + ; ;Minimum ;2689,8 ; ; ; + ; ;Maximum ;4750,3 ; ; ; + ; ;Durchschnitt ;2918,63 ; ; ; + ; ;Median ;2740,45 ; ; ; + ; ;Standardabweichung ;485,599169 ; ; ; + ; ;Varianz ;927740,8016 ; ; ; \ No newline at end of file diff --git a/documentation/fragments/Mappe2.CSV b/documentation/fragments/Mappe2.CSV new file mode 100644 index 0000000..446e814 --- /dev/null +++ b/documentation/fragments/Mappe2.CSV @@ -0,0 +1,366 @@ +Erster ;7208,9 ;Gesamtzeit ;99602,1 ; ;PipeZeit ;22231,9 + ;2765,7 ;Durchschnitt ;2845,774286 ; ; ; + ;2728 ; ; ; ;Faktor ;4,480143398 + ;2737,9 ; ; ; ; ; + ;2727,2 ; ; ; ; ; + ;2714,1 ; ; ; ; ; + ;2702,3 ; ; ; ; ; + ;2687,2 ; ; ; ; ; + ;2698,7 ; ; ; ; ; + ;2694,2 ; ; ; ; ; + ;2705,9 ; ; ; ; ; + ;2702,4 ; ; ; ; ; + ;2702,4 ; ; ; ; ; + ;2766,6 ; ; ; ; ; + ;2718,1 ; ; ; ; ; + ;2866,8 ; ; ; ; ; + ;2715,3 ; ; ; ; ; + ;2721,7 ; ; ; ; ; + ;2709,1 ; ; ; ; ; + ;2726,8 ; ; ; ; ; + ;2713,3 ; ; ; ; ; + ;2716 ; ; ; ; ; + ;2717,8 ; ; ; ; ; + ;2705,4 ; ; ; ; ; + ;2720,1 ; ; ; ; ; + ;2716,2 ; ; ; ; ; + ;2703,7 ; ; ; ; ; + ;2708,8 ; ; ; ; ; + ;2690,8 ; ; ; ; ; + ;2700,3 ; ; ; ; ; + ;2704,4 ; ; ; ; ; + ;2704,6 ; ; ; ; ; + ;2700,3 ; ; ; ; ; + ;2695,2 ; ; ; ; ; + ;2705,9 ; ; ; ; ; + ; ; ; ; ; ; +Zweiter ;3859,8 ;Gesamtzeit ;93503,1 ; ;PipeZeit ;21891,4 + ;2638,7 ;Durchschnitt ;2671,517143 ; ; ; + ;2650,9 ; ; ; ;Faktor ;4,27122523 + ;2653,7 ; ; ; ; ; + ;2654,5 ; ; ; ; ; + ;2642,1 ; ; ; ; ; + ;2666,9 ; ; ; ; ; + ;2680,2 ; ; ; ; ; + ;2644,9 ; ; ; ; ; + ;2613,2 ; ; ; ; ; + ;2605,5 ; ; ; ; ; + ;2594,6 ; ; ; ; ; + ;2633,3 ; ; ; ; ; + ;2603,7 ; ; ; ; ; + ;2605,7 ; ; ; ; ; + ;2618,1 ; ; ; ; ; + ;2637,3 ; ; ; ; ; + ;2635,7 ; ; ; ; ; + ;2656,1 ; ; ; ; ; + ;2620,6 ; ; ; ; ; + ;2642,6 ; ; ; ; ; + ;2624,1 ; ; ; ; ; + ;2640,4 ; ; ; ; ; + ;2641,2 ; ; ; ; ; + ;2647,7 ; ; ; ; ; + ;2637,5 ; ; ; ; ; + ;2639,2 ; ; ; ; ; + ;2642,4 ; ; ; ; ; + ;2639,8 ; ; ; ; ; + ;2645,7 ; ; ; ; ; + ;2661,3 ; ; ; ; ; + ;2633,1 ; ; ; ; ; + ;2632,7 ; ; ; ; ; + ;2622,2 ; ; ; ; ; + ;2637,7 ; ; ; ; ; + ; ; ; ; ; ; +Dritter ;3882,4 ;Gesamtzeit ;94028,9 ; ;PipeZeit ;22273,4 + ;2667,4 ;Durchschnitt ;2686,54 ; ; ; + ;2645,8 ; ; ; ;Faktor ;4,221578205 + ;2657,7 ; ; ; ; ; + ;2652,4 ; ; ; ; ; + ;2673,4 ; ; ; ; ; + ;2644,7 ; ; ; ; ; + ;2654,8 ; ; ; ; ; + ;2662,5 ; ; ; ; ; + ;2658,9 ; ; ; ; ; + ;2641,1 ; ; ; ; ; + ;2657,2 ; ; ; ; ; + ;2653,4 ; ; ; ; ; + ;2663,9 ; ; ; ; ; + ;2645,1 ; ; ; ; ; + ;2639,8 ; ; ; ; ; + ;2650,5 ; ; ; ; ; + ;2641,7 ; ; ; ; ; + ;2647,1 ; ; ; ; ; + ;2633,5 ; ; ; ; ; + ;2662,6 ; ; ; ; ; + ;2671,4 ; ; ; ; ; + ;2629,9 ; ; ; ; ; + ;2632,6 ; ; ; ; ; + ;2640 ; ; ; ; ; + ;2633,9 ; ; ; ; ; + ;2651,3 ; ; ; ; ; + ;2654 ; ; ; ; ; + ;2637,8 ; ; ; ; ; + ;2658,4 ; ; ; ; ; + ;2646,4 ; ; ; ; ; + ;2662,8 ; ; ; ; ; + ;2672,2 ; ; ; ; ; + ;2653,3 ; ; ; ; ; + ;2649 ; ; ; ; ; + ; ; ; ; ; ; +Vierter ;3895 ;Gesamtzeit ;94327,5 ; ;PipeZeit ;22041,2 + ;2665,8 ;Durchschnitt ;2695,071429 ; ; ; + ;2659,2 ; ; ; ;Faktor ;4,279599114 + ;2659,2 ; ; ; ; ; + ;2661,8 ; ; ; ; ; + ;2646,3 ; ; ; ; ; + ;2650,6 ; ; ; ; ; + ;2647,3 ; ; ; ; ; + ;2664,2 ; ; ; ; ; + ;2647,3 ; ; ; ; ; + ;2646 ; ; ; ; ; + ;2638,4 ; ; ; ; ; + ;2658,5 ; ; ; ; ; + ;2662,9 ; ; ; ; ; + ;2635,9 ; ; ; ; ; + ;2680,5 ; ; ; ; ; + ;2661,8 ; ; ; ; ; + ;2683,5 ; ; ; ; ; + ;2662,3 ; ; ; ; ; + ;2649,9 ; ; ; ; ; + ;2667,3 ; ; ; ; ; + ;2658,4 ; ; ; ; ; + ;2649,8 ; ; ; ; ; + ;2662,6 ; ; ; ; ; + ;2665,6 ; ; ; ; ; + ;2660,5 ; ; ; ; ; + ;2664,4 ; ; ; ; ; + ;2676,4 ; ; ; ; ; + ;2654 ; ; ; ; ; + ;2669,3 ; ; ; ; ; + ;2669 ; ; ; ; ; + ;2668,1 ; ; ; ; ; + ;2665,5 ; ; ; ; ; + ;2662,7 ; ; ; ; ; + ;2657,5 ; ; ; ; ; + ; ; ; ; ; ; +F�nfter ;4195,1 ;Gesamtzeit ;94947,6 ; ;PipeZeit ;22265,6 + ;2671,8 ;Durchschnitt ;2712,788571 ; ; ; + ;2678,1 ; ; ; ;Faktor ;4,264318051 + ;2687 ; ; ; ; ; + ;2669,7 ; ; ; ; ; + ;2657,2 ; ; ; ; ; + ;2676,2 ; ; ; ; ; + ;2645,2 ; ; ; ; ; + ;2663 ; ; ; ; ; + ;2678,2 ; ; ; ; ; + ;2685,4 ; ; ; ; ; + ;2665,6 ; ; ; ; ; + ;2679,3 ; ; ; ; ; + ;2686,9 ; ; ; ; ; + ;2678,2 ; ; ; ; ; + ;2690,9 ; ; ; ; ; + ;2678,4 ; ; ; ; ; + ;2668,6 ; ; ; ; ; + ;2668,6 ; ; ; ; ; + ;2664,8 ; ; ; ; ; + ;2654,2 ; ; ; ; ; + ;2656,4 ; ; ; ; ; + ;2642,4 ; ; ; ; ; + ;2664,9 ; ; ; ; ; + ;2664,4 ; ; ; ; ; + ;2649,9 ; ; ; ; ; + ;2652,8 ; ; ; ; ; + ;2656,4 ; ; ; ; ; + ;2670,2 ; ; ; ; ; + ;2665,4 ; ; ; ; ; + ;2667,3 ; ; ; ; ; + ;2675,1 ; ; ; ; ; + ;2676,2 ; ; ; ; ; + ;2677,3 ; ; ; ; ; + ;2686,5 ; ; ; ; ; + ; ; ; ; ; ; +Sechster ;3908,8 ;Gesamtzeit ;94561,8 ; ;PipeZeit ;22025,6 + ;2658,6 ;Durchschnitt ;2701,765714 ; ; ; + ;2665,2 ; ; ; ;Faktor ;4,293267834 + ;2670,9 ; ; ; ; ; + ;2658,7 ; ; ; ; ; + ;2670,3 ; ; ; ; ; + ;2673 ; ; ; ; ; + ;2680,6 ; ; ; ; ; + ;2665,9 ; ; ; ; ; + ;2671,1 ; ; ; ; ; + ;2674,8 ; ; ; ; ; + ;2685,6 ; ; ; ; ; + ;2683,9 ; ; ; ; ; + ;2676,8 ; ; ; ; ; + ;2675,1 ; ; ; ; ; + ;2665,1 ; ; ; ; ; + ;2679 ; ; ; ; ; + ;2662 ; ; ; ; ; + ;2677,4 ; ; ; ; ; + ;2652,3 ; ; ; ; ; + ;2660,6 ; ; ; ; ; + ;2657,5 ; ; ; ; ; + ;2648,4 ; ; ; ; ; + ;2655,7 ; ; ; ; ; + ;2659,9 ; ; ; ; ; + ;2663,8 ; ; ; ; ; + ;2649,1 ; ; ; ; ; + ;2657,1 ; ; ; ; ; + ;2672,2 ; ; ; ; ; + ;2667,5 ; ; ; ; ; + ;2665,8 ; ; ; ; ; + ;2667,8 ; ; ; ; ; + ;2664,5 ; ; ; ; ; + ;2649,5 ; ; ; ; ; + ;2667,3 ; ; ; ; ; + ; ; ; ; ; ; +Siebenter ;3805,9 ;Gesamtzeit ;94699,4 ; ;PipeZeit ;22037 + ;2665,7 ;Durchschnitt ;2705,697143 ; ; ; + ;2687,9 ; ; ; ;Faktor ;4,29729092 + ;2698,6 ; ; ; ; ; + ;2675,4 ; ; ; ; ; + ;2670,5 ; ; ; ; ; + ;2672,7 ; ; ; ; ; + ;2681,3 ; ; ; ; ; + ;2682,9 ; ; ; ; ; + ;2684,7 ; ; ; ; ; + ;2677,2 ; ; ; ; ; + ;2669,8 ; ; ; ; ; + ;2680,6 ; ; ; ; ; + ;2675,7 ; ; ; ; ; + ;2660,7 ; ; ; ; ; + ;2661,2 ; ; ; ; ; + ;2702,3 ; ; ; ; ; + ;2658,7 ; ; ; ; ; + ;2656,8 ; ; ; ; ; + ;2654 ; ; ; ; ; + ;2679,7 ; ; ; ; ; + ;2670,9 ; ; ; ; ; + ;2643,9 ; ; ; ; ; + ;2678 ; ; ; ; ; + ;2672,1 ; ; ; ; ; + ;2669 ; ; ; ; ; + ;2672,6 ; ; ; ; ; + ;2672,6 ; ; ; ; ; + ;2689,8 ; ; ; ; ; + ;2672,7 ; ; ; ; ; + ;2659,8 ; ; ; ; ; + ;2675,1 ; ; ; ; ; + ;2671,4 ; ; ; ; ; + ;2675,3 ; ; ; ; ; + ;2673,9 ; ; ; ; ; + ; ; ; ; ; ; +Achter ;3914,2 ;Gesamtzeit ;96138 ; ;PipeZeit ;22419,6 + ;2703,2 ;Durchschnitt ;2746,8 ; ; ; + ;2717,7 ; ; ; ;Faktor ;4,288122892 + ;2714,1 ; ; ; ; ; + ;2693 ; ; ; ; ; + ;2712,6 ; ; ; ; ; + ;2714,6 ; ; ; ; ; + ;2719,5 ; ; ; ; ; + ;2727,6 ; ; ; ; ; + ;2715,4 ; ; ; ; ; + ;2720,5 ; ; ; ; ; + ;2718,2 ; ; ; ; ; + ;2702,6 ; ; ; ; ; + ;2711,8 ; ; ; ; ; + ;2713,6 ; ; ; ; ; + ;2715,2 ; ; ; ; ; + ;2702,1 ; ; ; ; ; + ;2720,3 ; ; ; ; ; + ;2722,3 ; ; ; ; ; + ;2716,2 ; ; ; ; ; + ;2693,8 ; ; ; ; ; + ;2717,8 ; ; ; ; ; + ;2704,6 ; ; ; ; ; + ;2716 ; ; ; ; ; + ;2705 ; ; ; ; ; + ;2719,6 ; ; ; ; ; + ;2722,5 ; ; ; ; ; + ;2699,7 ; ; ; ; ; + ;2714 ; ; ; ; ; + ;2719,2 ; ; ; ; ; + ;2714,5 ; ; ; ; ; + ;2717,1 ; ; ; ; ; + ;2727,4 ; ; ; ; ; + ;2698,8 ; ; ; ; ; + ;2693,3 ; ; ; ; ; + ; ; ; ; ; ; +Neunter ;4029,9 ;Gesamtzeit ;94941,3 ; ;PipeZeit ;22092,4 + ;2665,9 ;Durchschnitt ;2712,608571 ; ; ; + ;2658,3 ; ; ; ;Faktor ;4,297464286 + ;2677,8 ; ; ; ; ; + ;2653,4 ; ; ; ; ; + ;2681,1 ; ; ; ; ; + ;2668,2 ; ; ; ; ; + ;2670,1 ; ; ; ; ; + ;2673,1 ; ; ; ; ; + ;2654,4 ; ; ; ; ; + ;2682,3 ; ; ; ; ; + ;2688,9 ; ; ; ; ; + ;2673,4 ; ; ; ; ; + ;2690,1 ; ; ; ; ; + ;2676,6 ; ; ; ; ; + ;2666,7 ; ; ; ; ; + ;2680,7 ; ; ; ; ; + ;2679,6 ; ; ; ; ; + ;2696,4 ; ; ; ; ; + ;2673 ; ; ; ; ; + ;2673,1 ; ; ; ; ; + ;2666,8 ; ; ; ; ; + ;2677,9 ; ; ; ; ; + ;2675 ; ; ; ; ; + ;2679,4 ; ; ; ; ; + ;2666 ; ; ; ; ; + ;2656,4 ; ; ; ; ; + ;2668,2 ; ; ; ; ; + ;2671,4 ; ; ; ; ; + ;2663,7 ; ; ; ; ; + ;2668,6 ; ; ; ; ; + ;2676,7 ; ; ; ; ; + ;2692,3 ; ; ; ; ; + ;2673,8 ; ; ; ; ; + ;2692,1 ; ; ; ; ; + ; ; ; ; ; ; +Zehnter ;3985,9 ;Gesamtzeit ;93362,7 ; ;PipeZeit ;21836,9 + ;2627,1 ;Durchschnitt ;2667,505714 ; ; ; + ;2624,8 ; ; ; ;Faktor ;4,275455765 + ;2644,6 ; ; ; ; ; + ;2627,8 ; ; ; ; ; + ;2632,2 ; ; ; ; ; + ;2628,7 ; ; ; ; ; + ;2634,3 ; ; ; ; ; + ;2605,6 ; ; ; ; ; + ;2618,4 ; ; ; ; ; + ;2617,8 ; ; ; ; ; + ;2626,6 ; ; ; ; ; + ;2623,7 ; ; ; ; ; + ;2610,7 ; ; ; ; ; + ;2654,7 ; ; ; ; ; + ;2637,5 ; ; ; ; ; + ;2622,8 ; ; ; ; ; + ;2626,9 ; ; ; ; ; + ;2629,7 ; ; ; ; ; + ;2629,8 ; ; ; ; ; + ;2624,7 ; ; ; ; ; + ;2635,4 ; ; ; ; ; + ;2633,3 ; ; ; ; ; + ;2630,7 ; ; ; ; ; + ;2631,6 ; ; ; ; ; + ;2626,9 ; ; ; ; ; + ;2646,3 ; ; ; ; ; + ;2627,2 ; ; ; ; ; + ;2633,2 ; ; ; ; ; + ;2622,8 ; ; ; ; ; + ;2627,3 ; ; ; ; ; + ;2627,2 ; ; ; ; ; + ;2620,6 ; ; ; ; ; + ;2624 ; ; ; ; ; + ;2641,9 ; ; ; ; ; + ; ; ; ; ; ; + ; ;Minimum ;2594,6 ; ; ; + ; ;Maximum ;7208,9 ; ; ; + ; ;Durchschnitt ;2714,606857 ; ; ; + ; ;Median ;2667,3 ; ; ; + ; ;Standardabweichung ;315,7627807 ; ; ; + ; ;Varianz ;278090,2135 ; ; ; diff --git a/documentation/fragments/Mappe3.CSV b/documentation/fragments/Mappe3.CSV new file mode 100644 index 0000000..688848a --- /dev/null +++ b/documentation/fragments/Mappe3.CSV @@ -0,0 +1,366 @@ +Erster ;64,0 ;Erster ;264,8 ; ; +mit Index ;1,4 ;ohne Index ;221,6 ; ; + ;0,5 ; ;211,4 ; ; + ;0,7 ; ;209,8 ; ; + ;2,5 ; ;211,1 ; ; + ;0,7 ; ;206,6 ; ; + ;0,7 ; ;206,4 ; ; + ;0,7 ; ;212,2 ; ; + ;0,5 ; ;208,4 ; ; + ;0,7 ; ;208,6 ; ; + ;0,8 ; ;209,3 ; ; + ;0,5 ; ;209,5 ; ; + ;0,5 ; ;208,4 ; ; + ;0,7 ; ;207,6 ; ; + ;0,6 ; ;206,2 ; ; + ;5,6 ; ;212,7 ; ; + ;1,5 ; ;206,3 ; ; + ;1,6 ; ;208,4 ; ; + ;0,5 ; ;212,4 ; ; + ;0,5 ; ;210,3 ; ; + ;0,7 ; ;206,6 ; ; + ;0,9 ; ;208,0 ; ; + ;0,6 ; ;205,4 ; ; + ;0,7 ; ;207,6 ; ; + ;0,7 ; ;205,1 ; ; + ;0,7 ; ;207,7 ; ; + ;0,5 ; ;206,1 ; ; + ;0,6 ; ;206,2 ; ; + ;0,6 ; ;205,4 ; ; + ;0,6 ; ;206,9 ; ; + ;0,6 ; ;211,2 ; ; + ;0,6 ; ;207,0 ; ; + ;0,6 ; ;207,6 ; ; + ;0,6 ; ;208,3 ; ; + ;0,7 ; ;207,1 ; ; +Zweiter ;0,9 ;Zweiter ;208,5 ; ; +mit Index ;0,5 ;ohne Index ;205,3 ; ; + ;0,4 ; ;209,3 ; ; + ;0,6 ; ;206,9 ; ; + ;0,5 ; ;210,4 ; ; + ;0,4 ; ;205,4 ; ; + ;0,4 ; ;208,0 ; ; + ;0,5 ; ;213,6 ; ; + ;0,4 ; ;208,1 ; ; + ;0,4 ; ;207,9 ; ; + ;0,4 ; ;207,2 ; ; + ;0,4 ; ;208,5 ; ; + ;0,4 ; ;208,4 ; ; + ;0,5 ; ;208,9 ; ; + ;0,6 ; ;207,7 ; ; + ;1,0 ; ;210,3 ; ; + ;1,0 ; ;210,8 ; ; + ;0,5 ; ;209,1 ; ; + ;0,5 ; ;208,1 ; ; + ;0,4 ; ;208,1 ; ; + ;0,5 ; ;209,3 ; ; + ;0,4 ; ;209,8 ; ; + ;0,4 ; ;209,8 ; ; + ;0,4 ; ;206,5 ; ; + ;0,4 ; ;214,7 ; ; + ;0,4 ; ;208,0 ; ; + ;0,4 ; ;208,2 ; ; + ;0,4 ; ;210,3 ; ; + ;0,4 ; ;208,7 ; ; + ;0,5 ; ;207,5 ; ; + ;0,4 ; ;209,9 ; ; + ;0,4 ; ;207,6 ; ; + ;0,4 ; ;206,8 ; ; + ;0,4 ; ;214,2 ; ; + ;0,4 ; ;209,4 ; ; +Dritter ;0,8 ;Dritter ;206,5 ; ; +mit Index ;0,5 ;ohne Index ;208,6 ; ; + ;0,5 ; ;209,8 ; ; + ;0,6 ; ;207,9 ; ; + ;0,9 ; ;208,7 ; ; + ;0,5 ; ;207,8 ; ; + ;0,4 ; ;209,5 ; ; + ;0,5 ; ;207,8 ; ; + ;0,5 ; ;211,0 ; ; + ;0,9 ; ;211,2 ; ; + ;0,7 ; ;206,9 ; ; + ;0,8 ; ;206,5 ; ; + ;1,0 ; ;207,7 ; ; + ;1,0 ; ;207,2 ; ; + ;1,0 ; ;206,6 ; ; + ;1,2 ; ;210,0 ; ; + ;1,5 ; ;207,0 ; ; + ;0,8 ; ;205,3 ; ; + ;0,5 ; ;209,2 ; ; + ;0,5 ; ;206,2 ; ; + ;0,4 ; ;204,0 ; ; + ;0,4 ; ;209,6 ; ; + ;0,4 ; ;205,9 ; ; + ;0,4 ; ;205,4 ; ; + ;0,4 ; ;206,0 ; ; + ;0,4 ; ;206,9 ; ; + ;0,4 ; ;206,6 ; ; + ;0,5 ; ;206,5 ; ; + ;0,4 ; ;210,2 ; ; + ;0,5 ; ;209,4 ; ; + ;0,4 ; ;208,5 ; ; + ;0,5 ; ;212,0 ; ; + ;0,4 ; ;211,3 ; ; + ;0,4 ; ;209,0 ; ; + ;0,4 ; ;209,2 ; ; +Vierter ;1,0 ;Vierter ;205,8 ; ; +mit Index ;0,4 ;ohne Index ;211,0 ; ; + ;0,3 ; ;208,9 ; ; + ;0,6 ; ;209,1 ; ; + ;0,5 ; ;208,5 ; ; + ;0,4 ; ;207,7 ; ; + ;0,3 ; ;208,5 ; ; + ;0,3 ; ;206,2 ; ; + ;0,3 ; ;207,8 ; ; + ;0,3 ; ;207,7 ; ; + ;0,3 ; ;208,3 ; ; + ;0,3 ; ;210,3 ; ; + ;0,4 ; ;206,9 ; ; + ;0,3 ; ;208,8 ; ; + ;0,4 ; ;205,9 ; ; + ;0,9 ; ;204,2 ; ; + ;0,8 ; ;206,0 ; ; + ;0,4 ; ;206,5 ; ; + ;0,4 ; ;206,7 ; ; + ;0,4 ; ;206,1 ; ; + ;0,3 ; ;205,7 ; ; + ;0,3 ; ;209,8 ; ; + ;0,3 ; ;208,7 ; ; + ;0,3 ; ;206,1 ; ; + ;0,3 ; ;205,2 ; ; + ;0,3 ; ;206,4 ; ; + ;0,3 ; ;203,3 ; ; + ;0,3 ; ;208,5 ; ; + ;0,3 ; ;212,7 ; ; + ;0,2 ; ;206,2 ; ; + ;0,3 ; ;207,9 ; ; + ;0,2 ; ;203,5 ; ; + ;0,2 ; ;206,8 ; ; + ;0,3 ; ;207,6 ; ; + ;0,3 ; ;205,8 ; ; +Fünfter ;0,7 ;Fünfter ;209,7 ; ; +mit Index ;0,4 ;ohne Index ;208,1 ; ; + ;0,3 ; ;212,9 ; ; + ;0,4 ; ;206,3 ; ; + ;0,6 ; ;211,6 ; ; + ;0,4 ; ;205,8 ; ; + ;0,6 ; ;211,7 ; ; + ;0,5 ; ;210,5 ; ; + ;0,4 ; ;205,6 ; ; + ;0,4 ; ;208,8 ; ; + ;0,4 ; ;209,5 ; ; + ;0,5 ; ;206,9 ; ; + ;0,4 ; ;207,3 ; ; + ;0,4 ; ;208,4 ; ; + ;0,4 ; ;207,7 ; ; + ;0,7 ; ;207,9 ; ; + ;0,8 ; ;207,7 ; ; + ;0,4 ; ;209,5 ; ; + ;0,4 ; ;210,7 ; ; + ;0,3 ; ;209,2 ; ; + ;0,3 ; ;207,6 ; ; + ;0,4 ; ;209,5 ; ; + ;0,4 ; ;206,1 ; ; + ;0,3 ; ;206,2 ; ; + ;0,3 ; ;206,9 ; ; + ;0,3 ; ;208,3 ; ; + ;0,3 ; ;208,1 ; ; + ;0,3 ; ;206,5 ; ; + ;0,3 ; ;207,4 ; ; + ;0,3 ; ;207,9 ; ; + ;0,4 ; ;208,4 ; ; + ;0,3 ; ;207,9 ; ; + ;0,3 ; ;207,6 ; ; + ;0,3 ; ;206,6 ; ; + ;0,3 ; ;206,1 ; ; +Sechster ;0,7 ;Sechster ;208,3 ; ; +mit Index ;0,4 ;ohne Index ;209,1 ; ; + ;0,5 ; ;209,5 ; ; + ;0,5 ; ;206,7 ; ; + ;0,4 ; ;207,7 ; ; + ;0,3 ; ;208,7 ; ; + ;0,4 ; ;208,6 ; ; + ;0,3 ; ;207,8 ; ; + ;0,6 ; ;207,5 ; ; + ;0,6 ; ;208,5 ; ; + ;0,4 ; ;205,9 ; ; + ;0,4 ; ;206,5 ; ; + ;0,4 ; ;205,9 ; ; + ;0,5 ; ;205,5 ; ; + ;0,4 ; ;205,6 ; ; + ;0,8 ; ;207,6 ; ; + ;0,8 ; ;209,2 ; ; + ;0,4 ; ;203,9 ; ; + ;0,4 ; ;206,4 ; ; + ;0,3 ; ;208,9 ; ; + ;0,3 ; ;206,3 ; ; + ;0,3 ; ;206,3 ; ; + ;0,2 ; ;205,7 ; ; + ;0,2 ; ;208,2 ; ; + ;0,3 ; ;207,8 ; ; + ;0,4 ; ;206,4 ; ; + ;0,3 ; ;210,1 ; ; + ;0,3 ; ;208,5 ; ; + ;0,3 ; ;209,2 ; ; + ;0,3 ; ;210,7 ; ; + ;0,2 ; ;208,1 ; ; + ;0,3 ; ;208,7 ; ; + ;0,3 ; ;209,7 ; ; + ;0,2 ; ;208,9 ; ; + ;0,3 ; ;208,2 ; ; +Siebenter ;0,6 ;Siebenter ;206,7 ; ; +mit Index ;0,4 ;ohne Index ;210,0 ; ; + ;0,5 ; ;207,6 ; ; + ;0,7 ; ;209,4 ; ; + ;0,7 ; ;206,6 ; ; + ;1,0 ; ;208,3 ; ; + ;0,6 ; ;206,7 ; ; + ;0,4 ; ;207,5 ; ; + ;0,3 ; ;209,1 ; ; + ;0,4 ; ;207,4 ; ; + ;0,3 ; ;211,8 ; ; + ;0,5 ; ;206,5 ; ; + ;0,5 ; ;207,5 ; ; + ;0,5 ; ;208,4 ; ; + ;0,4 ; ;207,5 ; ; + ;0,7 ; ;208,3 ; ; + ;0,7 ; ;206,5 ; ; + ;0,3 ; ;208,0 ; ; + ;0,3 ; ;206,7 ; ; + ;0,3 ; ;204,4 ; ; + ;0,3 ; ;205,5 ; ; + ;0,3 ; ;206,0 ; ; + ;0,3 ; ;206,5 ; ; + ;0,3 ; ;204,5 ; ; + ;0,3 ; ;207,5 ; ; + ;0,3 ; ;208,4 ; ; + ;0,3 ; ;208,4 ; ; + ;0,3 ; ;208,3 ; ; + ;0,7 ; ;204,4 ; ; + ;0,4 ; ;205,6 ; ; + ;0,3 ; ;205,9 ; ; + ;0,3 ; ;204,8 ; ; + ;0,3 ; ;205,4 ; ; + ;0,3 ; ;204,2 ; ; + ;0,3 ; ;203,6 ; ; +Achter ;0,5 ;Achter ;206,2 ; ; +mit Index ;0,3 ;ohne Index ;206,4 ; ; + ;0,3 ; ;208,3 ; ; + ;0,4 ; ;205,6 ; ; + ;0,3 ; ;208,8 ; ; + ;0,3 ; ;205,3 ; ; + ;0,2 ; ;207,8 ; ; + ;0,2 ; ;207,1 ; ; + ;0,2 ; ;203,8 ; ; + ;0,2 ; ;206,5 ; ; + ;0,2 ; ;205,7 ; ; + ;0,2 ; ;207,7 ; ; + ;0,4 ; ;205,4 ; ; + ;0,2 ; ;205,3 ; ; + ;0,3 ; ;206,0 ; ; + ;0,7 ; ;206,9 ; ; + ;0,7 ; ;206,5 ; ; + ;0,4 ; ;207,7 ; ; + ;0,3 ; ;206,3 ; ; + ;0,3 ; ;207,6 ; ; + ;0,3 ; ;204,5 ; ; + ;0,3 ; ;207,4 ; ; + ;0,2 ; ;205,9 ; ; + ;0,2 ; ;208,8 ; ; + ;0,2 ; ;207,3 ; ; + ;0,2 ; ;209,0 ; ; + ;0,2 ; ;207,6 ; ; + ;0,2 ; ;207,2 ; ; + ;0,4 ; ;206,3 ; ; + ;0,3 ; ;205,5 ; ; + ;0,3 ; ;205,8 ; ; + ;0,3 ; ;206,5 ; ; + ;0,3 ; ;204,0 ; ; + ;0,2 ; ;205,8 ; ; + ;0,2 ; ;205,2 ; ; +Neunter ;0,8 ;Neunter ;209,1 ; ; +mit Index ;0,5 ;ohne Index ;208,4 ; ; + ;0,3 ; ;213,5 ; ; + ;0,4 ; ;210,4 ; ; + ;0,4 ; ;206,6 ; ; + ;0,5 ; ;210,0 ; ; + ;0,6 ; ;208,7 ; ; + ;0,7 ; ;208,2 ; ; + ;0,7 ; ;208,9 ; ; + ;0,7 ; ;211,5 ; ; + ;0,5 ; ;206,6 ; ; + ;0,6 ; ;209,6 ; ; + ;0,5 ; ;207,6 ; ; + ;0,4 ; ;208,2 ; ; + ;0,6 ; ;208,2 ; ; + ;0,9 ; ;208,9 ; ; + ;0,9 ; ;208,2 ; ; + ;0,5 ; ;209,1 ; ; + ;0,4 ; ;206,9 ; ; + ;0,3 ; ;207,9 ; ; + ;0,3 ; ;205,9 ; ; + ;0,3 ; ;207,0 ; ; + ;0,3 ; ;209,3 ; ; + ;0,3 ; ;208,4 ; ; + ;0,3 ; ;206,5 ; ; + ;0,3 ; ;207,3 ; ; + ;0,3 ; ;209,3 ; ; + ;0,2 ; ;207,1 ; ; + ;0,2 ; ;207,9 ; ; + ;0,2 ; ;206,4 ; ; + ;0,2 ; ;207,1 ; ; + ;0,2 ; ;205,8 ; ; + ;0,2 ; ;210,7 ; ; + ;0,2 ; ;206,2 ; ; + ;0,2 ; ;208,4 ; ; +Zehnter ;0,6 ;Zehnter ;203,3 ; ; +mit Index ;0,4 ;ohne Index ;207,2 ; ; + ;0,4 ; ;207,4 ; ; + ;0,5 ; ;208,5 ; ; + ;0,4 ; ;206,1 ; ; + ;0,4 ; ;206,8 ; ; + ;0,3 ; ;205,8 ; ; + ;0,3 ; ;207,2 ; ; + ;0,3 ; ;204,6 ; ; + ;0,3 ; ;206,3 ; ; + ;0,3 ; ;207,0 ; ; + ;0,3 ; ;206,4 ; ; + ;0,3 ; ;208,0 ; ; + ;0,3 ; ;206,5 ; ; + ;0,3 ; ;207,0 ; ; + ;0,6 ; ;208,5 ; ; + ;0,7 ; ;205,7 ; ; + ;0,3 ; ;205,5 ; ; + ;0,3 ; ;205,2 ; ; + ;0,3 ; ;205,4 ; ; + ;0,3 ; ;206,1 ; ; + ;0,3 ; ;206,6 ; ; + ;0,3 ; ;209,3 ; ; + ;0,2 ; ;205,4 ; ; + ;0,2 ; ;207,4 ; ; + ;0,3 ; ;205,9 ; ; + ;0,2 ; ;204,9 ; ; + ;0,2 ; ;204,9 ; ; + ;0,2 ; ;206,4 ; ; + ;0,2 ; ;208,7 ; ; + ;0,2 ; ;205,6 ; ; + ;0,2 ; ;205,9 ; ; + ;0,3 ; ;206,0 ; ; + ;0,2 ; ;206,5 ; ; + ;0,2 ; ;207,7 ; ; + ; ; ; ; ; + ; ; ; ;Ohne Index ; + ; ; ; ;Minimum ;203,3 + ; ; ; ;Maximum ;264,8 + ; ; ; ;Durchschnitt ;207,86 + ; ; ; ;Median ;207,7 + ; ; ; ;Standardabweichung ;3,6727 + ; ; ; ;Varianz ;13,5279 + ; ; ; ; ; + ; ; ; ;Mit Index ; + ; ; ; ;Minimum ;0,2 + ; ; ; ;Maximum ;64 + ; ; ; ;Durchschnitt ;0,64514 ;Hier schlägt die jeweils erste Suche stark nach oben + ; ; ; ;Median ;0,4 + ; ; ; ;Standardabweichung ;3,4113 + ; ; ; ;Varianz ;11,6703 From f092ead463eabc669f6c9c68ec5bc860651d7084 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Thu, 2 May 2024 18:53:02 +0200 Subject: [PATCH 50/60] check both-comments part 1 --- documentation/latex/1_abstract/abstract.tex | 2 +- .../latex/2_motivation/motivation.tex | 2 +- .../latex/3_definitions/definitions.tex | 8 +- .../latex/4_other_work/repos_vul.tex | 5 +- documentation/latex/5_concept/non_func.tex | 2 +- documentation/latex/5_concept/questions.tex | 2 +- .../latex/6_implementation/db_exp.tex | 4 +- .../latex/6_implementation/mysql_index.tex | 32 ++++- .../latex/6_implementation/pipe_exp.tex | 2 +- .../latex/7_discussion/discussion.tex | 8 +- documentation/latex/deckblatt.tex | 4 +- documentation/latex/lib/bib.bib | 10 +- documentation/latex/main.bbl | 118 ++++++++++++------ 13 files changed, 130 insertions(+), 69 deletions(-) diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 6eba3e5..57faf38 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -1,4 +1,4 @@ -\section{Abstract} \label{sec:abstract} +\section*{Abstract} \label{sec:abstract} Das Entwickeln von Softwarelösungen ohne Bibliotheken, Frameworks oder externe Module ist heutzutage nicht mehr denkbar. Abhängigkeiten bestimmen Funktionalität, Effizienz und Sicherheit der jeweiligen Softwarelösung und sind so ein sensibler Punkt der Softwareentwicklung. Allerdings ist die Verwaltung dieser Abhängigkeiten mit ihren, teils transitiv vererbten, Sicherheitslücken mit steigender Zahl immer komplexer. diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index f40f7f4..4d3e502 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -17,7 +17,7 @@ \section{Motivation} \label{subsec:Motivation} \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1.75cm] \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?}\label{q:one} \item \textbf{Welche Funktionen sind notwendig um ein Repository auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?}\label{q:two} - \item \textbf{Wie sind die Resultat-Daten für den Endnutzer sowie Maschinen zu strukturieren, damit jene besser zu verarbeiten sind?}\label{q:three} + \item \textbf{Wie sind die Resultat-Daten für den Endnutzer sowie Maschinen zu strukturieren, damit jene ohne weitere aufwändige Aufbereitung zu verarbeiten sind?}\label{q:three} \item \textbf{Wie ist ein Schwachstellen-Analyse-Tool in Betracht auf transitive Anhängig\-keiten von Repositories zu implementieren?}\label{q:four} \item \textbf{Wie kann ein solches Tool leistungsstärker sowie laufzeiteffizienter werden?}\label{q:five} \end{enumerate} diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 8de19b6..4c348b8 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1,11 +1,11 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} \item \textbf{\ac{CVE}:} \\ - Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation gestellt; eine us-amerikanische Forschungsabteilung der "National Cybersecurity FFRDC", die staatliche Finanzierung genießt. + Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation\textsuperscript{\cite{link:MitreCve}} gestellt; eine us-amerikanische Forschungsabteilung der \glqq National Cybersecurity FFRDC\grqq, die staatliche Finanzierung genießt. \acs{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. \\ \glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. - In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (\acs{CNA}'s) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{} + In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (\acs{CNA}'s) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{link:CveOrgCnaS} Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. @@ -19,8 +19,8 @@ \section{Definitionen} \label{sec:Definitionen} Transitive Abhängigkeiten sind indirekte Abhängigkeiten, die durch andere Abhängigkeiten benötigt werden. Wenn nun eine Applikation ein Paket einbindet welches ein weiteres Paket selbst benötigt, so ist dieses eine transitive Abhängigkeit der Applikation. Somit können sich rekursiv Abhängigkeitsbäume aufspannen, die teils sogar gleiche Pakete in verschiedenen Versionen einbinden. - - \item \textbf{\ac{API}:} \\ + + \item \textbf{\acf{API}:} \\ Eine \ac{API} definiert eine Reihe von Regeln und Mechanismen, über die verschiedene Softwarekomponenten miteinander interagieren können. Somit bieten stellen sie Schnittstelle zwischen verschiedenen Systemen dar. Sie legt fest, wie Softwaremodule oder -anwendungen miteinander kommunizieren, indem sie Funktionen, Methoden, Protokolle und Datenstrukturen bereitstellt. diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index a912b6a..323a7c0 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -1,6 +1,5 @@ \subsubsection{ReposVul} \label{sec:ReposVul} - Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Repository basis Schwachstellendatensätze konstruiert. %TODO:Quelle + Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Basis des Quellcodes Schwachstellendatensätze konstruiert. %TODO:Quelle Hierbei wird zwischen Code-Änderungen und Patches zu Schwachstellen unterschieden, Aufrufbeziehungen von Schwachstellen extrahiert und ein Filtermodul für veraltete Patches bereitgestellt. - Analysiert wurden unter anderem auch transitive Abhängigkeiten + Analysiert wurden unter anderem auch transitive Abhängigkeiten. Es wurden in dieser Analyse C++, C, Java und Python als Programmiersprachen betrachtet und über 1491 Projekte ausgewertet. - \ No newline at end of file diff --git a/documentation/latex/5_concept/non_func.tex b/documentation/latex/5_concept/non_func.tex index 79e8663..1b2f91a 100644 --- a/documentation/latex/5_concept/non_func.tex +++ b/documentation/latex/5_concept/non_func.tex @@ -1,5 +1,5 @@ \subsection{Nichtfunktionale Anforderungen} \label{sec:N_Anforderungen} - Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschidene nichtunktionale Anforderungen: + Weiterhin ergeben sich der Umsetzung dieser \ac{API} aus den Forschungsfragen verschiedene nicht-funktionale Anforderungen: \begin{enumerate}[label=\textbf{NFRQ-\Roman*}, leftmargin=2.5cm] \item Die Suche eines einzelnen Pakets dauert nicht länger als 5 ms (betrifft \ref{q:five}) \label{nf:one} \\ diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index 734a0c6..8e52cef 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -16,7 +16,7 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} \ref{q:four}: Diese Forschungsfrage behandelt die Umsetzung der \ac{API} selbst. - Es ist die Umsetzung der zu definierenden Funktionalen Anforderungen unter der Betrachtung der nicht funktionalen Anforderungen. + Es ist die Umsetzung der zu definierenden Funktionalen Anforderungen unter der Betrachtung der nicht-funktionalen Anforderungen. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das End\-punkt\-doku\-mentations- und Test\-möglich\-keits\-tool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. Der entstandene Service muss weiterhin im Container-Kontext nutzbar sein. diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 8534dd7..153c112 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -1,7 +1,7 @@ \subsubsection{Datenbank} \label{sec:ExperimenteDB} Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. - Aus der Gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. - Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen 2.5 und 4.4 Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. + Aus der gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. + Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen $2,5$ und $7,2$ Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. Dies wird deutlich an den in Abschnitt \textcolor{red}{Einfügen!} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex index a322b74..8c73666 100644 --- a/documentation/latex/6_implementation/mysql_index.tex +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -10,8 +10,8 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline Such-Typ & Zeit & Faktor \\ \hline - ohne Index & 207,86ms & 1 \\ - mit Index & 0,710666667ms & 292,48593 \\ + ohne Index & $207,86$ ms & $1$ \\ + mit Index & $0,710666667$ ms & $292,48593$ \\ \hline \caption{Laufzeiten Durchschnitt 10 Messungen \textsuperscript{siehe Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex}}} \label{tabularx:MySqlIndexWithAndWithout} @@ -22,10 +22,10 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} \begin{tikzpicture} \begin{axis}[ ybar, - bar width=4, - ylabel={Laufzeit}, + bar width=25, + ylabel={Laufzeit in ms}, ytick={0,50,100,150,200,250}, - xtick={1, 2}, + xtick=data, legend style={at={(0.5,-0.15)}, anchor=north,legend columns=-1}, nodes near coords ] @@ -37,5 +37,25 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} \end{axis} \end{tikzpicture} - \caption{balkendiagramm:A} + \caption{Balkendiagramm der Laufzeiten mit und ohne Index} \end{figure} + \\ + Aus den Daten im Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex} lassen sich folgende Aussagen treffen: + \begin{tabularx}{0.8\textwidth}{|c|c|c|} + \hline + Ohne Index & Minimum & $203,3$ ms \\ + & Maximum & $264,8$ ms \\ + & Durchschnitt & $207,86$ ms \\ + & Median & $207,7$ ms \\ + & Standardabweichung & $3,6727$ ms \\ + & Varianz & $13,5279$ ms \\ \hline + Mit Index & Minimum & $0,2$ ms \\ + & Maximum & $64$ ms \\ + & Durchschnitt & $0,64514$ ms \\ + & Median & $0,4$ ms \\ + & Standardabweichung & $3,4113$ ms \\ + & Varianz & $11,6703$ ms \\ + \hline + \caption{Resultate aus den Rohdaten des Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex}} + \label{tabularx:ResultatDatenMySqlIndexAppendix} + \end{tabularx} diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex index 74c26d1..c45f56b 100644 --- a/documentation/latex/6_implementation/pipe_exp.tex +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -1,5 +1,5 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} - Um die Suche von mehreren Paketen in der Datenbasis zu beschleunigen wurde sich das Prinzip der Parallelisierung zu Nutzen gemacht. + Um die Suche von mehreren Paketen in der Datenbasis zu beschleunigen, wurde sich das Prinzip der Parallelisierung zu Nutzen gemacht. Hierzu wurde die zu untersuchende Liste von Paketen auf verschiedene Tasks aufgeteilt. So ist nach dem vollständigen Befüllen der Pipeline eine theoretischen Laufzeitverkürzung um der Faktor der maximal abarbeitbaren Tasks erreicht. diff --git a/documentation/latex/7_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex index ecf8ea4..c6e94aa 100644 --- a/documentation/latex/7_discussion/discussion.tex +++ b/documentation/latex/7_discussion/discussion.tex @@ -3,7 +3,7 @@ \section{Diskussion} \label{sec:Diskussion} Aus Forschungsfrage \ref{q:one} ist durch die Konzeption \ref{!!!!!} klargeworden, dass für eine Sicherheitslückenanalyse von Paketen mehrere Funktionalitäten notwendig sind. Diese sind in den funktionalen Anforderungen \ref{f:one} und \ref{f:two} aufgefasst. - Es handelt sich um das Einladen einer Schwachstellendatenbasis, für welche die \ac{CVE}-Daten gewählt wurden, sowie die Überprüfung eines Paketes mittels Abgleich dessen Bezeichnung und dieser Schwachstellendatenbasis auf Übereinstimmungen. + Es handelt sich um das Einladen einer Schwachstellendatenbasis, für welche die \ac{CVE}-Daten gewählt wurden, sowie die Über\-prüfung eines Paketes mittels Abgleich dessen Bezeichnung und dieser Schwachstellendatenbasis auf Über\-ein\-stimmungen. Die Forschungsfrage \ref{q:two} ist aufbauend auf Forschungsfrage \ref{q:one} eine Schwachstellenanalyse auf einem ganzen Repository und somit auch in der Konzeption aufgezeigt. Deshalb werden hier auch mehr funktionale Anforderungen angebracht. @@ -13,7 +13,7 @@ \section{Diskussion} \label{sec:Diskussion} Für eine Analyse eines ganzen Repositories muss nach Clonen und Extraktion des Abhängigkeitsbaums des Repositories für seine Abhängigkeiten auf einer Schwachstellendatenbank der Abhängigkeitsbaum mit Schwachstellendaten angereichert werden. Forschungsfrage \ref{q:three} handelt vom Rückgabedatentyp und der weiteren Nutzbarkeit von Resultatdaten. - Hier wurde durch die Lösung der nichtfunktionalen Anforderung \ref{nf:four} die Rückgabe im JSON-LD-Format genutzt. + Hier wurde durch die Lösung der nicht-funktionalen Anforderung \ref{nf:four} die Rückgabe im JSON-LD-Format genutzt. Forschungsfrage \ref{q:four} ist durch die Konzeption und Implementierung des Projektes beantwortet worden. Hier ist die funktionale Anforderung \ref{f:seven} und die nichtfuntkionale Anforderung \ref{nf:five} zugehörig. @@ -49,8 +49,8 @@ \section{Diskussion} \label{sec:Diskussion} In dieser Arbeit wurden auch verschiedene Themen nicht adressiert, welche durchaus einen Schwerpunkt in der Schwachstellenanalyse von Repositories bilden. Darunter auch welche Sicherheitslücken wirklich letztendlich ausgenutzt werden können, also welcher Sicherheitskritischer Code wirklich ausgeführt wird. - Das wurde z.B. von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\~für das Maven-Ökosystem betrachtet. - Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur 1\% aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. + Das wurde z.B. von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq$~$für das Maven-Ökosystem betrachtet. + Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur $1\%$ aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. Daraus resultierend wurde vorgeschlagen nur eine bestimmte Tiefe des Abhängigkeitsbaumes zu analysieren, um Rechenzeiten zu verringern. \\ In der Arbeit selbst wurde außerdem kein Abhängigkeitsbaum selbst aufgestellt, welcher die Vorgabe von Abhängigkeitsbäumen durch das genutzte Framework notwendig macht. diff --git a/documentation/latex/deckblatt.tex b/documentation/latex/deckblatt.tex index 770c6dd..714c436 100644 --- a/documentation/latex/deckblatt.tex +++ b/documentation/latex/deckblatt.tex @@ -5,9 +5,9 @@ \vspace{1.5cm} {\Huge\bfseries Abschlussbericht\par} \vspace{2cm} - {\Large des\\\textit{Masterprojektes}\\im Auftrag von Prof. Andreas Both\par} + {\Large des\\\textit{Masterprojektes}\\betreut von Prof. Dr. Andreas Both\par} \vspace{12cm} - von\par + erstellt von\par \autorFirstNameK\textsc{ \autorFamilyNameK} \par \& \par \autorFirstNameT\textsc{ \autorFamilyNameT} \par diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 4dd3625..79b8f2d 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -1,6 +1,10 @@ +@online{link:MitreCve, + title = "CVE", + urldate = "2024-05-01", + url = "https://web.archive.org/web/20240501170211/https://cve.mitre.org/", +} + % Definition CVE -% https://www.redhat.com/de/topics/security/what-is-cve -% https://www.cve.org/ProgramOrganization/CNAs @online{link:RedHatCveDef, title = "Was bedeutet CVE?", urldate = "2024-03-19", @@ -13,8 +17,6 @@ @online{link:CveOrgCnaS } % Def Abhängigkeit -% https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de -% https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ @online{link:GoogleDependencies, title = "Abhängigkeitsverwaltung", urldate = "2024-04-14", diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index 1a023f8..ab7aaf8 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -19,13 +19,29 @@ \refsection{0} \datalist[entry]{none/global//global/global} - \entry{link:RedHatCveDef}{online}{} + \entry{link:MitreCve}{online}{} \field{sortinit}{1} \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} + \field{title}{CVE} + \field{urlday}{1} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240501170211/https://cve.mitre.org/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240501170211/https://cve.mitre.org/ + \endverb + \endentry + \entry{link:RedHatCveDef}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} \field{title}{Was bedeutet CVE?} - \field{urlday}{14} - \field{urlmonth}{4} + \field{urlday}{19} + \field{urlmonth}{3} \field{urlyear}{2024} \field{urldateera}{ce} \true{nocite} @@ -37,15 +53,14 @@ \endverb \endentry \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{CVE Numbering Authorities (CNAs)} - \field{urlday}{14} + \field{urlday}{2} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs \endverb @@ -54,8 +69,8 @@ \endverb \endentry \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{Abhängigkeitsverwaltung} \field{urlday}{14} @@ -71,13 +86,13 @@ \endverb \endentry \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{Was ist eine Dependency} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} + \field{urlday}{3} + \field{urlmonth}{10} + \field{urlyear}{2023} \field{urldateera}{ce} \true{nocite} \verb{urlraw} @@ -92,7 +107,7 @@ \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{What is an API (Application Programming Interface)?} - \field{urlday}{14} + \field{urlday}{9} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} @@ -109,8 +124,8 @@ \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{10.3.1 How MySQL Uses Indexes} - \field{urlday}{18} - \field{urlmonth}{4} + \field{urlday}{30} + \field{urlmonth}{1} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} @@ -125,134 +140,159 @@ \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{What’s the difference between API Latency and API Response Time?} + \field{urlday}{18} + \field{urlmonth}{12} + \field{urlyear}{2023} + \field{urldateera}{ce} \verb{urlraw} - \verb https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/\#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. \endverb \verb{url} - \verb https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/%5C#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. \endverb - \warn{\item Entry 'link:ApiResponseTime' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} \field{sortinit}{2} \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{Github explore} \verb{urlraw} \verb https://gitmostwanted.com/?term=&lang=JavaScript \endverb \verb{url} \verb https://gitmostwanted.com/?term=&lang=JavaScript \endverb - \warn{\item Entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoReact}{online}{} \field{sortinit}{2} \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{react} \verb{urlraw} \verb https://github.com/facebook/react/network/dependencies \endverb \verb{url} \verb https://github.com/facebook/react/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} \field{sortinit}{2} \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{Leaflet} \verb{urlraw} \verb https://github.com/Leaflet/Leaflet/network/dependencies \endverb \verb{url} \verb https://github.com/Leaflet/Leaflet/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{bootstrap} \verb{urlraw} \verb https://github.com/twbs/bootstrap/network/dependencies \endverb \verb{url} \verb https://github.com/twbs/bootstrap/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoExpress}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{express} \verb{urlraw} \verb https://github.com/expressjs/express/network/dependencies \endverb \verb{url} \verb https://github.com/expressjs/express/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoSwiper}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{swiper} \verb{urlraw} \verb https://github.com/nolimits4web/swiper/network/dependencies \endverb \verb{url} \verb https://github.com/nolimits4web/swiper/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPlotly}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{plotly} \verb{urlraw} \verb https://github.com/plotly/plotly.js/network/dependencies \endverb \verb{url} \verb https://github.com/plotly/plotly.js/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoNode}{online}{} \field{sortinit}{3} \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{node} \verb{urlraw} \verb https://github.com/nodejs/node/network/dependencies \endverb \verb{url} \verb https://github.com/nodejs/node/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAos}{online}{} \field{sortinit}{3} \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{aos} \verb{urlraw} \verb https://github.com/michalsnik/aos/network/dependencies \endverb \verb{url} \verb https://github.com/michalsnik/aos/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPm2}{online}{} \field{sortinit}{3} \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{pm2} \verb{urlraw} \verb https://github.com/Unitech/pm2/network/dependencies \endverb \verb{url} \verb https://github.com/Unitech/pm2/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAxios}{online}{} \field{sortinit}{3} \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{axios} \verb{urlraw} \verb https://github.com/axios/axios/network/dependencies \endverb \verb{url} \verb https://github.com/axios/axios/network/dependencies \endverb - \warn{\item Entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \warn{\item online entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \enddatalist \endrefsection From cc13744adc4075b9a4c0bf77de15ef3060c295e8 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Fri, 3 May 2024 11:53:24 +0200 Subject: [PATCH 51/60] changed related work --- .../latex/3_definitions/definitions.tex | 10 +-- documentation/latex/4_other_work/demyst.tex | 29 ++++++-- documentation/latex/4_other_work/dependa.tex | 2 +- documentation/latex/4_other_work/on_t_eff.tex | 20 ++++-- .../latex/4_other_work/other_work.tex | 5 +- .../latex/4_other_work/repos_vul.tex | 27 ++++++-- documentation/latex/4_other_work/snyk.tex | 2 +- .../latex/5_concept/special_attr.tex | 2 +- .../6_implementation/implementation_1.tex | 6 +- .../latex/7_discussion/discussion.tex | 2 +- documentation/latex/lib/bib.bib | 66 +++++++++++++++++-- documentation/latex/main.tex | 4 ++ 12 files changed, 140 insertions(+), 35 deletions(-) diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 4c348b8..376120b 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -2,16 +2,16 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} \item \textbf{\ac{CVE}:} \\ Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation\textsuperscript{\cite{link:MitreCve}} gestellt; eine us-amerikanische Forschungsabteilung der \glqq National Cybersecurity FFRDC\grqq, die staatliche Finanzierung genießt. - \acs{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq~dar. + \acs{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq$~$dar. \\ - \glqq Common Vulnerabilities and Exposures\grqq~bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. + \glqq Common Vulnerabilities and Exposures\grqq$~$bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (\acs{CNA}'s) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{link:CveOrgCnaS} - Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zur Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. - Diese Informationen müssen über andere Services oder Datenbanken, wie z.B. in der \glqq U.S. National Vulnerability Database\grqq~oder der \glqq CERT/CC Vulnerability Notes Database\grqq. + Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zu Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. + Diese Informationen müssen über andere Services oder Datenbanken, wie zum Beispiel in der \glqq U.S. National Vulnerability Database\grqq$~$oder der \glqq CERT/CC Vulnerability Notes Database\grqq$~$beschafft. \item \textbf{Direkte Abhängigkeiten:} \\ In der Softwareentwicklung ist eine Abhängigkeit ein Softwarepaket, welches von der Anwendung selbst benötigt wird, um korrekt zu funktionieren. - Damit sind direkte Abhängigkeiten nicht wie indirekte durch andere Abhängigkeiten eingeführt, sondern direkt eingebunden. + Damit sind direkte Abhängigkeiten nicht, wie indirekte, durch andere Abhängigkeiten eingeführt. Direkte Abhängigkeiten sind typischerweise externe Softwarekomponenten oder Bibliotheken. Diese werden auch als Paket bezeichnet. diff --git a/documentation/latex/4_other_work/demyst.tex b/documentation/latex/4_other_work/demyst.tex index c343b42..71fad7f 100644 --- a/documentation/latex/4_other_work/demyst.tex +++ b/documentation/latex/4_other_work/demyst.tex @@ -1,8 +1,23 @@ \subsubsection{Demystifying Vulnerability Propagation} \label{sec:DVP} - Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq~von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. %TODO Quelle - Betrachtet wurden auch Versionierungen von Paketen. - Es wurde ein kompletter Ab\-hängig\-keits-\-Wissens\-graph des NPM-Ökosystems aufgestellt, welcher dann zum identifizieren von Schwachstellen sowie deren Propagation genutzt wurde. - Das entwickelte \glqq DTReme\grqq~Tool verfolgt Pakete und ihre Abhängigkeiten zurück und sucht diese nach Schwachstellen ab. - Ergebnis der Studie war, dass 20\% der Bibliotheken im NPM-Ökosystem Schwachstellen aufweisen. - 30\% dieser Bibliotheken enthalten Schwachstellen aus direkten Abhängigkeiten. - Ein weiterer Fund war, dass je länger eine bekannte Schwachstelle offen bleibt desto mehr Pakete sind im gesamten Abhängigkeitsbaum des NPM-Ökosystems betroffen davon. \ No newline at end of file + \begin{description} + \item[Adressierte Punkte]\hfill \\ + Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq\cite{article:Liu2022DemystifyingTV} von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. + In dieser Studie wurde die Schwachstellenausbreitung und -entwicklung betrachtet. + Diese Schwachstellen wurden in Abhängigkeitsbäumen Identifiziert. + Aus diesen Daten wurden Lösungen zur Schwachstellenbehebung entwickelt. + \item[Duchgeführte Maßnahmen]\hfill \\ + In dieser Arbeit wurden Abhängigkeitsbäume, auch Dependency-Graphen (DVGraph) genannt, konstruiert. + Es wurde weiterhin ein DVResolver-Algorithmus, welcher Abhängigkeitsbäume auflöst und ein DVReme-Tool entwickelt, welches der Schwachstellenbehebung dient. + Es wurde hier JavaScript für die Analyse der NPM-Pakete und Abhängigkeitsbäume genutzt. + Schachstellen wurden dabei durch die Verwendung von CVE-Daten erkannt. + \item[Ergebnisse]\hfill \\ + Es wurden durch diese Studie weit verbreitete Schwachstellen in NPM-Paketen offen gelegt sowie ein Tool zur effektiven Bekämpfung dieses implementiert. + Dabei hat das entwickelte DVReme-Tool sogar eine bessere Leistung als das offizielle npm audit fix-Tool. + Ergebnis der Studie war, dass 20 \% der Bibliotheken im NPM-Ökosystem Schwachstellen aufweisen. + 30 \% dieser Bibliotheken enthalten Schwachstellen aus direkten Abhängigkeiten. + Aus den erhaltenen Daten wurden Empfehlungen zur Verbesserung der Sicherheit im NPM-Ökosystem zusammengefasst. + \item[Unterschiede]\hfill \\ + Im gegensatz zu dieser Arbeit wird sich hier auf das NPM-Ökosystem festgelegt. + Das entstandene Tool ist auch nur für diese geeignet und bietet in der Hinsicht auch keine Erweiterungsmöglichkeit auf weitere Programmiersprachen oder Frameworks. + Weiterhin sind die entstandenen nicht in einem Standardisierten Format für den Nutzer zu erhalten. + \end{description} \ No newline at end of file diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index 2d87439..8a3930b 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,4 +1,4 @@ -\subsubsection{Github Dependa Bot} \label{sec:Dependa} +\subsubsection{Github - Dependa Bot} \label{sec:Dependa} Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. %TODO:QUELLE diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index ed0613f..5bf427a 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -1,5 +1,17 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label{sec:Transitivity} - Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq~von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. %TODO:Quelle - Dabei wurde auf direkte sowie transitive Abhängigkeiten geachtet und die Verteilung von Sicherheitslücken im Datensatz betrachtet. - Analysiert wurden weiterhin die Erreichbarkeit der Sicherheitslücken mit dem Ergebnis, dass nur etwa 1\% der transitiven Abhängigkeiten mit Sicher\-heits\-lücken diese ausweisen. - Dazu wurde eine Datenverarbeitungspipeline implementiert, wobei der Abhängigkeitsdatensatz in einem Wissensgraph dargestellt und analysiert wurde. \ No newline at end of file + \begin{description} + \item[Adressierte Punkte]\hfill \\ + Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\cite{article:OnTheEffect10123571} von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. + Dabei wurde vor allem ein Augenmerk auf Granularität sowie Transitivität der Schwachstellen gelegt. + Es wurde betrachtet, in wie fern sich Sicherheitslücken von direkten zu transitiven Abhängigkeiten propagieren. + \item[Duchgeführte Maßnahmen]\hfill \\ + Aus den Daten einer Umfangreichen Analyse von Maven-Projekten auf Sicherheitslücken, direkte sowie auch transitive, wurden diese durch einen Wissensgraphen dargestellt. + Gesamt beinhaltet die Studie 1.300 Sicherheitsberichte, welche für die Identifizierung von Schwachstellen genutzt wurden. + \item[Ergebnisse]\hfill \\ + Es wurde aufgezeigt, dass unter Betrachtung aller transitiven Abhängigkeiten etwa 31 \% der Projekte Schwachstellen beinhalten. + Die Granularitätsanalyse jedoch ergab, dass nur 1,2 \% der schachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängigkeiten erreichen. + Es wird hier vorgeschlagen durch die niedrige Anzahl an wirklich erreichbaren Schwachstellen, die Betrachtungstiefe von transitiven Abhängigkeiten in Schachstellenanalysen der Laufzeit und Ressourcen zu gute kommend zu begrenzen. + \item[Unterschiede]\hfill \\ + In dieser Arbeit wird nicht direkt ein Tool bereitgestellt, mit welchem eine Schwachstellenanalyse durchgeführt werden kann. + Weiterhin stellt sie aber die Frage, welche gefundenen Schwachstellen unter Betrachtung aller transitiven und direkten Abhängigkeiten wirklich Auswirkungen auf die Applikationssicherheit haben. + \end{description} \ No newline at end of file diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index e6df2a3..b931833 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -8,7 +8,10 @@ \section{Andere Arbeiten} \label{sec:Andere} \input{4_other_work/dependa.tex} \input{4_other_work/snyk.tex} \input{4_other_work/owasp.tex} + \newpage \subsection{Wissenschaftliche Arbeiten} \label{subsec:Wiss_Arbeiten} \input{4_other_work/repos_vul.tex} \input{4_other_work/on_t_eff.tex} - \input{4_other_work/demyst.tex} \ No newline at end of file + \input{4_other_work/demyst.tex} + Zusammenfassend ist zu sehen, dass in den erwähnten Arbeiten kein Service vorhanden ist, welcher unabhängig von Programmiersprache ein Paket, mehrere Pakete sowie ganze Repositories auf Sicherheitslücken mittels CVE-Daten untersucht wobei Abhängigkeitsbäume bei der Repository-Analyse hineinbezogen werden und diese Daten dann als weiterverwendbare Daten zum Beispiel als JSON-LD durch einen API-Endpunkt bereitgestellt sind. + Dieser Service soll selbst nicht abhängig von einen zu analysierenden Repository sein, sondern eigens verschiedene Repositories durch Angabe dieser analysieren. \ No newline at end of file diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index 323a7c0..8ebc2f1 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -1,5 +1,24 @@ \subsubsection{ReposVul} \label{sec:ReposVul} - Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq~von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches auf Basis des Quellcodes Schwachstellendatensätze konstruiert. %TODO:Quelle - Hierbei wird zwischen Code-Änderungen und Patches zu Schwachstellen unterschieden, Aufrufbeziehungen von Schwachstellen extrahiert und ein Filtermodul für veraltete Patches bereitgestellt. - Analysiert wurden unter anderem auch transitive Abhängigkeiten. - Es wurden in dieser Analyse C++, C, Java und Python als Programmiersprachen betrachtet und über 1491 Projekte ausgewertet. + \begin{description} + \item[Adressierte Punkte]\hfill \\ + Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq\cite{article:wang2024reposvul} von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches Schwachstellendatensätze konstruiert. + Notwendig ist diese Arbeit durch die immer weiter steigende Anzahl an Open-Source-Software sowie deren Sicherheitsauswirkungen. + In dieser Arbeit wird sich verworrenen und veralteten Patches in bestehenden Schwachstellendatensätzen gewidmet. + Ziel ist es, einen hochwertigen Schwachstellendatensatz herzustellen. + Dieser soll für Schwachstellenerkennungsmodell später nutzbar sein. + \item[Duchgeführte Maßnahmen]\hfill \\ + Um nun einen solchen Datensatz erstellen zu können wurde zuerst ein automatisiertes Datenbeschaffungs-Framework, \glqq ReposVul\grqq, erstellt. + Dieses erstellte einen ersten Schwachstellendatensatz auf Repository-Level. + Unter Verwendung von Large Language Models sowie statischen Codeanalysetools wurde zwischen Code-Änderungen und verworrenen Patches unterschieden. + Veraltete Patches werden hier letztendlich durch ein implementiertes tracebasiertes Filtermodul erkannt. + Weiterhin wurden interprozeduale Aufrufbeziehungen von Schwachstellen erfasst und extrahiert. + Die resultierende Datensammlung enthält 6.134 CVE-Einträge mit 236 CWE-Typen, die die Programmiersprachen c++, C, Java sowie Python in 1.491 Projekten darstellen. + \item[Ergebnisse]\hfill \\ + Es wurde ein hochwertiger Schwachstellendatensatz auf Repository-Level erstellt. + Dieser verringert die Probleme, welche durch verworrene oder veraltete Patches in anderen Datensätzen entstehen. + Es wird hier eine effektive Methode für Kennzeichnung und Erkennung von Schwachstellen sowie veralteten Patches bereitgestellt. + \item[Unterschiede]\hfill \\ + Es wird in dieser Arbeit nicht auf die Entwicklung einer Softwarelösung, sondern dem erstellen einer Umfangreichen Datenbasis wert gelegt. + Es werden weiterhin keine Möglichkeiten betrachtet, welche die Resultierenden Daten besser für Mensch und Maschine Nutzbar machen, wie zum Beispiel \ac{JSON-LD}. + Außerdem ist es hier nicht möglich direkt ein einzelnen Repository zu analysieren. + \end{description} \ No newline at end of file diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index 25c3219..b689032 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -4,7 +4,7 @@ \subsubsection{Snyk} \label{sec:Snyk} Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. \glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. - \glqq Synk Container\grqq~erkennt Schwachstellen in Container-Images sowie Kubernetes-Anwendungen. + \glqq Synk Container\grqq~erkennt Schwachstellen in Docker-Images sowie Kubernetes-Anwendungen. \glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesamten Deployment-Kette auf Schwachstellen geachtet. diff --git a/documentation/latex/5_concept/special_attr.tex b/documentation/latex/5_concept/special_attr.tex index 40f0766..2c54bfa 100644 --- a/documentation/latex/5_concept/special_attr.tex +++ b/documentation/latex/5_concept/special_attr.tex @@ -6,7 +6,7 @@ \subsection{Besondere Merkmale} \label{sec:Besondere Merkmale} Damit ist es nicht notwendig bei jeglichen Aktualisierungen die gesamte Datenbasis erneut herunterzuladen. Durch die lokal vorliegende Datenbasis ist das Suchen deutlich schneller als diese Daten immer erneut extern anzufragen. - Somit kann mit einer niedrigeren Laufzeit in z.B. CI/CD Intergrationen dieser gerechnet werden als andere Tools. + Somit kann mit einer niedrigeren Laufzeit in zum Beispiel CI/CD Intergrationen dieser gerechnet werden als andere Tools. Die Abfrage einzelner Pakete ist ebenfalls unterstützt. Demnach ist die punktuelle Analyse einzelner Pakete möglich, was den Einsatzrahmen für die Endnutzer erweitert. diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index e48a9a3..fd5984a 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -27,14 +27,14 @@ \subsection{Implementation V1} \label{sec:Implementation1} % \item PackageForApi %! SIEHE V2 % \item RepoObject %! SIEHE V2 \item $[$Enum$]$ ProjectType \\ - Dieses Enum wurde eingeführt, damit bei Nutzung des Repository-Analyze-Endpunkts nicht der Projekttyp als String (z.B. NodeJS) sondern ein Ganzzahlwert anstatt dessen genutzt werden kann. + Dieses Enum wurde eingeführt, damit bei Nutzung des Repository-Analyze-Endpunkts nicht der Projekttyp als String (zum Beispiel NodeJS) sondern ein Ganzzahlwert anstatt dessen genutzt werden kann. Die Entscheidung dafür fiel, damit mögliche Schreibfehler vom Endnutzer ausgeschlossen werden können. \end{itemize} Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: \begin{itemize} \item DbController \label{api_controller:three}\\ - Dieser Controller dient der Befüllung der Datenbank mit \ac{CVE}-Daten sowie der Nutzung dieser für kleinere Analysen. Dies sind z.B. einzelne Pakete oder Listen von Paketen. + Dieser Controller dient der Befüllung der Datenbank mit \ac{CVE}-Daten sowie der Nutzung dieser für kleinere Analysen. Dies sind zum Beispiel einzelne Pakete oder Listen von Paketen. \begin{itemize} \item CheckRawDir-Endpunkt \\ Dieser Get-Endpunkt dient zur Überprüfung, ob die Roh-Daten für die \ac{CVE}-LiteDB-Datenbank bereits vollständig Herunterladen wurden. @@ -68,7 +68,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} Dabei bedeutet Analyse eine Untersuchung auf \ac{CVE}-Daten für jegliche im Repository enthaltene Pakete. \begin{itemize} \item ExtractTree-Endpunkt \\ - Bei diesem Get-Endpunkt wird je nach Projekttyp, z.B. NodeJs, der Abhängigkeitsbaum extrahiert. + Bei diesem Get-Endpunkt wird je nach Projekttyp, zum Beispiel NodeJs, der Abhängigkeitsbaum extrahiert. \\ \textbf{OK} mit dem Abhängigkeitsbäumen für alle Abhängigkeiten des Repositories im Response-Body \\ diff --git a/documentation/latex/7_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex index c6e94aa..7570df6 100644 --- a/documentation/latex/7_discussion/discussion.tex +++ b/documentation/latex/7_discussion/discussion.tex @@ -49,7 +49,7 @@ \section{Diskussion} \label{sec:Diskussion} In dieser Arbeit wurden auch verschiedene Themen nicht adressiert, welche durchaus einen Schwerpunkt in der Schwachstellenanalyse von Repositories bilden. Darunter auch welche Sicherheitslücken wirklich letztendlich ausgenutzt werden können, also welcher Sicherheitskritischer Code wirklich ausgeführt wird. - Das wurde z.B. von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq$~$für das Maven-Ökosystem betrachtet. + Das wurde zum Beispiel von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq$~$für das Maven-Ökosystem betrachtet. Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur $1\%$ aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. Daraus resultierend wurde vorgeschlagen nur eine bestimmte Tiefe des Abhängigkeitsbaumes zu analysieren, um Rechenzeiten zu verringern. \\ diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index 79b8f2d..e08ddc9 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -29,7 +29,6 @@ @online{link:DevInsiderDependecyDef } % Def API -% https://aws.amazon.com/what-is/api/ @online{link:ApiDef, title = "What is an API (Application Programming Interface)?", urldate = "2024-04-09", @@ -38,27 +37,80 @@ @online{link:ApiDef % Def JSON % https://www.json.org/json-en.html +@online{link:JSON, + title = "JSON", + urldate = "2024-05-03", + url = "http://web.archive.org/web/20240503003039/https://www.json.org/json-en.html", +} % Def JSON-LD % https://json-ld.org/ +@online{link:JSON-LD, + title = "JSON-LD", + urldate = "2024-04-27", + url = "http://web.archive.org/web/20240427135957/https://json-ld.org/", +} % NIST % https://nvd.nist.gov/developers/vulnerabilities +@online{link:NISTAPI, + title = "NIST-API's", + urldate = "2024-04-28", + url = "http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities", +} % Dependa-Bot % https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide +@online{link:DependaBot, + title = "Git Dependa Bot", + urldate = "2024-05-02", + url = "http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide", +} % Synk -% https://docs.snyk.io/getting-started +@online{link:SYNK, + title = "SYNK", + urldate = "2023-09-22", + url = "http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started", +} % OWASP Dependency-Check -% https://owasp.org/www-project-dependency-check/ +@online{link:OWASPDependencyCheck, + title = "OWAST Dependency Check", + urldate = "2024-04-23", + url = "http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/", +} -% Wiss1: ReposVul: A Repository-Level High-Quality Vulnerability Dataset -% https://arxiv.org/abs/2401.13169 +@article{article:wang2024reposvul, + title = {ReposVul: A Repository-Level High-Quality Vulnerability Dataset}, + author = {Xinchen Wang and Ruida Hu and Cuiyun Gao and Xin-Cheng Wen and Yujia Chen and Qing Liao}, + year = {2024}, + eprint = {2401.13169}, + archivePrefix = {arXiv}, + primaryClass = {cs.CR}, + doi = {10.48550/arXiv.2401.13169} +} -% Wiss2: Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem -% https://www.semanticscholar.org/paper/Demystifying-the-Vulnerability-Propagation-and-Its-Liu-Chen/63c8044efacec1b39a28fbde5889bc75f473bd46 +@article{article:Liu2022DemystifyingTV, + title = {Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem}, + author = {Chengwei Liu and Sen Chen and Lingling Fan and Bihuan Chen and Yang Liu and Xin Peng}, + journal = {2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)}, + year = {2022}, + pages = {672-684}, + url = {https://api.semanticscholar.org/CorpusID:245853604} +} + +@article{article:OnTheEffect10123571, + author = {Mir, Amir M. and Keshani, Mehdi and Proksch, Sebastian}, + booktitle = {2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)}, + title = {On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem}, + year = {2023}, + volume = {}, + number = {}, + pages = {201-211}, + keywords = {Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem}, + doi = {10.1109/SANER56733.2023.00028} +} % MySql Index @online{link:MySqlIndex, diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index db96a98..66438dc 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -156,6 +156,10 @@ \addcontentsline{toc}{section}{Quellen} \printbibliography[type=online, heading=subbibliography, title={Links}] + \newpage + \phantomsection + \printbibliography[type=article, heading=subbibliography, title={Artikel}] + \newpage \phantomsection \addcontentsline{toc}{section}{Abbildungen} From 9fe84c76bba798f02ae3f7b5b66d4775493f4349 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 3 May 2024 12:27:14 +0200 Subject: [PATCH 52/60] check both-comments part 3 --- documentation/latex/4_other_work/demyst.tex | 2 +- documentation/latex/4_other_work/on_t_eff.tex | 2 +- .../latex/4_other_work/other_work.tex | 2 +- .../latex/4_other_work/repos_vul.tex | 2 +- .../latex/5_concept/architecture_1.tex | 10 +- documentation/latex/5_concept/concept.tex | 1 + .../latex/6_implementation/db_exp.tex | 2 +- .../6_implementation/implementation_1.tex | 5 +- .../6_implementation/implementation_2.tex | 10 +- .../latex/6_implementation/validation_1.tex | 4 +- documentation/latex/8_summary/summary.tex | 11 +- documentation/latex/Appendix/packageMean.tex | 2 +- documentation/latex/main.bbl | 303 ++++++++++++++++-- documentation/latex/main.tex | 1 + 14 files changed, 304 insertions(+), 53 deletions(-) diff --git a/documentation/latex/4_other_work/demyst.tex b/documentation/latex/4_other_work/demyst.tex index 71fad7f..10378c8 100644 --- a/documentation/latex/4_other_work/demyst.tex +++ b/documentation/latex/4_other_work/demyst.tex @@ -9,7 +9,7 @@ \subsubsection{Demystifying Vulnerability Propagation} \label{sec:DVP} In dieser Arbeit wurden Abhängigkeitsbäume, auch Dependency-Graphen (DVGraph) genannt, konstruiert. Es wurde weiterhin ein DVResolver-Algorithmus, welcher Abhängigkeitsbäume auflöst und ein DVReme-Tool entwickelt, welches der Schwachstellenbehebung dient. Es wurde hier JavaScript für die Analyse der NPM-Pakete und Abhängigkeitsbäume genutzt. - Schachstellen wurden dabei durch die Verwendung von CVE-Daten erkannt. + Schachstellen wurden dabei durch die Verwendung von \ac{CVE}-Daten erkannt. \item[Ergebnisse]\hfill \\ Es wurden durch diese Studie weit verbreitete Schwachstellen in NPM-Paketen offen gelegt sowie ein Tool zur effektiven Bekämpfung dieses implementiert. Dabei hat das entwickelte DVReme-Tool sogar eine bessere Leistung als das offizielle npm audit fix-Tool. diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index 5bf427a..cc28716 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -9,7 +9,7 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label Gesamt beinhaltet die Studie 1.300 Sicherheitsberichte, welche für die Identifizierung von Schwachstellen genutzt wurden. \item[Ergebnisse]\hfill \\ Es wurde aufgezeigt, dass unter Betrachtung aller transitiven Abhängigkeiten etwa 31 \% der Projekte Schwachstellen beinhalten. - Die Granularitätsanalyse jedoch ergab, dass nur 1,2 \% der schachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängigkeiten erreichen. + Die Granularitätsanalyse jedoch ergab, dass nur 1,2 \% der schwachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängig\-keiten erreichen. Es wird hier vorgeschlagen durch die niedrige Anzahl an wirklich erreichbaren Schwachstellen, die Betrachtungstiefe von transitiven Abhängigkeiten in Schachstellenanalysen der Laufzeit und Ressourcen zu gute kommend zu begrenzen. \item[Unterschiede]\hfill \\ In dieser Arbeit wird nicht direkt ein Tool bereitgestellt, mit welchem eine Schwachstellenanalyse durchgeführt werden kann. diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index b931833..9087505 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -13,5 +13,5 @@ \section{Andere Arbeiten} \label{sec:Andere} \input{4_other_work/repos_vul.tex} \input{4_other_work/on_t_eff.tex} \input{4_other_work/demyst.tex} - Zusammenfassend ist zu sehen, dass in den erwähnten Arbeiten kein Service vorhanden ist, welcher unabhängig von Programmiersprache ein Paket, mehrere Pakete sowie ganze Repositories auf Sicherheitslücken mittels CVE-Daten untersucht wobei Abhängigkeitsbäume bei der Repository-Analyse hineinbezogen werden und diese Daten dann als weiterverwendbare Daten zum Beispiel als JSON-LD durch einen API-Endpunkt bereitgestellt sind. + Zusammenfassend ist zu sehen, dass in den erwähnten Arbeiten kein Service vorhanden ist, welcher unabhängig von Programmiersprache ein Paket, mehrere Pakete sowie ganze Repositories auf Sicherheitslücken mittels \ac{CVE}-Daten untersucht wobei Abhängigkeitsbäume bei der Repository-Analyse hineinbezogen werden und diese Daten dann als weiterverwendbare Daten zum Beispiel als \ac{JSON-LD} durch einen \ac{API}-Endpunkt bereitgestellt sind. Dieser Service soll selbst nicht abhängig von einen zu analysierenden Repository sein, sondern eigens verschiedene Repositories durch Angabe dieser analysieren. \ No newline at end of file diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index 8ebc2f1..70a6590 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -7,7 +7,7 @@ \subsubsection{ReposVul} \label{sec:ReposVul} Ziel ist es, einen hochwertigen Schwachstellendatensatz herzustellen. Dieser soll für Schwachstellenerkennungsmodell später nutzbar sein. \item[Duchgeführte Maßnahmen]\hfill \\ - Um nun einen solchen Datensatz erstellen zu können wurde zuerst ein automatisiertes Datenbeschaffungs-Framework, \glqq ReposVul\grqq, erstellt. + Um nun einen solchen Datensatz erstellen zu können wurde zuerst ein automatisiertes Daten\-be\-schaffungs-Framework, \glqq ReposVul\grqq, erstellt. Dieses erstellte einen ersten Schwachstellendatensatz auf Repository-Level. Unter Verwendung von Large Language Models sowie statischen Codeanalysetools wurde zwischen Code-Änderungen und verworrenen Patches unterschieden. Veraltete Patches werden hier letztendlich durch ein implementiertes tracebasiertes Filtermodul erkannt. diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index bd4cc09..2b7e38a 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -29,14 +29,14 @@ \subsubsection{Architektur V1} \label{sec:ArchitekturV1} Für die Untersuchung einzelner Pakete und Listen dieser ist ein weiterer (\hyperref[api_controller:three]{3}) Endpunkt zu implementieren. In diesem ist auch die Update-Funktion der Datenbasis hinzuzufügen. \\ - Weiterhin muss in jedem Endpunkt (\hyperref[api_controller:four]{4}) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch JSON-LD zu interpretieren ist. + Weiterhin muss in jedem Endpunkt (\hyperref[api_controller:four]{4}) bei korrekter Antwort ein Context mitgeliefert werden, damit der gelieferte Inhalt so durch \ac{JSON-LD} zu interpretieren ist. Ebenfalls sind durch einen Controller die Rückgabedaten zu dokumentieren. Dazu ist zwischen Softwarepaketen und \ac{CVE}-Einträgen zu unterscheiden. \item \textbf{Datenmodelle} \label{arch_4}\\ - Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-JSON zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. + Um Daten korrekt in die Datenbank einzufügen, um ein Resultat-\ac{JSON} zu erzeugen oder die Paketliste intern zu verarbeiten -- dazu sind Datenmodelle nötig. \item \textbf{Konvertierung von und in JSON} \label{arch_5}\\ - Beim Einlesen der \ac{CVE}-Daten in die Datenbank ist eine Konvertierung vom vorhandenen JSON-Format in Einträge der Datenbank vorzunehmen. - Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im JSON-Format dem Benutzer übermittelt werden. + Beim Einlesen der \ac{CVE}-Daten in die Datenbank ist eine Konvertierung vom vorhandenen \ac{JSON}-Format in Einträge der Datenbank vorzunehmen. + Die aus der Datenbank genutzten, durch den Controller verarbeiteten, Daten müssen nun schließlich im \ac{JSON}-Format dem Benutzer übermittelt werden. \\ Dies muss in den jeweiligen Controllern geschehen. Damit die Daten besser weiterverwendbar sind muss zusätzlich ein Kontext \glqq @context\grqq~hinzugefügt werden. @@ -45,4 +45,4 @@ \subsubsection{Architektur V1} \label{sec:ArchitekturV1} Für den Bau der Containers wird Docker-Compose genutzt. \end{enumerate} - Weiterhin muss das JSON-LD-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). + Weiterhin muss das \ac{JSON-LD}-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{three}). diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 5cf5ac4..a2dfe2f 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -4,6 +4,7 @@ \section{Konzept} \label{sec:Konzept} Abhängigkeiten werden durch Extraktion eines Abhängigkeitsbaumes erkannt und einzeln gegen Schwachstellendaten geprüft. Der Nutzer, bzw. Maschinen sollen letztendlich ein weiterverwendbares klares Datenformat erhalten in welchem betroffene Abhängigkeiten und Ihre Schwachstellen vermerkt sind. \input{5_concept/questions.tex} + \newpage \input{5_concept/func.tex} \input{5_concept/non_func.tex} \input{5_concept/special_attr.tex} diff --git a/documentation/latex/6_implementation/db_exp.tex b/documentation/latex/6_implementation/db_exp.tex index 153c112..14c6e3e 100644 --- a/documentation/latex/6_implementation/db_exp.tex +++ b/documentation/latex/6_implementation/db_exp.tex @@ -2,7 +2,7 @@ \subsubsection{Datenbank} \label{sec:ExperimenteDB} Die Wahl der Datenbank hat einen großen Einfluss auf die Laufzeit von Anfragen auf diese. Aus der gegebenen Einbindung einer dateibasierten Datenbanklösung in ASP.NET -- LiteDB -- wurde diese auch zuerst als persistenter Datenspeicher gewählt. Aufgrund der Suchzeiten von LiteDB bei einzelnen Paketen, die zwischen $2,5$ und $7,2$ Sekunden liegen, erschien die Suche nach einer Alternative für bessere Ergebnisse angeraten. - Dies wird deutlich an den in Abschnitt \textcolor{red}{Einfügen!} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. + Dies wird deutlich an den in Tabellen \ref{tabularx:LessPackagesThenDbFiles} \& \ref{tabularx:MorePackagesThenDbFiles} aufgezeigten Laufzeiten trotz Verbesserung mit der Umsetzung einer Pipeline für die Suche. LiteDB ist eine NoSQL-Datenbank und eröffnete so die Möglichkeit der Lösung des Performance-Problems in einer relationalen Datenbank. Dazu wurde MySQL als \textit{open-source} und \textit{free-use} Version gewählt. diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index fd5984a..13c20a8 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -1,5 +1,4 @@ \subsection{Implementation V1} \label{sec:Implementation1} - \textcolor{red}{PIPELINE BILDER (svg im pap Ordner)} Folgende Komponenten wurden für die erste Implementation der \ac{API} genutzt: \begin{itemize} \item Framework ASP.NET (C\#) @@ -17,7 +16,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} \begin{itemize} \item CVEcomp, für CVE-Complete \\ Dieses Modell ist eine komplette Representation eines \ac{CVE}-Eintrags. - Für dieses Modell sind viele weitere Klassen notwendig um mit dem JSONSerializer den kompletten Datensatz umwandeln und anschließend in die interne Datenbank einfügen zu können. + Für dieses Modell sind viele weitere Klassen notwendig um mit dem \textit{JSONSerializer} den kompletten Datensatz umwandeln und anschließend in die interne Datenbank einfügen zu können. Es befinden sich als Klassen alle weiteren Subelemente der \ac{JSON}-Datei für die korrekte Verarbeitung im Programm. \item CveResult \\ Dieses Modell dient der Rückgabe von \ac{CVE}-Daten bei der Einzelpaket- oder Mehrpaketsuche auf der Datenbasis. @@ -31,7 +30,7 @@ \subsection{Implementation V1} \label{sec:Implementation1} Die Entscheidung dafür fiel, damit mögliche Schreibfehler vom Endnutzer ausgeschlossen werden können. \end{itemize} - Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: + \noindent Es wurden außerdem folgende Controller zur Umsetzung der funktionalen Anforderungen implementiert: \begin{itemize} \item DbController \label{api_controller:three}\\ Dieser Controller dient der Befüllung der Datenbank mit \ac{CVE}-Daten sowie der Nutzung dieser für kleinere Analysen. Dies sind zum Beispiel einzelne Pakete oder Listen von Paketen. diff --git a/documentation/latex/6_implementation/implementation_2.tex b/documentation/latex/6_implementation/implementation_2.tex index bc19867..878b046 100644 --- a/documentation/latex/6_implementation/implementation_2.tex +++ b/documentation/latex/6_implementation/implementation_2.tex @@ -9,10 +9,10 @@ \subsection{Implementation V2} \label{sec:Implementation2} Weiterhin gab es eine anpassung am Containernetzwerk, die MySQL Datenbank hat nun ihren eigenen Container, da diese nicht in ASP.NET eingebettet ist. Außerdem sind folgende Anpassungen an den Controllern vorgenommen worden: \begin{itemize} - \item DbController \label{api_controller:three}\\ + \item DbController \label{api_controller:three} \begin{itemize} - \item CheckRawDir-Endpunkt entfällt siehe GitControlller api/Git/PullCveAndConvert Endpunkt \\ - \item ConvertRawDirToDb-Endpunkt entfällt \\ + \item CheckRawDir-Endpunkt entfällt siehe GitControlller api/Git/PullCveAndConvert Endpunkt + \item ConvertRawDirToDb-Endpunkt entfällt \item Update-Endpunkt hinzugefügt \\ Mit diesem Endpunkt werden die lokalen CVE-Daten aktualisiert ohne den gesamten Datensatz erneut zu laden. \\ @@ -35,7 +35,7 @@ \subsection{Implementation V2} \label{sec:Implementation2} \textbf{Not Found} falls das Repository nicht lokal vorliegt. \end{itemize} - \item GitController \label{api_controller:one} \\ + \item GitController \label{api_controller:one} \begin{itemize} \item Clone --> CloneRepo hinzugefügt \item PullCveAndConvert (die aus dem ersten Controller sind jetzt hier) hinzugefügt @@ -44,7 +44,7 @@ \subsection{Implementation V2} \label{sec:Implementation2} \begin{itemize} \item CheckReachable-Endpunkt hinzugefügt \end{itemize} - \item ViewController \label{api_controller:four}\\ + \item ViewController \label{api_controller:four} \begin{itemize} \item Json-Ld-Endpunkt entfällt \item CveResult-Endpunkt hinzugefügt diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index ee64dea..f9c6a77 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -27,7 +27,7 @@ \subsection{Validierung V1} \label{sec:Vali1} \item[(5) Extrahieren und Rückgabe eines Abhängigkeitsbaums mit sicher\-heits\-lücken\-betroffenen Paketen] siehe \hyperref[f:five]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Über den Endpunkt ExtractTree des DependeciesControllers ist es möglich, diesen Abhängigkeitsbaums des Projektes zu erhalten. + Über den Endpunkt ExtractTree des DependeciesControllers ist es möglich, diesen Abhängig\-keitsbaums des Projektes zu erhalten. Weiterführend ist über die ExtractAndAnalyzeTree-Route des selbigen Controllers die Analyse der Pakete und Rückgabe in einem um die Angabe der Betroffenheit erweiterten Baum möglich. \textcolor{red}{Bild einfügen???} \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ @@ -68,7 +68,7 @@ \subsection{Validierung V1} \label{sec:Vali1} Sowohl die \ac{API} mit ASP.NET, die Containerisierung mit Docker, als auch die Datenbank mit LiteDB sind mit etablierten Technologien umgesetzt worden. \end{description} - \noindent Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage mit über 2,5 Sekunden pro Paket als unbefriedigend eingestuft werden muss. \textcolor{yellow}{QUELLE} + \noindent Zusammenfassend kann festgehalten werden, dass die gesamte Anwendung zu jenem Zeitpunkt einsatzfähig war, jedoch die Laufzeiten mit Wartezeiten einer Analyseabfrage Sekundenbereich pro Paket als unbefriedigend eingestuft werden muss. Siehe dazu \ref{nf:one}. Somit erfolgte die in Abschnitt \ref{sec:ExperimenteDB} \nameref{sec:ExperimenteDB} besprochene Neubetrachtung des Datenbankbereiches der Architektur. % Validierung V1, sind die Ausgaben den Vorgaben entsprechend (funktional) diff --git a/documentation/latex/8_summary/summary.tex b/documentation/latex/8_summary/summary.tex index 85c7f35..7e6506a 100644 --- a/documentation/latex/8_summary/summary.tex +++ b/documentation/latex/8_summary/summary.tex @@ -2,14 +2,14 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} Die in der \nameref{subsec:Motivation} aufgelisteten Forschungsfragen können wie folgt nach Bearbeitung des Auftrages beantwortet werden: \begin{description} \item[\ref{q:one}]\hfill \\ - Um die Pakete zu untersuchen ist es notwendig, die CVE-Daten in eine interne Datenbank umzuwandeln, da das Suchen auf den Rohdaten -- den CVE-\ac{JSON}-Dateien -- zu zeitaufwendig ist. + Um die Pakete zu untersuchen ist es notwendig, die \ac{CVE}-Daten in eine interne Datenbank umzuwandeln, da das Suchen auf den Rohdaten -- den \ac{CVE}-\ac{JSON}-Dateien -- zu zeitaufwendig ist. Dazu wurde schlussendlich eine MySQL-Datenbank ausgewählt, die dank der Indizierung einer Spalte die gewünschten Leistungsmerkmale aufweist. \item[\ref{q:two}]\hfill \\ - In der umgesetzten Version ist es dank der nativen Unterstützung von npm gelungen, die Abhängigkeiten der Pakte als json zu extrahieren und dann intern so weiterzuverarbeiten, dass eine logische Repräsentation erfolgen kann. + In der umgesetzten Version ist es dank der nativen Unterstützung von npm gelungen, die Abhängigkeiten der Pakte als \ac{JSON} zu extrahieren und dann intern so weiterzuverarbeiten, dass eine logische Repräsentation erfolgen kann. \item[\ref{q:three}]\hfill \\ Die Lösung dieser Frage geschah über die einheitliche Verwendung von \ac{JSON} respektive \ac{JSON-LD} bei der Rückgabe des Webservices. \item[\ref{q:four}]\hfill \\ - Da die Aufgabe darin bestand, Github-Repositories zu analysieren, konnte in den Docker-Container der API git mitinstalliert werden, wodurch ein voller Zugriff der API auf den Funktionsumfang von git besteht. + Da die Aufgabe darin bestand, Github-Repositories zu analysieren, konnte in den Docker-Container der \ac{API} git mitinstalliert werden, wodurch ein voller Zugriff der \ac{API} auf den Funktionsumfang von git besteht. Durch diesen erlangte die \ac{API} die Möglichkeit Repositories zu clonen und anschließend intern weiterzuverarbeiten, was den Funktionsumfang der selbst-implementierten Methoden aus den Punkten $I$ bis $III$ der Forschungsfragen bereits entsprang. \item[\ref{q:five}]\hfill \\ Die Frage nach der Laufzeitverbesserung stellte sich nach der Umsetzung der V1 (näheres in \ref{sec:Implementation1}), da dort die Wartezeiten für die Abfrage von Paketen den zeitlichen Rahmen übertraf. @@ -21,5 +21,6 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} Dies wurde erfolgreich umgesetzt. \\ Die möglichen Erweiterungen -- besprochen in der \ref{sec:Diskussion} \nameref{sec:Diskussion} -- sind aufbauend und benötigen keine konkreten Änderungen in dem Grundgerüst, welches mit dem vorliegendem Projekt erreicht wurde. - \\ - Der zu dem Zeitpunkt der Abgabe aktuelle commit im Github-Repository wie folgt getagt: \textcolor{red}{TAG} + \\ \\ + Der zu dem Zeitpunkt der Abgabe aktuelle commit im Github-Repository wie folgt getagt: \\ + \href{https://github.com/WSE-research/AmIVulnerable/releases/tag/v2.0}{github.com/WSE-research/AmIVulnerable/releases/tag/v2.0} diff --git a/documentation/latex/Appendix/packageMean.tex b/documentation/latex/Appendix/packageMean.tex index 59b7e2e..6f67a1a 100644 --- a/documentation/latex/Appendix/packageMean.tex +++ b/documentation/latex/Appendix/packageMean.tex @@ -1,5 +1,5 @@ \section{Packet-Anzahldurchschnitt der 10 beliebtesten JavaScript-Github-Repositories} \label{sec:PackageMeanPopGitJsRepos} - \begin{figure}[h] + \begin{figure}[H] \centering \includegraphics[width=0.85\textwidth]{Appendix/gitmost_wanted_2024-04-29 181855.png} \caption{Quellen: \cite{link:GitPopJsRepoMostWanted}} diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index ab7aaf8..5f470d0 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -20,8 +20,8 @@ \refsection{0} \datalist[entry]{none/global//global/global} \entry{link:MitreCve}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{CVE} \field{urlday}{1} @@ -119,10 +119,259 @@ \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ \endverb \endentry - \entry{link:MySqlIndex}{online}{} + \entry{link:JSON}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{JSON} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20240503003039/https://www.json.org/json-en.html + \endverb + \verb{url} + \verb http://web.archive.org/web/20240503003039/https://www.json.org/json-en.html + \endverb + \endentry + \entry{link:JSON-LD}{online}{} \field{sortinit}{2} \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} + \field{title}{JSON-LD} + \field{urlday}{27} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20240427135957/https://json-ld.org/ + \endverb + \verb{url} + \verb http://web.archive.org/web/20240427135957/https://json-ld.org/ + \endverb + \endentry + \entry{link:NISTAPI}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{NIST-API's} + \field{urlday}{28} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities + \endverb + \verb{url} + \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities + \endverb + \endentry + \entry{link:DependaBot}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{Git Dependa Bot} + \field{urlday}{2} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide + \endverb + \verb{url} + \verb http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide + \endverb + \endentry + \entry{link:SYNK}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{SYNK} + \field{urlday}{22} + \field{urlmonth}{9} + \field{urlyear}{2023} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started + \endverb + \verb{url} + \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started + \endverb + \endentry + \entry{link:OWASPDependencyCheck}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{OWAST Dependency Check} + \field{urlday}{23} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ + \endverb + \verb{url} + \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ + \endverb + \endentry + \entry{article:wang2024reposvul}{article}{} + \name{author}{6}{}{% + {{hash=1bbdfe1ba462d08472b1fb725422d240}{% + family={Wang}, + familyi={W\bibinitperiod}, + given={Xinchen}, + giveni={X\bibinitperiod}}}% + {{hash=8db94be5ebf919974925124f1ed63e2c}{% + family={Hu}, + familyi={H\bibinitperiod}, + given={Ruida}, + giveni={R\bibinitperiod}}}% + {{hash=4eab333ecac39ccc4074abec0c9f919b}{% + family={Gao}, + familyi={G\bibinitperiod}, + given={Cuiyun}, + giveni={C\bibinitperiod}}}% + {{hash=df94f8769c02669d2191cabefaaf2f2c}{% + family={Wen}, + familyi={W\bibinitperiod}, + given={Xin-Cheng}, + giveni={X\bibinithyphendelim C\bibinitperiod}}}% + {{hash=8a75c8a407bc3965c01424ef4d1d0994}{% + family={Chen}, + familyi={C\bibinitperiod}, + given={Yujia}, + giveni={Y\bibinitperiod}}}% + {{hash=61c51cf743fc21d5e6d2958db72d21ef}{% + family={Liao}, + familyi={L\bibinitperiod}, + given={Qing}, + giveni={Q\bibinitperiod}}}% + } + \strng{namehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} + \strng{fullhash}{ec454725ffe828ba6d4868a2429ff3b0} + \strng{bibnamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} + \strng{authorbibnamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} + \strng{authornamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} + \strng{authorfullhash}{ec454725ffe828ba6d4868a2429ff3b0} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labelnamesource}{author} + \field{labeltitlesource}{title} + \field{eprintclass}{cs.CR} + \field{eprinttype}{arXiv} + \field{title}{ReposVul: A Repository-Level High-Quality Vulnerability Dataset} + \field{year}{2024} + \verb{doi} + \verb 10.48550/arXiv.2401.13169 + \endverb + \verb{eprint} + \verb 2401.13169 + \endverb + \endentry + \entry{article:Liu2022DemystifyingTV}{article}{} + \name{author}{6}{}{% + {{hash=30b278deffb74289c6aea3469e1ac95e}{% + family={Liu}, + familyi={L\bibinitperiod}, + given={Chengwei}, + giveni={C\bibinitperiod}}}% + {{hash=e7c4223b9b52448dd934b9b3780637d5}{% + family={Chen}, + familyi={C\bibinitperiod}, + given={Sen}, + giveni={S\bibinitperiod}}}% + {{hash=afba4b968abc753bd3fd42d497922684}{% + family={Fan}, + familyi={F\bibinitperiod}, + given={Lingling}, + giveni={L\bibinitperiod}}}% + {{hash=149fbc847381b1670fea5db2bc1ac470}{% + family={Chen}, + familyi={C\bibinitperiod}, + given={Bihuan}, + giveni={B\bibinitperiod}}}% + {{hash=621013bf54d3546375ad71f17f020b5b}{% + family={Liu}, + familyi={L\bibinitperiod}, + given={Yang}, + giveni={Y\bibinitperiod}}}% + {{hash=f62bda44bcb17e2fe2bc0ab2560e37a4}{% + family={Peng}, + familyi={P\bibinitperiod}, + given={Xin}, + giveni={X\bibinitperiod}}}% + } + \strng{namehash}{d9270b82de967a61a5c4a663b5d82ce2} + \strng{fullhash}{77e9bd89eb30eaa070813bcc4154a831} + \strng{bibnamehash}{d9270b82de967a61a5c4a663b5d82ce2} + \strng{authorbibnamehash}{d9270b82de967a61a5c4a663b5d82ce2} + \strng{authornamehash}{d9270b82de967a61a5c4a663b5d82ce2} + \strng{authorfullhash}{77e9bd89eb30eaa070813bcc4154a831} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labelnamesource}{author} + \field{labeltitlesource}{title} + \field{journaltitle}{2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)} + \field{title}{Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem} + \field{year}{2022} + \field{pages}{672\bibrangedash 684} + \range{pages}{13} + \verb{urlraw} + \verb https://api.semanticscholar.org/CorpusID:245853604 + \endverb + \verb{url} + \verb https://api.semanticscholar.org/CorpusID:245853604 + \endverb + \endentry + \entry{article:OnTheEffect10123571}{article}{} + \name{author}{3}{}{% + {{hash=fb80f3530d5850fe7b9b7587f4388403}{% + family={Mir}, + familyi={M\bibinitperiod}, + given={Amir\bibnamedelima M.}, + giveni={A\bibinitperiod\bibinitdelim M\bibinitperiod}}}% + {{hash=93406606476904c7b35328ac18479e24}{% + family={Keshani}, + familyi={K\bibinitperiod}, + given={Mehdi}, + giveni={M\bibinitperiod}}}% + {{hash=dcfc2de769b78ca2db66ceb37b51dd39}{% + family={Proksch}, + familyi={P\bibinitperiod}, + given={Sebastian}, + giveni={S\bibinitperiod}}}% + } + \strng{namehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{fullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{bibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labelnamesource}{author} + \field{labeltitlesource}{title} + \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} + \field{title}{On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem} + \field{year}{2023} + \field{pages}{201\bibrangedash 211} + \range{pages}{11} + \verb{doi} + \verb 10.1109/SANER56733.2023.00028 + \endverb + \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} + \endentry + \entry{link:MySqlIndex}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} \field{title}{10.3.1 How MySQL Uses Indexes} \field{urlday}{30} \field{urlmonth}{1} @@ -136,8 +385,8 @@ \endverb \endentry \entry{link:ApiResponseTime}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{What’s the difference between API Latency and API Response Time?} \field{urlday}{18} @@ -152,8 +401,8 @@ \endverb \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{Github explore} \verb{urlraw} @@ -165,8 +414,8 @@ \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoReact}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{react} \verb{urlraw} @@ -178,8 +427,8 @@ \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{Leaflet} \verb{urlraw} @@ -191,8 +440,8 @@ \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{bootstrap} \verb{urlraw} @@ -204,8 +453,8 @@ \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoExpress}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{express} \verb{urlraw} @@ -217,8 +466,8 @@ \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoSwiper}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{swiper} \verb{urlraw} @@ -230,8 +479,8 @@ \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPlotly}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{plotly} \verb{urlraw} @@ -243,8 +492,8 @@ \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoNode}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{node} \verb{urlraw} @@ -256,8 +505,8 @@ \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAos}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{aos} \verb{urlraw} @@ -269,8 +518,8 @@ \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPm2}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{pm2} \verb{urlraw} @@ -282,8 +531,8 @@ \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAxios}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{axios} \verb{urlraw} diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 66438dc..230efeb 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -143,6 +143,7 @@ \printcontents[Messungen]{}{2}{} % \printcontents[⟨name⟩]{⟨prefix⟩}{⟨start-level⟩}[⟨toc-depth⟩]{⟨toc-code⟩} \input{Appendix/litedbInsert.tex} \input{Appendix/jsonSearch.tex} + \newpage \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} From f5532d3f66b492d03aca25dea665aab8726bb2b3 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Fri, 3 May 2024 20:36:17 +0200 Subject: [PATCH 53/60] some little corrections --- documentation/latex/1_abstract/abstract.tex | 2 +- documentation/latex/2_motivation/motivation.tex | 1 - documentation/latex/4_other_work/on_t_eff.tex | 8 ++++---- documentation/latex/4_other_work/other_work.tex | 2 +- documentation/latex/4_other_work/repos_vul.tex | 2 +- documentation/latex/5_concept/architecture_2.tex | 2 +- documentation/latex/5_concept/concept.tex | 1 - documentation/latex/5_concept/results.tex | 2 +- documentation/latex/6_implementation/pipe_exp.tex | 8 ++++---- 9 files changed, 13 insertions(+), 15 deletions(-) diff --git a/documentation/latex/1_abstract/abstract.tex b/documentation/latex/1_abstract/abstract.tex index 57faf38..ba6b8e8 100644 --- a/documentation/latex/1_abstract/abstract.tex +++ b/documentation/latex/1_abstract/abstract.tex @@ -6,4 +6,4 @@ \section*{Abstract} \label{sec:abstract} \\ Diese Arbeit stellt die Entwicklung einer \ac{API} vor, die es ermöglicht transitive Vererbungen von Abhängigkeiten darzustellen. Laufzeitmessungen und Vergleiche durch diese mit anderen Tools zeigen die Effizienz und Wirksamkeit der entwickelten Lösung. - Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. \ No newline at end of file + Ziel einer solchen Lösung ist es, das Verständnis und Management von Abhängigkeiten in der Softwareentwicklung zu verbessern, was letztendlich zu einer verbesserten Sicherheit und Effizienz von Softwarelösungen führen soll. diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index 4d3e502..54b4e50 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -24,4 +24,3 @@ \section{Motivation} \label{subsec:Motivation} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. Dieses Werkzeug hilft also bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. - \ No newline at end of file diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index cc28716..0515ce8 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -1,15 +1,15 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label{sec:Transitivity} \begin{description} \item[Adressierte Punkte]\hfill \\ - Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\cite{article:OnTheEffect10123571} von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von 3 Millionen Maven-Paketen analysiert. + Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\cite{article:OnTheEffect10123571} von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von $3$ Millionen Maven-Paketen analysiert. Dabei wurde vor allem ein Augenmerk auf Granularität sowie Transitivität der Schwachstellen gelegt. Es wurde betrachtet, in wie fern sich Sicherheitslücken von direkten zu transitiven Abhängigkeiten propagieren. \item[Duchgeführte Maßnahmen]\hfill \\ Aus den Daten einer Umfangreichen Analyse von Maven-Projekten auf Sicherheitslücken, direkte sowie auch transitive, wurden diese durch einen Wissensgraphen dargestellt. - Gesamt beinhaltet die Studie 1.300 Sicherheitsberichte, welche für die Identifizierung von Schwachstellen genutzt wurden. + Gesamt beinhaltet die Studie $1.300$ Sicherheitsberichte, welche für die Identifizierung von Schwachstellen genutzt wurden. \item[Ergebnisse]\hfill \\ - Es wurde aufgezeigt, dass unter Betrachtung aller transitiven Abhängigkeiten etwa 31 \% der Projekte Schwachstellen beinhalten. - Die Granularitätsanalyse jedoch ergab, dass nur 1,2 \% der schwachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängig\-keiten erreichen. + Es wurde aufgezeigt, dass unter Betrachtung aller transitiven Abhängigkeiten etwa $31$ \% der Projekte Schwachstellen beinhalten. + Die Granularitätsanalyse jedoch ergab, dass nur $1,2$ \% der schwachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängig\-keiten erreichen. Es wird hier vorgeschlagen durch die niedrige Anzahl an wirklich erreichbaren Schwachstellen, die Betrachtungstiefe von transitiven Abhängigkeiten in Schachstellenanalysen der Laufzeit und Ressourcen zu gute kommend zu begrenzen. \item[Unterschiede]\hfill \\ In dieser Arbeit wird nicht direkt ein Tool bereitgestellt, mit welchem eine Schwachstellenanalyse durchgeführt werden kann. diff --git a/documentation/latex/4_other_work/other_work.tex b/documentation/latex/4_other_work/other_work.tex index 9087505..ab89682 100644 --- a/documentation/latex/4_other_work/other_work.tex +++ b/documentation/latex/4_other_work/other_work.tex @@ -14,4 +14,4 @@ \section{Andere Arbeiten} \label{sec:Andere} \input{4_other_work/on_t_eff.tex} \input{4_other_work/demyst.tex} Zusammenfassend ist zu sehen, dass in den erwähnten Arbeiten kein Service vorhanden ist, welcher unabhängig von Programmiersprache ein Paket, mehrere Pakete sowie ganze Repositories auf Sicherheitslücken mittels \ac{CVE}-Daten untersucht wobei Abhängigkeitsbäume bei der Repository-Analyse hineinbezogen werden und diese Daten dann als weiterverwendbare Daten zum Beispiel als \ac{JSON-LD} durch einen \ac{API}-Endpunkt bereitgestellt sind. - Dieser Service soll selbst nicht abhängig von einen zu analysierenden Repository sein, sondern eigens verschiedene Repositories durch Angabe dieser analysieren. \ No newline at end of file + Dieser Service soll selbst nicht abhängig von einen zu analysierenden Repository sein, sondern eigens verschiedene Repositories durch Angabe dieser analysieren. diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index 70a6590..f820b6d 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -12,7 +12,7 @@ \subsubsection{ReposVul} \label{sec:ReposVul} Unter Verwendung von Large Language Models sowie statischen Codeanalysetools wurde zwischen Code-Änderungen und verworrenen Patches unterschieden. Veraltete Patches werden hier letztendlich durch ein implementiertes tracebasiertes Filtermodul erkannt. Weiterhin wurden interprozeduale Aufrufbeziehungen von Schwachstellen erfasst und extrahiert. - Die resultierende Datensammlung enthält 6.134 CVE-Einträge mit 236 CWE-Typen, die die Programmiersprachen c++, C, Java sowie Python in 1.491 Projekten darstellen. + Die resultierende Datensammlung enthält $6.134$ CVE-Einträge mit $236$ CWE-Typen, die die Programmiersprachen c++, C, Java sowie Python in 1.491 Projekten darstellen. \item[Ergebnisse]\hfill \\ Es wurde ein hochwertiger Schwachstellendatensatz auf Repository-Level erstellt. Dieser verringert die Probleme, welche durch verworrene oder veraltete Patches in anderen Datensätzen entstehen. diff --git a/documentation/latex/5_concept/architecture_2.tex b/documentation/latex/5_concept/architecture_2.tex index f8063c6..cb1d0bb 100644 --- a/documentation/latex/5_concept/architecture_2.tex +++ b/documentation/latex/5_concept/architecture_2.tex @@ -16,4 +16,4 @@ \subsubsection{Architektur V2} \label{sec:ArchitekturV2} \item Containerisierung von nicht nur der \ac{API} sondern auch der MySQL-Datenbank \item Herstellung einer Verbindung über das interne Docker-Netzwerk \end{itemize} - \end{enumerate} \ No newline at end of file + \end{enumerate} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index a2dfe2f..719ae87 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -10,4 +10,3 @@ \section{Konzept} \label{sec:Konzept} \input{5_concept/special_attr.tex} \input{5_concept/results.tex} \input{5_concept/architecture.tex} - \ No newline at end of file diff --git a/documentation/latex/5_concept/results.tex b/documentation/latex/5_concept/results.tex index e63afa7..42b4af0 100644 --- a/documentation/latex/5_concept/results.tex +++ b/documentation/latex/5_concept/results.tex @@ -2,7 +2,7 @@ \subsection{Zielsetzung} \label{sec:Zielsetzung} Folgende Ergebnisse sind im Rahmen dieser Arbeit zu erreichen: \begin{enumerate} \item \textbf{Entwicklung einer funktionsfähigen \ac{API}} \\ - Diese soll performant und möglichst schmal in einem Containercontext nutzbar sein und alle -- von den Features -- notwenigen Endpunkte beinhalten. + Diese soll performant und möglichst schmal in einem Containerkontext nutzbar sein und alle -- von den Features -- notwendigen Endpunkte beinhalten. \item \textbf{Analyse auf Sicherheitslücken} \\ Die entstehende \ac{API} soll Sicherheitslücken in Abhängigkeiten ausfindig machen und diese in einem weiterverwendbaren Format zurückliefern. \item \textbf{Darstellung der detektierten Schwachstellenpakete inklusive Abhängigkeiten als Baum} \\ diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex index c45f56b..fc741c9 100644 --- a/documentation/latex/6_implementation/pipe_exp.tex +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -58,8 +58,8 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline Such-Typ & Zeit & Faktor \\ \hline - Mono-Suche & 262676.7ms & 1 \\ - Pipeline & 96868.4ms & 2.7213448 \\ + Mono-Suche & $262676,7$ ms & $1$ \\ + Pipeline & $96868,4$ ms & $2,7213448$ \\ \hline \caption{Laufzeiten Durchschnitt 10 Messungen -- Weniger Pakete als Datenbankdateien \textsuperscript{siehe Appendix \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken}}} \label{tabularx:LessPackagesThenDbFiles} @@ -69,8 +69,8 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline Such-Typ & Zeit & Faktor \\ \hline - Mono-Suche & 95011.24ms & 1 \\ - Pipeline & 22111.5ms & 4.296846569 \\ + Mono-Suche & $95011,24$ ms & $1$ \\ + Pipeline & $22111,5$ ms & $4,296846569$ \\ \hline \caption{Laufzeiten Durchschnitt 10 Messungen -- Weniger Pakete als Datenbankdateien \textsuperscript{siehe Appendix \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken}}} \label{tabularx:MorePackagesThenDbFiles} From 47e6694d0e06d227ee2a3da66f5829f73a788c7b Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sat, 4 May 2024 15:00:19 +0200 Subject: [PATCH 54/60] both comments 3 --- .../latex/2_motivation/motivation.tex | 30 ++++++- .../latex/3_definitions/definitions.tex | 12 +-- documentation/latex/4_other_work/demyst.tex | 2 +- documentation/latex/4_other_work/dependa.tex | 4 +- documentation/latex/4_other_work/nist.tex | 4 +- documentation/latex/4_other_work/on_t_eff.tex | 2 +- documentation/latex/4_other_work/owasp.tex | 2 +- .../latex/4_other_work/repos_vul.tex | 2 +- documentation/latex/4_other_work/snyk.tex | 10 +-- .../latex/5_concept/architecture.png | Bin 0 -> 14908 bytes .../latex/5_concept/architecture.puml | 42 ++++++++++ .../latex/5_concept/architecture_1.tex | 24 ++++-- documentation/latex/5_concept/concept.tex | 2 +- documentation/latex/5_concept/func.tex | 2 +- documentation/latex/5_concept/non_func.tex | 6 +- documentation/latex/5_concept/questions.tex | 7 +- documentation/latex/5_concept/results.tex | 2 +- .../6_implementation/implementation_1.tex | 4 +- .../6_implementation/implementation_2.tex | 7 +- .../latex/6_implementation/validation_1.tex | 37 +++++++-- .../latex/7_discussion/discussion.tex | 10 +-- .../latex/Appendix/dockerCompose.tex | 37 +++++++++ documentation/latex/lib/bib.bib | 75 ++++++++++++++++++ documentation/latex/main.tex | 47 +++++++++++ 24 files changed, 316 insertions(+), 54 deletions(-) create mode 100644 documentation/latex/5_concept/architecture.png create mode 100644 documentation/latex/5_concept/architecture.puml create mode 100644 documentation/latex/Appendix/dockerCompose.tex diff --git a/documentation/latex/2_motivation/motivation.tex b/documentation/latex/2_motivation/motivation.tex index 54b4e50..06f3b8f 100644 --- a/documentation/latex/2_motivation/motivation.tex +++ b/documentation/latex/2_motivation/motivation.tex @@ -6,14 +6,15 @@ \section{Motivation} \label{subsec:Motivation} Dank der Konkurrenz freier Pakete, zum Beispiel anhand ihrer Nutzungszahl, gestaltet sich dort ein Wettbewerb, der Pakete (a) an Bedeutung verlieren lässt bzw. (b) soweit verbessert, dass ihre Funktionen und Benutzbarkeit anschließend überzeugen konnten. Neben der Funktionalität besteht ein anderer essentieller Aspekt in der Sicherheit. - Eben jene muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. + Eben jener muss sich bei jedem Paket separat und gekapselt gesehen auf einem solchem Niveau befinden, dass ihre Verwendung keine fahrlässig Gefahr darstellt. Dies beginnt bei zu kurzen Schlüssellängen und endet bei komplexen Programmen mit verschiedenen Angriffsschwachstellen. Aber die Aufgabe, für jedes verwendete Paket einzeln die Sicherheitslücken nachzulesen oder für eine Paketsammlung nachzuvollziehen, ist selbst mit dem vorhandenen Angeboten zeitaufwendig und ressourcenintensiv -- schließlich werden so personelle Kräfte und Rechenkapazitäten gebunden. Daher besteht ein dringender Bedarf an einem Werkzeug, dass Entwicklern und Managern eine transparente und umfassende Analyse der Abhängigkeiten auf Sicherheitslücken ganzer Projekte bietet. Ein solches Automatisierungswerkzeug für die Analyse von Paketen trägt somit einer frühzeitigen Erkennung von Sicherheitslücken und -risiken bei und reduziert Zeitaufwand den der Nutzer. Damit kann die Softwarequalität verbessert werden, indem erkannt werden kann, ob eine genutzte Softwarekomponente aktualisiert oder ausgetauscht werden muss. - Hieraus ergeben sich folgende Forschungsfragen (FF): + + Aus den aufgeführten Punkten ergeben sich folgende mögliche Forschungsfragen (FF): \begin{enumerate}[label=\textbf{FF-\Roman*}, leftmargin=1.75cm] \item \textbf{Welche Funktionen sind notwendig um ein Paket auf Sicherheitslücken zu untersuchen?}\label{q:one} \item \textbf{Welche Funktionen sind notwendig um ein Repository auf Sicherheitslücken durch Abhängigkeiten zu untersuchen?}\label{q:two} @@ -24,3 +25,28 @@ \section{Motivation} \label{subsec:Motivation} Insgesamt bringt solch ein Werkzeug Unternehmen verschiedene Vorteile, wie in der Softwareentwicklung, darunter Transparenz, Qualität sowie Sicherheit. Die Gesamtsicherheit von Applikationen sowie auch Unternehmen kann durch nun sichtbare Schwachstellen in tiefen Ebenen der Softwareabhängigkeit verbessert werden. Dieses Werkzeug hilft also bei der Entscheidungsfindung über externe Softwarekomponenten sowie bei der Aufdeckung von Sicherheitsrisiken. + + \subsection*{Vorgehensweise} \label{subsec:Vorgehensweise} + Um eine geeignete Umsetzung zu entwickeln, muss zunächst eine Recherche ähnlicher Ansätze erfolgen. + Aus diesen kann dann extrahiert werden + \begin{itemize} + \item ob es bereits Umsetzungen gibt, + \item welche Bereiche besonders zu beachten sind, + \item welche Aspekte noch nirgends abgedeckt werden. + \end{itemize} + Da aufbauend auf der Recherche noch keine Grundlage vorhanden ist, muss davor noch eine Behandlung der zugrundeliegenden Begriffe geschehen. + Partiell aufgelistet wären dies exemplarisch \ac{CVE}, \ac{JSON-LD} oder transitive Abhängigkeiten. + + Durch das erlangte Wissen soll eine erste Implementierung auf den parallel dazu erstellten Anforderungen geschehen, damit diese Anforderungen unmittelbar als realistisch erkannt werden können. + + Eine Auseinandersetzung mit den Technologien für die Umsetzung erzeugt anschließend eine Beurteilung, ob die nicht-funktionalen Anforderungen -- die auf Basis der funktionalen Anforderungen aufgestellt wurden -- vollständig erfüllt sind. + Je nach Ergebnis jener Beurteilung soll dann eine Umsetzung mit anderen Technologien erfolgen, um beispielsweise die gewünschten Leistungsmerkmale zu erfüllen. + + Mittels einer geeigneten Analyse von Demodaten und der Auswertung sind die aufgestellten funktionalen und nicht-funktionalen Anforderungen final zu bewerten. + Eine Validierung der zu diesem Zeitpunkt aktuellen Umsetzung ist damit gemeint. + + Während die Ergebnisse ausgewertet werden und als Entscheidungsunterstützung dienen sollen, wird die eigentliche Analyse der Pakete auf Schwachstellen nicht näher behandelt. + Auch eine Bewertung der Resultate der Schwachstellenanalyse ist nicht Bestandteil der Arbeit. + Es erfolgt eine reine Ausgabe \ac{CVE}-bezogener Merkmale. + + Die abschließende Diskussion -- in welcher der finale Stand bewertet, die zukünftigen Perspektiven beleuchtet und ein Ausblick auf mögliche Erweiterungen zu geben sind -- wird stellt vor der Zusammenfassung der Ergebnisse eine kritische Auseinandersetzung mit der eigenen Leistung dar. diff --git a/documentation/latex/3_definitions/definitions.tex b/documentation/latex/3_definitions/definitions.tex index 376120b..d6253f3 100644 --- a/documentation/latex/3_definitions/definitions.tex +++ b/documentation/latex/3_definitions/definitions.tex @@ -1,13 +1,13 @@ \section{Definitionen} \label{sec:Definitionen} \begin{itemize} - \item \textbf{\ac{CVE}:} \\ - Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation\textsuperscript{\cite{link:MitreCve}} gestellt; eine us-amerikanische Forschungsabteilung der \glqq National Cybersecurity FFRDC\grqq, die staatliche Finanzierung genießt. + \item \textbf{\acf{CVE}:} \\ + Der Aufgabe Einschätzung der Sicherheit und Einhaltung von Standards hat sich die Mitre Corporation\textsuperscript{\cite{link:MitreCve}} gestellt; eine US-amerikanische Forschungsabteilung der \glqq National Cybersecurity FFRDC\grqq, die staatliche Finanzierung genießt. \acs{CVE} nennt sich ihr Referenziersystem und stellt dabei die englische Abkürzung \glqq Common Vulnerabilities and Exposures\grqq$~$dar. \\ \glqq Common Vulnerabilities and Exposures\grqq$~$bzw. häufige Schwachstellen und Risiken sind als Liste öffentlich verfügbar. In dieser Liste werden nur die Schwachstellen betrachtet, die durch eine der 364 \glqq \ac{CVE} Numbering Authority's\grqq (\acs{CNA}'s) eine \ac{CVE}-Nummer zugewiesen bekommen haben.\cite{link:CveOrgCnaS} Eine \ac{CVE}-Nummer beinhaltet wiederum keine technischen Informationen zu Betroffenen Software- oder Hardwarekomponente sondern Produktname, Version, eine Beschreibung der Schwachstelle und gegebenenfalls werden Hinweise zur Behebung vermerkt. - Diese Informationen müssen über andere Services oder Datenbanken, wie zum Beispiel in der \glqq U.S. National Vulnerability Database\grqq$~$oder der \glqq CERT/CC Vulnerability Notes Database\grqq$~$beschafft. + Diese Informationen müssen über andere Services oder Datenbanken, wie zum Beispiel in der \glqq U.S. National Vulnerability Database\grqq\textsuperscript{\cite{link:nvdNist}}$~$oder der \glqq CERT/CC Vulnerability Notes Database\grqq\textsuperscript{\cite{link:VNBcert}}$~$beschafft werden. \item \textbf{Direkte Abhängigkeiten:} \\ In der Softwareentwicklung ist eine Abhängigkeit ein Softwarepaket, welches von der Anwendung selbst benötigt wird, um korrekt zu funktionieren. @@ -27,14 +27,14 @@ \section{Definitionen} \label{sec:Definitionen} Um eine \ac{API} zu nutzen müssen diese Festlegungen eingehalten werden. - \item \textbf{\ac{JSON}:} \\ + \item \textbf{\acf{JSON}}\textsuperscript{\cite{link:JSON}}\textbf{:} \\ \ac{JSON} ist ein in der Webentwicklung verbreitetes Datenformat. Genutzt wird dieses um strukturierte Daten zu speichern und auszutauschen. Basierend auf einer einfachen Syntax, die auf Schlüssel-Wert-Paaren und verschachtelten Datenstrukturen basiert, ermöglicht dieses Format für Mensch sowie Maschine eine gute Les- und Parsbarkeit. \ac{JSON} wird häufig für die Übertragung von Daten zwischen Client und Server. Dabei ist es programmiersprachenunabhängig verwendet allerdings Konventionen ähnlich der von C, C++ oder C\#. - \item \textbf{\ac{JSON-LD}:} \\ + \item \textbf{\acf{JSON-LD}}\textsuperscript{\cite{link:JSON-LD}}\textbf{:} \\ \ac{JSON-LD} ist ein Linked-Data-Format, welches auf dem \ac{JSON}-Format basiert. - Dieses Linked-Data-Format ermöglicht es ein standardisiertes, maschinenlesbares Datennetzwerk über Websites hinweg zu schaffen. + Dieses Linked-Data-Format\textsuperscript{\cite{link:LinkedData}} ermöglicht es ein standardisiertes, maschinenlesbares Datennetzwerk über Websites hinweg zu schaffen. \end{itemize} \ No newline at end of file diff --git a/documentation/latex/4_other_work/demyst.tex b/documentation/latex/4_other_work/demyst.tex index 10378c8..c4f7487 100644 --- a/documentation/latex/4_other_work/demyst.tex +++ b/documentation/latex/4_other_work/demyst.tex @@ -1,7 +1,7 @@ \subsubsection{Demystifying Vulnerability Propagation} \label{sec:DVP} \begin{description} \item[Adressierte Punkte]\hfill \\ - Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq\cite{article:Liu2022DemystifyingTV} von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. + Im Paper \glqq Demystifying the Vulnerability Propagation and Its Evolution via Dependency Trees in the NPM Ecosystem\grqq\textsuperscript{\cite{article:Liu2022DemystifyingTV}} von Chengwei Liu et al. wurde eine ausführliche Studie zum NPM-Ökosystem durchgeführt. In dieser Studie wurde die Schwachstellenausbreitung und -entwicklung betrachtet. Diese Schwachstellen wurden in Abhängigkeitsbäumen Identifiziert. Aus diesen Daten wurden Lösungen zur Schwachstellenbehebung entwickelt. diff --git a/documentation/latex/4_other_work/dependa.tex b/documentation/latex/4_other_work/dependa.tex index 8a3930b..144445b 100644 --- a/documentation/latex/4_other_work/dependa.tex +++ b/documentation/latex/4_other_work/dependa.tex @@ -1,5 +1,5 @@ -\subsubsection{Github - Dependa Bot} \label{sec:Dependa} - Das Dependa-Bot Tool, welches von Github bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. +\subsubsection{GitHub - Dependa Bot} \label{sec:Dependa} + Das \textit{Dependa-Bot Tool}\textsuperscript{\cite{link:DependaBot}}, welches von GitHub\textsuperscript{\cite{link:GitHub}} bereitgestellt wird, hilft beim Verwalten von Abhängig\-keiten. Dazu muss es zu einem Github-Repository hinzugefügt werden, in welchem es im Menü Sicherheit aufgelistet wird. %TODO:QUELLE Durch den Dependa-Bot werden Warnungen bezüglich Schwachstellen von genutzten Abhängigkeiten generiert und automatisch Pull-Requests für Aktualisierungen von Abhängigkeiten erstellt. diff --git a/documentation/latex/4_other_work/nist.tex b/documentation/latex/4_other_work/nist.tex index baeded9..5ea61f1 100644 --- a/documentation/latex/4_other_work/nist.tex +++ b/documentation/latex/4_other_work/nist.tex @@ -1,6 +1,6 @@ \subsubsection{NIST-API} \label{sec:NIST-API} - Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an. %TODO:Quelle - Diese sind die \ac{CVE}-\ac{API} und die \ac{CVE}-Change-History-\ac{API}. + Das \glqq \ac{NIST}\grqq~bietet zwei \ac{CVE}-\ac{API}'s an.\textsuperscript{\cite{link:NISTAPI}} + Diese sind die \ac{CVE}-\ac{API}\textsuperscript{\cite{link:NISTAPI}} und die \ac{CVE}-Change-History-\ac{API}\textsuperscript{\cite{link:NISTAPI}}. Die \textbf{\ac{CVE}-\ac{API}} nimmt Anfragen zu einer oder mehreren \ac{CVE}-Einträgen entgegen und gibt diese einschließlich Details zu bekannten Sicherheitsanfälligkeiten wie Beschreibungen, betroffenen Softwareprodukten und Schweregraden zurück. Um nun aktuelle \ac{CVE}-Daten abzurufen und zu Nutzen muss lediglich diese \ac{API} in eigene Anwendungen oder Tools zu integriert werden. diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index 0515ce8..ccafa8f 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -1,7 +1,7 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label{sec:Transitivity} \begin{description} \item[Adressierte Punkte]\hfill \\ - Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\cite{article:OnTheEffect10123571} von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem durch eine Analyse von $3$ Millionen Maven-Paketen analysiert. + Im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\textsuperscript{\cite{article:OnTheEffect10123571}} von Amir M. Mir et al. wurden Schwachstellen im Maven-Ökosystem\textsuperscript{\cite{link:Maven}} durch eine Analyse von $3$ Millionen Maven-Paketen analysiert. Dabei wurde vor allem ein Augenmerk auf Granularität sowie Transitivität der Schwachstellen gelegt. Es wurde betrachtet, in wie fern sich Sicherheitslücken von direkten zu transitiven Abhängigkeiten propagieren. \item[Duchgeführte Maßnahmen]\hfill \\ diff --git a/documentation/latex/4_other_work/owasp.tex b/documentation/latex/4_other_work/owasp.tex index e9ebba4..149653c 100644 --- a/documentation/latex/4_other_work/owasp.tex +++ b/documentation/latex/4_other_work/owasp.tex @@ -1,5 +1,5 @@ \subsubsection{OWASP Dependency-Check} \label{sec:OWASP-Dependency-Check} - Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen. %TODO:Quelle + Das Software-Composition-Analysis-Tool Dependency Check von der OWASP Foundation analysiert die Codebasis auf bekannte Schwachstellen.\textsuperscript{\cite{link:OWASPDependencyCheck}} Dabei werden auf Common-Platform-Enumeration-Kennungen (CPE) für die genutzten Abhängigkeiten geprüft und falls vorhanden ein Bericht mit zugehöriger \ac{CVE}-Nummer erstellt. Die durch die automatischen Analysen erstellten Berichte enthalten nicht nur die jeweiligen Schwachstelle selbst, sondern auch Maßnahmen zum Schließen jener. \ No newline at end of file diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index f820b6d..5957b19 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -1,7 +1,7 @@ \subsubsection{ReposVul} \label{sec:ReposVul} \begin{description} \item[Adressierte Punkte]\hfill \\ - Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq\cite{article:wang2024reposvul} von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches Schwachstellendatensätze konstruiert. + Im Paper \glqq ReposVul: A Repository-Level High-Quality Vulnerability Dataset\grqq\textsuperscript{\cite{article:wang2024reposvul}} von Xinchen Wang et al. wird ein Datenbeschaffungs-Framework vorgestellt, welches Schwachstellendatensätze konstruiert. Notwendig ist diese Arbeit durch die immer weiter steigende Anzahl an Open-Source-Software sowie deren Sicherheitsauswirkungen. In dieser Arbeit wird sich verworrenen und veralteten Patches in bestehenden Schwachstellendatensätzen gewidmet. Ziel ist es, einen hochwertigen Schwachstellendatensatz herzustellen. diff --git a/documentation/latex/4_other_work/snyk.tex b/documentation/latex/4_other_work/snyk.tex index b689032..62c6a7d 100644 --- a/documentation/latex/4_other_work/snyk.tex +++ b/documentation/latex/4_other_work/snyk.tex @@ -1,11 +1,11 @@ \subsubsection{Snyk} \label{sec:Snyk} - Die Synk Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. %TODO:Quelle - Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen. + Die Synk-Plattform ist ein weiteres Tool, mit welchem Sicherheitsschwachstellen in Applikationen gemanagt werden können. + Es werden betroffene Abhängigkeiten identifiziert und Lösungen angeboten diese Schwachstellen zu schließen.\textsuperscript{\cite{link:SYNK}} Es werden verschiedene Teile der Softwareentwicklung von Synk betrachtet darunter der Code selbst, Container und die Infrastruktur. \glqq Synk Open Source\grqq~erkennt Schwachstellen in \glqq Open Source\grqq-Abhängigkeiten und \glqq Synk Code\grqq~erkennt diese im Code selbst. - \glqq Synk Container\grqq~erkennt Schwachstellen in Docker-Images sowie Kubernetes-Anwendungen. - \glqq Synk Infrastructure as Code (IaC)\grqq~erkennt Fehlkonfigurationen in Terraform, CloudFormation, Kubernetes und Azure-Formlagen. + \glqq Synk Container\grqq~erkennt Schwachstellen in Docker-Images sowie Kubernetes\textsuperscript{\cite{link:Kubernetes}}-Anwendungen. + \glqq Synk Infrastructure as Code (IaC)\grqq\textsuperscript{\cite{link:SynkIaC}} erkennt Fehlkonfigurationen in Terraform\textsuperscript{\cite{link:Terraform}}, CloudFormation\textsuperscript{\cite{link:CloudFormation}}, Kubernetes\textsuperscript{\cite{link:Kubernetes}} und Azure-Formlagen\textsuperscript{\cite{link:Azure}}. Durch Synk werden nicht nur Meldungen generiert, welche Abhängigkeiten Schwachstellen aufweisen sondern in der gesamten Deployment-Kette auf Schwachstellen geachtet. - Lösungen bzw. Alternativen werden angeboten und zusätzlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. \ No newline at end of file + Lösungen bzw. Alternativen werden angeboten und zusätzlich kann dieses Tool auch in die CI/CD eingebunden werden um einen sicherheitskritischen Bau der Applikation zu verhindern. diff --git a/documentation/latex/5_concept/architecture.png b/documentation/latex/5_concept/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..a49f952eb5d46cde59e83eb761ccba6c717277f5 GIT binary patch literal 14908 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 eH-ElPcW~BYXlAr#QQ#r=G9f`Rf%HeeJO3Zr0la CloneRepo hinzugefügt - \item PullCveAndConvert (die aus dem ersten Controller sind jetzt hier) hinzugefügt + \item Clone zu CloneRepo umbenannt + \item PullCveAndConvert (Endpunkte des ersten Controllers sind nun hier) hinzugefügt \end{itemize} \item MySqlConnectionController \label{api_controller_2:five} \begin{itemize} diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index f9c6a77..876b613 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -12,8 +12,6 @@ \subsection{Validierung V1} \label{sec:Vali1} Wurde erfolgreich umgesetzt. \\ Unter dem Abschnitt \ref{sec:ExperimentePIPE} \nameref{sec:ExperimentePIPE} kann man die dazu erfolgten Messungen einsehen. - \\ - \textcolor{red}{Messungen NIST -- Argumentation \glqq spam\grqq für Abwahl dieser Lösung} \item[(3) Clonen eines Repositories von Github] siehe \hyperref[f:three]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ @@ -29,7 +27,6 @@ \subsection{Validierung V1} \label{sec:Vali1} \\ Über den Endpunkt ExtractTree des DependeciesControllers ist es möglich, diesen Abhängig\-keitsbaums des Projektes zu erhalten. Weiterführend ist über die ExtractAndAnalyzeTree-Route des selbigen Controllers die Analyse der Pakete und Rückgabe in einem um die Angabe der Betroffenheit erweiterten Baum möglich. - \textcolor{red}{Bild einfügen???} \item[(6) Aktualisierung der Datenbank] siehe \hyperref[f:six]{\underline{hier}} \hfill \\ Nicht erfolgreich umgesetzt. \\ @@ -48,9 +45,25 @@ \subsection{Validierung V1} \label{sec:Vali1} \item[(1) Dauer der Paketsuche (einzelne Abfrage) unter 5ms] siehe \hyperref[nf:one]{\underline{hier}} \hfill \\ Nicht erreicht. \\ - Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} einsehbar, beträgt die Dauer einer einzelnen Paketabfrage nicht unter 2 Sekunden. - Somit ist dieses Ziel um mind. Größenordnung 40 verfehlt und muss in der V2 besonderes Augenmerk genießen. - \item[(2) Skalierbarkeit der Anwendung] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ + Wie im Appendix unter \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} \& \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken} einsehbar, können folgende Werte für die Paketsuche ermittelt werden: + \begin{tabularx}{0.8\textwidth}{|c|c|c|} + \hline + Weniger Pakete als DBs & Minimum & $2689,8$ ms \\ + & Maximum & $4750,3$ ms \\ + & Durchschnitt & $2918,63$ ms \\ + & Median & $2740,45$ ms \\ + & Standardabweichung & $485,59$ ms \\ \hline + Mehr Pakete als DBs & Minimum & $2594,6$ ms \\ + & Maximum & $7208,94$ ms \\ + & Durchschnitt & $2714,60$ ms \\ + & Median & $2667,3$ ms \\ + & Standardabweichung & $315,7627$ ms \\ \hline + \caption{Resultate aus den Rohdaten des Appendix \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallWenigerPaketeAlsDatenbanken} \& \ref{subsec:ZeitunterschiedAbfrageAufDenDatenbankenMonoPipeFallMehrPaketeAlsDatenbanken}} + \label{tabularx:ResultatDatenDatenbankPaketsuchenAppendix} + \end{tabularx} + Die Dauer einer einzelnen Paketabfrage beträgt also nicht unter $2,5$ Sekunden. + Somit ist dieses Ziel um mindestens Größenordnung $40$ verfehlt und muss in der V2 besonderes Augenmerk genießen. + \item[(2) Skalierbarkeit der Anwendung herstellen] siehe \hyperref[nf:two]{\underline{hier}} \hfill \\ Nicht erreicht. \\ Aufgrund der Dateibasierten Datenbank LiteDb ist ein multipler Zugriff auf eine einzelne Datenbankdatei nicht möglich. Es ist also eine rein sequenzielle Abarbeitung der gestellten Anfragen möglich. @@ -62,6 +75,16 @@ \subsection{Validierung V1} \label{sec:Vali1} Mittels der vom ASP.NET in der Projektkonfiguration mitgelieferten automatischen Erstellung einer OpenAPI-Unterstützung, wird eine Swagger-Dokumentation beim \textit{build} erstellt und kann unter dem Routen-Suffix \textit{[...]/swagger/index.html} eingesehen werden. \item[(4) Rückgabe im \acs{JSON-LD}-Format] siehe \hyperref[nf:four]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. + \\ + Folgende Struktur ist bei der Rückgabe zu erwarten: + \begin{lstlisting}[language=json,firstnumber=1] +{ + "@context": {url} + "data": [ + data + ] +} + \end{lstlisting} \item[(5) Nutzung etablierter Technologien] siehe \hyperref[nf:five]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ @@ -77,4 +100,4 @@ \subsection{Validierung V1} \label{sec:Vali1} % \item api/Db/checkPackageList % \item api/Dependecies/ExtractTree % \item api/Dependecies/ExtractAndAnalyzeTree - % \end{itemize} \ No newline at end of file + % \end{itemize} diff --git a/documentation/latex/7_discussion/discussion.tex b/documentation/latex/7_discussion/discussion.tex index 7570df6..c05bcbf 100644 --- a/documentation/latex/7_discussion/discussion.tex +++ b/documentation/latex/7_discussion/discussion.tex @@ -1,7 +1,7 @@ \section{Diskussion} \label{sec:Diskussion} Aus der vorangegangenen Betrachtung geht hervor, dass alle Forschungsfragen erfolgreich abschließbar waren. - Aus Forschungsfrage \ref{q:one} ist durch die Konzeption \ref{!!!!!} klargeworden, dass für eine Sicherheitslückenanalyse von Paketen mehrere Funktionalitäten notwendig sind. + Aus Forschungsfrage \ref{q:one} ist durch die Architektur \ref{sec:ArchitekturV1} klargeworden, dass für eine Sicherheitslückenanalyse von Paketen mehrere Funktionalitäten notwendig sind. Diese sind in den funktionalen Anforderungen \ref{f:one} und \ref{f:two} aufgefasst. Es handelt sich um das Einladen einer Schwachstellendatenbasis, für welche die \ac{CVE}-Daten gewählt wurden, sowie die Über\-prüfung eines Paketes mittels Abgleich dessen Bezeichnung und dieser Schwachstellendatenbasis auf Über\-ein\-stimmungen. @@ -13,7 +13,7 @@ \section{Diskussion} \label{sec:Diskussion} Für eine Analyse eines ganzen Repositories muss nach Clonen und Extraktion des Abhängigkeitsbaums des Repositories für seine Abhängigkeiten auf einer Schwachstellendatenbank der Abhängigkeitsbaum mit Schwachstellendaten angereichert werden. Forschungsfrage \ref{q:three} handelt vom Rückgabedatentyp und der weiteren Nutzbarkeit von Resultatdaten. - Hier wurde durch die Lösung der nicht-funktionalen Anforderung \ref{nf:four} die Rückgabe im JSON-LD-Format genutzt. + Hier wurde durch die Lösung der nichtfunktionalen Anforderung \ref{nf:four} die Rückgabe im JSON-LD-Format genutzt. Forschungsfrage \ref{q:four} ist durch die Konzeption und Implementierung des Projektes beantwortet worden. Hier ist die funktionale Anforderung \ref{f:seven} und die nichtfuntkionale Anforderung \ref{nf:five} zugehörig. @@ -45,12 +45,12 @@ \section{Diskussion} \label{sec:Diskussion} Fortführend von dieser Arbeit können nun verschiedene weitere Betrachtungen vorgenommen werden. Darunter die Verteilung von Schwachstellen auf Versions- oder Commit-Basis oder der zeitliche Verlauf von Schwachstellendaten in Repositories. Weiterhin können Unterschiede zwischen Projekttypen, Frameworks oder Programmiersprachen bei Abhängigkeiten betrachtet werden. - Zusätzlich ist es möglich, Dopplungen von Abhängigkeiten gleicher und verschiedener Versionen in einem einzelnen Projekt zu untersuchen. + Zusätzlich ist es möglich, mehrfaches Vorkommen von Abhängigkeiten gleicher und verschiedener Versionen in einem einzelnen Projekt zu untersuchen. In dieser Arbeit wurden auch verschiedene Themen nicht adressiert, welche durchaus einen Schwerpunkt in der Schwachstellenanalyse von Repositories bilden. Darunter auch welche Sicherheitslücken wirklich letztendlich ausgenutzt werden können, also welcher Sicherheitskritischer Code wirklich ausgeführt wird. - Das wurde zum Beispiel von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq$~$für das Maven-Ökosystem betrachtet. - Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur $1\%$ aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. + Das wurde zum Beispiel von Amir M. Mir et al im Paper \glqq On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem\grqq\textsuperscript{\cite{article:OnTheEffect10123571}} für das Maven-Ökosystem betrachtet. + Hier wurde herausgefunden, dass zwar ein Drittel der Pakete bei Betrachtung aller Abhängigkeiten Schwachstellen aufweisen, allerdings nur $1$ \% aller Pakete tatsächlich erreichbaren schwachstellenbehafteten Code enthalten. Daraus resultierend wurde vorgeschlagen nur eine bestimmte Tiefe des Abhängigkeitsbaumes zu analysieren, um Rechenzeiten zu verringern. \\ In der Arbeit selbst wurde außerdem kein Abhängigkeitsbaum selbst aufgestellt, welcher die Vorgabe von Abhängigkeitsbäumen durch das genutzte Framework notwendig macht. diff --git a/documentation/latex/Appendix/dockerCompose.tex b/documentation/latex/Appendix/dockerCompose.tex new file mode 100644 index 0000000..3f481f2 --- /dev/null +++ b/documentation/latex/Appendix/dockerCompose.tex @@ -0,0 +1,37 @@ +\section{docker-compose.yml} \label{sec:dockerComposeYml} + \begin{lstlisting}[style=yaml] +version: '3.4' + +services: +amivulnerable_db: + container_name: MySqlDbAmIVulnerable + image: mysql:8.0.2 + environment: + - MYSQL_ROOT_PASSWORD=cvecve + - MYSQL_DATABASE=cve + - MYSQL_USER=u + - MYSQL_PASSWORD=p + - MYSQL_ALLOW_EMPTY_PASSWORD=1 + volumes: + - db_volume:/var/lib/mysql + - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + restart: on-failure + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] + timeout: 20s + retries: 10 + ports: + - 3306:3306 + command: --default-authentication-plugin=mysql_native_password + +amivulnerable: + container_name: ApiAmIVulnerable + build: + context: . + dockerfile: AmIVulnerable/Dockerfile + depends_on: + - amivulnerable_db + +volumes: +db_volume: + \end{lstlisting} \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index e08ddc9..a27a2e5 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -50,6 +50,11 @@ @online{link:JSON-LD urldate = "2024-04-27", url = "http://web.archive.org/web/20240427135957/https://json-ld.org/", } +@online{link:LinkedData, + title = "Linked Data", + urldate = "2024-04-04", + url = "https://web.archive.org/web/20240404135428/https://www.oclc.org/research/areas/data-science/linkeddata/linked-data-overview.html", +} % NIST % https://nvd.nist.gov/developers/vulnerabilities @@ -58,6 +63,24 @@ @online{link:NISTAPI urldate = "2024-04-28", url = "http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities", } +@online{link:NISTAPI, + title = "Vulnerability APIs", + urldate = "2024-04-28", + url = "https://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities", +} + +% NVD +@online{link:nvdNist, + title = "NATIONAL VULNERABILITY DATABASE", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503164752/https://nvd.nist.gov/", +} +% Vulnerability Notes Database +@online{link:VNBcert, + title = "Vulnerability Notes Database", + urldate = "2024-02-29", + url = "https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/", +} % Dependa-Bot % https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide @@ -66,6 +89,11 @@ @online{link:DependaBot urldate = "2024-05-02", url = "http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide", } +@online{link:GitHub, + title = "GitHub", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503170946/https://github.com/", +} % Synk @online{link:SYNK, @@ -74,6 +102,41 @@ @online{link:SYNK url = "http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started", } +% Synk IaC +@online{link:SynkIaC, + title = "Synk IaC", + urldate = "2024-05-01", + url = "https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/", +} + +% Terraform +@online{link:Terraform, + title = "Terraform", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503022331/https://www.terraform.io/", +} + +% Azure +@online{link:Azure, + title = "Microsoft Azure", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/", +} + +% Kubernetes +@online{link:Kubernetes, + title = "Production-Grade Container Orchestration", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503033605/https://kubernetes.io/", +} + +% Cloud Formation +@online{link:CloudFormation, + title = "AWS CloudFormation", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/", +} + % OWASP Dependency-Check @online{link:OWASPDependencyCheck, title = "OWAST Dependency Check", @@ -81,6 +144,18 @@ @online{link:OWASPDependencyCheck url = "http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/", } +@online{link:Maven, + title = "Maven", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503085423/https://maven.apache.org/", +} + +@online{link:ASPNET, + title = "ASP.NET Core", + urldate = "2024-05-03", + url = "https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet", +} + @article{article:wang2024reposvul, title = {ReposVul: A Repository-Level High-Quality Vulnerability Dataset}, author = {Xinchen Wang and Ruida Hu and Cuiyun Gao and Xin-Cheng Wen and Yujia Chen and Qing Liao}, diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 230efeb..50ddba2 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -19,6 +19,7 @@ \usepackage[ngerman]{babel} \usepackage{wrapfig} \usepackage{pgfplots} +\usepackage{listings} % Biblatex \usepackage{csquotes} @@ -107,6 +108,50 @@ \usepackage{tabularx} \usepackage{ltablex} +% lstlisting +\colorlet{punct}{red!60!black} +\definecolor{background}{HTML}{EEEEEE} +\definecolor{delim}{RGB}{20,105,176} +\colorlet{numb}{magenta!60!black} +\lstdefinelanguage{json}{ + basicstyle=\normalfont\ttfamily, + numbers=left, + numberstyle=\scriptsize, + stepnumber=1, + numbersep=8pt, + showstringspaces=false, + breaklines=true, + frame=lines, + backgroundcolor=\color{background}, + literate= + *{0}{{{\color{numb}0}}}{1} + {1}{{{\color{numb}1}}}{1} + {2}{{{\color{numb}2}}}{1} + {3}{{{\color{numb}3}}}{1} + {4}{{{\color{numb}4}}}{1} + {5}{{{\color{numb}5}}}{1} + {6}{{{\color{numb}6}}}{1} + {7}{{{\color{numb}7}}}{1} + {8}{{{\color{numb}8}}}{1} + {9}{{{\color{numb}9}}}{1} + {:}{{{\color{punct}{:}}}}{1} + {,}{{{\color{punct}{,}}}}{1} + {\{}{{{\color{delim}{\{}}}}{1} + {\}}{{{\color{delim}{\}}}}}{1} + {[}{{{\color{delim}{[}}}}{1} + {]}{{{\color{delim}{]}}}}{1}, +} +\lstdefinestyle{yaml}{ + basicstyle=\color{blue}\footnotesize, + rulecolor=\color{black}, + string=[s]{'}{'}, + stringstyle=\color{blue}, + comment=[l]{:}, + commentstyle=\color{black}, + morecomment=[l]{-} +} + + \begin{document} \nocite{*} @@ -148,6 +193,8 @@ \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} \input{Appendix/packageMean.tex} + \newpage + \input{Appendix/dockerCompose.tex} \stopcontents[Messungen] \end{appendices} From 4ba2bd8bdf4ccd6a54e9b8441d9c23df1e1579d7 Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 5 May 2024 12:24:23 +0200 Subject: [PATCH 55/60] little improved dockerCompose.tex --- .../latex/Appendix/dockerCompose.tex | 26 +- documentation/latex/main.bbl | 294 ++++++++++++++---- documentation/latex/main.tex | 3 + 3 files changed, 248 insertions(+), 75 deletions(-) diff --git a/documentation/latex/Appendix/dockerCompose.tex b/documentation/latex/Appendix/dockerCompose.tex index 3f481f2..8233e34 100644 --- a/documentation/latex/Appendix/dockerCompose.tex +++ b/documentation/latex/Appendix/dockerCompose.tex @@ -3,35 +3,35 @@ \section{docker-compose.yml} \label{sec:dockerComposeYml} version: '3.4' services: -amivulnerable_db: + amivulnerable_db: container_name: MySqlDbAmIVulnerable image: mysql:8.0.2 environment: - - MYSQL_ROOT_PASSWORD=cvecve - - MYSQL_DATABASE=cve - - MYSQL_USER=u - - MYSQL_PASSWORD=p - - MYSQL_ALLOW_EMPTY_PASSWORD=1 + - MYSQL_ROOT_PASSWORD=cvecve + - MYSQL_DATABASE=cve + - MYSQL_USER=u + - MYSQL_PASSWORD=p + - MYSQL_ALLOW_EMPTY_PASSWORD=1 volumes: - - db_volume:/var/lib/mysql - - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + - db_volume:/var/lib/mysql + - ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro restart: on-failure healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10 ports: - - 3306:3306 + - 3306:3306 command: --default-authentication-plugin=mysql_native_password -amivulnerable: + amivulnerable: container_name: ApiAmIVulnerable build: context: . dockerfile: AmIVulnerable/Dockerfile depends_on: - - amivulnerable_db + - amivulnerable_db volumes: -db_volume: - \end{lstlisting} \ No newline at end of file + db_volume: + \end{lstlisting} diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index 5f470d0..a530a4b 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -20,8 +20,8 @@ \refsection{0} \datalist[entry]{none/global//global/global} \entry{link:MitreCve}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{CVE} \field{urlday}{1} @@ -36,8 +36,8 @@ \endverb \endentry \entry{link:RedHatCveDef}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{Was bedeutet CVE?} \field{urlday}{19} @@ -53,8 +53,8 @@ \endverb \endentry \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{CVE Numbering Authorities (CNAs)} \field{urlday}{2} @@ -69,8 +69,8 @@ \endverb \endentry \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{Abhängigkeitsverwaltung} \field{urlday}{14} @@ -86,8 +86,8 @@ \endverb \endentry \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{Was ist eine Dependency} \field{urlday}{3} @@ -103,8 +103,8 @@ \endverb \endentry \entry{link:ApiDef}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{What is an API (Application Programming Interface)?} \field{urlday}{9} @@ -120,15 +120,14 @@ \endverb \endentry \entry{link:JSON}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{JSON} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20240503003039/https://www.json.org/json-en.html \endverb @@ -137,15 +136,14 @@ \endverb \endentry \entry{link:JSON-LD}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{JSON-LD} \field{urlday}{27} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20240427135957/https://json-ld.org/ \endverb @@ -153,16 +151,31 @@ \verb http://web.archive.org/web/20240427135957/https://json-ld.org/ \endverb \endentry + \entry{link:LinkedData}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Linked Data} + \field{urlday}{4} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240404135428/https://www.oclc.org/research/areas/data-science/linkeddata/linked-data-overview.html + \endverb + \verb{url} + \verb https://web.archive.org/web/20240404135428/https://www.oclc.org/research/areas/data-science/linkeddata/linked-data-overview.html + \endverb + \endentry \entry{link:NISTAPI}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{NIST-API's} \field{urlday}{28} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities \endverb @@ -170,16 +183,47 @@ \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities \endverb \endentry + \entry{link:nvdNist}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{NATIONAL VULNERABILITY DATABASE} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \endverb + \endentry + \entry{link:VNBcert}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Vulnerability Notes Database} + \field{urlday}{29} + \field{urlmonth}{2} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \endverb + \endentry \entry{link:DependaBot}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{Git Dependa Bot} \field{urlday}{2} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide \endverb @@ -187,16 +231,31 @@ \verb http://web.archive.org/web/20240502031236/https://docs.github.com/en/code-security/getting-started/dependabot-quickstart-guide \endverb \endentry + \entry{link:GitHub}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{GitHub} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503170946/https://github.com/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503170946/https://github.com/ + \endverb + \endentry \entry{link:SYNK}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{SYNK} \field{urlday}{22} \field{urlmonth}{9} \field{urlyear}{2023} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started \endverb @@ -204,16 +263,95 @@ \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started \endverb \endentry + \entry{link:SynkIaC}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Synk IaC} + \field{urlday}{1} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ + \endverb + \endentry + \entry{link:Terraform}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Terraform} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ + \endverb + \endentry + \entry{link:Azure}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{Microsoft Azure} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \endverb + \endentry + \entry{link:Kubernetes}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{Production-Grade Container Orchestration} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ + \endverb + \endentry + \entry{link:CloudFormation}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{AWS CloudFormation} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \endverb + \endentry \entry{link:OWASPDependencyCheck}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{OWAST Dependency Check} \field{urlday}{23} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ \endverb @@ -221,6 +359,38 @@ \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ \endverb \endentry + \entry{link:Maven}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{Maven} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \endentry + \entry{link:ASPNET}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{ASP.NET Core} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet + \endverb + \endentry \entry{article:wang2024reposvul}{article}{} \name{author}{6}{}{% {{hash=1bbdfe1ba462d08472b1fb725422d240}{% @@ -260,8 +430,8 @@ \strng{authorbibnamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authornamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authorfullhash}{ec454725ffe828ba6d4868a2429ff3b0} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{eprintclass}{cs.CR} @@ -314,8 +484,8 @@ \strng{authorbibnamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authornamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authorfullhash}{77e9bd89eb30eaa070813bcc4154a831} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)} @@ -354,8 +524,8 @@ \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} @@ -369,8 +539,8 @@ \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} \endentry \entry{link:MySqlIndex}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{10.3.1 How MySQL Uses Indexes} \field{urlday}{30} @@ -385,8 +555,8 @@ \endverb \endentry \entry{link:ApiResponseTime}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{What’s the difference between API Latency and API Response Time?} \field{urlday}{18} @@ -401,8 +571,8 @@ \endverb \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Github explore} \verb{urlraw} @@ -414,8 +584,8 @@ \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoReact}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{react} \verb{urlraw} @@ -427,8 +597,8 @@ \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Leaflet} \verb{urlraw} @@ -440,8 +610,8 @@ \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{bootstrap} \verb{urlraw} @@ -453,8 +623,8 @@ \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoExpress}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{express} \verb{urlraw} @@ -466,8 +636,8 @@ \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoSwiper}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{swiper} \verb{urlraw} @@ -479,8 +649,8 @@ \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPlotly}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{plotly} \verb{urlraw} @@ -492,8 +662,8 @@ \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoNode}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{node} \verb{urlraw} @@ -505,8 +675,8 @@ \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAos}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{aos} \verb{urlraw} @@ -518,8 +688,8 @@ \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPm2}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{pm2} \verb{urlraw} @@ -531,8 +701,8 @@ \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAxios}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{axios} \verb{urlraw} diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 50ddba2..4e4535f 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -141,7 +141,10 @@ {[}{{{\color{delim}{[}}}}{1} {]}{{{\color{delim}{]}}}}{1}, } + +\definecolor{backcolour}{rgb}{0.95,0.95,0.92} \lstdefinestyle{yaml}{ + backgroundcolor=\color{backcolour}, basicstyle=\color{blue}\footnotesize, rulecolor=\color{black}, string=[s]{'}{'}, From cf87285780bb89fc5e9d7a6b0a7bbd7c04f6adf4 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 5 May 2024 14:55:18 +0200 Subject: [PATCH 56/60] changes 4 both --- .../latex/6_implementation/validation_1.tex | 9 ++++- documentation/latex/8_summary/summary.tex | 15 ++++++-- .../latex/Appendix/checkedPackagesNist.tex | 13 +++++++ documentation/latex/lib/bib.bib | 35 +++++++++++++------ documentation/latex/main.tex | 3 +- 5 files changed, 59 insertions(+), 16 deletions(-) create mode 100644 documentation/latex/Appendix/checkedPackagesNist.tex diff --git a/documentation/latex/6_implementation/validation_1.tex b/documentation/latex/6_implementation/validation_1.tex index 876b613..c25ef87 100644 --- a/documentation/latex/6_implementation/validation_1.tex +++ b/documentation/latex/6_implementation/validation_1.tex @@ -11,7 +11,14 @@ \subsection{Validierung V1} \label{sec:Vali1} \item[(2) Abgleich von Paketen] siehe \hyperref[f:two]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ - Unter dem Abschnitt \ref{sec:ExperimentePIPE} \nameref{sec:ExperimentePIPE} kann man die dazu erfolgten Messungen einsehen. + Als Kontrolle auf Korrektheit der Daten wurde das Ergebnis -- die Response der \acs{API} -- mit der Roh-Daten \ac{JSON} aus dem GitHub-Repository der Mitre\textsuperscript{\cite{link:CveRepo}} verglichen und kein Datenverlust festgestellt. + \\ + Ein Vergleich mit der \textit{NIST-API}\textsuperscript{\cite{link:NISTAPI}} bewies die Korrektheit der Daten, die ebenfalls vom \acs{NIST} übermittelt werden. + Da deren Ergebnis -- siehe exemplarisch \cite{link:NISTapiAbfrageLiteDb} -- jedoch anders aufgebaut ist, konnten dabei nur die identischen Bereiche wie die \texttt{descriptions}, \texttt{cvssMetricV31}, oder \texttt{references} einem Abgleich unterzogen werden. + Dabei fiel bei der Untersuchung von 10 zufällig gewählten Demonstrationspaketen auf, dass die \acs{NIST} ihre Daten weiter aufbereitet mit zusätzlichen Informationen, wie der Quelle (\glqq source\grqq) im \texttt{references} Teil. + Es fehlten jedoch keine Informationen und es finden reine Ergänzungen durch die US-amerikanische Behörde statt. \textsuperscript{siehe Appendix\ref{sec:ListOfCheckedPackages}} + \\ + Unter dem Abschnitt \ref{sec:ExperimentePIPE} \nameref{sec:ExperimentePIPE} kann man die erfolgten Zeit-Messungen einer Abfrage auf den entwickelten Webservice einsehen. \item[(3) Clonen eines Repositories von Github] siehe \hyperref[f:three]{\underline{hier}} \hfill \\ Wurde erfolgreich umgesetzt. \\ diff --git a/documentation/latex/8_summary/summary.tex b/documentation/latex/8_summary/summary.tex index 7e6506a..dd5ce1e 100644 --- a/documentation/latex/8_summary/summary.tex +++ b/documentation/latex/8_summary/summary.tex @@ -17,10 +17,19 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} \\ Die Überwindung der Zeitmauer gelang dann durch die in der V2 (\ref{sec:Implementation2}) verwendeten anderen Datenbank -- dann MySQL. \end{description} - Der hauptsächliche Auftrag des Projektes bestand in der paraphrasierten Frage, wie transitive Schwachstellen ermittelt und ausgegeben werden können. - Dies wurde erfolgreich umgesetzt. + Erstmals war es gelungen einen Webservice zu implementieren, welcher ein Repository auf Schwachstellen untersucht, anstatt nur einzelne Pakete auf Treffer in Schwachstellendatenbanken zu überprüfen. + Unsere Arbeit konnte nachweisen, dass eine solche Implementierung nach genannter Architektur -- \ref{sec:ArchitekturV1} -- möglich und die Hauptfunktion einer Rückgabe eines Abhängigkeitsbaumes, angereichert mit Schwachstellendaten, erfüllt ist. + \\ \\ + Basierend auf dieser Arbeit sehen wir die Forschungsfragen + \begin{itemize} + \item \glqq \textit{Wie sind Schwachstellen auf Versions- und Commitbasis verteilt}\grqq, + \item \glqq \textit{Wie gestaltet sich die Schwachstellenverteilung in verschiedenen Projekttypen, Frameworks oder Sprachen}\grqq$~$und + \item \glqq \textit{Untersuchung von mehrfach vorkommenden Schwachstellen durch gleiche Abhängigkeiten beziehungsweise verschiedene Versionen dieser}\grqq + \end{itemize} + als besonders wichtig an. + Da jene maßgeblich als Grundlage die Ergebnisse dieser Arbeit darstellen, um dem Endbenutzer eine einerseits fundierte und andererseits messbare Entscheidungsunterstützung im Verlauf eines Projektes beziehungsweise bei einem Refactoring zu bieten. \\ - Die möglichen Erweiterungen -- besprochen in der \ref{sec:Diskussion} \nameref{sec:Diskussion} -- sind aufbauend und benötigen keine konkreten Änderungen in dem Grundgerüst, welches mit dem vorliegendem Projekt erreicht wurde. + Weitere mögliche Erweiterungen -- besprochen im Abschnitt \ref{sec:Diskussion} \nameref{sec:Diskussion} -- sind aufbauend und benötigen keine konkreten Änderungen in dem Grundgerüst, welches mit dem vorliegendem Projekt erreicht wurde. \\ \\ Der zu dem Zeitpunkt der Abgabe aktuelle commit im Github-Repository wie folgt getagt: \\ \href{https://github.com/WSE-research/AmIVulnerable/releases/tag/v2.0}{github.com/WSE-research/AmIVulnerable/releases/tag/v2.0} diff --git a/documentation/latex/Appendix/checkedPackagesNist.tex b/documentation/latex/Appendix/checkedPackagesNist.tex new file mode 100644 index 0000000..0dbc1b8 --- /dev/null +++ b/documentation/latex/Appendix/checkedPackagesNist.tex @@ -0,0 +1,13 @@ +\section{Liste an überprüften Paketen mit der NIST-API} \label{sec:ListOfCheckedPackages} + \begin{itemize} + \item LiteDB + \item MongoDB + \item l + \item l + \item l + \item l + \item l + \item l + \item l + \item l + \end{itemize} \ No newline at end of file diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index a27a2e5..eaf61ec 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -204,56 +204,69 @@ @online{link:ApiResponseTime % Beliebteste Github JS Reps'security @online{link:GitPopJsRepoMostWanted, title = "Github explore", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://gitmostwanted.com/?term=&lang=JavaScript", } @online{link:GitPopJsRepoReact, title = "react", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/facebook/react/network/dependencies", } @online{link:GitPopJsRepoLeaflet, title = "Leaflet", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/Leaflet/Leaflet/network/dependencies", } @online{link:GitPopJsRepoBootstrap, title = "bootstrap", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/twbs/bootstrap/network/dependencies", } @online{link:GitPopJsRepoExpress, title = "express", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/expressjs/express/network/dependencies", } @online{link:GitPopJsRepoSwiper, title = "swiper", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/nolimits4web/swiper/network/dependencies", } @online{link:GitPopJsRepoPlotly, title = "plotly", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/plotly/plotly.js/network/dependencies", } @online{link:GitPopJsRepoNode, title = "node", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/nodejs/node/network/dependencies", } @online{link:GitPopJsRepoAos, title = "aos", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/michalsnik/aos/network/dependencies", } @online{link:GitPopJsRepoPm2, title = "pm2", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/Unitech/pm2/network/dependencies", } @online{link:GitPopJsRepoAxios, title = "axios", - urldate = "2022-xx-xx", + urldate = "2024-04-29", url = "https://github.com/axios/axios/network/dependencies", +} + +% CVE-Repo +@online{link:CveRepo, + title = "CVEProject/cvelistV5", + urldate = "2024-04-29", + url = "https://github.com/CVEProject/cvelistV5", +} + +@online{link:NISTapiAbfrageLiteDb, + title = "services.nvd.nist.gov", + urldate = "2022-xx-xx", + url = "https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb", } \ No newline at end of file diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 4e4535f..1ec2115 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -154,7 +154,6 @@ morecomment=[l]{-} } - \begin{document} \nocite{*} @@ -197,6 +196,8 @@ \input{Appendix/mySqlWithoutIndex.tex} \input{Appendix/packageMean.tex} \newpage + \input{Appendix/checkedPackagesNist.tex} + \newpage \input{Appendix/dockerCompose.tex} \stopcontents[Messungen] \end{appendices} From eeb0c74c78f6b9981abd8c59821887c9227001e8 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 5 May 2024 15:29:36 +0200 Subject: [PATCH 57/60] both 5 --- documentation/latex/4_other_work/on_t_eff.tex | 2 +- .../latex/4_other_work/repos_vul.tex | 2 +- .../latex/5_concept/architecture_1.tex | 4 +- documentation/latex/5_concept/concept.tex | 1 + documentation/latex/5_concept/func.tex | 2 +- documentation/latex/5_concept/questions.tex | 2 +- .../latex/6_implementation/implementation.tex | 1 + .../6_implementation/implementation_1.tex | 6 +- .../6_implementation/implementation_2.tex | 2 +- .../latex/6_implementation/mysql_index.tex | 2 +- .../latex/6_implementation/pipe_exp.tex | 12 +- documentation/latex/8_summary/summary.tex | 6 +- documentation/latex/Appendix/packageMean.tex | 2 +- documentation/latex/main.bbl | 572 ++++++++++-------- 14 files changed, 339 insertions(+), 277 deletions(-) diff --git a/documentation/latex/4_other_work/on_t_eff.tex b/documentation/latex/4_other_work/on_t_eff.tex index ccafa8f..b44470b 100644 --- a/documentation/latex/4_other_work/on_t_eff.tex +++ b/documentation/latex/4_other_work/on_t_eff.tex @@ -9,7 +9,7 @@ \subsubsection{Transitivity and Granularity on Vulnerability Propagation} \label Gesamt beinhaltet die Studie $1.300$ Sicherheitsberichte, welche für die Identifizierung von Schwachstellen genutzt wurden. \item[Ergebnisse]\hfill \\ Es wurde aufgezeigt, dass unter Betrachtung aller transitiven Abhängigkeiten etwa $31$ \% der Projekte Schwachstellen beinhalten. - Die Granularitätsanalyse jedoch ergab, dass nur $1,2$ \% der schwachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängig\-keiten erreichen. + Die Granularitätsanalyse jedoch ergab, dass nur\linebreak[4]$1,2$ \% der schwachstellenbetroffenen Projekte auch wirklich schwachstellenbehafteten Code aus Abhängig\-keiten erreichen. Es wird hier vorgeschlagen durch die niedrige Anzahl an wirklich erreichbaren Schwachstellen, die Betrachtungstiefe von transitiven Abhängigkeiten in Schachstellenanalysen der Laufzeit und Ressourcen zu gute kommend zu begrenzen. \item[Unterschiede]\hfill \\ In dieser Arbeit wird nicht direkt ein Tool bereitgestellt, mit welchem eine Schwachstellenanalyse durchgeführt werden kann. diff --git a/documentation/latex/4_other_work/repos_vul.tex b/documentation/latex/4_other_work/repos_vul.tex index 5957b19..c4491eb 100644 --- a/documentation/latex/4_other_work/repos_vul.tex +++ b/documentation/latex/4_other_work/repos_vul.tex @@ -12,7 +12,7 @@ \subsubsection{ReposVul} \label{sec:ReposVul} Unter Verwendung von Large Language Models sowie statischen Codeanalysetools wurde zwischen Code-Änderungen und verworrenen Patches unterschieden. Veraltete Patches werden hier letztendlich durch ein implementiertes tracebasiertes Filtermodul erkannt. Weiterhin wurden interprozeduale Aufrufbeziehungen von Schwachstellen erfasst und extrahiert. - Die resultierende Datensammlung enthält $6.134$ CVE-Einträge mit $236$ CWE-Typen, die die Programmiersprachen c++, C, Java sowie Python in 1.491 Projekten darstellen. + Die resultierende Datensammlung enthält $6.134$ CVE-Einträge mit $236$ CWE-Typen, die die Programmiersprachen C++, C, Java sowie Python in 1.491 Projekten darstellen. \item[Ergebnisse]\hfill \\ Es wurde ein hochwertiger Schwachstellendatensatz auf Repository-Level erstellt. Dieser verringert die Probleme, welche durch verworrene oder veraltete Patches in anderen Datensätzen entstehen. diff --git a/documentation/latex/5_concept/architecture_1.tex b/documentation/latex/5_concept/architecture_1.tex index 918f95b..25734f5 100644 --- a/documentation/latex/5_concept/architecture_1.tex +++ b/documentation/latex/5_concept/architecture_1.tex @@ -48,8 +48,8 @@ \subsection{Architektur} \label{sec:ArchitekturV1} Für den Bau der Containers wird eine \textit{docker-compose.yml} (siehe Appendix \ref{sec:dockerComposeYml}) genutzt. \end{enumerate} Weiterhin muss das \ac{JSON-LD}-Format für die Rückgabedaten definiert werden (Forschungsfrage \ref{q:three}). - - Die endgültige Architektur hat folgenden Aufbau: + \\ \\ + \noindent Die endgültige Architektur hat folgenden Aufbau: \begin{figure}[H] \centering \includegraphics[width=0.95\textwidth]{5_concept/architecture.png} diff --git a/documentation/latex/5_concept/concept.tex b/documentation/latex/5_concept/concept.tex index 25ae65c..299d333 100644 --- a/documentation/latex/5_concept/concept.tex +++ b/documentation/latex/5_concept/concept.tex @@ -9,4 +9,5 @@ \section{Konzept} \label{sec:Konzept} \input{5_concept/non_func.tex} \input{5_concept/special_attr.tex} \input{5_concept/results.tex} + \newpage \input{5_concept/architecture_1.tex} diff --git a/documentation/latex/5_concept/func.tex b/documentation/latex/5_concept/func.tex index 1ff96ae..fd51a74 100644 --- a/documentation/latex/5_concept/func.tex +++ b/documentation/latex/5_concept/func.tex @@ -2,7 +2,7 @@ \subsection{Funktionale Anforderungen} \label{sec:Funktionale_Anforderungen} Bei der Umsetzung dieser Schwachstellenanalyse-\ac{API} ergeben sich nun verschiedene funktionale Anforderungen aus den Forschungsfragen: \begin{enumerate}[label=\textbf{FRQ-\Roman*}, leftmargin=2.5cm] \item Einladen und Konvertieren der Schwachstellendaten und persistente Speicherung dieser in einer internen Datenbank (betrifft \ref{q:one}, \ref{q:two})\label{f:one} - \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen Schwachstellendatenbank (betrifft \ref{q:one}) \label{f:two} + \item Überprüfung von Paketen auf Sicherheitslücken mittels Abgleich zur internen\linebreak[4] Schwachstellendatenbank (betrifft \ref{q:one}) \label{f:two} \item Clonen eines Repositories über Git. (betrifft \ref{q:two}) \label{f:three} \item Überprüfung von allen Abhängigkeiten eines Repositories mittels Abgleich zur internen Schwachstellendatenbank (betrifft \ref{q:two}) \label{f:four} \item Extraktion und Rückgabe eines Abhängigkeitsbaums für alle Abhängigkeiten mit Sicherheits\-lücken (betrifft \ref{q:two}) \label{f:five} diff --git a/documentation/latex/5_concept/questions.tex b/documentation/latex/5_concept/questions.tex index dba57df..91fccde 100644 --- a/documentation/latex/5_concept/questions.tex +++ b/documentation/latex/5_concept/questions.tex @@ -14,7 +14,7 @@ \subsection{Forschungsfragen} \label{sec:Forschungsfragen} Es müssen sinnvolle Rückgabedaten für den Endnutzer identifiziert sowie eine Definition dieser vorgenommen werden. \ref{q:four}: - Diese Forschungsfrage behandelt die Umsetzung des Algorithmus für die effektive Auflösung der transitiven Abhängigkeiten \ac{API} selbst. + Diese Forschungsfrage behandelt die Umsetzung des Algorithmus für die effektive Auf\-lös\.ung der transitiven Abhängigkeiten \ac{API} selbst. Es ist die Umsetzung der zu definierenden funktionalen Anforderungen unter der Betrachtung der nichtfunktionalen Anforderungen. Hierfür wird eine Programmiersprache mit zugehörigem Framework ausgewählt sowie das End\-punkt\-doku\-mentations- und Test\-möglich\-keits\-tool. Es muss sich in diesem Umfeld auch auf eine Programmiersprache im Sinne der zu untersuchenden Projekte entschieden werden um den Umfang dieser Arbeit möglichst genau zu halten. diff --git a/documentation/latex/6_implementation/implementation.tex b/documentation/latex/6_implementation/implementation.tex index 124f90b..8b8a461 100644 --- a/documentation/latex/6_implementation/implementation.tex +++ b/documentation/latex/6_implementation/implementation.tex @@ -3,4 +3,5 @@ \section{Implementation} \label{sec:Implementation} \input{6_implementation/validation_1.tex} \input{6_implementation/implementation_2.tex} \input{6_implementation/validation_2.tex} + \newpage \input{6_implementation/experiments.tex} diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index dec2198..b7d98be 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -6,13 +6,13 @@ \subsection{Implementation V1} \label{sec:Implementation1} \item Docker-Compose zur Container-Orchestration \end{itemize} - Die genutzte Datenbank LiteDB wurde folgend genutzt: + \noindent Die genutzte Datenbank LiteDB wurde folgend genutzt: \begin{itemize} \item Speicherung aller \ac{CVE}-Daten \item Je Jahr der vorhandenen \ac{CVE}-Daten wurde eine Datenbankdatei angelegt \end{itemize} - Folgende Datenmodelle wurden zur Nutzung der Daten in der Datenbank und/oder zur internen Verarbeitung angelegt: + \noindent Folgende Datenmodelle wurden zur Nutzung der Daten in der Datenbank und/oder zur internen Verarbeitung angelegt: \begin{itemize} \item CVEcomp, für CVE-Complete \\ Dieses Modell ist eine komplette Representation eines \ac{CVE}-Eintrags. @@ -107,6 +107,6 @@ \subsection{Implementation V1} \label{sec:Implementation1} \end{itemize} \end{itemize} - Um diese Applikation jetzt unabhängig vom Betriebssystem des Endgerätes zu machen, wurde eine docker-compose-Datei für die Containerisierung erstellt. + \noindent Um diese Applikation jetzt unabhängig vom Betriebssystem des Endgerätes zu machen, wurde eine docker-compose-Datei für die Containerisierung erstellt. Dieses referenzierte ein einzelnes Dockerfile mit dem Container der API. Ein eigenständiger Datenbankcontainer ist aufgrund der Eigenart von LiteDB als dateibasierte Datenbank nicht notwendig. diff --git a/documentation/latex/6_implementation/implementation_2.tex b/documentation/latex/6_implementation/implementation_2.tex index 6eaf322..aacf81d 100644 --- a/documentation/latex/6_implementation/implementation_2.tex +++ b/documentation/latex/6_implementation/implementation_2.tex @@ -7,7 +7,7 @@ \subsection{Implementation V2} \label{sec:Implementation2} \item Docker-Compose zur Container-Orchestration \end{itemize} - Weiterhin gab es eine Anpassung am Containernetzwerk, die MySQL Datenbank hat nun ihren eigenen Container, da diese nicht in ASP.NET eingebettet ist. + \noindent Weiterhin gab es eine Anpassung am Containernetzwerk, die MySQL Datenbank hat nun ihren eigenen Container, da diese nicht in ASP.NET eingebettet ist. Außerdem sind folgende Anpassungen an den Controllern vorgenommen worden: \begin{itemize} \item DbController \label{api_controller:three} diff --git a/documentation/latex/6_implementation/mysql_index.tex b/documentation/latex/6_implementation/mysql_index.tex index 8c73666..b2e535f 100644 --- a/documentation/latex/6_implementation/mysql_index.tex +++ b/documentation/latex/6_implementation/mysql_index.tex @@ -16,7 +16,7 @@ \subsubsection{MySQL Indexierung} \label{sec:MySQL_Indexierung} \caption{Laufzeiten Durchschnitt 10 Messungen \textsuperscript{siehe Appendix \ref{subsec:MySQLMitIndex} \& \ref{subsec:MySQLOhneIndex}}} \label{tabularx:MySqlIndexWithAndWithout} \end{tabularx} - Graphisch dargestellt sieht dies wie folgt aus: + \noindent Graphisch dargestellt sieht dies wie folgt aus: \begin{figure}[h] \centering \begin{tikzpicture} diff --git a/documentation/latex/6_implementation/pipe_exp.tex b/documentation/latex/6_implementation/pipe_exp.tex index fc741c9..f50b328 100644 --- a/documentation/latex/6_implementation/pipe_exp.tex +++ b/documentation/latex/6_implementation/pipe_exp.tex @@ -11,7 +11,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} In jenem Falle muss die Paketliste Stück für Stück in die Pipe eingefügt werden und beim Erreichen der Kapazität -- entsprechend der Anzahl der Datenbanken -- das früheste Paket entfernt und ein neues Paket am Anfang eingefügt werden. \end{description} - Die Verwaltung der 3 verschiedenen Staaten der Pipe ist in folgender Abbildung mit \ac{PAP} nachvollziehbar. + \noindent Die Verwaltung der 3 verschiedenen Staaten der Pipe ist in folgender Abbildung mit \ac{PAP} nachvollziehbar. Anschließend sind die 3 Fälle näher ausgeführt. \begin{figure}[H] \centering @@ -28,7 +28,7 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} \caption{\ac{PAP} Befüllen der Pipeline} \label{png:case_a} \end{figure} - Zu Erkennen ist, dass solange ein neuer Task erstellt wird, wie die Anzahl erstens nicht die Anzahl der Datenbanken erreicht hat und zweitens die aktuelle Anzahl an Tasks nicht über dem Wert der Datenbankenmenge ist. + \noindent Zu Erkennen ist, dass solange ein neuer Task erstellt wird, wie die Anzahl erstens nicht die Anzahl der Datenbanken erreicht hat und zweitens die aktuelle Anzahl an Tasks nicht über dem Wert der Datenbankenmenge ist. Dies definiert das Befüllen der Pipe. \newpage @@ -39,21 +39,19 @@ \subsubsection{LiteDB Pipeline} \label{sec:ExperimentePIPE} \caption{\ac{PAP} Aufrechterhalten der Pipeline} \label{png:case_b} \end{figure} - Hier wird jetzt nachdem das älteste, am zeitigsten in der Pipe eingeführte und noch zu analysierende Paket aus der Liste entfernt und am Anfang der Datenbankenliste der nächste Eintrag wieder angeführt, um ebenfalls alle Datenbanken zu durchlaufen. + \noindent Hier wird jetzt nachdem das älteste, am zeitigsten in der Pipe eingeführte und noch zu analysierende Paket aus der Liste entfernt und am Anfang der Datenbankenliste der nächste Eintrag wieder angeführt, um ebenfalls alle Datenbanken zu durchlaufen. \\ Dieser Prozess wird nur dadurch unterbunden, wenn der Zähler registriert, dass keine größere Zahl an noch zu analysierenden Paketen als Datenbankdateien wartend ist und somit das entleeren der Pipe eingeläutet werden muss. - \newpage - Beim Leeren der Pipeline: + \noindent Beim Leeren der Pipeline: \begin{figure}[H] \centering - \includegraphics[width=0.75\textwidth]{../pap/Case_C_k.png} + \includegraphics[width=0.70\textwidth]{../pap/Case_C_k.png} \caption{\ac{PAP} Leeren der Pipeline} \label{png:case_c} \end{figure} Hier wird beim vollständigen Durchlaufen eines Paketes dieses entfernt aus der Liste und alle weiteren rücken eine Eintrag nach vorne, wodurch die letzten Pakete ebenfalls noch durch die restlichen Datenbankdateien vollständig abgeglichen werden. - \newpage Aus der Implementation der Pipeline ergeben sich folgende Laufzeiten bei weniger Paketen als Datenbankdateien:\\ \begin{tabularx}{0.8\textwidth}{|c|c|c|} \hline diff --git a/documentation/latex/8_summary/summary.tex b/documentation/latex/8_summary/summary.tex index dd5ce1e..2ef77c8 100644 --- a/documentation/latex/8_summary/summary.tex +++ b/documentation/latex/8_summary/summary.tex @@ -7,7 +7,7 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} \item[\ref{q:two}]\hfill \\ In der umgesetzten Version ist es dank der nativen Unterstützung von npm gelungen, die Abhängigkeiten der Pakte als \ac{JSON} zu extrahieren und dann intern so weiterzuverarbeiten, dass eine logische Repräsentation erfolgen kann. \item[\ref{q:three}]\hfill \\ - Die Lösung dieser Frage geschah über die einheitliche Verwendung von \ac{JSON} respektive \ac{JSON-LD} bei der Rückgabe des Webservices. + Die Lösung dieser Frage geschah über die einheitliche Verwendung von \ac{JSON} respektive \linebreak[4] \ac{JSON-LD} bei der Rückgabe des Webservices. \item[\ref{q:four}]\hfill \\ Da die Aufgabe darin bestand, Github-Repositories zu analysieren, konnte in den Docker-Container der \ac{API} git mitinstalliert werden, wodurch ein voller Zugriff der \ac{API} auf den Funktionsumfang von git besteht. Durch diesen erlangte die \ac{API} die Möglichkeit Repositories zu clonen und anschließend intern weiterzuverarbeiten, was den Funktionsumfang der selbst-implementierten Methoden aus den Punkten $I$ bis $III$ der Forschungsfragen bereits entsprang. @@ -17,8 +17,8 @@ \section{Zusammenfassung} \label{sec:Zusammenfassung} \\ Die Überwindung der Zeitmauer gelang dann durch die in der V2 (\ref{sec:Implementation2}) verwendeten anderen Datenbank -- dann MySQL. \end{description} - Erstmals war es gelungen einen Webservice zu implementieren, welcher ein Repository auf Schwachstellen untersucht, anstatt nur einzelne Pakete auf Treffer in Schwachstellendatenbanken zu überprüfen. - Unsere Arbeit konnte nachweisen, dass eine solche Implementierung nach genannter Architektur -- \ref{sec:ArchitekturV1} -- möglich und die Hauptfunktion einer Rückgabe eines Abhängigkeitsbaumes, angereichert mit Schwachstellendaten, erfüllt ist. + Erstmals war es gelungen einen Webservice zu implementieren, welcher ein Repository auf Schwachstellen untersucht, anstatt nur einzelne Pakete auf Treffer in Schwachstellendatenbanken zu über\-prüfen. + Unsere Arbeit konnte nachweisen, dass eine solche Implementierung nach genannter \linebreak[4] Architektur -- \ref{sec:ArchitekturV1} -- möglich und die Hauptfunktion einer Rückgabe eines Abhängigkeitsbaumes, angereichert mit Schwachstellendaten, erfüllt ist. \\ \\ Basierend auf dieser Arbeit sehen wir die Forschungsfragen \begin{itemize} diff --git a/documentation/latex/Appendix/packageMean.tex b/documentation/latex/Appendix/packageMean.tex index 6f67a1a..d7226c4 100644 --- a/documentation/latex/Appendix/packageMean.tex +++ b/documentation/latex/Appendix/packageMean.tex @@ -1,4 +1,4 @@ -\section{Packet-Anzahldurchschnitt der 10 beliebtesten JavaScript-Github-Repositories} \label{sec:PackageMeanPopGitJsRepos} +\section{Paket-Anzahldurchschnitt der 10 beliebtesten JavaScript-Github-Repositories} \label{sec:PackageMeanPopGitJsRepos} \begin{figure}[H] \centering \includegraphics[width=0.85\textwidth]{Appendix/gitmost_wanted_2024-04-29 181855.png} diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index a530a4b..6255a90 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -20,8 +20,8 @@ \refsection{0} \datalist[entry]{none/global//global/global} \entry{link:MitreCve}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} \field{title}{CVE} \field{urlday}{1} @@ -35,26 +35,9 @@ \verb https://web.archive.org/web/20240501170211/https://cve.mitre.org/ \endverb \endentry - \entry{link:RedHatCveDef}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} - \field{labeltitlesource}{title} - \field{title}{Was bedeutet CVE?} - \field{urlday}{19} - \field{urlmonth}{3} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \verb{url} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \endentry \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{CVE Numbering Authorities (CNAs)} \field{urlday}{2} @@ -68,60 +51,41 @@ \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs \endverb \endentry - \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} - \field{labeltitlesource}{title} - \field{title}{Abhängigkeitsverwaltung} - \field{urlday}{14} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \verb{url} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \endentry - \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \entry{link:nvdNist}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} - \field{title}{Was ist eine Dependency} + \field{title}{NATIONAL VULNERABILITY DATABASE} \field{urlday}{3} - \field{urlmonth}{10} - \field{urlyear}{2023} + \field{urlmonth}{5} + \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ \endverb \verb{url} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ \endverb \endentry - \entry{link:ApiDef}{online}{} + \entry{link:VNBcert}{online}{} \field{sortinit}{4} \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} - \field{title}{What is an API (Application Programming Interface)?} - \field{urlday}{9} - \field{urlmonth}{4} + \field{title}{Vulnerability Notes Database} + \field{urlday}{29} + \field{urlmonth}{2} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ \endverb \verb{url} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ \endverb \endentry \entry{link:JSON}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{JSON} \field{urlday}{3} @@ -136,8 +100,8 @@ \endverb \endentry \entry{link:JSON-LD}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{JSON-LD} \field{urlday}{27} @@ -152,8 +116,8 @@ \endverb \endentry \entry{link:LinkedData}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Linked Data} \field{urlday}{4} @@ -168,8 +132,8 @@ \endverb \endentry \entry{link:NISTAPI}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{NIST-API's} \field{urlday}{28} @@ -183,41 +147,9 @@ \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities \endverb \endentry - \entry{link:nvdNist}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} - \field{labeltitlesource}{title} - \field{title}{NATIONAL VULNERABILITY DATABASE} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ - \endverb - \endentry - \entry{link:VNBcert}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} - \field{labeltitlesource}{title} - \field{title}{Vulnerability Notes Database} - \field{urlday}{29} - \field{urlmonth}{2} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ - \endverb - \endentry \entry{link:DependaBot}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} \field{title}{Git Dependa Bot} \field{urlday}{2} @@ -232,8 +164,8 @@ \endverb \endentry \entry{link:GitHub}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} \field{title}{GitHub} \field{urlday}{3} @@ -248,8 +180,8 @@ \endverb \endentry \entry{link:SYNK}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} \field{title}{SYNK} \field{urlday}{22} @@ -263,89 +195,89 @@ \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started \endverb \endentry - \entry{link:SynkIaC}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \entry{link:Kubernetes}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} - \field{title}{Synk IaC} - \field{urlday}{1} + \field{title}{Production-Grade Container Orchestration} + \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ \endverb \verb{url} - \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ \endverb \endentry - \entry{link:Terraform}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \entry{link:SynkIaC}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} - \field{title}{Terraform} - \field{urlday}{3} + \field{title}{Synk IaC} + \field{urlday}{1} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ + \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ + \verb https://web.archive.org/web/20240501100941/https://snyk.io/product/infrastructure-as-code-security/ \endverb \endentry - \entry{link:Azure}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \entry{link:Terraform}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} - \field{title}{Microsoft Azure} + \field{title}{Terraform} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ \endverb \endentry - \entry{link:Kubernetes}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \entry{link:CloudFormation}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} - \field{title}{Production-Grade Container Orchestration} + \field{title}{AWS CloudFormation} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ \endverb \endentry - \entry{link:CloudFormation}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \entry{link:Azure}{online}{} + \field{sortinit}{1} + \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} \field{labeltitlesource}{title} - \field{title}{AWS CloudFormation} + \field{title}{Microsoft Azure} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ \endverb \endentry \entry{link:OWASPDependencyCheck}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} \field{title}{OWAST Dependency Check} \field{urlday}{23} @@ -359,38 +291,6 @@ \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ \endverb \endentry - \entry{link:Maven}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} - \field{labeltitlesource}{title} - \field{title}{Maven} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ - \endverb - \endentry - \entry{link:ASPNET}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} - \field{labeltitlesource}{title} - \field{title}{ASP.NET Core} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet - \endverb - \endentry \entry{article:wang2024reposvul}{article}{} \name{author}{6}{}{% {{hash=1bbdfe1ba462d08472b1fb725422d240}{% @@ -430,8 +330,8 @@ \strng{authorbibnamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authornamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authorfullhash}{ec454725ffe828ba6d4868a2429ff3b0} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{eprintclass}{cs.CR} @@ -445,6 +345,60 @@ \verb 2401.13169 \endverb \endentry + \entry{article:OnTheEffect10123571}{article}{} + \name{author}{3}{}{% + {{hash=fb80f3530d5850fe7b9b7587f4388403}{% + family={Mir}, + familyi={M\bibinitperiod}, + given={Amir\bibnamedelima M.}, + giveni={A\bibinitperiod\bibinitdelim M\bibinitperiod}}}% + {{hash=93406606476904c7b35328ac18479e24}{% + family={Keshani}, + familyi={K\bibinitperiod}, + given={Mehdi}, + giveni={M\bibinitperiod}}}% + {{hash=dcfc2de769b78ca2db66ceb37b51dd39}{% + family={Proksch}, + familyi={P\bibinitperiod}, + given={Sebastian}, + giveni={S\bibinitperiod}}}% + } + \strng{namehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{fullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{bibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labelnamesource}{author} + \field{labeltitlesource}{title} + \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} + \field{title}{On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem} + \field{year}{2023} + \field{pages}{201\bibrangedash 211} + \range{pages}{11} + \verb{doi} + \verb 10.1109/SANER56733.2023.00028 + \endverb + \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} + \endentry + \entry{link:Maven}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{labeltitlesource}{title} + \field{title}{Maven} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \endentry \entry{article:Liu2022DemystifyingTV}{article}{} \name{author}{6}{}{% {{hash=30b278deffb74289c6aea3469e1ac95e}{% @@ -484,8 +438,8 @@ \strng{authorbibnamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authornamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authorfullhash}{77e9bd89eb30eaa070813bcc4154a831} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)} @@ -500,218 +454,326 @@ \verb https://api.semanticscholar.org/CorpusID:245853604 \endverb \endentry - \entry{article:OnTheEffect10123571}{article}{} - \name{author}{3}{}{% - {{hash=fb80f3530d5850fe7b9b7587f4388403}{% - family={Mir}, - familyi={M\bibinitperiod}, - given={Amir\bibnamedelima M.}, - giveni={A\bibinitperiod\bibinitdelim M\bibinitperiod}}}% - {{hash=93406606476904c7b35328ac18479e24}{% - family={Keshani}, - familyi={K\bibinitperiod}, - given={Mehdi}, - giveni={M\bibinitperiod}}}% - {{hash=dcfc2de769b78ca2db66ceb37b51dd39}{% - family={Proksch}, - familyi={P\bibinitperiod}, - given={Sebastian}, - giveni={S\bibinitperiod}}}% - } - \strng{namehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{fullhash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{bibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} - \field{labelnamesource}{author} + \entry{link:ApiResponseTime}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} - \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} - \field{title}{On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem} - \field{year}{2023} - \field{pages}{201\bibrangedash 211} - \range{pages}{11} - \verb{doi} - \verb 10.1109/SANER56733.2023.00028 + \field{title}{What’s the difference between API Latency and API Response Time?} + \field{urlday}{18} + \field{urlmonth}{12} + \field{urlyear}{2023} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. + \endverb + \verb{url} + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. \endverb - \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} \endentry - \entry{link:MySqlIndex}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \entry{link:ASPNET}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} - \field{title}{10.3.1 How MySQL Uses Indexes} - \field{urlday}{30} - \field{urlmonth}{1} + \field{title}{ASP.NET Core} + \field{urlday}{3} + \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet \endverb \verb{url} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet \endverb \endentry - \entry{link:ApiResponseTime}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \entry{link:CveRepo}{online}{} + \field{sortinit}{2} + \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} \field{labeltitlesource}{title} - \field{title}{What’s the difference between API Latency and API Response Time?} - \field{urlday}{18} - \field{urlmonth}{12} - \field{urlyear}{2023} + \field{title}{CVEProject/cvelistV5} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. + \verb https://github.com/CVEProject/cvelistV5 \endverb \verb{url} - \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. + \verb https://github.com/CVEProject/cvelistV5 + \endverb + \endentry + \entry{link:NISTapiAbfrageLiteDb}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{services.nvd.nist.gov} + \verb{urlraw} + \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb + \endverb + \verb{url} + \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb + \endverb + \warn{\item Entry 'link:NISTapiAbfrageLiteDb' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:MySqlIndex}{online}{} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{labeltitlesource}{title} + \field{title}{10.3.1 How MySQL Uses Indexes} + \field{urlday}{30} + \field{urlmonth}{1} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \endverb + \verb{url} + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html \endverb \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{Github explore} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://gitmostwanted.com/?term=&lang=JavaScript \endverb \verb{url} \verb https://gitmostwanted.com/?term=&lang=JavaScript \endverb - \warn{\item online entry 'link:GitPopJsRepoMostWanted' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoReact}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{react} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/facebook/react/network/dependencies \endverb \verb{url} \verb https://github.com/facebook/react/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoReact' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{Leaflet} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/Leaflet/Leaflet/network/dependencies \endverb \verb{url} \verb https://github.com/Leaflet/Leaflet/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoLeaflet' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{bootstrap} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/twbs/bootstrap/network/dependencies \endverb \verb{url} \verb https://github.com/twbs/bootstrap/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoBootstrap' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoExpress}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{express} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/expressjs/express/network/dependencies \endverb \verb{url} \verb https://github.com/expressjs/express/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoExpress' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoSwiper}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{3} + \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} \field{labeltitlesource}{title} \field{title}{swiper} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/nolimits4web/swiper/network/dependencies \endverb \verb{url} \verb https://github.com/nolimits4web/swiper/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoSwiper' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPlotly}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{plotly} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/plotly/plotly.js/network/dependencies \endverb \verb{url} \verb https://github.com/plotly/plotly.js/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoPlotly' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoNode}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{node} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/nodejs/node/network/dependencies \endverb \verb{url} \verb https://github.com/nodejs/node/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoNode' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAos}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{aos} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/michalsnik/aos/network/dependencies \endverb \verb{url} \verb https://github.com/michalsnik/aos/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoAos' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoPm2}{online}{} - \field{sortinit}{8} - \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{pm2} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/Unitech/pm2/network/dependencies \endverb \verb{url} \verb https://github.com/Unitech/pm2/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoPm2' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \entry{link:GitPopJsRepoAxios}{online}{} - \field{sortinit}{8} - \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{axios} + \field{urlday}{29} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} \verb{urlraw} \verb https://github.com/axios/axios/network/dependencies \endverb \verb{url} \verb https://github.com/axios/axios/network/dependencies \endverb - \warn{\item online entry 'link:GitPopJsRepoAxios' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} + \endentry + \entry{link:RedHatCveDef}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{labeltitlesource}{title} + \field{title}{Was bedeutet CVE?} + \field{urlday}{19} + \field{urlmonth}{3} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \verb{url} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \endentry + \entry{link:GoogleDependencies}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{labeltitlesource}{title} + \field{title}{Abhängigkeitsverwaltung} + \field{urlday}{14} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \verb{url} + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de + \endverb + \endentry + \entry{link:DevInsiderDependecyDef}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{labeltitlesource}{title} + \field{title}{Was ist eine Dependency} + \field{urlday}{3} + \field{urlmonth}{10} + \field{urlyear}{2023} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \endentry + \entry{link:ApiDef}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{What is an API (Application Programming Interface)?} + \field{urlday}{9} + \field{urlmonth}{4} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \endverb \endentry \enddatalist \endrefsection From 16e7da0957b6ffc7b1e8d7b6992731a4f630f566 Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Sun, 5 May 2024 15:33:52 +0200 Subject: [PATCH 58/60] both 6 --- documentation/latex/lib/bib.bib | 5 ----- documentation/latex/main.tex | 5 +++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/documentation/latex/lib/bib.bib b/documentation/latex/lib/bib.bib index eaf61ec..937ccbf 100644 --- a/documentation/latex/lib/bib.bib +++ b/documentation/latex/lib/bib.bib @@ -63,11 +63,6 @@ @online{link:NISTAPI urldate = "2024-04-28", url = "http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities", } -@online{link:NISTAPI, - title = "Vulnerability APIs", - urldate = "2024-04-28", - url = "https://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities", -} % NVD @online{link:nvdNist, diff --git a/documentation/latex/main.tex b/documentation/latex/main.tex index 1ec2115..17aa683 100644 --- a/documentation/latex/main.tex +++ b/documentation/latex/main.tex @@ -194,11 +194,12 @@ \input{Appendix/litedbMonoPipe.tex} \input{Appendix/mySqlWithIndex.tex} \input{Appendix/mySqlWithoutIndex.tex} - \input{Appendix/packageMean.tex} + \newpage + \input{Appendix/dockerCompose.tex} \newpage \input{Appendix/checkedPackagesNist.tex} \newpage - \input{Appendix/dockerCompose.tex} + \input{Appendix/packageMean.tex} \stopcontents[Messungen] \end{appendices} From 9e0d533d20e732bf8597cbd21be495c17a7029fa Mon Sep 17 00:00:00 2001 From: Kretchen001 <83697846+Kretchen001@users.noreply.github.com> Date: Sun, 5 May 2024 15:52:39 +0200 Subject: [PATCH 59/60] add checked packages --- .../latex/Appendix/checkedPackagesNist.tex | 16 +- documentation/latex/main.bbl | 516 +++++++++--------- 2 files changed, 266 insertions(+), 266 deletions(-) diff --git a/documentation/latex/Appendix/checkedPackagesNist.tex b/documentation/latex/Appendix/checkedPackagesNist.tex index 0dbc1b8..e6bd14e 100644 --- a/documentation/latex/Appendix/checkedPackagesNist.tex +++ b/documentation/latex/Appendix/checkedPackagesNist.tex @@ -2,12 +2,12 @@ \section{Liste an überprüften Paketen mit der NIST-API} \label{sec:ListOfCheck \begin{itemize} \item LiteDB \item MongoDB - \item l - \item l - \item l - \item l - \item l - \item l - \item l - \item l + \item PHP + \item Laravel + \item Crowd + \item NewtonSoft + \item Ubuntu + \item Debian + \item dept + \item beta \end{itemize} \ No newline at end of file diff --git a/documentation/latex/main.bbl b/documentation/latex/main.bbl index 6255a90..795a02e 100644 --- a/documentation/latex/main.bbl +++ b/documentation/latex/main.bbl @@ -20,8 +20,8 @@ \refsection{0} \datalist[entry]{none/global//global/global} \entry{link:MitreCve}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{CVE} \field{urlday}{1} @@ -35,9 +35,26 @@ \verb https://web.archive.org/web/20240501170211/https://cve.mitre.org/ \endverb \endentry + \entry{link:RedHatCveDef}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{labeltitlesource}{title} + \field{title}{Was bedeutet CVE?} + \field{urlday}{19} + \field{urlmonth}{3} + \field{urlyear}{2024} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \verb{url} + \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve + \endverb + \endentry \entry{link:CveOrgCnaS}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} \field{title}{CVE Numbering Authorities (CNAs)} \field{urlday}{2} @@ -51,36 +68,55 @@ \verb https://web.archive.org/web/20240402032014/https://www.cve.org/ProgramOrganization/CNAs \endverb \endentry - \entry{link:nvdNist}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \entry{link:GoogleDependencies}{online}{} + \field{sortinit}{4} + \field{sortinithash}{9381316451d1b9788675a07e972a12a7} \field{labeltitlesource}{title} - \field{title}{NATIONAL VULNERABILITY DATABASE} - \field{urlday}{3} - \field{urlmonth}{5} + \field{title}{Abhängigkeitsverwaltung} + \field{urlday}{14} + \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} + \true{nocite} \verb{urlraw} - \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de \endverb \verb{url} - \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de \endverb \endentry - \entry{link:VNBcert}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \entry{link:DevInsiderDependecyDef}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} - \field{title}{Vulnerability Notes Database} - \field{urlday}{29} - \field{urlmonth}{2} + \field{title}{Was ist eine Dependency} + \field{urlday}{3} + \field{urlmonth}{10} + \field{urlyear}{2023} + \field{urldateera}{ce} + \true{nocite} + \verb{urlraw} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \endverb + \endentry + \entry{link:ApiDef}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{What is an API (Application Programming Interface)?} + \field{urlday}{9} + \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} + \true{nocite} \verb{urlraw} - \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ \endverb \verb{url} - \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ \endverb \endentry \entry{link:JSON}{online}{} @@ -100,8 +136,8 @@ \endverb \endentry \entry{link:JSON-LD}{online}{} - \field{sortinit}{6} - \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{JSON-LD} \field{urlday}{27} @@ -116,8 +152,8 @@ \endverb \endentry \entry{link:LinkedData}{online}{} - \field{sortinit}{7} - \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{Linked Data} \field{urlday}{4} @@ -132,8 +168,8 @@ \endverb \endentry \entry{link:NISTAPI}{online}{} - \field{sortinit}{8} - \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{NIST-API's} \field{urlday}{28} @@ -147,9 +183,41 @@ \verb http://web.archive.org/web/20240428162400/https://nvd.nist.gov/developers/vulnerabilities \endverb \endentry + \entry{link:nvdNist}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{NATIONAL VULNERABILITY DATABASE} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503164752/https://nvd.nist.gov/ + \endverb + \endentry + \entry{link:VNBcert}{online}{} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \field{labeltitlesource}{title} + \field{title}{Vulnerability Notes Database} + \field{urlday}{29} + \field{urlmonth}{2} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240229232553/https://www.kb.cert.org/vuls/ + \endverb + \endentry \entry{link:DependaBot}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{Git Dependa Bot} \field{urlday}{2} @@ -164,8 +232,8 @@ \endverb \endentry \entry{link:GitHub}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{5} + \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} \field{labeltitlesource}{title} \field{title}{GitHub} \field{urlday}{3} @@ -180,8 +248,8 @@ \endverb \endentry \entry{link:SYNK}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{SYNK} \field{urlday}{22} @@ -195,25 +263,9 @@ \verb http://web.archive.org/web/20230922213940/https://docs.snyk.io/getting-started \endverb \endentry - \entry{link:Kubernetes}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} - \field{labeltitlesource}{title} - \field{title}{Production-Grade Container Orchestration} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ - \endverb - \endentry \entry{link:SynkIaC}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{Synk IaC} \field{urlday}{1} @@ -228,8 +280,8 @@ \endverb \endentry \entry{link:Terraform}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{Terraform} \field{urlday}{3} @@ -243,41 +295,57 @@ \verb https://web.archive.org/web/20240503022331/https://www.terraform.io/ \endverb \endentry - \entry{link:CloudFormation}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \entry{link:Azure}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} - \field{title}{AWS CloudFormation} + \field{title}{Microsoft Azure} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ \endverb \endentry - \entry{link:Azure}{online}{} - \field{sortinit}{1} - \field{sortinithash}{4f6aaa89bab872aa0999fec09ff8e98a} + \entry{link:Kubernetes}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} - \field{title}{Microsoft Azure} + \field{title}{Production-Grade Container Orchestration} \field{urlday}{3} \field{urlmonth}{5} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ \endverb \verb{url} - \verb https://web.archive.org/web/20240503050034/https://azure.microsoft.com/en-us/ + \verb https://web.archive.org/web/20240503033605/https://kubernetes.io/ + \endverb + \endentry + \entry{link:CloudFormation}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{AWS CloudFormation} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503113503/https://aws.amazon.com/cloudformation/ \endverb \endentry \entry{link:OWASPDependencyCheck}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labeltitlesource}{title} \field{title}{OWAST Dependency Check} \field{urlday}{23} @@ -291,6 +359,38 @@ \verb http://web.archive.org/web/20240423091043/https://owasp.org/www-project-dependency-check/ \endverb \endentry + \entry{link:Maven}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{Maven} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ + \endverb + \endentry + \entry{link:ASPNET}{online}{} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} + \field{labeltitlesource}{title} + \field{title}{ASP.NET Core} + \field{urlday}{3} + \field{urlmonth}{5} + \field{urlyear}{2024} + \field{urldateera}{ce} + \verb{urlraw} + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet + \endverb + \verb{url} + \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet + \endverb + \endentry \entry{article:wang2024reposvul}{article}{} \name{author}{6}{}{% {{hash=1bbdfe1ba462d08472b1fb725422d240}{% @@ -330,8 +430,8 @@ \strng{authorbibnamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authornamehash}{c8a9c1d7afed77e83cb5c7af2d1df72c} \strng{authorfullhash}{ec454725ffe828ba6d4868a2429ff3b0} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{6} + \field{sortinithash}{b33bc299efb3c36abec520a4c896a66d} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{eprintclass}{cs.CR} @@ -345,60 +445,6 @@ \verb 2401.13169 \endverb \endentry - \entry{article:OnTheEffect10123571}{article}{} - \name{author}{3}{}{% - {{hash=fb80f3530d5850fe7b9b7587f4388403}{% - family={Mir}, - familyi={M\bibinitperiod}, - given={Amir\bibnamedelima M.}, - giveni={A\bibinitperiod\bibinitdelim M\bibinitperiod}}}% - {{hash=93406606476904c7b35328ac18479e24}{% - family={Keshani}, - familyi={K\bibinitperiod}, - given={Mehdi}, - giveni={M\bibinitperiod}}}% - {{hash=dcfc2de769b78ca2db66ceb37b51dd39}{% - family={Proksch}, - familyi={P\bibinitperiod}, - given={Sebastian}, - giveni={S\bibinitperiod}}}% - } - \strng{namehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{fullhash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{bibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} - \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} - \field{labelnamesource}{author} - \field{labeltitlesource}{title} - \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} - \field{title}{On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem} - \field{year}{2023} - \field{pages}{201\bibrangedash 211} - \range{pages}{11} - \verb{doi} - \verb 10.1109/SANER56733.2023.00028 - \endverb - \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} - \endentry - \entry{link:Maven}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} - \field{labeltitlesource}{title} - \field{title}{Maven} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503085423/https://maven.apache.org/ - \endverb - \endentry \entry{article:Liu2022DemystifyingTV}{article}{} \name{author}{6}{}{% {{hash=30b278deffb74289c6aea3469e1ac95e}{% @@ -438,8 +484,8 @@ \strng{authorbibnamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authornamehash}{d9270b82de967a61a5c4a663b5d82ce2} \strng{authorfullhash}{77e9bd89eb30eaa070813bcc4154a831} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labelnamesource}{author} \field{labeltitlesource}{title} \field{journaltitle}{2022 IEEE/ACM 44th International Conference on Software Engineering (ICSE)} @@ -454,86 +500,79 @@ \verb https://api.semanticscholar.org/CorpusID:245853604 \endverb \endentry - \entry{link:ApiResponseTime}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} - \field{labeltitlesource}{title} - \field{title}{What’s the difference between API Latency and API Response Time?} - \field{urlday}{18} - \field{urlmonth}{12} - \field{urlyear}{2023} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. - \endverb - \verb{url} - \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. - \endverb - \endentry - \entry{link:ASPNET}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \entry{article:OnTheEffect10123571}{article}{} + \name{author}{3}{}{% + {{hash=fb80f3530d5850fe7b9b7587f4388403}{% + family={Mir}, + familyi={M\bibinitperiod}, + given={Amir\bibnamedelima M.}, + giveni={A\bibinitperiod\bibinitdelim M\bibinitperiod}}}% + {{hash=93406606476904c7b35328ac18479e24}{% + family={Keshani}, + familyi={K\bibinitperiod}, + given={Mehdi}, + giveni={M\bibinitperiod}}}% + {{hash=dcfc2de769b78ca2db66ceb37b51dd39}{% + family={Proksch}, + familyi={P\bibinitperiod}, + given={Sebastian}, + giveni={S\bibinitperiod}}}% + } + \strng{namehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{fullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{bibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorbibnamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authornamehash}{dc54a4ac50e7a6879329d6c6099889f1} + \strng{authorfullhash}{dc54a4ac50e7a6879329d6c6099889f1} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} + \field{labelnamesource}{author} \field{labeltitlesource}{title} - \field{title}{ASP.NET Core} - \field{urlday}{3} - \field{urlmonth}{5} - \field{urlyear}{2024} - \field{urldateera}{ce} - \verb{urlraw} - \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet - \endverb - \verb{url} - \verb https://web.archive.org/web/20240503174824/https://dotnet.microsoft.com/en-us/apps/aspnet + \field{booktitle}{2023 IEEE International Conference on Software Analysis, Evolution and Reengineering (SANER)} + \field{title}{On the Effect of Transitivity and Granularity on Vulnerability Propagation in the Maven Ecosystem} + \field{year}{2023} + \field{pages}{201\bibrangedash 211} + \range{pages}{11} + \verb{doi} + \verb 10.1109/SANER56733.2023.00028 \endverb + \keyw{Java;Software libraries;Limiting;Codes;Ecosystems;Software;Reachability analysis;software vulnerabilities;Maven;fine-grained analysis;software ecosystem} \endentry - \entry{link:CveRepo}{online}{} - \field{sortinit}{2} - \field{sortinithash}{8b555b3791beccb63322c22f3320aa9a} + \entry{link:MySqlIndex}{online}{} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} - \field{title}{CVEProject/cvelistV5} - \field{urlday}{29} - \field{urlmonth}{4} + \field{title}{10.3.1 How MySQL Uses Indexes} + \field{urlday}{30} + \field{urlmonth}{1} \field{urlyear}{2024} \field{urldateera}{ce} \verb{urlraw} - \verb https://github.com/CVEProject/cvelistV5 - \endverb - \verb{url} - \verb https://github.com/CVEProject/cvelistV5 - \endverb - \endentry - \entry{link:NISTapiAbfrageLiteDb}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} - \field{labeltitlesource}{title} - \field{title}{services.nvd.nist.gov} - \verb{urlraw} - \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html \endverb \verb{url} - \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb + \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html \endverb - \warn{\item Entry 'link:NISTapiAbfrageLiteDb' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry - \entry{link:MySqlIndex}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \entry{link:ApiResponseTime}{online}{} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} - \field{title}{10.3.1 How MySQL Uses Indexes} - \field{urlday}{30} - \field{urlmonth}{1} - \field{urlyear}{2024} + \field{title}{What’s the difference between API Latency and API Response Time?} + \field{urlday}{18} + \field{urlmonth}{12} + \field{urlyear}{2023} \field{urldateera}{ce} \verb{urlraw} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just\%20to\%20have\%20a\%20number,to\%20abandon\%20the\%20application\%2Fwebsite. \endverb \verb{url} - \verb https://web.archive.org/web/20240130044603/https://dev.mysql.com/doc/refman/8.0/en/mysql-indexes.html + \verb https://web.archive.org/web/20231218165046/https://blog.sentry.io/whats-the-difference-between-api-latency-and-api-response-time/#:$~$:text=Just%5C%20to%5C%20have%5C%20a%5C%20number,to%5C%20abandon%5C%20the%5C%20application%5C%2Fwebsite. \endverb \endentry \entry{link:GitPopJsRepoMostWanted}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Github explore} \field{urlday}{29} @@ -548,8 +587,8 @@ \endverb \endentry \entry{link:GitPopJsRepoReact}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{react} \field{urlday}{29} @@ -564,8 +603,8 @@ \endverb \endentry \entry{link:GitPopJsRepoLeaflet}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{Leaflet} \field{urlday}{29} @@ -580,8 +619,8 @@ \endverb \endentry \entry{link:GitPopJsRepoBootstrap}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{bootstrap} \field{urlday}{29} @@ -596,8 +635,8 @@ \endverb \endentry \entry{link:GitPopJsRepoExpress}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{express} \field{urlday}{29} @@ -612,8 +651,8 @@ \endverb \endentry \entry{link:GitPopJsRepoSwiper}{online}{} - \field{sortinit}{3} - \field{sortinithash}{ad6fe7482ffbd7b9f99c9e8b5dccd3d7} + \field{sortinit}{7} + \field{sortinithash}{108d0be1b1bee9773a1173443802c0a3} \field{labeltitlesource}{title} \field{title}{swiper} \field{urlday}{29} @@ -628,8 +667,8 @@ \endverb \endentry \entry{link:GitPopJsRepoPlotly}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{plotly} \field{urlday}{29} @@ -644,8 +683,8 @@ \endverb \endentry \entry{link:GitPopJsRepoNode}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{node} \field{urlday}{29} @@ -660,8 +699,8 @@ \endverb \endentry \entry{link:GitPopJsRepoAos}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{aos} \field{urlday}{29} @@ -676,8 +715,8 @@ \endverb \endentry \entry{link:GitPopJsRepoPm2}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{pm2} \field{urlday}{29} @@ -692,8 +731,8 @@ \endverb \endentry \entry{link:GitPopJsRepoAxios}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} \field{title}{axios} \field{urlday}{29} @@ -707,73 +746,34 @@ \verb https://github.com/axios/axios/network/dependencies \endverb \endentry - \entry{link:RedHatCveDef}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} - \field{labeltitlesource}{title} - \field{title}{Was bedeutet CVE?} - \field{urlday}{19} - \field{urlmonth}{3} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \verb{url} - \verb https://web.archive.org/web/20240319193237/https://www.redhat.com/de/topics/security/what-is-cve - \endverb - \endentry - \entry{link:GoogleDependencies}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} + \entry{link:CveRepo}{online}{} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} - \field{title}{Abhängigkeitsverwaltung} - \field{urlday}{14} + \field{title}{CVEProject/cvelistV5} + \field{urlday}{29} \field{urlmonth}{4} \field{urlyear}{2024} \field{urldateera}{ce} - \true{nocite} \verb{urlraw} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \verb{url} - \verb https://web.archive.org/web/20240414153419/https://cloud.google.com/software-supply-chain-security/docs/dependencies?hl=de - \endverb - \endentry - \entry{link:DevInsiderDependecyDef}{online}{} - \field{sortinit}{4} - \field{sortinithash}{9381316451d1b9788675a07e972a12a7} - \field{labeltitlesource}{title} - \field{title}{Was ist eine Dependency} - \field{urlday}{3} - \field{urlmonth}{10} - \field{urlyear}{2023} - \field{urldateera}{ce} - \true{nocite} - \verb{urlraw} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \verb https://github.com/CVEProject/cvelistV5 \endverb \verb{url} - \verb https://web.archive.org/web/20231003203304/https://www.dev-insider.de/was-ist-eine-dependency-a-899057/ + \verb https://github.com/CVEProject/cvelistV5 \endverb \endentry - \entry{link:ApiDef}{online}{} - \field{sortinit}{5} - \field{sortinithash}{20e9b4b0b173788c5dace24730f47d8c} + \entry{link:NISTapiAbfrageLiteDb}{online}{} + \field{sortinit}{8} + \field{sortinithash}{a231b008ebf0ecbe0b4d96dcc159445f} \field{labeltitlesource}{title} - \field{title}{What is an API (Application Programming Interface)?} - \field{urlday}{9} - \field{urlmonth}{4} - \field{urlyear}{2024} - \field{urldateera}{ce} - \true{nocite} + \field{title}{services.nvd.nist.gov} \verb{urlraw} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb \endverb \verb{url} - \verb https://web.archive.org/web/20240409204350/https://aws.amazon.com/what-is/api/ + \verb https://services.nvd.nist.gov/rest/json/cves/2.0?keywordSearch=LiteDb \endverb + \warn{\item Entry 'link:NISTapiAbfrageLiteDb' (lib/bib.bib): Invalid format '2022-xx-xx' of date field 'urldate' - ignoring} \endentry \enddatalist \endrefsection From 4d79e3b701bca1022508447477726c8c3e9ca6ac Mon Sep 17 00:00:00 2001 From: KnYL3R Date: Mon, 6 May 2024 20:20:59 +0200 Subject: [PATCH 60/60] removed comments --- documentation/latex/6_implementation/implementation_1.tex | 2 -- 1 file changed, 2 deletions(-) diff --git a/documentation/latex/6_implementation/implementation_1.tex b/documentation/latex/6_implementation/implementation_1.tex index b7d98be..2825445 100644 --- a/documentation/latex/6_implementation/implementation_1.tex +++ b/documentation/latex/6_implementation/implementation_1.tex @@ -23,8 +23,6 @@ \subsection{Implementation V1} \label{sec:Implementation1} Hier wird also ein Objekt oder eine Liste dieses Modells zurückgegeben. \item JsonLdObject \\ Mittels diese Modells wird das Verbinden des \ac{JSON-LD} \textit{$@context$} mit dem \textit{$data$} Teil einer Response ermöglicht. - % \item PackageForApi %! SIEHE V2 - % \item RepoObject %! SIEHE V2 \item $[$Enum$]$ ProjectType \\ Dieses Enum wurde eingeführt, damit bei Nutzung des Repository-Analyze-Endpunkts nicht der Projekttyp als String (zum Beispiel NodeJS) sondern ein Ganzzahlwert anstatt dessen genutzt werden kann. Die Entscheidung dafür fiel, damit mögliche Schreibfehler vom Endnutzer ausgeschlossen werden können.

    ?CtpcxT^0ODM`ea6aT)Vyx_@9%V>BXRD%Gysq}Ae&fh&q_Iyr{D^=O6^#Id* zLgX~$gL7RnbYJ~lNH;%Z;;c+Shr5h}T%yLT%)7RtZ!qf`f#n~rDg!OGOvhaWcKArE z+!h3R8P|L_utk*pWj>DCJcZq5?!tW42ZF!O@`n4F-Ai@3CD;+;0O<)o2o6@Z)966t z1B>5%O!mirfL)_tEaT~wa|%*dfSWt<-pl8$s9IH5xteT3U-svJ7`0D9CegX;CsM5e zvZ(*FP4ayN`<|-9#l9Na8L_fLb{DT`bJnI|n>I83w`UHjRATfN5n9!7L!*<9Ta-9P z4rQQG6RuQ+=?FQPgddReNb#5IFbi>ClE|zO{Zkcy5_2A~&d^=>Cd%o9JxQ<`hyEPp zg@`g>=f7*l|3W@M+qu9%zT*@HY*9GP2GpHcz}7S0YrG1SNpdWE6v}>R#}tlyBqL&z zF)PrOKH#?@6N!LUl>`g>#WuyZ6Pxvh`tjdWZ;+WWD0tV*ku??Cs&d_wO4`L-m&2IT z_>!1OZHG1J%*q8`I&!aTYtX)M5=#Xku7fi`*#+) z=Ej{)ENf$~dBvzrE-~=v$Bel2Bgr%#?X(~UE3YetyR}VcGIf*jCxuvQj0G9OHqpQXRfB zURGI-?l8}qD|_qT&ZSx49k<-qdTJ^a##T)f;x0%9qNgyS;t^hcDL@g3&O>1Soxr8u z1|6X;i@iCMslc7HzsxR13?K?HW0>LYB;f(DdKFB5tHU>m(E!ER(%}fHm8xUE!SJ*r z2YzIl*`2pq&KND;vm%g{tiNp3W^;P7|IVU9M+gV-!Ci<$Yi$#zr~dWhW#37)vzxHs zCA4|8F8c)_Fuu~9Li4nL>5&l$`~FdWDl44CnM4jAe-E2*vK!_we(^CQ(YOcpauCP! zZI~$Iww(-HEq~G3=w*b0iDK6AQ{^k$1kBf9t(_#Xj&MZCmeLC+y0O z%c`?dLAEEnWqmUqka5W<72}$2!YsqUYF`x~20M_vXTLzwKNL>dwk;?DhA3ll+uF#) z32B{% z6pk~)*54;lBhCR3wDEKU{~P(J@g8aWqX1J_(&X6E`j!`tWWuv~UBGbWpPQ<#Xc(Jh zN54xW0}}ltAv)>&p9-Ml_9F^BV*=n;+}^9blbvFfY@SnfRdq{=SBq8q27IPu7O(OjRVdAqot# zyF{%*{1_d$>6xtUR~F8ul7Es(x}a?=P$i_t$(!cvr8_1k1KRJ{L|PHZCO*Yo5?V8b zA-2&=1j9DJw;gu*(qdXf){}Z6a(lx<%+}mey49PmZ+!GQ+1Oalc-(AXxZGZ?yMXXI z`_+AW{_Kj`=kPXVh3fJhNf@uz2Z#Iz+I3nVh!3IkWjN3Lcx?yF){J|bkxa}4Ynw-8 znj(PfK%ieL%m{uKW;lvHk4u_WkE@k^ys-}0@1aRweV9y23i+QjK&JNp{#$&2zr6p4 zWG4mCdHZ#MOgwgUYXxh3)7a6VXHex}w7HRREJgj!Y-yTfin{0y&0U6ecp5N8{$*jY z?Z9--P0Isf$IPUfaQOdd;osKXZ!K|$`AC)~%EE0`%KL}$6q{;e+td<@cluSZasuf9 z(8k-&?qKo`7I3liHZY{-D_J8-bpTtJ1KO&VStHF2h!a~XHF)_Gfg?;RniOEKH#l8~ zEqtg|nL6ZBKMBht4C%TWRFy~fl9L=tv$bN1^(Kphp4y!Vb-X7qyrJR&PwyFkB!{IJ-y}zF_bsL zP4{H02cC3I8sPSrW(2?Y?T z0#7oeCp4+$`yw15ecuAqWvx(yiR`SA>mPq{O`qTI$s(|KrP+$C2IOowdEUL9X%Brb zNU|-Cp(oGLAqzHf;Uy2Wb`g^oGYOY#M;v3S>{{doOs^pN!7av!3klGqDvdyU4;FM8 zrD+-v$11n;0NNP}5E|Y5WPnC~Bv#-$uW&$vHZ4Yh2Zh&sSevwV(-Xuz+MS%IXqt;E zy}+z26c3HD4A1uc5Bm9qw~r7MYEjqKMHiRAoMqa)9K- zbxY~4)WZK3%gbMYStjzD$?XkLQ30~S#j}iDIN-@f1R(OYZ@oJWnl^e7V@O-Mik|+o z5*gX~9qw?^vwm&2V12|&t_m_c#(#I_dTKOU?k&_govny0>Oh+3?C@>cyrsqbAcm-z z^+Gkm`7i-FDB}^WG+|h8y@zXkTBAXQBYzv!acW4r-Z_K#%*LGcSkELOHB1n#ZF$^y zL+4#jV!7<7vTlcOWWLQre!Atu|Fa2Qb(k!SE#HVqSUV_x{lEjeMkIL8q=#`HI>trs9i`!E_-y;8&5hp4cX+q# z7(K2{DMhlux4itvjMQ4B?c|mo;zgfZFw6KT2Z`7G zY-f0kMIQuNFpKCJap)Z(DnTS|4%RaPm-T`urQeBPKBSyumNo38HqBVRhtg-;8@$t! zN*l#a>m-j+IidZXaJ*MeWF2r<=uc$>3=8Lx1JK`yKR4n^fY91*s@<&AvCPw7B7D<3 zBp0TK%nu4AjG=4Tt82}UU8RT$2RhT5jU~(pl1~F~5G*aE)rxO~*c1U=OA05JbO8W~ zI)Ld)yZIir0pPKIkuEA<39Xy#Uf@(}o{>M=_!K%Ciu_Co5Eqe(ZTVUW5YHh`<)M5m*KLmHj==8=d_R57rJHHf+VJvpDuvEs`Tu`Enyf4_!8h zt?NlRqRC#*;{d|VmZtW{{^#?yqkyE`A9&B>G;MD6`I9uyC|g_EPrU9gTTH<)tiv43 zc(=+nstid!K0w4!98NbtlNE(eQDx%7f#?#*)JK`w({S3=6UKY39}sNSHd+OX76k8L zOE~*psw!r`x6QpDp;3*M%Bw%kB$a1>+9uyln2&sf{eyE2tm#jrq|0qdsNxp^3MlVf zmuIMN*fvd*YjOE6qk&Tt4oG-Lceg(G4@<#s7s6?CGbL4obcyk*IlHwll>H^5GWN^I zBI^fQF%f_V7;E8Dp=>=u)xm!5Nkl_hZ+LMtwKVHEx?ir8SQCwiaWJ5?deWZM;7-l2 z&P!#76I1y29UvU6?b^h(#^JTSHpzaGy54|5@efG>Fg;n#G;q1=oWkvR*cnYh6QyAq z*HaZR;>v5Mz9u>_!Z!=T= zP>JlTI-dLHu-;KhTpFyrKr_YEWxQ;*sU3)E2N&LME1_lJk`AD>Us>|BJESV|6*-SE zE4-!Z?t?B*#hIw#JJb#fyhd74Rp=u4>yLKS*yw9K+`@~3rwLt*9xP`SpVyPAG4Kj>Hd5?M+)wgh#~E|R zQSnB7J)9w^R&Og@vb3!A(-w$yNfJyolm;8*yhw)swl3y8$0Z_|x`YAYC)(T0EFOaO zkEpI+6?bC?%PHD9M76p`Hbk`_xaFyR#LJX#bCc#*F%}5WsAIq9*T>vm;!3^#*4zhF z)Nn|x)_dz5VGXoKwM!W}w&`}jo^Md)_Fgc6$Zs=9``y2yJlapH!L>9uQG?|a#vJAP z0^q^4Ig#UTLHRp8?!_Ux7yhtQG&!OLQSdu|y)MSZyHygBw>2JiC{{!Ak{Yx;!>l>uUu-e5ONy%7ZVUC<}PDuYqE2lhDV-u%;h`2VwvGEd0-wPMey zYsJ0%Q0-i8VoJ7 zC7>?01M_jYuZCm5(8DMe;*iuPYVrPO@V$>_?~{Bq5LNMj7gSY1F#RPEFmM-q-i2rx zUA41p44Yk7jNqJmF1z;2NY^zdA33=()>fmIg74}(Bb{7N5>*Ru(N5Cc_rJg0iUi+U zhIf`i;?A`*6_TxhFR21;>eEG*W3QyZS3s%oDmFWEpIq+g6f>bFI80pMD*kBF4^IcwJ_M(RP1loI>|NBf9(KRZ&z8~!QFNe58cyYTS5&+B$?*a_Bw+;Wx@W|#5;FW%#thkM(kUxP~$4=VZ42sxa zbU!JeXl|=}Jp-8l@TS(n$@2cVD_Lb$6HluwD{jJRm0b~1yg`?4u^nvg`H)P+b)$YYGWXyjoJc07nXUO>~4BD z+YS-bOJC}NMta?_AKw#%i$1RL_lKeKEx|XWt~6w38({KzQr;YF-$RrExbpaqX4{s5 zjSSOdtAsKwK)v>p91OWu;P6##-vL-{vw5Oc-3sUuvh-4vez#OOH^DQIGE)1P?3lL| zz(}Eu6_D#2+-?kRVXa=jD^u1eI2Y|rassETBVNfHq{Y(8s%RQOa{PZ~a)~2gpwhMn zPHU@kLR!XO%(L+Gcb#QOFJ0^hbb93`-v1XTn|S43LIW$Ly7m7*6!LwmuM?@CE(5$S zl!==ju+1$Bj+3qT!m(Eg4cYy^;9EkQ_7GBcnZO7og>+nkEF&dIF&jPMZ*%}#BCvm+ zPBlsK9rrOi{-!MDS+n_;%MHJsU4)!pCIx3Y7(SnHRt^56!8m_{7VYU2SQlRJdri2e z+H%tRaj3`jFyUux=06j~3W!fq0Ea=}bjq{s&Ns8_ojb}irc1Dm+7( zHRMqqoz_utdb+Ao6Xy@O&uOV3`7chy2}=5|@j8hzGLqS&hYp-}6Vu!(qZe;F)-l&KIM=cSoVfLrJDQZSX%E zyZL{kLI+ZDK30blDCZ3TSf-z^5;_w!QDgi~@;fkyR_WY%kRs#4{X^q9e+oJ+&=EWq z&5b^)4wY55tf_?DBj_(VAMO04UDcFkxaJ=U;*{!1e-2DqIaj=&^CIj-moA8Z z>S4f5kGJki>eJ25QlJVPXOC)|cWp+U&L?RekV}vOWk4mHeG5P~=5$?BxyFC-zr@f?zJ8V9ud>)NI&Pq5|MjYC?{ONXg)lG|(3U&Y2-*^)3?`sW&)A*IQQ|*+Ub~-kG?O z{`wm@>CViPRP8Rjx%Aa%rCTy{T1lv9fi$N`u1m+oO0(p2&D)=g`#g4kn1#~7IN7tq zoZJ?&iXyv&GtJUE1xE~h=_3XGmJO6-g2~GE$)RJtlQM7f*sv{sfzbUq{O>P-d4F5h zq1BisY@kQf{-X-d>vUfV{~M5`e{|&T-wl=h+`*s4UTc$!-8e_&13{0sfG!S!G96_Z z=C!hcE4^}m78?xQ0{Kli;NODw1=Qj{4?zBHmH5=bdf5+O>}-Wj{Rk75Uv0J0dyY4- zVGU0`txZ02po6eULWeEhAC9KG?r8@UvcWx5SJ>Oo@zPmdxtyR zE5r4dUo*dELTV@b5oi2Yz~jF;p&syIXk#~KTW8VwrkajDwb&zPWrtbC!`_}k+VJLfF9F5Q%l5|l10Gg?1}1zT)B3=1Sn8ZbYVY`6 z*#^>ZJj2UhRx2L=>YaKn@wD6%6tt&NR1De6vCZJi{07S2&)R-+r5CbrQg8(LI>2*DJVG@uX1%wiT}{wVfg!o8EmT?wU(;$e=yA*Y9}t?_ z^#NB)^%H6@4N_2-o5HPHbT^i$qn@OB0Ir-OI}sRqHE=nH61rm%`f%~&<*$9ymky1$yC-UmJ|ynNTFSrx(a}XI!gg@Qekzf z@M~6)2~QgrfXXFwNP%lo{q(To<$jkC22zzzvqfb{VRZKZj#y1?9zE{(b)I$w&h<>q^3J;ft4FnS zy;m9Un^wNOn+9;fzXHpi;I)kaS?)2AKwO|-L)HF$8G&$R**!pfyK8k@*3O=bgVaR@*=B{`iu8Is(9ar| zJ@Q8KrzvEhm%~LHNy<kCm`eU6`y{2UVE|NTaY3L{H$wRCNZ#$00dHyF1>```(;;zn}{!HN!W4Qa4_xbdS+0gpiE#vkPt;+a~iMUIU<9Ggl{S^sBvH)&)H3u$CEnDe+E1DLlrzni{ zh=R%&C7@P1&u4xa`Cy0R>W(}qMrp6c1MF_zwWy{rkX`pBw)xu-5wj1%rGmg+ZQQ4~}?R z6v`M-)KI&aSZ0k`P? zz$ou?AkNQ0O#ka6wla#~m5&!ef~{l@Tv|6WwC2S1=XCo$l}i$|g^E89Rs5HvmQ3>V zX}mr+H?!2E{wBeXH;}^sAY`0n9!VMS#jnY?4#$4NI7%hmzYNX!+ar3G9sDzcDkCD$) zHN5vZI_KxGq5lnmR)ZV?XXQI0zbKzvo=22R-^pKc5%BhODlLDBAU{_aIr3xV&Y_kG z%FB3HXTI-OAXUF%1$L-AZcDvwuB^9GM2Z8}e&sJk`1Bw%en1Z!#*IB$LoNs8^`8#| z%ACM3BFSu-q~cRrY$94aO(1{^fP8}xRX34{(z$1D<>Bnf@JVX}ap*rOHDndA*Q&kT?WkP#}{ z>cj>pe^mtwD-33&+Jiz}Xr4I0u|n-x6P`Ifv_=<2AOcRdMs{xzrju)i;|To}z+0I6 zhP*<-oH^VgneDQz**jM4UdKU@Zt-4HHL|h-&Jr~z$b6Dn}^zz-K%ApkLX(r zC(z6BLr*tcXil7exqEoiED}8DF{}!DkN@i?-NSTDo_BAyWqAOa4E^PgKM)y0&(-Je z$vayfq&VkJ4P3=pWC;!Uz1B!ui55gFAQ63`hm!-*45(nobtRjafhRH|y8T8FjjBOY zPrJbO)uf}_`T66^sgCZib+mRlx@Gf6N}1!KPW_~#UAYyn%k!ZQ!s*&gdfq~;Y6=S9 z%qcMycHi${5u?LI&TPX7W(B010^^*vI7lhN@jv2m@;`=){Ph5i5E87?t_6$WUkjsW z4po%*sf;#`BMZ?h4Y;S=syXh-1PW$F(bVp_0IOF|w>j-G4lOX|Qv^8M(>!r9zWkcLEC?%H87)PnpE22h>q<)t-GU`d4LL^v;$G**KLu zT_1E9D=azK6XQtVx$+Oc9-9(oSi3%XJZaTNN^BJR`sT~Cz`~XI!pN*?IFd(ot^if>GRk^q~2ERobezHjZj1^~W>>?6s zScdD%6}qA!+g;f9s_3BudX^6Wu;jo9HnPq~-mnns1^3wifS8fcvUYmsuf)GZS+S72 zrl{6SGdFY2Un6+Gq^U`3vS1O{)z65qwiVODf%pm<>6NKqimjYMDnt8qU8B&XBR z!#cxqta`9`|0@o_f zLwfNMhO9zk%$6g0BwbEfg^x=Lx!uYfKJ0Nzo6Oj83gHr!c)jStb$D%bz01i8$Yb^# zDQh0Lm^*uBAK-7#BU!2!{JCcc9wrD5Q4HBgevE1jJ&zBgh2-1Tr_>m+Qa6dpU%XE> ztq=v;B3nX?NpjhEC;N!HgGx&SM_~)tKs;KNY5&AiwkVhUI1AkMIwutPq z$8qXDYJhs00~a2Q*)8c4mz?I2_gK1Yee0zNm>Sx9KUiah!55&6se_n0vE;`Y%6nyECY! zhQE_PhLJH!g;_68A5y4*FeSWiBR#$`#>;RHV;H+<%iHFC*NvSa&UD+h1QF+(C7O_~ z4{?v#Ung6ApQ=3o>fkKfD}|u$jrpZt z(OgWVU6ZcJpZt293clKMVhF!}q7%f)zzloqmcQ(Zra|SQ%#sle>O)*$SvlU#!zT>u zj%y9rjX;)y)5$uo>0^L5^Yr8)oJ*xx79j?+}KUT*Sl|#dw_-jD=t)M5l0xA<0jWj?YB6LPCP1m(B%y3S)_I$#k>i z2H@@*&So}COy#(ip76asUG(+3%B6@D=}d%Q3Hx2LCLHr^*}45e!`@VH$YZgY*gDzqY>VhTtVn^=X@)oO!ga916-HHi5XMqJ z)de_zvE2*sEp$i6D;Yr>6Zr?^o&E5p=iZwR{j7zS(8u zHcdH~H7U}8kn;n%?O6%~YOVC-vYznT1z;5cv8?6|pX2tNd%ZiSTSjhstcK>!08F}Y z+cGU9TK9|kOLsXlRebOQ=E>T$#LG!L~Q`@BWfXPMS$6z>+ktCmA*r;}^a`Qx5CJqACLbq;C&; zR4j}gf{nLPZ$CBZPZzCNAyT zPB&p~R)b4lwsGTGEokKew@V5tr$J5zdnRTCaHP=U7~;!2ed@`26_V>K>_s& zAFJiS*YM)^*bhSz=PDaaOMn>iicG-c!ZJkIX*oBojhNX4&lbl#{|iuR$HB&@Bv`&t zK~!`t)+KTPr!)w%{urt+KZy9jrkmF?ttyboIlv(K8|d-nr2*>J;^uu*iLgb%E-B;U*90KZm46In-a4amgoOUxcp8m4n;}aPY5+BrZpL)|DUpDjf!kiw11Ii|9wwuVis&XEqm-vLG>TK}FMqu`tiUJ$4M&3Jl6CujH#< zeEpKZd5M1q-^i6E%_ZpZ(M8O@LdSWIz;X02X~xC1 zJhPlBH?)g>ZSZTMieosNfPjuvf?^#4XtfQig$=(&`DNT^XbspmaM*h7DI{B z<7F-G_rgLYY`lh}xEacv@kmShE?Ntxr4B0-ss}|_&z?BCfDP^;KMBO{xQ*PB6a?-% z`{!WHZ*$v-Q`dYwIgGq??Auw`4aYL1sixyXf2w5%g4v_cL{4Vs*U!S_R}o7%GiI^I z@NUVB1^UVq>>0V*faXvvh_#5;4A(--M>-UHnk}p=HCq@!Tp`7^ETBeTk&|hH5)Ozu zK?*Ed5L4qD(W1#)lYHxQrlk%X+k%gqC~-6OI`aauJypv-@EVktsnN)G5G2kh7^&|k z-BwpA2|_pD!R<18$ktr!JBYTMuaIy%XL@PqadOha^O=`K)&O>e7K~m?-HCAp>pvK1N zDV~Nyu3Qs*gP!h*ZxHq_X3>!iYx~e3(&FUA>GH+1^9Lu{@929vYD`qbXkEgP%53?q z!n~ko5Zvu_@ZrC5jQ}{fjc-`&W{_&j@7HN~FPhZ2#1$$A4JhnR!)Xk9+d#7tYzG$# zQhSx(QiL9u`PTR$+e+10{af4cVJWM?shmxEn4E;buGoeMJacI3T6f9ybLhTU{7zgD z{}EGe$?#M50`RAna6_M)MpaOqE;SEMC@IHFJgUCXx?$%%LTqfK z4_RZYf~ps7bQ`oaH4;*&MRR+&&!I_4)33E0EU^tO~Dm#`xz4C0UpIynkA$6N%He*I(V^G_Y(tA|Q1z#H;t>@H9=Ei60HQd;~2CQqU`{82n#z(0V-XyhSvtXn40aP@~ zwY%R5W}bv%6)~&)kvXr6*$(Fh=W;a~B=bchu_6jgB);sh%gm2o+~8Q26GOn&s^~r9 zw79CK!@mxK_2bF*yv~`MzV_c~itUTjN_qB;)?bLddpLt_M#JSiG!O#ArQWczn|T2? zZHTAC-ib*U^HvBr6xGp=xQFYo@{ew(rhVMh*luthk{THUXnHm^siLPk(s99T(j7AA6 z1EB-kh)I?$`jkkYYu)ZPXjXk;!`02O?nALd#2S+S87SopX$R=I0;xgvir`9yu1r_9 zcH^Y92f;z5V-)Ii4eI^>WADwwl1}5k(V7;gsdSpAv{aax#;i=qDK!9KX;sSw zi*es_7ZIqjvZj=2QOk|WQp*KRh1|e0C08^TLeVxBH^h*-{vyp#iKl&&lp04N7S3L@Wus*vvRY zk7nyuJ}6opcOQ(f*dc`|@w+uk)2X&gcXko21h~&4&A~qoQa7O4GJY&I zEm(f|CBZ6<3Mhf2(fEk?dyPK22`an}?Q3vi0Hy@h`!IkVJ&{LLPe(i<%al%;ap6nKh>P3J1yL<)_XV>-| z{DN{A8wA(*fzkF)*l8K$Y&wbVhR)_0ia38q!t#dZne@~v(>2nbWDm_TWi#D~o?m6U zbQvY6Cw$WzgG9YYL;U>N3*?{WJ?{J|g|EL&W1LoYDm|8!z_kWS1cBVfoK}nAVHkA# zfNp|pl#lRdK#|Rwjcfpd?qf4BBL~YJy4KO73&|d{1ahvDzVOVpY5lM^=F$f_INC9V z5Z|kASq&}@aCed27C7BsU+U3ZiOz_a;rV8rnnIG$8VKeLa)sP(GzKu*SMaj z)-hpXDoGeyvKTYil^gsa$9$-FLu_d<=bk@e*WjUU&ZEV(P!mUikh>SiQ9PA)JjA_; zaO7KdZH7}7vk0HaCca841|@NOSz+YV=4B2SSJqU7>leI)LCPai_yb+Tx}_!QE2Nk? zEq+_kv?Q@9Ko>>#coFwl;-bQJM`}n-lS@Ti6}lZ%&|WDNB8&=8+Lj z6wcR00lr!^lRyRGH8LVs@>KdN2l~=kM|Ca*&u6n#IBSDZqX1%Kjj!w(D4Q@k$gZ-i zY>ZZR62TP_N;rHE!8w*F?`h3|wzw{Nb&1>|l7l8;NyzVTacB0HYzjZ$7U5L`Wj4@wkP+Nj2U75x6m*DE<2QtS~C9WHq4ega5Pn40(Q=< z{SZ9vaSkSa39C=NbG#Q?IC&sCM^c1qGjPn&wUz1Z`2tT5sAfT~dY$CgKk28f^vXg& zg>iA1v8(U$x~6eTrDx;hEu$<4MQ&8Y9$>>WV)e8%wxc+KUrhu2GEjLj?j%ay1>YyM z_d8n|B6Z?gbza1X5)W|-v}rx9pAEVUxI-v{HplCcd#Ps9D9cn8mp`1pHCVTZ&@Co5 z$)uH*AMEp~uO4;v?jweQTV8YVSfKB6nsX-{I(~*7*I@G$F&48h2J_j1lH! zJp~1LtKl1gqD2Ikxn;RQ&e(ynXNte7hDBaj((?P@D53u$At8`dsH&9~7?)dtL`Jdl zK*WB@a{E;X|H~w5(hfdT*hbRQV63=-1b()E+QBjD9bz}9JoQ}>el{hA&+CLjubDgK z()}1(r2VzCmohM8DAol&9mM_Qa+edXlM;L4zQ=NfBriyqCyr-ipToe;wlkk-#-bbL z&M(I#eX)MBYL<$C2O%6^qqDyJ>BPuUR+Yh0qRF6ALx}G4Q6x1y+IU@PYL8$V1Z0bQA;}zbDpq(n|d_)ecvstfe z%Kbn|x5KCO$o`P|qD2%MT$_&dkNbuV4Tvb*0jjT@PAL>pVz9cV`lXxwmmlSw+E{R!$X)GN%hgE#^sPzJ)Q;xL|rB`yvFYuaai0XP|Ub;*95Z$4n&TvpY38T%u+%~RwVQi06 zP~+KiyW&}doeZ$+A^O@Sn~N0fLMlo#-9=p0Q4Y0W}s3$v? z3B^#F-s-wEcQkRs*}8=n(m+VC9i3>Y8!+y&bJxxai+a{4J-SO4U(il)T`JM`sJ66D zp_=hcm$^@;1gkQw!5@6f&y~az3+(9bu=0oMer+^O9mTw47~MO+=mlwxaOPVE1xG_Y zjQuZhbRsPeqPR{iN?nq>bnc*IQx(nui1@kLi{)cljZ~e-$o7Iz(3xx%P>j%SB=kgc zeL0wp$O_<8YWh*}GRKaufNC^MhqmR>ext%>$cE?ivc37T{<9t;LUpgBrh+X*1s}4E zF1%jcWbLDtg?)#HJU2_;T1eKCQc2+F%VXyVOoN#|uCD3QhcK7uExN-pGw?=aZi!=e z7ZvLCe=DUVna;U~uV`w_+XcEeXi*P=I4UT{dW;IJP$cxh!ba8g;6|gU8TAxF1lUDS zd|7TqPrj&&VCaxm6ggu!65M;3sy3DO3PF2<^J9*x8_el9f=@RUe{HXo<#m>6zewfx zzzRevAYpgsgpXVb*hTQzYJ>N z{?+w57w?y5>b~@BF6#YJzW5|t-4gqWiVH!Vo7?rNr5%nyXrJQxr>2cCSCvD%6w})c zpf8%VH#A+>4zsi%h#A+FT|=h7|2~JtU#FGaUNC5Vfpc{;kd3LKHi2s3Oy-0qn&s`d-QOa zcPA#YUad07Vt^%oGt*ei99&&~Qh13~UgcgK1f3SG#j*v@@HWAa#HBO1YXU@^Ac5cP z^+tluW-Jr%dyE>??9Ne_T!X$~bHCnM-O-Wu4DLROCdGkk13;&uz}Q^cb$$J|u9b2# zN3ZKE6x{&@IqHwhXJC2VQmU=8o6%VpNPVNdERq|3)>pjBHDJUcVy>W;;gCwM5Y<1= z{}4>A%twobop-ikADF3R^fLYen2&scTYA7B{Goi?(1(?G53|puRe7G@DxBrfh(=BG zDZ}l8?153-7V@(ueQ+x)mg(H(3k$Fl1~yhoiU(l-K3_bo?rL~w z+T+9dgem#(V_qjJIDxy)XW0A`xYJIEqg|mz3>pX>W8{ z3Xg6-1VlKk?u`L3rNC;5Eq z5@;FRe-kvQpJo_N1s;?`Uo6Y#)8pwDYDj5*JU6N_kgn+x63`(`9I;)-QCQLWbXw%n zToSI2?(`?TtXQn*Ooy_mM;UXumS%R~F0;fxl%id8sb7(@$QZGysN5On9QiJ8KyQq# z&yVi$7k1*3zcdF&M`ibLLlN;pV}6qrsu-=80w_PmK%x54R)7ut5|?#WrHFJLCE|Ue ztPrz=yzNVUA&J4dr&Vp(qmdiF|V&>AiaHv5F+r@EVwRHdR z)fSc18Sc-;%o<^*W))BVEQ{7)p=EQ;;hho<|3VGpiV;&n;WK9Kj(m&pxBe0XRWAL> z`UFAFFE+W(g>m9NrS+^gi*EcTc}Xv(DpksY?op3n^x%&BhwT0y2AgW zBDN_=kO5M2Su?egRrF`FF5=ore`Y1Xy3WC%8j4ervO3PJ$qMk7U`G zo8AUTM^X}f%PmqHII|lo#O$5P6u@9bdT0s}h zT~|0+mP12^jl65L{;gC%#KMxzpr9S}Pox>A5G+k9O zg$)RbJp;xq5sOZqPDch`2iVriV`n6~*_@BAY+mPHI)b?|ScQ5S+*h-t`OHl4ur}!T zZPT?G+WpJniy*ZLSYOBKhukuKR?&qH$a?suFh~6XjrxSe&VEohpxXmCJcn+|Oo@1B zw6k8;Ta1T6i=QCQ*n|QWF8Qh1M7#|ib)FYDcd)ap_pmFL$oR3RH9+?l%tzhNpP0NZ z{JV?8#Fnhl+Of<0>z?^uZC;2`qWDch{65P?Q02IDC;>HkOZqz4e5^8$TFR2tu8RbU z${ENv;(GocVMZuV$LYtDG4nMtqleB??B83(jW{M8EN9Pfetw+EcJ#v|$qrbr#wdH!#P} z?veFaHAq@UVmtME)+c&@j=wxhDiEZ;SsuJ8_1G2C+gDJe^p^W{=AvgW21(qx+5+h; zb;%pm0`&LR5^F$Kl4j*+DPu|Ol}e^r;X?_5!HQ=tF#2_M_O4voZ`j%4u}G@)B<5WO z>i0~s!Pn4YGUvSiax^Olx>I5Y2b1!z_OXM2@JygD#?8@mL%8H3K-My@KeS9ZE?kP@ z1})3ZDXh5-Gow;1-q+tBGtB2Nh^s4+`cxkAMXj-Zn{3i>Mli(T-+^`1EY~??mE{Tx zlEi1^lW0X!#9okEeYeXWw*=x_NHp;%nneSq86PgU11eniykW6sX{yj?cxn>u{moN)={n3M*a=Dhy}$ zVcGGPfF(9lXBp5bTk9VgLq30wB}|TDFk=-@;?Qw+_I#bxQ`^xJ(*+UGk*S6JCXZBnT} zm^Asy>8_)Pyq*Y)E;_tU)SZFi+LwvaFoM8o*i7>_2&I_aGMVvmi5pfVvnUm zq2G4OK%)GwD==IysV$+W#!t5sSZGH;A1V~tMDxCZ0{Uqd`cgLtk?$UnLA1Tfy^5C0 zY(07YMNC-paCv>5uO0e&FkSl5_12ez;$|<@X{a@H3VX~9n?BRdbnu_OUCDL%u&&b(5Q~&Sd3LvEj-CyV0ER#3<}9VXxG)bqwD~C@cpT%uGI~ zQ-{7=tq8+enn*UZq|IQZ?bAb=r1DgC<8s^9&1!ZtW>ubg1emOlJAa*hm1W+VgdS^n zWj36;EMH19>S=F6=GFQvEk8jtH*B71DV>%&c)-Fc|Zi+Sc~mWflBaj6Sbo&%$3< z`T-vySg`tskI!_)MiC*v7OaNB-K%>q?q8>SE0#`P-_YQm<9F8HT=Q6bv-wu9@Gohv zoW|0mpa#@x;N|y_VV9cxTax&Y6KasMbCKV45Zl}|b5D%m`{^onzV;KRd&?^Br#ae(az#$eQrhap~>f&GHcL zho4iRP7A^!ZrH2TrVIyvDW4hl6C}|L(LljDv2om3Z;8>|KnO(>?Ul{N2yXJL$bP7usCX>rF~gw1_mZ2l_6wv^-5Ax7O8|3%dlcFOE(rC{Ljk>3rD ztWQi`W!#|(o15lJvO|yQgExK&t&}Hej^=bi|XxP zM-`Q5vbHYSzAGuPAhOIa0MNh7B9b};quUBamC#9Be*alPuQSw(!_*=h26BU)F|Wgd z44_D@^VOBWn!YYFK{O0JYj{UBg|Rxr?2vd5SF3G;(W;UJE=E>FWgD{7 z01!ireE^2{yhZvbfjRyc3m5T-XnH)XM*D@VGJZGAE-_=LRxPf9z^D%Qu(;JVYFmXk z1w9=i|IA4J+CZgzgr`4<%e*=*VySBAM%QGb{UZ#i7)MKzV14U9AJ>)nUR_efiiW7? zIG-f=>rR&*Dv(Zj>0B%Ih^xSV)^9C@vXn0cO;oR5klh?qeFoI6LVK%$`>rXExooI= z8>@d$SQy$fi+n}&U;VE?8$E#D4l?bySfyRpxLH870!8EUJ349{{N5F1MtUx7X%ANc z{q7~KK~%N2el8Z|bF_ON$zkhR^+6c$Od#8pbE_RUpzcEDILr^f5)#%7s{0&sO;Uw9zys{NS!nRO6^*DbQoy4gxHq+KxX45r5g*6q^ zG8&uQ=uFQdN7%qobjvQ3%FS&Jys)vp8@GS=7~b>6Az*l_BC@L@uhSGH#%8QxCsWwX8_*xH>PKV%##=cCGP}sJ(~a){vvi`Cy*XI_ z9zuZ{4V`%_y`KZ{9xN_u!-Px z^oJlPidmxYINz8BtRR~#bc|YkQH?9|%~Np7>f>Acv@t^8C0DiN)$*BDaeDLAv zyH+p}c5wYieO`BZf?f_?y~ciyx2Y}=*08&J4;SUfw0G%!ZoBXX**weyai#(2m-;<+ z*3XpseEBArHC`{eVEIKflxcwht0vmj_vB1*skWkX*{>1sJ-w@Z?3_ zCu_E8tt?kOmeO8nq*F}|_{38;9wR1wnGLUOuG4LZSL}ylOSyRYr~cV@;acp%)?G7C zE)8u$Yc8ra*+I4}i249Kh|m;#^2>0t}C}Cd^_3jD$*h*;}KHED2I|Z;X8Z9mOLK}_v zt%LV6+raRB@o3%BoxJZfuNAl3l3Y_;{Au7XSM3B#9~)Vs$+GC0`mVXJAMKkIInZE_ zKN}|`k5$o;j)ps_kHooCK`%t#XRgk%zF3I;kvu!Tw6UIp3P7LV{HL?!KIoFnICa-+ z@ZTRd*1LdRtIeBW7O~hE>Q3!GloM@0eq_;PM_(aqX!X9l;`$+^!X*Ilx$BAp=e-K< z^pO%fNJ(4(?24%II2#XROc@6m^dk_$r7FAE?19k-#?uSA5=n^nEm+0v-pgW zA;_WW9~$k-8v|+L%g|H}NuI>oBpkaK9xftmf1&u=AsX-hLLryEwFMxg<_LBEep+tN zhx(w98DMvsTr-m_HTS|%XN2xzw4&{~S9!7MD0Gp|f5tPNQFr3&m=7MnI@0XJN|vha zea=cpzD12)=DP6Q68$De4Dt6eXo;4d#%{-Jg19py;#}5j5V#?kyRSWxJQ7)yc`xbx z7q&F_25t7X<=z$@_XB6=c3J1No}Q1 zGuy+)0K^Agpc_;*lu9o063mZ%*I0wCxWNn>|Mo~-=!es7K-W9Y~*a zM`9Ot$ioS)m`?J9T}ZiC#~znY0}JwTI}x{1INMwat;C34su#^ir@hcvI}=$nt)5Y| zHALVy>zY~B=a#+mtoNcGfkTQC{{n{BSXkh5&;T+siHA&!L!GB34xyZv`wTywDX@Kw zZ1mBVrC1+t$az02_nDC;mQWuOADn#35jL3@MwP&=e;nLWpMpMb`F)YQnIR=v{0*5V zof)wyZ8ux5b0Ma>cD$=Tipz+9De%N*rrwU6?Qu?uvMs0%h|!dCzvqRjnUU1jK(E+| z$0DBJ*BA_o$zdhwH{RDw|KVQnaTF#>p-fQkMn)`$JI`0@9mGnoCwrkrW!qE)5_Vg_ zxHE0?S2{$>^85(|<(Hw z(VoRg85drNwscmqMt-}e7$ioDqxFU1*WgE?7?+BN?v#`?jQak&hk#R+pr5;WH;*C9 z5#{j*)J4FXzuee*voHnyHle^r5y>jD#_xv8jqJ7~lQFB%+XG8Sk1b;I{|7d$mE0Q% zo%p3OQ2XZl;JqA>?LI(2e>4*bZn_l2@DPF5TVzPW4ZheWK{eIZ=5^;3zg5q?@aY~W zMSJ1jy4_0^+@H@$K&Z&h&pljdtbxY%%nuzD48CgD2~HH0vb!z4N5pkzYqgC92GxI? zxX#>v2_*py21=V}FRAA%c8P8$%};H8@i-ykM}{%-eA^myc3~|uKGZ1l;O)ySrjHP| zNF)(l`Y>yUljy1HhshCJI%`?Hb(HRf@Uw;&T#x7ms92KBq^ZY0w2|@}nXE%ft?c`% z3Rl&Nsp4BRkAt%_C^M^TG8}5m6U`%GR1JKV0DlsYGkboAK_S*&x#_2m4w3ki-GN`T z(jx5MdyFO>tYIr^UpZeehzKvNrPE&l8Z!`_V!)3G9jj!Ybq+^~M?XHPGMF-)7 z#<7jlkZb~0@N3fY@;!~h9B$~8jY|=Oc)Pyl30*18E!mq`gCuNEX5z$;M6!$veOHOa z2yVdJfj`{U_+QZm0DSjb$86=n7YWV2Yl2wd2RPJO-L6y&pHr8GEm3y>LKlOs#Ws+ou}*W%%~5$V`qV3`~QbE zp{Qp_1AFqxKDq7u5yO@uVH11Z^w9S|o_fi}L@-c;2f7>aBFaRj=qgA2=gdfDu~T%? z2j>$bx0B4aL~3RBlhuRT@EI;^ovyAaEU9&N1{@RNRq#dVgJpk~B@Q)6g&SU&Nm)c-4n>3AI!ryg&bhswY;9Rbh4X@<}Xt}&>dW&J~BCz%iA*kAT(?_IFEN3mfY-$f4bm+XIZJdR6Le974C2)UI zFMzyWf(v~k5N@EfuQ%0DO{sC3OrrS0S&N2go5WB4;0<-79y+{Fq|I)_;TvgfEU%%Y zoe@C8s`krlw$4iJd7Jb$d@`fr+*ML3Qqe?S@#Wz8}-QCk3V9CH{LqgpBFA#!0Ak#!^{Cm zzkbpFY=MO=x&38)zZS8XQ+=RhO#ak5#~t;w)MoLB4L#rJI_P7@mV0)}Z15?7d)(@J z+dr#!b05&UZ1HF0awD_Li3ur>*j%`#I%BB?I&yi}fs!qL$mD0bR#@R>*o`$%O8BM^ zw6S$3GFfCuOgd~B^Ldd>gPG8hE-fcpI-5%f-ideF+wt@AIwRk!4d&Go&RK~U0@9rw zo_{=vR!;+~&Lk`kh@9Ors}6dM5g*1Cz(x#TZ5PI*PEhRU2sj`Ym8e<=t-cRD%;wnc ztH`;}GpxNYqndN?mo<&Bb|t^SO`mH!887krW^r!qqdNwP9FS^JM`;V%zZ@yOsQlYq z$Lv%+=cFUZZi{Q02mQV5Syy(MB8Eh-E+hutPUDqaNb0V`b1ahfU;FmwsIA8LsIg;w z_t;J9&uiozSNE$}!S{KW&?y~1>0cIDrrbBLW|h?l9~nGhR)2Gk-!2r54%JhxU+tnv7>+SyF5)J#ku}T0=@jEjd(9AV2 zE}>TA{jok6ZD{|ZQU)jSL-LxeFxc=CKhJ`i_wyV~(kRrXQff+if(c30lpXo8+e)UK zTi6V~3?)WgI~pg!&dLGT%ZX9;`8y7;kHb}e zcA9)Z*qB``dM31R;I8my2#aD8Ek3R_y=Ljb)xJy3IaXc8KFryfHl;$x*laKFz4|SQok^O-pht$Ye!E02 ziFT#)PkT)8LWIEDENJn^oXR#^k#pUpbAT!nnit}`Z{T;M=lomOuh^pDj zZ>hZdw=7=)G>JQ5c3N;o1R4Q(mQOA3o4hT_YxmGwJG-twR`$-gkZxd<;glP>jHcGfk}hFonHDoBB6bF+a2g zy6jyZ9fFk_BkriCW&O&05Ta05C%zT*;dcC=JEp*oosXDXDA=wcJlRMe*Xx?w%#yd0 zQO0$rQyoR7?F^IVKF65f3Lek`LR@tZV1RY_=x!4LCzMus8sf4a=x}l zO-GFC8i>l}EhAW2#q0w`aok07&(Y)Khxuz__opMDJK?u&oOOYEUuq7vGsiW*%B6i` zLLc%TvuBye#8;CG;f*tBYAtU;qrP55%OJZMv4__e`dl`~D29h+a1E}W+N{ia<1!41 z^1|pyM{~_@F@p^;MVKqp9%LC&a#a1^Ydg~t8NOA`L34vFZ)`pvjdzZ!&LD~)+gDQ|tq`2#jgj5|3MQyW=#r(jMvl-U2YXZvK#2;oM;)*$GCOZom zK<;E_Pdz@qtqi{v7Y@~ObR#;47p@jb9Qynfv*^`kaWT%r>I)<3+=L+*65}cxD5C7l z(H>m9GT9Y*@-z&ECCChY@jHu*oh)r$$-ZC_2?41Y{To+iaW87qE&Bx!YNG$&CKy@^ zo}1Z-<7Cd;odD^9-~RQcd!I1X`Mb%IOmU-d?;-pow~)yq_-hiJ+ZOwicl z14)1nm9;4R3+DrdJL)cAj%L3|@Ui>Km*IZZEO6w659^r(@-fO~vQD10B`=;6Y)Tq9 zvx{`cQ8Ncms&!|}y&IJw>Lo-*4IvZr()?mYy2xQ?kYxtvU6elibrv4Tj^83JT+l+R z8@X>PFv)kT%wLPom`45qf~Ywzt)=$3~2! z1FAl{L6-{KdxowoO*E~?q{*H|KlJD*n&>~K|5$wrfZ8c5o%x}(b|z#$P7t(}joMUG zz*U`4OS-GOpRpn?8+&Y`-HDB{f!P?nuU9NahQp}QO@1}3$%K2V5y6^h(ng^V3>)dy zRj6W~faA=h<`k~(Wr|Os|)y^nOaUMDOCB~v$htAv? z1@pvsS*LUZOr}0?BN!MopbNMqlaB-}r$#`BDJjzA#uTn~#G9oTk(4Zq!aOvOXK-_2 zO(cug_FQjD-xkwhGQo1&wYVdc{h)e@6%*j@WPyJG+p7OCNRE+~YG0-1#ruzd?Q7<7 zD$hm{d-|~({m#uF5<`|6aavPFtq`unX|>LZs*$HS=yPZ1k-by+k{&sw8Ry(owrJ7SaR?peQh=b<~2W(t{NP+U3lgvJ=wSYX=e2U*mHf~PpyxbBQ5YNTzb^!np68J zz@3$tG-*}By)5u|D^QKp_hyCq`JWAiuLf;Br6(VO{Top6evdGsO48(GzZu(A&|1U{ zYR`Y5`%f-SI|7aveDiwMxXH84mT>d!Eo+D9MaXi&l~+-Q<|VjDYS2r~a{tVq5uc~L zqR$NZ2cf=pj65wpIb|ZO_kNw{N}DFs&_mN6z<#B9)7#Fn&73@R`4|t=N8s}`zqjbS zf2ijfZ-LGf)E@2F_3Ynh>4lVRJ_Xodj&w10ONg5~tcjEVe}NRdabTRsx90=WR#AYZ zP|F(-Rn;o)`b%D=s{@K6Z))qSQvuX!0v4AYDP2@1j!DA;Ms_E@7dqiV=Xxe&XS;bu zf#^rz5ee&v@Ef~T5w#V4PzO)FtC#$*9q19#>biNAX{6NxJtIrc?|`sXBOyM|a8c!Y zNX?yI({h6KjV4Zys|V@nJ6G9{dQK5ct@NA&9$Zz`Px@6i=B>xu__OubGDzE0f_Cj^ zS?TCssne|{ z^FH>}x!|)%ON`bC_3LIv8L3L5Wv)&f{Fvhd!0ln_p}&G|Bh|lvzcr2WFT64LlsIvJ z&kEU7|Ahhm-6e-E{WyAW@lD6Bd*{frUKV(>`uc3}S%iLE_w&L#b}eRsQw05r?t}DW z35I(hRllxY&;OvASQWXt-R`oy2tU6{#q^9+?c>l}=f_M`r&kD2eJc@+Cr53<>{;PE z%x#72D%jx`2#ym~#`uZZP^AOBxIj^Eb3OIwz?|3J$FUi=T=e!BDOfE^gJ zrQnC0Yg#9R2Ll!h11mIqtI7d8t&sME-pGpohvF%Obn2gh=v|5ay({B;hU+Lgw=(Qs z^~P<<3VAoQ7I=>ps=wAd9|ix~5&z|5+JVRrzk>8X*RQ9DEnf%tBG(L^vwj&Ww!n+u zwlLfP>`VHG?8w-d+C0%;@$wNkxBq`~bCa)Z%BMMH@tVJR@10-2UWeQ_Hkp&B7jmau z?!RVR?LFe7s-do|)oww{ijF#?pQTl!p9q?jnXq#-Ah`kb-}H*9FIzhc(oaEYhhvqW z{-Tw6xkg$D)=$>NQTN{KD@twU_Eohnp=$k2Mq#mr5jkLg2(BdTq^` zx;6E-`|B!8FEB##Z8l>o@dlFazbMLbU6*LZStBZa<(Qi&ypV?a5<0hy~ zI4;WDgNmogu!CzOWuNN9{m!U&p8~Mwn}BvlSxxcc|6g}uxo8ovzIaQeA$m18{kLCY zK!!fqW=I2Q#YjLN^ z)2lzlU)y6jX=yM8Lw{9ZhJDZ+pBJBd8afs0zk-Mq+7Px9u8T2g?jn&bLmArMD@~Yt=$R~UryZDcfxy_148yWJYJuH{$MA1+WZ69PsV8&@5y!-{eA6jfIGgMhAD)dh_0ik}5 zwf*P%bJCLmO%wM&wgmvQ>to;@yRQE)xG^UdKs>CTt$|jU|6s}a`ACSHv$??Jw0Q*@ zeeV^pui;a1tA#LZW7F=)&=Q{Bk{#F%M9vu0R@P2m?PwVNiujw)==5RQwVB#B+GEw~ z3adyb-#3+{mhey6iB7$?Pn{y?ZHuu-gs1WhbIQxC=W=Ub7G%b4D)sP5{m<_Ib8`L@ zIsYfN`cm*_wEslZ`%AaU=W-)hwX54N=ALHTk6w9og6QqYvX8tLlfC;qIfLZ=y5GvP zm*j35kpFVSP-KyHcG$vSSv8RZ>rH|~e@$S8+ zZdp-}r&nw~s8^=i`{_h~1|!HXa(ZP4?b?djw^ScHM*GSFAJt?p40GeIG_6={E%YoN zWV_xXj*-+w|Y*h(`+^$~rPnAp=W`iVSYy8u30wi;Nv_pQ;d%O@%` zO$T{TEvfGB2e4?p`i8cXwx5+wxp(Xur;QB%dJ532SK%v{pX?}d&^yOKq|e5^ zsD~1$r!8p2^MN%bG@JcWAtKtCnK5>9$Vd3 z+=ew(_^$j4MOWyRJ1c&{DtXM4nnkRm`~EX4lidQbi6e19C3h@Ve2vv3w7}kBHUCic zu@z@xmHKTrGliPJJNqBEDgc<{_%B4PI4G-T|2sUivtgp29MqFL(z@Dix7ix3zIZ3% z$}cSjyQfNU4?(mM&k#2gnBdsq^~)xwfz%c2>TSf%f4OXBMSblvRzueh(m*R9vB_({ z23#}4%ULnWa@>(E_|=Q^UHTbF>ngVWOuMF93e*qrUEqMpoW5S?@*DjaKEDaww4|@; ziCrN_7ao9c?|pUgu~qG{iBqn5FEhr#&7Ppac3M{t{tec>36LR53;er@$?3Y3XZ8^PDC~;~+sFS~KlD?!J|S?Z%(WRK z{bpU&4PYC}&O~E|G)?$k^`_T82(+r;tC!PcQ66qu=mp;F;G?@?c-9b~W$t#GX{nlG-yl}Z`1#rBdg9kRM z4*0L&?Z2^m|8DTDXV}o>c8_dNM{ZQ_ihUe)w$b;%85>>FwU8K1Z&S@ zw||BsukJNF{U2@U>TENjP7CA@#Ri0Pq8oxJ&r-LIZ;(ix) zufEysqWiuv{x@=l;{Rap&BK~nzO+#l6%_@Qqo6?0gMx~JI4}kfCsYoDB7%%!6l4ff zfDl3w1U;w-5m8Yf45G~Q5avmSh(N+TBtU=w0YZQf5(pvTZqBd!>+$yO@4MZ7pT1B3 zvG=pHlT_7SRke22TJL%nJ)Xg{`0fnqN{hAq$G@0xFOCQ)-+LNcCQKu*y9PCVlrO9{ ztsHuA-@0eQXK*rYz&_3XFdj^XF~cDQGOzXzHBT)}HWTsdd+$Jayy2-U(1Cxo$j!+o z>ny+7ioezIuiOw0ECu{PpJ!?#N!dz|F%Xc^LOx`emz7AX8t#%(z*_iszLkMa6@J^j z(}VvV>f0nJ5Wj@)(@OQ53cl*2Zk5XR>L(PoSUL};>IXgRSigk*UW9Rq6S8gjhz^#2 z57($~>+IVczepFHR?^>fq<-z^hBuY&?7V<)h}@ar z#z9k5H!dXbw;KyT8^J-FuJpLM@k9Ighlm^@n>05*iPP(yc<&di4ROOktewSAy-+t= z^L&$75U)SgRi^8Mc(spzKl-0kPROl2PL#jIgQ#31D$HG5jbASvxZA2Kx^uo%^#y6f zTc8YyD<~N$fRY+0L%vP>SUPW^zY)K%AGb^$xWy4=hEwey8D-UIH$ycjik7-&ZjwD3 zPe582;uqLc7gCD(KMX{*oQtBry)Wui-!rxOZt{vpW&f`mOFl#e`w#8LZ;Vb{88CF7 zq+6cDn_6&wGD`REivU_ z_3b??$41g$dzSRd>(-6PlJl?4Omq(JwB8b<`VmYnC5+0NJrlbFVu*8qE%kc>`}rE6 zgj;C5D=59+!!ZYFtGQ{G_dF=*n-kNU!8GgW z5BVOh6$u>Tx2`eRbY}bbS6wX2zu68xctrF;yI+!IWgI0 zFKoVK6C`?o4g4L@HOTk&b?j4ri{3Xw=pwlxuMv+>dcnF{Wf#8S+D+d}81zCkcTm?q z*P0~J%mS-3ZX%gMMGGd{jSn!(`;lBvco9jj?5BG9Z2c7Yj6+YoSds3M8TH~av*3(7 z{kx+bytr)c7o=8X?hAI#(=#x6X<%U=ehMPm3`@L20_P_#Lm^=ikM%M-@Xeg+MGDXy z>nHwgBb3Izj#5K-^0{d;sCVgQE99e{DqD%9jLnxATj$z1^nl-^_vPt=6Tz928;y*k zq3l(JAIkCCRTPO0{NufUaH|v)d4KZ}NuskzVaJm6r^*nq(O0hnI~Hz094wTeyye*6 zAdENLjL~lWxrH}OJ)CqToI%P^)-PlC{wPLN7=yO0uonX5fZNmRzgJCXzinV;c4t!nYC*B+y&kw>%;Iyj}xB4Rqbc8lx<|E zuq28$6ua+};VBDTwgU)A+Tdi2W+W2MRMuA1bj&a!3k;S5I!pgDB>@&ETdG(TVRZ1) z(zo__HD$e7g-=J|WCXo&b3f#%PvY!1o=jUom56^}mGYm$$=(jt zolYa5PrVA)%xb)lzvU^taVQ^+`dtRatFTf}0F9rB{)ut8?AAdup5qdj<|(C&^=)p0 zDgG~^(6B~TWAI~XtarJ-o@?2~jU6Q_5ZYbwp!nT;riQB@Tl(jOM&t!$&n|4iCE9(t zbPuG_D54ueup4DH1yo&&M_$&SxMPO>n6omhQR@<%v-t|Sl~{{N!0G#EGY`$4LYg!+yixYh(_dz> z%GoJ``vVOgBweWcq7nDDm=L*84bQ(l|Kw52cYo{22F>D!{=5u49hnwpU2FWMEDh&_ zh*kOwH@KWO4Ue^3vr;0}YgwMH&W?P^ix4~la8uI^8^@T$iWr=K6S(s1*^C_ZZ%CAC z9+2V2@T&4pR?ivzyz=!o-R^l}Dn+d(w`mYkqD{nTK|9V5>r-O`*E+hAm5IAWnb@X5 z61w8P&LQqpgvLHfK$=uv(&K7Jn&wQME^iW^*$9+*A=u8dzsWRLEn=kk=kc$T`%S8U z=crE^*d-&8Cwhq3EE5xKohgCh4j8FV{8Ontv0KWoSw~a`h|egq=Ni+la_XBL=MM8t z)+-ALBT~&&$7g2m3v*d_zMFe0Fmd5Q1o0b`KZEv-nEE4}vD#^2cc5 z25sd_hHq(nOFyVckLd8nQ+#V%eXOP6(5vCnAcOuPb#cbtygtV7Z5ykuwQqJLMs(oD z(=5AtA<3gv?rkYuN6MftQ9jFyz9T&Dhqx)MVQ8&Vw$2=KnTPN*`9!(1Lcg_IHN*36 z-tl(da4u|Ga2lJ-ZZ3p&ahWv&-PspBS`~s$oSu)z#+4NEgLFXWgp&?^S~tg68vJkr zy$YGVJM#{IQ}i=e`S?7T@WL=ImxLgkXIkRe13&k@q&RKDwiI~cjJdq5albc2=ZT6k z5_}g`Y7BO2oT3RSP4}!?yzf^CCt~SK?DQMh{l~Q>|Dp~QYcC(hZD)q(< z-FNsYSFF1jCR7gpA>SQI+Lw}8yn8Hoi)h#u-nc}|Ymv%kM6RBTJSBlmRpjZiqrAB| zi`GnD8V9RcaERV_`bxjXXuOrLEaci?p4pa|VwbqEFoA3Tl*1-OK>MU9zc;rX01g7? zi#y`nEW0>Ni^5&N3n)8hS*gB}3-+iXr&6vX={8|uTuq(zCq+Ve2TvnAkXfAnkAC;k z!Ic5sl_3ax42CrX zsI>i6c_I85I7qb-jL7q<&#QY7o`n+ zXpOPZvb^0t8ZuY!&z+YV4A~*}xSYX{hOQw^OIl+dP-royReavk4B%5B^SLAm`^T;6 z8cg@fwO3lFr)FqZ#f_NnB_c~`S+WJfh4Sf%eBI_|u_Bkm+qpQwnG!8RJ>Ozoa50+bK$PUj zW0LF}w!aJo9+@ajqKtWRwy1d7R(3^x`9Rbd8yZo{YkEmMgSEl9$T;weQ7bR5F$ZgP z&wdavk@z0}ig96JB-oR{8+$zFC*kolY@X5rnX$`i^QY9`>{WM4tnerpbj0!4@v?+^ zr99LCfLi2^mKkS;wJUgn$#nGHWleF#Tvqy=H7OxJmQE`Mm1MigAo4CiW(LvPJwhn?4<5v{1>8~Y*Gz1 z314(edK9yVPOs^+qwIiGK~3K~P3Np;{;W|7o&Pv<^~ltlxGUn~3?KhPQgm61_JI+efwKGjABPuw3ujJrwvOVbz*kj!SJV z)#>HXh;YpnIr?L?#FXqzMO#f4mDuS?NR4f?*kZdry!!Qfp9Xs4i6luuwW$ArloQR? zEBE0P_5w2Qsrpfk{6@GOocPfvaihm?W}6oKwp4g``Sh9PB*C6x5fPW#h8@J+SvLn8 zSQiieLK;4Fuu5Ei-atNCNYlf66ZEJ`z0iN*WRw`7 zy-Q0Kc-@;AgfjQWs=ZNAj?BwH(7_u3nLgD;-z8^LRk+Ge*-ZtM91;Ro(wb;>*zGfmuZlnrq8i#eTN* zEc%dDjOJSXw&iwSQJzbc)MrRb3J%zWT%+f{RDWVOzNta9;pd8vGY$ec@_?WbzwUNL zSr19W@7&eZU9=+TO+P8cDQWgD&T9uvQly;4q*vW-Zh2^Xs)I(J7B+fAdmwH0Rp^L| zWP{HSM8_>u%E;ky>)LaHnkAM)%MR+uALZ)2eKt%zjNtA0!SK1ZcM6cV z`T~_oh794)Bkx+cV-W3gm54uay2!6M3g*uU2uL*EQ7Wwb5B}PB)?<%9j^n1%mu~m4 zrMIE%_`Of!5Y57m8@qJy)*9UixJM7TMYuMs;3}BZu!jg7`M47csm7G*q6o?3F_PW| zsFkJVh`=uP!6k%N<>u7!>o-!1Vp8;!Ntjf5@YQdGaJ|?mF3G5 z1#=qeo~`Xr%h#}tJMpCqbnW+Qbs)flqR^H|pXeIS_}D%z$0&!^uJp0u`|jpZmGly% z5#MTh@m2{|{p}*^5aDc6bOJt1OMC>>;`3;WhQ?VFsVB5{ahK|IOw53ui_KvCyNkE! zqKU1t%bRW)(qyY=(?=5A_i|+rDf>{n#C(G zv9S5feMIxHroOyvjPLpLkL4>TAYo*JLk!vIaCV_`1KRH($vjL`r^-V{M|-Yv#ggAf z^0aocY$fo;IQE$1hM>_bGM5x%>~4S%@0ZH-h1(Y1%}UrU@19K0>6W)@E3rTBc+BOS$lfZMEstbhvcLEl zI%qErUC=#Po>K6U`NrYs&f~=~f9hvizSI-0VHqdo-oBJgdHQ=h#uq$Y;VN8TE4VQ2 zIRfgH=R)nD=0$;l0D^iMalF*`P^PZ|xLP?_T_0QflQN_&5xyHXgf;}|GWDNp<~whV z6`gLJh_9e$d`H#Z;Sek4`mV~;W`lzJp1W>Y%i6^CJP!eYfGrA^n^WluhQkkShs;dQ zgiN_CL`rRk*xI{S`+M};p6^ym>E6+H|LgYn$2y&_UnabU*h>;RG~B}q)D@SRHAeK` z6Pz2>q?&b<4F6=UN;`ms{^P$f2#==C_1Cp!8pWQg4~pxbZF2mc=Xh z#$@H6Yi#OvMK2$b*6JM5IzE9GCpCgKUmCCtP(c;ltJ$H@Jag5Bz#-42#6-}c zYQ9N70iJSK`ELluSHw%c|9WK(=SbHW1k9(+@`(sB^52n^` zWAuUl02&9bbLLLl-l|{k+R>LryOHTQwq<8`Z`{$fn@~s57uu?^SH%2ZAmCHQT`I8! z1A0$^peqO8`H34dzZ9%Dh{72Po7TQhfGL5;BgvqwxwRW*={i+4Nuio$MwdtADrZ}M zgHxGvMR;X8yr$iT;ahL(R}_Lb;fDa6bXKeFN#NbtgG z?rT%U*S^gP2Jo0n5c^dLupaBgMOg!mUmw zR!ErI1)aCso5z*G$<+Dl?4{&rtAHeG_64-^7y3I`ZhR z5C?olXj$*6OTHuP`OI!~6OgveABxR!mx`Ac@BK|*+`^9+bW8p<$91C*+7_bKli1oM zHqH>o9@QWc$*QHgzO|V|KLWHUN$9=XeH=aciY;A^wOfxW9blDpx}270yd|ma?HYFV zwolfosrV9JV_`AXfkGXhjN%1tFBY$0-&$LCtR;mChGD;A_VHIzE}G^5fbW)TD8S|2 zz;1_p)-E!k-+yc=Rp2n|ePly!Z}b~Z&jH4_tRppGRe{YA=QZKe;uqFT!FIoR%`}rS z1=CrF*rt`%RQkG7oU2Fq?#J1Mucg$o91IZWF+(V$GH;gKSG!F4wni}IoLqb#DTg2* z%*Z6TZBHliX#G!FQOW`G3;HVrxU;*p?nWXk`CRPu%-RmiW0AM3zns6;R%AW%vq6%b z-h7Do9P+k7XnQiu4ZH0T`}4>+O_9@e`U z#mp+U%@L24U@;Fmp{o^&LUK*+f3>! zomYms#r3kNiZr#dfG1uT-r(Zfr?my;-mmbz_@gBc2NZq(7>#5E zR-JhrDYx)zN>h{!5qu2s2%B~aB+Tipvs8^fC_s}*a0mmvQU<$bRWP!sr4{fVU6 z&WagXZ?MK&!bwY7K-ce7@5=5f-~MMo7LPvcuiipCbvo=mLA{<^R|Scm{ryS)EB`WO zjRXzTDQ?}Jcq%s$3w5{5{%Y2{nlbX46kB@x8+$eweYQaLLso({)DZew=bKbxKiAvF zOGSv3f?rC5hQg~;IX_oM6q!~L-!xa_Efd4TyK&8|C}P=YHs1CDn{6F6tNUZkZfn{7 zz{#z?w#n**OD5+3=2QSs-~V*PAZif4D!mUTLT;YvBx?z~3vyCrH`=3yDwO^V3|zh~ zI>bRd;IyH@7`N07Hf@}3L0>NsOmD2Ysfu$lN*WQif-L2*ylU?=$iFDxzTuG`mg`lr4aV{5w`qWCx z{AlXG^oqU9f7Lne+^l}#F}l%v&y}8x?>%e#tZU?^}`lc*vE{8XwZl}Q_*2m@VxK!EPYXc27POxk{b9a z!xLgv`W@PL1+q0%Qs^Zf9}$2ljthFeB5JLanb@$xN4!(S=u0eM{i9VEg;yBYIj~i< zzC_mq5OyHw^jO+4BL57Rjuxjb&<$eO1>h=uvT;ovUnEDemo&x~fNw?DCWfsTR{mR! z1k_{`B!D^bg*BWQB>GG+e?QK{l3M72c(Ka^q=H>Fg@ItTFg!_y8mnln36yBjn^HTjCIG8aub2u9vk{l8Ak(uZ^49no|u6qZw1RsdW?`CGeBS|PQ4q`DLn7)VD znkqm%)>f6lYmr)0Ehkv4x=@yY1Lo=;n{9$FbMxiLzAjiuT$j=F*R1a5bj%)T_dc~{ zBT{iW_Hk%R=1R+j!|YK=C@QUmYgZ!!Xbc915tM_*TuV zw8_P79I9VqOxP zQ@3)T9Ciu&t-nfl8hf?aWT5}s9VmOb{C?7?0Xy)shUn zCMcy-t0VaEQh!lf^Q8{}-mgy{IKDB9G%be7Ee1le)k`wdnhM!~Jh#<@jaOZ?a$t zer=h?J;iyRFV9tx+{dHB26lBeAf3E5JXiQ8A|Iy~I|EKFU9I$VQBwcJViD5pALw5# zLn7y%K(3+%E8nGXU3s1}b7dy0pPfwGAYSm8bNxDEpqcO$3ekS~meTwW!!wLKl8jVk z`^+NGMxsUJ*s*);&+@AFkp=xdH7bl!u)Kiup`0K3ni9CzXfrmb3Eca3x- zNxF`FIkjZ8hRSjm?YoYb>o7$`?I!t!f}-_?sndXI3bAoj`pFhtGk9lCf4?qRz3*6IXd4*M4~fdK!kW=`S`rc(8pCJ4)<1GIDevA0zj(FM(B!& z*fbl?+m{!zeXpL+U%p!j_GQ+}sjMr>jSOAYbT}NcCLSjHL}Rp|{H_#sSF_vfdWAP1 z=~wXCI+U9w70`eo7xaH=Yt3Q`VZ1yjl%~h#t{(Zsg<{0`VYzj6W$g?QXeGK33z1$mmj0hcs zcw>&)n&QA+@7*MzRozw#i=wBo$w7MBFY^WWg#2WvYtjDASh2r?6&arli@$CWEx6zL za};sYHE}ghao7d+`Y7mbox?rOuy?rJ`luqey7arl`*Sk{*m5_UyR{hOuYlJ5P-E8V z^m-`LaQ8QnYx`9%{HY4BayVS)VRm%c;${s|s1lTcnXQPM`#LMJ3v`lIz{_H$dsn84 zkOW@G@MM#9ED<(`K_42qu{ASdzwjp!G+bV!(QNIXhPpHzG_?;&aA=JBKoH@+%p<-L zg>tGw1p2y9{=)t6^Ctp>*aj)%VhlrvFX9jCNqJUJ68B=>ZV2BIRTFR7E+p@*5@#=f z{dZt@e&NYG4*ywEWAohmH=L+Z?!ID^b0sTlu6gMaqeI2*-}~D*TYI0hlsxat_|CO= zU>@RZjgP~ZFUOYaCB>dCSMSg+=^0^URe#kBhIOmQ*k9}yy&rwDf2VcYCo&RMV%a0= zhvR8dGco+im5|j6d1RJi}SLE^vD7@5T z$w<8*pSL=ksY`pQ%fcZxRK-_X;VeYunS8)|oJKM=^}bdJkkKZemdroi-U;3Bs-;Oa z3*YF2<*Y$q+(G}v9qcT%?6~~e7k(Fc`;7U$UKCxA+8H&hv;si(wq>2G&=Vr~%i!;1 zT6zSgNY;^<1y__^qo8ytk<#JE zlAxi18uq8of(Wr-P0uvbB0ev|i23VWw~hu1q+h#mo8R_%Lgpbi-OiCRko@snIz+!r z)Be^QXuMISUj%9@g5QIUu;}o&i?UWedv{~-V=vNCzYrr3xBBWgD=|-LHd$r+g630t zcl2w>SI42aE#L9x9BGTyvoj9+Y3qsCw59B6l{es&#@xW^mH_*UcDBSxHO&LWlmziJ ze9$97o-th(G4dN@MnRJ<-Dh6$>SM+29&cPM*f;iqZfb3wcMJgdqqhqb;~xkw3~xm1a9^6bN`dLG*9dmLdm^5_6hX}ADR4V|gV z2Iu5^@^D;?d?Vi-o{PT!ZbW|XdF=Dq-!G!8_ER)VmGg2Mc2pP7FPcz_O%_3uM}ERB ztI(>|dlr82!gu0yc2;Gr7<v3sg2r5Vq<5+jOJLfcsaoJ`Vq`RqBv!3n`t z_bOE@VjRJ02rHx!SD!%_iQ71w9s?E^umVJyFc^dvU|4uBL4wIv5$?9cYoHcZ_SC7d_l6x1q+u{b+89_=V~fsCq`lt2Yi+V9oiNH3UCk=Xzt9wra0o_J+{0 z7HVy0)tIu~%b=iUTlJhvrB9q?pOk*()QAGMR2KE@71XSg8+;rly`RHORM`vgLnbfQuNG;914ypDL>rXOiGM# zS4PTc5cTYf3A~)!Xy$iie8BWErFf#10A+n7F-Sm3*rrf#Y>_NJ|3PE*g^5^fY zwHGP-8`Z8VEL-U3z;j4fekB)SJ04&T1nY6TO;E8N-nh^Z&3ra(xfh+oA9z-@h5QMu zJzYjL03sd;H{*76;3ql_2!7%~go=(j`D`#A2%pf-g_#Kl*kw+EtIkVfELKf0JDIvz zTGOp)U26yHrWMHT7UIC;zvp`(t|*8u4Q#Z@Fo$+8p$A^~4~!M57DP8_F1R-B_ytoM z{oOs#Qn{FrSW~AG3szWbT4@3KL^6efd4jwI;5CeQ4EO^^{ScZ3?*zGsy_Go z@x$ZaKP$`)Q_EVN63#NFP-4s>;X8=m)-N!|>ZKGK54;ULT}`;G