diff --git a/appendix/appendix-tables.tex b/appendix/appendix-tables.tex index 7ecd1db..b000c09 100644 --- a/appendix/appendix-tables.tex +++ b/appendix/appendix-tables.tex @@ -1,2 +1,64 @@ -% TODO: Zeitplan Soll/Ist, Backlog (PBI-Tabelle), PR-Übersicht, -% Anforderungsmatrix, Dokumententypen↔Ordner↔Icon, Lookup-Trade-offs, Beteiligte +\begin{table}[H] +\centering +\small +\begin{tabularx}{\textwidth}{@{} l X c c l @{}} +\toprule +\textbf{ID} & \textbf{Titel} & \textbf{Aufwand} & \textbf{Sprint} & \textbf{Status} \\ +\midrule +9295 & Document Explorer & 8 & 15.2026 & Dev Completed \\ +9549 & Icon Typen UI & 3 & 15.2026 & Test Completed \\ +9298 & Suchfunktion im Document Explorer & 3 & 15.2026 & Test Completed \\ +9299 & Einzelne Dokumente herunterladen & 3 & 15.2026 & Dev Completed \\ +9296 & Mehrere Dokumente als ZIP runterladen & 5 & 15.2026 & Dev Completed \\ +9300 & PDF Modal Previewer & 3 & 15.2026 & Dev Completed \\ +9294 & Document Link previews UI & 5 & 15.2026 & Test Completed \\ +9301 & Support für URL-Dateien & 5 & 15.2026 & Dev Completed \\ +\addlinespace +9749 & Nach Dokumenttypen filtern & 2 & 16.2026 & Dev Completed \\ +9731 & Pagination im Document Explorer & 3 & 16.2026 & Dev Completed \\ +9857 & Recherche: Anfrage Objects nach S3 optimieren & --- & 16.2026 & Dev Completed \\ +9560 & Automatische Anlage der Ordnerstruktur & 3 & 16.2026 & Committed \\ +10018 & Kundenordner-Lookup über Efecte-Namen & 3 & 16.2026 & Committed \\ +\addlinespace +10070 & Race Conditions im Kundenordner-Lookup & \multicolumn{1}{c}{\footnotesize Timebox} & --- & Approved \\ +10134 & \emph{Bug:} Suchfunktion wie auf den anderen Seiten & --- & 17.2026 & To Approve \\ +\bottomrule +\end{tabularx} +\caption{Product Backlog Items des Features 484 „Dokumente"} +\label{tab:backlog} +\end{table} + +\vfill + +\begin{table}[H] +\centering +\small +\begin{tabularx}{\textwidth}{@{} l X l @{}} +\toprule +\textbf{Anforderung} & \textbf{Kurzbeschreibung} & \textbf{PBI} \\ +\midrule +FA-1 & Dokumentenliste auf \texttt{/documents} & 9295 \\ +FA-2 & Mandantentrennung über \texttt{efecte-org-id} & 9295 \\ +FA-3 & Rollenbasierter Zugriff, 403 ohne Berechtigung & 9295 \\ +FA-4 & Typisierung und Icons & 9549 \\ +FA-5 & Serverseitige Suche nach Titel & 9298 \\ +FA-6 & Filter nach Dokumententyp & 9749 \\ +FA-7 & Paginierung mit wählbarer Seitengröße & 9731 \\ +FA-8 & Einzeldownload über Pre-Signed URL & 9299 \\ +FA-9 & ZIP-Download mehrerer Dokumente & 9296 \\ +FA-10 & PDF-Vorschau im Modal & 9300 \\ +FA-11 & Share-Links mit OpenGraph-Vorschau & 9294 \\ +FA-12 & Unterstützung von \texttt{.url}-Dateien & 9301 \\ +FA-13 & Automatische Anlage der Ordnerstruktur & 9560 \\ +\addlinespace +NFA-1 & Skalierbarkeit des Kundenordner-Lookups & 9857, 10018 \\ +NFA-2 & Verständliche Fehlerbehandlung & 9295 \\ +NFA-3 & Leerer Zustand bei fehlenden Dokumenten & 9295 \\ +NFA-4 & Konsistenz zur bestehenden Oberfläche & 9731, 10134 \\ +NFA-5 & Testbarkeit mit gemocktem \texttt{IAmazonS3} & 10018 \\ +NFA-6 & Pfadsicherheit beim Download & 9299 \\ +\bottomrule +\end{tabularx} +\caption{Zuordnung der Anforderungen zu den Product Backlog Items} +\label{tab:requirements} +\end{table} diff --git a/chapters/overview/initial-situation.tex b/chapters/overview/initial-situation.tex index a20c310..aff47b4 100644 --- a/chapters/overview/initial-situation.tex +++ b/chapters/overview/initial-situation.tex @@ -1,15 +1,12 @@ \section{Ausgangssituation} \label{sec:initial-situation} -\section{Ausgangssituation} -\label{sec:initial-situation} - Die Idee, Kunden über Houston Zugang zu ihren Dokumenten zu ermöglichen, besteht seit November 2023: \emph{Nicole Kimmel} legte damals das Feature~484 „Dokumente" mit zwei Stichpunkten an — „Vertrag, Betriebshandbuch, Feinkonzepte an zentraler Stelle abgelegt" und „Rechnungen einsehbar". Diese Notiz blieb über zweieinhalb Jahre nahezu unverändert im Backlog und spiegelt die damaligen Bedürfnisse wider, ohne einen konkreten Lösungsansatz zu beschreiben. -Zum Zeitpunkt des Projektbeginns im Sommer 2026 gab es keinen strukturierten Prozess, über den Kunden selbstständig auf ihre Dokumente zugreifen konnten. Verträge, Berichte und ähnliche Unterlagen wurden punktuell per E‑Mail oder über Dateiablagen bereitgestellt. Daraus ergaben sich mehrere Probleme: +Zum Zeitpunkt des Projektbeginns im Sommer 2026 gab es keinen strukturierten Prozess, über den Kunden selbstständig auf ihre Dokumente zugreifen konnten. Verträge, Berichte und ähnliche Unterlagen wurden punktuell per E-Mail oder über Dateiablagen bereitgestellt. Daraus ergaben sich mehrere Probleme: \begin{itemize} - \item \textbf{Fehlende Zentralisierung:} Dokumente lagen verteilt in E‑Mails, Dateiablagen und lokalen Verzeichnissen ohne einheitlichen Zugangspunkt. + \item \textbf{Fehlende Zentralisierung:} Dokumente lagen verteilt in E-Mails, Dateiablagen und lokalen Verzeichnissen ohne einheitlichen Zugangspunkt. \item \textbf{Kein Self-Service für Kunden:} Kunden mussten Dokumente aktiv anfordern, anstatt sie eigenständig abrufen zu können. \item \textbf{Kein strukturierter Überblick:} Eine Übersicht nach Dokumententypen oder zeitlichem Verlauf war nicht vorhanden. \item \textbf{Kein sicherer, mandantengetrennter Zugriff:} Es existierte kein technischer Mechanismus, der sicherstellte, dass ein Kunde ausschließlich seine eigenen Dokumente einsehen konnte. diff --git a/chapters/overview/participants.tex b/chapters/overview/participants.tex index c9c667c..4b15918 100644 --- a/chapters/overview/participants.tex +++ b/chapters/overview/participants.tex @@ -1,6 +1,3 @@ -\section{Beteiligte und Rollen} -\label{sec:participants} - \section{Projektbeteiligte} \label{sec:participants} diff --git a/chapters/overview/project-description.tex b/chapters/overview/project-description.tex index 666a9b3..020419a 100644 --- a/chapters/overview/project-description.tex +++ b/chapters/overview/project-description.tex @@ -1,12 +1,9 @@ \section{Projektbeschreibung} \label{sec:project-description} -\section{Projektbeschreibung} -\label{sec:project-description} - Das Projekt \emph{Houston Dokumente} hat zum Ziel, Kunden im Kundenportal Houston einen zentralen Bereich bereitzustellen, in dem sie ihre Dokumente einsehen und herunterladen können. Die Dokumente werden in einem S3-Speichersystem abgelegt und gepflegt; den Kunden werden sie über eine neue Houston-Seite zugänglich gemacht. -Bisher existierte kein einheitlicher, zentraler Zugangspunkt für kundenbezogene Dokumente wie Verträge, Berichte oder Protokolle. Diese wurden punktuell per E‑Mail oder Dateiablage bereitgestellt und waren für Kunden nicht selbstständig abrufbar. Die neue Dokumentenseite in Houston löst diese Situation ab: Mitarbeiter pflegen die Dokumente über ein internes Dateiverwaltungswerkzeug direkt im S3-Speicher, Kunden können sie anschließend strukturiert abrufen. +Bisher existierte kein einheitlicher, zentraler Zugangspunkt für kundenbezogene Dokumente wie Verträge, Berichte oder Protokolle. Diese wurden punktuell per E-Mail oder Dateiablage bereitgestellt und waren für Kunden nicht selbstständig abrufbar. Die neue Dokumentenseite in Houston löst diese Situation ab: Mitarbeiter pflegen die Dokumente über ein internes Dateiverwaltungswerkzeug direkt im S3-Speicher, Kunden können sie anschließend strukturiert abrufen. Der Dokumentenbereich unterscheidet sieben fachlich definierte Dokumententypen — darunter Service-Protokolle, SLA-Reports, Monitoring Reports und Vertragsunterlagen — und gliedert die Anzeige anhand dieser Typen. Darüber hinaus umfasst das Projekt eine Suchfunktion, Filter nach Dokumententyp, Paginierung, einen PDF-Viewer, den Download einzelner Dateien sowie das Herunterladen mehrerer Dokumente als ZIP-Archiv. Zusätzlich werden sogenannte URL-Dateien unterstützt, mit denen beliebige Webadressen — etwa Links zu Teams-Kanälen oder SharePoint-Seiten — in der Dokumentenliste verknüpft werden können. diff --git a/chapters/overview/project-scope.tex b/chapters/overview/project-scope.tex index edeaa23..880ea36 100644 --- a/chapters/overview/project-scope.tex +++ b/chapters/overview/project-scope.tex @@ -1,9 +1,6 @@ \section{Projektabgrenzung} \label{sec:project-scope} -\section{Projektabgrenzung} -\label{sec:project-scope} - Folgende Punkte sind explizit \emph{nicht} Bestandteil des Projekts: \begin{itemize} diff --git a/chapters/overview/system-landscape.tex b/chapters/overview/system-landscape.tex index c72ffe2..dab8dce 100644 --- a/chapters/overview/system-landscape.tex +++ b/chapters/overview/system-landscape.tex @@ -1,9 +1,6 @@ \section{Systemlandschaft} \label{sec:system-landscape} -\section{Systemlandschaft} -\label{sec:system-landscape} - Der Dokumentenbereich ist in die bestehende Systemlandschaft von WorkSimple eingebettet. Abbildung~\ref{fig:system-context} zeigt den Systemkontext und das Zusammenspiel der beteiligten Systeme. \begin{figure}[H] diff --git a/chapters/overview/target-situation.tex b/chapters/overview/target-situation.tex index d4192e3..fe0929a 100644 --- a/chapters/overview/target-situation.tex +++ b/chapters/overview/target-situation.tex @@ -1,9 +1,6 @@ \section{Zielsituation} \label{sec:target-situation} -\section{Zielsituation} -\label{sec:target-situation} - Mit der Fertigstellung des Dokumentenbereichs erhalten Kunden im Kundenportal Houston erstmals einen strukturierten, selbstständig nutzbaren Zugang zu ihren Dokumenten. Die Zielsituation zeichnet sich durch eine zentrale Ablage im S3-Speicher und eine mandantengetrennte Darstellung in Houston aus. Der Dokumentenbereich bietet folgende zentrale Funktionen: diff --git a/chapters/planning/backlog.tex b/chapters/planning/backlog.tex index b6ecaeb..a88ecd4 100644 --- a/chapters/planning/backlog.tex +++ b/chapters/planning/backlog.tex @@ -1,14 +1,27 @@ -\section{Backlog-Schnitt und Schätzung} +\section{Backlog und Entwicklungsprozess} \label{sec:backlog} -% TODO: 14 PBIs + 1 Bug unter Feature 484 -% Prozess: DoR, DoD, Approval-Team, Sprints 15–17.2026 -% Siehe Tabelle~\ref{tab:backlog} im Anhang +\subsection{Entwicklungsprozess} -% Gantt: -% \begin{figure}[H] -% \centering -% \includegraphics[width=\textwidth]{figures/diagrams/gantt-plan.pdf} -% \caption{Zeitplanung über Sprints 15–17.2026} -% \label{fig:gantt} -% \end{figure} +Die Softwareentwicklung bei der Unicorn Development erfolgt nach einem agilen Prozess mit zweiwöchigen Sprints, verwaltet in Azure DevOps. Jedes Work Item durchläuft dabei einen definierten Zustandsautomaten, der in Abbildung~\ref{fig:ado-workflow} dargestellt ist. + +\begin{figure}[H] + \centering + \includegraphics[width=0.55\textwidth]{figures/diagrams/ado-workflow.pdf} + \caption{Zustände eines Work Items in Azure DevOps} + \label{fig:ado-workflow} +\end{figure} + +Ein neu angelegtes Item befindet sich zunächst im Zustand \texttt{New}. Sobald Beschreibung und Akzeptanzkriterien vollständig sind, wird es zur Freigabe eingereicht (\texttt{To Approve}). Im Approval-Termin prüft das Team, ob das Item der \emph{Definition of Ready} genügt, stellt Rückfragen und schätzt den Aufwand in Story Points. Erst danach gilt es als \texttt{Approved} und kann in einen Sprint gezogen werden (\texttt{Committed}). Nach erfolgreichem Merge des zugehörigen Pull Requests wechselt das Item nach \texttt{Dev Completed}; die fachliche Abnahme überführt es schließlich nach \texttt{Test Completed}. + +Dieser Prozess erwies sich im Projektverlauf als wirksam: Die Rückfragen im Approval-Termin — insbesondere durch \emph{Timo Walter} — deckten mehrfach Lücken in den Akzeptanzkriterien auf, etwa zur Frage, wann und wie oft die Ordnerstruktur geprüft wird, oder ob Namensbeschränkungen für Kundenordner zu berücksichtigen sind. + +\subsection{Schnitt der Product Backlog Items} + +Der Backlog-Schnitt erfolgte in zwei Phasen. Am 18.~Juni 2026 — unmittelbar nach der Feature-Analyse — wurden die acht Items der Kernfunktionalität angelegt. Sie orientieren sich direkt an der Gliederung der Feature-Beschreibung: Der Document Explorer bildet die Basis, die im Abschnitt \emph{Feature-Creep} genannten Punkte (Suche, Einzeldownload, ZIP-Download, PDF-Modal, URL-Dateien) wurden jeweils zu eigenen Items. Am 7.~Juli 2026 kam das Item zur Typisierung über Icons hinzu, am 8.~Juli das Item zur automatischen Ordneranlage. + +Eine zweite Gruppe von Items entstand erst während der Umsetzung. Am 22.~Juli ergänzte die UI-Zuarbeit die Anforderungen um Paginierung und Typfilter. Am 28.~Juli wurde die Recherche zur Optimierung der S3-Abfrage angelegt, deren Ergebnis am 12.~August in das Item zum Kundenordner-Lookup mündete. Am 17.~August kam schließlich das Item zu den Race Conditions hinzu (siehe Abschnitt~\ref{sec:race-conditions}). + +Insgesamt hängen 14 Product Backlog Items und ein Bug am Feature. Die vollständige Übersicht mit Aufwandsschätzung, Sprint und Status findet sich in Tabelle~\ref{tab:backlog} im Anhang. Die geschätzten Aufwände summieren sich auf 46 Story Points, verteilt auf 35 Punkte in Sprint~15.2026 und 11 Punkte in Sprint~16.2026. + +Bemerkenswert ist die Aufteilung: Die im Voraus geschnittenen Items betreffen ausschließlich fachliche Funktionen. Sämtliche nachgeschobenen Items der zweiten Gruppe entstanden aus technischen Problemen, die erst bei der Implementierung sichtbar wurden — ein Muster, das in Abschnitt~\ref{sec:reflection} aufgegriffen wird. diff --git a/chapters/planning/feature-analysis.tex b/chapters/planning/feature-analysis.tex index 2e4b1d6..ed49eaa 100644 --- a/chapters/planning/feature-analysis.tex +++ b/chapters/planning/feature-analysis.tex @@ -1,7 +1,15 @@ \section{Feature-Analyse} \label{sec:feature-analysis} -% TODO: 18.06.2026 — 4 Rückfragen von Linus an Thomas, Antworten im selben Ticket (Feature 484 Rev 17–32) -% - Autorisierung via Metadatum: ja -% - Filestash als externe Website (kein Custom-UI): ja -% - ... +Das Feature~484 „Dokumente" existierte seit November 2023 als zweizeilige Bedarfsnotiz im Backlog. Am 10.~Juni 2026 arbeitete \emph{Thomas Drewermann} es in mehreren aufeinanderfolgenden Bearbeitungen zu einer vollständigen Feature-Beschreibung aus. Dabei entstanden die Entscheidung für einen S3-Speicher als Ablage, die Festlegung auf Filestash als internes Verwaltungswerkzeug, der Katalog der sieben Dokumententypen sowie die Abschnitte \emph{Feature-Creep} und \emph{Out of Scope}. + +Am 18.~Juni 2026 führte ich eine Feature-Analyse durch, um die verbliebenen Unklarheiten vor dem Backlog-Schnitt zu beseitigen. Vier Rückfragen wurden als Kommentare am Work Item gestellt und noch am selben Tag beantwortet. Drei davon entschieden Architekturfragen: + +\begin{enumerate} + \item \textbf{Autorisierung über Metadaten:} Auf die Frage, ob die Efecte-Organisations-ID als Metadatum am Kundenordner gespeichert und die Berechtigung darüber aufgelöst werden könne, lautete die Antwort \emph{ja}. Damit war das Autorisierungskonzept festgelegt (siehe Abschnitt~\ref{sec:authorization}). + \item \textbf{Filestash als externes Werkzeug:} Es wurde bestätigt, dass Filestash unverändert als Verwaltungsoberfläche genutzt wird und \emph{nicht} als Referenz für einen Nachbau in Houston dient. Damit beschränkte sich der Implementierungsaufwand auf die Kundensicht. + \item \textbf{Typisierung über Ordner statt Metadaten:} Auf die Frage, ob der Dokumententyp als Metafeld an der Datei vermerkt werden solle, lautete die Antwort \emph{nein, Ordner}. Der Typ wird also über den Unterordner bestimmt, in dem das Dokument liegt. + \item \textbf{Bedeutung der URL-Dateien:} Die vierte Frage klärte, dass mit der Verlinkung zu Teams oder SharePoint gemeint ist, \emph{externe} Ressourcen in den Dokumentenbereich einzubetten — und nicht umgekehrt Houston-Dokumente nach außen zu teilen. Daraus entstand das Product Backlog Item zur Unterstützung von \texttt{.url}-Dateien. +\end{enumerate} + +Die dritte Entscheidung erwies sich im weiteren Verlauf als die folgenreichste. Die Abbildung des Typs über die Ordnerstruktur macht die Filterung nach Typ günstig, da sie sich auf ein Präfix-Listing reduziert. Sie erzwingt jedoch, dass die Ordnerstruktur für jeden Kunden vorhanden ist, und macht damit die automatische Anlage der Ordner zu einer eigenen Anforderung. Zugleich erschwert sie die typübergreifende Suche, da hierfür mehrere Präfixe durchlaufen werden müssen. diff --git a/chapters/planning/infrastructure.tex b/chapters/planning/infrastructure.tex index 8958388..0ec8df0 100644 --- a/chapters/planning/infrastructure.tex +++ b/chapters/planning/infrastructure.tex @@ -1,15 +1,34 @@ -\section{Infrastrukturbeschaffung} +\section{Beschaffung der S3-Infrastruktur} \label{sec:infrastructure} -% TODO: Service Requests an Maschinenraum (2026-07-22), Provisionierung durch Advanced Unibyte, -% 3 Buckets (DEV/TEST/PROD), Credentials in Passbolt (2026-07-27) -% Anfrage S3 Select (2026-07-30), Aktivierung durch AU (2026-08-07) -% Search Integration: von AU nicht bereitgestellt (2026-08-17) +Der für das Projekt benötigte S3-Speicher stand zu Projektbeginn nicht zur Verfügung und musste über den internen Service-Desk-Prozess beantragt werden. Da der Speicher nicht von WorkSimple selbst, sondern von Advanced Unibyte betrieben wird, war die Beschaffung mit einem mehrstufigen Abstimmungsweg verbunden. Abbildung~\ref{fig:timeline-infra} zeigt den zeitlichen Verlauf. -% Timeline-Diagramm: -% \begin{figure}[H] -% \centering -% \includegraphics[width=\textwidth]{figures/diagrams/timeline-infra.pdf} -% \caption{Chronologie der Infrastrukturbeschaffung} -% \label{fig:timeline-infra} -% \end{figure} +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{figures/diagrams/timeline-infra.pdf} + \caption{Chronologie der Infrastrukturbeschaffung} + \label{fig:timeline-infra} +\end{figure} + +\subsection{Bereitstellung der Buckets} + +Am 22.~Juli 2026 stellte ich den Service Request „Houston DEV S3 Documents Speicher" an das interne Infrastruktur-Team. Der Request wurde am 23.~Juli \emph{Alexander Wagner} zugewiesen und am 27.~Juli abgeschlossen: Advanced Unibyte hatte die Buckets angelegt, die Zugangsdaten wurden im Passwortmanager Passbolt hinterlegt. Insgesamt wurden drei Buckets bereitgestellt — je einer für die Entwicklungs-, Test- und Produktivumgebung. + +Vom Antrag bis zur Verfügbarkeit vergingen fünf Arbeitstage. Da der Document Explorer als erstes Item ohnehin erst am 27.~Juli in die Umsetzung ging, entstand hieraus keine Verzögerung. + +\subsection{Freischaltung zusätzlicher Funktionen} + +Deutlich aufwendiger gestaltete sich die Klärung, welche S3-Funktionen die StorageGRID-Installation tatsächlich unterstützt. Im Rahmen der Recherche zur Optimierung des Kundenordner-Lookups (siehe Abschnitt~\ref{sec:lookup-research}) kamen zwei Funktionen als mögliche Lösungen in Betracht: + +\begin{itemize} + \item \textbf{S3 Select} (\texttt{SelectObjectContent}) erlaubt es, Inhalte einzelner Objekte serverseitig per SQL-ähnlicher Abfrage zu filtern \autocite{aws-s3-select, storagegrid-s3-select}. + \item Der \textbf{Search Integration Service} von StorageGRID spiegelt Objektmetadaten in einen Elasticsearch-Index und ermöglicht dadurch eine echte Suche über Metadaten \autocite{storagegrid-search-integration}. +\end{itemize} + +Am 30.~Juli beantragte ich die Freischaltung beider Funktionen. Da hierfür der Betreiber einbezogen werden musste, kontaktierte \emph{Lennart Meinert} am 4.~August Advanced Unibyte. Am 6.~August benannte er die drei betroffenen Buckets, am 7.~August bestätigte Advanced Unibyte die Aktivierung von S3 Select für alle drei Umgebungen. + +Für den Search Integration Service fiel die Antwort anders aus: Am 17.~August teilte Advanced Unibyte mit, dass diese Funktion derzeit nicht angeboten werde; das Thema wurde intern an den dortigen Product Owner eskaliert. Am 21.~August schlug Advanced Unibyte ein Folgegespräch vor. Da zu diesem Zeitpunkt bereits eine Lösung ohne serverseitige Suche gefunden und umgesetzt war (siehe Abschnitt~\ref{sec:lookup-decision}), wurde der Service Request geschlossen und das Thema in den Ausblick verschoben. + +\subsection{Bewertung} + +Zwischen dem ersten Antrag und der abschließenden Klärung lagen vier Wochen. Diese Vorlaufzeit war zu Projektbeginn nicht eingeplant und beeinflusste die Architekturentscheidung unmittelbar: Ein Lösungsansatz, der auf einer erst noch zu beschaffenden Fremdleistung beruht, ist innerhalb eines Projektzeitraums von wenigen Wochen nicht belastbar. Die schließlich gewählte Lösung kommt daher ohne Erweiterung der Speicherfunktionen aus. diff --git a/chapters/planning/onboarding.tex b/chapters/planning/onboarding.tex index 8c85a3b..fa90d08 100644 --- a/chapters/planning/onboarding.tex +++ b/chapters/planning/onboarding.tex @@ -1,5 +1,18 @@ \section{Einarbeitung} \label{sec:onboarding} -% TODO: S3-API, AWS SDK für .NET, StorageGRID-Dokumentation -% Quellen: note-1785344962361 (S3-Recherche mit Timo), note-1785413874041 +Vor Beginn der Implementierung war eine Einarbeitung in die für das Projekt relevanten Technologien erforderlich. Im Zentrum stand dabei der S3-Objektspeicher, mit dem im bisherigen Verlauf des Praktikums noch nicht gearbeitet worden war. + +\subsection{S3 als Objektspeicher} + +S3 (\emph{Simple Storage Service}) ist kein klassisches Dateisystem, sondern ein Objektspeicher. Objekte werden über einen flachen Schlüsselraum adressiert; eine Ordnerhierarchie existiert technisch nicht. Was in Werkzeugen wie Filestash als Ordner dargestellt wird, ist lediglich ein Präfix im Objektschlüssel, das in Verbindung mit einem Trennzeichen (\texttt{Delimiter}) beim Auflisten hierarchisch interpretiert wird \autocite{aws-listobjectsv2}. Diese Eigenschaft prägt das gesamte Ablagekonzept (siehe Abschnitt~\ref{sec:s3-layout}) und war für mehrere spätere Architekturentscheidungen ausschlaggebend. + +Eine zweite wesentliche Erkenntnis betrifft die Abfragemöglichkeiten: An Objekten können zwar benutzerdefinierte Metadaten hinterlegt werden, S3 bietet jedoch \emph{keine} Möglichkeit, Objekte anhand dieser Metadaten zu suchen. Ein Lookup nach einem Metadatenwert erfordert daher das Auflisten aller in Frage kommenden Objekte und eine anschließende clientseitige Filterung. Dieses Detail wurde erst im Verlauf der Implementierung zum zentralen technischen Problem des Projekts (siehe Abschnitt~\ref{sec:lookup-research}). + +\subsection{AWS SDK für .NET} + +Der Zugriff auf den S3-Speicher erfolgt aus Houston heraus über das AWS SDK für .NET. Zentrale Schnittstelle ist \texttt{IAmazonS3}, über die sämtliche Operationen (\texttt{ListObjectsV2}, \texttt{GetObject}, \texttt{PutObject}, \texttt{CopyObject}, \texttt{DeleteObjects}) ausgeführt werden. Da \texttt{IAmazonS3} eine Schnittstelle ist, lässt sie sich in Unit-Tests durch ein Mock ersetzen, was für die spätere Testabdeckung des Kundenordner-Lookups entscheidend war (siehe Abschnitt~\ref{sec:unit-tests}). + +\subsection{NetApp StorageGRID} + +Der eingesetzte Speicher wird nicht bei Amazon betrieben, sondern von Advanced Unibyte auf Basis von NetApp StorageGRID bereitgestellt. StorageGRID ist S3-kompatibel, implementiert die S3-API jedoch nicht vollständig. Welche Funktionen tatsächlich verfügbar sind, hängt von der Konfiguration der Installation ab und musste im Einzelfall geklärt werden. Diese Einschränkung betraf im Projektverlauf sowohl \texttt{SelectObjectContent} \autocite{storagegrid-s3-select} als auch den \emph{Search Integration Service} \autocite{storagegrid-search-integration} und führte zu den in Abschnitt~\ref{sec:infrastructure} beschriebenen Abstimmungen. diff --git a/chapters/planning/requirements.tex b/chapters/planning/requirements.tex index d701af1..41e2ff4 100644 --- a/chapters/planning/requirements.tex +++ b/chapters/planning/requirements.tex @@ -1,5 +1,33 @@ -\section{Anforderungserhebung} +\section{Anforderungen} \label{sec:requirements} -% TODO: Funktionale und nichtfunktionale Anforderungen aus den PBI-ACs -% Tabelle: Anforderungsmatrix (funktional / nichtfunktional → PBI) +Aus der Feature-Beschreibung und der Analyse ergaben sich die folgenden Anforderungen. Die funktionalen Anforderungen wurden anschließend in Product Backlog Items überführt; die vollständige Zuordnung findet sich in Tabelle~\ref{tab:requirements} im Anhang. + +\subsection{Funktionale Anforderungen} + +\begin{itemize} + \item \textbf{FA-1 — Dokumentenliste:} Auf der Seite \texttt{/documents} werden alle Dokumente der Organisation des angemeldeten Benutzers als Liste dargestellt. Ordner selbst werden nicht als Einträge angezeigt; leere Typordner erscheinen nicht. + \item \textbf{FA-2 — Mandantentrennung:} Ein Benutzer sieht ausschließlich Dokumente, die im Ordner seiner Organisation liegen. Die Zuordnung erfolgt über die \texttt{efecte-org-id} am Kundenordner. + \item \textbf{FA-3 — Rollenbasierter Zugriff:} Der Navigationspunkt ist nur bei vorhandener Rollenberechtigung sichtbar. Ein direkter Aufruf ohne Berechtigung führt zu einer 403-Antwort. + \item \textbf{FA-4 — Typisierung und Icons:} Jedes Dokument wird mit einem Icon dargestellt, das aus dem Unterordner abgeleitet wird. Unbekannte Typen erhalten ein Standard-Icon. + \item \textbf{FA-5 — Suche:} Dokumente können serverseitig nach ihrem Titel durchsucht werden, inklusive Teiltreffern. Ein leeres Suchfeld zeigt wieder die vollständige Liste. + \item \textbf{FA-6 — Typfilter:} Unterhalb der Suchleiste kann je Dokumententyp ein Element zum Ein- und Ausblenden ausgewählt werden. + \item \textbf{FA-7 — Paginierung:} Die Liste wird seitenweise dargestellt; die Seitengröße ist durch den Benutzer festlegbar, analog zu den übrigen Houston-Seiten. + \item \textbf{FA-8 — Einzeldownload:} Jeder Eintrag besitzt einen Download-Button. Der Download erfolgt über eine zeitlich begrenzte Pre-Signed URL \autocite{aws-presigned-urls} unter Beibehaltung des ursprünglichen Dateinamens. + \item \textbf{FA-9 — ZIP-Download:} Mehrere Dokumente können über Auswahlboxen markiert und gemeinsam als ZIP-Archiv heruntergeladen werden. Die Ordnerstruktur des Archivs entspricht der S3-Struktur; das Archiv wird erst beim Klick erzeugt. + \item \textbf{FA-10 — PDF-Vorschau:} PDF-Dokumente können in einem Modal angezeigt werden, ohne zuvor heruntergeladen zu werden. Für Nicht-PDF-Dateien wird keine Vorschau geöffnet. + \item \textbf{FA-11 — Share-Links:} Für jedes Dokument kann ein Freigabelink erzeugt werden, dessen Zielseite OpenGraph-Meta-Tags für eine Linkvorschau bereitstellt und anschließend auf den Document Explorer weiterleitet. + \item \textbf{FA-12 — URL-Dateien:} Im Speicher abgelegte \texttt{.url}-Dateien werden nach dem INI-Format ausgewertet und leiten beim Anklicken auf die hinterlegte Adresse weiter. Ist keine gültige URL erkennbar, wird die Datei wie eine normale Datei behandelt. + \item \textbf{FA-13 — Automatische Ordneranlage:} Beim Aufruf der Dokumentenseite wird die vollständige Typordnerstruktur für die Organisation angelegt, sofern sie noch nicht existiert. +\end{itemize} + +\subsection{Nichtfunktionale Anforderungen} + +\begin{itemize} + \item \textbf{NFA-1 — Skalierbarkeit des Lookups:} Die Auflösung des Kundenordners darf nicht linear mit der Anzahl der Kunden wachsen. Im Normalfall soll ein einzelner Aufruf genügen. + \item \textbf{NFA-2 — Fehlerbehandlung:} Können Dokumente nicht geladen werden, wird eine verständliche Fehlermeldung angezeigt. Eine stillschweigend leere Seite ist nicht zulässig. + \item \textbf{NFA-3 — Leerer Zustand:} Existieren für einen berechtigten Benutzer keine Dokumente, wird ein entsprechender Hinweis angezeigt. + \item \textbf{NFA-4 — Konsistenz zur bestehenden Oberfläche:} Suche, Paginierung und Bedienelemente orientieren sich an den übrigen Houston-Seiten. + \item \textbf{NFA-5 — Testbarkeit:} Die Logik zur Auflösung des Kundenordners ist durch Unit-Tests mit einem gemockten \texttt{IAmazonS3} abgedeckt. + \item \textbf{NFA-6 — Pfadsicherheit:} Beim Download wird geprüft, dass der angeforderte Schlüssel innerhalb des Kundenordners liegt; Pfadanteile zum Verlassen des Ordners werden abgewiesen. +\end{itemize} diff --git a/chapters/planning/schedule.tex b/chapters/planning/schedule.tex index 29c7bd6..ad2bb0e 100644 --- a/chapters/planning/schedule.tex +++ b/chapters/planning/schedule.tex @@ -1,4 +1,17 @@ \section{Zeit- und Aufwandsplanung} \label{sec:schedule} -% TODO: Sprints 15–17.2026, Aufwandsschätzungen (Story Points), 24 Manntage / 192 h gesamt +Für das Praktikum sind 24 Manntage beziehungsweise 192 Arbeitsstunden vorgesehen. Der Projektzeitraum erstreckt sich von der Themenfindung Ende Mai 2026 bis zur Abgabe der Dokumentation. Die Umsetzung verteilt sich auf die Sprints 15.2026 bis 17.2026. Abbildung~\ref{fig:gantt} zeigt die geplante zeitliche Verteilung. + +\begin{figure}[H] + \centering + \includegraphics[width=\textwidth]{figures/diagrams/gantt-plan.pdf} + \caption{Zeitplanung des Projekts} + \label{fig:gantt} +\end{figure} + +Die Planung gliedert sich in vier Phasen. Die \textbf{Analyse- und Konzeptionsphase} (Ende Mai bis Anfang Juli) umfasste die Themenfindung mit \emph{Sarah Hinzmann} und \emph{Thomas Drewermann}, die Feature-Analyse sowie den Schnitt und die Freigabe der Product Backlog Items. Die \textbf{Implementierungsphase} begann am 27.~Juli mit dem ersten Pull Request und erstreckte sich über die Sprints 15 und 16. Parallel dazu lief die \textbf{Qualitätssicherung} in Form fortlaufender Code-Reviews; der Abnahmetest begann am 13.~August. Die \textbf{Abschlussphase} umfasst Release, Dokumentation und Präsentation. + +Eine Besonderheit der Planung ist die Abhängigkeit von der Infrastrukturbereitstellung: Der Document Explorer konnte erst umgesetzt werden, nachdem der S3-Speicher zur Verfügung stand. Diese Abhängigkeit wurde bereits im Approval-Termin am 8.~Juli durch \emph{Stephan Janßen} als Voraussetzung am Item vermerkt. Der tatsächliche Vorlauf für die Beschaffung wird im folgenden Abschnitt beschrieben. + +Der Soll-Ist-Vergleich der Zeitplanung findet sich in Abschnitt~\ref{sec:target-comparison}. diff --git a/figures/diagrams/ado-workflow.pdf b/figures/diagrams/ado-workflow.pdf new file mode 100644 index 0000000..f38e851 Binary files /dev/null and b/figures/diagrams/ado-workflow.pdf differ diff --git a/figures/diagrams/gantt-plan.pdf b/figures/diagrams/gantt-plan.pdf new file mode 100644 index 0000000..224a8b7 --- /dev/null +++ b/figures/diagrams/gantt-plan.pdf @@ -0,0 +1,1166 @@ +%PDF-1.4 +%Óëéá +1 0 obj +<> +endobj +3 0 obj +<> +endobj +4 0 obj +<> +endobj +6 0 obj +<> +endobj +7 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 1 +/Group <> +/Filter /FlateDecode +/Length 162>> stream +xœ=Ž] +ƒ@ „ßsй€»É®‹Ä*}°PÝJm©µ÷/«¶È—Ì0É‹¬ãÀ`l”%iâ�2+ã0LÄ«Ú5Ø`I71Æ÷*92ÎáN=)ƒ­º^ý6øõùùè—ù3,È2Ý–§ +Œ> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 2 +/Group <> +/Filter /FlateDecode +/Length 162>> stream +xœ=ŽÝ +‚@…ïç)Î ¸;ã¶i ^ø“ta�î ‘Efï»Z00ßÌ9œ™%±ƒ±R*jŸ&)³Š-†‰8¨]ƒæ‘t³Ãø‚—£ØZÜ©'c­®ÁŸƒßx¿>?ý2†Y¦ÛòT�‘çEURáH-„á®$áN$>XÙ$õo‰�›(cË,fëfámþ±ß9Ü�jGªÛ’¾eª/« +endstream +endobj +9 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 3 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœMŽÝ +‚@Fïç)¾pwfmqò'é Ý7"‹ÌÞ?\%‚�9Ãù˜™ÅJŒƒ±’3J\bᘕ±èGâ`Û+Léz‡áÄ¢#c-îÔ‘2X«­ñã��—¼>?Ý<}úiª›âT‚‘eyYPîI-„á¯$áN$Ëbe·¼%1üH)³Xf‰·¾gÞæÃ» þF•§ UMA_b„/£ +endstream +endobj +10 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 4 +/Group <> +/Filter /FlateDecode +/Length 162>> stream +xœ=ŽÝ +‚@Fïç)¾pwfusò'é Û7"‹ÌÞ?V%˜3œ�™yS¬ÄX0+9Q;—Z8fe,ú‘x±]ƒ¦�t“`ø,"èÈX‹]I¬Õ5øó’�C^Ÿ_Ïë<}ûY¦ÛòT�‘çEURáI-„áo$Ë�HÂbeSÞ’~¤ŒY,³Ä[ß3 oóaã$¸þNµ§ ÕmI?e¬/¥ +endstream +endobj +11 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 5 +/Group <> +/Filter /FlateDecode +/Length 162>> stream +xœ=ŽÑ +ƒ0 Eßó÷¬IkÑ�³:Ùƒƒiÿ@˜0æÆœûÿQ•A 'œK’7%Ú‚ÁØ(ÓJ²Ô"cVÚb˜ˆWÛ5Ø`)nŒŸUikñ ž”ÆV]ƒ?¯yòñåõì—ù;,Èó¸uç +Œ¢(+G¥§ød! #YïD+›fá-1ðåÌb™ÅìýÀ,¼ÏÇ�fqü�jOWª[G?c> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 6 +/Group <> +/Filter /FlateDecode +/Length 162>> stream +xœ=ŽÝ +‚@…ïç)Î ¸;ã¶i Bþ$]¤ûBBd‘ÙûÇ® Ì7sgæMFIlÁ`¬”ŠÚ§‰Eʬb‹a"j×`…y$Ýì0~‚àå(¶êIÅX«kðçà7Þ¯/¯g¿ÌßaA–é¶> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 7 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœMŽÝ +‚@Fïç)¾p�YÜ@¼ð'é Ý7"‹ÌÞ?\%‚�9Ãù˜™%F¬‚ÁXÉY#.U8fc—‘8Ø®Á +Ó@q³ÃðbÑ‘UÅ�z2ku ~òÉ’�OÏG?OŸËŒ,‹ÛòX�‘çEURá)>(„á¯$áN$Ëb£©[Þ’~¤ŒY”Y’­ï™…·¹øcÍáoT{:SÝ–ôbr/¡ +endstream +endobj +14 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 8 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœMŽÑ +‚P †ï÷ÿ xÜ´¥�xáѤ ƒô¼��YdöþqT"ìß϶ÅF"ƒ±R*fŸ&Š”ÙDŠ~$^l[c…i °Þax/Âë RÅ�:2ÖjküxÉÇ>žŸ�nž>ýŒ, {*ÁÈó¢´T8 +� +a¸+Ér'¿Øh’ú·$†)ce–xëfám.þØæp7ª]¨j,}f†/³ +endstream +endobj +15 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 9 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœ=Ž] +Â@ „ßsй€»ÉnW+”>ôÇâCÛ½AÁ‚XÅZï/»-B`¾d†$o²JŒƒ±Rjïƒ2+ã0LÄÑí¬0�¤›ã'ÁÞçð ž”ÁZ]ƒ?Ǽ y}y=ûeþ ²L·å¹#Ï‹ª¤Â“>9ÃßHâ��„ÅÊÒð–Xø‰2fqÌb7=2 o}±qæ9ü�jOWªÛ’~\E/ž +endstream +endobj +16 0 obj +<> +/Font <>>> +/BBox [0 0 166 848] +/StructParents 10 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœ=Ž] +Â@ „ßsй€»É®[+”>ôÇâCÛ½AÁ‚XÅZï/»-B`¾d†$o²JŒƒ±R*Ê%A™•q&âèv V˜GÒÍã'ÁÞçð ž”ÁZ]ƒ?Ǽ y}y=ûeþ ²L·å¹#Ï‹ª¤Â“>9ÃßHâ��„ÅÊÒð–Xø‰2fqÌb7=2 o}±q˜'9ü�jOWªÛ’~_m/  +endstream +endobj +17 0 obj +<> +/Font <>>> +/BBox [0 0 167 848] +/StructParents 11 +/Group <> +/Filter /FlateDecode +/Length 161>> stream +xœ=Ž] +Â0„ß÷s“ÝÄÔ +¥ý±øPÁ67(X«Xëý%iæfØÝ7Y%Æ�ÁX)5Š“ ÌÊ8 qL»+Ì#éf�ñƒïŒsxPOÊ`�®ÁŸc߆¾¾¼žý2‡Y¦Ûò\�‘çEURáIŸ„áo$ñÎNÂbåixK,üD³8f±›™…7_lœŸÃß©öt¥º-é\/š +endstream +endobj +18 0 obj +<> +endobj +19 0 obj +<> +endobj +20 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 79>> stream +q +3.125 0 0 3.125 0 -150 cm +.4 .4 1 RG .4 .4 1 rg +/G18 gs +0 48 746.5 24 re +f +Q + +endstream +endobj +21 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 79>> stream +q +3.125 0 0 3.125 0 -225 cm +.4 .4 1 RG .4 .4 1 rg +/G18 gs +0 72 746.5 24 re +f +Q + +endstream +endobj +22 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 74>> stream +q +3.125 0 0 3.125 0 -300 cm +1 1 1 RG 1 1 1 rg +/G3 gs +0 96 746.5 24 re +f +Q + +endstream +endobj +23 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 75>> stream +q +3.125 0 0 3.125 0 -375 cm +1 1 1 RG 1 1 1 rg +/G3 gs +0 120 746.5 24 re +f +Q + +endstream +endobj +24 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 80>> stream +q +3.125 0 0 3.125 0 -750 cm +.4 .4 1 RG .4 .4 1 rg +/G18 gs +0 240 746.5 24 re +f +Q + +endstream +endobj +25 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 75>> stream +q +3.125 0 0 3.125 0 -450 cm +1 1 1 RG 1 1 1 rg +/G3 gs +0 144 746.5 24 re +f +Q + +endstream +endobj +26 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 83>> stream +q +3.125 0 0 3.125 0 -600 cm +1 .9569 0 RG 1 .9569 0 rg +/G3 gs +0 192 746.5 24 re +f +Q + +endstream +endobj +27 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 83>> stream +q +3.125 0 0 3.125 0 -525 cm +1 .9569 0 RG 1 .9569 0 rg +/G3 gs +0 168 746.5 24 re +f +Q + +endstream +endobj +28 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 75>> stream +q +3.125 0 0 3.125 0 -675 cm +1 1 1 RG 1 1 1 rg +/G3 gs +0 216 746.5 24 re +f +Q + +endstream +endobj +29 0 obj +<>>> +/BBox [0 0 2335 75] +/Group <> +/Length 80>> stream +q +3.125 0 0 3.125 0 -825 cm +.4 .4 1 RG .4 .4 1 rg +/G18 gs +0 264 746.5 24 re +f +Q + +endstream +endobj +30 0 obj +<> +endobj +31 0 obj +<> stream +xœí\ÛnÇ}Ÿ¯èç^ö­ú$Êòà¶ÄïLì mXqþ?8ÕÕ]5q¹bž,¯-‰³Å¾T�:§·z¶gO1uþÏyçÝW'ó²öèî¶ß6ü&y—’÷îã?·¿ÿÅý²ý¶¥SˆÄýÆÕøs÷°‡ÿxçÆÅÇŸ·›wÉýüŸíæo¿þòþ÷�ÿ½ûݽzuóÝí_ß:ï¾þúÍÛ[ž¤¶ìRæ)~ھ߾ß~ÛdØLÞ_â‰Ìü�ç.ïB +˜Ù³é‡wn\ðÌ3óÝívócuoåagל۳]o~l�»•Dtë�»µ˜.èüã~Á‡ç#¼ù1„CÇÐ/‰/ÄCÇÔ.‰0¤CGªŘ+ÕK:Ò¡cϹZwŒ!ÅK:H Þ>Õ-ôÑ/ÒÈ\öÏö;d1’KñùùIŒä²~¾C#¹zA|‡b¾ ú2É• â;&�]€ç§òW/Àå úH®]0ß’ý“ëã©ÅJÎþûÃ;w4êºY›#ï¶ðó~ká”zm¯Z8ÕæÉãÅÉ×Bs-žBn>£ù)Æ–ˆÜÝÖâ‰Q«°¦æ©´lÙûÀ½©×T]ƒ·!‚©ÕVjEçtÊ>–Ð…S Þ[@Ëzê¶Ürö¶ZC‰¶F¡çѹÇÔjvO1ôÜ +ò;M„­øjr-;JhŸ]©ˆsµ)U"Ö¡JE๓™³´8O*Þ•6×(J›�k¼¥Ï+K~_ú죖Îc72P—>½¸Û4)¥OWÒ`QµàªwwÈoE^ke$ +™6µÄìPµ0´©ì&­IHÝxW çª&E¥‘Õ]¸•8û¥`* –X+M>M¨ÛèÍÌ ’^ó!w•�V4Gšï7m¢С”*:éäT“Š{Ê> CYºâµtV`ï|ªÅÙêH3¢ŠÓÌêü{·ýkûi; ýBß[†ÊýUæW™_eþ•ùûÏK�9¸šÝÃÁŠìîqÁâ®™õÀW掵�TÀ¶¼„I+° +P°5n&(Åæ`(Ým0f©:A 6æl ScÈ—â™XAÓô§ˆ4”‰¿×"ä 2D§#t–QnÕÌÕ‡àR’¹†W}H³v§Þ÷!aŸM˜=)ç�¾Ö…¬§© ·'•š¦¡�õXÎ4õµj!…¼"©�s™ý€Á¶Êž�";Xê iXÓF “:ƒß¬ƒ©s’Š $5ÎfÙÇ›ç=[dRcr�E05¦QœXór +«¯Å·™•޹+Ñlöà�t@šï7me8°F3,Yóîø´<4Ì[‘†®˜-•8†ó D#Œ÷NB+1Fl+�PãÐêç¿¡_E~ùUä8‘¿àí<‡èzs[�š»Ç…P¨9\ ÅÚœ<“ç„Øà&—X° +mÛ 6p»Í¨3ªž!�¶à�Q´Ò'ް�ZÛ¨z`LRõŒÎÌV¼Ÿ9dcï½²Q +·L÷#¹Ot!BÕ†�¤4#šÓÉC(*}ufa®Æ£P\#¡ª!ØD5Š#Œ"/…Ƶhv`–Ú{¥�mCÜ™›pšBä«û-‡ÀÐä]ÄlvÄàðG“Ï™É;GƒçîCò]D±�ÝwæEÜáä»Í"ê;íø¾³zi—(ߎõ�óÍ]˜÷›ig(¢#2ÍÉw´[n*?W8†Æ+rË÷…‘ÆÓ¨gÂ.2ãÕ@d¹2 Å=þ[þu!¸.×…à‹\^RøÝÃFIŒîW²V~�WÀºàÕô€(M~ƨÎÂŒ²uÞ¡tj©w¶Í›"”A‹ØØ8q‚UtÓº-B™¹Ù(7F(ƒ–lã¶Láh‡³ÍAÀ÷›iGR™›áhVðfâ2‹ý1±¸X—“3¡/á› ËÜh Äž2÷$Šb™{w™Ûœ»MóRæ†È$®LæsZK䵤ñVÅñ±S0í`pÑŒGÄdµº›Ö‘ u6$-˜HˆÆ'h»�a¤^c7àÀ–d¶!l 7¬c ‰Ñ%~åë?<ïH¸}'P:˜ámÌĆ`ÆÅEEÊ¢¬Æl¸mÀY*0 .µ¸�¬Lb–M3Þº††?¿P¸ªÿªþ«ú¿õ¿¤¨(Î +–€ØùêW«À,¯f ZÖ��ä…•0®»Œ0Ke[F\ÄMGªadÐ?¬j¹ ¬"÷_÷æreØ°Ž¤°jðʸáDHZwürÕŠ f©íscäpb%…¹ È�¡ãQ1Þè](8Yb–4?´2C–4?s4Ó—Ì �E¦WK÷ ³3A•ÌP´…´b6`šÕµ¢ZhÞÉ3 (Ä®$î¯É*´ŽaûN÷`((P�xªY˜eÂ8(h†¤š„­»éaF‚‚uÆ¡ÕU1Ûøa–êZ±‚Qn:*ª0JÉn3³Ü#ÔlQýD^©Ž´s¦øSÌ�Ê)3½åŸqU¹j‚RV¬ Xª«êʤÀJФKåj›‹›šAÁp]-®«ÅuµøÓ®ï·SÍÝ�Ò“ÉÚ½6eE�x’Fv�Ï·h�Š×«‚ =v°v0>ÞYÀöxgÛqg:v°=ÞYÀvÜY„>Ž¢T³³€Mw¡×¹³a¿³rÆn-B8n-‚_Úo-B”ÍÖ"à�ŽÝW„ô©}E§~̶"ÈÙ »­rŠh·­鸭IÎêð¶"àp � È.õ0«ÒÕ6©^×xÔ½Üê²Ã:8«.Â&•ó „ÚüÀÎF ë �ƒì =ØPÚïq†U6+#ÔÚ!sÔ:ç•{p®ï7m§LÐñ”1:³å–ú¨,Ô@”­²åµb£ +P U)ж•”æEŧùƒ:§~¥DH‘È�’ïÍ�jª‰•0ÚBáªÿ«þ¯úÿ"ôÿ‚» +dU?÷ ü”Š©+«·û„ê§þµJ­^õ¿êÙê§þµî­ó9 S"×ñÄFÛoêx´£ÚB óÙ­ÐkÄvûƒ§þµê¯qêŸÇJswÐê~wÐêÔ¿Ž×êÔ¿ÎÜäÙ˜ýÖ ÉS4vgÐë_Cn]õ¯à´.ú_¶>õ¯X·®ú׬´>Í[ës@V;VáLwίÔ ¶�œÓ‰f<uZÝÍLrP'INê�„ú<ÉkC&9©Cêó`°ÂGãœN¬; iœÓ�`WJ¨×CêO¾·:zp²±äÕÌx‹2ffC.ã㢡 dÑÕ„lˆm°Y0.©´­¦4/ª>Íô) +þü{Wí_µÕþ—¢ý÷Û‰pfñD%Wwj¥Ô!ÿÇFóæ_P+áÌrõ…¯îqµªH<µZ„j1È1IW}]i[ÎÂJ�rfë ¶–z6y +Ó7–CdÛ +ÖY1Ë¡OnYB�…mzØj ¹±m& Ö|Ž^ÒYýª ãzØÃwcàxB†8ÞÕ.‘ÐÈŒ—F™]íÌ©¬OºŒ�©Ì'µ4–TøI- 9Õ%N'|�Á0U9ÅcÐNu}¸gò’ÆN%;“9}VyM¼Æ~&K@i³þ_í`“ú�WJ�Ÿs™™a•OÄ–�°�œ­PJ)³þ71Ã*ŸÅ h`�úá›|´g�†Uêÿ•“"w3mî +OI£gÓ� f¼Å3³a—ñqñвøjB6Ì6Ø,  —V ÚFU&/K&xÎ]4üÒýÿu ¸®×5àËY^Zþ¬°�«{\­3*øÎˆYqÆR¦ }øˆ2~–V9SfTݯã3eÞì³(Ž 1tëHN•™°‰º±aG€ã@¬Kg¹e·cÛHº†Î8;3zà1eþ€PÛµ$‡‹t¸–æ.@çmYwêaË“¿IËLr ¸‘jA¡i4O-Ím€BÝHž ¾ÛLRÍm€¦­Ñvïsó>gï©zOÍ{¢a Þû{¿ÏßzO·ÞSÁï¿vþ½}óa|ëщxÖ ðµUõbÎÒ½§(Ôá®Ù+üþµØàZòÞ÷ñ3’xϾO#Ú?ãe:ëeÆw˜† nV¶ˆK^Ýxì +^¿ñž’º1%zÆ�|Þ�ÒN>áÙš�H�º‡¢8RöØ$q–±ysAæè¬Äß·ÑŽgÓ.�™ UÞtf"áH}fòr� æꇔÐk™|f>ÐH£x?IÄíëäø3Ö³–’\ôJìdÈÌî ¡YZ“q�–•ž™¾�Ÿ>᫪; ¸Ë)„˜°¯òîÃ?Ü+‘q‚Ë·›ÜcÈš×£íÌ1·¿�Ä{Æï~žTx�Œ¿S5©Ú’uu¢ç9ÿΓò7Þ|'^’¿¯ÇOûŒ¯ÁŸK~í{?ÛÀp-¥»%òÝøƒšm^üùÉùÏ/à�¿ªNæ–U&˪ ås1ž_Ÿù ª×$e�…‰|»_î`¼Wï ÐøÙŸsàüÒ úÅô—8p~± ÞÅ”/uàõK8¿ÐÂ�ê§Yqyž¼]äm»çníBÿøÍs:f1L1áç÷ª—Â_lüÀ‰¿äý“>S…<^ÊÛ¾HñÔºÇz¹„ôV$ÁÑ“ä6 ÓíXð.ÈÙ0â*ks�îַߞˢ]0ð%ö€èwqæÜ +endstream +endobj +2 0 obj +<> +/XObject <> +/Font <>>> +/MediaBox [0 0 612 792] +/Contents 31 0 R +/StructParents 0 +/Tabs /S +/Parent 32 0 R>> +endobj +32 0 obj +<> +endobj +38 0 obj +<>>> +endobj +37 0 obj +<> +endobj +40 0 obj +<>>> +endobj +39 0 obj +<> +endobj +42 0 obj +<>>> +endobj +41 0 obj +<> +endobj +44 0 obj +<>>> +endobj +43 0 obj +<> +endobj +46 0 obj +<>>> +endobj +45 0 obj +<> +endobj +48 0 obj +<>>> +endobj +47 0 obj +<> +endobj +50 0 obj +<>>> +endobj +49 0 obj +<> +endobj +52 0 obj +<>>> +endobj +51 0 obj +<> +endobj +54 0 obj +<>>> +endobj +53 0 obj +<> +endobj +56 0 obj +<>>> +endobj +55 0 obj +<> +endobj +58 0 obj +<>>> +endobj +57 0 obj +<> +endobj +60 0 obj +<> +endobj +59 0 obj +<> +endobj +62 0 obj +<> +endobj +61 0 obj +<> +endobj +64 0 obj +<> +endobj +63 0 obj +<> +endobj +66 0 obj +<> +endobj +65 0 obj +<> +endobj +68 0 obj +<> +endobj +67 0 obj +<> +endobj +70 0 obj +<> +endobj +69 0 obj +<> +endobj +72 0 obj +<> +endobj +71 0 obj +<> +endobj +74 0 obj +<> +endobj +73 0 obj +<> +endobj +76 0 obj +<> +endobj +75 0 obj +<> +endobj +78 0 obj +<> +endobj +77 0 obj +<> +endobj +80 0 obj +<> +endobj +79 0 obj +<> +endobj +82 0 obj +<> +endobj +81 0 obj +<> +endobj +84 0 obj +<> +endobj +83 0 obj +<> +endobj +86 0 obj +<> +endobj +85 0 obj +<> +endobj +88 0 obj +<> +endobj +87 0 obj +<> +endobj +90 0 obj +<> +endobj +89 0 obj +<> +endobj +36 0 obj +<> +endobj +35 0 obj +<> +endobj +34 0 obj +<> +endobj +91 0 obj +[36 0 R 60 0 R 62 0 R 64 0 R 66 0 R 68 0 R 70 0 R 72 0 R 74 0 R 76 0 R 78 0 R 80 0 R 82 0 R 84 0 R 86 0 R 88 0 R 90 0 R] +endobj +92 0 obj +[38 0 R] +endobj +93 0 obj +[40 0 R] +endobj +94 0 obj +[42 0 R] +endobj +95 0 obj +[44 0 R] +endobj +96 0 obj +[46 0 R] +endobj +97 0 obj +[48 0 R] +endobj +98 0 obj +[50 0 R] +endobj +99 0 obj +[52 0 R] +endobj +100 0 obj +[54 0 R] +endobj +101 0 obj +[56 0 R] +endobj +102 0 obj +[58 0 R] +endobj +103 0 obj +<> +endobj +33 0 obj +<> +endobj +104 0 obj +<> +/StructTreeRoot 33 0 R +/ViewerPreferences <> +/Lang (en-US)>> +endobj +105 0 obj +<> stream +xœí} xÕÒhUŸîžµgßÈL˜™L&,“� È4Kb0 +ÃÈ€!›!DIÂ&‘¨"((n B"‰û—¸_¯W‰Û]…ëÅ«WHÏ{Ý3 —ÿ¾ÿ}ïû¿÷}©CzNWÕ©sN�:uª«'tP¢&çäݺfø1¼¢³¯«¬ÖNóÀŸ eö�µžËÿTò3}µznõ¼ë–V0¨Š–y•±jp€ +N€aÞµ‹ç^‘=~À(À@Ëü9•UX+`†ÌŸ?§’Û )À�>ÿºÚ›\h»ÀÛிváìÊ�æ¶W�è_¼®òæjÍò%œÏõ•×Íé{kÁj7>X½0Voƒ�è’èÕ5sª;÷\6€}€ŒJ À�Ptà$˜W  ® ¡h �€ ñÃ’Ì_©ýHq<ŒQ·œ}ìç[ÔWK˜ž è�1TŸÍ�¾uç‰ +ýˆÀ­”)¯óÿ¾_úüdI¶íìc�÷¨¯V| �.„Þ�MÀ0÷3At&>ÉÛ0—2)JÃÒ”t=t�3ƒFMXè·$Š¿+ÖÁrøvÁ3°Ž�ò‚ +C€X¥82ù9y°€G!npãpâ0(ÅK (Ñ�G ¸åë6¤ù]ØÖ‰{;:Q=á,zÎâáþîï‹ú»ÿQ4Ð}º(à®8UwŠÒŸšpªâÔúS{O1š¯¾ìëþâó"·þsä?/²¹?ë(rï8ÑqªƒðÁ!EE÷w߯ÝßâßJOSúu”þýo+ýk1”þâîO.=QzIé§—’Ò?“¸[ÿ¾û}J¾ðo:œEÇ_ÄÃm#Ü/„3ÜÏ=ßß?„áÖêÖúVÒoãã­¦¼"÷ÁÐÁ ¬;¸íàÞƒ +Ǭ޷}Ÿ°�è÷aÓÓ(<�ú§Q©ßÚj?©šJÚ„v�äì í¥¶?%®ø²¢Â±cF�âC#/1|XÁ%C‡äÊÍÉÎÊìß/ßîKóº£A¯ã4j•RÁ24¡2=F â÷‹*}…¾Êâ¬LO¡cþجÌB_QTðTz„¢¨@gøŠ‹e”¯RðD=BF¥à©ì�Ž +|¥G˜{'Ÿàä»9Ñà#¤.|áØXŸ§§O,óy„uc}�ð­\¿R®Óò 7Öñz³2=ò¨¤Ñz +…¢ç7FÇfeb³F=Æ7fŽ:+šÕš1¾1š¬Lúûª›±ÿH”+TÿÂaÍ(9©[�ø +«„ðIJ±N¯7’•9NÐùÆÊ$#‹Ø1‚BéY Özš3Ûïh5À¬h@[嫪¼ªL •‘¬ÌFRØØx»` |c…·|éÈÊ,œ#dúÆ +Ijɤî~JÎw‰ã7ø<�?€€Qß·'/ÄT&1¬ßðHU�#à¤2¯Î"_Q´±±Èç)jŒ6V¶Æëgù<_c³VÛX]õ.°²5þÌZ§PtGD0Dçã°HrêE“JóÄeå/ò̯ˆ_ þ�Ï{‰Ókìæ ÿÅ�•4ìõJjXÛÊì¬L¯P?±,qï�YÎ}Àç"•(m]k©D©ï¢t7�ú¼Y™%“ËÚ?®ÊW¸@à×V +õ³OåÕÒÂø ‚î_N¯¯ÑdôäDd^�@üãªx&C`¥V=t†Ô¤Ñ ßèþ•øøÖÙ(ÐF“§Àç)È‘äú +£É7Îwõ³�ÁS”ØÐ�Íæ#V-—«är‹bŠbŠâ!ÅçÊBåU?Õ;ç‹ZwAy@C4³4/k³´¹,n%wœ;®¤»YÓ3¤ †}Ætã<ã ÆLmæFË£¿SÞø*_õ–ÞÒ[zKoé-½¥·ô–ÞÒ[zKoé-ÿ/ŠU ÀëzÇEüú»/f*Ëô]PGímOµ fPð¬T§c¦c°•ŽÁ<:㓸It æÓ1X@Ç BÇ ú{ïÙ˜©@3Sá æ5˜Ï¼OHuú x¢ÇwÕé<ÁîJÐØ¨”xåÏD»rú é-ñ/�þ~ó]!ƒit VÐ N•î©HMÖïÄ×`�ÌЈ¯A#» VÓ1ùG¢¯Hêd5 P@€›ŽÁJy^¯Å;i; Òw,þÏ�ÚYÿ�vÿ¿‚¤÷ÿé1ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ôB/ü§@Çäߊ?Àä1 @@nž£X†°D¥d BÇrŽMXP` ƒƒrÍ^£×lô�ÑsÎn¹‚c~®còÏÚé¿K¿[_?É aÖ€r nà‹+réæ§×iNuP¹¶Ì<5§ä† ·åõc ý&F2Õ†¡TnªƒNIaš Øf@½!d TÄÀ �alàGÀ¡8¤ŸœŠ™åå‹L9ö£©  `4AA�Ñ„vyt‰2iýtèKËÈ7ø³1ð�`žÍja6û�¡vVa æ µ²88ׯZ-ö‘ÉèÇZ-¶`Þzgóâ’¶žÄiÞ܃Ol:tðó… »+to´ú²ìKÄyUS£U£–/ ]þêâ“[V]v§¶nTÑñV´m¹«hã£÷­¸±uú±ã�� üûϳ ·ÛèÅÅ3æÍ¨Y–?~ú¹‡¿>QõÆâuC¥¿ P'–Q2GAi¼A5¡Õ4½Aí$¡P�é Ê5LCƒ,e4˜ì¾ ÊX÷ôs{žÝûÔá=‡[( zñè[íb¦øµø�˜ýîQ<†n@ЊeTà¼|BkÔ@«%ù@œËG¥ð 1 T¿ Íd¤O?·ç¹={Ÿ•:0ˆ'ÄÁo½ƒo£íøÎÛGÅ ø™4ƒØNM ª�€›7¡„g#Ûð8R9ˆ9勲ŠÊ5ç{­3ð ¶oß(}G—ÂÇ@ÀΫ Ín™�#³Kà æ­Ï¾ôñÇ’U†ã'i³4`‡þ¼ÅÄj�G•>Q)ˆ5!}’vÑÃ<Ñ@ùÒ$uyóL¤«Ì3ѾÿóŸg¾Eø÷·×=üØ]÷lß¶�zAÜ&Þ�58¯Á«Å»ÅÍ8Mâ÷â[â{â×è„­´ži5x ­¤(�–¡i²J¬�€B#¡`0'˜˜„< ¯‘É÷�^ëVœ'¾ˆW>†Ó6Ó#¾ØõÕYÇfIƒóh-³úÂHÞã�^iMµê�v{”.�ɤ‰EL +¸ºú0A�CîÊTpÁúóG2ù²1+ú�DÙÔu¨Ð¡Âk�¼çámõV/ŽÝ˵Z~|ñý¯J6¼[Ý—:QwÃþ»n½uõÔÚúÛw¾þÆ¡I?¼k榢̀0>~’îÃl”þ_ `�.kš Íop±ì€�~£Áh¨�æeWf¼RoDc4§ÛíˆEÜ +¢ŠEÒÂ+# XÞµ�€<‰‹ö*ZX_ZF¿¡6oÞ�üÁÌÊ•žóaÖ¾H÷ùé/ÄϤ£~õ–æÇçÎÚ°cåò›îÑ>mùñÅ÷¾ÙÔô €+_úà…ÃÆŸW­ˆ5lm¨Y´ü–…º§^|E¸}g_Ú¸&ÅOÒ©L¸`&Ÿo2;ì ˜¬Ã¬°™Y:µoŠ>II!‹½6ba¥©ÌS M�1År•˜UyyyÒä À!Ûm÷tLòEš$&u~.>³×ê%’+¢SÅ¿yå{Ï�‚“w=òèã–†„âí\î¼aOû�øÖ‰8ìÞa}{ïæ•�d¥þµY5ý P0?¹*6Hƒ0H5²Z�@Ã_º1Å’rCÄb!*•.Ñk×k)5£U)ˆçü J+Ð5fö¶¼‰}A�Y‘!UeÍ+’>Rv�}¾ÿ»sÈ~�¡É»ó÷ß¿sоØK_ܸjé–‡–.Û€ÇNˆ"ÎÂIx=®?sï?OϨ8óÁæÇîiØÑ¾ÈßÈ[”4ÀJZTjUmDÍÒ…’C“?LcVš�NZ§´(iâöhÌ)攊ˆ9ÝL]©7#iFZoFc6Ó cªˆ0„vVDhÓÅöUQ^±èW¯Ñë1ZXE_”B¯Ñ+Ö”>é¯ÅïÎt¾Lž¾£þ‰âw[7ˆGpÔæMŇŭÛ»×=÷6Ó îºmWªåþ\3KëŒÿ[¤—IgÏüøIf±¼SfòÄ`·)U*›�¤8õväˆÝn6CEÄLƒÒ ä•ae“r»²]Ù¡Tj‰R©Õ²­ÙãÄòäÉ'Mæ|íÂØ" NÅÎÒ¾´t*ßÞ<Ú®ÈFâøZ<‡ú¿bÿ{·N_i_|c^‹£?ÃìËžôý³ø®ø³Ø)¾‚þñžoÆqŸáD\*<5bÉ2i<ÀÌa@fÈäízF X¬¬®"ÂF_aL«<‹£ •P-$´ibæì_?Úù|çâÊ6És‰ÿÀa[¾YJÿ“xhÓ nŸFÍg›W£ü7°$»e_6…ÏcT*PÐZŽQVDÖ3ø ƒ‹™5 ¥gPIéŠPUDÀäáz ,i 剀ɞ¥7x“?OÐYçî&yçþ@61 [Å÷‹Ö­ÉÜ%k`ŸŠ Ã*)–¨5rGÈ(PQÆäÑH�ýò´”‹²|ŸÑkÅyÄtî»#äïôW�gì|…iØ*Íñ0Þ*?ÜÁWʱ0ñ æ2èaÐÀ 0XpšA�Áí V3e0Ì /N3ØÖEJ ]ø½ 6]Èïa’[YÚÌ ¨IÂL›Z¢1h<|DÚªI-ä0 À€›×IcdH€HjN¨8¹ô‰f^ëG¨×™†³Î¤YŠi€œÄŸr@Š�Ó¥è\N¢v¨õ¢35¹p… «]Xå±.ìB� -.<ãÂv¾ìÂGd†ZF]8Ef0¸�vá¼/er‹ 7Èä°Ü>]¦�qá{2iE¹ ¡ ‰kå& q´ ‡~é·zÈJÒt z¶KPI— ³.ü²KV½ ©j¹Þ…!yüàBEB«å¿£ò_!œ§ô BÈ ÉÇGBÕ‰ˆÂk<”U sÐ�FŸ1ˆ}Ñ>‡bÐÈLU ê'nX%®¿ÄKè]gñ&‹ŸUUXýÙ½µiÿœsŪԃœ.�©"¢¡iGE„6×Ë“,ÿ­½ßí…L +験ýS0î_þð#ñ•ǰ/ÿG<þ’øïÓß‹?¡æÛ3ÈP¯}"¶ìðÊOqÞö¤øÌ§¨ÀLñ�ââ�☕ðHòI¡#Œà=z†a5À‚ɬ§+"z=£Pè’;ÒŒ3–/ºpWœ÷™²ï÷½y´Â y(ýµx¶Cœu„šø-Òmb«¸—#O>zýdçÇLçGÑØùž¤ñ6Y7H‡Ÿî6õP�‰ñgX]+­K«ˆ�YÃVD4õèÉ�´”#‡]ªêv`ú¢ü ,…¿¡4ñ=ñ‡+çQ^ºé¥‘¯ŠŸmú õ‰ˆõ¾¥ÕÜ*Û“¯«ŸÆ1ïÿž™ùÉwŸƒZ­Ye&„Ö©€ãT4±;´”™ªˆ˜ÍÐu¼‚©Þ�Õô8Pvy¡_t“ú \/&,ÅnHºŽWúñnqÜjÓwH>„M?=þ€8�mz”×y�ixÿù>pu>DN.ièüi�ä!Ëã'韘��wòn-¤º|6–al. s²µ³­xœ6¢] %z-úZã§ù³­¸È7Õ7×G8ji­�ôé㩈,LÅH*–¤"�TT1©}h¢ªˆDYœÄâXYb>ÿÜ”C‡òdx*ùæ¢0•özÈPi‡äΦúe“üÁéÞ<›tôÊq\_´÷eèŸÄãâ7��“yÚ÷z#Tó`ôñ§ªòÑŠÔi1øœ{Ïý;÷.{qTÃ�ó®HOW8×_wSݒ©—dØü—ϸeÂÓ/ßÓì­žS½pTéð€Þ6¥Pú�ºEŠí0—ÿ)šR•h†–– MKTX¢Âá*LWáY¾¥ÂgU¸E…kUX§BªB…T˜«B½ +ç�Páq +*\¯ÂA¯ÂÓ*Là÷ªp› +«e¯B· +Oɤm*\(#C2T8ô” +ÛUؤÂz™VaŽLh—¥4É]'ð¼ +=*4¨0®ÂQáv™!*“B2U¯êö¡=}áo»ÐE= çiçŸyì‰SÙgôæ{­Tûó¢‹^EuÖIµU>�GÐ;äÿr> ¤ˆB¥ )Z­Q�¤f)%*+"hª×`µ£ k�×`òMd)¤k°ÇF€ùÒ³•½ô޳’éçN‘¯Ï=FÖ¬§§n]{ö1)Öš?IÇèñàƒ\¸“Ÿê0@¡°êôÙ„è­)tÞ TÇÄHªÍFÅ€‰…Â!êu u”†ètF£&1 ]Jâµåáö¸ã‘OþõÏê›_¯y.WýÃÀá)Þ±—UÍ`ÙƒÓgßy¥nyQ…e÷Æ'ZXzøŠšIÓ�˜þl³˜ž¨¨6,¨¾uÞíÓ˜¡©Üª‰eQI;+äœÂQ°ƒÊù¡}�Žsé~ÆHY­ÎpÄjà@m¥¼áeüòc“«ýèöcÜ�~lócÂjj³Ož =ÎÙ'{¥YX…oH¾1h´(‚ÒSº‰ô|JOk–ìRJjÛBÓy�Þrì…Ã7ß~ßÚÕ›W/¦Ò:ߌÌvש‡ì¤¿#£ÊæOOŠŸñrûçï¿õ ´ÒäMz<ô�¹|!p3«P˜9’â4ØÃ·¥Î²ÞrÂB[,ƒ‡­fëÙv¶ƒe€5°Qù¶�mg*²j5 GÔ6÷…Ï‹BÁœ <•䧤AµËšrš®ËC¡yõšhƒþ€µc÷§Nw<ö±ë�®fÁúz*í�íó¯Õn}ÝhF#ºwoÒM¿úyi%¦ÆO’SÌQ9C2•” +:�ÞÎêÙtŸÉªÐ¥ÒŽ( $%!¶¦t¬NGw:ÆÓ±#ÛÒ“kÐ#2/p„B.�?9PÉ“ûIk`÷ec~b #$ù²ÒñÎ%�äQT »›(:ÿtóí›7­^¼gþt´ ƒ2}Öb|á¬yçCí@¬þâå÷N|øúɽæ Çƒ úÀM|‘ÙÈ*úhµ +#q¦°,�>Žp}ÐB÷é£ÒëmáˆÞ "áˆÊÖîÄ6'nwb“ë�XíĨÃNÌu⢋÷Ö)GÎ/�Ä¢PÞÄšxŒÖ~òš(Ðrÿ†Öõy°R|âôÙ³ÇOžÑ7ݾ|3‹?>óæÌâ¬8`_LA-öí|ÁÑøä{¥lb*5‚y¬°žŸÏ™‘EвÒVÚnSëÃ5aI8bfõhuÛsììö:ûzû6»BoÙëì{íGì'ì§ìŠáö#v*A#z{Ž}¯ŒgìüÔªb;ß/³ØcϵGí„·cù¢@ |QÍL9Ê +vy>äÉ@0‘Z2úŒ¾ü œß°[¥µKÅ ´Üwß²U%ƒ³|…#ß%Ï�#—ß²a™v�²èªÊå’�‰ÓÈ)º<� Ûø*¯]¥rÓ¤¿ÑHÜ$7Ç¥·«-:‹?±t�pDgE8b¥‘¥QCƒ“ÏEO.ÏE!›ä:äbøD.¶åâ„\Üž‹õ¹˜“‹ú\<�‹írE93yZtŸ,rÊcf2ÙÃ^/XJù<£ŸxŒù¾ž›,8xÈÐ k5Èàd@ 'v¨ôæwú>mZR…ÜwÓkϾq,¶3›RÒO²û‹—On\zãúÒÅâ´µõ)%qøžù P‰N)Â_PÙwƒbÈ®s¯ˆ—�WW™ózǧ/V= w�à€(?Üj4š” +“¢OŠ€˜VÂ…#ÄО‚m)(¤àiùOÁŽìFnOÁêì>Okº¼dÐTº0rN¤‹�>crRÒs‡”BÁK‡í¸Mxüé�ÑÒºÍ-- +$ WÏÞû‡ÎjOÍÂÁ½�˘£âÒK—©�’~³/eŽÊo®狉B4­T1zÚŠ09‚�ˆ +N¨°MŽK¶ÉEuWœqº)6L�IåÝ®>ùÊ@~Ó“´cи¦¥¥…ñìÞýs=ìì«€Ð@æ(h`?O©BµJMƒF:øiNëæB%]*¸8Gë¹DµŽc +8~òÔâ(WÏmçÚ¸vŽ9Á!p‰{8—ËñIbwšS)(T¨i¥žÚ +V…B!{ΔT˜Y¾¨&±uòŒRj-¡p/*dKé5’+Þ½¢¥?~W‡Àï®똣ç*)NÌéÜ”˜Ž”õz#?‘04XO3ØÁà‰®\Á6ëåÌ€›A½œ+8Ñ#�ÐÄàãr“vßÍ|a´ÕSÉä [˜£?„Õ¬�p)w 𪼓RåQºüáˆËà0‚ÕJK§·VïU�µ*€% ILÝÔð›žà³|2€k¸$€ 8\¦jxõ7|K&ï•ÉuœÀ tðlOÉ�»60ÑA@f x&€w‰® à5,“ô,8+Óž àv¹e­,º¤kh¹ƒD÷�ÈãJP�²ÐöRmr˦F¥ñÌ `N!�ð4]©�_<þ÷L,ê¿–è:qòòBÝÞ)p>E�0&9O�‘ܪƒûûRv9¦±%?dt‚N`julÕ~vR„"Ã6^»d½‹\²mÑ#÷î›Z}ãrjÏ7 Û;בɇ2™bÓg]s]tß[Òàæ½u®K¬:ùŽ)PÉ�0©TjHQ§8]&ؘpÄfàôj°¶»°Í…‚ OË׸ ;älO¹]N]茺fx�3òöpB=gf5’‚�WE–mlINeäŽÅû¥ö\sãà}žuyóÑΜDTC§ÒãA 6(æ3�rVÁîPêäPÆ"…2ÛØäÀÄ3pÔ�aæ:ð„£Ûçüö;RïÅÑãÏß}û=~õÓׇW>ðີ÷>¼–ê+~)~�^4R¹â)ñ³Ž·ŽÿùƒÛåÈWœF§ÒWÊï"Êù¡p•J¨2üFÚJ%"_­^é¤ÒäÈ7CØ”�ÕèÎÀxvd`[Æù&‡ëMëç³u«ÒÚ#ðÕáùÈ÷ç© ÝÂîAš¡slxýÕ÷¬¼fqhõæUK¤Ð÷9åÃb„aBšk®*ψŸ|þâô#›ßó•„mP«éñ`o`Íf­ÅªgÕZŸp†Á`¥�ØãHÄVã�ì.%¨ž›îOQ}#YÓØê_;Wý¨ú…–Né¯ýÄO’t „*~„‚M³ºœ€ÓÊÒ�L.�8îpÄå0u8¢ 6C&B&žÎÄŽLlËÄh&Ögb( ™Ø $ß±çUU¿®$@Ff'Þå\˜ äÀ_ÛßüØ»ÍÞT¿¦®lVÖ嗿ûæþw]ë—_KmîÌMë—Žë��Í�­\çž6qÊ>œ’ÖÿÊëö,]k)¾òò’ìýé—^^)=£ºã§©�L&X �Oç,�^¯¢i›UÇ(™pD£W¡–¨x¥ž2I6QoëÊ„§«˜Yìzû—ˆÐ¤IøY_Z¾¥ ZƒV_âÑŽ)ÿãm+òo~ýõ`(}¬ÒñõÎòï¿_ÞY:>¤“F±2~’|Cƒ¨à‡›”J öÑôq9MŒ¼ÍmœUúÿæ6‡à…!‡Ñ’ÐoòY€êçK|óĈÃ~¹Ëéa�“ä}NÅÎ=u~ŸSoÆ;¥ÿK@úÿpG0*X­^GÌ*-1‹RaA‹M©D�ÒJtf¢Ô£ÖHÖm8׆SlXdÃ!6L·¡Í†´ ÏØð/6|Ù†ûløˆ 7ÚpUçX™ÓbCÖ† þeÃÏmøž _µá™o… keÖžÙ.‰dqdq l8µKkÃ/mø�Üå>fÃ56¬±!Få>ÓåA]rFîêeYF½ÜO‰ se²Å†geÒvI<Ÿ‹KlX%KlC§ O˼eùû25dCÊ`C°ÉÇVÅo&c.̺”ÿÚÁõ‹ìöEùm»äÌ,7Ë�&{�ü‚±;Óí#ýt(½c4ÛìCÍA³t¡7¾}8]•q¨]|{ßAEºñóg»� Tçά��¹ô°N¯cÏådFgŸç×’@°�¯éa Á)üvÐ(Uj,CÂ(T†Ó®àðFÇrS¸*Ž á0�C‡4‡ÿâðK?àðepøˆÄ·ŠÛÈ‘*YÎÆepEÜTŽ™ÇÊŸåUîî/œr3÷GUq8U‹=EJäqäeI@7„+âè¡s¹Ç¸2žá¤¿½?äÒÑŦqˆR(I�áPŠ1;8ÒÂa=×ÄmçH-‡Q§pÈs8˜C‡rÓ4“£x;‡”Ô.ÌUs7«PÓH+¥dõ@Y! M’7C)Ûè±b55�š™=_Nü"&1šº¿ÚÐu«Ð§’¢T)PõŠŸˆ¿ˆ â]¯¡µoˆwá*|NKeR:q>Úy¦óÉ‹0â4rŽ6ü’�›•z£I­R½‰vØ•f½ÙnTé� GÀy·—9°Ö�UœäÀÑìÀtšH9ðŒ¿tà;|Ñ�-|Ä�=ù§öà·Éüó >èÑ`ãï6èÉ�‚·;pƒWt…S8VŽ<´8�vàiv8ð=¾ìø�ø‡v8øéIþnænÎn¶n™=y¨p—,p`[W v`Ž 2²;�*-]ůlÌ ·åE¡gÅ/·ñï¶H>:&cОß�1§õË·óBˆAs_JÚĨ£Ž\ž—‘ýÄ,£8¹íKFw)úöy1:¦v�8Ms;ûc€ÎïÜ¥ë÷)÷ +Õ|öÕ§vN +²è—¨éÌùù1�7(h 4Qª�¡™»"@CNð‚CdP.æ­Þü îè|÷Qú¥ÖÖÖÖx<‘ue–˜2`,€QWÃ7�Ê«5h�1ƒPù­ñ7[òƒ$Å0æçƒ|‘þO!|‰®¡®ƒø4 ¤oæ=Ñ£C8é áBÜ‹'�A>#PŒ�8ÿ]=c¾×J×àKkÖÀÿÇæ$’ +endstream +endobj +106 0 obj +<> +endobj +107 0 obj +<> +/W [0 [750 0 0 277.83203] 9 [666.99219] 11 16 333.00781 17 [277.83203] 19 28 556.15234 36 37 666.99219 38 39 722.16797 40 [666.99219 610.83984 0 0 277.83203 0 0 556.15234 833.00781 0 777.83203 666.99219 777.83203 722.16797 666.99219] 55 61 610.83984 68 69 556.15234 71 72 556.15234 73 [277.83203 556.15234 556.15234 222.16797] 79 [222.16797 833.00781] 81 83 556.15234 85 [333.00781] 87 [277.83203 556.15234 0 722.16797] 166 2015 556.15234] +/DW 500>> +endobj +108 0 obj +<> stream +xœ]’Ënƒ0E÷þ +/“E„m^‰„�‰E*Í3P¤b�qùûŠ™<¤.ÝÃÜñµ=^^•÷>í¤kp¼Lka™®V¿@?&oíî +ßzlfæåUQßceº‰% çÞôÃâì�o²vºÀ–y¶;˜žoÎy½e^}�ç_Á8.Xšò:æåoÍüÞŒÀ=´íªŒÜmwÎëWÅ÷m®PKJ£§–¹Ñ`ÓK„"åIY–eÊÀ´ÿþGäºtú§±Xí§<B‰Õ�T„J娂*¿@f¨²Õ)XU\”)O”�>®yï.åc±W¶#º5V{l%*) )—¤e|Š'÷É2 E$ÁòáC˜ÓÁ˜`‰0%ë'"{p¢½Rˆèˆ0 RˆXÌ’=Žï@;^Ï�“çåꫵ`^èz•ƒ�ç¼ÍÓ¼ºÖçV³æ +endstream +endobj +5 0 obj +<> +endobj +xref +0 109 +0000000000 65535 f +0000000015 00000 n +0000012867 00000 n +0000000280 00000 n +0000000317 00000 n +0000031253 00000 n +0000000397 00000 n +0000000435 00000 n +0000000899 00000 n +0000001363 00000 n +0000001826 00000 n +0000002291 00000 n +0000002756 00000 n +0000003221 00000 n +0000003685 00000 n +0000004149 00000 n +0000004613 00000 n +0000005078 00000 n +0000005543 00000 n +0000005585 00000 n +0000005624 00000 n +0000005939 00000 n +0000006254 00000 n +0000006562 00000 n +0000006871 00000 n +0000007187 00000 n +0000007496 00000 n +0000007813 00000 n +0000008130 00000 n +0000008439 00000 n +0000008755 00000 n +0000008832 00000 n +0000013379 00000 n +0000018825 00000 n +0000018165 00000 n +0000018093 00000 n +0000017825 00000 n +0000013544 00000 n +0000013435 00000 n +0000013725 00000 n +0000013616 00000 n +0000013906 00000 n +0000013797 00000 n +0000014088 00000 n +0000013978 00000 n +0000014270 00000 n +0000014160 00000 n +0000014452 00000 n +0000014342 00000 n +0000014634 00000 n +0000014524 00000 n +0000014816 00000 n +0000014706 00000 n +0000014998 00000 n +0000014888 00000 n +0000015180 00000 n +0000015070 00000 n +0000015362 00000 n +0000015252 00000 n +0000015511 00000 n +0000015434 00000 n +0000015660 00000 n +0000015583 00000 n +0000015809 00000 n +0000015732 00000 n +0000015958 00000 n +0000015881 00000 n +0000016107 00000 n +0000016030 00000 n +0000016256 00000 n +0000016179 00000 n +0000016405 00000 n +0000016328 00000 n +0000016554 00000 n +0000016477 00000 n +0000016703 00000 n +0000016626 00000 n +0000016853 00000 n +0000016775 00000 n +0000017003 00000 n +0000016925 00000 n +0000017153 00000 n +0000017075 00000 n +0000017303 00000 n +0000017225 00000 n +0000017453 00000 n +0000017375 00000 n +0000017603 00000 n +0000017525 00000 n +0000017753 00000 n +0000017675 00000 n +0000018250 00000 n +0000018387 00000 n +0000018412 00000 n +0000018437 00000 n +0000018462 00000 n +0000018487 00000 n +0000018512 00000 n +0000018537 00000 n +0000018562 00000 n +0000018587 00000 n +0000018613 00000 n +0000018639 00000 n +0000018665 00000 n +0000018919 00000 n +0000019119 00000 n +0000029919 00000 n +0000030170 00000 n +0000030826 00000 n +trailer +<> +startxref +31401 +%%EOF diff --git a/figures/diagrams/timeline-infra.pdf b/figures/diagrams/timeline-infra.pdf new file mode 100644 index 0000000..644f72b Binary files /dev/null and b/figures/diagrams/timeline-infra.pdf differ diff --git a/figures/worksimple/Icon.png b/figures/worksimple/Icon.png new file mode 100644 index 0000000..98c413d Binary files /dev/null and b/figures/worksimple/Icon.png differ diff --git a/figures/worksimple/Logo_Normal.png b/figures/worksimple/Logo_Normal.png new file mode 100644 index 0000000..1b555b8 Binary files /dev/null and b/figures/worksimple/Logo_Normal.png differ diff --git a/figures/worksimple/Logo_SW.png b/figures/worksimple/Logo_SW.png new file mode 100644 index 0000000..1e367f6 Binary files /dev/null and b/figures/worksimple/Logo_SW.png differ