commit 686ee36b4f45efc86a0b8ba2ffa41c521be9aef5 Author: DeeCee03 Date: Fri Oct 16 18:09:07 2026 +0200 HiveGrid Marketing: Hub mit Strategie, Redaktionsplan, Dashboard, Produktionsvorgaben und Webinar Stand 16.10.2026. Enthält das Marketing-Dashboard, die Daten in daten/, die Produktionsvorgaben, Reels und das Webinar mit Skript, Sprechzettel und Präsentation (HTML, PowerPoint, PDF). Co-Authored-By: Claude Opus 5.5 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b42e27 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# macOS +.DS_Store + +# Abhängigkeiten und erzeugte Hilfsdateien +node_modules/ +__pycache__/ +*.json.tmp +webinar/slides/.druck.html + +# Pakete zum Verschicken, lassen sich jederzeit neu bauen +webinar/Paket für Noah/ +webinar/Webinar-Entwurf.zip diff --git a/Brainstorming Kickoff/Kontext/Kontext.md b/Brainstorming Kickoff/Kontext/Kontext.md new file mode 100644 index 0000000..756ea7b --- /dev/null +++ b/Brainstorming Kickoff/Kontext/Kontext.md @@ -0,0 +1,1260 @@ +# HiveGrid: Kontext für das Marketing-Brainstorming + +**Stand:** 05.10.2026 +**Zweck:** Alles, was man über Produkt, Marke, Markt und bisherige Marketingarbeit wissen muss, bevor wir die Strategie neu denken. + +**Grundlage:** +- `hivegrid-cloud`: die Software, Stand 03.10.2026 +- `HiveGrid-Website`: Stand 16.09.2026 +- `posts`: der Instagram-Generator +- die Wochenreports KW 37 bis 40 +- die Bug-Ordner in `Documents` +- der Analytics-Prototyp `dashboard` + +**Lesehilfe:** +- **Belegt** heißt: steht so im Code, in einer Doku oder in der Git-Historie. +- *Vermutung* heißt: abgeleitet, aber nicht direkt nachgewiesen. +- Pfade beziehen sich auf das jeweilige Repo. Die Quellenliste steht am Ende. + +--- + +## 0. Das Wichtigste auf einen Blick + +**Das Produkt** + +1. **HiveGrid ist eine Arbeitsoberfläche für SHK-Betriebe, die um das Branchenprogramm herum gebaut ist.** Sie ersetzt das Branchenprogramm nicht. Leitsatz aus dem Produkt: „KWP bleibt der ERP-Kern. HiveGrid wird die tägliche Arbeitsoberfläche.“ +2. **Das Produkt ist groß und echt, aber noch nicht in allen Teilen fertig.** + - Rund 25 Module: CRM, Leads, Projekte, Plantafel, Aufgaben, Kalender, Terminbuchung, Postfach, E-Mail-Marketing, Formulare, E-Signatur, Automation, Team-Chat, HR, Betriebsmittel, Kundenportal, mobile Web-App und weitere. + - Produktion läuft seit 19.06.2026. + - Live ist zum Beispiel `demo.hivegrid.de`, seit 03.10.2026. + - Nicht live sind unter anderem Zahlungen, Kundenportal, KI-Schnittstelle und die Google-Verifizierung. +3. **Der stärkste echte Unterschied ist die tiefe Anbindung an KWP, PDS und Hilti.** Dazu gehört ein Automations-Editor, der auf Ereignisse aus diesen Systemen reagiert. Das kann laut eigener Wettbewerbsrecherche sonst niemand. +4. **Der Hebel hat eine Grenze:** Er zieht nur bei Betrieben, die KWP oder PDS nutzen. Andere Branchenprogramme sind nicht angebunden, DATEV auch nicht. Eine formelle Partnerschaft mit KWP oder PDS ist nicht belegt. + +**Kunden und Preise** + +5. **Es gibt genau einen belegten Kunden:** die Geerkens GmbH, Noahs Betrieb. Sie ist erster Kunde, Investor und Validierungspartner. **Laut Dejan (05.10.) nutzt aber noch niemand HiveGrid im Alltag, auch Geerkens nicht.** Die Software ist noch nicht betriebsbereit, das soll in etwa 1 bis 2 Wochen so weit sein (Abschnitt 13, F5). +6. **Preise stehen im Code:** Core 199 €, Swarm 499 €, Colony 999 € netto im Monat, mit 12 Monaten Bindung 179, 449 und 899 €. Alle Pakete haben denselben Funktionsumfang und unterscheiden sich nur bei Plätzen und Speicher. **Öffentlich sind die Preise nicht.** Die Website zeigt „Die Preise kommen bald“. +7. **Der Vertrieb läuft über Gespräche und Demos, nicht über Selbstbuchung.** + - Die Website führt auf „Erstgespräch vereinbaren“ (Cal-Buchung bei Haris). + - Der Vertrieb legt jedem Interessenten einen eigenen Demo-Workspace mit 30 Beispiel-Automationen an. + - Bezahlte Selbstbuchung ist gebaut, aber gesperrt (Mollie-Live und Firmierung offen). + +**Marke und Markt** + +8. **Die Marke ist klar und eigenständig.** + - „Verbinden statt ersetzen“, „Neue Software? Brauchst du nicht!“, „Ein Betrieb ist kein Rechteck“. + - Gelb `#F1B729`, Wabe, Chamfer, Manrope, Du-Ansprache. + - Strenge Sprachregeln: keine erfundenen Zahlen, kein Lob, keine Geviertstriche. +9. **Die Gründergeschichte ist der emotionale Kern:** Noah Geerkens, SHK-Betrieb in vierter Generation, konnte das Branchenprogramm nicht wechseln und wollte trotzdem mehr. Es gibt ein echtes Selfie-Video von Noah. +10. **Die Positionierung ist laut Recherche frei.** Von 15 Wettbewerbern sagt keiner „du musst nicht wechseln“. Alle versprechen All-in-One, alle werten das Bestandssystem ab. +11. **Zielgruppe laut Bitkom-Daten:** überlastet und uninformiert, nicht ablehnend. + - Größte Angst ist Kontrollverlust, nicht Funktionsversagen. + - Größtes Hemmnis ist IT-Sicherheit und Datenschutz (96 %). + - KI ist für 84 % „kein Thema“. + +**Was das Marketing betrifft** + +12. **Es gibt mehrere Widersprüche zwischen Marketing und Produkt, die man vor jeder Kampagne auflösen muss:** + - **DATEV:** Die Website nennt DATEV im Hero, in der FAQ und in der Wabe. Im Produkt gibt es kein DATEV. + - **„100 % in Deutschland, ohne US-Beteiligung“:** Cloudflare (USA) sitzt vor der Produktion, die Website liegt bei Scaleway in den Niederlanden. + - **Rechnungen:** Die Website verspricht „Angebote & Rechnungen“ und „Rechnungs-Automatik“. Das Produkt baut Rechnungen bewusst nicht. + - **SEO:** Der SEO-Titel verspricht All-in-One im Sie, also genau das Gegenteil der Positionierung. +13. **Die Produktposts auf Instagram sind seit 17.09.2026 gestoppt.** Das hat ein Call mit Noah und David entschieden. Danach gab es ein Brainstorming von Dejan und David, Schwerpunkt seitdem: **Reels mit Noah**. Zwei fertige Posts (Form Builder, E-Mail-Marketing) liegen unveröffentlicht bereit. +14. **Die Kapazität für Marketing ist gerade knapp.** + - Seit KW 37 geht der Großteil von Dejans Zeit ins Bughunting für den Release. + - Die Website-Nacharbeit aus Noahs Review ist seit vier Wochen offen. + - Auf den Produktseiten fehlen weiterhin echte Software-Screenshots. +15. **Es gibt Material, das kaum genutzt wird:** + - der Demo-Workspace mit realistischen SHK-Daten + - 30 erklärte Beispiel-Automationen („Golden Flows“) + - ein Instagram-Generator mit fertigem Bewegtbild-Export + - Video-Einblendungen für Noahs Videos + - rund 400 Seiten Markt- und Wettbewerbsrecherche + - ein Webinar-Konzept + +--- + +## 1. Firma und Team + +### 1.1 Firma + +| | | +|---|---| +| Name | **HiveGrid GmbH i. G.** (in Gründung, Handelsregister noch nicht eingetragen) | +| Sitz | Xantener Straße 235a, 47495 Rheinberg | +| Geschäftsführer | Noah Geerkens | +| Vorher | Bis 14.09.2026 stand auf den Rechtsseiten „R&D² UG“, vertreten durch Raffael Sheikh | +| Technisches Umfeld | **ToolCtrl** (`tool-ctrl.de`): Gitea, Plane, gemeinsame Infrastruktur. HiveGrid ist dort „ein Workload“ neben anderen Projekten. Die Produktion ist bewusst als „Spin-off-Grenze“ in einem eigenen Hetzner-Account getrennt (AD-24). | +| Kontakt | `info@hivegrid.de`, `datenschutz@hivegrid.de`. **Auf der Website steht keine Telefonnummer.** | + +### 1.2 Team laut Website + +| Person | Rolle (Website) | Was belegt ist | +|---|---|---| +| **Noah Geerkens** | CEO & Gründer | Handwerksmeister SHK, vierte Generation. Geschäftsführer der Geerkens GmbH. Erster Kunde, Investor und **finale Freigabe für alle externen Texte**. Baut eigene interne Tools. | +| **Raffael Sheikh** | COO & Engineering | Hauptentwickler (über 10.000 Commits). Verantwortet Produktion und Infrastruktur. Führt die Gespräche mit KWP, PDS, Mailjet und Hetzner. | +| **David Bertram** | Produkt & Design | Screens in Subframe, Marken-Tokens. Vergibt das Bughunting-Schema, reviewt Instagram-Posts, hat die Software auf einem Networking-Event gepitcht. Laut Dejan auch COO und Head of Product und unterstützt im Marketing (13, F15). | +| **Dejan Cosic** | Marketing & Brand | Website, Instagram, Rechtstexte mit Anwalt, SEO. Derzeit zu einem großen Teil im Bughunting. Betreut den externen Code-Review (Previty). | +| **Aki** (Akeshan Kunarajah) | Full-Stack Engineering | Zweiter Entwickler (über 3.000 Commits). Arbeitet die Bughunt-Funde ab. | +| **Haris Sejmen** | Vertrieb | Kalender für Erstgespräche, Demos, Zielkundenliste, Pitch, Copy für den Vertrieb | +| **Michelle Spiekermann** | Design & Verwaltung | | +| **Arthur Messerschmidt** | System-Infrastruktur | | + +**Noahs Schwester** führt den Familienbetrieb mit. Im Marketing taucht sie nicht auf. + +### 1.3 Arbeitsweise + +- **Entwicklung:** ticket-getrieben in Plane (`project.tool-ctrl.de`), Code in Gitea (`git.tool-ctrl.de`). Jeder Merge geht automatisch auf Staging. Produktion bekommt nur geprüfte Stände per „Promote“. +- **Stark KI-gestützt:** Rund 1.000 Commits tragen Claude als Co-Autor, dazu kommt OpenAI Codex. +- **Freigaben:** + - Noah gibt externe Texte frei. + - David reviewt Posts. + - Wochenreport donnerstags, Teammeeting freitags. + - Externer Code-Review durch den Dienstleister **Previty**. Die Befunde sind schon eingebaut. + +--- + +## 2. Das Produkt + +### 2.1 Was HiveGrid ist + +HiveGrid bündelt in einer Web-Oberfläche alles, was im Betrieb um das Branchenprogramm herum passiert: Kunden, Anfragen, Projekte, Einsatzplanung, Kommunikation, Formulare, Personal und Automatisierung. + +**Das Branchenprogramm bleibt.** Rechnungen, Buchhaltung, Zeiterfassung und Lager baut HiveGrid ausdrücklich nicht nach (Anti-Liste in `.agents/rules/ui-and-definition-of-done.md`). Stattdessen liest und schreibt HiveGrid in KWP und PDS und reagiert auf deren Ereignisse. + +**Datenmodell (AD-20):** Alles hängt an einem Projekt. Eine Anfrage wird nach Freigabe zum Projekt. Vertrieb und Abwicklung sind nur verschiedene Pipeline-Sichten auf denselben Vorgang, keine kopierten Datensätze. + +**Bei Geerkens ersetzt HiveGrid** HubSpot (CRM), Quiply (Team-Chat), Zapier und n8n (Automation) sowie mehrere Excel-Prozesse (`.planning/PROJECT.md`). Genau das ist der eigentliche Nutzen: HiveGrid ersetzt nicht das ERP, aber den Wildwuchs drumherum. + +### 2.2 Module und Reifegrad + +**Reifegrade:** +- **Produktiv:** läuft im Produkt. +- **Pilotreif:** gebaut und auf Staging geprüft. +- **Gebaut, Abnahme offen:** Code fertig, aber Freigabe, Live-Test oder Prüfung bei einem Anbieter fehlt. +- **Prototyp:** zeigt nur Beispieldaten oder ist ein Entwurf. + +| Modul | Was es kann (Kurzfassung) | Stand | +|---|---|---| +| **CRM: Kontakte, Firmen** | Privatpersonen und Organisationen, Status (Kunde, Bestandskunde, Interessent), Tags, eigene Felder, Dubletten zusammenführen, Aktivitätsverlauf. Bei verbundenem KWP gibt es einen Kasten „Live aus KWP“. | produktionsnah, im Oktober viel Feinschliff | +| **Leads, Anfragen** | Quellen: Formular, API, Webhook, Mail, Telefon, Buchung. Arbeitsliste nach Fälligkeit, Freigabe Ja/Nein/Unklar, daraus wird das Projekt. Anti-Spam mit Quarantäne, E-Mail-Sequenzen, Auswertung. Startet mit 5 SHK-Anfragearten (Heizungstausch, Wärmepumpe, Bad-Sanierung, Wartung, Notdienst). | produktionsnah, sehr aktiv | +| **Projekte, Pipelines** | Board, Liste, Detail. SHK-Pipelines (Wärmepumpe, PV, Bad). Feldrechte pro Rolle. „Übergabe auswählen“ beim Wechsel in eine andere Pipeline. Projektakte mit Mängeln, Checklisten, Abnahmeprotokoll. Kunde füllt Formulare per Link aus. | produktionsnah | +| **Plantafel** | Einsätze pro Monteur und Tag. Konfliktprüfung gegen Doppelbelegung, Urlaub und abgelaufene Qualifikationen. Termine aus KWP und PDS werden mit angezeigt. Kein Drag & Drop. | im Einsatz, Optik offen | +| **Übergabekette** (Prozess-Engine) | Schritte mit Fertig-Kriterium und Nachweis. Der nächste Schritt wird erst frei, wenn der vorige quittiert ist. Beispiel: Geerkens-Wärmepumpenprozess mit 17 Schritten. | Grundstufe gebaut, im Büro noch nicht zuweisbar | +| **Aufgaben** | Status, Priorität, Fälligkeit, Checklisten, Erinnerungen. Lassen sich aus E-Mail oder Chat anlegen. | produktiv | +| **Kalender** | Google und Microsoft mit Sync in beide Richtungen, Serien, Terminarten | gebaut, Google-Verifizierung offen | +| **Terminbuchung** | Öffentliche Buchungsseiten wie bei Calendly: Link, Einbettung, QR-Code. Der Kunde kann selbst stornieren oder verschieben. **Nur Online-Termin und Rückruf, kein Vor-Ort-Termin.** | produktionsnah | +| **Postfach** | Gmail oder Microsoft 365. Mails werden Kontakt, Lead und Projekt zugeordnet. Zurückstellen, Vorlagen, aus der Mail eine Aufgabe machen. Rework im Stil von Gmail Ende September. | gebaut, Google-Verifizierung offen | +| **E-Mail-Marketing** | Kampagnen, Segmente, Double-Opt-in, Pflicht-Footer, Prüfung vor dem Versand, A/B, Auswertung | pilotreif, Mailjet-Nachweis offen. **Kostenpflichtiges Add-on**, siehe 6.3 | +| **Form Builder** | 13 Feldtypen inkl. Foto und Unterschrift, bedingte Sichtbarkeit. Veröffentlichen per Link, QR-Code oder Einbettung. Eine Einsendung wird zu Lead, Kontakt, Projekt oder Aufgabe. SHK-Vorlagen dabei. | produktionsnah | +| **E-Signatur** | Selbst betrieben: PDF, mehrere Unterzeichner, Zeitstempel, Zertifikat. PandaDoc optional. Einfache elektronische Signatur, keine qualifizierte. | gebaut, juristische Prüfung offen | +| **Automation** | Visueller Editor. **57 Auslöser, 64 Aktionen, 14 Bausteine zur Ablaufsteuerung**, darunter Ereignisse aus KWP, PDS und Hilti. Probelauf ohne Wirkung, 24 Stunden rückgängig machen, Schleifen- und Mengenschutz, Notizzettel auf der Fläche. | der am stärksten ausgebaute Teil, Kern pilotreif | +| **Team-Chat** | Gruppen, Direktnachrichten, Projektkanäle, Threads, Sprachnachrichten, aus einer Nachricht eine Aufgabe machen. **Kundenkanal am Projekt** („Der Kunde liest mit“). | pilotreif, sehr aktiv | +| **Dashboard** | Persönliche Seiten mit Kacheln. Von 114 Widgets sind 30 Kern-Widgets freigeschaltet. Davon zeigen am 01.10. erst 11 echte Daten, 5 rechnen noch falsch (siehe 11.3). | in Arbeit, Rework läuft | +| **Analytics** | Übersicht, Finanzen, Aufträge, Kunden, Team. **Zeigt sichtbar „Prototypdaten“.** | Prototyp | +| **Suche, Benachrichtigungen, Audit** | Cmd+K über alles. Audit-Protokoll mit Hash-Kette. | produktionsnah | +| **HR und Passwort-Safe** | Urlaub, Krankmeldung, Anträge, Mitteilungen mit Lesebestätigung, Umfragen. **Lohnabrechnungen werden automatisch zugeordnet.** Qualifikationen mit Ablaufdatum (DGUV, ArbMedVV, Führerschein). Passwort-Tresore. | pilotreif | +| **Betriebsmittel** | Fahrzeuge, Werkzeuge, IT, Prüftermine, Schäden, Kosten. Optional mit Hilti ON!Track. Vorbild war Geerkens' eigene Lösung. | gebaut, pro Workspace freigeschaltet, ohne Preis | +| **Dateien** | Uploads, die nach Abbruch weiterlaufen. HEIC wird umgewandelt. Virenscan, Versionen, Freigaben. | produktionsnah | +| **Kundenportal** | Endkunde sieht Projektphasen, lädt Dokumente hoch, schreibt dem Betrieb (landet im Projektchat), meldet Reklamationen. Zugang für Subunternehmer. Eigene Domain möglich. | technisch fertig auf Staging, Design offen, nicht live | +| **Mobile (Monteur)** | Installierbare Web-App (PWA): Heute, Projekte, Aufgaben, Chat. Navigation per Tipp auf die Adresse, Foto-Doku, Formulare mit Unterschrift **offline**. Ehrlicher Sync-Status, nur vier Push-Anlässe. | weitgehend fertig, Android nicht auf Geräten geprüft | +| **Desktop-App** | Electron-Hülle um die Web-App | Prototyp, nicht verteilt | +| **Demo-System** | „Kunden-Demo erstellen“ im Admin. Pro Interessent ein eigener Workspace mit PDS oder KWP, Google oder Microsoft. 40 Firmen, 202 Projekte, rund 2.000 Chatnachrichten, **30 erklärte Beispiel-Automationen**. Alles nach außen ist simuliert. | **live seit 03.10.2026** | +| **KI über MCP** | Siehe Abschnitt 4 | auf Staging fertig, nicht live | + +### 2.3 Was besonders ist + +Das sind die Argumente mit Differenzierungspotenzial: + +1. **Um das ERP herum statt dagegen.** Tiefe, vertraglich abgesicherte Anbindung: KWP mit 113 katalogisierten Operationen, PDS mit 156, Hilti mit 63. Herkunft ist sichtbar („Live aus KWP, Nur lesen“). +2. **ERP-Ereignisse lösen Automationen aus.** Zum Beispiel „Neues PDS-Projekt erkannt“ oder „KWP-Rechnung: Status geändert“. Für Handwerkersoftware ist das selten. +3. **Automatisierung ohne Angst.** Probelauf in Klartext, 24 Stunden rückgängig machen, Schutz vor Schleifen und Massenaktionen. Eine KI darf Automationen nur als deaktivierten Entwurf anlegen, ein Mensch schaltet sie frei. Das passt genau zur Kontrollverlust-Angst der Zielgruppe (Abschnitt 7.2). +4. **Ein Vorgang von der Anfrage bis zur Abnahme.** Ein Projekt, mehrere Sichten, keine doppelten Datensätze. +5. **Monteur-App mit ehrlichem Offline-Betrieb.** Noah selbst: „Das ist der Kernfehler von KWP und PDS: ERP-Logik auf den Handy-Bildschirm gepresst, Kopplungszwang, halbes Offline. Machen wir nicht.“ Und: „Halbes Offline ist schlimmer als keins, weil es Vertrauen kostet.“ +6. **Kundenkanal statt WhatsApp.** Kundennachrichten laufen in den Projektchat, getrennt vom internen Chat. Zitat aus der Planung: „Mit Kundenchat sind wir allen voraus.“ Noch nicht live. +7. **„Bring deine eigene KI“.** Claude oder ChatGPT arbeiten per MCP mit Rechten, Bestätigung und Protokoll. Im Handwerk sehr früh dran. Noch nicht live. +8. **Ab Tag 1 auf SHK zugeschnitten.** Anfragearten, Pipelines, DGUV-Qualifikationen mit Warnung in der Plantafel, Betriebsmittel mit Prüfterminen. +9. **Einfaches Preismodell.** Alle Funktionen in jedem Paket. Baustellen-Plätze ab 13,50 €. +10. **Datenschutz als Bauprinzip.** Mandantentrennung in der Datenbank, Schlüssel pro Betrieb, Hosting in Falkenstein, keine eingebaute US-KI. +11. **HR mit Passwort-Safe und Lohnabrechnungs-Zuordnung.** Für Handwerkssoftware ungewöhnlich. +12. **„Erst beschreiben, dann automatisieren“.** Die Übergabekette macht den Prozess sichtbar, bevor automatisiert wird. Noah nennt das „ein Verkaufsargument, das kein anderes Handwerks-Tool hat“. Im Büro noch nicht nutzbar. + +**Eher Standard am Markt:** Kontakte, Aufgaben, Kalender-Sync, Buchungsseiten, Formular-Builder, Newsletter-Versand, Chat, Dateiablage. Der Mehrwert liegt in der Verknüpfung, nicht im einzelnen Modul. + +### 2.4 Was bewusst fehlt oder unfertig ist + +**Kaufmännischer Teil** +- Keine Angebote, keine Rechnungsstellung, keine Buchhaltung. +- Kein DATEV, Lexware, sevDesk, XRechnung, GAEB oder DATANORM. +- Keine Zeiterfassung, kein Lager. +- Laut Noahs Marktanalyse ist Zeiterfassung „bei allen vier Wettbewerbern DAS Kernfeature Nr. 1“. + +**Anbindungen** +- Ohne KWP oder PDS gibt es keine ERP-Anbindung. Taifun, TopKontor und Streit kommen erst „bei einem konkreten zahlenden Kunden“. + +**Noch nicht live oder nicht geprüft** +- Selbstbuchung mit Zahlung ist gesperrt. Eine Standard-Testphase gibt es nicht (voreingestellt sind 0 Tage). +- Kundenportal, MCP und Plugins sind nicht in Produktion. +- Google-Verifizierung ist offen. Folge: Warnung „nicht überprüft“ beim Verbinden, Grenze bei rund 100 Nutzern. +- Microsoft, Aircall und HalloPetra sind ohne Live-Nachweis bei einem Kunden. +- Analytics zeigt Prototypdaten. Auf dem Dashboard zeigen erst 11 von 30 Kern-Widgets echte Daten. +- Kein Modul ist bisher ausdrücklich für den Einsatz bei echten Kunden freigegeben (Abnahmeprotokolle aus dem Bughunting, Abschnitt 11). +- Kein CSV-Import im Self-Service gefunden. +- Das Help-Center wurde entfernt, es gibt nur 7 FAQ-Fragen. + +**Datenschutz-Unterlagen** +- AVV-PDF und Liste der Subprozessoren fehlen. +- Kein externer Pentest. +- 2FA ist für Kunden nicht erzwingbar. + +**Sprachen und Desktop** +- Übersetzungen liegen für Polnisch, Ukrainisch, Russisch und Ungarisch vor. Aktiv sind nur Deutsch und Englisch, bis Muttersprachler geprüft haben. +- Die Desktop-App ist nur ein Prototyp. + +### 2.5 Rollen im Produkt + +Bezahlt wird nach Platz: **Büro-Platz** oder **Baustellen-Platz**. Der Monteur zählt als Baustelle. + +| Rolle | Was sie tut | +|---|---| +| Admin (Inhaber) | volle Rechte, Team und Abo. Bewusst kein HR-Vollzugriff. | +| Vertrieb | Kontakte, eigene Leads, Projekte, Termine | +| Marketing | Leads, Formulare, Marketing-Mails | +| Innendienst | Projekte, Aufgaben, Dateien, HR-Verwaltung, Termine, Postfach | +| Buchhaltung/Verwaltung | nur Abo und Mitglieder lesen | +| Monteur | eigene Projekte, Aufgaben, Abnahme, eigene HR-Daten, Chat, mobile App | + +Dazu kommen Endkunde und Subunternehmer (nur Portal) und ein externer KI-Client (mit den Rechten der Person, die ihn verbunden hat). + +### 2.6 Begriffe aus der Oberfläche + +**Pakete und Menü** +- Pakete: Core, Swarm, Colony, Enterprise. Plätze: Büro-Platz, Baustellen-Platz. +- Menü: Übersicht, Kunden, Projekte, Kommunikation, Organisation, Automation. + +**Leads, Projekte, Planung** +- Arbeitsliste, Eingang, Weiterverarbeitungsfreigabe, Anfrageart +- Pipeline, Phase, „Übergabe auswählen“, Projektakte, Abnahmeprotokoll, Mängel +- Plantafel, Einsätze, Übergaben, Fertig-Meldung + +**Organisation und Kommunikation** +- Betriebsmittel, Personal, Passwort-Safe, Qualifikationen +- Postfach, Zurückstellen, Kampagnen, Segmente, Buchungsseiten +- Kundenkanal, „Der Kunde liest mit“, Kundenportal + +**Automation, KI, Mobil** +- Automationen, Auslöser, Aktionen, Probelauf, Ausführungen. Intern im Vertrieb heißen die Beispiel-Abläufe „Golden Flows“. +- „Mit KI verbinden“, „KI-Aktion“ +- Mobil: Heute, Projekte, Aufgaben, Chat, Mehr. Dazu der Sync-Status „Nur auf diesem Gerät“. + +--- + +## 3. Integrationen + +| Anbindung | Was | Stand | Partnerschaft | +|---|---|---|---| +| **PDS** | Branchensoftware | **Am reifsten.** Alle 19 Automations-Bausteine am echten Testmandanten belegt. Schreiben ist Standard seit 08.09. | Testzugang von PDS am 05.08. Am 25.08. Anfrage nach einem „offiziellen Prozess für eine Partner-App“, Antwort nicht belegt. | +| **KWP** | ERP von Geerkens | Lesen läuft. Schreiben nur für einzeln bewiesene Aktionen (Aufgaben, Termine, Ansprechpartner). Projekte anlegen in KWP ist bewusst verboten. Seit 11.09. für alle Kunden einrichtbar. | Zugang über die KWP-Installation von Geerkens, technischer Kontakt bei KWP vorhanden. Kein Partnervertrag belegt. | +| **Hilti ON!Track** | Geräte, Werkzeuge | Pilot abgeschlossen | öffentliche API | +| **Google** | Kalender, Gmail | gebaut, Verifizierung durch Google offen | Standard-OAuth | +| **Microsoft** | Outlook, Kalender | gebaut, Live-Nachweis offen | Standard-OAuth | +| **HalloPetra** | KI-Telefonassistent für Handwerker | gebaut, Staging grün, in der Demo enthalten | API-Schlüssel | +| **Aircall** | Telefonie | gebaut, pausiert | Partnerzugang fehlt | +| **Artesa** | weiteres Handwerkersystem | Code fertig, kein Testkonto | keine | +| **Mailjet, Lago, Mollie** | Versand, Abrechnung, Zahlung | Mailjet aktiv. Zahlungen gesperrt. | Dienstleister | +| **Slack, Discord, Mailchimp, HubSpot, Brevo** | Leads weiterleiten | Adapter vorhanden | keine | +| **Öffentliche API, Webhooks** | rund 57 Pfade, OpenAPI | gebaut. SDK nicht öffentlich. | | +| **DATEV** | Buchhaltung | **gibt es nicht**, ausdrücklich ausgeschlossen | | + +**Zwei Dinge, die der Vertrieb wissen muss:** +- **PDS-Kunden** brauchen die kostenpflichtige Lizenz „pds API“. +- **KWP-Kunden** brauchen beauftragte API-Bereiche, und die Einrichtung läuft je Kunde separat. + +Für Interessenten entsteht also Zusatzaufwand und Zusatzkosten beim eigenen ERP-Hersteller. Das ist ein absehbarer Einwand. + +**Website-Recherche vom 12.09.2026** (`HiveGrid-Website/docs/recherche/10-integrationen-freigabe.md`): 168 Branchensysteme mit API sind erfasst. Noah hat davon 12 mit Logo freigegeben. + +--- + +## 4. KI und MCP + +**HiveGrid hat keine eingebaute KI** (Entscheidung AD-26): kein Chatbot, kein eigenes Sprachmodell, kein KI-SDK im Code. Die Entwicklerregeln verbieten OpenAI- und Anthropic-SDKs im Produkt. + +**Stattdessen ist HiveGrid ein MCP-Server** (Model Context Protocol) auf `mcp.hivegrid.de`: +- Der Kunde verbindet seine eigene KI (Claude, ChatGPT, Copilot, Cursor, Gemini CLI, Codex) per OAuth 2.1 über den Dialog „Mit KI verbinden“. +- **22 Werkzeuge.** Die Website nennt veraltet 15. + - 15 lesen Leads, Kontakte, Projekte, Pipelines, Aktivitäten, Aufgaben und den Automationskatalog. + - 7 schreiben: Lead anlegen, Lead in Projekt umwandeln, Phase setzen, Aktivität anlegen, Aufgabe anlegen, Aufgabenstatus setzen, Automations-Entwurf anlegen (immer deaktiviert). +- Jede Schreibaktion braucht eine Bestätigung und erscheint im Verlauf als „KI-Aktion“. Rechte gelten pro Mitarbeiter. + +**Stand:** auf Staging fertig und am 03.07. mit Claude getestet. Die Freigabe für Produktion ist bewusst verschoben. Die Website nennt es „Pilot“. + +**Ehrlicher Hinweis:** Wer MCP nutzt, schickt Daten an den KI-Anbieter seiner Wahl, also oft in die USA. + +**Die Website-Seite „KI-Brücke“** (`/ki-anbindung`) existiert. Am 14.09. wurde sie „vorerst“ von der Landing genommen. + +**Markt:** Für 84 % der Betriebe ist KI „kein Thema“, nur 4 % setzen sie ein (Bitkom 2025). Trotzdem sagt Noah in der Gründergeschichte: „Wir wollten mehr. KI-Lösungen.“ + +**Ein weiterer KI-Bezug:** HalloPetra, der KI-Telefonassistent eines Partners. Abgeschlossene Anrufe landen mit Zusammenfassung in HiveGrid. + +--- + +## 5. Technik, Hosting, Datenschutz, Tempo + +### 5.1 Fakten + +**Hosting** +- **Produktion seit 19.06.2026** in einem eigenen Hetzner-Account in **Falkenstein, Sachsen** (fsn1). +- Datenbank ohne öffentlichen Port. Dateispeicher ebenfalls in Falkenstein. + +**Selbst betriebene Dienste** +- Suche, Virenscan (ClamAV), Captcha, Fehler-Tracking, Abrechnung (Lago), E-Signatur. + +**Anbieter** +- Mail: Mailjet (EU). +- Zahlung: Mollie (Niederlande). + +**Sicherheit** +- **Mandantentrennung direkt in der Datenbank:** Row-Level-Security auf mehreren hundert Tabellen, in CI live geprüft. +- **Schlüssel pro Betrieb** für Zugangsdaten zu Fremdsystemen. Beim Löschen eines Betriebs wird sein Schlüssel vernichtet. +- **Login:** kein Login über Google, Apple oder Microsoft. Dafür 2FA, Magic Link und eine Geräteübersicht. +- **Dateien:** Jeder Upload wird auf Viren geprüft. Ist der Scan nicht möglich, wird der Upload abgelehnt. +- **Prozess:** `security.txt`, Meldeweg mit Antwort in 48 Stunden, Notfallplan mit der 72-Stunden-Frist der DSGVO. + +**Größe** +- 481 Datenbank-Modelle und rund 580 Routen. +- Rund 26.000 Testfälle. +- Rund 1,1 Mio. Zeilen Code ohne Tests. Davon ist viel generiert und KI-geschrieben, deshalb taugt die Zahl nicht als Qualitätsargument. + +### 5.2 Was man belegt sagen darf + +- „Server und Kundendaten in Deutschland: Hetzner, Rechenzentrum Falkenstein.“ +- „Strikte Mandantentrennung direkt in der Datenbank.“ +- „Zugangsdaten zu deinen Systemen werden pro Betrieb mit eigenem Schlüssel verschlüsselt.“ +- „Jede hochgeladene Datei wird auf Viren geprüft.“ +- „Kein Login über Google, Apple oder Microsoft.“ +- „HiveGrid trainiert keine KI mit deinen Daten und hat keine eingebaute US-KI.“ +- „Anbindung statt Nachbau: PDS, KWP und Hilti ON!Track.“ Bei KWP mit dem Zusatz: Lesen, Schreiben schrittweise. +- „Automationen mit Probelauf und 24 Stunden Rückgängig.“ +- „Jede Änderung läuft erst auf einer Testumgebung.“ +- „Über 1.300 geprüfte Änderungen seit Juni“, gemessen an den gemergten Pull Requests. + +### 5.3 Wo man vorsichtig sein muss + +- **„100 % in Deutschland“ und „komplett ohne US-Beteiligung“:** stimmt so nicht. + - Cloudflare (USA) ist DNS und Proxy vor App, API und Demo. + - Die Website liegt bei Scaleway, Server in den Niederlanden. + - Google- und Microsoft-Anbindungen sind US-Dienste nach Wahl des Kunden. + - Besser: „Hosting und Datenbank in Deutschland. Keine US-KI im Produkt.“ +- **„DSGVO-konform“ als Zusage oder Zertifikat:** + - Es gibt kein ISO 27001, kein BSI C5 und keinen externen Pentest. + - AVV und Subprozessorenliste fehlen noch. + - Die Website zeigt ein heyData-Siegel. Was es genau abdeckt, ist nicht geprüft. +- **DATEV, Rechnungen, Desktop-App, App aus dem App-Store, Plugins, „komplett offline“, Online bezahlen:** nicht oder nicht live. +- **„KI-entwickelt“:** stimmt, ist aber zweischneidig. Für die Entwicklung werden US-KI-Dienste genutzt. + +### 5.4 Tempo in Zahlen + +| Kennzahl | Wert | +|---|---| +| Erster Commit | 05.05.2026, als Boilerplate. HiveGrid-Arbeit seit 04.06.2026. | +| Commits gesamt | rund 16.300, an 144 Tagen | +| Gemergte Pull Requests | Juli 238, August 555, September 479. Im August und September rund 16 pro Tag. | +| Versionen | keine echten Release-Versionen. „1.7.0“ in `package.json` ist ein Rest aus der Boilerplate. | + +--- + +## 6. Geschäftsmodell und Preise + +### 6.1 Grundlogik + +- Monatliches Abo pro Betrieb. +- **Alle Pakete haben denselben Funktionsumfang.** Unterschiede gibt es nur bei Plätzen und Speicher. +- Zusatzleistungen laufen als Add-ons. +- Paketnamen aus dem Bienenbild: Hive, Core, Swarm, Colony. + +### 6.2 Pakete + +Alle Preise netto. + +| Paket | monatlich | 12 Monate Bindung (monatlich bezahlt) | Büro inkl. | Baustelle inkl. | Speicher | +|---|---:|---:|---:|---:|---:| +| Core | 199 € | 179 € | 2 | 5 | 100 GB | +| Swarm | 499 € | 449 € | 5 | 15 | 500 GB | +| Colony | 999 € | 899 € | 10 | 30 | 2 TB | +| Enterprise | individuell | | | | ab etwa 50 Mitarbeitenden, betreutes Onboarding Pflicht | + +**Zusatzplätze:** +- Büro: 59, 39 oder 35 €. +- Baustelle: 25, 19 oder 15 €. +- Mit Bindung jeweils 10 % weniger. + +**Preispsychologie (wörtlich):** „Core bleibt als Einstieg fair, skaliert aber bewusst unattraktiver. Swarm soll der klare Sweet Spot sein.“ + +**Geplante Außenkommunikation:** „Pakete ab 179 EUR / Monat“, Baustellen-Nutzer „ab 13,50 EUR“. + +**Tarifberater:** Bei der Registrierung ist er eingebaut und empfiehlt die günstigste Kombination. + +### 6.3 Add-ons + +- **E-Mail-Marketing:** + - S 59 € (10.000 Mails), M 149 €, L 249 €, XL 499 €, XXL 899 € (500.000 Mails). + - **Widerspruch:** Change-Request CR-028 vom 04.08. und die Preisübersicht für den Vertrieb sagen „1.000 Marketing-Mails inklusive“. Der aktuelle Code (`plans.ts`) sagt: nicht enthalten, nur als Add-on. Vor jeder Außenkommunikation klären. +- **Kundenportal:** 19,99 € im Monat für Core und Swarm, bei Colony inklusive. Eigene Domain 299,99 € einmalig. +- **Speicher:** +500 GB für 6,99 €, +1 TB für 12,99 €, +5 TB für 60,99 €. +- **Betriebsmittel und Hilti:** pro Workspace, noch ohne Preis. + +### 6.4 Was offen ist + +- **Öffentliche Preise:** Die Website zeigt Pakete unscharf hinter einem Absperrband und „Angebot anfordern“. Die Paketnamen dort (Start, Wachstum, Team, Enterprise) sind Platzhalter und passen nicht zum Code. +- **Founding-Member-Angebot:** geplant als „Early-Bird-Jahresdeal mit begrenzten Plätzen“, Konditionen fehlen. +- **Testphase:** keine. +- **Zahlung im Produkt:** gesperrt, bis Mollie-Live und Firmierung abgeschlossen sind. +- **Kunden heute:** laufen über Sonderverträge (wie Geerkens). + +--- + +## 7. Markt, Zielgruppe, Wettbewerb + +### 7.1 Zielgruppe laut Team + +- **„Multi-Kunden-SaaS für den gesamten SHK-Markt“**, breiter auch „mittelständische Handwerksunternehmen“. +- **Profil:** „SHK-Betriebe mit mehreren Mitarbeitern, vielen Kundenanfragen und parallelen Projekten“, die heute zwischen CRM, Excel, E-Mail, Chat, Kalender, Telefonie und ERP hin und her kopieren. +- **Wichtigste Leads:** KWP-Nutzer, inzwischen auch PDS-Nutzer. +- **Personas:** Geschäftsführer (Überblick), Büro und Vertrieb, Monteure, Personalverantwortliche. +- **Der Monteur ist der Maßstab** für Design-Entscheidungen: „draußen, eine Hand, Handschuhe, kein Netz im Keller.“ +- **Noah über die Rolle als Chef:** „Ich kriege das, was in meinem Kopf ist, nicht in die Ausführung. Nicht weil die Leute nicht wollen, sondern weil das Wissen an einem anderen Ort liegt als die Arbeit.“ +- **Größe uneinheitlich:** + - Pakete: 7 bis 40 Nutzer. + - FAQ der Website: „am stärksten ab etwa 15 Leuten“. + - Webinar-Plan: Kleinstbetriebe mit 2 bis 5 Leuten. + - Wettbewerbsrecherche: 5 bis 50. + - *Vermutung:* Der Kern sind SHK-Betriebe mit etwa 10 bis 50 Leuten und KWP oder PDS im Einsatz. + +### 7.2 Die Zielgruppe in Zahlen + +Quelle: `HiveGrid-Website/docs/landing-recherche.md` §6. + +**Bitkom, Digitalisierung des Handwerks, n=504, veröffentlicht 01/2026:** + +| Aussage | Anteil | +|---|---:| +| „Wir haben zu viel zu tun, um uns mit der Digitalisierung zu beschäftigen.“ | 72 % | +| „Digitale Anwendungen lohnen sich nur für größere Handwerksunternehmen.“ | 59 % | +| „Wir haben keinen Überblick darüber, was es alles gibt.“ | 58 % | +| „Software bestimmt bald, wie Handwerker arbeiten müssen.“ | 52 % | +| „Digitalisierung führt zur ständigen Überwachung.“ | 56 % | +| Hemmnis IT-Sicherheit und Datenschutz | **96 %** | +| Hemmnis Investitionskosten | 69 % | +| Digitalisierung als Chance | 89 % | +| KI ist „kein Thema“ | 84 % | +| KI im Einsatz | 4 % | + +Was daraus folgt: +- Der Markt ist überlastet und uninformiert, nicht ablehnend. +- Die Angst ist **Kontrollverlust**. „Verbinden statt ersetzen“ ist die direkte Antwort darauf. + +**Forsa für IKK classic, n=504, 11/2025:** +- 84 % sind stolz auf ihren Beruf. +- Nur 61 % erleben Wertschätzung. +- Selbstbestimmung ist für 54 % der wichtigste Wert. +- Folge: Stolz anbieten wirkt herablassend. Anerkennung zeigen funktioniert. + +**Papierkram:** rund 7 Stunden Büroarbeit pro Woche, oft abends und am Wochenende (NOW Report 2026, kleine Stichprobe). + +**Warnung aus der Werbung:** Die ZDH-Kampagne „Hier stimmt was nicht“ von 2022 hat die Zielgruppe konfrontiert. Ergebnis: die schlechteste Resonanz in 16 Jahren. **Nie wie ein Vorwurf klingen.** + +### 7.3 Wettbewerb + +**15 Wettbewerberseiten analysiert** (Website-Recherche, 12.09.2026): ToolTime, plancraft, HERO, Craftnote, openHandwerk, Meisterwerk, 1Tool, pds, KWP, TAIFUN, blue:solution, STREIT, Label, MOSER, M-SOFT. + +**Was alle gleich machen:** +- 15 von 15 versprechen All-in-One. +- Alle werten das Bestandssystem ab. +- Keiner sagt „du musst nicht wechseln“. +- 13 von 15 nennen in der Hauptüberschrift die Kategorie statt den Leser. + +**Was einzelne Anbieter auszeichnet:** +- **plancraft** zahlt bis zu 1.200 € Wechselbonus. Das belegt, wie teuer der Wechselschmerz ist. +- **MOSER** ist der einzige mit starker Sprache, SHK-only, und nutzt dasselbe Motiv wie unsere Szene „Freitag, 17:40“. +- **ToolTime** besetzt das Wort „Feierabend“. +- **TAIFUN, blue:solution und M-SOFT** gehören zu einer Firma (OneQrew). + +**Freie Themen:** Nachfolge und Generationswechsel. Darüber spricht niemand, und Noah ist vierte Generation. + +**Du oder Sie:** Die Cloud-Generation duzt, die klassischen ERPs siezen. Die Zielgruppe kommt aus der Sie-Welt. HiveGrid duzt bewusst. + +**Noahs Marktanalyse vom 01.08.:** +- Hero: „alles in einer Plattform“, Android schwächer. +- Plancraft: Projekt-Chat. +- ToolTime: „radikale Einfachheit“, Offline kaputt. +- Craftboxx: bestes Offline. + +### 7.4 Absehbare Einwände + +1. „Ich habe schon ein Programm.“ Das löst die Positionierung auf. +2. „Kostet mich das Extra beim ERP-Hersteller?“ Ja, API-Lizenz bei PDS und API-Bereiche bei KWP. +3. „Kein DATEV, keine Rechnungen, keine Zeiterfassung?“ Richtig, und das ist bewusst so. +4. „Was ist mit meinen Daten?“ Starke Antwort (Abschnitt 5), aber ehrlich formulieren. +5. „Wer nutzt das schon?“ Bisher nur Geerkens, keine Referenzen. +6. „Ist das nicht zu teuer für uns?“ Einstieg 179 € im Monat für 7 Nutzer. +7. „Wir haben keine Zeit für so was.“ 72 % laut Bitkom. + +--- + +## 8. Vertrieb, Demo, Kunden, Status + +### 8.1 Wo das Produkt steht + +| Datum (2026) | Ereignis | +|---|---| +| 19.06. | Produktions-Infrastruktur live | +| 10.07. | geplanter „Big-Bang“-Launch, inzwischen „historisch“ | +| 04.08. | Preiskatalog fixiert | +| 12.08. | KWP-Zielbild von Noah freigegeben | +| 25.08. | Sonderkonto für Geerkens. KWP für alle Kunden einrichtbar. | +| 14.09. | Website: aus „Warteliste“ wird „Erstgespräch vereinbaren“. GmbH i. G. auf den Rechtsseiten. In der Git-Historie heißt das „Launch-Tag“. | +| 17.09. | Instagram-Produktposts gestoppt | +| Ende September | Geerkens-Umstellung im Paralleltest. Bestehende Zaps und Google-Forms laufen weiter. | +| 03.10. | Kundendemos auf `demo.hivegrid.de` live | + +**Ein öffentliches Launch-Datum gibt es nicht.** Die Website schwankt zwischen „Bald verfügbar“ und einem Ton, der Fertigkeit signalisiert. + +### 8.2 Vertriebsweg + +**Geplant war im Juni-Sprint:** +- Zielkundenliste, Painpoint-Gespräch mit Noah, Pitch und Gesprächsskript +- Discovery-Calls, Founding-Deal, Klick-Demos, Launch, Webinar, Trial-Nachfassen +- Ziel: „erste Gelder“ bis 31.07. + +Umgesetzt ist das nur zum Teil. + +**Heute:** +- **Website:** Erstgespräch über Cal (`cal.hivegrid.de/haris/demo`), „30 Minuten, unverbindlich, ohne Vorbereitung“. +- **Demo:** Danach ein persönlicher Demo-Workspace für 30 Tage. +- **Leads:** Website-Anfragen landen über die API im eigenen Vertriebs-CRM von HiveGrid. HiveGrid nutzt also das eigene Produkt. +- **Regeln für den Vertrieb:** + - „Ehrlich verkaufen: nichts versprechen, was nicht in v1 ist“. + - Erste Antwort auf eine Anfrage in unter 24 Stunden. +- **Networking-Event (KW 39):** David hat die Software gepitcht, das Team hat Kontakte und Feedback gesammelt. + +**Was der Vertrieb laut eigenem Vertriebsblatt nicht sagen darf:** +- „HiveGrid ersetzt heute vollständig KWP.“ +- „HiveGrid hat ein eigenes vollständiges Rechnungs- und Buchhaltungsmodul.“ +- „Alles funktioniert bereits offline auf der Baustelle.“ +- „HiveGrid hat eine eigene KI, die selbstständig im Betrieb handelt.“ + +Das Vertriebsblatt `docs/vertrieb/PRODUKTFEATURES.md` vom 20.07. und die Preisübersicht vom 04.08. sind in mehreren Punkten veraltet: KWP, Microsoft, Mobile, Kundenportal und die Marketing-Mails. + +### 8.3 Kunden + +- **Geerkens GmbH:** + - SHK mit den Bereichen Energy, Konzeptbau und 360°-Service. + - Anfragearten: Photovoltaik, Wärmepumpe und Klima, Projektbau, Badezimmer. + - Erster Kunde, Investor und Testfeld. Der Wärmepumpenprozess (10 Phasen, 13 Stellen, 17 Übergaben) dient als Referenz. + - Ein Kundenbeispiel „So arbeitet die Geerkens GmbH heute mit HiveGrid“ wurde von der Website bewusst wieder entfernt. +- **Weitere Kunden:** nicht belegt. +- **Testimonials, Zitate, Fallstudien:** keine. + +--- + +## 9. Marke + +### 9.1 Markenkern + +HiveGrid ist die Software, die sich um das Branchenprogramm herum legt, statt es zu ersetzen. Das Versprechen an den Inhaber lautet: **Du musst nichts wechseln**, behältst deine Daten, deine Abläufe und deine Leute und bekommst trotzdem, was dein ERP nicht kann. + +Die Marke stützt sich auf **Herkunft statt auf Belege**: „Entwickelt in einem SHK-Betrieb.“ Der Ton ist ein Du auf Augenhöhe, konkret und nicht anbiedernd. + +Vertrauen entsteht über **Souveränität**: „Dein Betrieb gibt die Form vor. Nicht die Software.“ Dazu kommen Hosting in Deutschland und deutscher Support. + +### 9.2 Gründergeschichte + +Quelle: Landing, Ich-Form, maßgebliche Fassung. + +> Ich bin Noah Geerkens. Zusammen mit meiner Schwester führe ich unseren SHK-Betrieb in vierter Generation. +> Was kaum einer sagt: Ein Betrieb, den es so lange gibt, hat nicht nur Erfahrung. Er hat auch Prozesse, die seit Jahren so laufen, weil die Software es so vorgibt. Nicht, weil es sinnvoll ist. +> Und wechseln? Kannst du vergessen. Da hängen Jahre an Stammdaten, Aufträgen und Buchhaltung drin. Und Leute, die das System kennen. Kein Chef fährt seinen Betrieb für ein halbes Jahr an die Wand, nur um am Ende dasselbe zu haben. Nur woanders. +> Wir wollten auch gar nicht wechseln. Wir wollten mehr. KI-Lösungen. Ein CRM. Automatisierungen. Dass die Tools endlich miteinander reden. +> Genau dafür haben wir HiveGrid gebaut: kein Ersatz für dein Branchenprogramm, sondern der Aufbau drumherum. Dein ERP bleibt, wo es ist. +> Kein Startup-Projekt. Entstanden im Handwerksalltag. Gebaut für den Handwerksalltag. + +**Was dazugehört:** +- Ein Selfie-Video von Noah (Hochformat, Büro, mit Untertiteln). +- Ein Etikett „VIERTE GENERATION · SHK“. + +**Was nicht passt:** +- Die Seiten „Über uns“ und „Mission“ erzählen die Geschichte anders: Noah als „unser Partner“ bzw. „Noah, CEO SHK Meisterbetrieb“. +- Noah trägt vier verschiedene Titel (Gründer, Mitgründer, CEO, Geschäftsführer). +- Geplant ist eine neue Fassung für „Über uns“: Noah geht auf Raffael zu, um eine Software für SHK-Betriebe zu bauen. + +### 9.3 Kernbotschaften (wörtlich) + +**Hero und Grundaussage** +- Hero: „Neue Software? / Brauchst du nicht! / HiveGrid **verbindet**, was du bereits hast.“ +- Unterzeile: „KWP, DATEV, Kalender, Postfach, Chat. HiveGrid legt sich über das, was schon läuft, und macht daraus einen Fluss.“ +- Social-Vorschau seit 16.09.: „Neuer Systemwechsel? Brauchst du nicht.“ +- „Verbinden statt ersetzen.“ + +**Souveränität (Szene „Passform“)** +- „Ein Betrieb ist kein Rechteck.“ +- „Dein Betrieb gibt die Form vor. Nicht die Software.“ + +**Szenen aus dem Alltag** +- „Ein Dienstag im Betrieb.“ +- „Freitag, 17:40. Wo war noch mal das Angebot?“ + +**Vertrauen** +- „100 % Made in Germany“ +- „Deine Daten bleiben in Deutschland. Punkt.“ + +**Festgelegt, aber noch nicht auf der Seite** +- „Ein Betrieb, der läuft, gehört nicht umgebaut.“ +- „Wenn du ein System willst, das alles ersetzt und bei null anfängt, sind wir die Falschen.“ +- „Wir ersetzen dein Branchenprogramm nicht. Das ist keine Einschränkung, die wir verstecken. Das ist der Punkt.“ + +**Aus dem Produkt-Team** +- „KWP bleibt der ERP-Kern. HiveGrid wird die tägliche Arbeitsoberfläche.“ +- „Bestehende Spezialsoftware wird angebunden, statt schlecht nachgebaut.“ + +### 9.4 Tonalität und Sprachregeln + +**Ansprache** +- Du. Die Ausnahmen (SEO-Titel, Mission, Rechtstexte) sind Altlasten. + +**Wortwahl** +- Handwerkssprache: Baustelle, Zettel, Aufmaß, Notdienst, Verschnitt, Branchenprogramm, drumherum. +- Konkret statt allgemein: Uhrzeiten, Namen, Beträge („Heizungstausch Schneider · 12.600 €“). + +**Vier Regeln** (`components/landing/warum/texte.ts`) +- STOLZ NICHT ANBIETEN +- DEM LESER KEIN PROBLEM UNTERSTELLEN +- DAS BESTANDSSYSTEM IST DAS SUBJEKT +- KONKRET STATT PAUSCHAL + +**Was vermieden wird** +- Erfundene Zahlen und Kundenstimmen, gesparte Stunden. +- Geviertstriche. +- Phrasen der Konkurrenz: „Weniger Büro, mehr Handwerk“, „Feierabend“. +- Verbrannte Bilder wie „Hub“ und „orchestrieren“. „Hub“ steckt trotzdem noch in der Grafik. +- Dreierschläge, die trotzdem vorkommen. + +**Ehrlichkeit als Stilmittel** +- „Und ehrlich gesagt: Wenn bei dir alles rundläuft, brauchst du uns nicht.“ + +**Psychologie aus der Recherche** +- Belege über die Welt statt über sich selbst. +- Konkretheit ersetzt Beweis. +- Ein echtes „weil“. +- Genau ein freiwilliges, frühes Eingeständnis einer Schwäche. +- Cialdinis Prinzip „Unity“: Noah ist „einer von ihnen“. + +### 9.5 Visuelle Identität + +| Element | Wert | +|---|---| +| Markengelb | **#F1B729** (Logo, CTA, Akzent) | +| Dunkle Markenfläche | #30313D („HiveGrid Teal“ im Haus, eigentlich Anthrazit) | +| Teal | #0D6E6E | +| Navy | #0F1A2E | +| Text | #1A1A1A, #555555 | +| Schrift | **Manrope** 400 bis 800, bewusst nicht Inter („wärmer und geometrischer“) | +| Formen | Logo: G im Sechseck. Wabenfeld mit Honig-Strängen. **Chamfer**, also abgeschrägte Ecken an Karten, als Echo der Wabe. Technische Zeichnung mit Schraffur und Bemaßung. Etiketten im Klebeband-Stil. | +| Animation | GSAP. Szenen beim Scrollen. Waben, die ausweichen. Gelber CTA als Welle. | +| Motive | Absperrband gelb/schwarz mit Helm und „Bald verfügbar“, für Unfertiges. Umstritten: Ein eigener Commit sagt, das Band lasse „uns“ unfertig aussehen. | +| Bildmaterial | Echte Produkt-Screenshots (wenige), 8 Team-Fotos (Büro, Loft), Noah auf Bühne und im Selfie-Video. **Keine Fotos von Baustelle, Werkstatt oder Monteuren.** Das Hero-Video ist ein Test-Asset (Solardach, Drohne). | + +### 9.6 Website: Seiten und Stand + +**Landing** +- Hero, dann „Passform“, Wabe „Verbinden statt ersetzen“, „Ein Dienstag im Betrieb“, Noahs Geschichte, „Die Lösung“ mit 4 Modulen, „Freitag, 17:40“, Vergleich, Vertrauensband, FAQ, Schluss-CTA. + +**Weitere Seiten** +- 6 Produktseiten: Workflow-Engine, E-Mail-Marketing, Chat, Projektmanagement, Vertriebspipelines, Mitarbeitermanagement. +- `/ki-anbindung` (KI-Brücke), `/preise` (Platzhalter), `/waitlist` (heute Erstgespräch), `/ueber-uns`, `/mission`, Rechtliches. +- Der Form Builder hat keine eigene Produktseite. + +**Navigation** +- Lösungen, KI-Brücke, Preise, Über uns, Erstgespräch, Login (auf `app.hivegrid.de`). + +**Aktivität** +- Letzter Commit am 16.09.2026, seitdem Stillstand wegen Bughunting. + +**Offene Punkte** +- Aus Noahs Review: „mehr Storytelling und eine emotionale Schiene, weniger Produkt“. +- Echte Preise legt Noah fest. +- Echte Screenshots auf den Produktseiten fehlen. Die Bildstrecken sind bis dahin ausgeschaltet. +- Webinar-Seite. +- Wabe überarbeiten: „PDS raus“, Taifun farbig, freigegebene Logos. +- Branchenlösungs-Seiten: In KW 38 gebaut, die Nacharbeit ist offen. + +### 9.7 Widersprüche und Lücken der Marke + +**Inhaltliche Widersprüche** +1. **DATEV:** im Hero, in der FAQ und in der Wabe genannt. Im Produkt nicht vorhanden. Auch die Bildunterschrift des Instagram-Posts vom 17.08. verspricht: „Was später dazukommt, DATEV, Microsoft 365, ein Telefon-Assistent, bindet sich von außen an.“ +2. **Hosting:** „100 % gehostet in Deutschland“ und „ohne US-Beteiligung“, aber Cloudflare (USA) und Scaleway (Niederlande). +3. **Rechnungen:** Die Positionierung sagt „Dein ERP bleibt“. Preise, Erstgespräch und Mission versprechen trotzdem Rechnungen. +4. **SEO:** „Alles was Ihr Betrieb braucht. In einer Plattform.“ Das ist All-in-One im Sie, also das Gegenteil der Positionierung. +5. **„Neue Software? Brauchst du nicht!“:** HiveGrid ist selbst neue Software. Die Social-Vorschau wurde schon angepasst, der Hero nicht. +6. **MCP-Werkzeuge:** Die Website nennt 15, das Produkt hat 22. +7. **Wabe:** HiveGrid steht in der Mitte, die Tools kreisen darum. Das widerspricht der eigenen Regel „Das Bestandssystem ist das Subjekt“. + +**Uneinheitlicher Auftritt** +8. **Drei Fassungen** der Gründergeschichte, **vier Titel** für Noah. +9. **Zielgruppengröße** unklar (2 bis 5, ab 15, 7 bis 40). +10. **Launch-Status:** „Bald verfügbar“ steht neben fertig wirkenden Aussagen. Die strukturierten Daten melden „InStock, iOS, Android“. + +**Fehlende Bausteine** +11. **Keine Belege durch Dritte:** keine Kunden, keine Zitate, keine Fallstudie. +12. **Keine Bilder aus dem Handwerk.** +13. **Kein Telefon** auf der Website, obwohl die FAQ „telefonisch“ verspricht. +14. **Der Newsletter im Fußbereich speichert nichts.** Die Social-Links stehen auf „#“. + +--- + +## 10. Bisherige Marketingarbeit + +### 10.1 Instagram + +**Konto:** `hivegrid.de`. + +**Redaktionsplan** (`posts/redaktionsplan/`): +- Mo, Mi und Fr um 12:00 Uhr, 3 Beiträge pro Woche. +- Zweck in dieser Phase ist **Darstellung der Software, nicht Reichweite**. Gedacht für Leute, die ohnehin auf HiveGrid stoßen: mögliche Kunden, Partner, Investoren. +- Grundsätze: „Titelbilder tragen allein“, „Zeigen statt behaupten“. +- Damals „Carousel jetzt, Reels später“, mit dem Hinweis, dass Reels für kleine Konten mehr Reichweite bringen. +- Routine pro Beitrag: 5 Likes, 3 echte Kommentare, 1 passendes Konto folgen. Gefolgt wird SHK-Betrieben, Innungen, Kammern, Messen, Fachmedien und Herstellern. +- Nach 4 Wochen ansehen: Profilaufrufe je Beitrag, Sendungen, Speicherungen, Reichweite außerhalb der Follower, Anmeldungen. +- Geplante Themenfolge (15 Termine): Geschichte, Verbinden statt ersetzen, Workflow-Engine, Projektmanagement, Team-Chat, Form Builder, E-Mail-Marketing, Zettelwirtschaft, Mitarbeiter-Management, Der Betrieb dahinter, KI/MCP, Dein ERP bleibt, Tempo als Reel, Warteliste, Häufige Fragen. + +**Erschienen**, laut Redaktionsplan und Repo-Historie: + +| Datum | Beitrag | +|---|---| +| vor 12.08. | „Vom Handwerker für Handwerker“ (Lösungsübersicht, Post 1) | +| 14.08. | Die Geschichte (Noah, 6 Slides) | +| 17.08. | Verbinden statt ersetzen (Einzelbild mit Wabenfeld). **Achtung: Das Wabenfeld zeigt das DATEV-Logo.** | +| 19.08. | Workflow-Engine (4 Slides) | +| 21.08. | Projektmanagement (5 Slides) | +| 31.08. | Team-Chat (5 Slides und ein Bewegtbild) | + +**Fertig, aber nicht veröffentlicht:** +- Form Builder, mit Bewegtbild als Titel. +- E-Mail-Marketing, mit Bewegtbild als Titel. + +**Kurswechsel** +- **17.09.2026:** Call mit Noah und David: „Produktposts vorerst zurückstellen, Social-Media-Strategie neu aufsetzen“. +- **KW 39:** Marketing-Brainstorming von Dejan und David. Das Ergebnis ist Davids Vorschlagspapier für Noah vom 26.09. (`Brainstorming Kickoff/MarketingBrainstormingOld.md`). Zusammenfassung in 10.7. +- **KW 40:** mehrere Abstimmungen mit David, **Schwerpunkt Noahs Reels**. Research, Ressourcen und Design-Material zu sammeln ist das Ziel für KW 41. + +**Werkzeug:** Das Repo `posts` ist ein eigener Generator. +- HTML-Slides, PNG-Export, MP4-Bewegtbild über ffmpeg. +- Theme `modern`: weiß, Punktraster, ein Akzentwort. +- Prüft Umlaute und Geviertstriche automatisch. +- Jeder Beitrag ist wortgetreu aus Code und Website belegt und hat eine Übergabe-Datei (`POST-*.md`). + +### 10.2 Website + +- **Umbau nach Noahs Reviews** (05.09. und 11.09.): Landing und Produktseiten in KW 37, Branchensoftware-Seiten in KW 38. +- **Offen seit KW 38:** Nacharbeit an Landing und Lösungsseiten sowie echte Screenshots. Seitdem wegen Bughunting nicht angefasst. +- **Recherchepaket vom 12.09.:** rund 400 Seiten (`docs/recherche/`) zu Wettbewerb, Positionierung, Zielgruppe, Storytelling, Marken wie Würth, Hilti und Festool sowie Integrationen. Wiederverwendbar. + +### 10.3 Video + +Den **Video-Ordner** (`posts/video/`) gibt es zweimal, als Standbild und als Bildsequenz mit Alphakanal für Premiere. Gedacht für Noahs Video über den Betrieb. Enthalten sind: +- Bauchbinde Noah +- Satzkarten („Dein ERP bleibt.“, „Kein Ersatz.“, „Die Tools reden miteinander.“, „Kein Startup-Projekt.“) +- Stapel (was drin hängt, was gefehlt hat) +- Ring „Der Kern bleibt“ +- animiertes Wabenfeld +- Logo-Ecke + +Das passt direkt zu Reels mit Noah. + +### 10.4 Webinar + +`HiveGrid-Website/webinar.md` (Stand 29.07.) ist ein ausgearbeitetes Konzept: +- WebinarGeek als Plattform, Di bis Do 18 bis 19 Uhr. +- Themen nach Schmerzpunkten, nie eine Funktionsliste. +- Technik-Kits, DSGVO-Checkliste, Funnel und KPIs. +- **Nicht umgesetzt.** Es gibt keine Seite `/webinare`. + +### 10.5 Weitere Kanäle + +- **LinkedIn:** im Admin ist der Sales Navigator geplant. Sonst kein Material. +- **Newsletter:** Das Feld im Fußbereich speichert nichts. +- **Social-Profil-Links auf der Website:** Platzhalter. + +### 10.6 Material, das schon da ist + +- Demo-Workspace mit realistischen SHK-Daten und 30 erklärten Beispiel-Automationen +- Instagram-Generator mit Bewegtbild-Export, 8 gebaute Beiträge, 2 davon unveröffentlicht +- Video-Einblendungen für Premiere +- Noahs Selfie-Video, Team-Fotos, Logos (14 Partnermarken, davon 12 von Noah freigegeben) +- Recherchepaket (Wettbewerb, Zielgruppe mit Zahlen, Sprache) und Webinar-Konzept +- Interner Redaktionsplan als PDF +- Der Analytics-Prototyp (`GitHub/dashboard`) mit fertig gestalteten Auswertungen für einen SHK-Betrieb. Er eignet sich als Bildmaterial, wenn die Daten ehrlich als Beispiel gekennzeichnet sind. + +### 10.7 Davids Vorschläge für Noah (26.09.2026) + +Quelle: `Brainstorming Kickoff/MarketingBrainstormingOld.md`. Das ist das Ergebnis des Brainstormings von David und Dejan vom 24. bis 26.09., als Diskussionsgrundlage für Noah. Laut Dejan (05.10.) hat sich seitdem etwas geändert, die Richtung bleibt ähnlich. + +**Ziel und Auftritt** +- **Ziel ist Kunden gewinnen**, nicht Follower. Bis dahin kamen keine Anfragen aus Posts. +- **Zielgruppe:** SHK-Betriebe ab etwa 10 bis 20 Mitarbeitenden, ausdrücklich auch größere. Ansprechpartner sind die Verantwortlichen für Digitalisierung und Systeme: Geschäftsführung, nächste Generation, IT. +- **Zwei Auftritte:** + - **Noah** schafft Aufmerksamkeit und persönliche Nähe. + - **HiveGrid** vermittelt Produktverständnis, Professionalität und Beständigkeit. + - HiveGrid-Posts mit Noah laufen als Instagram-Collabs, Infoslides ohne Noah eigenständig. +- **Plattformen:** TikTok und Facebook mit bespielen. LinkedIn ist offen, X kein Fokus. +- **Botschaft:** „ein CRM für den Handwerksalltag“ mit Automatisierung und Verbindung vorhandener Systeme. „Verbinden statt ersetzen“ ist ein Ansatz. Die Kernbotschaft soll an einem echten Kundenablauf geschärft werden. + +**Videogestaltung** +- **Grundformat:** Noah mit passender B-Roll und gut lesbaren Untertiteln. +- **Animation sparsam,** nur wenn sie etwas erklärt. Animation oben und Noah unten wirkt überladen („als wenn GTA-Footage oben ist“). +- **Höchstens ein animiertes Erklärvideo pro Woche.** +- **Untertitel:** ganze Sinnabschnitte, keine einzeln auftauchenden Wörter. +- **Ton** hat sehr hohe Priorität. +- **Idee für den Abschluss:** ein Outro mit farbwechselndem G. + +**Vom Reel zum Gespräch** +- **Anfangs täglich ein Reel.** Starke CTAs nicht ständig, sondern im Wechsel mit Beiträgen ohne. +- **Themen:** Handwerksalltag, konkrete Probleme und Lösungen, Digitalisierung, Noahs Erfahrungen, Humor erwünscht. Dazu Tutorials, Produktabläufe, Infoslides, Einblicke in Team und Entwicklung. +- **Funnel über ManyChat:** Auf einen Kommentar folgt zuerst das angefragte Material (PDF), danach eine freiwillige Einladung zum Gespräch. + - Zwei Nachrichten **in der Sie-Anrede**. + - Keine reine Demo-Ankündigung, das klingt zu verkäuferisch. +- **Freigabe:** Ein Wochenpaket wird eine Woche vorher gemeinsam freigegeben, einschließlich der ManyChat-Automationen. + - Noah übernimmt Themen, Aufnahme und Schnitt, David die Qualitätsprüfung. + - Wer veröffentlicht, ist offen. + +**Website** +- **Produktnah, hochwertig, ruhig.** „Übermäßige Emotionalisierung vermeiden.“ Das steht im Gegensatz zu Noahs Review vom 11.09. („mehr Storytelling und eine emotionale Schiene“). +- **Herkunft** kurz erzählen: Noah ist auf ein Softwareteam zugegangen. +- **Team** sichtbar machen. +- **Testimonials sind ein Kernthema.** Gegebenenfalls professionelle Interviews vor Ort. + +**Prioritäten** +- **Jetzt:** Bughunting, Produktentscheidungen, Vertrieb. Noahs Produktion läuft unabhängig. +- **Danach:** Corporate-Auftritt, Komponentenbibliothek, Website. +- **Budget und KPI-Ziele:** vorerst nicht vertieft. Mitgeführt werden sollen Anfragen, gebuchte Gespräche und ihre Herkunft. + +**Damals offen gelassen** +- Formulierungen für Noah +- echter Kundenablauf für die Botschaft +- Kandidaten für Testimonials +- wer ManyChat einrichtet und veröffentlicht + +--- + +## 11. Aktuelle Arbeit: Release-Vorbereitung und Bughunting + +Quellen: die Bug-Ordner in `Documents` und die Wochenreports KW 37 bis 40. + +**Lücken in dieser Auswertung:** +- Alle Notizen wurden gelesen. +- Bilder: Postfach 13 von 17, Kalender und Kontakte vollständig, Terminbuchung nur 3 von 18. +- Vom Dashboard-Rework wurden keine Bilder angesehen, nur die Notizen. + +### 11.1 Wie das Team gerade arbeitet + +- **Release-Vorbereitung:** Seit KW 37 testet das ganze Team die Software Modul für Modul auf Staging. David gibt das Schema vor („Bughunting Outline“) und teilt die Module zu. +- **Ablauf bei Dejan:** Fehlerbericht mit beschrifteten Screenshots („So lässt sich der Fehler nachstellen / Erwartung / Tatsächlich“), Übergabe in Paketen an Aki oder Raffael, Nachtest, Abnahmeprotokoll. +- **Gemeinsame Termine:** KW 39 ein Abend, an dem das ganze Team jedes Modul aus der Seitenleiste Screen für Screen durchgegangen ist. KW 40 ein zweites gemeinsames Bughunting in Präsenz. +- **Externer Code-Review:** Previty. Die Befunde sind eingebaut. + +### 11.2 Stand je Modul + +| Modul | Zeitraum | Stand | +|---|---|---| +| **Kalender** | 08.09. bis 22.09. | **Funktional abgenommen** am 22.09. Anfangs gab es echte Fehler: Eigene Termine erschienen als Google-Termine, Ganztägig ließ sich nicht speichern. Alle sind behoben. Offen: Microsoft nicht live getestet, Google-Verifizierung fehlt. | +| **Terminbuchung** | 09.09. bis 23.09. | **Funktional abgenommen** am 23.09. für Buchen, Umbuchen und Absagen. Behoben unter anderem: vergangene Termine als „Bevorstehend“, Vorschau auf eine 404-Seite, QR-Download ohne Wirkung, versehentliches Deaktivieren. | +| **Kontakte und Organisationen** | 16.09. bis 23.09. | **Funktional abgenommen** am 23.09. Zwei echte Datenfehler (Status und Adresse wurden nicht gespeichert) sind behoben. Die Farben der Tags bleiben ein Design-Nachzug, die Oberfläche gilt als Zwischenstand. | +| **Postfach** | 25.09. bis 28.09. | **Offen, im Umbau.** Anfangs führten Archivieren, Löschen, Stern und Lesestatus auf 404-Seiten, und der Abgleich schlug fehl. Raffael baut es gerade im Stil von Gmail um. Dejans Test ist bis dahin pausiert. | +| **Dateien** | | noch nicht begonnen | +| **Dashboard** | 28.09. bis 03.10. | Statt Bughunting eine fachliche Festlegung je Widget (siehe 11.3). Erster Durchlauf gemacht, bewusst pausiert, bis weitere Inhalte da sind. | + +**Wichtig für jede Außenkommunikation:** Die Abnahmeprotokolle sagen ausdrücklich „funktional abgenommen“, aber **ohne Freigabe für den Einsatz bei echten Kunden**. Produktweit ungeklärt sind Rollen, Support-Weg, Hilfetexte und Rollback. + +### 11.3 Das Dashboard-Rework + +**Ausgangslage** +- Die Widgets stammen aus einem Designer-Prototyp und rechnen mit einem festen Beispieldatensatz („Meister Krause GmbH“, „heute“ ist der 30.07.2026). +- Nur 15 von 114 Widgets hatten einen echten Wert vom Server. +- Analytics ist gar nicht angebunden. + +**Vorgehen** +- Je Widget wird festgelegt, was es aussagt, woher die Zahl kommt und wie sie berechnet wird. +- Werkzeug ist ein interner „Widget-Tinder“ (behalten, raus, offen). +- Dejan arbeitet hier eher als Produkt-Analyst: Code-Pfade lesen, SQL-Prüfabfragen schreiben, Kennzahlen selbst entscheiden. + +**Grundregeln** +- Lieber einen leeren Strich als eine erfundene Zahl. +- Rechte wie im Quellmodul. +- Ein Klick führt zur Quelle. +- Echtes Datum, Texte in der Sprache des Kunden. + +**Fachliche Festlegungen** +- Umsatz ist das Auftragsvolumen abgeschlossener Aufträge, nicht mehr die bezahlten Rechnungen. +- Neuer Schalter „Zählt zum Umsatz“ je Pipeline. +- Auslastung sind die verplanten Stunden aus der Plantafel geteilt durch die verfügbare Zeit. + +**Stand 01.10.** +- Auf dem Dashboard sind 30 Kern-Widgets freigeschaltet. +- **11 davon zeigen echte Daten, 5 von diesen 11 rechnen noch falsch.** +- Der Rest zeigt „Noch nicht an Daten angebunden“. + +**Nicht baubar, weil die Daten fehlen:** Zahlungseingang, Zahlungsdauer, Deckungsbeitrag, Förderanträge. Rechnungen lassen sich seit 18.09. in der Oberfläche nicht mehr pflegen. + +**23 Ideen für neue Widgets** (nicht gebaut), zum Beispiel Auftragsreichweite, Einsätze heute, fällige UVV- und TÜV-Prüfungen, überfällige Lead-Reaktion. + +Der Prototyp liegt in `GitHub/dashboard`. + +### 11.4 Wie die Software heute aussieht + +Das ist für Screenshots, Reels und Demos wichtig. + +**Aufbau** +- Links eine einklappbare Seitenleiste mit dem gelben Sechseck-Logo. Die Gruppen: + - Dashboard, Analytics, Aufgaben + - Kontakte, Leads + - Pipelines, Plantafel, Dateien + - Postfach, E-Mail-Marketing, Formulare, Telefonie + - Kalender, Terminbuchung, Team-Chat, Personal, Passwort-Safe + - Automationen, Einstellungen +- Oben Brotkrumen-Navigation, ein Knopf **„MCP verbinden“** mit drei KI-Logos, Suche mit ⌘K, Glocke und Avatar. + +**Stil** +- Weiß, viel Luft, schwarze Hauptknöpfe. +- Farbige Status-Badges als Pills. +- Abschnittstitel in Großbuchstaben. +- Wirkt wie ein modernes SaaS-Werkzeug (Linear, Attio) und **nicht wie klassische Handwerkersoftware**. Das ist ein Kontrast, den man im Marketing nutzen kann. + +**Was auf vielen Bildern stört** +- Ein gelbes Banner „Dein Passwort entspricht nicht mehr unserer Sicherheitsrichtlinie“. +- Ein blauer „Vorschau“-Knopf. +- Testdaten wie „CODX-E2E-…“ oder „QA Test Dejan 6“. +- Für Marketing-Aufnahmen braucht es deshalb einen sauberen Demo-Workspace. Seit 03.10. gibt es dafür `demo.hivegrid.de`. + +**Gute Motive mit realistischen SHK-Daten** +- Posteingang mit Mails wie „Abnahme und Restpunkte: Heizzentrale Fischer“ oder „Materialfreigabe: Wärmepumpe Arnold“ samt Projekt-Chips. Das neue Postfach-Layout ist das stärkste Motiv. +- Kalender mit allen Quellen in Farbe (Google, Buchungen, Plantafel, Projekte, eigene Termine). +- Terminbuchung mit SHK-Zusatzfragen („Womit heizen Sie aktuell?“). +- Kontaktdetail mit Seitenleiste und Schnellaktionen. +- Tags wie „Förderung“, „Material fehlt“, „Elektro nötig“. + +**Noch nicht zeigen** +- Postfach in Aktion. +- Dashboard- und Analytics-Zahlen. Wenn überhaupt, dann klar als Beispiel kennzeichnen. +- Outlook als fertige Funktion. + +### 11.5 Was das für das Marketing heißt + +**Zeit** +- Die Kapazität für Marketing ist bis zum Ende des Bughuntings stark gebunden. +- Offen sind noch Postfach, Dateien und der Abschluss des Dashboards. + +**Was belastbar ist** +- Am belastbarsten zum Zeigen sind heute Kalender, Terminbuchung und Kontakte, dazu Automation und Chat aus den Instagram-Posts. + +**Gewinn aus dem Bughunting** +- Dejan kennt jedes Modul aus Sicht der Nutzer, mit echten Stolperstellen. +- Das ist Rohmaterial für ehrliche Inhalte, etwa „so testen wir, bevor ein Betrieb es bekommt“, und für Hilfetexte, die produktweit noch fehlen. + +--- + +## 12. Spannungsfelder und offene Fragen für das Brainstorming + +Das ist meine Zusammenfassung aus allem oben. Keine Empfehlung, sondern die Fragen, an denen die Strategie hängt. + +1. **Wen sprechen wir zuerst an?** Der stärkste USP zieht nur bei KWP- und PDS-Betrieben. Bauen wir die Strategie eng um diese Gruppe (Listen, Gespräche, gezielte Inhalte) oder breit um „verbinden statt ersetzen“, mit dem Risiko, dass ein Taifun-Betrieb anfragt und nichts angebunden ist? +2. **Wie groß ist der Zielbetrieb?** 2 bis 5, ab 15 oder 10 bis 50 Leute? Ab 179 € im Monat ist die Antwort nicht egal. +3. **Was ist das Ziel des Marketings in den nächsten Monaten?** Erstgespräche, Demos, Founding-Member, Sichtbarkeit bei Partnern und Investoren oder Vertrauen für einen späteren Start? Davon hängt ab, ob Reichweite überhaupt zählt. +4. **Wie gehen wir mit dem unklaren Startzustand um?** Produktion und Demo laufen, Zahlung und Preise sind nicht öffentlich. Wie ehrlich und wie offensiv wollen wir „in Arbeit“ zeigen? Was ist mit dem Absperrband? +5. **Der Beleg fehlt.** Geerkens ist der einzige Kunde und mitten in der Umstellung. Kann Noahs eigener Betrieb sichtbar zum Fall werden, mit Reels, „wie wir umstellen“ und echten Zahlen aus dem Paralleltest? Das wäre Beleg und Geschichte zugleich. +6. **Noah als Gesicht.** + - Reels mit Noah sind die neue Richtung. Welche Rolle bekommt Noah: Gründer, Handwerksmeister, Kunde? + - Wie viel Zeit hat Noah dafür? + - Bisher gibt es kein Bild von Noah im Betrieb. +7. **Produktposts: weg oder anders?** Zwei sind fertig. Zurückgestellt wurden sie, weil die Richtung neu aufgesetzt wird. Was genau war am bisherigen Format falsch? +8. **Widersprüche vor jeder Kampagne bereinigen:** DATEV, Hosting-Formulierung, Rechnungen, SEO-Titel, MCP-Zahl, veraltete Vertriebsunterlagen, Paketnamen auf der Preisseite. +9. **Welche Kanäle?** + - Bisher gibt es nur Instagram und die Website. + - Offen: LinkedIn (die Zielgruppe der Investoren und Partner sitzt eher dort), Webinare (Konzept fertig), Innungen, Kammern und Messen, Hersteller, Partner wie HalloPetra und Hilti, Networking-Events. +10. **KI: Thema oder nicht?** Für 84 % der Zielgruppe ist KI „kein Thema“, die Landing hat KI rausgenommen. MCP ist aber ein echtes Alleinstellungsmerkmal und für Partner und Investoren attraktiv. Getrennte Botschaften für getrennte Leser? +11. **Ungenutzte Themen:** + - Nachfolge und Generationswechsel + - Monteur-App mit ehrlichem Offline-Betrieb + - Mehrsprachigkeit für Monteure (polnisch, ukrainisch; noch nicht aktiv) + - Automatisierung ohne Angst (Probelauf, Rückgängig) + - Datenschutz als Haltung + - der Wechselbonus der Konkurrenz als Beleg für den Schmerz +12. **Du oder Sie?** Bewusst entschieden, aber die Zielgruppe sitzt heute bei den Gesiezten. +13. **Kapazität.** Marketing ist im Moment vor allem Dejan, und das Bughunting frisst den Großteil der Zeit. Was ist realistisch, und was kann jemand anderes übernehmen: David, Haris, Noah, Agenturen, KI-gestützte Produktion? +14. **Freigaben.** Noah gibt alle externen Texte frei, David reviewt Posts. Wie bleibt das schnell genug für einen festen Rhythmus? + +--- + +## 13. Fragen und Antworten + +Die offenen Fragen aus Abschnitt 12, im Dialog mit Dejan beantwortet. Die Antworten sind sinngemäß übernommen. + +### Runde 1: Zielgruppe und Ziel (05.10.2026) + +**F1. Welche Betriebe soll das Marketing zuerst ansprechen?** +- **Alle SHK-Betriebe.** Nicht eng auf KWP und PDS beschränkt. +- PDS und KWP laufen bereits, weitere Anbindungen sind im Gespräch. +- Der Vertrieb macht schon Cold Calling, teils auch mit Betrieben, die TopKontor, Streit oder andere Programme nutzen. Diese Betriebe haben sich damals auf einer Messe über das Website-Formular angemeldet. + +*Notiz:* Für TopKontor und Streit gibt es heute keine Anbindung. Laut Planung kommt sie erst „bei einem konkreten zahlenden Kunden“. Das Marketing spricht also auch Betriebe an, bei denen die Verbindung erst entsteht. + +**F2. Wie groß ist der Zielbetrieb?** +- **10 bis 50 Leute.** Das deckt sich mit Davids Papier (ab etwa 10 bis 20, auch größere) und mit den Paketen Core bis Colony. + +**F3. Was soll das Marketing in den nächsten 3 bis 6 Monaten erreichen?** +- **Erstgespräche und Demos** +- **Sichtbarkeit und Vertrauen** +- **Erste zahlende Kunden** +- Partner und Investoren sind kein eigenes Ziel. + +**F4. Wo liegt das Ergebnis des Brainstormings aus KW 39?** +- In `Brainstorming Kickoff/MarketingBrainstormingOld.md`. +- Seitdem hat sich etwas geändert, die Richtung ist ähnlich geblieben. Zusammenfassung in 10.7. + +### Runde 2: Kunden, Startzustand, Noah, Tonalität (05.10.2026) + +**F5. Wer nutzt HiveGrid heute wirklich, und wer käme für ein Testimonial infrage?** +- **Eigentlich niemand, nicht einmal Geerkens.** Die Software ist noch nicht wirklich betriebsbereit. +- Das soll sich bald ändern, in etwa 1 bis 2 Wochen (Stand 05.10.). + +*Notiz:* Davids Papier sagte noch „erste Kunden nutzen HiveGrid“. Das ist damit überholt. Testimonials und Fallbeispiele kann es frühestens geben, wenn Geerkens im Alltag damit arbeitet. + +**F6. Wie offen zeigen wir, dass HiveGrid noch nicht überall fertig ist?** +- **Offen, als Stärke.** Den Bau zeigen: Entwicklung, Tests, Team. „Wir bauen das mit dem Handwerk“ als Geschichte. + +**F7. Wo stehen Noahs Reels heute?** +- **Sie laufen schon.** +- Wichtig: **Sie laufen über Noahs eigenen Instagram-Account** (Noah Geerkens) und dessen Personal Brand, mit Bezug zu HiveGrid und Handwerk. **Nicht über die offiziellen HiveGrid-Accounts.** + +**F8. Welche Linie gilt für die Website und Social Media: produktnah und ruhig oder mehr Story und Emotion?** +- **Offen und umstritten.** Das gilt für Website und Social Media gleichermaßen. +- Noah ist **Top of Funnel** und holt die Zielgruppe teils mit lustigen oder trashigen Ideen ab. +- Wie HiveGrid selbst auftritt, ist noch nicht entschieden, wird aber auf jeden Fall ausprobiert. +- **Das ist einer der größten Gegenstände dieses Brainstormings:** welche Richtung, welche Formate. +- **Dejans Idee:** viele Formate testen, die wirklich funktionierenden herauspicken und weiterführen, die anderen verwerfen. + +### Runde 3: Inhalte und Botschaften (05.10.2026) + +**F9. Warum wurden die Produktposts am 17.09. gestoppt?** +- **Zu viel Feature-Verkauf.** +- **Keine Menschen.** Nur Oberflächen, kein Gesicht, kein Betrieb. +- **Kapazität.** Dejan ist selbst im Bughunting gebunden und hat deshalb weniger Zeit für ausgereifte Formate und Videoschnitt. **Das bleibt noch 1 bis 2 Wochen so** (Stand 05.10.). + +**F10. Wie spielen wir KI und MCP?** +- **Dosiert, als Extra.** +- Die Hauptbotschaft kommt ohne KI aus. KI ist ein Zusatz für Interessierte, mit eigener Seite und eigenen Beiträgen, ohne Hype. + +**F11. Du oder Sie?** +- **Überall Du.** + +*Notiz:* Das betrifft auch die ManyChat-Texte aus Davids Papier, die noch siezen (10.7). Ebenso die Altlasten der Website im Sie: SEO-Titel, Mission, ein Satz in den Produktdaten. + +**F12. Welche bisher ungenutzten Themen sind spannend?** +- **Automatisierung ohne Angst:** Probelauf, 24 Stunden rückgängig, ein Mensch gibt frei. +- Nicht ausgewählt: Nachfolge und Generationswechsel, Monteur-App und Offline, Datenschutz und Hosting als eigenes Thema. + +### Runde 4: Kanäle, Team, Budget (05.10.2026) + +**F13. Welche Kanäle sind gesetzt?** +- **Alle vier sind die Basis, die wir auf jeden Fall bespielen:** + - HiveGrid auf Instagram und Facebook + - LinkedIn + - TikTok + - Newsletter und E-Mail +- Dazu kommt Noahs eigener Account als Top of Funnel (F7). +- Weitere Kanäle (SEO, Ads, YouTube, Bewertungsportale, Partner usw.) sind Thema des Brainstormings. + +**F14. Wann bereinigen wir die falschen Aussagen auf der Website?** +- **Nicht Teil dieser Arbeit.** In diesem Projekt schreiben wir erstmal keinen Code. Hier geht es nur um Planung und Ressourcen. + +*Notiz:* Die Liste der Widersprüche bleibt in 9.7 als Hinweis für später stehen. + +**F15. Wer arbeitet am Marketing mit?** +- **Dejan:** plant Content und Strategie. Kann selbst Videos schneiden. +- **David:** unterstützt im Marketing, auch auf Social Media. Laut Dejan ist David außerdem COO und im Design bzw. allgemein Head of Product. (Die Website führt Raffael als COO und David als „Produkt & Design“.) +- **Haris:** eventuell. Seine Rolle hat aber klar Vorrang im Vertrieb. +- **KI:** wird zur Erstellung der Posts genutzt. + - Was Dejan von KI vor allem braucht, sind **Ressourcen**, zum Beispiel React-Komponenten aus der Software herausziehen, so wie es im Repo `posts` gemacht wird. + - **Noah** nutzt für die eigene Personal Brand viel KI. + +**F16. Gibt es ein Budget?** +- **Bisher kein Budget.** +- Ads kommen später, aber erst, wenn es organisch funktioniert. + +### Runde 5: Ablauf und Stand der Kanäle (05.10.2026) + +**F17. Wie geht es nach dem Brainstorming weiter, und wer gibt frei?** +- **Reihenfolge:** + 1. Brainstorming. + 2. Strategie und Redaktionsplan fertig machen. + 3. Dejan schickt beides an Noah und bespricht es mit David. + 4. Danach geht es weiter. +- **Ergebnisse** kommen als Markdown, PDF und HTML in den Hub. Dejan schickt Noah den ganzen Ordner zur Prüfung: + - Recherche + - Content-Strategie + - Ausrichtung der Kanäle + - konkreter Redaktionsplan mit Datum, Kanal und Post +- Freigaben und Veröffentlichung im Detail klären wir danach. + +**F18. Wie ist der Stand der Kanäle heute?** + +| Kanal | Stand 05.10.2026 | +|---|---| +| **Noah, Instagram** (`noahgeerkens`) | Reels laufen. Personal Brand mit Bezug zu HiveGrid und Handwerk. | +| **Noah, LinkedIn** (persönliches Profil) | Noah hat angefangen, eigene Beiträge zu posten, auch mit HiveGrid-Bezug. | +| **HiveGrid, Instagram** (`hivegrid.de`) | 6 eigene Posts und 3 Collab-Posts mit Noah. Rund 64 Follower. Laut Metricool: 63 Follower, folgt 85 Konten, im Zeitraum 05.09. bis 04.10. 31 neue Follower (etwa 1 pro Tag). Ein deutlicher Sprung um den 27.09. | +| **HiveGrid, LinkedIn** (Unternehmensseite) | existiert, aber noch keine Beiträge | +| **HiveGrid, Facebook** | existiert noch nicht, muss angelegt werden | +| **HiveGrid, TikTok** | existiert noch nicht, muss angelegt werden | +| **Website** | ist da und **zweitrangig**. Änderungen baut Dejan ein, wenn Noah sie anfragt. | + +**Werkzeuge** +- **Metricool** ist das Werkzeug für Planung und Auswertung. Verbunden ist bisher nur Instagram (`hivegrid.de`). Facebook, TikTok, YouTube und LinkedIn sind dort noch nicht verbunden. Eine Anbindung an Claude ist erwünscht. +- **`posts`**, die Post-Engine, bleibt in Gebrauch. Sie muss eventuell überarbeitet und mit neuen Ressourcen aus **Subframe** (dem UI-Design-Werkzeug von HiveGrid) gefüllt werden. + +**Formate** +- Jeder Kanal braucht eigene Formate. +- Manches lässt sich wiederverwenden, zum Beispiel Instagram-Reels auf TikTok. + +**Vorbilder** +- Dejan hat mehrere Instagram-Kanäle als Beispiele, die gute Reels machen. +- Die sollen wir für unseren Markt und verschiedene Bereiche nachbauen, um zu sehen, was hängen bleibt. +- Dafür wäre eine Verbindung von Claude zu Instagram hilfreich. + +### Runde 6: Arbeitsweise, Kapazität, Ergebnis (05.10.2026) + +**F19. Was soll am Ende des Brainstormings herauskommen?** + +Keine fertigen Posts, sondern eine Roadmap und ein Redaktionsplan auf Format-Ebene. + +- **Arbeitsteilung mit Claude:** + - Dejan und Claude planen **keine Skripte, Videos oder konkreten Posts** zusammen. Dafür ist KI laut Dejan nicht geeignet. + - Gemeinsam vorgeplant werden **Formate und Ideen als Outline**. + - Daraus wird ein Redaktionsplan, den Dejan selbst mit Inhalt füllt. +- **Roadmap**, unter anderem: + - fehlende Social-Media-Kanäle anlegen + - weitere Kanäle einführen und nutzen, zum Beispiel E-Mail-Marketing: wie das aussehen könnte, welche Werkzeuge, welche Ressourcen, was rechtlich zu beachten ist +- **Redaktionsplan ab 12.10.2026.** Ab dann ist Dejans Bughunting größtenteils erledigt. Jeder Slot hat Datum, Kanal, Format und Quelle, aber kein Thema. Beispiele im Stil von Dejan: + - „12.10. Infopost aus dem Backlog, Instagram“ + - „14.10. Reel im Format inspiriert von Cluely“ +- **Frequenz je Plattform** aus der Kapazität ableiten. Mit Vorbehalt: Vieles lässt sich wiederverwerten, aber nicht alles. + +**F20. Wie viel Zeit gibt es für Marketing?** +- **Dejan: rund 30 Stunden pro Woche.** + - Nach dem Bughunting kommt Customer Success dazu: Kunden-Calls und Onboarding nach dem Vertrieb. + - Die meiste Zeit geht aber ins Marketing. +- **David: rund 10 Stunden pro Woche.** + +**F21. Welche Formate und Ideen hat Dejan schon?** +- **Die Anfänge bei Geerkens im Betrieb** zeigen, sobald dort mit HiveGrid gearbeitet wird. +- **Infoposts zu Funktionen,** weiter wie bisher mit 4 bis 5 Slides. +- **Formate aus Instagram,** die Dejan kennt. Beispiele schickt Dejan noch. +- **Kundeninterviews und Testimonials:** kommen auf die Website. +- **Tutorials als Longform auf YouTube,** gedreht von David. YouTube kommt damit als Kanal dazu. +- **Trendformate:** schauen, was auf TikTok und Instagram gerade läuft, auch bei Sounds, und auf unsere Sparte übertragen. + +**F22. Werkzeuge** +- **Metricool:** + - Den Tarif soll Claude empfehlen. + - Claude darf den MCP nutzen, aber **dort nichts ohne Dejans Erlaubnis verändern**. +- **Reels:** + - Dejan liefert Kanäle und Reels. Reels dürfen auch heruntergeladen werden, wenn Claude das technisch einrichtet. + - Eingerichtet am 05.10.2026: yt-dlp und whisper.cpp lokal. + +### Runde 7: Metricool und Endergebnis (05.10.2026) + +**F23. Metricool** +- **MCP:** am 05.10.2026 verbunden. +- **Schreibschutz:** Die vier schreibenden Werkzeuge (Posts planen, ändern, zur Freigabe senden) sind in Dejans Claude-Einstellungen gesperrt (`permissions.deny` in `~/.claude/settings.json`). Lesen bleibt erlaubt. Für das Einplanen von Entwürfen hebt Dejan die Sperre bei Bedarf kurz auf. +- **Eigentümer der Marke:** Die Marke „HiveGrid“ gehört dem Metricool-Konto `marketing@geerkens.de`. Dejan ist dort Manager. +- **Zahlung:** Den Tarif zahlt Noah, deshalb steht die Empfehlung (Starter) im Strategieentwurf unter „Was wir von Noah brauchen“. + +**F24. Was muss am Ende vorliegen?** +- **Die Content-Strategie als Markdown, PDF und HTML.** Inhalt: + - Übersicht + - Kanäle und ihre Postarten + - Formate + - konkreter Redaktionsplan über alle Kanäle mit genauem Datum +- **Start am 12.10.2026, leicht anfangen.** Aufwendige Reels kommen später, weil Dejans Zeit bis dahin noch zwischen Bughunting und Customer Success geteilt ist. +- Die Vorgaben stehen auch oben in `../Strategie/Content-Strategie.md`. + +**F25. Wie werden LinkedIn, TikTok und YouTube bespielt?** (05.10.2026) +- **LinkedIn:** Text und Bild. +- **TikTok:** Reels von Instagram werden einfach neu hochgeladen. +- **YouTube Shorts:** eventuell ebenso. +- **Ergebnis:** Entwurf 1 der Strategie mit Roadmap und Redaktionsplan vom 12.10. bis 06.12. steht in `../Strategie/Content-Strategie.md`. + +**F26. Was wird aus dem Hub?** (05.10.2026) +- Alle Dateien im Ordner `HiveGrid Marketing ` werden ein **navigierbares Browserprojekt**, also ein persönliches Marketing-Dashboard für Dejan neben Metricool. +- **Änderungen** am Redaktionsplan (oder an anderem) gibt Dejan an Claude, und sie sind danach im Hub angepasst. +- **Für Noah** entstehen zusätzlich PDF und HTML. +- Das ergänzt F14: Website und Produkt bleiben ohne Code aus dem Hub. Das Dashboard selbst ist Code. + +### Runde 8: die letzten offenen Entscheidungen (05.10.2026) + +**F27. Nordstern:** Qualifizierte Erstgespräche pro Monat, die über Marketing kamen. Gemessen über „Wie bist du auf uns gekommen?“. Den Zielwert legen wir mit Haris fest. + +**F28. Kategorie:** Ein Inhaber soll an eine **„Arbeitsoberfläche für den Betrieb“** denken. Das Dach „Verbinden statt ersetzen“ bleibt. + +**F29. Rhythmus und Uhrzeiten:** wie im Redaktionsplan. +- Instagram Mo, Mi, Fr um 12:00, ab Phase 2 auch Do. +- LinkedIn Di und Do um 08:30. +- Produktion Di und Do, Auswertung Fr. + +**F30. YouTube Shorts:** ab 09.11. als Test, Entscheidung zusammen mit TikTok. + +**F31. Newsletter:** Das Werkzeug ist noch offen. Der Newsletter wird **hinten angestellt**, Social Media hat Vorrang. + +**F32. GET Nord** (Hamburg, 19. bis 21.11.2026): +- HiveGrid ist mit 3 bis 4 Leuten dort. +- Dazu gehören sachliche Infoposts: vorher „wir sind da“, hinterher „so war es“. +- Vor Ort wird Material aufgenommen, zum Beispiel B-Roll. + +**F33. Facebook:** erstmal nur spiegeln, später schauen. + +**F34. Dashboard:** wird über einen lokalen Server gestartet, wie `./serve.sh` im Repo `posts`. + +--- + +## 14. Quellen + +**Software** (`/Users/dejancosic/Documents/GitHub/hivegrid-cloud/`) +- Grundlagen: `README.md`, `AGENTS.md`, `CLAUDE.md`, `.planning/PROJECT.md`, `.planning/ROADMAP-V2.md`, `.planning/SPRINT-DAYPLAN.md` +- Entscheidungen und Rechte: `docs/ARCHITECTURE-DECISIONS.md`, `docs/CHANGE-REQUESTS.md`, `docs/ROLLEN-UND-RECHTE.md` +- Preise: `docs/pricing-draft.md`, `docs/sales/HiveGrid-Preisuebersicht-2026-08-04.docx`, `packages/entitlements/src/plans.ts`, `commercial-catalog.ts`, `seat-packages.ts`, `email-marketing-commercial.ts` +- Vertrieb und Demo: `docs/vertrieb/PRODUKTFEATURES.md`, `docs/demo/HIVEGRID-KUNDEN-DEMO-PDS-KWP.md`, `docs/demo/HIVEGRID-DEMO-DOMAINS.md` +- Betrieb und Sicherheit: `docs/ops/prod-rollout-hivegrid.md`, `docs/security/*`, `docs/compliance/gdpr.md`, `SECURITY.md` +- Integrationen: `docs/integrations/*`, `.planning/KWP-API-CONTRACT.md`, `packages/integrations/src/catalog.ts` +- KI: `apps/mcp/src/tools.ts`, `apps/mcp/src/automation/tools.ts` +- Automation: `packages/foundation/src/automation-node-catalog.ts` +- Handouts von Noah: `.planning/handouts/*` (Mobile, Prozess-Engine, KWP-Zielbild) +- Tickets: `.planning/ticket-docs/*` (R-KWP2, VR-PDS, VR-HILTI, VR-MCP, EXT-16, BILL-08, H-*, J-*, GEE-*) + +**Website** (`/Users/dejancosic/Documents/GitHub/HiveGrid-Website/`) +- Landing: `components/landing/LandingPageClient.tsx`, `components/landing/warum/texte.ts`, `components/landing/HoneycombSection.tsx` +- Gestaltung und Daten: `app/globals.css`, `app/layout.tsx`, `lib/chamfer.ts`, `lib/produkt-daten.ts` +- Seiten: `app/ueber-uns/team.ts`, `app/preise/page.tsx`, `app/ki-anbindung/page.tsx`, `app/waitlist/*`, `app/impressum/page.tsx`, `app/datenschutz/page.tsx` +- Planung und Recherche: `OFFENE-PUNKTE.md`, `posts.md`, `webinar.md`, `docs/landing-recherche.md`, `docs/recherche/*` + +**Instagram** (`/Users/dejancosic/Documents/GitHub/posts/`) +- `README.md`, `rules.md`, `POST-2.md` bis `POST-6.md`, `redaktionsplan/bauen.py`, `video/README.md` + +**Wochenreports** (`/Users/dejancosic/Documents/GitHub/Hivegrid_Wochenreport_Teamvorlage/`) +- `ZIELTRACKER.md`, `PERSONEN_UND_ZUSTAENDIGKEITEN.md`, Wochenreports KW 37 bis 40 + +**Bughunting** (`/Users/dejancosic/Documents/`) +- `Bugs Postfach`, `Bugs Kalender - Checklist`, `Bugs Kontakte - Checklist`, `Bugs Terminbuchung - Checklist`, `Dashboard & Analytics - Überarbeitung` + +**Analytics-Prototyp:** `/Users/dejancosic/Documents/GitHub/dashboard/README.md` + +**Davids Vorschläge vom 26.09.:** `Brainstorming Kickoff/MarketingBrainstormingOld.md` diff --git a/Brainstorming Kickoff/MarketingBrainstormingOld.md b/Brainstorming Kickoff/MarketingBrainstormingOld.md new file mode 100644 index 0000000..5e0b865 --- /dev/null +++ b/Brainstorming Kickoff/MarketingBrainstormingOld.md @@ -0,0 +1,92 @@ +# HiveGrid: Vorschläge für Noah + +Davids Perspektive | Diskussionsfassung | 26.09.2026 + +Diese Vorschläge sind unabhängig von Noah entstanden. Sie sollen eine kurze Grundlage für eure Abstimmung sein. Noahs Zustimmung ist damit nicht vorweggenommen. Technische Einordnungen und zusätzliche Empfehlungen von Codex sind gekennzeichnet. + +## 01 / Richtung und Videogestaltung + +### Ziel und Auftritt + +- **Kunden gewinnen:** Inhalte sollen passende Anfragen und Gespräche auslösen. Follower helfen bei Bekanntheit und Vertrauen; die Anzahl allein ist kein Erfolgsziel. Laut bisherigem Bericht kamen noch keine Anfragen aus Posts. +- **Zielgruppe:** SHK-Betriebe ab ungefähr 10-20 Mitarbeitenden, ausdrücklich auch größere. Entscheidend sind Verantwortliche für Digitalisierung und Systeme: Geschäftsführung, nächste Generation oder IT. +- **Zwei Auftritte:** Noah schafft Aufmerksamkeit und persönliche Nähe. HiveGrid vermittelt Produktverständnis, Professionalität und Beständigkeit. HiveGrid-Posts mit Noah als Instagram-Collabs; Infoslides ohne ihn eigenständig. Auch TikTok und Facebook bespielen. LinkedIn bleibt offen, X ist kein Fokus. +- **Gemeinsame Botschaft:** ein CRM für den Handwerksalltag, mit Automatisierung und Verbindung vorhandener Systeme als Nutzenrichtung. „Verbinden statt ersetzen“ ist ein Ansatz; die genaue Kernbotschaft noch mit einem echten Kundenablauf schärfen. + +### Der wichtigste Standpunkt: Animation muss etwas erklären + +> **Animationen sparsam, erklärend und bildfüllend einsetzen.** Das Grundformat ist Noah mit passender B-Roll und gut lesbaren Untertiteln. Animation oben, Noah darunter und zusätzliche Texte wirken im beschriebenen Beispiel überladen: „als wenn GTA-Footage oben ist“. + +Die Kritik: Zusätzliche Bewegung wirkt nach viel Aufwand, erklärt aber nicht automatisch mehr und kann beliebig oder KI-generiert aussehen. Bei schwierigen Abläufen darf eine Fullscreen-Animation mit Noahs Stimme übernehmen. Höchstens ein animiertes Erklärvideo pro Woche als Orientierung, keine Pflichtquote. + +### Konkrete Gestaltungswünsche + +- **Untertitel:** kurze Sätze oder Sinnabschnitte von Beginn an vollständig zeigen. Eine dezente Pille kann das gesprochene Wort markieren; keine ständig neu auftauchenden Einzelwörter. +- **Ton:** verständliche Stimme und sauberer Klang haben sehr hohe Priorität, gegebenenfalls vor visuellen Feinheiten. Keine Verzerrung, Aussetzer oder auffälligen Lautstärkesprünge. KI darf Sounddesign unterstützen; die Ausgabe bleibt zu prüfen. +- **Markenabschluss als Idee:** kurzes Outro mit farbwechselndem G, Sound und Logo oder passender Gesprächseinladung. Kein festgelegter Wortlaut oder Produktionsauftrag. + +**Technische Einordnung von Codex:** Stabile Textgruppen, Kontrast und ausreichende Lesezeit sind sinnvoll; eine wandernde Pille ist kein bewiesener Standard. Mono ist für eine einzelne Stimme normal. Unbeabsichtigt einseitiger Ton ist ein anderer Fehler. Das kritisierte Reel wurde nicht unabhängig gesichtet. Quellen: [DCMP](https://dcmp.org/captioningkey/print), [Audacity](https://www.audacityteam.org/manual/getting-started/connect-your-microphone/). + +--- + +## 02 / Vom Reel zum passenden Gespräch + +### Rhythmus und Inhalte + +- **Anfangs täglich ein Reel.** Deutliche Aufrufe wie „Kommentieren Sie …“ nicht ständig einsetzen; mit Beiträgen ohne starken CTA abwechseln. Animierte Erklärvideos sollen einen passenden CTA haben. +- **Relevante Themen:** Handwerksalltag, konkrete Probleme und Lösungen, Digitalisierung und Noahs passende Erfahrungen. Humor ist willkommen. Allgemeiner Unternehmertum-Content und private Geschichten ohne Handwerksbezug sind kein Schwerpunkt. +- **Ergänzend:** kurze Tutorials, Produktabläufe, Infoslides und Einblicke in Team, Büro, Events oder Entwicklung. Erweiterte animierte Erklärvideos, gegebenenfalls mit weiterer Person, erst später erwägen: vielleicht in ein bis zwei Monaten, kein fester Termin. + +### Erst helfen, dann zum Austausch einladen + +Angefragtes Material direkt liefern, ohne Follow-Zwang. Gewünscht sind **zwei Nachrichten mit Sie-Anrede**: zuerst der Inhalt, danach eine freiwillige Einladung. Im Gespräch den Betrieb verstehen und gemeinsam prüfen, ob HiveGrid passt. Eine reine Demo-Ankündigung klingt zu verkäuferisch. Der direkte Terminlink bleibt erwünscht, auch am Reel, sofern die Funktion verfügbar ist. + +**Austauschbares Textbeispiel für Noah:** David ist beim Wortlaut noch unsicher. Noah kann alles überarbeiten oder durch eine Ansprache ersetzen, die Handwerker besser erreicht. + +> **1.** Vielen Dank für Ihr Interesse! Hier finden Sie die angefragte PDF: [PDF-Link] + +> **2.** HiveGrid bietet noch weitere Möglichkeiten. Gerne möchten wir verstehen, wo Ihre Abläufe heute Zeit kosten, und gemeinsam mit Ihnen prüfen, ob HiveGrid zu Ihrem Betrieb passt. Wenn Sie möchten, lassen Sie uns dazu einfach mal sprechen: [Terminlink] + +Die Linkangaben sind Platzhalter für die spätere Einrichtung. Die Download-PDF für Interessenten ist ein separates Angebot; dieses interne Papier wird dafür nicht verwendet. + +### Eine Woche vorher gemeinsam freigeben + +**Mindestens eine Qualitätsrunde für das vorproduzierte Wochenpaket, einschließlich der zugehörigen ManyChat-Automationen.** Noah übernimmt Themen, Aufnahme und Schnitt; David die Qualitätsprüfung. Wer Automationen einrichtet und endgültig veröffentlicht, ist noch abzustimmen. + +- **Inhalt und Video:** Aussagen stimmen; Animation erklärt nachvollziehbar; Untertitel und Ton sind sauber. +- **Automation:** Vorlage einmal erstellen und kopieren. Jede Kopie auf richtiges Reel, Account, Keyword, Material und funktionierende Links prüfen. +- **Praktischer Vorschlag von Codex:** Ablauf testen, Fehler korrigieren und betroffene Schritte erneut prüfen. Falls eine endgültige Reel-Zuordnung erst später möglich ist, diese bei Veröffentlichung zusätzlich kontrollieren. + +**Technische Grenzen von Codex:** Nach einem bloßen Kommentar ist zunächst eine private Antwort möglich. Nachricht 2 braucht eine weitere geeignete Interaktion; der PDF-Linkklick allein genügt nicht. Link-CTAs sind für Reels-Anzeigen belegt; die organische Button-Funktion der Accounts bleibt zu prüfen. Quellen: [ManyChat](https://help.manychat.com/hc/en-us/articles/14281316989724-Instagram-Post-and-Reel-Comments-trigger), [Meta](https://about.fb.com/br/news/2023/10/atualizacoes-do-reels-ads-novos-recursos-de-desempenho-criacao-automatizada-e-solucoes-de-adequacao/amp/). + +--- + +## 03 / Website, Vertrauen und Umsetzung + +### Eine verständliche Software-Website + +**Produktnah, hochwertig und ruhig:** Probleme an konkreten Abläufen zeigen, übermäßige Emotionalisierung vermeiden. Besucher sollen erkennen, was HiveGrid ist, wie es ihnen hilft und dass ein kompetentes Team dahintersteht. + +- **Herkunft erzählen:** aus Anforderungen des Handwerks entstanden; Noah ist auf ein Softwareteam zugegangen, das die Lösung nah an diesem Bedarf baut. Die Geschichte kurz halten, Raphael muss nicht namentlich vorkommen. +- **Team sichtbar machen:** ein kleiner Abschnitt mit echten Menschen und Verantwortung. Produktbilder und kurze Vorführungen sollen den Nutzen nachvollziehbar machen. +- **Testimonials als Kernthema:** echte Kunden zu ihren Erfahrungen befragen, gegebenenfalls mit professionellen Interviews vor Ort. Dafür bei verfügbaren Mitteln investieren. Konkrete Kunden und belastbare Ergebnisse fehlen noch. + +**Kritische Empfehlung von Codex:** Ein ruhiger Auftritt braucht trotzdem eine klare Erklärung: für wen, welches Problem, welcher Ablauf, wie passt HiveGrid zur vorhandenen Software? Teambilder zeigen Menschen, belegen aber keine Produktergebnisse. Eine sinnvolle Reihenfolge wäre: Nutzen und Produkt → konkreter Ablauf → Zusammenspiel und Einführung → Kundenbelege, Herkunft und Team. Die Gesprächsmöglichkeit bleibt leicht erreichbar. + +### Produkt und Prioritäten realistisch halten + +**Laut bisherigem Bericht** nutzen erste Kunden HiveGrid; Bughunting bleibt nötig. **Ergänzung von Codex:** Vorhandene Funktionen von geplanten Erweiterungen trennen und nur zuverlässig vorführbare Abläufe und Anbindungen versprechen. + +- **Jetzt priorisieren:** Bughunting, Produktentscheidungen und Vertrieb. Noahs Produktion läuft unabhängig; David plant eine kleine Komponentenbibliothek zur Unterstützung. +- **Danach vertiefen:** Corporate-Auftritt, größere Library und Website-Ausarbeitung. Die Verschiebung um zwei bis drei Wochen war eine grobe Priorisierung, kein fixer Starttermin. Für dieses Papier ist das Startdatum unwichtig. +- **Ergebnisse gemeinsam ansehen:** mit Noah und David auswerten, was passende Anfragen erzeugt. Budgetfragen und numerische KPI-Ziele werden vorerst nicht weiter vertieft. Tägliches Posten ist die gewählte Richtung, kein garantierter Algorithmusvorteil. + +**Auswertungsvorschlag von Codex:** Anfragen, gebuchte Gespräche und deren Herkunft mitführen. Mehrere vergleichbare Beiträge betrachten; ein einzelner Reichweitenausreißer beweist keine Überlegenheit eines Formats. + +### Für die Abstimmung mit Noah offenlassen + +1. **Ansprache und Praxis:** Welche Formulierungen passen zu Noah und den Betrieben? Welcher echte Kundenablauf macht die gemeinsame Botschaft konkret? Den Nachrichtentext frei ersetzen. +2. **Kundenbelege:** Wer kann schon einen nachvollziehbaren Nutzen schildern und wäre für ein Testimonial geeignet? +3. **Umsetzung:** Wer richtet ManyChat ein und veröffentlicht? Wie werden Freigabe und gemeinsame Erfolgsauswertung organisiert? Accountfunktionen und Links vor dem Einsatz prüfen. + +Grundlage: Brainstorming vom 24.-26.09.2026. Enthalten ist die aktuelle Position; offene Punkte bleiben zur gemeinsamen Abstimmung. diff --git a/Brainstorming Kickoff/Research/00-uebersicht.md b/Brainstorming Kickoff/Research/00-uebersicht.md new file mode 100644 index 0000000..3653648 --- /dev/null +++ b/Brainstorming Kickoff/Research/00-uebersicht.md @@ -0,0 +1,182 @@ +# Recherche zum Marketing-Brainstorming: Übersicht + +**Stand:** 05.10.2026 +**Zweck:** Die Recherche als Grundlage für das Brainstorming der HiveGrid-Marketingstrategie. Diese Datei fasst die sechs Berichte zusammen, zeigt, wo sie bisherigen Entscheidungen widersprechen, und bündelt die offenen Fragen. + +Die Faktenbasis zu Produkt, Marke und Stand steht in `../Kontext/Kontext.md`. Die Antworten aus dem Dialog stehen dort in Abschnitt 13. + +--- + +## 1. Was in diesem Ordner liegt + +| Datei | Thema | Umfang | +|---|---|---| +| `01-strategie-und-brainstorming.md` | Aufbau einer Strategie (Rumelt, Dunford, Jobs to be done), Testen mit Regeln, Messung, Felder im Redaktionsplan, Ablauf des Brainstormings in Runden, Gliederung des Dokuments für Noah | rund 9.200 Wörter | +| `02-kanaele-und-formate.md` | Instagram, Facebook, LinkedIn, TikTok und YouTube Shorts 2026: was der Algorithmus belohnt, Formate, Frequenz, wo die Zielgruppe ist, Wiederverwertung, Setup neuer Konten mit Impressum | rund 8.000 Wörter | +| `03-wettbewerb-und-vorbilder.md` | Social Audit von plancraft, HERO, ToolTime und anderen, internationale Vorbilder, SHK-Creator, 30 Format-Ideen, Lücken im Markt | rund 9.500 Wörter | +| `04-tools-und-anbindungen.md` | Claude mit Instagram, Metricool-MCP, ManyChat und Alternativen, Subframe als Quelle, Video- und Newsletter-Werkzeuge, Setup-Fahrplan | rund 8.500 Wörter | +| `05-kanaele-jenseits-social.md` | Newsletter-Recht, Cold Calling, Lead-Magneten, SEO, Bewertungsportale, Messen, Verbände, Fachmedien, Podcasts, Partner, Priorisierung | rund 8.300 Wörter | +| `06-personal-brand-und-funnel.md` | Noahs Personal Brand als Funnel, Rollenteilung, Funnel von Anfang bis Ende, Recht (Kennzeichnung, Impressum, Musik, KI), Risiken, Ideen für Noah und Collabs | rund 8.500 Wörter | + +Alle Dateien haben dieselbe Gliederung: Kurzfassung, Hauptteil, „Was das für HiveGrid heißt“, offene Fragen, Quellen. + +--- + +## 2. Wie belastbar das ist + +**Gegengeprüft** (05.10.2026, direkt an der Quelle): +- **OLG Hamburg, 21.05.2026, Az. 15 U 99/24:** Das Urteil behandelt beides. Ein klickbarer Link unter der Bio zum Impressum reicht. Bei offensichtlicher Eigenwerbung ist eine Kennzeichnung entbehrlich, wenn „sich der kommerzielle Zweck unmittelbar aus den Umständen ergibt“. +- **KWP-Verzeichnis „Externe Add-ons“:** Es lädt Hersteller wörtlich ein, „eine Aufnahme Ihrer Lösung in dieses Verzeichnis zu beantragen“. HalloPetra steht dort schon. +- **werkflow.digital:** nennt sich „Das automatisierte CRM-System für Ihren SHK-Betrieb“, „Ergänzend zu Ihrer bestehenden Software oder als Komplett-Lösung“. Preise: 10.000 € einmalig, 2.500 € im Monat, dazu 300 € Wartung. Als bestehende Systeme werden HERO und Handwerker-Office genannt, nicht KWP oder pds. +- **Metricool-MCP:** offizielle Adresse `https://ai.metricool.com/mcp`, „works with any Metricool plan, including Free“. Für Claude Code ist ein Claude-Abo Pro oder Max nötig. + +**Grenzen:** +- **Suchkontingent:** Bei allen sechs Agenten war gegen Ende das Kontingent für die Websuche aufgebraucht. Danach wurden nur noch bekannte Seiten direkt abgerufen. Punkte, die nur auf einer Quelle stehen, sind in den Dateien markiert. +- **Instagram:** Inhalte waren ohne Login nicht sichtbar, nur Follower und die Zahl der Beiträge. Formate wurden aus TikTok und YouTube Shorts abgeleitet. +- **Studien:** Viele Zahlen zu Algorithmen und Reichweite stammen von Tool-Anbietern (Buffer, Metricool, AuthoredUp), nicht von den Plattformen. Aussagen von Plattformen selbst (etwa Adam Mosseri) sind als solche markiert. +- **Recht:** Alle Rechtsthemen sind Einordnung, keine Rechtsberatung. Vor allem die Werbekennzeichnung bei Noah ist nicht einheitlich geklärt. + +--- + +## 3. Die wichtigsten Erkenntnisse + +**Strategie** +1. **Erst die Diagnose, dann die Kanäle.** Die stärkste Alternative zu HiveGrid ist „so weitermachen“, nicht HERO oder plancraft. Bei SHK-Betrieben bremsen Angst (Kontrollverlust, Datenschutz) und Gewohnheit stärker, als neue Funktionen ziehen. „Dein ERP bleibt“ und „Automatisierung ohne Angst“ antworten genau darauf. (01) +2. **Käufer entscheiden, bevor sie anrufen.** Laut 6sense 2025 melden sie sich erst nach rund 60 % des Kaufwegs, und der Favorit von vorher gewinnt meistens. Das Profil von HiveGrid ist deshalb vor allem der Ort, an dem jemand prüft, ob wir seriös sind. Das gilt auch nach einem Anruf von Haris. (01, 06) +3. **Belege gibt es auch ohne Kunden:** Noahs Herkunft, den Bau des Produkts, echte Abläufe. Und sobald Geerkens startet, die **Umstellung bei Geerkens als Serie**. Alle drei Berichte zu Inhalten nennen sie den stärksten Start. (01, 03, 06) +4. **Vorschlag für den Nordstern:** qualifizierte Erstgespräche pro Monat. Dazu fragen wir offen „Wie bist du auf uns gekommen?“, in Cal, im Erstgespräch und beim Cold Call. Tracking-Software übersieht den Großteil, vor allem Empfehlungen über WhatsApp. (01, 06) +5. **Testen mit Regeln:** jedes Format 6 bis 8 Beiträge über 3 bis 4 Wochen. Werte pro Reichweite statt absoluter Zahlen. Abbruchkriterien als „Zustand und Datum“. Einem neuen Kanal rund 12 Wochen geben. (01) + +**Kanäle und Formate** +6. **Überall zählen dieselben Signale:** zu Ende geschaut, gespeichert, weitergeschickt. Auf Instagram zählen laut Adam Mosseri Watchtime, Likes pro Reichweite und Sends pro Reichweite. Auf LinkedIn zählt seit März 2026 vor allem die Lesedauer. (02) +7. **Originalität ist die neue Regel.** Instagram, Facebook und TikTok zeigen Umgepostetes seltener. Eigene Aufnahmen auf mehreren Kanälen sind in Ordnung, aber immer die saubere Masterdatei hochladen, nie mit Wasserzeichen einer anderen App. (02) +8. **Die Inhaber sind auf Facebook und Instagram, kaum auf TikTok.** + - 30 bis 49 Jahre: Instagram 54 %, Facebook 48 %, TikTok 24 % (ARD/ZDF 2025). + - Handwerksbetriebe mit Social Media: Facebook 57 %, Instagram 38 %, TikTok 7 % (Bitkom). + - Die größte SHK-Community ist eine Facebook-Gruppe (#HZBAL, über 27.000 Mitglieder). (02, 03) +9. **LinkedIn läuft über Personen.** Unternehmensseiten machen nur rund 2 % des organischen Feeds aus. Noahs Profil ist der Hauptkanal, die HiveGrid-Seite ist der Beleg. (02, 06) +10. **Carousels sind nicht tot, reine Text-Animationen schon eher.** Reels, die fast nur aus Text bestehen, zeigt Instagram seltener. Die Animationen aus unserem Generator passen besser als Carousel oder mit Noahs Stimme darüber. **Trial Reels** passen genau zu „viele Formate testen“. (02) + +**Wettbewerb** +11. **Die großen Zahlen der Wettbewerber sind gekauft.** Bei plancraft, HERO, ToolTime und Meisterwerk sind die Millionen-Videos als Anzeigen markiert. Organisch erreichen alle meist 300 bis 1.500 Aufrufe pro Clip. Nur plancraft hat ein echtes Social-Programm. (03) +12. **Kein Softwareanbieter zeigt seinen Gründer, und SHK fehlt im Software-Content fast ganz.** Ein Mitgründer, der selbst SHK-Meister ist, ist im Feld einzigartig. (03, 06) +13. **„Ergänzend“ ist nicht mehr ganz frei.** werkflow.digital nutzt es auch, aber teuer und ohne KWP oder pds. Der Abstand liegt in Preis und Tiefe der Anbindung. (05) + +**Jenseits von Social Media** +14. **Der stärkste kostenlose Kanal sind die Partnerverzeichnisse der ERP-Hersteller.** KWP lädt öffentlich ein. pds hat Partner-Lösungen unter „Multi-Cloud / API“. HalloPetra sucht Softwarepartner. (05) +15. **Recht begrenzt Cold Calling und Direktnachrichten stärker als gedacht.** + - Anrufe ohne Vorkontakt sind riskant. Seit BVerwG 29.01.2025 kann auch die Datenschutzbehörde vorgehen. + - Kalt-E-Mails und Werbenachrichten auf LinkedIn sind auch im B2B unzulässig. + - Messe-Kontakte aus dem Website-Formular sind gut abgesichert. (05) + +**Werkzeuge** +16. **Metricool ist der Mittelpunkt.** Der offizielle MCP verbindet Claude in jedem Tarif. + - Der Free-Tarif reicht nicht lange: 1 Marke, 20 Beiträge im Monat, kein LinkedIn. + - Starter mit 5 Marken kostet 16 bis 20 € im Monat und bringt **Metricool Flows** mit, eine EU-Alternative zu ManyChat. (04) +17. **Meta erlaubt nach einem Kommentar genau eine private Antwort.** Davids Ablauf mit zwei Nachrichten braucht deshalb einen Button oder eine Antwort der Person dazwischen. (04, 06) +18. **CapCut für HiveGrid besser meiden** (ByteDance, Server außerhalb der EU, weite Lizenz an Inhalten). (04) + +--- + +## 4. Wo die Recherche bisherigen Entscheidungen widerspricht + +Diese Punkte sollten im Brainstorming noch einmal auf den Tisch, auch wenn sie schon entschieden schienen. + +| Thema | Bisher (Abschnitt 13 der Kontext.md) | Was die Recherche sagt | +|---|---|---| +| **TikTok** | gesetzter Basiskanal (F13) | Kaum Belege für B2B-Verkauf an Handwerker, nur 7 % der Betriebe sind dort. Vorschlag: 8 Wochen Test, nur mit wiederverwendeten Inhalten, klare Abbruchkriterien. Offen: Gehört das leere TikTok-Konto `@noahgeerkens` Noah, und wäre Noahs Konto der bessere Ort? | +| **Facebook** | Basiskanal, eher zum Mitposten | Bei Handwerksbetrieben der verbreitetste Kanal. Reichweite entsteht über Gruppen, nicht über die Seite. | +| **Nachfolge** | als Thema nicht gewählt (F12) | Laut Bitkom für 47 % der Betriebe ein aktuelles Problem. Im Markt spricht niemand darüber, und die nächste Generation entscheidet mit. Drei Berichte empfehlen, es wenigstens nebenbei zu testen. | +| **KI** | dosiert, als Extra (F10) | Noahs Instagram-Profil heißt „KI im Handwerk“, das von HiveGrid „KI fürs Handwerk“. Das passt nicht zur Entscheidung. | +| **DM-Funnel** | Davids Plan: zwei Nachrichten im Sie | Meta erlaubt nur eine private Antwort ohne Reaktion. Jetzt gilt Du (F11). Vorschlag: eine Nachricht mit PDF und einer Frage mit Button. | +| **Basiskanäle und Kapazität** | vier Kanäle, dazu Noah und Newsletter (F13) | Für 1 bis 2 Personen viel. Alle Berichte raten: lieber wenige Kanäle richtig. Wiederverwertung ist der Hebel: eine Aufnahme pro Woche ergibt 8 bis 12 Beiträge. | +| **Budget** | kein Budget (F16) | Kleine Fixkosten sind kaum zu vermeiden: Metricool Starter 16 bis 20 € im Monat, Messetickets 25 bis 35 €. | +| **Generator** | Bild- und Animationsposts | Reine Text-Animationen werden seltener gezeigt. Besser als Carousel oder mit Stimme darüber. | +| **„Hosting in Deutschland“** | Markenversprechen | In Bio und Posts nur ehrlich formuliert, wegen Cloudflare (siehe Kontext 9.7). | +| **Cold Calling** | läuft, auch ohne Vorkontakt? (F1) | Rechtlich enger als gedacht. Vorschlag: Leitfaden vom Anwalt gegenlesen lassen. Für Betriebe ohne Vorkontakt erst ein Brief mit Cal-Link. | + +--- + +## 5. Vorschlag für den Ablauf des Brainstormings + +Aus Bericht 01, Abschnitt 5. Jede Runde endet mit einer festgehaltenen Entscheidung. Was schon beantwortet ist, steht dabei. + +| Runde | Thema | Schon geklärt (Kontext 13) | Noch offen | +|---|---|---|---| +| **A** | Ziel, Diagnose, Nordstern | Ziele (F3) | Diagnose in einem Satz, Nordstern, Zahl der Gespräche für Haris, was wir bewusst nicht tun | +| **B** | Zielgruppe | alle SHK, 10 bis 50 Leute (F1, F2) | bester Kunde, Kaufanlässe, die vier Kräfte, wo sich Inhaber informieren | +| **C** | Positionierung und Botschaft | | Kategorie (CRM, Arbeitsoberfläche, Ergänzung zum ERP), Messaging-Haus, Antworten auf Einwände, Abgrenzung zu werkflow | +| **D** | Absender und Ton | Du (F11), Noah als Top of Funnel (F7) | Tonalität: Humor bei Noah, Ruhe bei HiveGrid? (F8 offen). Rolle von Noah im Bild, Brücke zu HiveGrid | +| **E** | Kanäle | Basiskanäle (F13) | Rolle je Kanal, Hauptkanal, TikTok-Umfang, Facebook-Gruppen, Partner, Newsletter | +| **F** | Säulen und Formate | „Automatisierung ohne Angst“ (F12) | 3 bis 5 Säulen, Formate sammeln (deine Vorbilder, 30 Ideen aus 03, 25 aus 06), mit ICE bewerten | +| **G** | Tests | viele Formate testen (F8) | 3 bis 5 erste Tests, Hypothese, Abbruchkriterium | +| **H** | Prozess | | Rollen, Stunden, Wochenrhythmus, Freigabe, wer postet und antwortet | +| **I** | Messung | | KPIs je Kanal, Selbstauskunft, Auswertungsrhythmus, Metricool-Anbindung | +| **J** | Premortem | | „Es ist April 2027, das Marketing hat nichts gebracht. Warum?“ | +| **K** | Zusammenbau | | Strategie-Dokument und Redaktionsplan für Noah (MD, PDF, HTML) | + +--- + +## 6. Offene Fragen, zusammengeführt + +Aus allen sechs Berichten, ohne Doppelte, sortiert nach Empfänger. In Klammern steht, aus welchem Bericht die Frage kommt. + +### 6.1 An Dejan, wichtig fürs Brainstorming + +1. **Vorbilder:** Welche Instagram-Kanäle sind deine Beispiele für gute Reels, und was genau gefällt dir daran? (01, 03, 04) +2. **Nordstern:** Sind „qualifizierte Erstgespräche pro Monat“ der richtige Nordstern? Wie viele braucht Haris, um in 6 Monaten erste zahlende Kunden zu haben? (01) +3. **Kapazität:** Wie viele Stunden pro Woche haben du und David nach dem Bughunting für Marketing? (01, 06) +4. **Kategorie:** Welches Wort soll ein Inhaber nach 5 Sekunden im Kopf haben: CRM, Arbeitsoberfläche, Ergänzung zum ERP? (01) +5. **Humor bei HiveGrid:** Darf HiveGrid selbst Humor testen, oder bleibt das bei Noah? (01, 02, 06) +6. **Neue Prüfung:** TikTok-Umfang, Facebook-Gruppen und Nachfolge, siehe Abschnitt 4. (01, 02, 03) +7. **Produktposts:** Was passiert mit den zwei fertigen Posts (Form Builder, E-Mail-Marketing)? (01) +8. **Belege:** Gibt es den „Founding-Deal“ aus dem Juni-Sprint noch? Könnten die ersten Betriebe als Gründungsbetriebe starten, über die wir berichten dürfen? (01) +9. **Creator:** Wäre „Software gegen Content“ mit kleinen SHK-Creatorn denkbar, wie die „Creator Family“ von plancraft? Ist Reagieren auf fremde Videos (Stitch, Duett) in Ordnung? (03) +10. **Zielgebiet:** Bundesweit oder zuerst NRW und Niederrhein? (05) +11. **werkflow.digital:** Kennt ihr den Anbieter? Wie grenzen wir uns ab, außer über den Preis? (05) + +### 6.2 An Dejan, Setup und Organisation + +12. **Metricool:** Welcher Tarif läuft? Ist Starter (16 bis 20 € im Monat) möglich? Sollen wir die MCP-Anbindung an Claude einrichten? Sollen TikTok, LinkedIn und Facebook vor dem Formattest verbunden werden? (01, 03, 04) +13. **Konten:** Ist `hivegrid.de` ein Business- oder Creator-Konto? Wer legt Facebook-Seite und TikTok an und wird Admin? Ist der Name auf allen Kanälen frei? (02, 04) +14. **Veröffentlichen und Antworten:** Wer postet, wer antwortet auf Kommentare und DMs, zu welchen Zeiten? (02) +15. **Reel-Werkbank:** Mit Download (yt-dlp, Whisper, ffmpeg) oder lieber „ansehen und diktieren“? (04) +16. **Werkzeuge:** Welches Claude-Abo, und ist das Training mit deinen Chats abgeschaltet? Adobe-Lizenz? Hast du in Subframe einen Editor- oder Betrachter-Platz, und in welchem Projekt liegen die aktuellen Screens? (04) +17. **Newsletter:** Eigenes E-Mail-Modul oder externes Werkzeug? Kann das Modul Double-Opt-in mit Protokoll? Wann kommt der Mailjet-Nachweis? (02, 04, 05, 06) +18. **Selbstauskunft:** Kann Haris ein Feld „Wie bist du auf uns gekommen?“ in Cal und im Vertriebs-CRM einbauen? (01, 06) +19. **Follower-Sprung:** Woher kamen die neuen Follower um den 27.09., von einem Collab mit Noah? (02, 06) +20. **Cold Calling:** Woher stammen die Nummern, die Haris anruft? Wie lautet der Text des Website-Formulars der Messe-Kontakte? (05) +21. **Partner:** Wer beantragt die Aufnahme ins KWP-Verzeichnis? Gibt es eine Antwort von pds auf die Anfrage vom 25.08.? Gibt es einen Kontakt zu HalloPetra? (05) +22. **Messen:** Fährt jemand zur GET Nord (19. bis 21.11.2026) oder zur ISH (15. bis 19.03.2027)? (03, 05) + +### 6.3 An Noah (für das Paket zur Prüfung) + +23. **Zeit:** Wie viele Stunden pro Woche für Reels, LinkedIn, Collabs und Freigaben? Ist „täglich ein Reel“ machbar? Zeit für Podcasts, Innung, Messen? (01, 05, 06) +24. **Umstellung bei Geerkens:** Darf sie öffentlich gezeigt werden, auch mit Problemen? Machen Team, Schwester und Monteure vor der Kamera mit? Ab wann darf Geerkens als Referenz auftreten? (01, 03, 05, 06) +25. **Rolle:** Tritt Noah vor allem als Chef von Geerkens, als Gründer von HiveGrid oder als beides auf? Soll öffentlich werden, dass Geerkens in HiveGrid investiert hat? (06) +26. **Brücke:** Wie oft verweisen Noahs Reels auf HiveGrid oder laufen als Collab? Welche dürfen im HiveGrid-Raster erscheinen? (01, 02, 06) +27. **Konto und Funnel:** Ist Noahs Instagram ein Creator- oder Business-Konto? Läuft der DM-Funnel über Noahs Konto oder über HiveGrid? Wer antwortet, und wem gehören die Kontakte? (04, 06) +28. **TikTok und Facebook:** Gehört das leere TikTok-Konto `@noahgeerkens` Noah? In welchen Facebook-Gruppen ist Noah, und will Noah dort aktiv sein? (02, 03) +29. **Freigabe:** Wäre Noah mit einer Formatfreigabe und danach Wochenpaketen mit Frist einverstanden? (01) +30. **Ton:** Was ist beim Humor tabu? (06) +31. **Insights:** Welche bisherigen Reels liefen gut? Wer folgt Noah heute? (03, 06) +32. **KI:** Welche KI-Werkzeuge nutzt Noah? Werden Stimme oder Gesicht mit KI erzeugt? (Kennzeichnung nach Art. 50 EU AI Act, seit 02.08.2026) (06) +33. **Profiltitel:** Bleibt „KI im Handwerk“ als Profiltitel? (03) +34. **Erstgespräche:** Will Noah bei den ersten Erstgesprächen kurz dabei sein? (06) + +### 6.4 Für eine Rechtsprüfung + +35. **Impressum:** Unter welcher Firmierung und Anschrift laufen die Profile? Wessen Impressum steht auf Noahs Profil? (02, 06) +36. **Werbekennzeichnung:** Wann muss Noah werbliche Beiträge für HiveGrid kennzeichnen? Die Quellen sind uneinig. (06) +37. **Musik:** Musik in geschäftlichen Reels. (02, 06) +38. **Cold Calling und E-Mail:** einseitiger Leitfaden für Anrufe und E-Mails nach dem Anruf. (05) +39. **Reel-Download:** zur Analyse fremder Reels (§ 44b UrhG). (04) +40. **DM-Funnel:** Abfrage von Kontaktdaten im Chat. (04) + +--- + +## 7. Was Claude direkt einrichten könnte, mit Freigabe + +- **Metricool-MCP in Claude Code:** `claude mcp add --transport http metricool https://ai.metricool.com/mcp`, danach im Browser anmelden. Die Schreibwerkzeuge sollten auf „nachfragen“ bleiben, damit nichts ohne Freigabe geplant wird. (04, Abschnitt 2) +- **Reel-Werkbank:** yt-dlp und Whisper installieren, ffmpeg ist schon da. Mit einem Ordner für Analysen im Hub. Nur nach der Rechtsfrage 39. (04, Abschnitt 1) +- **Subframe-MCP:** ist in dieser Umgebung schon verbunden. Damit lassen sich Komponenten und Screens für Posts herausziehen. (04, Abschnitt 4) diff --git a/Brainstorming Kickoff/Research/01-strategie-und-brainstorming.md b/Brainstorming Kickoff/Research/01-strategie-und-brainstorming.md new file mode 100644 index 0000000..88a2911 --- /dev/null +++ b/Brainstorming Kickoff/Research/01-strategie-und-brainstorming.md @@ -0,0 +1,819 @@ +# 01 Strategie-Aufbau und Brainstorming-Methode + +**Stand:** 05.10.2026 +**Für:** Dejan Cosic (Brainstorming), später Noah Geerkens und David Bertram +**Frage:** Wie bauen wir eine Marketing- und Content-Strategie für HiveGrid auf, mit kleinem Team und ohne Budget? Wie testen, messen und planen wir? Und wie führen wir das Brainstorming? + +**Lesehilfe** +- **Belegt** heißt: Es steht so in einer Quelle. Die Quelle steht in eckigen Klammern, zum Beispiel [Q3]. Die Liste ist am Ende. +- **Einschätzung** heißt: Das ist meine Ableitung oder ein Erfahrungswert aus der Praxis. Keine Studie dahinter. +- **Kontext** heißt: Es steht in unserer Kontext-Datei [Q40]. +- Viele Studien stammen aus den USA und aus großen B2B-Käufen. Ich sage jeweils dazu, wenn die Übertragung auf SHK-Betriebe unsicher ist. + +--- + +## Kurzfassung + +1. **Erst Diagnose, dann Kanäle.** Eine Strategie hat drei Teile: Was ist das Problem, welche Richtung wählen wir, welche Schritte passen zusammen (Richard Rumelt) [Q30]. Die typische Falle ist, mit Formaten und Kanälen anzufangen. +2. **Positionierung beginnt bei den Alternativen.** April Dunford fragt zuerst: Was würde der Betrieb ohne uns tun? [Q1][Q2]. Für HiveGrid heißt die stärkste Alternative „so weitermachen“, nicht „Hero oder plancraft“. +3. **Der Kauf scheitert an Angst und Gewohnheit, nicht an fehlenden Funktionen.** Das Modell der „Four Forces“ von Bob Moesta erklärt, warum die Produktposts nicht trugen: Sie zeigten nur den Sog des Neuen, nicht die Antwort auf Angst und Gewohnheit [Q24]. „Verbinden statt ersetzen“ zielt genau auf diese beiden Kräfte. +4. **Käufer entscheiden, bevor sie anrufen.** Laut 6sense melden sich B2B-Käufer erst nach rund 61 % ihres Wegs, und in rund 80 % der Fälle gewinnt der Anbieter, den sie zuerst kontaktieren [Q4]. Vieles passiert in „Dark Social“, also in Gesprächen, Messengern und Podcasts, die keine Software misst [Q6][Q7]. Im Handwerk ist das vor allem WhatsApp: 62 % der Betriebe nutzen Messenger [Q20]. +5. **Noah trägt Reichweite, HiveGrid trägt Beleg.** Persönliche Profile erreichen auf LinkedIn deutlich mehr als Firmenseiten [Q19]. Das passt zum bisherigen Modell: Noah oben im Funnel, HiveGrid als Schaufenster, das prüft, wer sich ernsthaft interessiert, auch nach einem Anruf von Haris. +6. **Beleg ohne Kunden geht, wenn er ehrlich ist.** Herkunft (Noah), Bau-Prozess, echte Produktabläufe und die Umstellung bei Geerkens als Serie sind Belege. Erfundene Zahlen und Stimmen sind tabu (Kontext). +7. **Testen mit Regeln.** Bullseye für Kanäle [Q11], ICE für Ideen [Q13], und für jeden Test vorab ein Abbruchkriterium aus „Zustand und Datum“ (Annie Duke) [Q14]. Einem neuen Kanal geben Praktiker rund 90 Tage [Q37]. +8. **Messen: ein Nordstern, wenige Frühindikatoren.** Vorschlag Nordstern: qualifizierte Erstgespräche pro Monat. Frühindikatoren auf Instagram sind laut Adam Mosseri Watchtime, Likes pro Reichweite und vor allem **Sends pro Reichweite** [Q17]. Dazu ein offenes Feld „Wie bist du auf uns gekommen?“ bei jeder Buchung [Q6][Q23]. +9. **Frequenz realistisch halten.** Laut Buffer reichen 3 bis 5 Beiträge pro Woche auf Instagram und 2 bis 5 auf LinkedIn und TikTok für den größten Effekt [Q18]. Mit 1 bis 2 Personen geht das nur mit Wochenpaketen, Wiederverwertung und einer schnellen Freigabe. +10. **Brainstorming in fester Reihenfolge:** Ziel, Zielgruppe, Positionierung und Botschaft, Absender und Ton, Kanäle, Säulen und Formate, Tests, Prozess, Messung, dann ein „Premortem“ [Q31]. Die Checkliste dafür steht in Abschnitt 5.4. + +--- + +## 1. Wie man eine Marketing- und Content-Strategie aufbaut + +### 1.1 Die Reihenfolge + +**Belegt:** +- Richard Rumelt beschreibt den Kern jeder guten Strategie mit drei Teilen [Q30]: + 1. **Diagnose:** Was ist das eigentliche Problem? + 2. **Leitlinie:** Welche Richtung wählen wir, um es zu lösen? + 3. **Zusammenhängende Schritte:** Maßnahmen, die sich gegenseitig stützen. +- Ziele allein sind laut Rumelt keine Strategie. Ein Wunsch wie „mehr Reichweite“ ersetzt keine Diagnose. +- Das Content Marketing Institute (CMI) hat für 2026 rund 1.015 B2B-Marketer befragt (veröffentlicht 08.10.2025) [Q3]: + - Die drei größten Probleme: Inhalte, die zu Abschlüssen führen (40 %), knappe Ressourcen (39 %), Wirkung messen (33 %). + - Die erfolgreicheren Teams setzen eher auf bessere Strategie (74 %) als auf mehr Budget. + +**Einschätzung:** Für HiveGrid passt diese Reihenfolge: + +| Schritt | Frage | Ergebnis | +|---|---|---| +| 1. Ziel und Diagnose | Was soll Marketing in 3 bis 6 Monaten leisten? Was steht im Weg? | Ziel, Nordstern, Hauptproblem | +| 2. Zielgruppe | Wer kauft, wer entscheidet, was löst den Kauf aus? | ICP, Personas, Jobs, Kaufanlässe | +| 3. Positionierung | Wogegen treten wir an, was können nur wir? | Positionierung in 5 Teilen | +| 4. Botschaft | Was sagen wir, in welcher Reihenfolge, mit welchem Beleg? | Messaging-Haus | +| 5. Absender und Ton | Was sagt Noah, was sagt HiveGrid? Wie klingen beide? | Absender-Modell, Tonregeln | +| 6. Kanäle | Wo erreichen wir die Leute, wo prüfen sie uns? | Rolle je Kanal | +| 7. Säulen und Formate | Worüber reden wir regelmäßig, in welcher Form? | 3 bis 5 Säulen, Formatliste | +| 8. Tests | Was probieren wir, wie lange, wann hören wir auf? | Testplan mit Abbruchkriterien | +| 9. Prozess | Wer macht was, wann, mit welcher Freigabe? | Redaktionsplan, Wochenrhythmus | +| 10. Messung | Woran sehen wir, ob es wirkt? | KPI-Baum, Auswertungsrhythmus | + +### 1.2 Positionierung nach April Dunford + +**Belegt:** +- April Dunford definiert Positionierung so: Wie ein Produkt bei etwas führend ist, das einer klar umrissenen Gruppe von Kunden sehr wichtig ist [Q1]. +- Die fünf Bausteine, in dieser Reihenfolge [Q1]: + 1. **Wettbewerbsalternativen:** Was würden Kunden tun, wenn es uns nicht gäbe? Dazu zählt ausdrücklich „so weitermachen wie bisher“. + 2. **Einzigartige Merkmale:** Was können wir, was die Alternativen nicht können? + 3. **Wert:** Was bringen diese Merkmale dem Kunden? + 4. **Beste Kunden:** Wer legt besonders viel Wert darauf? + 5. **Marktkategorie:** In welchem Rahmen wird der Wert sofort klar? +- Im Buch „Obviously Awesome“ sind das zehn Schritte [Q2]. Wichtig für uns: + - Ein kleines Team aus Marketing, Vertrieb und Produkt erarbeitet die Positionierung gemeinsam. + - Erst „Positionierungsballast“ ablegen, also alte Annahmen, was das Produkt ist. + - Für die Marktkategorie gibt es drei Wege: direkt gegen den Marktführer, „großer Fisch im kleinen Teich“ (ein Teilmarkt) oder eine neue Kategorie. + - Einen Trend erst am Ende aufsetzen. Dunford: lieber langweilig und profitabel als cool und unverständlich. +- Zwei typische Fehler nach Dunford [Q1]: + - Alternativen zu breit fassen, mit „Phantom-Wettbewerbern“, die Kunden nie in Betracht ziehen. + - Zu glauben, man brauche eine neue Kategorie. Laut Dunford waren rund 90 % der jüngeren Börsengänge in bestehenden Märkten positioniert. + +**Einschätzung: Was das bei HiveGrid ergibt (Entwurf für das Brainstorming)** + +| Baustein | Entwurf für HiveGrid | Belegt im Kontext? | +|---|---|---| +| Alternativen | 1. So weitermachen: Branchenprogramm plus Excel, Outlook, WhatsApp, Zettel, Zaps und Google Forms. 2. Komplettwechsel auf eine All-in-One-Software (Hero, plancraft, ToolTime und andere). 3. Einzelne Zusatztools (CRM, Terminbuchung). | 1 und 2 ja (Geerkens nutzt Zaps und Google Forms, 15 Wettbewerber versprechen All-in-One). 3 ist Vermutung. | +| Einzigartige Merkmale | Tiefe Anbindung an KWP und PDS, Automationen, die auf Ereignisse aus dem ERP reagieren. Entstanden in einem SHK-Betrieb. Automationen mit Probelauf, 24 Stunden Rückgängig und Freigabe durch einen Menschen. | Ja | +| Wert | Du musst nichts wechseln. Anfragen und Aufgaben gehen nicht verloren. Das Wissen aus dem Kopf des Chefs kommt in die Ausführung. | Teilweise, als Versprechen. Ohne Zahlen. | +| Beste Kunden | SHK-Betriebe mit 10 bis 50 Leuten, mit KWP oder PDS, vielen Anfragen (zum Beispiel Wärmepumpe) und mehreren Projekten parallel. Oft dort, wo die nächste Generation einsteigt. | Größe ja (F2). „Nächste Generation“ als Entscheider ja (10.7). | +| Marktkategorie | Offen. Kandidaten: „CRM für den Handwerksalltag“ (Davids Papier), „die Arbeitsoberfläche um dein Branchenprogramm“, „Ergänzung für KWP- und PDS-Betriebe“. | Offen | + +**Einschätzung zur Kategorie:** +- Eine ganz neue Kategorie („Software-Schicht um das ERP“) ist teuer zu erklären. Das ist bei einer überlasteten Zielgruppe ein echtes Risiko (Bitkom: 58 % haben keinen Überblick, was es gibt, Kontext 7.2). +- Ein bekanntes Wort plus Teilmarkt ist leichter: „CRM und Automationen für SHK-Betriebe, die ihr Branchenprogramm behalten“. Das wäre Dunfords „großer Fisch im kleinen Teich“. +- Spannung: Dejan will alle SHK-Betriebe ansprechen (F1). Dunford würde sagen: Ansprechen ja, aber Belege und Beispiele auf die besten Kunden zuschneiden. Das muss im Brainstorming entschieden werden. + +**Wichtiger Hinweis:** Dunfords Methode startet mit den Kunden, die das Produkt lieben. Die hat HiveGrid noch nicht. Ersatz für jetzt: Geerkens als erster Nutzer, Davids Feedback vom Networking-Event und vor allem die Cold Calls von Haris. Die Positionierung ist deshalb eine Hypothese, die wir in 8 bis 12 Wochen neu prüfen sollten. + +### 1.3 Ideal Customer Profile, Personas und Jobs to be done + +**Belegt:** +- **ICP** (Ideal Customer Profile) beschreibt die Firma: Branche, Größe, eingesetzte Software, Situation [Q35b]. Erst der ICP, dann die Personas. +- **Personas** beschreiben die Menschen in dieser Firma: Rolle, Ziele, Sorgen, wie sie kaufen. +- **Jobs to be done** beschreiben, was jemand erreichen will, unabhängig von der Person. +- Bob Moesta beschreibt mit den **Four Forces** (vier Kräften), wann jemand wechselt [Q24]: + - **Druck** (Push): Was am heutigen Zustand nervt. + - **Sog** (Pull): Was die neue Lösung verspricht. + - **Angst** (Anxiety): Sorge vor dem Neuen, Unbekannten. + - **Gewohnheit** (Habit): Das Vertraute hält fest. + - Gewechselt wird nur, wenn Druck und Sog stärker sind als Angst und Gewohnheit. +- Jenni Romaniuk (Ehrenberg-Bass-Institut) nennt die Momente, in denen jemand an eine Kategorie denkt, **Category Entry Points**, also Kaufanlässe [Q25]. Ihre Kernaussage: Diese Anlässe drehen sich um den Käufer, nicht um die Marke. Wer mit vielen Anlässen verknüpft ist, wird öfter erinnert. + +**Einschätzung: Die vier Kräfte bei HiveGrid** + +| Kraft | Bei einem SHK-Betrieb | Woher | +|---|---|---| +| Druck | Anfragen gehen unter. Abtippen zwischen Systemen. Der Chef hat alles im Kopf (Noah: „das Wissen liegt an einem anderen Ort als die Arbeit“). Rund 7 Stunden Büro pro Woche, oft abends. | Kontext 7.1, 7.2 | +| Sog | Eine Oberfläche, Automationen, Online-Terminbuchung, Monteur-App | Kontext | +| Angst | Kontrollverlust (56 % fürchten Überwachung), Datenschutz (96 % Hemmnis), „noch ein Programm“, Aufwand, Kosten | Bitkom, Kontext 7.2 | +| Gewohnheit | Das Branchenprogramm, WhatsApp, Zettel, „läuft doch“ | Kontext | + +**Einschätzung:** Das erklärt den Stopp der Produktposts (F9) gut. Feature-Posts bedienen nur den Sog. Für diese Zielgruppe sind aber Angst und Gewohnheit die eigentlichen Bremsen. „Verbinden statt ersetzen“ nimmt die Gewohnheit ernst („dein ERP bleibt“). „Automatisierung ohne Angst“ (F12) zielt auf die Angst. Beides sollte deshalb mehr Platz bekommen als Funktionen. + +**Einschätzung: Mögliche Kaufanlässe (Category Entry Points) für SHK-Betriebe**, zu prüfen in Haris’ Gesprächen: +- Die Anfragen (zum Beispiel Wärmepumpe) stapeln sich, und keiner fasst nach. +- Ein Kunde beschwert sich, weil niemand zurückgerufen hat. +- Die Bürokraft geht in Rente oder kündigt, ihr Wissen geht mit. +- Ein neuer Monteur fängt an und muss sich zurechtfinden. +- Die nächste Generation steigt ein und will „das mal ordentlich machen“. Bitkom: 47 % der Handwerksbetriebe nennen die Nachfolge als aktuelles Problem [Q20]. +- Der ERP-Hersteller kündigt ein Update oder neue Kosten an. +- Die Heizungssaison beginnt, und das Büro läuft voll. +- Messe, Innungsabend oder ein Gespräch mit Kollegen. + +Jeder dieser Anlässe ist ein Thema für Beiträge, Hooks und Gesprächseinstiege. + +### 1.4 Messaging-Haus und Kernbotschaften + +**Belegt:** +- Ein Messaging-Haus fasst die Botschaft auf einer Seite zusammen [Q27]: + - **Dach:** ein Satz, der den Wert zusammenfasst. + - **Säulen:** drei bis vier tragende Aussagen, die sich nicht überschneiden. + - **Fundament:** Belege für jede Säule (Fakten, Beispiele, Zitate). +- Viele Vorlagen ergänzen Einwände und Antworten sowie Varianten je Zielgruppe. +- Wynter beschreibt vier Ebenen, die ein Käufer **in dieser Reihenfolge** durchläuft [Q26]: + 1. **Klarheit:** Was ist das? + 2. **Relevanz:** Ist das für mich? + 3. **Wert:** Will ich das? + 4. **Abgrenzung:** Warum ihr und nicht die anderen? +- Laut Wynter hilft Abgrenzung nicht, solange das Angebot unklar oder irrelevant wirkt. + +**Einschätzung: Entwurf eines Messaging-Hauses für HiveGrid** (aus bestehenden Sätzen, Kontext 9.3) + +- **Dach:** „Neue Software? Brauchst du nicht. HiveGrid verbindet, was du schon hast.“ +- **Säule 1, Nichts wechseln:** Dein Branchenprogramm bleibt. Daten, Abläufe und Leute bleiben. + - Beleg: KWP- und PDS-Anbindung, Demo-Workspace. +- **Säule 2, Nichts geht verloren:** Anfragen, Termine und Aufgaben laufen in einer Oberfläche zusammen. + - Beleg: echte Abläufe aus Postfach, Leads, Terminbuchung, Plantafel. +- **Säule 3, Automationen ohne Angst:** Probelauf, 24 Stunden Rückgängig, ein Mensch gibt frei. + - Beleg: 30 Beispiel-Automationen (Golden Flows). +- **Säule 4, Aus dem Handwerk, unter deiner Kontrolle:** „Dein Betrieb gibt die Form vor. Nicht die Software.“ + - Beleg: Noah, vierte Generation. Hosting in Deutschland, aber vorsichtig formuliert (Cloudflare, Kontext 0, Punkt 12). +- **Fundament:** Sprachregeln (Du, konkret, kein Vorwurf, keine erfundenen Zahlen) und Antworten auf die sieben Einwände aus Kontext 7.4. + +**Einschätzung zur Reihenfolge nach Wynter:** Viele Botschaften von HiveGrid starten mit Abgrenzung („brauchst du nicht“). Für einen Betrieb, der HiveGrid nicht kennt, fehlt dann oft Klarheit: Was ist das eigentlich? Ein Test wert: Hooks, die zuerst klar sagen, was HiveGrid ist, gegen Hooks, die mit dem Widerspruch starten. + +### 1.5 Content-Säulen + +**Belegt:** +- Content-Säulen (Pillars) sind 3 bis 5 wiederkehrende Themen. Sie verbinden, was die Zielgruppe braucht, mit dem, was das Unternehmen erreichen will [Q36b]. +- Für B2B-Teams gelten vier Säulen oft als praktische Obergrenze. Bei weniger als drei wiederholt sich der Plan, bei mehr als fünf kommt keine Säule oft genug vor. +- Sprout Social (Umfrage Q2 2025): 57 % der Befragten wünschen sich von Marken eigene, wiederkehrende Content-Serien [Q33]. Das ist eine Verbraucherumfrage, die Übertragung auf B2B ist unsicher. + +**Einschätzung:** Säulen sind nicht dasselbe wie die Säulen im Messaging-Haus. Das Haus sagt, **was** wir behaupten. Die Content-Säulen sagen, **worüber** wir regelmäßig reden. Vorschlag für HiveGrid: + +| Säule | Inhalt | Funnel | Wer trägt sie | +|---|---|---|---| +| **Alltag im SHK-Betrieb** | Szenen, Probleme, Kaufanlässe, auch mit Humor („Freitag, 17:40“) | oben | vor allem Noah | +| **So läuft’s mit HiveGrid** | Ein echter Ablauf in 30 bis 60 Sekunden, Automationen ohne Angst | Mitte | HiveGrid | +| **Bau-Tagebuch** | Wie HiveGrid entsteht: Tests, Team, Umstellung bei Geerkens | Mitte bis unten | HiveGrid, Collabs mit Noah | +| **Klartext** | Haltung und Orientierung: Digitalisierung ohne Wechsel, Datenschutz, KI dosiert, Einwände | Mitte bis unten | Noah auf LinkedIn, HiveGrid | + +Der Aufruf zum Erstgespräch ist keine eigene Säule. Er hängt im Wechsel an Beiträgen aller Säulen (wie in Davids Papier, Kontext 10.7). + +### 1.6 Funnel und Dark Social + +**Belegt:** +- **6sense, Buyer Experience Report 2025** (fast 4.000 Befragte, große B2B-Käufe) [Q4]: + - Der erste Kontakt zum Anbieter kommt nach 61 % des Kaufwegs (2024: 69 %). + - In 79 % der Fälle meldet sich der Käufer selbst. + - Der zuerst kontaktierte Anbieter gewinnt in rund 80 % der Fälle. + - 94 % hatten ihre Favoritenliste schon sortiert, bevor sie mit Verkäufern sprachen. +- **Gartner:** Der B2B-Kauf ist kein gerader Weg. Käufer springen zwischen sechs „Buying Jobs“ hin und her (Problem erkennen, Lösungen erkunden, Anforderungen festlegen, Anbieter auswählen, prüfen, Einigkeit herstellen). Nur rund 17 % ihrer Zeit verbringen sie mit Anbietern [Q34]. Die Zahl stammt aus Gartner-Forschung, hier über eine Zusammenfassung zitiert. +- **95-5-Regel** (John Dawes, Ehrenberg-Bass-Institut, für das LinkedIn B2B Institute): Nur rund 5 % der B2B-Käufer sind gerade im Markt. Die übrigen 95 % kaufen erst in Monaten oder Jahren. Sie muss man erreichen, damit man erinnert wird, wenn es so weit ist [Q8]. +- **Dark Social:** Den Begriff prägte Alexis Madrigal 2012 für Weitergaben, die keine Analyse sieht, etwa Links in Chats und Mails [Q7]. Chris Walker (Refine Labs) unterscheidet dabei: In Dark Social entsteht Nachfrage, gemessen wird sie oft erst später an anderer Stelle [Q6]. +- **Refine Labs** hat 12 Monate lang Software-Zuordnung mit Selbstauskunft verglichen (620 Anfragen, veröffentlicht 07.04.2023). Ergebnis: eine Messlücke von 90 %. Podcasts wurden laut Selbstauskunft 53 % des Umsatzes zugeschrieben, laut Software 0 % [Q6]. +- **Handwerk:** 62 % der Handwerksbetriebe nutzen Messenger wie WhatsApp für interne oder externe Kommunikation (Bitkom, n=504, Befragung Sommer 2025) [Q20]. + +**Einschätzung:** +- 6sense und Gartner beschreiben große Käufe mit vielen Beteiligten und rund 10 Monaten Dauer. Ein SHK-Betrieb mit 20 Leuten kauft schneller und mit weniger Leuten. Das Grundmuster gilt aber vermutlich auch hier: Der Inhaber hat ein Bild von uns, bevor er mit Haris spricht. +- Für einen Betrieb, den Haris anruft, ist das Instagram- oder LinkedIn-Profil von HiveGrid der erste **Prüfort**. Das ist die Rolle „Validierung“ im Kaufweg. Auch mit wenig Reichweite muss das Profil deshalb überzeugen. +- Dark Social im SHK-Handwerk ist wahrscheinlich: WhatsApp-Gruppen unter Kollegen, Innungsabende, Gespräche mit dem Großhandel und mit dem Außendienst der Hersteller. Das ist nicht belegt, aber messbar über Selbstauskunft (Abschnitt 3.2). +- Den Funnel (TOFU, MOFU, BOFU) würde ich als **Etikett** im Redaktionsplan nutzen, nicht als Weg, den jeder geht: + - **TOFU** (oben): erkennen, „das kenne ich“. Ziel: erinnert werden. + - **MOFU** (Mitte): verstehen, „so könnte das bei uns laufen“. Ziel: Vertrauen. + - **BOFU** (unten): prüfen und handeln, „passt das, was kostet das, wer nutzt das“. Ziel: Erstgespräch. +- Konsequenz aus Dark Social: Inhalte so bauen, dass man sie **weiterschicken** will. Etwa „Schick das deinem Büro“. Das passt zu Instagram, wo Sends für die Reichweite bei Nicht-Followern zählen (Abschnitt 3.1). + +### 1.7 Gründermarke und Firmenmarke + +**Belegt:** +- **LinkedIn:** Richard van der Blom hat für seinen Algorithm InSights Report 2025 rund 1,8 Millionen Beiträge ausgewertet. Laut Zusammenfassungen erreichen Beiträge von Firmenseiten im Schnitt nur rund 1,6 % ihrer Follower. Persönliche Profile liegen weit vorne [Q19]. Das Original ist kostenpflichtig, ich konnte die Zahlen nicht selbst prüfen. +- **Edelman und LinkedIn**, B2B Thought Leadership Impact Report 2025 (1.934 US-Entscheider, Befragung März und April 2025) [Q5]: + - „Versteckte Käufer“ (Finanzen, IT, Einkauf) lesen genauso viel Fachinhalte wie die eigentlichen Zielpersonen. + - 95 % von ihnen sagen, starke Fachinhalte machen sie offener für Ansprache durch den Vertrieb. + - Rund 40 % der B2B-Käufe scheitern, weil sich die Beteiligten nicht einigen. +- **Lenny Rachitsky** hat untersucht, wie heute große B2B-Firmen ihre ersten zehn Kunden fanden (07.07.2020): fast immer über das persönliche Netzwerk der Gründer, über Orte, an denen sich die Zielgruppe trifft, und über direkte, persönliche Ansprache [Q29]. +- **Instagram Collabs:** Ein Beitrag erscheint auf bis zu fünf Profilen gleichzeitig. Likes, Kommentare und Views werden zusammengezählt [Q36]. +- **Binet und Field** (IPA-Daten 1998 bis 2018, für das LinkedIn B2B Institute): Emotionale Botschaften wirken langfristig besser, rationale kurzfristig. Empfohlen wird eine Balance aus Markenaufbau und Aktivierung [Q9]. +- **Humor in B2B-Anzeigen** (Swani, Gulas, Dinsmore, Journal of Business Research, November 2025; vier Experimente, n=305) [Q10]: + - Humor verbessert die Einstellung zu Anzeige und Marke. + - Humor, der zum Produkt oder Problem passt, wirkt besser als Humor ohne Bezug. + - Unter Zeitdruck wirkt Humor schwächer. + - Wer schon eine Beziehung zum Anbieter hat, bevorzugt Anzeigen ohne Humor. + +**Einschätzung: Absender-Modell für HiveGrid** + +| | Noah (Instagram, LinkedIn) | HiveGrid (Instagram, Facebook, TikTok, LinkedIn) | +|---|---|---| +| Aufgabe | Aufmerksamkeit, Nähe, Meinung | Verständnis, Beleg, Beständigkeit | +| Funnel | vor allem oben | Mitte und unten, plus Prüfort | +| Ton | persönlich, auch lustig oder trashig | ruhig, konkret, freundlich, gern mit trockenem Humor | +| Beweis | „Ich bin einer von euch“ (Cialdini: Unity, Kontext 9.4) | echte Abläufe, Bau-Tagebuch, Geerkens-Umstellung | +| Brücke | Collabs, Bio-Link, wiederkehrende Sätze und Bilder | Collabs, Noah taucht auf, gleiche Sprache | + +- Die Studie zum Humor stützt das Modell: Humor mit Bezug zum Handwerksalltag passt oben im Funnel, bei Noah. Wer schon im Gespräch mit Haris ist, will eher Ruhe und Klarheit. Das wäre eine **Teilung der Tonlage nach Funnel-Stufe**, nicht nach Geschmack. +- Wichtig aus dem Kontext: Humor darf nie wie ein Vorwurf klingen (ZDH-Kampagne 2022) und keinen Stolz anbieten, sondern Anerkennung zeigen (Forsa für IKK, Kontext 7.2). Lachen mit dem Handwerk, nicht über das Handwerk. +- Risiko: Wenn Noahs trashige Reels gut laufen, aber nie zu HiveGrid führen, entsteht Reichweite ohne Wirkung. Deshalb braucht jede Noah-Serie eine Brücke: ein wiederkehrender Satz, ein Collab pro Woche oder ein klarer Verweis. +- LinkedIn: Die Firmenseite ist eher Visitenkarte und Prüfort. Reichweite kommt dort über Noah und über die persönlichen Profile von David, Dejan und Haris. + +### 1.8 Beleg und Testimonials vor dem ersten Kunden + +**Belegt:** +- Bessemer Venture Partners (06.05.2026) empfiehlt „Design Partner“: 5 bis 12 ausgewählte Zielkunden, die das Produkt früh mitgestalten. Mit fester Frist und dem klaren Ziel, zahlender Kunde zu werden. Wer umsteigt, wird Referenz und Fallbeispiel [Q28]. +- Laut Bessemer verwechseln Gründer oft positives Feedback mit echter Bestätigung. Bestätigung ist die Bereitschaft zu zahlen. +- Aus der eigenen Recherche (Kontext 9.4): „Konkretheit ersetzt Beweis“, „Belege über die Welt statt über sich selbst“, „genau ein freiwilliges, frühes Eingeständnis einer Schwäche“. + +**Einschätzung: Welche Belege HiveGrid heute ehrlich hat** + +| Art | Beispiel | Status | +|---|---|---| +| Herkunft | Noah, SHK-Meister, vierte Generation, Selfie-Video | da | +| Prozess | Bughunting, Tests, „so prüfen wir, bevor ein Betrieb es bekommt“ | da, kaum genutzt | +| Produkt | Echte Abläufe im Demo-Workspace, 30 Golden Flows | da, Screens fehlen auf der Website | +| Dritte | KWP- und PDS-Anbindung, Hosting in Deutschland, Partnerlogos (12 freigegeben) | da, Formulierung prüfen | +| Kunde | Umstellung bei Geerkens, erste Wochen im Alltag | ab Start in 1 bis 2 Wochen | +| Stimmen | Zitate von Mitarbeitenden bei Geerkens, später von weiteren Betrieben | noch nicht | + +- **Die Geerkens-Umstellung als Serie** ist wahrscheinlich der stärkste Beleg der nächsten Monate. Sie zeigt Noah gleichzeitig als Gründer und als Kunden. Regel: nur zeigen, was wirklich passiert, auch Stolperstellen. +- **Design-Partner-Idee:** Die ersten 3 bis 5 Betriebe aus Haris’ Gesprächen könnten als „Gründungsbetriebe“ starten. Gegenleistung: Preisvorteil gegen die Erlaubnis, über die Einführung zu berichten. Im Juni-Sprint war ein „Founding-Deal“ schon geplant (Kontext 8.2). +- **Testimonial-Plan von Anfang an:** Beim Start jedes Betriebs festhalten, ob und wann wir fragen dürfen. Das spart später Zeit. + +--- + +## 2. Experimentieren statt raten + +### 2.1 Bullseye-Framework + +**Belegt:** +- Gabriel Weinberg und Justin Mares beschreiben im Buch „Traction“ 19 Kanäle, über die Start-ups Kunden gewinnen [Q11]. Die Annahme: Meist trägt einer davon den Großteil, aber man weiß vorher nicht, welcher. +- Drei Ringe: + 1. **Außen, Ideen:** Für jeden der 19 Kanäle eine günstige Idee aufschreiben. + 2. **Mitte, Tests:** Die drei vielversprechendsten Kanäle parallel und günstig testen. + 3. **Innen, Fokus:** Den Kanal, der klar funktioniert, ausreizen. +- Weinberg hat das bei DuckDuckGo mehrmals wiederholt, immer wenn ein Kanal ausgereizt war. + +**Einschätzung:** Unsere vier Basiskanäle sind gesetzt (F13), nicht getestet. Bullseye hilft trotzdem: für die **weiteren** Kanäle und als Ideenliste. Ein erster Durchgang: + +| Kanal (Traction) | Idee für HiveGrid | +|---|---| +| Content Marketing | Säulen aus 1.5, Bau-Tagebuch | +| E-Mail-Marketing | Monatlicher Newsletter „Aus dem Bau“, Nachfass-Mails nach Erstgesprächen | +| Sales | Cold Calling von Haris, mit passenden Beiträgen als Nachfass-Material | +| Business Development | KWP, PDS, Hilti, HalloPetra als Partner, gemeinsame Inhalte | +| Messen | SHK-Messen, regionale Fachausstellungen des Großhandels | +| Offline-Events | Webinar (Konzept fertig), Innungsabende, Stammtische | +| Vorträge | Noah bei Innungen und Kammern: „Digitalisieren, ohne zu wechseln“ | +| Community | Kreis der ersten Betriebe, später Anwendertreffen | +| Bestehende Plattformen | Facebook-Gruppen für SHK, Foren von ERP-Nutzern | +| Fachblogs und Fachmedien | Gastbeiträge oder Interviews in SHK-Fachmedien | +| PR | Geschichte „SHK-Meister baut Software für seine Branche“ | +| Unkonventionelle PR | Eine Aktion auf einer Messe oder ein auffälliges Video | +| Engineering as Marketing | Kostenlose Hilfe, etwa ein „Anfrage-Check“ oder Golden Flows als Vorlage | +| Empfehlungen (Affiliate) | Empfehlungsbonus für Betriebe, die Kollegen bringen | +| Viral | Monteure laden Kollegen ein (Produktfrage) | +| SEO | Website zweitrangig, langfristig | +| SEA, Social Ads, Offline-Werbung | erst, wenn organisch etwas funktioniert (F16) | + +### 2.2 Passt der Kanal zum Produkt? + +**Belegt:** Brian Balfour (Reforge) beschreibt „Product Channel Fit“: Produkte werden für Kanäle gebaut, Kanäle passen sich nicht an Produkte an [Q12]. Ein Produkt mit Erstgespräch und Demo braucht andere Kanäle als ein Produkt mit Selbstbuchung. + +**Einschätzung:** HiveGrid verkauft über Gespräche, ab 179 € im Monat, ohne öffentliche Preise. Das passt zu Kanälen mit Vertrauen und persönlichem Kontakt: Noah, Haris, Partner, Events, Empfehlungen. Reine Reichweite auf TikTok passt nur, wenn sie zuverlässig in Gespräche führt. Das ist eine Testfrage, keine Gewissheit. + +### 2.3 ICE und RICE + +**Belegt:** +- **ICE** (Sean Ellis): Jede Idee bekommt 1 bis 10 Punkte für **Impact** (Wirkung), **Confidence** (Zuversicht) und **Ease** (Aufwand, je leichter desto mehr Punkte). Die Werte werden multipliziert. Schnell und grob, gut für kleine Teams [Q13]. +- **RICE** (Intercom): **Reach** mal Impact mal Confidence, geteilt durch **Effort**. Braucht Daten zur Reichweite, ist dafür besser begründbar [Q13]. + +**Einschätzung:** Für HiveGrid reicht ICE. Es fehlen die Daten für eine sinnvolle Reichweitenschätzung. Zwei Regeln helfen: +- Jede Person bewertet zuerst allein, dann wird verglichen. Sonst gewinnt die lauteste Stimme. +- „Impact“ immer am Nordstern messen (Erstgespräche), nicht an Likes. + +Beispiel, nur zur Veranschaulichung, keine echten Werte: + +| Idee | Impact | Confidence | Ease | ICE | +|---|---|---|---|---| +| Serie „Umstellung bei Geerkens“ als Collab | 8 | 7 | 6 | 336 | +| Beitrag nach Cold Call an Interessenten schicken | 6 | 6 | 9 | 324 | +| TikTok mit eigenen Formaten | 4 | 3 | 4 | 48 | + +### 2.4 Testzyklen, Abbruchkriterien, Mindestmenge + +**Belegt:** +- Sprout Social empfiehlt für Experimente auf Social Media: Hypothese, eine veränderte Variable, eine Kontrollgruppe, feste Dauer, wenige Tests gleichzeitig. Ein eigener TikTok-Test lief vier Monate, bis genug Daten da waren [Q15]. +- Annie Duke („Quit“, 2022): Gute **Abbruchkriterien** bestehen aus **Zustand und Datum**. Also: „Wenn wir bis Datum X nicht Zustand Y erreicht haben, hören wir auf.“ Man legt sie vorher fest, weil man später zu sehr hofft [Q14]. +- Instagram bietet seit 10.12.2024 **Testreels** (Trial Reels): Ein Reel geht zuerst nur an Nicht-Follower. Nach rund 24 Stunden gibt es Zahlen, bei guter Leistung in den ersten 72 Stunden kann es automatisch an die Follower gehen [Q16]. Die Voraussetzungen (Profi-Konto, öffentlich, Mindestzahl an Followern) werden in Quellen unterschiedlich angegeben und müssen in der App geprüft werden. + +**Einschätzung zur Mindestmenge:** +- Ich habe keine belastbare Studie gefunden, wie viele Beiträge ein Formattest braucht. Bei einem Konto mit rund 64 Followern sind einzelne Beiträge stark vom Zufall abhängig. +- Faustregel aus der Praxis: **6 bis 8 Beiträge pro Format über 3 bis 4 Wochen**. Verglichen werden Verhältniszahlen (Sends pro Reichweite, Watchtime), nicht absolute Zahlen. +- Nur große Unterschiede ernst nehmen, etwa doppelt so viele Sends pro Reichweite. Kleine Unterschiede sind bei dieser Menge Rauschen. +- Pro Woche einen festen Testplatz reservieren, zum Beispiel einen von drei Instagram-Slots. So läuft Testen neben dem normalen Plan, nicht statt ihm. + +**Vorlage für eine Testkarte:** + +| Feld | Beispiel | +|---|---| +| Hypothese | „Kurze Abläufe mit Noahs Stimme werden öfter geteilt als stumme Bildschirmvideos.“ | +| Format und Kanal | Reel, Instagram HiveGrid, als Collab | +| Variable | Stimme von Noah ja oder nein, sonst gleich | +| Umfang | 6 Beiträge in 4 Wochen | +| Messgröße | Sends pro Reichweite, durchschnittliche Watchtime | +| Weiter, wenn | klar besser als der Durchschnitt der letzten 4 Wochen | +| Abbruch (Zustand und Datum) | „Wenn bis 15.11. kein Beitrag über dem Durchschnitt liegt, stoppen wir das Format.“ | +| Ergebnis und Entscheidung | behalten, ändern, stoppen | + +### 2.5 Wie lange man einem Kanal Zeit gibt + +**Belegt:** +- Praktiker empfehlen, einem ersten Kanal **rund 90 Tage** zu geben, in dieser Zeit 2 bis 3 Kanäle zu testen und dann auf den stärksten zu setzen (MarketerHire, 17.06.2026) [Q37]. +- Buffer findet, dass Konten mit mehr Beiträgen pro Woche auch mehr Reichweite pro Beitrag bekommen [Q18]. Ein Kanal mit einem Beitrag pro Woche liefert also kaum ein faires Ergebnis. + +**Einschätzung für HiveGrid:** +- Neue Kanäle (TikTok, Facebook, LinkedIn-Firmenseite): 12 Wochen mit fester Mindestfrequenz. Zwischenblick nach 6 Wochen, Entscheidung nach 12 Wochen. +- Entscheidung nicht nach Followern, sondern nach Frühindikatoren und Selbstauskunft. +- „Abbrechen“ heißt nicht löschen. Es kann heißen: nur noch Crossposting ohne Extraaufwand. + +--- + +## 3. Messung + +### 3.1 KPI-Hierarchie + +**Belegt:** +- Amplitude beschreibt den **Nordstern** als eine Zahl, die den Wert für Kunden abbildet, die das Team beeinflussen kann und die Umsatz vorhersagt. Darunter liegen 3 bis 5 Treiber (Input-Metriken). „Vanity Metrics“ fühlen sich gut an, sagen aber wenig über den Erfolg [Q22]. +- **Instagram:** Adam Mosseri nannte im Januar 2025 Watchtime, Likes und Sends als wichtigste Signale. Man solle durchschnittliche Watchtime, Likes pro Reichweite und Sends pro Reichweite beobachten. Likes zählen etwas mehr bei Followern, Sends etwas mehr bei Nicht-Followern [Q17]. +- CMI 2026: Die erfolgreicheren Teams messen Fachinhalte häufiger an Geschäftswirkung (75 % gegenüber 63 % insgesamt) [Q3]. + +**Einschätzung: KPI-Baum für HiveGrid (3 bis 6 Monate)** + +| Ebene | Kennzahl | Warum | +|---|---|---| +| **Ergebnis** | Zahlende Kunden | Das eigentliche Ziel (F3) | +| **Nordstern** | Qualifizierte Erstgespräche pro Monat (SHK, 10 bis 50 Leute) | Marketing kann es beeinflussen, es führt zu Umsatz | +| **Treiber** | Anteil der Gespräche mit „kannte euch schon“ (auch bei Cold Calls) | Zeigt, ob Marketing den Vertrieb leichter macht | +| | Eingehende Anfragen und Cal-Buchungen | Direkte Nachfrage | +| | Newsletter-Anmeldungen von Betrieben | Eigene Reichweite, unabhängig vom Algorithmus | +| **Frühindikatoren** | Instagram: Sends pro Reichweite, Saves, Profilaufrufe, Follows von SHK-Konten, DMs | Signale für Interesse und Weitergabe | +| | LinkedIn: Kommentare und Kontaktanfragen von SHK-Leuten | Qualität vor Menge | +| | TikTok: Watchtime, Anteil voll gesehener Videos | Ob der Hook trägt | +| **Vanity** | Follower gesamt, Likes allein, Impressionen allein | Nur als Hintergrund | + +Zielwerte erfinde ich hier bewusst nicht. Wir sollten im Brainstorming nur die Richtung festlegen und nach den ersten 4 Wochen eine Basislinie setzen. + +### 3.2 Selbstauskunft: „Wie bist du auf uns gekommen?“ + +**Belegt:** +- Refine Labs: 90 % Messlücke zwischen Software-Zuordnung und Selbstauskunft [Q6]. +- Stuart Brameld (Growth Method, aktualisiert 18.09.2026) empfiehlt [Q23]: + - Ein **offenes Textfeld** statt einer Auswahlliste. Eine Liste prüft nur, ob jemand unsere Kanal-Namen kennt. + - Gut sichtbar, aber eher freiwillig. Pflichtfelder können Buchungen kosten. Andere Quellen sehen das anders: Freiwillige Felder werden oft nur von einem Teil ausgefüllt. + - Auf den wichtigsten Formularen (Erstgespräch), auf der Danke-Seite und als offene Frage im ersten Gespräch. + - Trends über Monate ansehen, nicht einzelne Antworten. + +**Einschätzung für HiveGrid:** +- In der Cal-Buchung bei Haris ein offenes Feld: „Wie bist du auf HiveGrid aufmerksam geworden?“ +- Haris fragt im Erstgespräch nach, offen: „Wo hast du zum ersten Mal von uns gehört?“ Nicht: „Kam das über Instagram?“ +- Bei Cold Calls ein Feld im Vertriebs-CRM: „kannte uns schon“ (ja, nein, woher). Das ist ein guter Messpunkt für Marketing, obwohl der Kontakt vom Vertrieb kommt. +- Die Antworten monatlich in wenige Gruppen sortieren: Noah, HiveGrid-Kanäle, Empfehlung, Messe oder Event, Partner, Suche, KI-Assistent, sonstiges. + +### 3.3 Wöchentliche und monatliche Auswertung + +**Belegt:** +- ZoomInfo empfiehlt, Themen 6 bis 12 Monate grob und 1 bis 3 Monate konkret zu planen, 20 bis 30 % der Kapazität für spontane Inhalte freizuhalten und monatlich oder vierteljährlich auszuwerten [Q35]. +- Metricool hat seit September 2026 eine MCP-Anbindung an Claude. Damit kann Claude eigene Kennzahlen und die von angelegten Wettbewerbern direkt abfragen (Instagram, TikTok, Facebook, LinkedIn und weitere) [Q32]. Welcher Metricool-Tarif nötig ist, steht dort nicht. + +**Einschätzung: Rhythmus** + +**Woche (30 Minuten, passend vor den Wochenreport am Donnerstag):** +1. Was ist erschienen? Was nicht, und warum? +2. Top und Flop der Woche, gemessen pro Reichweite. +3. Neue Selbstauskünfte und Anfragen. +4. Was ändern wir nächste Woche? Höchstens eine Sache. + +**Monat (60 bis 90 Minuten):** +1. Nordstern und Treiber gegen Vormonat. +2. Tests: behalten, ändern oder stoppen, nach den vorher festgelegten Kriterien. +3. Selbstauskunft auswerten: Woher kommen die Gespräche? +4. Plan für den nächsten Monat anpassen. Ergebnis kurz an Noah und David. + +**Quartal:** Positionierung und Säulen prüfen. Stimmen sie noch mit dem, was Haris in Gesprächen hört? + +--- + +## 4. Redaktionsplan + +### 4.1 Felder + +**Belegt:** Gängige Vorlagen enthalten Datum, Kanal, Format, Titel, Säule, Funnel-Stufe, Persona, Verantwortliche, Status, CTA, Kennzahl und Verbreitungsplan. Für Freigaben kommen Prüfer, Freigabestatus und endgültiger Termin hinzu [Q35][Q35b]. + +**Einschätzung: Felder für HiveGrid** + +| Feld | Inhalt | Beispiel | +|---|---|---| +| Datum und Uhrzeit | Veröffentlichung | Mi 15.10., 12:00 | +| Kanal | Wo es erscheint | Instagram HiveGrid, Collab mit Noah | +| Format | Reel, Karussell, Bild, Text, Video, Mail | Reel, 30 Sekunden | +| Säule | aus 1.5 | So läuft’s mit HiveGrid | +| Funnel-Stufe | oben, Mitte, unten | Mitte | +| Persona | Inhaber, nächste Generation, Büro, IT | Inhaber | +| Kaufanlass | aus 1.3 | Anfragen stapeln sich | +| Hook | die ersten 2 Sekunden oder die erste Zeile | „Wärmepumpen-Anfrage am Freitag, 17:40. Und jetzt?“ | +| Kernaussage | ein Satz | „Keine Anfrage geht mehr unter, dein ERP bleibt.“ | +| CTA | was der Leser tun soll, oder bewusst keiner | Speichern, oder Kommentar für das PDF | +| Asset | Link zur Datei | posts/post9 | +| Test | gehört der Beitrag zu einem Test? | Test 2, Variante B | +| Owner | wer macht ihn | Dejan | +| Status | Idee, geplant, in Arbeit, zur Freigabe, freigegeben, eingeplant, live | zur Freigabe | +| Freigabe | wer, wann | David am 10.10., Noah am 11.10. | +| Recycling-Ziel | wohin er danach noch geht | TikTok, LinkedIn, Newsletter, Haris als Nachfass-Material | +| Ergebnis | Kennzahlen nach 7 Tagen | Sends pro Reichweite, Profilaufrufe | + +### 4.2 Batching und Wochenpakete + +**Belegt:** +- Der größte Zeitgewinn entsteht, wenn man nach Tätigkeit bündelt: alle Texte am Stück, alle Schnitte am Stück, alle Grafiken am Stück [Q38b]. +- Ein verbreitetes Muster ist „1, 3, 10“: ein Hauptvideo, drei Kernstücke, viele Varianten für die Kanäle. Dazu eine kleine Tabelle mit Zeitmarke, Moment, Hook und Zielkanal [Q38b]. +- Davids Papier sieht schon vor: ein Wochenpaket wird eine Woche vorher gemeinsam freigegeben (Kontext 10.7). + +**Einschätzung: Ein möglicher Wochenrhythmus** (auf Dejans Kapazität anpassen): + +| Tag | Was | Dauer, grob | +|---|---|---| +| Montag | Plan der übernächsten Woche fertig, Hooks schreiben | 1 bis 2 Stunden | +| Dienstag | Produktion am Stück: Bildschirmaufnahmen, Posts im Generator, Texte | halber Tag | +| Mittwoch | Schnitt am Stück, Untertitel, Varianten für TikTok und LinkedIn | halber Tag | +| Donnerstag | Paket an David, dann an Noah. Kurze Wochenauswertung | 1 Stunde | +| Freitag | Freigabe eingegangen, alles in Metricool eingeplant | 30 Minuten | + +**Einschätzung zur Freigabe:** Noah gibt alle externen Texte frei (Kontext 1.3). Bei 5 bis 10 Beiträgen pro Woche wird das schnell zum Engpass. Vorschläge, die mit Noah zu klären sind: +- **Formatfreigabe:** Ein Format wird einmal grundsätzlich freigegeben. Einzelne Beiträge darin prüft nur noch David. +- **Paketfreigabe** mit festem Fenster, zum Beispiel bis Freitag 12 Uhr. +- **Stille Zustimmung** für wiederkehrende Formate, wenn bis zur Frist kein Einwand kommt. +- Rote Linien schriftlich festhalten (was nie ohne Noah rausgeht: Preise, Kundennamen, Aussagen zu Partnern). + +### 4.3 Realistische Frequenz für 1 bis 2 Personen + +**Belegt (Buffer, Stand 13.01.2026) [Q18]:** +- **Instagram:** 3 bis 5 Beiträge pro Woche bringen rund 12 % mehr Reichweite pro Beitrag als 1 bis 2. Der Zugewinn wird mit jeder weiteren Stufe kleiner. +- **LinkedIn:** Der Sprung von 1 auf 2 bis 5 Beiträge pro Woche ist der Wendepunkt. +- **TikTok:** 2 bis 5 pro Woche bringen bis zu 17 % mehr Views pro Beitrag als einer. +- **Facebook:** Buffer verweist auf eine ältere HubSpot-Studie mit 1 bis 2 Beiträgen pro Tag. Das halte ich für B2B und unsere Kapazität nicht für maßgeblich. + +**Belegt (wo SHK-Betriebe selbst aktiv sind):** Von den Handwerksbetrieben, die soziale Netzwerke für ihre Werbung nutzen, sind 57 % auf Facebook, 38 % auf Instagram, 35 % auf LinkedIn, 33 % auf Xing, 7 % auf TikTok und 6 % auf YouTube (Bitkom, n=504, veröffentlicht 23.10.2025) [Q20][Q21]. Achtung: Das zeigt, wo Betriebe **für ihre Kunden** posten, nicht, wo sie sich über Software informieren. + +**Einschätzung: zwei Stufen** + +| Kanal | Minimum (Bughunting-Phase, nächste 1 bis 2 Wochen) | Ziel (ab Release) | +|---|---|---| +| Noah, Instagram | läuft unabhängig | läuft unabhängig, davon 1 bis 2 Collabs pro Woche | +| HiveGrid, Instagram | 2 Beiträge pro Woche, davon 1 Collab | 3 bis 4 pro Woche, davon 1 Testplatz | +| HiveGrid, Facebook | Crossposting von Instagram | Crossposting, dazu Test mit SHK-Gruppen | +| HiveGrid, TikTok | Konto anlegen, Reels wiederverwerten | 2 bis 3 Reels pro Woche, meist wiederverwertet | +| HiveGrid, LinkedIn-Seite | 1 Beitrag pro Woche | 2 pro Woche, dazu Beiträge von Noah, David, Dejan und Haris | +| Newsletter | Anmeldung technisch möglich machen | monatlich | + +- Facebook-Zahlen von Bitkom sprechen dafür, Facebook nicht nur als Pflicht mitzunehmen. Ältere Inhaber sind dort vermutlich eher zu finden. +- TikTok ist bei Betrieben als Absender selten (7 %). Als günstiger Zweitverwerter für Reels lohnt der Test trotzdem, solange der Zusatzaufwand klein bleibt. + +### 4.4 Vorlagen und Beispiele + +**Einschätzung:** Eine fertige Vorlage von außen passt selten. Besser: eine Tabelle (oder ein Board in Plane oder Metricool) mit den Feldern aus 4.1. Dazu drei Ansichten: +1. **Kalender:** Datum und Kanal. +2. **Board:** nach Status, für die Freigabe. +3. **Testansicht:** gefiltert nach Testnummer, für die Monatsauswertung. + +Der bestehende Redaktionsplan in `posts/redaktionsplan/` (Mo, Mi, Fr, 12 Uhr, Routine mit Likes, Kommentaren, Folgen) lässt sich um die neuen Felder erweitern (Kontext 10.1). + +--- + +## 5. Brainstorming-Methode + +### 5.1 Ablauf und Reihenfolge + +**Belegt:** +- Rumelt: erst Diagnose, dann Leitlinie, dann Maßnahmen [Q30]. +- Dunford: Positionierung im kleinen, gemischten Team, Ballast zuerst ablegen [Q2]. +- Gary Klein (HBR, September 2007): Beim **Premortem** stellt man sich vor, der Plan ist gescheitert, und sammelt Gründe dafür. Laut Klein findet man so deutlich mehr Risiken als mit der normalen Frage „Was könnte schiefgehen?“ [Q31]. + +**Einschätzung: Ablauf in Runden** (im Dialog zwischen Dejan und Claude, jede Runde endet mit einer festgehaltenen Entscheidung): + +| Runde | Thema | Ergebnis | +|---|---|---| +| A | Ziel, Diagnose, Nordstern | ein Satz Diagnose, ein Nordstern | +| B | Zielgruppe: ICP, Personas, vier Kräfte, Kaufanlässe | eine Seite Zielgruppe | +| C | Positionierung und Messaging-Haus | Entwurf Haus, offene Punkte | +| D | Absender und Tonalität: Noah und HiveGrid | Absender-Modell, Tonregeln | +| E | Kanäle: Rolle je Kanal, Bullseye für weitere | Kanal-Tabelle | +| F | Säulen und Formate: erst sammeln, dann mit ICE bewerten | Formatliste mit Punkten | +| G | Testplan und Abbruchkriterien | 3 bis 5 Testkarten | +| H | Prozess: Wochenrhythmus, Freigabe, Rollen | Rhythmus, Freigaberegeln | +| I | Messung: KPI-Baum, Selbstauskunft, Auswertung | KPI-Tabelle | +| J | Premortem: „Es ist April 2027, das Marketing hat nichts gebracht. Warum?“ | Risikoliste, Gegenmaßnahmen | +| K | Strategie-Dokument und Redaktionsplan zusammenbauen | Dokument für Noah | + +Bei Ideenrunden (vor allem F): **erst sammeln, dann bewerten**. Beim Sammeln nichts verwerfen. Beim Bewerten jede Idee gegen Ziel, Zielgruppe und Kapazität halten. + +### 5.2 Was vorher geklärt sein muss + +**Einschätzung:** Für HiveGrid ist das meiste schon in der Kontext-Datei beantwortet (Abschnitt 13). Offen oder zu bestätigen: +1. Wer hat das letzte Wort bei Strategie und Ton: Noah allein oder Noah und David? +2. Wie viele Stunden pro Woche haben Dejan, David und Haris nach dem Bughunting wirklich für Marketing? +3. Wie viel Zeit hat Noah für Collabs, Freigaben und LinkedIn? +4. Darf die Geerkens-Umstellung öffentlich gezeigt werden, und in welchem Umfang? +5. Was dürfen wir über Preise und Startzustand sagen? + +### 5.3 Typische Fehler + +**Belegt:** +- CMI 2026: Die meisten Teams kämpfen mit Inhalten, die nicht zu Abschlüssen führen, mit knappen Ressourcen und mit Messung [Q3]. +- Häufige Strategiefehler laut Praxisquellen: keine Kundenforschung, nicht messbare Ziele, Kanäle nach der Konkurrenz wählen, die Strategie als einmaliges Dokument behandeln, Aktivität mit Ergebnis verwechseln [Q39b]. +- Dunford: Phantom-Wettbewerber und der Drang zur neuen Kategorie [Q1]. +- Bessemer: Positives Feedback mit Bestätigung verwechseln [Q28]. + +**Einschätzung, speziell für HiveGrid:** +1. **Mit Formaten anfangen,** bevor Ziel und Zielgruppe stehen. +2. **Zu viele Kanäle für zu wenig Zeit.** Vier Basiskanäle plus Noah plus Newsletter sind mit 1 bis 2 Personen viel. Lieber zwei richtig. +3. **Ton nach Geschmack entscheiden** statt nach Funnel-Stufe und Test. +4. **Feature-Verkauf** statt Antwort auf Angst und Gewohnheit (siehe 1.3). +5. **Follower als Erfolg zählen.** +6. **Zu früh abbrechen** oder **nie abbrechen.** Beides verhindern Abbruchkriterien. +7. **Viele Variablen gleichzeitig ändern.** Dann weiß niemand, was gewirkt hat. +8. **Freigabe als Flaschenhals.** Der Plan scheitert dann nicht an Ideen, sondern an Wartezeit. +9. **Reichweite ohne Brücke.** Noahs Reels laufen, aber niemand findet zu HiveGrid. +10. **Beleg erfinden oder überdehnen.** Ein falscher Satz kostet bei dieser Zielgruppe mehr als zehn gute Posts. Die offenen Widersprüche (DATEV, Hosting, Rechnungen) bleiben ein Risiko für jede Kampagne (Kontext 9.7). + +### 5.4 Checkliste mit Fragen für den Dialog + +**Runde A: Ziel und Diagnose** +- [ ] Was ist das wichtigste Ergebnis in 3 Monaten, was in 6 Monaten? +- [ ] Wie viele Erstgespräche braucht Haris pro Monat, um das Ziel zu erreichen? +- [ ] Was ist das Hauptproblem in einem Satz? Zum Beispiel: „Niemand kennt uns, und wer uns findet, sieht keinen Beleg.“ +- [ ] Ist der Nordstern „qualifizierte Erstgespräche pro Monat“? Wenn nein, welcher? +- [ ] Was machen wir bewusst nicht? + +**Runde B: Zielgruppe** +- [ ] Wer ist der beste Kunde? Größe, ERP, Anfragearten, Situation. +- [ ] Wen sprechen wir an, und für wen bauen wir die Belege? Ist das dieselbe Gruppe? +- [ ] Wer entscheidet: Inhaber, nächste Generation, IT? Wer redet mit? +- [ ] Was ist der Job, den der Betrieb erledigt haben will, in einem Satz? +- [ ] Was sind Druck, Sog, Angst und Gewohnheit bei diesen Betrieben? Was hört Haris? +- [ ] Welche Kaufanlässe gibt es? Welche drei sind am häufigsten? +- [ ] Wo informieren sich SHK-Inhaber über Software? Was wissen wir, was vermuten wir? + +**Runde C: Positionierung und Botschaft** +- [ ] Was würde ein Betrieb tun, wenn es HiveGrid nicht gäbe? +- [ ] Was können nur wir? Was davon ist heute live und zeigbar? +- [ ] Welche Kategorie nennen wir: CRM, Arbeitsoberfläche, Ergänzung zum ERP? +- [ ] Stimmt das Dach „Neue Software? Brauchst du nicht“? Ist es klar genug für jemanden, der uns nicht kennt? +- [ ] Welche 3 bis 4 Säulen trägt das Haus? Welcher Beleg steht unter jeder? +- [ ] Wie antworten wir auf die sieben Einwände aus Kontext 7.4? + +**Runde D: Absender und Ton** +- [ ] Was ist Noahs Rolle: Gründer, Handwerksmeister, Kunde, alles drei? +- [ ] Wie oft kommt HiveGrid in Noahs Inhalten vor? Wie sieht die Brücke aus? +- [ ] Wie klingt HiveGrid: ruhig, konkret, mit trockenem Humor? Was nie? +- [ ] Gilt „Humor oben, Ruhe unten“ als Regel? +- [ ] Welche Sätze und Bilder wiederholen sich als Wiedererkennung? + +**Runde E: Kanäle** +- [ ] Welche Rolle hat jeder Kanal: Reichweite, Vertrauen, Prüfort, Gespräch? +- [ ] Welcher Kanal ist Hauptkanal für HiveGrid, welcher nur Zweitverwertung? +- [ ] Welche weiteren Kanäle aus der Bullseye-Liste testen wir zuerst? Höchstens drei. +- [ ] Welche Rolle spielen Partner (KWP, PDS, Hilti), Innungen, Messen, Großhandel? +- [ ] Was macht der Newsletter, und wie kommen die ersten Leser rein? + +**Runde F: Säulen und Formate** +- [ ] Welche 3 bis 5 Content-Säulen nehmen wir? +- [ ] Welche Formate sammeln wir pro Säule? Welche Vorbilder (Dejans Beispielkanäle) bauen wir nach? +- [ ] Welche ICE-Punkte bekommt jede Formatidee? +- [ ] Was passiert mit den zwei fertigen Produktposts? +- [ ] Wie zeigen wir „Automatisierung ohne Angst“ konkret? +- [ ] Wie zeigen wir den Bau und die Geerkens-Umstellung, ohne zu viel zu versprechen? + +**Runde G: Tests** +- [ ] Welche 3 bis 5 Tests starten zuerst? +- [ ] Was ist für jeden Test Hypothese, Variable, Umfang, Messgröße? +- [ ] Was ist das Abbruchkriterium, als Zustand und Datum? +- [ ] Nutzen wir Testreels auf Instagram, wenn das Konto sie freischaltet? +- [ ] Wie lange bekommen TikTok, Facebook und die LinkedIn-Seite? Was heißt dort Erfolg? + +**Runde H: Prozess** +- [ ] Wer macht was: Dejan, David, Haris, Noah? Mit wie vielen Stunden? +- [ ] Wie sieht der Wochenrhythmus aus? Wann ist Produktionstag? +- [ ] Wie läuft die Freigabe? Formatfreigabe, Paketfreigabe, Frist, rote Linien? +- [ ] Wer veröffentlicht, wer antwortet auf Kommentare und DMs? +- [ ] Wer richtet ManyChat ein, wenn wir es nutzen? +- [ ] Welche Ressourcen braucht Dejan zuerst (Komponenten aus Subframe, Screens, Aufnahmen)? + +**Runde I: Messung** +- [ ] Welche Frühindikatoren pro Kanal? +- [ ] Wo fragen wir „Wie bist du auf uns gekommen?“ Cal, Erstgespräch, Cold Call? +- [ ] Wann ist die Wochen-, wann die Monatsauswertung? Wer bekommt das Ergebnis? +- [ ] Verbinden wir Metricool mit Claude, und welche Konten zuerst? + +**Runde J: Premortem** +- [ ] Es ist April 2027, das Marketing hat keinen einzigen Kunden gebracht. Was waren die drei wahrscheinlichsten Gründe? +- [ ] Was tun wir heute dagegen? +- [ ] Woran erkennen wir früh, dass es in diese Richtung läuft? + +--- + +## 6. Gliederung des Strategie-Dokuments für Noah + +**Einschätzung:** Noah liest wahrscheinlich nicht 30 Seiten am Stück. Deshalb: eine Seite vorne, die alles Wichtige enthält, und der Rest als Nachschlagewerk. Jede Entscheidung, die Noah treffen soll, wird klar markiert. + +**0. Auf einer Seite** +- Ziel und Nordstern +- Die drei wichtigsten Entscheidungen +- Was wir von Noah brauchen (Zeit, Freigaben, Entscheidungen) +- Die nächsten 30 Tage + +**1. Ausgangslage** +- Wo wir stehen: Produkt, Kunden, Kanäle, Team +- Diagnose in einem Satz + +**2. Ziele** +- 3 und 6 Monate +- Nordstern und KPI-Baum + +**3. Zielgruppe** +- Bester Kunde (ICP), Personas +- Job, vier Kräfte, Kaufanlässe + +**4. Positionierung und Botschaft** +- Positionierung in fünf Bausteinen +- Messaging-Haus +- Antworten auf Einwände + +**5. Absender und Ton** +- Rolle von Noah, Rolle von HiveGrid, die Brücke +- Tonregeln mit Beispielen: so ja, so nein + +**6. Content-Säulen und Formate** +- Säulen mit Beispielthemen +- Formatliste mit Priorität (ICE) + +**7. Kanäle** +- Rolle und Frequenz je Kanal +- Kanäle, die wir testen, und Kanäle, die wir bewusst lassen + +**8. Weg zum Gespräch** +- Vom Beitrag zum Erstgespräch: CTA, DM, ManyChat, Cal, Demo-Workspace +- Wie Marketing und Haris zusammenarbeiten + +**9. Beleg-Plan** +- Geerkens-Serie, Bau-Tagebuch, erste Gründungsbetriebe, Testimonials + +**10. Testplan** +- Testkarten mit Abbruchkriterien und Terminen + +**11. Prozess** +- Wochenrhythmus, Rollen, Freigabe, Werkzeuge (Metricool, Post-Generator, Subframe) + +**12. Messung und Auswertung** +- Kennzahlen, Selbstauskunft, Rhythmus der Auswertung + +**13. Risiken und offene Entscheidungen** +- Ergebnis des Premortems +- Was Noah entscheiden muss + +**Anhang** +- Redaktionsplan der ersten 4 bis 8 Wochen (Datum, Kanal, Post) +- Recherche und Quellen + +--- + +## Was das für HiveGrid heißt + +Alles in diesem Abschnitt ist **Einschätzung**, abgeleitet aus den Quellen und dem Kontext. + +1. **Die Diagnose zuerst festlegen.** Mein Vorschlag als Startpunkt: „Die Zielgruppe ist überlastet, kennt uns nicht und fürchtet Kontrollverlust. Wir haben noch keinen Kunden im Alltag, aber eine glaubwürdige Herkunft und ein echtes Produkt.“ Daraus folgt die Leitlinie: Vertrauen vor Reichweite, Beleg vor Behauptung, Noah vorn. + +2. **Den Nordstern auf Gespräche legen, nicht auf Follower.** Qualifizierte Erstgespräche pro Monat, dazu „kannte uns schon“ bei Cold Calls. So misst Marketing, ob es Haris den Weg ebnet. + +3. **Inhalte auf Angst und Gewohnheit ausrichten.** Mehr „dein ERP bleibt“, „du kannst es rückgängig machen“, „du gibst die Form vor“. Weniger Funktionslisten. Das ist auch die beste Erklärung, warum die Produktposts nicht trugen. + +4. **Tonalität nach Funnel-Stufe teilen, nicht entweder oder.** Noah oben, gern mit Humor, der zum Handwerksalltag passt. HiveGrid in der Mitte und unten, ruhig und konkret. Das stützen die Humor-Studie [Q10] und Binet und Field [Q9]. Die offene Kernfrage (F8) wird so zur Testfrage: Wie viel Humor verträgt HiveGrid selbst? Das testen wir mit einem festen Testplatz pro Woche. + +5. **Das HiveGrid-Profil als Prüfort bauen.** Wer von Haris angerufen wird oder Noah sieht, schaut dort nach. Es braucht deshalb vorne: was HiveGrid ist (Klarheit vor Abgrenzung), ein echtes Gesicht, einen echten Ablauf, den Weg zum Gespräch. + +6. **Die Geerkens-Umstellung zur Serie machen**, sobald sie in 1 bis 2 Wochen startet. Mit Noah als Kunde im eigenen Betrieb. Das ist Beleg und Geschichte zugleich und passt zu „offen als Stärke“ (F6). + +7. **Für Weitergabe bauen.** Instagram belohnt Sends bei Nicht-Followern [Q17], und im Handwerk läuft viel über WhatsApp [Q20]. Hooks und Inhalte so formulieren, dass man sie dem Büro, dem Vater oder dem Kollegen schickt. + +8. **Content auch als Vertriebsmaterial nutzen.** Haris schickt nach einem Gespräch den passenden Beitrag. Das nutzt Dark Social bewusst und gibt jedem Beitrag ein zweites Leben. Im Redaktionsplan als Recycling-Ziel vermerken. + +9. **Weniger Kanäle richtig statt alle halb.** In der Bughunting-Phase: Collabs mit Noah und HiveGrid-Instagram, Rest als Zweitverwertung. Nach dem Release: TikTok, Facebook und die LinkedIn-Seite 12 Wochen mit Mindestfrequenz testen, dann entscheiden. + +10. **Selbstauskunft sofort einbauen.** Ein offenes Feld in Cal, eine offene Frage im Erstgespräch, ein Feld „kannte uns schon“ im Vertriebs-CRM. Das kostet fast nichts und ist bei so wenigen Kontakten die einzige ehrliche Messung. + +11. **Freigabe vereinfachen, bevor die Frequenz steigt.** Formatfreigabe und Paketfreigabe mit Frist mit Noah vereinbaren. Sonst bremst die Freigabe jeden Rhythmus. + +12. **Kaufanlässe von Haris sammeln lassen.** Jedes Gespräch liefert Druck, Angst und Anlass in den Worten der Betriebe. Das ist der beste Rohstoff für Hooks und für die nächste Runde der Positionierung. + +13. **Metricool mit Claude verbinden** (MCP, seit September 2026 [Q32]). Dann kann die Wochen- und Monatsauswertung zum großen Teil vorbereitet werden. Vorher Facebook, TikTok und LinkedIn in Metricool anbinden (F18). + +--- + +## Offene Fragen an Dejan + +1. **Nordstern:** Ist „qualifizierte Erstgespräche pro Monat“ der richtige Nordstern? Und wie viele Gespräche braucht Haris, um in 6 Monaten die ersten zahlenden Kunden zu haben? +2. **Beste Kunden:** Sprechen wir alle SHK-Betriebe an, bauen aber Belege und Beispiele vor allem für KWP- und PDS-Betriebe? Oder gleich breit? +3. **Kategorie:** Welches Wort soll ein Inhaber nach 5 Sekunden im Kopf haben: CRM, Arbeitsoberfläche, Ergänzung zum ERP oder etwas anderes? +4. **Geerkens-Serie:** Darf die Umstellung bei Geerkens offen gezeigt werden, mit Stolperstellen? Und machen die Mitarbeitenden dort mit? +5. **Noahs Brücke:** Wie oft sollen Noahs Reels HiveGrid erwähnen oder als Collab laufen? Gibt es dazu schon eine Absprache? +6. **Humor bei HiveGrid:** Soll HiveGrid selbst Humor testen dürfen, oder bleibt das bei Noah? +7. **Kapazität:** Wie viele Stunden pro Woche hast du nach dem Bughunting für Marketing? Wie viele David? Wie viel Zeit hat Noah für Collabs und Freigaben? +8. **Freigabe:** Wäre Noah mit Formatfreigabe und Paketfreigabe mit Frist einverstanden? +9. **Selbstauskunft:** Kann Haris das Feld in Cal und im Vertriebs-CRM einbauen, und fragt er bei Cold Calls nach „kannte uns schon“? +10. **Gründungsbetriebe:** Gibt es den „Founding-Deal“ aus dem Juni-Sprint noch? Könnten die ersten Betriebe als Gründungsbetriebe mit Erlaubnis zum Berichten starten? +11. **Nachfolge:** Das Thema ist nicht ausgewählt (F12), aber laut Bitkom für 47 % der Betriebe ein aktuelles Problem, und die nächste Generation ist Entscheider. Willst du es als Kaufanlass oder als Säule doch testen? +12. **Facebook:** Die Bitkom-Zahlen zeigen Facebook bei Betrieben weit vorn. Soll Facebook mehr sein als Crossposting, etwa mit SHK-Gruppen? +13. **Testreels:** Ist die Funktion auf `hivegrid.de` schon verfügbar? +14. **Vorbilder:** Welche Instagram-Kanäle sind deine Beispiele für gute Reels? Die brauchen wir für Runde F. +15. **Metricool:** Welchen Tarif nutzt ihr, und sollen wir die MCP-Anbindung an Claude einrichten? + +--- + +## Quellen + +Abgerufen am 05.10.2026, wenn nicht anders angegeben. + +**Positionierung, Zielgruppe, Botschaft** +- [Q1] April Dunford: A Quickstart Guide to Positioning, 15.03.2021. https://www.aprildunford.com/post/a-quickstart-guide-to-positioning +- [Q2] Commoncog: Obviously Awesome, Comprehensive Book Summary, 28.05.2019, aktualisiert 07.01.2025. https://commoncog.com/obviously-awesome/ +- [Q24] Bob Moesta und Chris Spiek: Jobs to be Done, Four Forces of Progress. https://jobstobedone.org/ (ohne Datum) +- [Q25] Jenni Romaniuk: Increasing mental market share by using category entry points, 19.01.2023. http://www.jenniromaniuk.com/blog/2023/1/19/increasing-mental-market-share-by-using-category-entry-points +- [Q26] Wynter: B2B Message Layers Framework, 22.11.2022. https://wynter.com/post/b2b-message-layers-framework-wynter +- [Q27] Umbrex: Message House Framework. https://umbrex.com/resources/frameworks/marketing-frameworks/message-house-framework/ (ohne Datum) +- [Q35b] HubSpot: Ideal customer profiles and buyer personas, how are they different? https://blog.hubspot.com/customers/ideal-customer-profiles-and-buyer-personas-are-they-different (ohne Datum) +- [Q36b] Sprout Social: What are social media content pillars? https://sproutsocial.com/insights/social-media-content-pillars/ (ohne Datum); ergänzend Ordinal: B2B Social Media Content Ideas. https://www.tryordinal.com/blog/b2b-social-media-content-ideas + +**Kaufverhalten, Funnel, Dark Social** +- [Q4] 6sense: The B2B Buyer Experience Report 2025. https://6sense.com/science-of-b2b/buyer-experience-report-2025/ ; Pressemitteilung 12.11.2025: https://www.businesswire.com/news/home/20251112018032/en/ +- [Q5] Edelman und LinkedIn: 2025 B2B Thought Leadership Impact Report, Befragung März und April 2025. https://www.edelman.com/insights/battle-b2b-influence (Seite für mich gesperrt, Zahlen über Zusammenfassungen, zum Beispiel https://www.contentgrip.com/edelman-linkedin-thought-leadership-report/) +- [Q6] Refine Labs: Study Confirms Measurement Gap in Software-Based Attribution, 07.04.2023. https://www.refinelabs.com/blog/hybrid-attribution-framework +- [Q7] Alexis Madrigal: Dark Social, We Have the Whole History of the Web Wrong. The Atlantic, 12.10.2012. https://www.theatlantic.com/technology/archive/2012/10/dark-social-we-have-the-whole-history-of-the-web-wrong/263523/ +- [Q8] Ehrenberg-Bass-Institut: The 95:5 rule. https://marketingscience.info/news-and-insights/the-955-rule-is-the-new-6040-rule ; LinkedIn B2B Institute: How B2B Brands Grow. https://business.linkedin.com/marketing-solutions/b2b-institute/how-b2b-brands-grow (John Dawes, 2021) +- [Q34] Growth Method: Gartner’s 6-Stage B2B Buying Journey. https://growthmethod.com/gartner-b2b-buying-journey/ (Zusammenfassung von Gartner-Forschung) + +**Gründermarke, Ton, Emotion** +- [Q9] Les Binet und Peter Field: The 5 Principles of Growth in B2B Marketing, LinkedIn B2B Institute, 2019 (IPA-Daten 1998 bis 2018). https://business.linkedin.com/advertise/resources/b2b-institute/marketing-as-growth +- [Q10] Kunal Swani, Charles S. Gulas, John Dinsmore: To humor or not humor buyers? Evaluating the effective use of humor in B2B advertisements. Journal of Business Research, Band 200, November 2025. https://www.sciencedirect.com/science/article/abs/pii/S0148296325004552 +- [Q19] Richard van der Blom: Algorithm InSights Report 2025, über Zusammenfassungen: https://www.writtenlyhub.com/news/linkedin-engagement-down-50-algorithm-insights-report-2025 und https://socialnexis.com/guides/company-page-organic-reach-numbers (Original kostenpflichtig, Zahlen nicht selbst geprüft) +- [Q29] Lenny Rachitsky: How today’s fastest growing B2B businesses found their first ten customers, 07.07.2020. https://www.lennysnewsletter.com/p/how-todays-fastest-growing-b2b-businesses +- [Q33] Sprout Social: Social Media Trends 2026 (mit Pulse-Umfragen Q2 und Q4 2025). https://sproutsocial.com/insights/social-media-trends/ +- [Q36] Influencer Marketing Hub: Instagram Collabs. https://influencermarketinghub.com/instagram-collabs/ (ohne Datum) + +**Beleg vor dem ersten Kunden** +- [Q28] Bessemer Venture Partners (Atlas): Design partners, the pre-launch edge most AI founders ignore, 06.05.2026. https://www.bvp.com/atlas/design-partners-the-pre-launch-edge-most-ai-founders-ignore + +**Experimente und Strategie** +- [Q11] Gabriel Weinberg und Justin Mares: Traction, 2015. Überblick: https://growthmethod.com/traction-channels/ und https://saasclub.io/podcast/gabriel-weinberg-duckduckgo-2/ +- [Q12] Brian Balfour: Why Product Market Fit Isn’t Enough, 2017. https://brianbalfour.com/essays/product-market-fit-isnt-enough +- [Q13] Intercom: RICE, Simple prioritization for product managers. https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/ ; Vergleich ICE und RICE: https://www.productlift.dev/blog/rice-vs-ice/ +- [Q14] Annie Duke: Quit, 2022. Auszug: https://behavioralscientist.org/annie-duke-quit-mental-models-to-help-you-cut-your-losses/ +- [Q15] Sprout Social: How to run a successful social media experiment, 22.02.2023. https://sproutsocial.com/insights/social-media-experiment/ +- [Q30] Richard Rumelt: Good Strategy/Bad Strategy, 2011; McKinsey Quarterly: The perils of bad strategy, 2011. https://www.mckinsey.com/capabilities/strategy-and-corporate-finance/our-insights/the-perils-of-bad-strategy +- [Q31] Gary Klein: Performing a Project Premortem. Harvard Business Review, September 2007. https://hbr.org/2007/09/performing-a-project-premortem +- [Q37] MarketerHire: Startup Marketing Playbook, Your First 90 Days, 17.06.2026. https://marketerhire.com/blog/startup-marketing-playbook +- [Q39b] Growth Gurus: How To Run a Marketing Strategy Workshop the Right Way. https://growthgurus.com/blog/how-to-run-a-marketing-strategy-workshop-the-right-way ; Samhub: How to Run a Successful Marketing Strategy Workshop. https://samhub.io/how-to-run-a-successful-marketing-strategy-workshop/ (ohne Datum) + +**Messung** +- [Q3] Content Marketing Institute: B2B Content and Marketing Trends, Insights for 2026, 08.10.2025 (n=1.015). https://contentmarketinginstitute.com/b2b-research/b2b-content-marketing-trends-research +- [Q17] Social Media Today: Instagram Shares Algorithm Insights To Inform Strategy, Januar 2025. https://www.socialmediatoday.com/news/instagram-shares-algorithm-insights-2025/738034/ +- [Q22] Amplitude: Every Product Needs a North Star Metric. https://amplitude.com/blog/product-north-star-metric ; North Star Playbook: https://info.amplitude.com/rs/138-CDN-550/images/Amplitude-The-North-Star-Playbook.pdf +- [Q23] Stuart Brameld, Growth Method: Self-Reported Attribution, aktualisiert 18.09.2026. https://growthmethod.com/self-reported-attribution/ +- [Q32] Metricool: Competitor Analysis on Social Media With Claude AI (MCP), 07.09.2026. https://metricool.com/metricool-mcp-competitor-analysis-claude/ + +**Plattformen, Frequenz, Redaktionsplan** +- [Q16] Instagram: Trial reels, try content with non-followers first, 10.12.2024. https://creators.instagram.com/blog/instagram-trial-reels +- [Q18] Buffer: How Often to Post on Social Media in 2026, 13.01.2026. https://buffer.com/resources/social-media-frequency-guide/ +- [Q35] ZoomInfo: How to Build a B2B Content Calendar That Drives Pipeline. https://pipeline.zoominfo.com/marketing/b2b-content-calendar (ohne Datum) +- [Q38b] Askube: The Content Repurposing Workflow (2026). https://getaskube.com/blog/content-repurposing-workflow ; Conbersa: Batch Content Creation Weekly Sprint. https://www.conbersa.ai/learn/batch-content-creation-weekly-sprint-template + +**Handwerk in Deutschland** +- [Q20] Bitkom: Digitalisierung des Handwerks, Studie 2025. Studienbericht 01/2026, telefonische Befragung von 504 Handwerksunternehmen (Geschäftsführung), KW 23 bis 29 2025, CC BY 4.0. https://www.bitkom.org/sites/main/files/2026-01/bitkom-studienbericht-handwerk.pdf +- [Q21] Bitkom: Über die Hälfte des deutschen Handwerks nutzt Social Media, Presseinformation 23.10.2025. https://www.bitkom.org/Presse/Presseinformation/Haelfte-des-Handwerks-nutzt-Social-Media + +**Intern** +- [Q40] HiveGrid: Kontext für das Marketing-Brainstorming, Stand 05.10.2026. `Brainstorming Kickoff/Kontext/Kontext.md`, Abschnitte 0, 7, 9, 10, 12, 13. diff --git a/Brainstorming Kickoff/Research/02-kanaele-und-formate.md b/Brainstorming Kickoff/Research/02-kanaele-und-formate.md new file mode 100644 index 0000000..642c1b2 --- /dev/null +++ b/Brainstorming Kickoff/Research/02-kanaele-und-formate.md @@ -0,0 +1,575 @@ +# 02 Social-Media-Kanäle und Formate + +**Stand:** 05.10.2026 +**Für:** Marketing-Brainstorming HiveGrid. Lesen werden Dejan, David und Noah Geerkens. +**Frage:** Wie spielen Instagram, Facebook, LinkedIn, TikTok und YouTube Shorts 2025 und 2026 aus? Welche Formate passen zu Software für SHK-Betriebe? Wie oft posten? Wo ist die Zielgruppe? Wie richten wir neue Konten sauber ein? + +**Lesehilfe** +- **Belegt** heißt: steht so in einer Quelle. Die Nummer in eckigen Klammern verweist auf die Quellenliste am Ende, zum Beispiel [Q3]. +- *Einschätzung* heißt: eigene Ableitung, nicht direkt belegt. +- Aussagen der Plattformen selbst (Meta, Adam Mosseri, LinkedIn, TikTok, YouTube) haben Vorrang vor Agentur-Studien. Agentur-Zahlen sind als solche markiert. +- **Grenze dieser Recherche:** Das Suchkontingent war aufgebraucht, bevor ich Fallbeispiele von Handwerkersoftware auf TikTok und Studien zu Humor im B2B selbst prüfen konnte. Dort stütze ich mich auf die bereits geprüfte Recherche im Website-Repo (`HiveGrid-Website/docs/recherche/05-emotion-ohne-beweis.md`, September 2026). Das ist im Text markiert. +- Nichts hier ist Rechtsberatung. Die Hinweise zum Impressum sollte vor dem Start jemand mit Rechtskenntnis prüfen. + +--- + +## Kurzfassung + +1. **Überall zählt dasselbe: Schauen die Leute zu Ende, speichern sie, schicken sie es weiter?** Adam Mosseri nennt für Instagram drei Signale: Watchtime, Likes pro Reichweite und Sendungen pro Reichweite. Sendungen zählen besonders, wenn es um Nicht-Follower geht [Q1]. LinkedIn nennt lange Verweildauer, Likes, Kommentare und Teilen [Q25]. TikTok gewichtet das Zuendeschauen am stärksten, die Follower-Zahl ist dort kein direkter Faktor [Q38]. +2. **Originalität ist 2025 und 2026 die wichtigste neue Regel.** Instagram (April 2026), Facebook (Juli 2025 und März 2026) und TikTok werten fremde oder bloß umgepostete Inhalte ab [Q5][Q18][Q39]. Eigene Aufnahmen auf mehreren Kanälen sind erlaubt. Aber immer die saubere Datei hochladen, nie ein Video mit dem Wasserzeichen einer anderen App. +3. **Die Inhaber sind auf Facebook und Instagram, kaum auf TikTok.** Wöchentliche Nutzung bei 30- bis 49-Jährigen: Instagram 54 %, Facebook 48 %, TikTok 24 %. Bei 50- bis 69-Jährigen: Facebook 29 %, Instagram 24 %, TikTok 7 % [Q46]. Handwerksbetriebe selbst werben vor allem auf Facebook (57 %) und Instagram (38 %), auf TikTok nur 7 % [Q47]. +4. **LinkedIn erreicht eher IT-Verantwortliche, die nächste Generation, Partner und die Branche, weniger den typischen SHK-Meister.** 13 % der Deutschen nutzen LinkedIn, 71 % der Nutzer haben einen Hochschulabschluss [Q36]. Persönliche Profile erreichen deutlich mehr als Unternehmensseiten (Agenturdaten [Q35]). Noahs Profil ist auf LinkedIn der Hauptkanal, die Seite ist der Beleg. +5. **Facebook ist für HiveGrid vor allem Verlängerung und Gruppe.** Seit Juni 2025 ist jedes Video auf Facebook ein Reel [Q16]. Die größte SHK-Community im deutschsprachigen Raum ist eine Facebook-Gruppe mit über 27.000 Fachhandwerkern [Q23]. Dort wirkt Noah als Person, nicht HiveGrid als Seite. +6. **TikTok ist ein Test, kein Pflichtkanal für Kundengewinnung.** TikTok bringt Reichweite bei Jüngeren und kostet wenig, wenn wir Reels wiederverwenden. Belege, dass Software an Handwerker über TikTok verkauft wird, habe ich nicht gefunden. Ein klickbarer Link in der Bio kommt erst ab 1.000 Followern (Stand 2024) [Q43]. +7. **Formate:** Hochkant 9:16, Haken in den ersten ein bis zwei Sekunden, Untertitel eingebrannt, guter Ton, meist 20 bis 60 Sekunden. **Carousels sind nicht tot.** Auf Instagram hatten Carousels 2025 im Schnitt 13 % mehr Reichweite und 51 % mehr Interaktionen als Reels [Q12]. Auf LinkedIn haben PDF-Dokumente bei Unternehmensseiten das höchste Engagement [Q32]. Reels, die fast nur aus Text bestehen, zeigt Instagram seltener [Q2]. +8. **Instagram hat zwei Werkzeuge, die genau zu „viele Formate testen“ passen:** Trial Reels, die zuerst nur Nicht-Followern gezeigt werden [Q3], und Collab-Posts mit Noah. Instagram selbst nennt für Trial Reels 80 % mehr Reichweite bei Nicht-Followern [Q4]. +9. **Realistische Mindestfrequenz für ein Team aus zwei Leuten:** eine Aufnahme pro Woche, daraus zwei Reels und ein Carousel, verteilt auf fünf Kanäle. Mehr als 1 bis 2 Beiträge pro Woche lohnt sich messbar: Auf Instagram verdoppeln 3 bis 5 Beiträge pro Woche das Follower-Wachstum [Q13]. Auf LinkedIn ist der Schritt von 1 auf 2 bis 5 Beiträge der größte Sprung [Q33]. +10. **Tonalität:** Noah darf lustig und trashig sein. HiveGrid bleibt ruhig, konkret und hat trockenen Humor. Die Daten sagen: B2B-Werbung ist fast immer langweilig, Gefühl wirkt. Konfrontation mit der Zielgruppe scheitert aber. **Vor dem ersten Post auf jedem neuen Kanal muss das Impressum stehen, und dafür muss die Firmierung geklärt sein.** + +--- + +## 1. Instagram + +### 1.1 Wie Instagram 2025 und 2026 ausspielt + +**Belegt** +- **Die drei wichtigsten Signale.** Adam Mosseri nannte im Januar 2025 Watchtime, Likes pro Reichweite und Sendungen pro Reichweite (Weiterleiten per Direktnachricht) [Q1]. + - Watchtime zählt relativ (Anteil des Videos) und absolut (Sekunden). + - Likes zählen etwas mehr bei bestehenden Followern. + - Sendungen zählen etwas mehr bei Leuten, die dem Konto nicht folgen. +- **Was Instagram seltener zeigt.** Mosseri listet für Reels auf: niedrige Auflösung, Wasserzeichen, stummgeschaltete Videos, Videos mit Rahmen, Reels, die **überwiegend aus Text** bestehen, und Reels, die schon einmal auf Instagram gepostet wurden [Q2, 31.05.2023]. Das eigene Logo ist kein Problem, nur Logos anderer Apps [Q15]. +- **Originalität (30.04.2026).** Wer überwiegend fremde Inhalte postet, wird Nicht-Followern nicht mehr empfohlen. Das gilt jetzt auch für Fotos und Carousels, nicht nur für Reels. Wasserzeichen oder kleine Zuschnitte zählen nicht als eigene Leistung. Instagram bewertet das über etwa einen Monat. Die Reichweite bei den eigenen Followern bleibt [Q5]. Meta meldet für das vierte Quartal 2025, dass 75 % der Empfehlungen auf Instagram (USA) aus Original-Beiträgen kommen [Q10]. +- **Hashtags.** Seit 18.12.2025 sind höchstens 5 Hashtags pro Beitrag möglich. Mosseri sagte im Februar 2025, Hashtags bringen keine Reichweite, sie helfen nur zu beschreiben, worum es geht [Q6]. +- **„Your Algorithm“.** Nutzer sehen die Themen, die Instagram ihnen zuordnet, und können sie ändern. Seit Dezember 2025 bei Reels, seit 10.06.2026 auch im Feed [Q7]. Instagram ordnet Inhalte dafür benannten Themen zu. +- **Trial Reels** (seit 10.12.2024). Ein Reel geht zuerst nur an Nicht-Follower. Nach etwa 24 Stunden gibt es Zahlen, gemessen werden die Aufrufe in den ersten 72 Stunden. Man kann einstellen, dass es bei gutem Ergebnis automatisch auch an die Follower geht [Q3]. Seit April 2026 lassen sie sich planen. Instagram nennt 80 % mehr Reichweite bei Nicht-Followern und 40 % der Nutzer, die dadurch öfter posten [Q4]. +- **Reels bis 3 Minuten und Profilraster 3:4** (Januar 2025). Mosseri: Die meisten Uploads sind hochkant, sie quadratisch zuzuschneiden sei „ziemlich brutal“ [Q8]. +- **Edits** (seit 22.04.2025). Kostenlose Schnitt-App von Meta mit automatischen Untertiteln, Rauschfilter, Freisteller und eigenen Auswertungen [Q9]. Laut Meta stammten im vierten Quartal 2025 knapp 10 % der täglichen Reel-Aufrufe aus Videos, die mit Edits gemacht wurden [Q10]. +- **Collab-Posts.** Der Beitrag erscheint auf beiden Profilen, erreicht beide Follower-Kreise, Likes und Kommentare werden zusammengezählt. Bis zu fünf Mitautoren sind möglich (Sekundärquelle [Q14]). +- **Weitere Neuerungen** (Sekundärquelle [Q11]): Reposts seit August 2025. Öffentliche Beiträge von Profi-Konten können seit Juli 2025 bei Google erscheinen. + +*Einschätzung* +- Für ein Konto mit 64 Followern kommt fast jede Reichweite von Nicht-Followern. Das wichtigste Signal ist also: **Schickt jemand das Reel einem Kollegen?** Ein Satz, den ein Inhaber seinem Büroleiter weiterleiten will, ist mehr wert als ein schöner Schnitt. +- Weil Instagram Themen benennt und Google mitliest, gehören die Wörter, nach denen gesucht wird, in Bildschirmtext, gesprochenen Text und Bildunterschrift: SHK, Heizungsbauer, Branchenprogramm, KWP, Plantafel, Monteur. +- Die animierten Text-Posts aus unserem Generator sind als Reel riskant, weil sie überwiegend aus Text bestehen. Als Titel eines Carousels oder mit Stimme und Person darüber passen sie. + +### 1.2 Formate, die für B2B und Handwerk funktionieren + +| Baustein | Empfehlung | Grundlage | +|---|---|---| +| Format | Reels 9:16 (1080 × 1920). Carousels 4:5 (1080 × 1350) oder 3:4 (1080 × 1440). Wichtiges in die Mitte, weil das Raster 3:4 zeigt und die Ränder abschneidet. | Belegt [Q8] | +| Haken | Die ersten ein bis zwei Sekunden entscheiden. Ein konkreter Satz plus ein Bild aus dem Betrieb. Kein Logo-Intro. | *Einschätzung* aus Watchtime-Signal [Q1] | +| Länge | 20 bis 45 Sekunden für Reichweite, bis 90 Sekunden für Erklärungen. 3 Minuten sind möglich, aber nur, wenn es trägt. | *Einschätzung* | +| Untertitel | Eingebrannt, in ganzen Sinnabschnitten, mittig. Nicht im unteren Drittel, dort liegen Bedienelemente und Bildunterschrift. | Davids Papier (Kontext 10.7), *Einschätzung* | +| Ton | Hohe Priorität. Eigene Stimme statt Musik-Trend. Business-Konten haben bei Musik eine eingeschränkte Auswahl, das in der App prüfen. | *Einschätzung* | +| Text auf Bild | Ein kurzer Titel ja. Reels, die fast nur aus Text bestehen, nein. | Belegt [Q2] | +| Carousel | Funktioniert weiter und bringt Speicherungen. Titelbild muss allein tragen. 5 bis 10 Slides. | Belegt [Q12] (Agenturdaten) | +| Stories | Für die, die schon folgen: Umfragen, Fragen, Blick in die Entwicklung. Wenig Aufwand. | *Einschätzung* | + +**Formate zum Testen** (*Einschätzung*, passend zu den Themen aus dem Kontext): +- **Noah im Betrieb:** ein Satz zu einem echten Problem, dann B-Roll, dann die Lösung in einem Satz. Als Collab. +- **„Ein Ablauf in 30 Sekunden“:** Bildschirmaufnahme aus dem Demo-Workspace, Noah spricht darüber. Zeigt das Produkt, ohne Feature-Liste. +- **Bau-Tagebuch:** Dejan oder David zeigen, was diese Woche gebaut oder getestet wurde. Das passt zu „offen, als Stärke“ (Kontext F6). +- **Automatisierung ohne Angst:** Probelauf, 24 Stunden rückgängig machen, ein Mensch gibt frei. Als Carousel und als kurzes Reel (Kontext F12). +- **Frage aus dem Betrieb:** eine echte Frage eines Monteurs oder der Büroleitung, eine Antwort. +- **Trial Reels** für jedes neue Format, bevor es an die Follower geht. + +### 1.3 Frequenz + +- **Belegt:** Buffer hat 2,1 Millionen Beiträge von 102.000 Konten ausgewertet (August 2025). 3 bis 5 Beiträge pro Woche verdoppeln das Follower-Wachstum gegenüber 1 bis 2 Beiträgen. Die Reichweite pro Beitrag steigt dabei um etwa 12 %. Mehr hilft weiter, aber mit abnehmendem Nutzen [Q13]. Das sind Agenturdaten über alle Branchen. +- *Einschätzung* für HiveGrid: + - **Minimum:** 2 Feed-Beiträge pro Woche (1 Reel, 1 Carousel) und 2 bis 3 Stories. + - **Ziel:** 3 bis 4 Feed-Beiträge pro Woche, davon mindestens 2 Reels, dazu Trial Reels für Tests. + - Noahs eigener Kanal läuft getrennt davon, laut Davids Papier anfangs täglich. + +### 1.4 Zielgruppe auf Instagram + +- **Belegt:** Instagram hat in Deutschland 40 % Wochenreichweite (ab 14 Jahren). Bei 30 bis 49 Jahren sind es 54 %, bei 50 bis 69 Jahren 24 %. Das Durchschnittsalter liegt bei 37 Jahren. Instagram wächst gerade bei den Älteren (30 bis 49: plus 4 Punkte, 50 bis 69: plus 6 Punkte) [Q46]. +- **Belegt:** 38 % der Handwerksbetriebe, die soziale Netzwerke nutzen, sind auf Instagram [Q47]. +- *Einschätzung:* Instagram erreicht die nächste Generation und jüngere Inhaber gut, ältere Inhaber nur zum Teil. + +--- + +## 2. Facebook + +### 2.1 Wie Facebook 2025 und 2026 ausspielt + +**Belegt** +- **Alle Videos sind Reels** (angekündigt 17.06.2025). Der Video-Tab heißt jetzt Reels-Tab. Die Längengrenze fällt, Querformat wird ins Hochformat übernommen [Q16]. +- **Frische und längere Reels** (07.10.2025). Facebook zeigt 50 % mehr Reels, die am selben Tag veröffentlicht wurden. Reels über einer Minute machen bei Creators ab 10.000 Followern ein Viertel der Inhalte aus, aber über die Hälfte der Watchtime [Q17]. +- **Originalität.** Im Juli 2025 kündigte Meta an, Doppel-Posts zu erkennen und ihre Verbreitung zu senken [Q19]. Am 13.03.2026 folgte die genaue Regel: Original ist, was die Inhaberin oder der Inhaber eines Profils oder einer Seite selbst gefilmt oder produziert hat. Nicht original sind bloßes Reagieren, aneinandergereihte fremde Clips oder Kopien mit kleinen Änderungen wie Rahmen, Text oder Tempo. Solche Beiträge werden zurückgestuft [Q18]. +- **Zahlen von Meta** (Januar 2026): Verbesserungen im vierten Quartal 2025 brachten 7 % mehr Aufrufe organischer Beiträge. Facebook zeigt 25 % mehr Reels vom selben Tag als im dritten Quartal [Q10]. +- **Umbau des Feeds** (August 2026): neue „Für dich“-Ansicht, Freundesvorschläge nach Interessen, ein Werkzeug, mit dem Nutzer den Algorithmus im Feed anpassen [Q21]. Tom Alison, Chef von Facebook, kündigte im Juli 2026 an, international einen Vollbild-Video-Feed zu testen, mit dem klassischen Feed als zweitem Reiter [Q20]. +- **Gruppen.** Meta baut Gruppen aus. Seit 29.09.2026 gibt es die eigene App „Forum“ für Facebook-Gruppen, vorerst nur in den USA [Q22]. + +*Einschätzung* +- Facebook belohnt dieselben Dinge wie Instagram: eigene Videos, frisch, zu Ende geschaut. Wenn HiveGrid Reels von Instagram auf Facebook mitveröffentlicht, ist das eigenes Material und damit original im Sinne von Meta [Q18]. +- Für eine neue Seite ohne Follower bringt der Feed wenig. Die Stärke von Facebook im Handwerk sind die Gruppen. + +### 2.2 Facebook-Gruppen für Handwerker + +- **Belegt:** „Heizungsbauer aus Leidenschaft“ (#HZBAL) nennt sich die größte SHK-Community im deutschsprachigen Raum. Kern ist eine Facebook-Fachgruppe mit über 27.000 Fachhandwerkerinnen und Fachhandwerkern. Partner sind unter anderem Wolf, Wilo, Solvis, Vaillant, Bosch und Belimo. Es gibt einen Podcast mit Andre Treder und Florian Leupelt [Q23]. +- **Belegt:** Knipex ist laut Interview mit Marketingleiter Matthias Hagedorn genau in dieser Gruppe aktiv, als Teil einer bewusst werbefernen Strategie (onetoone.de, 03.02.2022, zitiert in der Website-Recherche [Q55]). +- **Nicht gefunden:** belastbare Listen weiterer SHK-Gruppen und die Werberegeln von #HZBAL. Das muss jemand im Gruppenalltag selbst prüfen. +- *Einschätzung:* + - Fachgruppen verbieten meist Werbung. Wer dort Software anpreist, verbrennt sich. + - Der richtige Weg ist Noah als Person: Fragen beantworten, Erfahrungen teilen, ab und zu ein eigenes Video zeigen, wenn es zur Frage passt. + - Eine Partnerschaft mit #HZBAL wie bei Herstellern wäre später ein eigenes Thema, mit Budget. + +### 2.3 Formate und Frequenz + +- *Einschätzung:* + - **Reels** von Instagram mitveröffentlichen (über die Kontenübersicht von Meta). Kein Zusatzaufwand. + - **Text etwas ausführlicher** als auf Instagram, weil das Publikum älter ist und eher liest. Die ARD/ZDF-Medienstudie zeigt, dass 50- bis 69-Jährige in sozialen Medien lieber Artikel lesen als Videos schauen [Q46]. + - **Minimum:** alles, was auf Instagram erscheint, automatisch auch auf Facebook. Dazu Noah ein- bis zweimal pro Woche in Gruppen, als er selbst. + - **Ziel:** zusätzlich einmal im Monat ein längeres Video (2 bis 4 Minuten) zu einem Ablauf, weil längere Reels auf Facebook einen großen Teil der Watchtime tragen [Q17]. + +### 2.4 Zielgruppe auf Facebook + +- **Belegt:** Facebook hat 31 % Wochenreichweite, bei 30 bis 49 Jahren 48 %, bei 50 bis 69 Jahren 29 %. Das Durchschnittsalter ist 45, das höchste aller Plattformen [Q46]. +- **Belegt:** Bei 50 bis 69 Jahren liegt Facebook (29 %) vor Instagram (24 %) [Q46]. +- **Belegt:** 57 % der Handwerksbetriebe, die soziale Netzwerke nutzen, sind auf Facebook. Das ist nach lokalen Communitys (65 %) der häufigste Kanal [Q47]. +- *Einschätzung:* Für ältere Inhaber ist Facebook der Kanal, auf dem sie am ehesten sind. Facebook ist deshalb trotz schwacher Seitenreichweite Pflicht, wenn auch mit wenig eigenem Aufwand. + +--- + +## 3. LinkedIn + +### 3.1 Wie LinkedIn 2025 und 2026 ausspielt (für Seite und Profil gleich) + +**Belegt** +- **Neuer Feed** (12.03.2026, LinkedIn Engineering, Hristo Danchev). LinkedIn hat Auswahl und Ranking neu gebaut: + - Ein Sprachmodell versteht, worum es in einem Beitrag geht, und findet passende Beiträge auch von Leuten, denen man nicht folgt, „zu Themen, die dich interessieren“. + - Das Ranking sagt vorher, ob jemand lange liest, liked, kommentiert oder teilt. Es liest dazu die bisherigen Interaktionen in ihrer Reihenfolge. + - Berufliche Angaben von Autor und Leser fließen ein: Profil, Überschrift, Firma, Branche [Q25]. +- LinkedIn will mit dem Umbau Engagement-Köder und inhaltsleere Vordenker-Beiträge zurückdrängen [Q26]. +- **Gegen KI-Einheitsbrei** (19.05.2026). LinkedIn senkt die Reichweite generischer KI-Beiträge, automatischer Kommentare und von Videos, die nur auf Aufmerksamkeit aus sind. Laura Lorenzetti (LinkedIn) nennt 14 % mehr Inhalte als im Vorjahr [Q28]. +- **Aussagen von Laura Lorenzetti** [Q29]: + - Hashtags sind „nice to have, not a need to have“. + - Das Interessanteste gehört an den Anfang. + - Links sind kein Problem, wenn der Beitrag selbst Wissen liefert. +- **Video** (Februar 2025). Video-Uploads plus 36 %, Video-Erstellung plus 100 %. Der Vollbild-Videofeed im Hochformat kam auch ins Web [Q30]. Digiday berichtet, dass humorvolle Videos über den Arbeitsalltag gut laufen (Einzelbeispiel einer Creatorin) [Q31]. + +*Einschätzung* +- LinkedIn sortiert Beiträge nach Thema und Absender-Profil. Wer immer wieder über dasselbe Thema schreibt und ein passendes Profil hat (SHK-Meister schreibt über SHK-Betrieb), wird diesem Thema zugeordnet. **Themen-Treue ist auf LinkedIn wichtiger als Häufigkeit.** +- „Trash“ ist auf LinkedIn riskanter als auf Instagram, weil LinkedIn ausdrücklich Aufmerksamkeits-Köder abwertet [Q28]. + +### 3.2 Unternehmensseite + +- **Agenturdaten:** Unternehmensseiten erreichen deutlich weniger als persönliche Profile. Ordinal (Januar 2026) nennt 1 bis 2 % Anteil der Seiten am typischen Feed und einen Rückgang der Seitenreichweite um 60 bis 66 % zwischen 2024 und Anfang 2026 [Q35]. Die Methodik ist nicht offen gelegt. Die Richtung bestätigen viele Quellen, die genauen Zahlen sind unsicher. +- **Agenturdaten:** Socialinsider hat 1,3 Millionen Beiträge von 16.645 Unternehmensseiten ausgewertet (2024 bis 2025). PDF-Dokumente (als Carousel) haben das höchste Engagement, Videos weniger als Dokumente, Mehrbild-Beiträge die meisten Likes. Einschränkung im Bericht: Dokumente sind selten, das kann die Zahl verzerren [Q32]. +- **LinkedIn selbst** (Seite ohne Datum, Zahlen eher älter): Vollständig ausgefüllte Seiten haben 30 % mehr wöchentliche Aufrufe. Wer wöchentlich postet, hat doppelt so viel Engagement. Ab 150 Followern wachse eine Seite deutlich leichter [Q34]. +- *Einschätzung:* Die Seite ist für HiveGrid vor allem **Beleg**. Wer nach einem Gespräch mit Haris auf LinkedIn nachschaut, soll eine gepflegte, aktive Firma sehen: Team, Bau, echte Abläufe. Reichweite kommt über die Profile. +- *Einschätzung:* LinkedIn-Newsletter gibt es auch für Unternehmensseiten. Abonnenten werden benachrichtigt. Das kann später den eigenen Newsletter ergänzen. Die Bedingungen für Seiten vor dem Start in der LinkedIn-Hilfe prüfen. + +### 3.3 Persönliche Profile + +- **Noah:** Meister in vierter Generation, schreibt als Betriebsinhaber. Das ist genau das Profil, das LinkedIn einem SHK-Thema zuordnet. *Einschätzung:* Noahs LinkedIn ist für HiveGrid wichtiger als die Unternehmensseite. +- **Dejan, David, Haris, Raffael:** Profilüberschrift mit HiveGrid, HiveGrid als Arbeitgeber eingetragen, Beiträge der Seite mit einem eigenen Satz teilen statt nur zu liken. *Einschätzung.* +- **Belegt:** Buffer hat 2 Millionen LinkedIn-Beiträge von 94.000 Konten ausgewertet (August 2025). Der Schritt von 1 auf 2 bis 5 Beiträge pro Woche ist „wie ein Schalter“, mehr Impressionen pro Beitrag. Eine Strafe für häufiges Posten fand Buffer nicht [Q33]. + +### 3.4 Formate auf LinkedIn + +| Format | Wofür | Hinweis | +|---|---|---| +| Textbeitrag mit Foto | Noahs Erfahrungen, eine Beobachtung aus dem Betrieb | Die ersten zwei Zeilen tragen alles, dann kommt „mehr anzeigen“ | +| PDF-Dokument | Abläufe, Checklisten, „So läuft ein Notdienst-Auftrag“ | Gleiche Slides wie das Instagram-Carousel, als PDF. 6 bis 10 Seiten. | +| Natives Video | Reel von Instagram, auch hochkant | Untertitel eingebrannt, im Text mehr Zusammenhang als auf Instagram | +| Bau-Einblick | Release, Test, Team | Passt zur Seite und zu Dejans und Davids Profilen | + +Nicht tun (belegt [Q28][Q29]): „Kommentiere JA“, Kommentar-Gruppen, automatische Kommentare, generische KI-Texte. + +### 3.5 Frequenz auf LinkedIn + +- *Einschätzung:* + - **Seite:** Minimum 1 Beitrag pro Woche, Ziel 2. + - **Noah:** Minimum 2, Ziel 3 pro Woche. + - **Team:** je 1 pro Woche oder ein geteilter Beitrag mit eigenem Satz. + +### 3.6 Zielgruppe auf LinkedIn + +- **Belegt (YouGov, Mai 2025, 2.033 Befragte ab 18):** 13 % der Deutschen nutzen LinkedIn, Männer 16 %, Frauen 10 %. 52 % der Nutzer sind 25 bis 44 Jahre alt. 71 % haben einen Hochschulabschluss. 32 % der Nutzer sind täglich drin [Q36]. +- **Belegt:** 35 % der Handwerksbetriebe, die soziale Netzwerke nutzen, sind auf LinkedIn, 33 % auf Xing [Q47]. Xing hat Gruppen und Veranstaltungen eingestellt und ist heute vor allem eine Jobbörse [Q37]. +- *Einschätzung:* Auf LinkedIn erreicht HiveGrid IT-Verantwortliche und die nächste Generation in größeren Betrieben, außerdem Partner (KWP, PDS, Hilti, Großhandel), Verbände, Presse und Investoren. Den 58-jährigen Meister mit 15 Leuten erreicht HiveGrid hier eher selten. + +--- + +## 4. TikTok + +### 4.1 Wie TikTok 2025 und 2026 ausspielt + +**Belegt** +- **Signale** (TikTok, 18.06.2020, bis heute die Grundlage). Gezählt werden Likes, Teilen, Folgen, Kommentare und eigene Inhalte. Dazu kommen Infos zum Video wie Text, Ton und Hashtags. Ein starkes Signal ist, wenn jemand ein längeres Video ganz zu Ende schaut. Das zählt mehr als ein Like. **Follower-Zahl und frühere Erfolge sind keine direkten Faktoren** [Q38]. +- **Nicht empfehlbar** sind nach den Regeln für den „Für dich“-Feed unter anderem Inhalte ohne eigene Bearbeitung, etwa mit dem sichtbaren Wasserzeichen oder Logo eines anderen [Q39]. +- **Suche.** Eine von TikTok mit WARC beauftragte Studie (USA, über 1.000 Befragte, September 2025): 86 % der Gen Z suchen wöchentlich auf TikTok, 90 % bei Google [Q40]. Eine Adobe-Umfrage (USA, 1.007 Befragte, Februar 2026): 49 % haben TikTok schon als Suchmaschine genutzt. Nur noch 4 % der Gen Z ziehen TikTok Google vor, 2024 waren es 8 %. Google halten 85 % für hilfreich, TikTok 16 % [Q41]. +- **Foto-Carousels.** Fanpage Karma hat knapp 700.000 Beiträge von Januar bis Mai 2025 ausgewertet. Auf TikTok hatten Carousels 81 % mehr Interaktionen und 82 % mehr Likes als Videos, aber nur 3 % mehr Reichweite und etwa ein Drittel weniger Teilungen [Q12]. Agenturdaten. + +*Einschätzung* +- Die These „TikTok ist die neue Suchmaschine“ gilt vor allem für Jüngere in den USA und für Themen wie Mode und Beauty. Für SHK-Inhaber in Deutschland ist sie kaum relevant. +- Trotzdem lohnt es sich, Suchwörter zu nutzen: in der Bildunterschrift, im Bildschirmtext und gesprochen. TikTok nutzt diese Infos, um ein Video einem Thema und Publikum zuzuordnen [Q38]. +- Für ein neues Konto ist TikTok fairer als Instagram, weil Follower kein direkter Faktor sind. Ein gutes Video kann vom ersten Tag an Reichweite bekommen. + +### 4.2 Formate auf TikTok + +- *Einschätzung:* + - Hochkant 9:16, 15 bis 45 Sekunden, Haken im ersten Satz. + - Untertitel und Text lieber mit den TikTok-eigenen Werkzeugen als nur eingebrannt, weil TikTok diesen Text lesen kann. + - Eigener Ton oder Musik aus der kommerziellen Bibliothek. Business-Konten haben auf TikTok keinen Zugriff auf alle Trend-Songs, das in der App prüfen. + - **Foto-Carousels** aus den Carousel-Slides des Generators, im Format 9:16 oder 3:4 neu ausgegeben. + - Bildunterschrift mit 3 bis 5 Stichwörtern als Hashtags, zum Beispiel #shk #heizungsbauer #handwerk #handwerkersoftware. + - Kein Logo-Intro, keine Feature-Liste. + +### 4.3 Frequenz auf TikTok + +- *Einschätzung:* + - **Minimum:** 3 Beiträge pro Woche, alles Wiederverwertung: 2 Reels und 1 Foto-Carousel. + - **Ziel:** 5 pro Woche. + - Eine frei zugängliche Studie zur TikTok-Frequenz mit Methodik habe ich nicht gefunden (Buffers Seite dazu war offline). + - Wichtig ist, dass jedes Video für sich steht, weil TikTok es Nicht-Followern zeigt. + +### 4.4 Zielgruppe auf TikTok + +- **Belegt:** + - TikTok meldet für Deutschland 28,9 Millionen monatlich aktive Nutzer im ersten Halbjahr 2026. Die Zahl stammt aus dem DSA-Bericht, zusammengestellt von einer Drittseite [Q42]. Sie zählt Konten und Geräte, nicht genau Menschen. + - TikTok hat 20 % Wochenreichweite, bei 30 bis 49 Jahren 24 %, bei 50 bis 69 Jahren 7 %. Das Durchschnittsalter liegt bei 32 [Q46]. + - Nur 7 % der Handwerksbetriebe, die soziale Netzwerke nutzen, sind auf TikTok [Q47]. +- *Einschätzung:* TikTok erreicht Monteure, Azubis, junge Meister und die nächste Generation. Inhaber über 50 erreicht TikTok kaum. Der Vorteil: Kaum ein Anbieter von Handwerkersoftware ist dort aktiv. Das ist eine Lücke, aber auch ein Hinweis, dass es sich vielleicht nicht lohnt. + +--- + +## 5. YouTube Shorts (kurz) + +- **Belegt:** Seit 15.10.2024 dürfen Shorts bis 3 Minuten lang sein, wenn sie quadratisch oder hochkant sind [Q45]. +- **Belegt:** Seit 31.03.2025 zählt YouTube einen Aufruf schon beim Start oder bei einer Wiederholung. Die alte Zahl heißt jetzt „engaged views“ und bleibt für Vergütung und Auswertung maßgeblich. Die Empfehlungen ändert das laut YouTube nicht [Q44]. +- **Belegt:** Nur 6 % der Handwerksbetriebe, die soziale Netzwerke nutzen, sind auf YouTube [Q47]. +- *Einschätzung:* + - Shorts sind für HiveGrid ein billiger Zusatz. Dieselbe Datei wie für Instagram, mit Titel, der ein Suchwort enthält. + - Der eigentliche Wert von YouTube liegt später: längere Demos, Webinar-Aufzeichnungen und Antworten auf Suchanfragen wie „KWP Schnittstelle“ oder „Plantafel SHK“. YouTube ist zugleich eine Suchmaschine mit Google dahinter. + - Jetzt nur den Kanalnamen sichern und die besten Reels hochladen. + +--- + +## 6. Querschnitt: Wo die Zielgruppe tatsächlich ist + +**Was es an Daten gibt** + +| Quelle | Was sie zeigt | +|---|---| +| ARD/ZDF-Medienstudie 2025 (n = 2.512, ab 14) [Q46] | Wöchentliche Nutzung nach Alter, siehe Tabelle unten. LinkedIn und Xing sind dort nicht erfasst. | +| Bitkom, Digitalisierung des Handwerks (n = 504 Betriebe, Juni und Juli 2025) [Q47] | 56 % der Handwerksbetriebe nutzen soziale Netzwerke für Werbung oder Präsenz (2022: 40 %). Davon: lokale Communitys 65 %, Facebook 57 %, Instagram 38 %, LinkedIn 35 %, Xing 33 %, X 12 %, TikTok 7 %, YouTube 6 %. 62 % nutzen Messenger wie WhatsApp. 32 % machen E-Mail- oder Newsletter-Marketing. | +| YouGov, Mai 2025 (n = 2.033) [Q36] | LinkedIn 13 % der Erwachsenen, vor allem 25 bis 44, Akademiker | +| ZDH, Betriebsnachfolge (2020) [Q48] | Fast jeder vierte Inhaber im Handwerk ist über 60. | + +**Wöchentliche Nutzung 2025 nach Alter (ARD/ZDF-Medienstudie [Q46])** + +| Plattform | Gesamt | 14 bis 29 | 30 bis 49 | 50 bis 69 | ab 70 | +|---|---:|---:|---:|---:|---:| +| Instagram | 40 % | 77 % | 54 % | 24 % | 5 % | +| Facebook | 31 % | 26 % | 48 % | 29 % | 13 % | +| TikTok | 20 % | 50 % | 24 % | 7 % | 2 % | + +**Was es nicht gibt:** eine Studie, wie SHK-Inhaber mit 10 bis 50 Leuten privat soziale Medien nutzen. Die Bitkom-Zahlen zeigen, wo Betriebe **werben**, nicht, wo Inhaber **schauen**. Alles Weitere ist abgeleitet. + +*Einschätzung* + +| Person im Betrieb | Wahrscheinliches Alter | Wo am ehesten | +|---|---|---| +| Inhaber, Geschäftsführung | 45 bis 65 | Facebook, Instagram, WhatsApp, Facebook-Gruppen. LinkedIn eher selten. | +| Nächste Generation, Nachfolger | 25 bis 40 | Instagram, LinkedIn, teils TikTok | +| IT-Verantwortliche, Büroleitung | 30 bis 50 | LinkedIn, Instagram, Facebook | +| Monteure, Azubis (Nutzer, nicht Käufer) | 18 bis 35 | TikTok, Instagram | + +Daraus folgt: **Instagram und Facebook sind der Kern für die Entscheider.** LinkedIn ist der Kern für die Fachleute in größeren Betrieben und für Partner. TikTok ist Reichweite bei Nutzern und Nachwuchs. Wichtige Wege zur Zielgruppe liegen außerhalb sozialer Medien: Innungen, Messen, Fachpresse, Großhandel und Empfehlungen. Die sind Thema anderer Arbeitspakete. + +--- + +## 7. B2B auf TikTok und Instagram: Funktioniert das für Software an Handwerker? + +**Was dafür spricht (belegt)** +- Die Entscheider sind auf Instagram und Facebook: Bei 30 bis 49 Jahren nutzt mehr als jeder Zweite Instagram jede Woche [Q46]. +- Instagram wächst gerade in den Altersgruppen der Inhaber [Q46]. +- Instagram und TikTok zeigen neuen Konten Inhalte an Nicht-Follower, wenn sie zu Ende geschaut und weitergeschickt werden [Q1][Q38]. Trial Reels machen genau das planbar [Q3][Q4]. +- Collab-Posts tragen Noahs Reichweite auf das HiveGrid-Profil [Q14]. +- Im Profil von `hivegrid.de` gab es um den 27.09.2026 einen deutlichen Sprung bei den Followern (Kontext F18). Ob er von einem Collab-Post mit Noah kam, sollte Dejan in Metricool prüfen. Das wäre der erste eigene Beleg. + +**Was dagegen spricht oder unsicher ist** +- Ich habe **keine öffentlichen Fallzahlen** gefunden, dass Software an Handwerker in Deutschland über TikTok oder Instagram verkauft wird. Die Website-Recherche im September 2026 fand ebenfalls kein Beispiel in unserer Kategorie [Q55]. Das ist eine Lücke und zugleich ein Risiko. +- TikTok erreicht die Inhaber über 50 kaum (7 % Wochenreichweite bei 50 bis 69) [Q46]. +- Der Kauf läuft über Gespräch und Demo. Ein Reel erzeugt Aufmerksamkeit und Vertrauen, nicht den Abschluss. Davids Papier hat dafür den Weg über Kommentar, Material und dann Einladung (ManyChat) vorgesehen (Kontext 10.7). +- Auf TikTok gibt es den Link erst ab 1.000 Followern [Q43]. Bis dahin führt der Weg nur über das Profil und Direktnachrichten. + +**Was andere Branchen zeigen (Einschätzung, nicht geprüft)** +- In den USA sind Anbieter von Software für Handwerksbetriebe auf Instagram und TikTok aktiv, meist mit Inhabern als Gesichtern und Alltags-Humor. Das konnte ich in dieser Runde nicht mit Zahlen belegen und nenne deshalb keine Namen. + +**Fazit (Einschätzung):** Instagram ja, als Hauptkanal für Sichtbarkeit und Vertrauen, getragen von Noah. TikTok ja, aber als Test mit klarer Grenze: acht Wochen, nur Wiederverwertung. Danach weiter, wenn Profilaufrufe, Follower aus der Zielgruppe oder Direktnachrichten kommen. Sonst einfrieren. + +--- + +## 8. Tonalität: Humor und Trash gegen Seriosität + +**Was die Daten sagen** +- **Langeweile ist im B2B der Normalfall.** „Cashing In On Creativity“ (B2B Institute von LinkedIn mit System1, Juni 2021, 1.700 B2B-Anzeigen): 77 % der B2B-Werbung bekommt einen von fünf Sternen, nur 0,5 % vier oder fünf [Q55]. +- **Gefühl wirkt auch im B2B.** Binet und Field (2019, IPA-Datenbank) finden bei emotionalen Strategien deutlich mehr starke Geschäftswirkungen als bei rationalen. Die Arbeit selbst nennt die Grenzen: unter 50 Fälle, vor allem britische Award-Einreichungen. Also eine Richtung, kein Beweis [Q55]. +- **Konfrontation scheitert.** Die ZDH-Kampagne „Hier stimmt was nicht“ (2022) hatte die schlechteste Resonanz seit 16 Jahren (Kontext 7.2). +- **Anerkennung statt Stolz.** 84 % der Handwerker sind stolz auf ihren Beruf, aber nur 61 % erleben Wertschätzung (Forsa für IKK classic, 11/2025, Kontext 7.2). +- **Plattformen strafen Köder ab.** LinkedIn senkt die Reichweite von Videos, die nur auf Aufmerksamkeit aus sind [Q28]. Meta und TikTok werten Unoriginelles ab [Q5][Q18][Q39]. +- **Humor läuft auch auf LinkedIn,** wenn er aus dem Arbeitsalltag kommt (Digiday, Einzelbeispiel) [Q31]. +- Laut Berichten hat Adam Mosseri zum Jahreswechsel 2025/26 betont, dass rohe, echte Inhalte gegenüber polierten und KI-Inhalten an Wert gewinnen (zitiert nach [Q1b]). Den Originalbeitrag konnte ich nicht prüfen. + +*Einschätzung: Wie sich Personal Brand und Company Brand ergänzen* + +| | Noah (Personal Brand) | HiveGrid (Company Brand) | +|---|---|---| +| Rolle | Aufmerksamkeit, Nähe, „einer von uns“ | Verständnis, Vertrauen, Beständigkeit | +| Ton | Lustig, auch trashig, Handwerkersprache | Ruhig, konkret, trockener Humor, ehrlich | +| Worüber gelacht wird | Bürokratie, Zettelwirtschaft, Softwareanbieter, sich selbst | Über sich selbst als Softwarefirma, über Papierkram | +| Worüber nie gelacht wird | Über den Handwerker, seine Kunden, seinen Betrieb | Dasselbe | +| Formate | Reels, Gruppen, LinkedIn-Erfahrungen | Abläufe, Bau-Tagebuch, Carousels, Dokumente | +| Brücke | Collab-Posts, wenn das Reel einen Bezug zum Produkt hat | Gelb, Outro mit dem G, gleiche Untertitel | + +- **Regel für Collabs** (*Einschätzung*): Ein Collab erscheint auf dem HiveGrid-Profil. Also nur Reels als Collab, die auch im HiveGrid-Raster stehen dürfen. Sehr trashige Reels laufen nur bei Noah, mit Verweis auf HiveGrid in Bio und Text. +- **Warum Humor bei Noah sinnvoll ist** (*Einschätzung*): Lustiges wird weitergeschickt. Sendungen sind das Signal, das Nicht-Follower erreicht [Q1]. Humor bei Noah kauft Reichweite, die HiveGrid mit seriösen Inhalten nicht bekommt. +- **Warum HiveGrid nicht genauso lustig sein muss** (*Einschätzung*): Wer nach einem Reel von Noah auf das HiveGrid-Profil klickt, sucht dort Beweise: Wie sieht die Software aus? Wer steckt dahinter? Ist das ernst gemeint? Das Profil muss diese Fragen in 10 Sekunden beantworten. +- **Werbekennzeichnung:** Das OLG Hamburg hat im Mai 2026 entschieden, dass Eigenwerbung keinen Hinweis „Werbung“ braucht, wenn der geschäftliche Zweck ohnehin klar ist, zum Beispiel weil der Gründerstatus in der Bio steht [Q50]. *Einschätzung:* Noah sollte „Mitgründer @hivegrid.de“ in der Bio führen. + +--- + +## 9. Wiederverwertungs-Matrix + +**Grundregeln** (*Einschätzung*, gestützt auf [Q2][Q5][Q18][Q39]) +- **Eine Masterdatei** aus dem Schnittprogramm (Premiere oder Edits), 9:16, 1080 × 1920, ohne App-Wasserzeichen, ohne eingebrannte Musik aus Instagram. +- **Nie herunterladen und weiterposten.** Ein von Instagram geladenes Reel kann ein Wasserzeichen tragen. TikTok stuft solche Videos als nicht empfehlbar ein [Q39], Instagram zeigt Reels mit fremden Logos seltener [Q2]. +- **Text-Sicherheitszone:** wichtige Texte und Untertitel in die Mitte. Oben liegen Kontoname und Reiter, unten Bildunterschrift und Knöpfe. +- **Untertitel** einmal sauber erstellen, als Datei aufheben, für jede Plattform nutzen. +- **Je Plattform den Text neu schreiben.** Gleiche Idee, anderer Einstieg. + +**Aus einer Aufnahme (Noah oder Team, 60 bis 90 Sekunden Rohmaterial plus B-Roll)** + +| Ausgabe | Format und Länge | Was anpassen | Text und Hashtags | +|---|---|---|---| +| Instagram Reel (Collab mit Noah) | 9:16, 20 bis 45 s | Titelbild für das Raster (3:4-Mitte) | Kurzer Text mit Suchwörtern, höchstens 5 Hashtags | +| Instagram Trial Reel (Variante) | 9:16, anderer Haken | Nur die ersten Sekunden anders | Wie oben | +| Facebook Reel | Gleiche Datei | Über die Kontenübersicht automatisch mitveröffentlichen | Etwas mehr Zusammenhang, Link zur Website erlaubt | +| TikTok | Gleiche Masterdatei, 15 bis 45 s | TikTok-eigener Text, eigener Ton oder kommerzielle Musik | Suchwörter in Text und Bildunterschrift, 3 bis 5 Hashtags | +| YouTube Short | Gleiche Datei, bis 3 Min | Titel mit Suchwort | Kurze Beschreibung, Link zur Website | +| LinkedIn-Video (Seite) | Gleiche Datei, bis 90 s | Untertitel müssen eingebrannt sein | 3 bis 6 Zeilen Zusammenhang, keine oder wenige Hashtags | +| LinkedIn (Noah persönlich) | Gleiche Datei oder nur Text mit Foto | Noah erzählt die Geschichte dahinter in eigenen Worten | Erste zwei Zeilen tragen alles | +| Instagram-Carousel | 4:5 oder 3:4, 5 bis 10 Slides | Die drei Kernaussagen als Slides aus dem Generator, ein Foto von Noah als Titel | Text speicherwürdig machen (Checkliste, Ablauf) | +| LinkedIn-Dokument | Gleiche Slides als PDF | Querverweis auf das Video | Fachlicher Einstieg | +| TikTok-Foto-Carousel | Gleiche Slides, neu als 9:16 oder 3:4 | Mehr Luft oben und unten | Kurzer Text, Suchwörter | +| Story | Ausschnitt 5 bis 15 s | Umfrage oder Frage-Sticker dazu | Verweis auf den Beitrag | +| Newsletter | Ein Absatz pro Thema, Standbild mit Link | Längere Fassung, Hintergrund, Ausblick | Du-Ansprache, ein Link | + +*Einschätzung zum Aufwand:* Eine Aufnahme ergibt so 8 bis 12 Beiträge. Der Schnitt der Masterdatei kostet die meiste Zeit, jede weitere Ausgabe 5 bis 15 Minuten. Metricool kann Instagram, Facebook, TikTok, LinkedIn und YouTube aus einer Oberfläche planen. Verbunden ist bisher nur Instagram (Kontext F18). + +--- + +## 10. Setup-Checkliste für neue Konten + +### 10.1 Vor allen Kanälen + +- [ ] **Firmierung klären.** Laut Kontext ist sie für Mollie noch offen. Ohne sie kein korrektes Impressum. +- [ ] **Impressum auf der Website** prüfen: vollständige Angaben nach § 5 DDG (Name, Rechtsform, Anschrift, Vertretungsberechtigte, E-Mail, Telefon, Register, USt-IdNr.) [Q54]. Eine feste Adresse wie `hivegrid.de/impressum` für alle Profile. +- [ ] **Datenschutzerklärung** um einen Abschnitt zu den Social-Media-Profilen ergänzen. Für Facebook-Seiten gilt seit dem EuGH-Urteil vom 05.06.2018 (C-210/16) eine gemeinsame Verantwortung mit Meta. *Einschätzung:* mit Rechtsberatung klären. +- [ ] **Einheitlicher Name** auf allen Kanälen, zum Beispiel `hivegrid.de` oder `hivegrid`. Verfügbarkeit prüfen und alle sofort sichern, auch YouTube. +- [ ] **Profilbild:** Wabe auf Gelb `#F1B729`, in klein lesbar. Gleich auf allen Kanälen. +- [ ] **Zwei Admins** je Kanal (zum Beispiel Dejan und David), Zwei-Faktor-Anmeldung, Zugänge im Passwortmanager. +- [ ] **Bio-Text** in der Du-Form, ohne Versprechen, die das Produkt nicht hält. Laut Kontext 9.7 kein DATEV und nicht „100 % in Deutschland“ ohne Prüfung. +- [ ] **Erste 6 bis 9 Beiträge** vorbereiten, bevor wir den Kanal bewerben (*Einschätzung*). +- [ ] **Metricool** mit jedem neuen Kanal verbinden. + +**Vorschlag für die Bio** (*Einschätzung*, an Kontext 9.3 angelehnt): +> Software für SHK-Betriebe. Legt sich um dein Branchenprogramm, statt es zu ersetzen. Gebaut mit Noah Geerkens, SHK-Meister in vierter Generation. + +### 10.2 Impressum je Plattform + +**Rechtslage (belegt)** +- Wer ein Unternehmensprofil auf Instagram, Facebook, LinkedIn, TikTok oder YouTube betreibt, braucht ein leicht erkennbares, unmittelbar erreichbares und ständig verfügbares Impressum. Grundlage ist seit 14.05.2024 § 5 DDG, vorher § 5 TMG [Q54][Q51]. +- **Zwei Klicks** gelten nach dem BGH (2006) als zulässig [Q51]. +- **OLG Hamburg, 21.05.2026, Az. 15 U 99/24:** Ein gut sichtbarer, klickbarer Link unter der Bio, der direkt zu einem vollständigen Impressum führt, reicht aus. Kurze technische Ausfälle sind kein Verstoß [Q50]. +- **Linktree und ähnliche Linkseiten** sind umstritten. e-recht24 hält sie mit einem klar beschrifteten Impressum-Bereich für möglich [Q51]. Die Darstellung des OLG-Urteils bei LHR sieht Ketten über Linksammlungen kritisch [Q50]. *Einschätzung:* der sichere Weg ist ein direkter Link. +- **Beschriftung:** „Impressum“ oder „Kontakt“. Begriffe wie „Info“ sind zu unklar [Q51][Q43]. + +| Plattform | Wo das Impressum hin soll | +|---|---| +| Instagram | Bis zu 5 Links im Profil möglich [Q51]. Ein Link mit dem Titel „Impressum“ direkt auf `hivegrid.de/impressum`. *Einschätzung:* Da Instagram nur den ersten Link sichtbar zeigt, ist ein Impressum-Link an zweiter Stelle zwei Klicks entfernt. Rechtlich sicherer ist die erste Stelle. Das mit Rechtsberatung entscheiden. | +| Facebook | Facebook bietet seit Jahren ein eigenes Feld „Impressum“ in den Seiteninfos (heise, ältere Meldung [Q53]). Beim Anlegen prüfen, ob es in der neuen Seitenansicht noch so heißt. Zusätzlich Website-Link. | +| LinkedIn-Seite | LinkedIn nennt die Pflichtangaben, bietet aber kein eigenes Feld [Q52]. Website-Feld setzen und in die Info-Beschreibung „Impressum: hivegrid.de/impressum“ schreiben. | +| TikTok | Business-Konto. Das Website-Feld ist laut e-recht24 erst ab 1.000 Followern frei (Stand 2024) [Q43]. Bis dahin die Adresse als Text in die Bio schreiben, zum Beispiel „Impressum: hivegrid.de/impressum“. Beim Anlegen prüfen, ob sich die Grenze geändert hat. | +| YouTube | Link „Impressum“ im Kanal-Header und Text in der Kanalbeschreibung. | +| Noahs Konten | *Einschätzung:* Wer geschäftlich postet, braucht ebenfalls ein Impressum. Noah sollte das für Instagram und LinkedIn prüfen lassen. | + +### 10.3 Facebook-Seite + +- [ ] Seite über Noahs, Dejans oder Davids persönliches Profil anlegen, zweiten Admin eintragen. +- [ ] Kategorie: etwas wie „Software“ oder „Softwareunternehmen“ (genauen Namen in der Auswahl prüfen). +- [ ] Impressum-Feld, Website, E-Mail, Telefon, Standort (nur wenn eine echte Anschrift dahinter steht). +- [ ] Handlungsknopf: „Termin buchen“ oder „Mehr dazu“ mit Link zur Seite „Erstgespräch vereinbaren“. +- [ ] Titelbild: Noah im Betrieb oder die Oberfläche mit gelbem Rahmen, Wichtiges in der Mitte. +- [ ] Instagram und Facebook in der Kontenübersicht von Meta verbinden, damit Reels mitveröffentlicht werden. +- [ ] Datenschutzhinweis für die Seite verlinken. + +### 10.4 TikTok Business + +- [ ] Konto mit Firmen-E-Mail anlegen, sofort auf Business-Konto umstellen. +- [ ] Gleicher Name und gleiches Profilbild wie bei Instagram. +- [ ] Kategorie wählen (zum Beispiel Software oder Technik, in der App prüfen). +- [ ] Bio mit Impressum-Adresse als Text, solange es kein Website-Feld gibt. +- [ ] E-Mail-Kontakt im Profil hinterlegen. +- [ ] Musik: nur eigener Ton oder kommerzielle Musikbibliothek. +- [ ] Desktop-Hochladen über TikTok Studio testen, Metricool verbinden. +- [ ] Abbruchkriterium vorher festlegen (siehe Abschnitt 11). + +### 10.5 LinkedIn-Unternehmensseite (besteht, ist leer) + +- [ ] Logo, Titelbild, Slogan (kurze Zeile), Info-Text mit Impressum-Hinweis. +- [ ] Branche (zum Beispiel Softwareentwicklung), Größe, Standort, Website. +- [ ] Eigener Knopf: „Website besuchen“ oder „Kontakt“ auf die Erstgespräch-Seite. +- [ ] Alle im Team tragen HiveGrid als Arbeitgeber ein, damit sie auf der Seite erscheinen. +- [ ] Laut LinkedIn bringen vollständige Seiten 30 % mehr Aufrufe [Q34]. +- [ ] Erste Beiträge: Gründergeschichte, Bau-Einblick, ein Dokument „So läuft ein Ablauf“. + +### 10.6 Instagram-Profil (besteht) + +- [ ] Profi-Konto prüfen (Business oder Creator). Business hat Kontaktknöpfe, Creator mehr Musik. Für Trial Reels und Metricool in der App prüfen, was gebraucht wird. +- [ ] Kategorie, Kontaktknöpfe (E-Mail, Telefon), Link „Impressum“, Link zur Erstgespräch-Seite. +- [ ] Bis zu drei Beiträge oben anheften: Gründergeschichte, „Verbinden statt ersetzen“ (ohne DATEV-Logo, Kontext 10.1), ein Ablauf als Reel. +- [ ] Highlights: Wer wir sind, Bau, Fragen, Kontakt. +- [ ] Titelbilder für das Raster in 3:4 prüfen [Q8]. +- [ ] Noah als Mitgründer in der Bio verlinken, und umgekehrt. + +--- + +## 11. Was das für HiveGrid heißt + +**Rollen der Kanäle** (*Einschätzung*) + +| Kanal | Rolle | Wer | Minimum pro Woche | Ziel pro Woche | +|---|---|---|---|---| +| Noah Instagram | Aufmerksamkeit, Humor, Nähe | Noah | läuft schon | täglich (Davids Papier) | +| HiveGrid Instagram | Schaufenster und Testlabor | Dejan | 2 Feed + 2 Stories | 3 bis 4 Feed + Trial Reels | +| HiveGrid Facebook | Verlängerung, ältere Inhaber | automatisch | Mitveröffentlichung | dazu 1 längeres Video im Monat | +| Facebook-Gruppen | Vertrauen im Fachkreis | Noah als Person | 1 Antwort | 2 bis 3 Antworten | +| Noah LinkedIn | Fachleute, Partner, Branche | Noah | 2 | 3 | +| HiveGrid LinkedIn-Seite | Beleg, Team, Bau | Dejan, David | 1 | 2 | +| HiveGrid TikTok | Test: Reichweite, Nachwuchs | Dejan | 3 (Wiederverwertung) | 5 | +| YouTube | Shorts jetzt, Demos später | Dejan | Name sichern | 1 bis 2 Shorts | +| Newsletter | Bindung, Gesprächsanlass | Dejan | 1 im Monat | alle 2 Wochen | + +**Wochenrhythmus als Vorschlag** (*Einschätzung*) +- **Montag:** eine Aufnahme-Session, 60 Minuten, zwei Themen. Noah im Betrieb oder Team im Büro. +- **Dienstag:** Reel 1 als Collab auf Instagram, mitveröffentlicht auf Facebook. Gleiche Datei auf TikTok, YouTube Shorts und LinkedIn-Seite. +- **Mittwoch:** Noah auf LinkedIn mit der Geschichte hinter Reel 1. +- **Donnerstag:** Carousel auf Instagram, als PDF auf LinkedIn, als Foto-Carousel auf TikTok. +- **Freitag:** Reel 2, verteilt wie am Dienstag. Vorher als Trial Reel testen. +- **Laufend:** Stories, Antworten auf Kommentare und Nachrichten am selben Tag. + +**Test-Plan für die Formatfrage** (*Einschätzung*, passt zu Dejans Ansatz) +- 6 Formate je 2 bis 3 Wochen testen, jedes mindestens viermal. Zum Beispiel: Noah im Betrieb, Ablauf in 30 Sekunden, Bau-Tagebuch, Frage aus dem Betrieb, Automatisierung ohne Angst, Humor-Sketch. +- **Messen, was die Plattformen selbst gewichten:** durchschnittliche Watchtime, Sendungen pro Reichweite, Speicherungen, Reichweite bei Nicht-Followern. Für das Geschäft dazu: Profilaufrufe, Klicks auf den Link, Direktnachrichten, gebuchte Gespräche mit Herkunft. +- Gewinner bekommen mehr Platz, Verlierer fliegen raus. Trial Reels nutzen, damit Tests die Follower nicht belasten. +- **TikTok nach acht Wochen bewerten.** Weiter, wenn Profilaufrufe oder Anfragen aus der Zielgruppe kommen. Sonst einfrieren und nur den Namen behalten. + +**Folgen für den Generator** (*Einschätzung*) +- Ausgabe in 4:5 und 3:4 für Instagram-Carousels, 9:16 für TikTok-Fotos und als PDF für LinkedIn. +- Bewegtbild-Titel nicht als reine Text-Reels posten, sondern als Carousel-Titel oder unter Noahs Stimme [Q2]. +- Untertitel-Vorlage im HiveGrid-Stil, die auch in Edits oder Premiere funktioniert. + +**Reihenfolge** (*Einschätzung*) +1. Firmierung und Impressum klären. Namen auf allen Kanälen sichern. +2. LinkedIn-Seite vervollständigen, Facebook-Seite anlegen und mit Instagram verbinden. +3. Erste echte Aufnahmen, sobald Geerkens die Software im Alltag nutzt (laut Kontext in 1 bis 2 Wochen). Bis dahin: Bau-Tagebuch und Gründergeschichte. +4. TikTok und YouTube anlegen, mit 6 bis 9 vorbereiteten Beiträgen starten. +5. Nach vier Wochen erste Auswertung, nach acht Wochen Entscheidung über TikTok. + +--- + +## 12. Offene Fragen an Dejan + +1. **Firmierung:** Unter welchem Namen und welcher Anschrift läuft das Impressum? Laut Kontext ist die Firmierung noch offen. +2. **Wer veröffentlicht und wer antwortet?** Kommentare und Nachrichten brauchen eine feste Person und feste Zeiten. Ist das Dejan, David oder Haris? +3. **Noah auf TikTok:** Hat Noah ein eigenes TikTok-Konto? Wenn ja, ist Noahs Konto der bessere Ort als ein HiveGrid-Konto. TikTok hat keine Collab-Posts wie Instagram. +4. **Collab-Grenze:** Welche von Noahs Reels dürfen im HiveGrid-Raster erscheinen? Brauchen wir eine einfache Regel, zum Beispiel „nur mit Produktbezug“? +5. **Facebook-Gruppen:** In welchen Gruppen ist Noah schon, und will er dort als er selbst aktiv sein? +6. **Sprung um den 27.09.:** Woher kamen die neuen Follower auf `hivegrid.de`? Ein Collab mit Noah wäre der erste eigene Beleg. +7. **Name auf allen Kanälen:** `hivegrid.de` oder `hivegrid`? Ist der Name auf TikTok, Facebook und YouTube frei? +8. **TikTok-Grenze:** Einverstanden mit acht Wochen Test und klaren Kriterien? +9. **Newsletter-Werkzeug:** Nutzen wir das eigene E-Mail-Marketing-Modul von HiveGrid? Das wäre ein Beleg, dass wir unser Produkt selbst verwenden. Ist es dafür bereit? +10. **Hosting-Aussage:** Darf „Hosting in Deutschland“ in die Bio? Kontext 9.7 nennt Cloudflare vor der Produktion und die Website in den Niederlanden. +11. **Musik und Profi-Konto:** Ist eigener Ton für alle Reels in Ordnung? Dann ist das Business-Konto ohne Nachteil. +12. **Rechtsberatung:** Gibt es jemanden, der Impressum, Datenschutzhinweise und Noahs eigene Konten einmal prüft? + +--- + +## 13. Quellen + +Alle Webquellen abgerufen am 05.10.2026. „Sekundär“ heißt: berichtet über eine Plattform-Aussage, Original nicht selbst gesehen. „Agentur“ heißt: Daten eines Anbieters, Methodik nur teilweise offen. + +**Instagram** +- [Q1] Mosseri zu Watchtime, Likes pro Reichweite, Sendungen pro Reichweite, Januar 2025. Sekundär: Fanpage Karma, https://www.fanpagekarma.com/insights/instagram-reels-algorithm/ und dataslayer, https://www.dataslayer.ai/blog/instagram-algorithm-2025-complete-guide-for-marketers +- [Q1b] Mosseri zum Jahreswechsel 2025/26 über echte gegenüber polierten und KI-Inhalten. Sekundär, nicht geprüft: dataslayer, Link wie [Q1] +- [Q2] Adam Mosseri, „Instagram Ranking Explained“, 31.05.2023, https://about.instagram.com/blog/announcements/instagram-ranking-explained +- [Q3] Instagram Creators, „Trial reels“, 10.12.2024, https://creators.instagram.com/blog/instagram-trial-reels +- [Q4] Social Media Today, „Instagram allows creators to schedule Trial Reels“, 02.04.2026, https://www.socialmediatoday.com/news/instagram-allows-creators-to-schedule-trial-reels/816549/ +- [Q5] PetaPixel, „New Instagram Policies Target Reposted Content“, 30.04.2026, https://petapixel.com/2026/04/30/new-instagram-policies-target-reposted-content/ +- [Q6] Social Media Today, „Instagram Implements New Limits on Hashtag Use“, 18.12.2025, https://www.socialmediatoday.com/news/instagram-implements-new-limits-on-hashtag-use/808309/ +- [Q7] Social Media Today, „Instagram extends Your Algorithm to the main feed“, Juni 2026, https://www.socialmediatoday.com/news/instagram-extends-your-algorithm-to-the-main-feed/822576/ +- [Q8] MediaNama, „Instagram Extends Reels To 3 Minutes“, Januar 2025, https://www.medianama.com/2025/01/223-instagram-reels-3-minutes-us-tiktok-ban/ +- [Q9] heise, „Edits by Instagram: Meta launches video editor as an app“, April 2025, https://www.heise.de/en/news/Edits-by-Instagram-Meta-launches-video-editor-as-an-app-10360811.html +- [Q10] Meta, „2026: AI Drives Performance“, 28.01.2026, https://about.fb.com/news/2026/01/2026-ai-drives-performance/ +- [Q11] Keywords Everywhere, Instagram-Update-Tracker 2025/2026 (Sekundär), https://keywordseverywhere.com/news/instagram-algorithm-updates/ +- [Q12] Fanpage Karma, „Performance Check: Carousels vs. Videos“, 2025, rund 700.000 Beiträge (Agentur), https://www.fanpagekarma.com/insights/carousel-vs-video-performance-tiktok-instagram/ +- [Q13] Buffer, „How Often to Post on Instagram“, 13.08.2025, 2,1 Mio. Beiträge (Agentur), https://buffer.com/resources/how-often-to-post-on-instagram/ +- [Q14] Sked Social, Leitfaden Collab-Posts 2026 (Sekundär), https://skedsocial.com/blog/instagram-collaboration-feature +- [Q15] Social Media Today, „Instagram Says Including Your Own Logo on a Reel Is Fine“, https://www.socialmediatoday.com/news/instagram-clarifies-including-your-own-logo-on-a-reel-is-ok/730852/ + +**Facebook** +- [Q16] Tubefilter, „Meta is turning all Facebook videos into Reels“, 17.06.2025, https://www.tubefilter.com/2025/06/17/meta-facebook-reels-all-videos-update/ +- [Q17] Meta, „Finding and Sharing Reels on Facebook Just Got Easier and More Fun“, 07.10.2025, https://about.fb.com/news/2025/10/finding-sharing-reels-facebook-just-got-easier-more-fun/ +- [Q18] Meta, „Rewarding Original Creators on Facebook“, 13.03.2026, https://about.fb.com/news/2026/03/rewarding-original-creators-on-facebook/ +- [Q19] Tubefilter, „The fight against unoriginal content is coming to Facebook“, 15.07.2025, https://www.tubefilter.com/2025/07/15/ai-slop-unoriginal-repetitive-content-monetization-facebook-meta/ +- [Q20] Meta, Tom Alison, „Connecting Real People on Facebook“, 24.07.2026, https://about.fb.com/news/2026/07/connecting-real-people-on-facebook/ +- [Q21] GCN, „Facebook overhauls its feed with five changes“, 08.08.2026, https://gcn.com/facebook-overhauls-feed-redesign-five-changes/20667/ +- [Q22] Meta, „Find Your Community With Forum“, 29.09.2026, https://about.fb.com/news/2026/09/find-community-forum-dedicated-app-facebook-groups/ +- [Q23] Heizungsbauer aus Leidenschaft (#HZBAL), https://hzbal.de/ + +**LinkedIn** +- [Q25] LinkedIn Engineering, Hristo Danchev, „Engineering the next generation of LinkedIn's Feed“, 12.03.2026, https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed +- [Q26] Social Media Today, „LinkedIn updates its Feed algorithm“, 12.03.2026, https://www.socialmediatoday.com/news/linkedin-updates-its-feed-algorithm/814638/ +- [Q28] Entrepreneur, „LinkedIn Is Fighting Back Against AI Slop and AI Comments“, 19.05.2026, https://www.entrepreneur.com/business-news/linkedin-is-fighting-back-against-ai-slop-and-ai-comments +- [Q29] Buffer, „How LinkedIn's Algorithm Works in 2026, According to the LinkedIn Team“ (Zitate Laura Lorenzetti), https://buffer.com/resources/linkedin-algorithm/ +- [Q30] TechCrunch, „LinkedIn amps up vertical video tools as uploads jump 36%“, 04.02.2025, https://techcrunch.com/2025/02/04/linkedin-amps-up-vertical-video-tools-as-uploads-jump-36 +- [Q31] Digiday, „LinkedIn's video push appears to be working in 2025“, 31.01.2025, https://digiday.com/media/linkedins-video-push-appears-to-be-working-in-2025/ +- [Q32] Social Media Today zu Socialinsider, „Report shows document posts on LinkedIn see more engagement“, 02.04.2026, 1,3 Mio. Beiträge von 16.645 Seiten (Agentur), https://www.socialmediatoday.com/news/report-shows-document-posts-on-linkedin-see-more-engagement/816551/ +- [Q33] Buffer, „How Often to Post on LinkedIn“, 28.08.2025, 2 Mio. Beiträge (Agentur), https://buffer.com/resources/how-often-to-post-on-linkedin/ +- [Q34] LinkedIn, „LinkedIn Pages Best Practices“ (ohne Datum), https://business.linkedin.com/marketing-solutions/linkedin-pages/best-practices +- [Q35] Ordinal, „LinkedIn Company Page Reach in January 2026“ (Agentur), https://www.tryordinal.com/blog/the-declining-reach-of-linkedin-company-pages +- [Q36] YouGov, „Von lokal zu global: LinkedIn setzt sich gegen Xing durch“, Befragung 09. bis 12.05.2025, n = 2.033, https://yougov.com/de-de/artikel/54163-von-lokal-zu-global-linkedin-setzt-sich-gegen-xing-als-zentrale-plattform-fur-berufstatige-durch +- [Q37] Trending Topics, „Xing wird zum Jobs-Netzwerk“, https://www.trendingtopics.eu/strategische-neuausrichtung-xing-wird-zum-jobs-netzwerk/ und Wikipedia, https://de.wikipedia.org/wiki/Xing_(soziales_Netzwerk) + +**TikTok** +- [Q38] TikTok Newsroom, „How TikTok recommends videos #ForYou“, 18.06.2020, https://newsroom.tiktok.com/en-us/how-tiktok-recommends-videos-for-you +- [Q39] TikTok, „For You feed Eligibility Standards“ (veröffentlicht 17.04.2024), https://www.tiktok.com/community-guidelines/en/fyf-standards/ +- [Q40] Tubefilter, „TikTok says its search engine usage rivals Google among Gen Z“, 10.09.2025, https://www.tubefilter.com/2025/09/10/tiktok-search-engine-ads-new-research/ +- [Q41] Search Engine Journal, „Gen Z Preference For TikTok Over Google Drops 50%“, 25.02.2026, https://www.searchenginejournal.com/gen-z-preference-for-tiktok-over-google-drops-50-data-shows/568267/ +- [Q42] Social Media Transparency, TikTok Deutschland nach DSA-Berichten (Drittseite), https://socialmediatransparency.org/tiktok/germany +- [Q43] e-recht24, „TikTok Impressum für den Unternehmensaccount“, 01.05.2024, https://www.e-recht24.de/impressum/13108-tiktok-impressum-hinterlegen.html + +**YouTube** +- [Q44] TechCrunch, „YouTube is changing how YouTube Shorts views are counted“, 26.03.2025, https://techcrunch.com/2025/03/26/youtube-is-changing-how-youtube-shorts-views-are-counted +- [Q45] 9to5Google, „YouTube Shorts will soon be up to 3 minutes long“, 03.10.2024, https://9to5google.com/2024/10/03/youtube-shorts-3-minutes/ + +**Zielgruppe** +- [Q46] Tippelt, „Social Media zwischen Wachstum und Sättigung“, Media Perspektiven 31/2025, ARD/ZDF-Medienstudie 2025, September 2025, n = 2.512, https://www.media-perspektiven.de/fileadmin/user_upload/media-perspektiven/pdf/2025/MP_31_2025_ARD_ZDF-Medienstudie_Social_Media_zwischen_Wachstum_und_Saettigung_Nutzungsmuster_und_Plattformdynamiken_in_Deutschland.pdf +- [Q47] Bitkom, „Über die Hälfte des deutschen Handwerks nutzt Social Media“, 23.10.2025, https://www.bitkom.org/Presse/Presseinformation/Haelfte-des-Handwerks-nutzt-Social-Media und Studienbericht „Digitalisierung des Handwerks“, Januar 2026, n = 504, https://www.bitkom.org/sites/main/files/2026-01/bitkom-studienbericht-handwerk.pdf +- [Q48] ZDH, Sonderumfrage „Betriebsnachfolge im Handwerk“, 3. Quartal 2020, https://www.zdh.de/ueber-uns/fachbereich-wirtschaft-energie-umwelt/sonderumfragen/sonderumfrage-betriebsnachfolge-im-handwerk/ + +**Recht** +- [Q50] LHR Rechtsanwälte zu OLG Hamburg, Urteil vom 21.05.2026, Az. 15 U 99/24, https://www.lhr-law.de/magazin/social-media-recht/olg-hamburg-instagram-impressum-bio-link/ +- [Q51] e-recht24, „Link in Bio: Impressumspflicht auf Instagram“, 14.11.2024, https://www.e-recht24.de/impressum/13078-impressum-auf-instagram.html +- [Q52] LinkedIn-Hilfe, „Ein Impressum zu einer Unternehmensseite hinzufügen“, https://www.linkedin.com/help/linkedin/answer/a1339387/ein-impressum-zu-einer-unternehmensseite-hinzufugen?lang=de-DE +- [Q53] heise, „Facebook führt Feld für Impressum ein“ (ältere Meldung), https://www.heise.de/news/Facebook-fuehrt-Feld-fuer-Impressum-ein-2155338.html +- [Q54] § 5 Digitale-Dienste-Gesetz, https://www.gesetze-im-internet.de/ddg/__5.html + +**Interne Quellen** +- [Q55] `HiveGrid-Website/docs/recherche/05-emotion-ohne-beweis.md` (Binet und Field 2019, B2B Institute mit System1 2021), `08-marken-register.md` (Knipex, onetoone.de 03.02.2022) und `09-quellen.md`, alle im September 2026 geprüft +- Kontext: `Brainstorming Kickoff/Kontext/Kontext.md`, Abschnitte 0, 7.2, 9.4, 10 und 13, Stand 05.10.2026 diff --git a/Brainstorming Kickoff/Research/03-wettbewerb-und-vorbilder.md b/Brainstorming Kickoff/Research/03-wettbewerb-und-vorbilder.md new file mode 100644 index 0000000..4a3d3ca --- /dev/null +++ b/Brainstorming Kickoff/Research/03-wettbewerb-und-vorbilder.md @@ -0,0 +1,672 @@ +# 03 Social Media von Wettbewerbern und Vorbildern + +**Stand:** 05.10.2026 +**Für:** Dejan Cosic und Noah Geerkens, als Grundlage für das Marketing-Brainstorming +**Ergänzt:** die Website-Analyse `HiveGrid-Website/docs/recherche/01-wettbewerb-handwerk.md` (12.09.2026). Die deckt nur Websites ab. Hier geht es um Social Media. + +--- + +## Lesehilfe + +| Kennzeichen | Bedeutung | +|---|---| +| **[gemessen]** | Am 05.10.2026 selbst von der öffentlichen Seite abgerufen: Instagram-Profilzahlen, TikTok-Profil und Videoliste, YouTube-Kanal und Videoliste, LinkedIn- und Facebook-Seite. | +| **[Anzeige]** | TikTok markiert im Seitencode jedes Videos, ob es als Werbung lief („isAd“). Wo das so markiert ist, steht [Anzeige]. | +| **[Anzeige?]** | Vermutung: sehr viele Aufrufe, aber kaum Likes oder Kommentare. Nicht prüfbar. | +| **[Seite]** | Laut Angabe auf der Website oder in der Videobeschreibung des Anbieters. Nicht unabhängig geprüft. | +| **[Suche]** | Aus einem Suchergebnis oder Artikel, nicht selbst gesehen. | +| *Einschätzung* | Meine Schlussfolgerung, kein Beleg. | + +**Was ich nicht sehen konnte:** +- **Instagram-Inhalte.** Instagram liefert ohne Login nur Profilzahlen: Follower, gefolgt, Zahl der Beiträge. Reels, Likes und Kommentare auf Instagram habe ich nicht gesehen. Formate leite ich deshalb aus TikTok und YouTube Shorts ab. Dort laufen oft dieselben Clips. +- **Die Videos selbst** habe ich nicht angeschaut. Gesehen habe ich Titel, Beschreibungen, Datum und Kennzahlen. Wer im Bild ist, ist daraus abgeleitet. +- **Instagram rundet** ab 10.000 Followern („28K“). Solche Werte stehen hier als „rund 28.000“. +- **Websuche:** Das Suchkontingent war während der Recherche erschöpft. Einige Kandidaten (vor allem bei den Creatorn) konnte ich deshalb nicht mehr prüfen. Sie stehen nicht in der Datei, statt geraten zu werden. + +--- + +## Kurzfassung + +1. **Die großen Zahlen der Wettbewerber sind gekauft.** Fast alle Videos mit sechs- oder siebenstelligen Aufrufen bei plancraft, HERO, ToolTime, Meisterwerk und Craftnote liefen nachweislich oder sehr wahrscheinlich als Anzeige. Organisch erreichen diese Kanäle im Alltag **300 bis 1.500 Aufrufe** pro Video [gemessen]. +2. **plancraft ist der Einzige mit echtem Social-Programm:** rund 28.000 Follower auf Instagram, 13.700 auf TikTok, 3 bis 4 Videos pro Woche mit Büro-Humor aus dem eigenen Team und eine „Creator Family“ mit 14 Handwerks-Influencern. Der beste organische Clip (158.000 Aufrufe, 2.793 Mal geteilt) ist ein Teilen-Aufruf mit einer wiederkehrenden Kollegin-Figur [gemessen]. +3. **Kein Softwareanbieter zeigt seinen Gründer als Gesicht.** Im Bild sind Mitarbeitende, Kundenbetriebe oder bezahlte Creator. Ein Mitgründer, der selbst SHK-Meister ist und einen Betrieb führt, ist im Feld einmalig. +4. **SHK kommt im Software-Content kaum vor.** Die Cloud-Anbieter zeigen vor allem Maler, Dachdecker, Holz und Fliesen. Unter den 14 plancraft-Creatorn ist ein einziger Spengler. Die klassischen SHK-ERP (pds, KWP, TAIFUN, Label, MOSER, STREIT) machen Bestandskunden-Service: Tutorials, Updates, Messen, fast alles im Sie. +5. **Kein klassischer ERP-Anbieter ist auf TikTok.** Einzige Ausnahme: STREIT, seit 28.09.2026, mit 2 Videos, einem davon „Baustellenweisheiten“ [gemessen]. Bewegung gibt es also, aber spät. +6. **Serien sterben schnell.** HERO („Toto & Larry“, 4 Folgen; „Von Hand“, 2 Folgen), plancraft („#crafttalks“) und Craftnote (Interviews) haben ihre Langformate nach wenigen Folgen eingestellt. Wer eine Serie durchhält, steht im Feld allein. +7. **Die SHK-Creator-Szene ist groß, organisiert und erreichbar.** Sandra Hunke (rund 373.000 auf Instagram), Schwarzkugler (rund 119.000), Vögel aus Missen (125.400 auf TikTok, Betrieb seit 1931), Micha (20.500 auf TikTok). Die IFH/Intherm hatte 2026 einen eigenen Influencer-Treff mit 11 SHK-Creatorn. Über Büro, Organisation oder Software redet dort niemand mit Reichweite. +8. **Was organisch trägt, ist bei Creatorn und Marken gleich:** Humor mit echtem Team, Fachfehler erklärt („das machen 99 Prozent falsch“, 632.100 Aufrufe), nummerierte POV-Serien, Kundensätze und Missgeschicke, Gesetzes-News mit Geldbezug. Reine Produktclips und Recruiting-Aufrufe tragen nicht. +9. **International holen sich Software-Marken die Reichweite über Menschen, nicht über das Logo:** Podcasts mit Betriebsinhabern (Jobber, ServiceTitan), gesponserte Creator mit Wochenserie (Tradify mit PB Plumber), Anerkennungsformate (Housecall Pro „40 Under 40 Trades“), Gratis-Werkzeuge als Lead-Magnet (Jobber, 20 Tools). +10. **Die Lücke für HiveGrid:** ein SHK-Inhaber, der zugleich Gründer ist, zeigt offen den Bau der Software und die Umstellung im eigenen Betrieb, und sagt dabei als Einziger „dein Programm bleibt“. Das kann im Moment kein Wettbewerber glaubwürdig spielen. Daraus folgen 30 Formatideen in Abschnitt 5. + +--- + +## 0. Ausgangslage HiveGrid und Noah [gemessen, 05.10.2026] + +| Konto | Zahlen | Auffällig | +|---|---|---| +| [Instagram @noahgeerkens](https://www.instagram.com/noahgeerkens/) | 848 Follower, 27 Beiträge, folgt 754 | Profiltitel: „Noah Geerkens \| KI im Handwerk“ | +| [Instagram @hivegrid.de](https://www.instagram.com/hivegrid.de/) | 63 Follower, 9 Beiträge, folgt 85 | Profiltitel: „HiveGrid \| KI fürs Handwerk“ | +| [Instagram @geerkensgmbh](https://www.instagram.com/geerkensgmbh/) | 1.273 Follower, 438 Beiträge | Noahs Betrieb, auf geerkens.de verlinkt, dazu Facebook | +| TikTok @noahgeerkens | 10 Follower, 0 Videos | Unklar, ob das Noahs Konto ist | +| TikTok @hivegrid, @hivegrid.de | nicht vorhanden | wie erwartet (Kontext F18) | + +*Einschätzung:* Beide Profiltitel stellen KI nach vorn. Laut Kontext F10 soll KI aber nur dosiert und als Extra laufen. Das ist eine Frage an Dejan (Abschnitt 7). + +--- + +## 1. Wettbewerber im Social Audit + +### 1.1 Übersicht + +Alle Zahlen [gemessen] am 05.10.2026, Follower bzw. Abonnenten. „Kein Kanal“ heißt: nicht gefunden. + +| Anbieter | Instagram | TikTok | YouTube | LinkedIn | Facebook | Organischer Alltag (TikTok/Shorts) | +|---|---|---|---|---|---|---| +| **plancraft** | rund 28.000 (1.788 Beiträge) | 13.700 (670 Videos) | 2.120 (391 Videos) | 7.078 | 2.934 | 300 bis 1.100 Aufrufe | +| **HERO** | rund 13.000 (493) | 7.673 (137) | 2.120 (172) | 11.081 | 1.663 | Ausreißer 60.700 organisch | +| **ToolTime** | 7.135 (404) | 1.803 (88), still seit 28.11.2025 | 447 (28) | 5.709 | 2.330 | 400 bis 1.150 | +| **Craftnote** | 5.878 (653) | kein Kanal | 1.960 (106) | 1.715 | 3.173 | Shorts 250 bis 800 | +| **Meisterwerk** | 6.193 (folgt 3.502) | 1.579, 6 Videos, alle [Anzeige], 2022/23 | 217 | 861 | 1.602 | praktisch kein organischer Content | +| **openHandwerk** | 2.629 (folgt 7.665) | 20 (4 Videos, 2022) | 209 | 1.856 | 508 | seit etwa 3 Jahren still | +| **1Tool** | 583 | kein Kanal | kein Kanal | 1.282 | nicht gefunden | nicht branchenspezifisch | +| **Craftboxx** | 3.144 (427) | 1.688 (261) | 433 (196) | 423 | nicht geprüft | 240 bis 1.000 | +| **pds** | 2.728 (664) | kein Kanal | 1.280 (319) | 1.273 | 961 | Shorts bis 1.510 | +| **KWP** | 2.351 (705, @kwplaeuft) | kein Kanal | 233 (41) | 29 (unsicher, ob Hauptseite) | 822 | 98 bis 762 | +| **TAIFUN** (OneQrew) | 4.896 (640) | kein Kanal | 3.010 (151) | 940 | 2.061 | Mini-Tipps bis 5.447 | +| **blue:solution** (OneQrew) | 777 (196) | kein Kanal | 682 (76) | 515 | 747 | 106 bis 548 | +| **M-SOFT** (OneQrew) | 963 (112) | kein Kanal | 362 (17), letztes vor 1 Jahr | 963 | 60 | kaum Aktivität | +| **OneQrew** (Dach) | 1.322 | Konto leer | 65, keine Videos | 2.078 | 222 | Webinare | +| **STREIT** | 2.787 (143) | 35 (2 Videos, seit 28.09.2026) | 536 (52) | 685 | vorhanden, Zahl nicht lesbar | 389 bis 2.275; Short 5.100 | +| **Label** | 1.239 (283) | kein Kanal | 616 (59) | 288 | 904 | 110 bis 470 | +| **MOSER** (Craftview) | 156 (211) | kein Kanal | 346 (55) | 258 | 497 | YouTube 3 Jahre Pause | +| **MemoMeister** (Zusatz) | 1.108 (163) | nicht geprüft | 2.540 (313) | nicht lesbar | vorhanden | Podcast-Clips 3 bis 200 | + +**Nicht prüfbar:** Sander & Doll (Website down, auf Instagram nur ein leeres Konto „sanderdoll“, vermutlich nicht die Firma), TopKontor/Würth (Website per Abruf nicht erreichbar; die alten TopKontor-Videos liegen auf dem Kanal von blue:solution). + +### 1.2 Cloud-Anbieter im Detail + +#### plancraft (Hamburg) +- **Kanäle:** [Instagram @plancraft.app](https://www.instagram.com/plancraft.app/), [TikTok @plancraft](https://www.tiktok.com/@plancraft), [YouTube](https://www.youtube.com/@plancrafthandwerkersoftware), [LinkedIn plancraft-gmbh](https://www.linkedin.com/company/plancraft-gmbh/), Facebook, Newsletter. Achtung: linkedin.com/company/plancraft ist ein anderes Büro. +- **Frequenz:** 10 TikToks vom 16.09. bis 05.10.2026, also 3 bis 4 pro Woche. YouTube Shorts sind dieselben Clips [gemessen]. +- **Formate:** fast nur Büro-Humor mit eigenen Mitarbeitenden: POV, „Markier die Person“, „Wer kennts?“, Trends, Office-Tour. Dazu Messe-Clips (GaLaBau, Dach + Holz) und das Event CRAFTGAMES. Die Software ist in den Clips kaum zu sehen. +- **TikTok-Bio:** „Die geilste Software für Handwerker (Zettelwirtschaft hasst diesen Trick)“. +- **Tonalität:** albern, jung, viele Emojis, Du. +- **Wer im Bild:** Mitarbeitende aus Büro und Vertrieb. Eine wiederkehrende Figur: die Kollegin, die keine Sprichwörter kann. +- **Serien auf YouTube:** + - „#crafttalks: Stimmen des Handwerks“ mit Fräulein Handwerk, DerFliesenleger, Jörg Roos. Seit etwa einem Jahr keine Folge mehr ([Beispiel](https://www.youtube.com/watch?v=ZOO9qpufpxA), 779 Aufrufe). + - „Erfolgsgeschichten“ von Kunden (ProDach, Holzbau Isensee, Painting Phil, Nimmervoll-2 Dach): 500 bis 960 Aufrufe. + - Tutorials „SCHNELLSTART“ und „Pro-Tipps“, 2 bis 3 Jahre alt. +- **Was funktioniert [gemessen]:** + - Organisch: [„Schickt es der Person die auch keine Sprichwörter kann!“](https://www.tiktok.com/@plancraft/video/7660750625247907104) (10.07.2026): 158.000 Aufrufe, 7.379 Likes, **2.793 Mal geteilt**, 145 Kommentare. + - [Anzeige]: „Sei wie Torben und gönn dir Plancraft!“ (2023) 6,1 Mio., „Handwerker und Bock auf Freiheit?“ (2025) 3,2 Mio. Beide sind oben angepinnt. + - Normaler Büro-Humor: 300 bis 1.100 Aufrufe, 3 bis 60 Likes. +- **Creator-Programm [Creator Family](https://plancraft.com/de-de/creator-family) [Seite]:** 14 Handwerks-Creator bekommen die Software und machen Workshops, Webinare und gemeinsame Projekte. Darunter Malermeister Andy (rund 192.000 auf Instagram), DerFliesenleger (rund 48.000), Dachdeckerin Sina, Tarek Legat (Mister Handwerk 2023) und als einziger aus dem SHK-Umfeld [Spenglermeister John](https://www.instagram.com/spenglermeister_john/) (rund 30.000 auf Instagram) [gemessen]. Die Seite wirbt mit „Weniger Büro. Mehr Handwerk“. +- **Community:** Kreativ-Workshops mit dem Kollektivwerk (Denis Fiedler, Malerbetriebe in Köln), Webinar „Schluss mit Zettelwirtschaft“ am 08.10.2026 [Seite]. +- *Einschätzung:* Größte Reichweite im Feld, aber aus Anzeigen und einzelnen Teilen-Treffern. Der eigentliche Hebel sind die Creator. + +#### HERO (Hannover) +- **Kanäle:** [Instagram @hero_software](https://www.instagram.com/hero_software/), [TikTok @hero.handwerkersoftware](https://www.tiktok.com/@hero.handwerkersoftware) (nicht auf der Website verlinkt), [YouTube](https://www.youtube.com/@HERODieHandwerkersoftware), [LinkedIn](https://www.linkedin.com/company/herosoftware-gmbh/) (11.081, die größte LinkedIn-Seite im Feld), Facebook, [Community mit Akademie](https://community.hero-software.de). +- **Frequenz:** TikTok im September 2026 2 bis 3 Videos pro Woche. +- **Formate:** Baustellen-Humor und Motivation („Logisch, oder?!“, „Handwerker eben.“), kurze Produkt-Zuspitzungen („237 Fotos helfen nur, wenn du sie wiederfindest“), Kundenbetriebe als markierte Mini-Creator (@lieblingsfliesenleger_truffel, @tischlerei_maik_othmer), Launches (HERO AI, HERO Command). +- **Tonalität:** Du, motivierend, „Handwerker eben“. Bio: „Du gestaltest die Zukunft, wir machen sie digital.“ +- **Serien, alle eingeschlafen:** + - [„Toto & Larry: Der HERO Feierabend-Talk“](https://www.youtube.com/watch?v=5dBjeodrHuQ): 4 Folgen, 30 bis 56 Minuten, 164 bis 931 Aufrufe, etwa 1 Jahr alt. + - „Von Hand: Portraits aus dem Handwerk“: 2 Folgen. Darunter [„Tradition trifft Wandel“ über Steffes Zaunanlagen](https://www.youtube.com/watch?v=z0WbzQMjpWI), ein Betrieb in zweiter Generation, 7.800 Aufrufe. Der einzige Beitrag im ganzen Feld zum Generationswechsel. + - „Darauf Gebaut“: 1 Folge. +- **Was funktioniert [gemessen]:** + - Organisch: [„Wisst ihr Bescheid, ne? Oder jemand hier, der das anders sieht?“](https://www.tiktok.com/@hero.handwerkersoftware/video/7573950013647162646): 60.700 Aufrufe, 1.376 Likes, 80 Kommentare. Die Frage am Ende holt Kommentare. + - [Anzeige]: „Ihr habt gefragt und ihr bekommt!“ 692.500, „Zahlen und Schätzen ist nicht jedermanns Ding“ 261.600 (mit 10.900 Likes für eine Anzeige stark). + - YouTube [Anzeige?]: „Lagerverwaltung: 6 Tipps“ 234.664 Aufrufe bei 10 Likes. +- **Weiteres [Seite]:** kostenlose Community-Webinare als Livestream, Empfehlungsprogramm „Helden werben Helden“ (300 € pro Neukunde), HEROcon, Barcamp. HERO stellt auf der ISH 2027 aus. + +#### ToolTime (Berlin) +- **Kanäle:** [Instagram @tooltime.de](https://www.instagram.com/tooltime.de/), [TikTok @tooltime.de](https://www.tiktok.com/@tooltime.de), [YouTube](https://www.youtube.com/@tooltimesoftware), [LinkedIn](https://www.linkedin.com/company/tooltimegmbh/), Facebook. +- **Frequenz:** Letztes TikTok am 28.11.2025, seitdem still. Davor 1 bis 2 pro Monat [gemessen]. +- **Formate:** Funktions-News, Aktionen (Black Week, iPhone-Gewinnspiel, Aprilscherz „SnoozeTime“), Kundenstimmen von SHK-Betrieben (Berger Heizung Sanitär, Stefan Reisser GmbH), ein Beitrag zum „Men's Mental Health Month“, Sketch „Wer kennt es nicht? #bürokratie“ (105.038 Aufrufe auf YouTube Shorts, [Anzeige?]). +- **Tonalität:** Du. TikTok-Bio „WHAT TIME IS IT? TOOLTIME!“. Website-Claim „Klick. Klick. FEIERABEND.“ +- **Wer im Bild:** Kunden aus dem SHK-Handwerk, Produkt. +- **Was funktioniert:** Der Reisser-Spot lief als [Anzeige] (349.600 Aufrufe, 262 Likes), ebenso „Sommer ohne Papierkram“. Der organische Rest liegt bei 400 bis 1.150. +- **Weiteres:** ntv-Reportage „Zukunft des Handwerks“ (04.10.2025) [Seite], Community Day 2026 in Berlin [Seite], alter Partnerspot mit Vaillant. + +#### Craftnote (Berlin, „powered by Aceve“) +- **Kanäle:** [Instagram @craftnote.de](https://www.instagram.com/craftnote.de/), [YouTube](https://www.youtube.com/@CraftnotePoweredByAceve), [LinkedIn](https://www.linkedin.com/company/craftnote/), Facebook (3.173, die größte Facebook-Seite im Feld), Xing. **Kein TikTok.** Die TikTok-Konten mit „craftnote“ im Namen gehören einer US-App. +- **Formate:** Shorts mit Klick-Köder-Titeln („Diese eine APP hat sein Leben RUINIERT“, „Zettel sind TOT“), 250 bis 800 Aufrufe. Kundenstimmen, Webinar-Aufzeichnungen, Playlist „Digitalisierungs-Guide“. Eine Interviewreihe mit Handwerksunternehmern endete vor 5 Jahren. +- **Was funktioniert:** „Handwerk ohne Zettelchaos“ hat 598.642 Aufrufe bei 9 Likes [Anzeige?]. Dasselbe Video liegt ein zweites Mal mit 20.163 Aufrufen auf dem Kanal. +- **Tonalität:** Du, laut. + +#### Meisterwerk +- **Kanäle:** [Instagram @meisterwerk_official](https://www.instagram.com/meisterwerk_official/) (folgt 3.502 Konten, *Vermutung:* Wachstum über Folgen und Zurückfolgen), [TikTok](https://www.tiktok.com/@meisterwerk_official) (6 Videos 2022/23, alle [Anzeige], zum Beispiel „Schluss mit WhatsApp im Handwerk!“ 576.200), YouTube mit SEO-Videos („Zeiterfassung im Handwerk 2026: Die besten Apps im Vergleich“, 9 bis 147 Aufrufe) und Anleitungen zur KI-Telefonassistentin „Maxi“ in vier Sprachen, [LinkedIn](https://www.linkedin.com/company/meisterwerk-app/), Facebook. +- *Einschätzung:* Social ist bei Meisterwerk Werbefläche. Die Stärke liegt im Blog mit Seiten je Gewerk. + +#### openHandwerk und 1Tool +- **openHandwerk:** [Instagram](https://www.instagram.com/openhandwerk/) folgt 7.665 Konten bei 2.629 Followern. YouTube-Tutorials #1 bis #15 und Kundenstimmen, seit etwa 3 Jahren nichts Neues. TikTok: 4 Videos von 2022. *Einschätzung:* eingeschlafen. +- **1Tool:** keine Social-Links auf der Website. [Instagram @1tool.software](https://www.instagram.com/1tool.software/) 583, [LinkedIn](https://www.linkedin.com/company/1tool-software/) 1.282. Nicht aufs Handwerk spezialisiert. + +#### Craftboxx (Noahs Marktanalyse: „bestes Offline“) +- **Kanäle:** [Instagram @craftboxx.de](https://www.instagram.com/craftboxx.de/) („Der Auftragsplaner für Macher“), [TikTok @craftboxx.de](https://www.tiktok.com/@craftboxx.de), [YouTube](https://www.youtube.com/@craftboxx), LinkedIn. +- **Frequenz:** 3 bis 4 Videos pro Woche, keine Anzeigen [gemessen]. +- **Format:** ein Nachrichten- und Fragekanal fürs Handwerk: [„Dürfen Handwerker Trinkgeld annehmen?“](https://www.tiktok.com/@craftboxx.de/video/7689474011213974816), „Dürfen Handwerker während der Arbeitszeit am Handy sein?“, Handwerkspräsident Dittrich zu Spritpreisen, „Warum arbeiten Dachdecker rückwärts?“. Dazu Clips vom eigenen #macherfestival (Seifenkiste, Bobbycar). Mitarbeitende im Bild („Lea erklärt es euch“). +- **Interaktion:** 240 bis 1.000 Aufrufe, 7 bis 69 Likes, Shorts bis 2.500. +- *Einschätzung:* gutes Format (Fragen, die Handwerker wirklich diskutieren), aber ohne Gesicht mit Gewicht. + +### 1.3 Klassische ERP im Detail + +#### pds (Rotenburg) +- **Kanäle:** [Instagram @pdsgmbh](https://www.instagram.com/pdsgmbh/), [YouTube](https://www.youtube.com/PDSGmbH), [LinkedIn](https://www.linkedin.com/company/pds-gmbh---eine-software-voraus), [Facebook](https://www.facebook.com/PDS.GmbH/), Blog, Mediathek, pds Akademie mit 11 Standorten [Seite]. **Kein TikTok** (das Handle @pdsgmbh gehört einem fremden Privatkonto). +- **Frequenz:** etwa 1 Langvideo pro Woche, etwa 2 Shorts pro Monat seit 01/2024. +- **Serien:** „pds Anwendertipp“ (Bildschirm-Tutorials, 120 bis 460 Aufrufe), „Anwenderbericht | pds Software & App in der Praxis“ (Kunden vor Ort, 180 bis 340), „pds News #1 bis #8“ (490 bis 675), Partnerreihe „Open Masterdata und IDS“ mit Viessmann, Rexel und anderen (100 bis 145). +- **Top:** „pds Handwerkersoftware & Apps kompakt“ (2021) 31.473 Aufrufe. +- **Tonalität:** Sie. Im Bild Kunden, Mitarbeitende, Oberfläche. +- **Wichtig für HiveGrid:** [„Anbindung Ole und pds Software | KI-Fachassistenz fürs SHK-Handwerk“](https://www.youtube.com/watch?v=wp7ZYmHD-eo) (vor 10 Tagen, 962 Aufrufe) ist das stärkste neue pds-Video. Der LinkedIn-Beitrag dazu hat 35 Reaktionen, mehr als jeder andere pds-Beitrag. Satz daraus: „Der Impuls kam von gemeinsamen Kunden.“ pds erzählt Anbindungen also schon als Geschichte. Sonst bringen pds-Beiträge auf LinkedIn 4 bis 24 Reaktionen [gemessen]. + +#### KWP (Landshut) +- **Kanäle:** [Instagram @kwplaeuft](https://www.instagram.com/kwplaeuft/), [YouTube](https://www.youtube.com/user/KWPSOFTWARE), [Facebook](https://www.facebook.com/KWPLandshut) („euer Software-Partner“), Newsletter. LinkedIn-Seite mit 29 Followern, auf der Website nicht verlinkt. **Kein TikTok.** +- **Formate:** YouTube-Kurztutorials (42 bis 270 Aufrufe), Shorts-Serie „Update-News zur Handwerkersoftware kwp-bnWin.net, Version 8.1 N1 bis N5“ (98 bis 762), Recruiting-Clip. +- **Top:** „KWP Vision“ (17.12.2025) 84.579 Aufrufe bei 233 Abonnenten [Anzeige?], „Imagevideo KWP 2021/22“ 42.031. +- **Kampagne #KWPläuft [Seite]:** Mitarbeiter Armin Wölfl läuft für Spenden, KWP begleitet ihn. Daher der Instagram-Name. +- **Messen:** dichter Kalender mit Hausmessen bei Großhändlern, eltefa, gedatec, ISH-Nachlese. +- *Einschätzung:* Social ist Bestandskunden-Service und Firmenkultur. Produktmarketing findet kaum statt. + +#### TAIFUN, blue:solution, M-SOFT und die Gruppe OneQrew +- **TAIFUN** ([Instagram](https://www.instagram.com/taifun_software/) 4.896, die größte Instagram-Seite der klassischen ERP; [YouTube](https://www.youtube.com/user/TaifunSoftware) 3.010; LinkedIn 940; Facebook 2.061; Newsletter; WhatsApp-Kanal für Produktnews): + - Shorts-Serie „TAIFUN Mini-Tipp“: 48 Shorts vom 27.10.2025 bis 28.09.2026, also etwa 1 pro Woche. Top: „Rechnungsübersicht“ 5.447, „Umsatzanzeige“ 3.631 [gemessen]. + - „Tastenkürzel-Adventskalender“ im Dezember 2025. + - [„Henrik erklärt KI“](https://www.youtube.com/shorts/ySWyexFqGNI) (1.900): ein Mitarbeiter als Gesicht. + - Lange Serien: „TAIFUN Neuerungen“ je Quartal (1.600 bis 2.800), „Die ersten Schritte“ (2.700 bis 9.970), „TAIFUN Anwender im Fokus“ (Kundenbesuch Uwe Röhrs GmbH, 11.446). + - LinkedIn: „Eine Software-Demo sollte keine Verkaufsveranstaltung sein …“ (26 Reaktionen, 11 Kommentare, die meisten Kommentare unter allen ERP-Beiträgen). Dazu „Ich bin Sascha, IT Trainer und Content Creator bei TAIFUN“: ein Mitarbeiter mit offizieller Creator-Rolle. + - Tonalität: Du auf LinkedIn und in Shorts, Website gemischt. +- **blue:solution** (Instagram 777, YouTube 682): Produkt-Tutorials, Shorts-Serie mit Mitarbeiter-Porträts („, , Mitarbeiter-Portrait“) (Recruiting, 106 bis 548). Auf dem Kanal liegen alte TopKontor-Videos („Angebot erstellen | TopKontor Handwerk“, 69.115). LinkedIn mit Alltagssätzen: „Erholung beginnt dort, wo der Betrieb nicht mehr an deinem Handy hängt“ (35 Reaktionen). +- **M-SOFT** (Instagram 963, YouTube 362, seit 1 Jahr still): bester LinkedIn-Beitrag beginnt mit einer Kundenfrage: „Warum dauert es bei uns drei Wochen vom Wartungseinsatz bis zur Rechnung?“ (38 Reaktionen). +- **OneQrew** (LinkedIn 2.078, Instagram 1.322): Webinare für Inhaber, die über Software hinausgehen: „Bierdeckelkalkulation“ mit Martin Herber, Einwandbehandlung „Die andere Firma ist aber günstiger“. Strategische Partnerschaft mit SHK Deutschland mit Sonderkonditionen [Seite]. Gemeinsamer Messestand mit HalloPetra auf der SHK+E Essen. +- *Einschätzung:* Die Gruppe macht Lern-Content für Inhaber (Kalkulation, Verkauf). Das ist das Nächste an „erst helfen“ im deutschen Feld. + +#### STREIT (Haslach) +- **Kanäle:** [Instagram @streit.software](https://www.instagram.com/streit.software/) (2.787 Follower bei nur 143 Beiträgen), [TikTok @streit.software](https://www.tiktok.com/@streit.software) (neu seit 28.09.2026), [YouTube](https://www.youtube.com/user/StreitV1), LinkedIn 685, Xing, Facebook. +- **Neu auf TikTok [gemessen]:** [„Welche Baustellenweisheiten kennt ihr noch? 😂“](https://www.tiktok.com/@streit.software/video/7690500341938457879) 389 Aufrufe, [„Zu Gast bei Kohlwes SHK“](https://www.tiktok.com/@streit.software/video/7690921499783482646) (Videodreh beim Kunden) 2.275. Der Short [„Baustellenweisheiten“](https://www.youtube.com/shorts/WjA8lfEN2NY) hat auf YouTube 5.100. +- **Weitere Formate:** Kundenberichte („Erfolg im SHK-Handwerk mit STREIT, Kempf GmbH berichtet“ 492), App-Vorstellungen, „kurz erklärt“ (61.854, [Anzeige?]), Gratis-Webinare, Empfehlungsprogramm „200 € Gutschrift“ [Seite]. +- **LinkedIn:** Partnerurkunden an Großhändler (bis 61 Reaktionen), „E-Procurement im Würth-Innovationstruck“ (48). Die höchsten Reaktionswerte unter den ERP. +- **Tonalität:** Sie. Im Bild Kunden, Vertrieb mit Pokal, Baustellen-Humor. +- *Einschätzung:* STREIT bewegt sich gerade sichtbar in Richtung Shortform mit Humor und Kundenbesuch. Der einzige klassische Anbieter, der das tut. STREIT-Betriebe ruft der HiveGrid-Vertrieb laut Kontext F1 teils schon an. + +#### Label (Bielefeld, SHK) +- **Kanäle:** [Instagram @label.software](https://www.instagram.com/label.software/), [YouTube](https://www.youtube.com/channel/UCLgQtnZTuqJVV5OjgWJLiog), [LinkedIn](https://www.linkedin.com/company/label-software-gerald-bax-gmbh/), Facebook, WhatsApp-Kanal, Blog, „Label Campus“. Kein TikTok. +- **Formate:** „Tipps & Tricks in Handwerkersoftware Labelwin“ (etwa monatlich, 110 bis 470), „Tipps & Tricks Outtakes 2026“, Short „Eine Woche im Leben des Label Marketings“ (300), Imagefilm, Kundenstimmen. +- **Besonders [Seite]:** „Label Kongress“, ein Online-Kongress alle 2 Jahre seit 2024 mit Kunden als Referenten und einer Podiumsdiskussion mit 5 SHK-Betrieben zu KI. Daraus ein Fachartikel der Geschäftsführerin Nora Bax in der SBZ. +- **LinkedIn:** Kundenporträts von SHK-Betrieben (Häfele Haustechnik „vor 128 Jahren gegründet“), 1 bis 25 Reaktionen. + +#### MOSER (Würselen, SHK, gehört zu Craftview) +- **Kanäle:** [Instagram @moser_software](https://www.instagram.com/moser_software/) (nur 156 Follower bei 211 Beiträgen), [YouTube](https://www.youtube.com/c/MOSERSoftware) (zuletzt 1 Video vor 4 Monaten, davor 3 Jahre Pause), LinkedIn 258 („Moser Software GmbH by CRAFTVIEW“), Facebook 497, Newsletter. Kein TikTok. +- **Alte YouTube-Hits [Anzeige?]:** „Mobil auf der Baustelle Aufmaß aufnehmen“ 521.817, „Lust auf Perspektive? Neuer Job bei Moser“ 225.921. +- **LinkedIn:** Produktposts mit 1 bis 4 Reaktionen. Ausreißer ist ein Repost von Craftview-CEO André Rasquin: „Damit gewinne ich meine Abende zurück. Das hat mir kürzlich ein Handwerksmeister gesagt …“ (90 Reaktionen). +- *Einschätzung:* die stärkste Website-Sprache im Feld neben dem schwächsten Social-Auftritt. Der Kundensatz zieht auf LinkedIn erst, wenn ein Mensch ihn erzählt. + +#### MemoMeister (Zusatz, Baudokumentation) +- [YouTube](https://www.youtube.com/@memomeister) 2.540, [Instagram](https://www.instagram.com/memomeister_com/) 1.108 [gemessen]. +- **Gründer-Podcast [„Bauimpulse für Bau & Handwerk“](https://podcasts.apple.com/de/podcast/bauimpulse-f%C3%BCr-bau-handwerk/id1658998821)** mit Mitgründer Achim Maisenbacher: über 190 Folgen, mehr als 120 Gäste aus dem Handwerk [Suche]. MemoMeister war laut eigenem Blog außerdem Gast in sechs fremden Handwerks-Podcasts ([memomeister.com, 14.11.2025](https://memomeister.com/handwerker-podcasts/)). +- Die Podcast-Clips als Shorts bringen nur 3 bis 200 Aufrufe [gemessen]. *Einschätzung:* Der Wert liegt in Beziehungen und Gästen, nicht in Shortform-Reichweite. + +### 1.4 Querbefunde + +1. **Organisch ist das ganze Feld klein.** Typisch sind 100 bis 1.500 Aufrufe pro Clip. Die großen Zahlen sind Anzeigen. HiveGrid startet also nicht weit hinter den anderen, wenn man nur organische Reichweite vergleicht. +2. **Was organisch trägt:** Teilen-Aufrufe mit wiederkehrender Figur (plancraft), Baustellen-Wahrheiten mit Frage an die Community (HERO), Messe-Clips mit Alltagspointe, Kundenbesuch (STREIT). +3. **Wer im Bild ist:** Mitarbeitende (plancraft, Craftboxx, TAIFUN), Kunden (ToolTime, pds, Label, STREIT), bezahlte Creator (plancraft). **Kein Gründer.** Die einzige Führungskraft mit Wirkung ist Craftview-CEO Rasquin auf LinkedIn. +4. **Du und Sie:** Die Cloud-Anbieter duzen, die klassischen ERP siezen auf Website und YouTube, duzen aber zunehmend auf LinkedIn und in Shorts (TAIFUN, blue:solution). +5. **Langformate sterben.** Kein deutscher Anbieter hält derzeit einen Podcast oder eine Talk-Serie durch, außer MemoMeister mit dem Gründer-Podcast. +6. **SHK ist im Software-Content unterbesetzt.** Die Cloud-Anbieter zeigen andere Gewerke. Die SHK-ERP zeigen ihre Oberfläche. +7. **Generationswechsel** kommt genau einmal vor: im HERO-Porträt über Steffes Zaunanlagen. +8. **Anbindung als Geschichte** gibt es genau einmal: pds und Ole. Und es ist sofort der stärkste pds-Beitrag. +9. **Facebook ist überall klein** (60 bis 3.173), aber vorhanden. Laut Bitkom nutzen 57 % der Handwerksbetriebe mit Social-Media-Präsenz Facebook, 38 % Instagram, 35 % LinkedIn und nur 7 % TikTok ([Bitkom, 23.10.2025](https://www.bitkom.org/Presse/Presseinformation/Haelfte-des-Handwerks-nutzt-Social-Media)). *Einschätzung:* Inhaber erreicht man eher auf Facebook, Instagram und LinkedIn. TikTok erreicht eher Monteure und Azubis. + +--- + +## 2. Internationale Vorbilder + +Alle Zahlen [gemessen] am 05.10.2026, Programme [Seite]. + +| Marke | Instagram | TikTok | YouTube | LinkedIn | +|---|---|---|---|---| +| [Jobber](https://www.youtube.com/@Jobber) (Kanada) | rund 102.000 | Konto existiert, nicht messbar | 49.500 | 42.835 | +| [Housecall Pro](https://www.tiktok.com/@housecallpro) (USA) | rund 28.000 | 82.400 | 110.000 | 65.119 | +| [ServiceTitan](https://www.linkedin.com/company/servicetitan/) (USA) | rund 41.000 | 10.900 | 20.200 | 122.327 | +| [Tradify](https://www.tiktok.com/@tradifyhq) (NZ, AU, UK) | rund 21.000 | 5.033 | 2.420 | 11.895 | +| [Fergus](https://www.instagram.com/fergusapp/) (NZ) | 3.576 | 34 | 910 | nicht gefunden | +| simPRO | 3.022 | nicht geprüft | 2.470 | 40.190 | +| ServiceM8 | 4.362 | 2.030 | 4.240 | 2.468 | +| Workiz | rund 12.000 | 140 | nicht geprüft | 16.169 | +| Buildertrend | rund 42.000 | nicht geprüft | 8.750 | 28.293 | + +### Jobber +- **Podcast [„Masters of Home Service“](https://www.getjobber.com/podcast/):** Moderator Adam Sylvester, 100+ Folgen in 7 Staffeln, wöchentlich. Gäste sind Betriebsinhaber und Creator. Beispiel: [„He Films His Work and Spends $0 on Ads“](https://www.youtube.com/watch?v=_Dt3Mk26Y5g) mit Jacob Palmer von Palmer Electrical (8.000 Aufrufe, 04.08.2026). Thema: „Watch me work“-Videos als Quelle für Aufträge. +- **[Jobber Grants](https://www.getjobber.com/grants):** seit 2021, 2026 insgesamt 250.000 $ an 9 Betriebe. +- **[20 Gratis-Werkzeuge](https://www.getjobber.com/free-tools/):** Profit-Rechner, Vorlagen, „Home Service Score“, Vorher-Nachher-Bildeditor. +- **[Academy](https://www.getjobber.com/academy/)** mit Trend-Report und Newsletter, virtuelles Produkt-Event „Jobber Now“. +- **Top:** „How to Start a Pressure Washing Business“ 1,3 Mio. Shorts: „Stop running your business like it's the 90's“ 1 Mio., „A simple rule of thumb for pricing as a contractor“ 401.000, „Day in the Life of an HVAC technician“ mit Creatorin @HVACJess 52.000. *Einschätzung:* Die Millionenwerte bei Werbespots sind Anzeigen. Die Lern- und Preisinhalte wirken organisch. + +### Housecall Pro +- **Dachmarke [„Champion the Trades“](https://www.housecallpro.com/about/champion-the-trades/):** Newsletter TradeWire mit über 300.000 Lesern, „40 Under 40 Trades“ mit über 1.300 Nominierungen, Videoserie „The Pro You Owe“ über Mentoren, Stipendien, Facebook-Gruppen mit über 30.000 Mitgliedern. +- **„Trades Thursday“** (01.10.2026): Treffen in über 100 Städten. +- **Wettbewerb** „Top 50 Unforgettable Home Service Brand Names“. +- **[Superpro Podcast](https://www.housecallpro.com/podcasts/)** mit Mitgründer Roland Ligtenberg, 17 Folgen. +- **[Community](https://www.housecallpro.com/community/)** mit festen Live-Terminen: „Pro Power Hour“ (donnerstags, Produktschulung), „Whiteboard Wednesday“, „Quick Tip Tuesday“. +- **Shorts-Serien:** [„I Call Shotgun“](https://www.youtube.com/shorts/sEQFB4W-fMc) und [„I Spent the Day with a Plumber“](https://www.youtube.com/shorts/XGaDsIJxEMY): Ein Moderator fährt einen Tag bei einem Handwerker mit. Nur 150 bis 330 Aufrufe. +- **Bestwerte:** alte Kundengeschichten wie „Air Hawk Grew to $4M“ (378.000). + +### ServiceTitan +- **[Podcasts](https://www.servicetitan.com/podcast):** „Toolbox for the Trades“ mit Jackie Aubel, aktuell Folge 296. Themen auch Burnout und **Nachfolge im Familienbetrieb**. Dazu „Mastering ServiceTitan“ (rund 106 Folgen). +- **Konferenz [Pantheon](https://pantheon.servicetitan.com/)** (05. bis 07.10.2026, Orlando). +- **„Titan Creator Summit 2026“:** kostenloses Online-Event für Creator und Botschafter aus dem Handwerk. Aus der Beschreibung: „ServiceTitan is also expanding its team of brand ambassadors and influencers in the trades“. +- **Beste Shorts:** Bedien-Tipps („How Techs Can Add Estimates After A Job Has Been Closed“, 7.100) und ein Short mit Creator Tommy Mello (6.000). Release-Notes schlagen die Podcast-Clips. + +### Tradify +- **Gesponserter Creator:** Die TikTok-Bio von PB Plumber sagt „Sponsored by @Tradifyhq“. Seit Juli 2026 eine Wochenserie: [„We asked @pbplumber about the worst job …“](https://www.tiktok.com/@tradifyhq/video/7677852829431713045) (877), [„… why he's into job management software“](https://www.tiktok.com/@tradifyhq/video/7675254993762438417) (189). +- **„Trades React“** (2023): Handwerker reagieren auf virale Pfusch-Videos, 300 bis 3.600 Aufrufe. +- **UGC-Aktion:** Handwerker bekommen 50 £ oder 100 $ Tradify-Guthaben, wenn sie 30 bis 45 Sekunden auf der Baustelle filmen. +- **Daten-Content:** „Australia's Top-Earning Trades Report“, Stundensatz-Rechner. + +### Fergus +- Am besten laufen **Büro-Trends mit dem eigenen Team**: [„Police Sketch Artist Challenge“](https://www.youtube.com/shorts/3JJlYdZ6nLc) 2.500, [„Can Our Team Guess What Our Tradie Hotspots Report Found?“](https://www.youtube.com/shorts/NJzD12ppBxM) 1.900. Produktshorts: 36 bis 234. Monatliche Release-Folge „Fergus Unleashed“: rund 100. + +### Weitere +- **ServiceM8:** Kampagne „Sh*tList“ (2024): Betriebe erzählen in den Kommentaren, wie Kunden sie um ihr Geld gebracht haben. +- **Workiz:** KI-generierter Humor (Hamster, Vampir) bleibt bei 170 bis 310 Aufrufen. +- **simPRO** (Podcast „Trades, Tools & Talks“, rund 150 Aufrufe je Folge), **Buildertrend** (Podcast „The Building Code“, Folge 281). + +### Was übertragbar ist (*Einschätzung*) +- **Übertragbar ohne Budget:** Podcast oder Gesprächsreihe mit Inhabern, Mitfahr-Format, Creator gegen Software statt Geld, Gratis-Werkzeug als Lead-Magnet, Team-Ratespiel, Anerkennungsformate, feste Live-Termine. +- **Nicht übertragbar:** Grants, Werbespots, Konferenzen. +- **Muster:** Auch international liegen organische Kurzvideos der Software-Marken meist bei 100 bis 2.000 Aufrufen. Reichweite holen sich die Marken über Creator und Kunden vor der Kamera. + +--- + +## 3. Creator aus dem Handwerk + +### 3.1 SHK-Creator und SHK-Betriebe [gemessen, 05.10.2026] + +| Kanal | Wer | Größe | Was läuft | +|---|---|---|---| +| Sandra Hunke, [Instagram](https://www.instagram.com/sandra_hunke/), [TikTok](https://www.tiktok.com/@sandrahunke) | Anlagenmechanikerin SHK | IG rund 373.000, TT 458.800 | Baustellen-Alltag als Person. Serie „Die Baumädchen Villa“ (ein Haus, das nur Frauen bauen, bis 268.500). Top 3,7 Mio. (2023) | +| Michael Schwarzkugler, [Instagram](https://www.instagram.com/schwarzkugler_sanitaer_heizung/), [TikTok](https://www.tiktok.com/@schwarzkugler), [YouTube](https://www.youtube.com/@TeamSchwarzkugler) | **Inhaber** SHK-Meisterbetrieb, Moosburg | IG rund 119.000, TT 47.000, YT 6.290 | Humor auf Bairisch, Kundengeschichten, Pfusch. Benannte Serien: „Gschicht'n vom Schwarzkugler“, „Schwarzkugler on Tour“, „Kundenschüri“, „Heizungsmuseum“. Top: [„HE SEPP WOS ISN LOS“](https://www.tiktok.com/@schwarzkugler/video/7530227414820080918) 171.800, [„SCHWARZKUGLER DU PFUSCHER“](https://www.tiktok.com/@schwarzkugler/video/7476535515060260118) 120.800, [„KARMA REGELT DAS … Sparst am Handwerker, zoist mindestens doppelt“](https://www.tiktok.com/@schwarzkugler/video/7657650562783137057) 82.800. Kooperationen mit Grohe, Haro | +| Vögel Energie Bad Wärme, [TikTok](https://www.tiktok.com/@voegelmissen), [Instagram](https://www.instagram.com/voegel.missen/) | **SHK- und Elektrobetrieb seit 1931**, Missen. Gesichter: Martin Vögel, Timo Mahler | TT 125.400 (4,9 Mio. Likes), IG rund 31.000 | Bio „TikTok for Fun“. Team-Sketche: [„Gute Laune“](https://www.tiktok.com/@voegelmissen/video/7405992125864660256) 3,8 Mio., „Irgendwas stimmt da nicht“ 2,4 Mio., [Szene aus „Der Schuh des Manitu“](https://www.tiktok.com/@voegelmissen/video/7466861361847356694) 1,9 Mio. Serie „#tippdesmonats“. Geberit-Kooperation (106.100). Aber: [95-Jahre-Video](https://www.tiktok.com/@voegelmissen/video/7692849352011762977) nur 624, Praktikums-Aufruf 3.850 | +| Micha, [TikTok](https://www.tiktok.com/@shk_micha), [Instagram](https://www.instagram.com/shk_micha/), [YouTube](https://www.youtube.com/@Shk_micha) | SHK-Geselle | TT 20.500 (1,7 Mio. Likes), IG rund 16.000 | **Erklärvideos aus Monteurssicht:** [„Wie montiert man einen Waschtisch richtig? … machen 99 Prozent der Azubis …“](https://www.tiktok.com/@shk_micha/video/7671687249745988896) 632.100. **Nummerierte Serie:** [„POV eines Anlagenmechaniker pt.5“](https://www.tiktok.com/@shk_micha/video/7606246471494569238) 292.900, „Ein Arbeitstag als Anlagenmechaniker“ 240.600. Schwach: „Was kostet ein Badezimmer?“ 8.672 | +| Samy, [Instagram](https://www.instagram.com/samy_shk/), [TikTok](https://www.tiktok.com/@samy_shk) | Anlagenmechanikerin, Stuttgart | IG rund 22.000, TT 15.400 | Missgeschicke: [Tauchrohr zu kurz, kurz vor Feierabend](https://www.tiktok.com/@samy_shk/video/7539577011640044822) 1,7 Mio. Kundensituationen: [„POV: Der Kunde stellt ne Überwachungskamera auf“](https://www.tiktok.com/@samy_shk/video/7660803593888337185) 100.800, [„Ist wirklich nur 'ne Kleinigkeit … berühmte letzte Worte“](https://www.tiktok.com/@samy_shk/video/7622719563699850528) 27.200. Geberit-Werbung 1,0 Mio. | +| Bruno Friedmann „Nample“, [Instagram](https://www.instagram.com/nample/), [TikTok](https://www.tiktok.com/@nample) | SHK-Handwerker | IG rund 320.000, TT 366.000 | Werkzeug-Hacks, Kooperationen mit Bosch, Rothenberger, Kermi. Top: Toiletten-Sketch zu Game of Thrones 51,5 Mio. (2020) | +| Mario Schunk „Klimakönig“, [TikTok](https://www.tiktok.com/@mario.schunk76) | Unternehmer Klima und Heizung | TT 127.700, **5.389 Videos** | Viele Videos pro Tag, oft Antwort auf Kommentare, „Fakten statt Mythen“. **Kommentar-Keyword als CTA:** [„Kommentiere ‚Klima‘ und ich sende dir ein Angebot zu!“](https://www.tiktok.com/@mario.schunk76/video/7693128594075208993). Die meisten Videos unter 600 Aufrufen | +| SHK-Erfolg.de, [TikTok](https://www.tiktok.com/@shk.erfolg), [Instagram](https://www.instagram.com/shk.erfolg/) | Lernplattform Gesellen- und Meisterprüfung | TT 21.600, IG rund 17.000 | Prüfungswissen in kurz, meist 1.000 bis 25.000. Ausreißer mit Humor 172.100. Verkauft ein „Meisterpaket“ | +| Karsten Busch, [Instagram](https://www.instagram.com/heizungsfutzi1/), [TikTok](https://www.tiktok.com/@heizungsfutzi1) | Heizungsbauer | IG rund 11.000, TT 21.900 | Tägliche Baustellen-Storys, Treffer bis 2,6 Mio., sonst etwa 500 | +| Darko, [TikTok](https://www.tiktok.com/@darko.mvc) | SHK-Azubi | 2.144 Follower, 284.700 Likes aus 11 Videos | Arbeit ohne Text, ein Video 1,8 Mio. Beleg: Einzelne Videos tragen auch ohne Follower-Basis | +| Antonio, [YouTube](https://www.youtube.com/@AntonioHeizungundSanitärTipps) | Heizung und Sanitär | YT 43.900 | Reparatur-Anleitungen für Endkunden | +| Energiesparkommissar Carsten Herbert, [YouTube](https://www.youtube.com/@Energiesparkommissar) | Energieberater | YT 134.000 | Lange Erklärvideos zu Wärmepumpe und hydraulischem Abgleich, Zielgruppe Eigentümer | +| thermondo, [Instagram](https://www.instagram.com/thermondo.heizung/), [YouTube](https://www.youtube.com/@thermondode) | SHK-Großbetrieb | IG 8.948, YT 15.300 | „thermondo talk“, „Ein Tag mit Chris“, 400 bis 760 Aufrufe | +| Spenglermeister John, [Instagram](https://www.instagram.com/spenglermeister_john/) | Spenglermeister, plancraft-Creator | IG rund 30.000, TT 4.491 | Einziger SHK-naher Creator im plancraft-Programm | +| Weitere vom [IFH-Influencer-Treff](https://www.ifh-intherm.de/messe/highlights/influencer-treff/) | | IG: [@stefanbergermann](https://www.instagram.com/stefanbergermann/) rund 32.000, [@die_insta_llateurin](https://www.instagram.com/die_insta_llateurin/) 8.888, [@die.klempnerin](https://www.instagram.com/die.klempnerin/) 5.173, [@fat_sestak](https://www.instagram.com/fat_sestak/) 5.685, [@nick_shk_hh](https://www.instagram.com/nick_shk_hh/) 4.709, [@murmann_umwelttechnik](https://www.instagram.com/murmann_umwelttechnik/) 4.024 mit Tochter [@dieabwassertechnologin](https://www.instagram.com/dieabwassertechnologin/) 816, [@frauimhandwerk](https://www.instagram.com/frauimhandwerk/) rund 15.000 | Vater und Tochter im Familienbetrieb (Murmann) ist eines der wenigen Nachfolge-Bilder | + +**Geprüft und nicht gefunden** (unter naheliegenden Handles): SHK Jungs, Fliesen Kinny, Hammer & Helm, Bad Raum Design, Haustechnik Voßwinkel, Fritz Haustechnik, Simon Kliem, Moritz der Installateur. **Nicht mehr prüfbar** (Suchkontingent): Lucas Spielmann, Heizungsbauer Philipp, Heizung Neuss, Hammerschmidt, Andreas Grimm, Patrick Grunau. Diese Namen stehen deshalb nicht in der Tabelle. + +### 3.2 Andere Gewerke zum Größenvergleich [gemessen] +- Julia Schäfer „tschulique“, Maurermeisterin: [TikTok](https://www.tiktok.com/@tschulique) 1,3 Mio., Instagram rund 1 Mio. „Einfach nur auf der Baustelle den HLZ Zahnziegel vermauern“ 26,7 Mio. +- Laurin Bock „Der Holzbock“, Zimmerei: [Instagram](https://www.instagram.com/derholzbock.official/) rund 395.000, YouTube 162.000. Geschwister vor der Kamera. +- [Dachdeckerin Chiara](https://www.instagram.com/dachdeckerin_chiara/) rund 195.000, [Jenni vom Dach](https://www.instagram.com/jenni_vom_dach/) rund 124.000, [MalermeisterAndy](https://www.instagram.com/malermeisterandy/) rund 192.000 (viel Herstellerwerbung, plancraft-Creator). +- [DerFliesenleger](https://www.tiktok.com/@derfliesenleger_) TikTok 114.100. Top 4,9 Mio. (2022). Eine Stellenanzeige im Video brachte nur 5.523. +- Dach PRO (Selim Fritz), [YouTube](https://www.youtube.com/@DACHPRO) 117.000: Aus dem Creator-Kanal wurde ein Werkzeugshop. + +### 3.3 Welche Formate tragen + +**Gesehen, über mehrere Kanäle:** +1. **Humor-Sketche mit dem echten Team und Betrieb** erzeugen die größten Spitzen: Vögel 3,8 Mio., Schwarzkugler 171.800. Beides sind echte Betriebe, keine Influencer-Figuren. Vögel ist ein Familienbetrieb seit 1931, also nah an Geerkens. +2. **Erklärvideos aus Monteurssicht** mit Fehler-Haken („das machen 99 Prozent falsch“): Micha 632.100 und 218.400. +3. **POV und „Ein Tag als …“ als nummerierte Serie:** Micha pt.5 292.900. +4. **Missgeschicke und Kundensätze:** Samy 1,7 Mio., „nur 'ne Kleinigkeit“, Schwarzkugler „Du Pfuscher“ und „Sparst am Handwerker“. +5. **Satisfying-Baustelle ohne Worte:** tschulique 26,7 Mio., Darko 1,8 Mio. +6. **Benannte Serien** sind bei den Großen Standard: „Baumädchen Villa“, „Gschicht'n vom Schwarzkugler“, „Tipp des Monats“, „POV pt.X“. +7. **Herstellerkooperationen** sind das Geschäftsmodell der Szene (Geberit, Grohe, Bosch, Rothenberger, Kermi). +8. **Schwach:** Recruiting-Aufrufe (3.850 und 5.523), Kostenthemen (8.672), Jubiläen (624), Büro-Themen. **Bei keinem SHK-Creator habe ich einen starken Beitrag zu Büro, Organisation oder Software gesehen.** + +**Einschätzung:** +- In der SHK-Szene sind Gesellen und Azubis am stärksten. **Inhaber, die als Unternehmer sprechen, sind selten.** Schwarzkugler, Vögel und Klimakönig sind die Ausnahmen, und keiner redet über Betriebsführung oder Software. +- **Büro-Themen tragen nur, wenn sie in Baustellen-Humor oder eine Kundensituation verpackt sind.** plancrafts Büro-Frage „Wieviele Stunden verbringst du in der Woche mit Büroarbeit?“ kam am 05.10.2026 auf 320 Aufrufe [gemessen]. +- **Die Szene ist erreichbar:** Messe-Influencer-Treffs, Herstellertage, kleine Creator wie Micha, Samy, Heizungsfutzi oder die Murmanns. Ein Duett oder ein Gastauftritt ist realistischer als eine bezahlte Kooperation mit den Großen. + +### 3.4 Podcasts und Medien im SHK-Umfeld (Gast-Chancen für Noah) +- [SHK-Show](https://podcasts.apple.com/us/podcast/shk-show/id1600693814) von Handwerker Radio, Moderator Maximilian Herrmannsdörfer, 149 Folgen, zuletzt #148 am 03.09. [gemessen über Apple Podcasts]. [Handwerker Radio auf Instagram](https://www.instagram.com/handwerkerradio/): 4.681. +- [Handwerk 2 Go](https://podcasts.apple.com/de/podcast/handwerk-2-go-geb%C3%A4udetechnik-unternehmerwissen-f%C3%BCr/id1481547262), Gebäudetechnik und Unternehmerwissen, Christian Beyerstedt, 174 Folgen, zuletzt vor 5 Tagen. +- [SBZ-Podcasts](https://www.sbz-online.de/podcast): „SBZ ruft an“ (Praxisstimmen) und „Das Handwerk: Macht kurze Prozesse“ (Prozesse, Organisation, Digitalisierung) [Suche]. +- Bauimpulse (MemoMeister), Workerscast (Jörg Mosler), Handwerksimpulse, Mission Geiles Handwerk, Handwerksmensch (Maren Ulbrich) laut [MemoMeister-Liste](https://memomeister.com/handwerker-podcasts/). +- *Einschätzung:* Der Podcast „Das Handwerk: Macht kurze Prozesse“ passt thematisch am genauesten zu HiveGrid. + +--- + +## 4. B2B-Vorbilder für Shortform + +Alle Zahlen [gemessen] am 05.10.2026. **Wichtig:** Viele Aufrufe ohne Kommentare sind meist Anzeigen. Als Vorbild zählen hier nur Clips mit Shares und Saves. + +### DACH +| Marke oder Person | Größe | Format | Was trägt | +|---|---|---|---| +| [Steuerfabi](https://www.tiktok.com/@steuerfabi) (Fabian Walter), Creator und Lexware-Partner | TT 756.600, IG rund 500.000 | Talking-Head mit tagesaktuellen Steuer- und Gesetzesnews | [„Ab morgen, dem 1. Oktober, gilt der Tankrabatt …“](https://www.tiktok.com/@steuerfabi/video/7691110342004378912): 305.500 Aufrufe, 4.747 Shares. Normale Videos 3.000 bis 10.000 | +| [Lexware](https://www.tiktok.com/@lexware) | TT 162.000, IG rund 30.000 | Gründergeschichten „Tell Your Story“, Creator-Kooperation mit Steuerfabi, Büro-Humor | Steuerfabi-Kooperation 1,5 Mio. bei 19 Kommentaren [Anzeige?]. **Am 05.10.2026 lief ein Clip direkt fürs Handwerk:** „Du bist Handwerkerin oder Handwerker geworden, um zu bauen. Nicht, um Belege zu sortieren.“ (621) | +| [Qonto Deutschland](https://www.tiktok.com/@qonto_deutschland) | TT 16.400 | Kurzporträts von Gründerinnen | [„Period.“](https://www.tiktok.com/@qonto_deutschland/video/7646818618218417441) 168.600, 136 Kommentare. Die Reihe „Jobraten“ mit Creatorn nur 150 bis 530 | +| [sevDesk](https://www.tiktok.com/@sevdesk_official) | TT 79.900 | als „(Anzeige)“ markierte Produktbotschaften | Warnbeispiel: letzte zehn Videos 197 bis 511 Aufrufe, 0 bis 6 Likes | +| [Accountable](https://www.tiktok.com/@accountable.de) | TT 7.578, IG rund 36.000 | Straßenumfrage-Serie („Was nervt dich am meisten?“) | 10 Clips an einem Tag, 399 bis 1.121. Billig zu drehen, kleine Reichweite | +| [Christoph Magnussen](https://www.youtube.com/@christophmagnussen) (Blackboat) | YT 139.000, TT 18.700 | Der Chef erklärt selbst, nüchtern, regelmäßig | Nachrichtenanlässe tragen (12.300), sonst 800 bis 2.400 | +| [MyHammer](https://www.tiktok.com/@myhammer.de) | TT 27.300 | Plattform für Handwerker | 34,7 Mio. bei 0 Kommentaren [Anzeige?]. Organisch 340 bis 3.117 | +| DATEV, [YouTube](https://www.youtube.com/@datev) | YT 12.700 | Azubi-Shorts | 1.400 bis 3.200 | + +### International (zum Vergleich) +| Marke | Größe | Was trägt | +|---|---|---| +| [Zapier](https://www.tiktok.com/@zapier) | TT 86.600 | **Konkrete Automations-Tutorials:** [„Automatically create a daily summary of your emails“](https://www.tiktok.com/@zapier/video/7276069147077774622) 3,9 Mio., 1.126 Saves, 1.119 Shares. Aktuelle Sketche 333 bis 1.100 | +| [Factorial](https://www.tiktok.com/@factorial) (HR-Software) | TT 20.200 | **Gesetz erklärt für Chefs:** [EU-Lohntransparenz](https://www.tiktok.com/@factorial/video/7633815286692564246) 457.200, 1.488 Kommentare, 8.826 Shares, 6.239 Saves. CEO-Clips unter 1.500 | +| [Ramp](https://www.tiktok.com/@ramp) | TT 16.700 | Promi-Stunts (6,1 Mio.). Braucht Budget | +| [Corporate Natalie](https://www.tiktok.com/@corporatenatalie) | TT 858.700 | Creatorin baut Produkte in Büro-Humor ein (Adobe 572.600) | +| monday.com | TT 29.000 | Serie „#sandwichclass“ mit fester Figur, 2.522 bis 8.601 | +| Notion, Canva | TT 143.700, 948.400 | Community-Programme, Tipps, Creator | + +### Was sich übertragen lässt (*Einschätzung*) +1. **Nutzwert schlägt Sketch.** Die organischen Treffer bei Zapier, Factorial und Steuerfabi sind konkrete Abläufe oder Gesetzes-News. Marken-Sketche bleiben fast immer unter 1.000 Aufrufen. Ausnahme: Sketche mit echtem Team und wiederkehrender Figur (plancraft, Vögel). +2. **Gesicht schlägt Logo.** Gründer- und Unternehmergeschichten tragen (Qonto, Lexware), ebenso ein Fachmann als feste Figur (Steuerfabi, Magnussen). Das stützt Noah als Zugpferd. +3. **Der Steuerfabi-Mechanismus passt zu Noah:** ein Meister erklärt neue Regeln mit Geldbezug in 60 Sekunden. Solche Videos werden geteilt und gespeichert. +4. **Lexware wirbt bereits gezielt um Handwerker** mit der Kombination aus Creator und Marke. HiveGrid kann das mit Noah ohne Budget nachstellen: Noah ist Creator und Mitgründer in einer Person. + +--- + +## 5. Formatbibliothek + +30 Ideen, getrennt nach Noahs Account und den HiveGrid-Accounts. + +**Rahmen aus dem Kontext**, der für alle Ideen gilt: +- Keine erfundenen Zahlen, Kunden oder Ergebnisse. Bis Geerkens im Alltag mit HiveGrid arbeitet, gibt es keinen Kundenbeleg (Kontext F5). +- Den Bau offen zeigen ist erwünscht (F6). Automatisierung ohne Angst ist das gewählte Zusatzthema (F12). KI nur dosiert (F10). +- Grundformat ist Noah mit B-Roll und lesbaren Untertiteln. Animation nur, wenn sie erklärt, höchstens etwa ein animiertes Erklärvideo pro Woche (Davids Papier). +- Überall Du (F11). Nicht verwenden: „Feierabend“ (ToolTime), „Weniger Büro, mehr Handwerk“ (plancraft), das Motiv „Freitag, 17:40“ in der Nähe von MOSERs „Das Angebot? Schreib ich heut Abend“. +- Funnel-Stufen: **oben** (Aufmerksamkeit), **Mitte** (Vertrauen, Verständnis), **unten** (Gespräch, Demo). + +### 5.1 Noahs Account (Instagram `noahgeerkens`, dazu Noahs LinkedIn) + +**N1 „Meister reagiert“** +- **Ablauf:** Noah reagiert per Stitch oder Duett auf ein virales Pfusch- oder Baustellenvideo. Erst die fachliche Einordnung, dann ein Satz aus Chefsicht: was so ein Fehler im Betrieb kostet, wer ihn bemerkt, wo die Info hängen bleibt. +- **Kanal:** Instagram Reels, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** Tradify „Trades React“ (siehe Abschnitt 2), Schwarzkugler [„SCHWARZKUGLER DU PFUSCHER“](https://www.tiktok.com/@schwarzkugler/video/7476535515060260118) (120.800) +- **Botschaft:** Noah ist einer von euch. Fachlich ernst, nicht belehrend. + +**N2 „Nur 'ne Kleinigkeit“ (Kundensätze)** +- **Ablauf:** Noah spielt einen typischen Kundensatz nach („Ist nur 'ne Kleinigkeit“, „Können Sie nicht eben schnell …“) und zeigt in 15 Sekunden, was daraus im Betrieb wird: Anruf, Zettel, Rückruf, falscher Monteur. Nummerierte Serie. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** Samy [„Ist wirklich nur 'ne Kleinigkeit … berühmte letzte Worte“](https://www.tiktok.com/@samy_shk/video/7622719563699850528) (27.200), Schwarzkugler [„Sparst am Handwerker, zoist mindestens doppelt“](https://www.tiktok.com/@schwarzkugler/video/7657650562783137057) (82.800) +- **Botschaft:** Der Alltag im SHK-Betrieb besteht aus Übergaben. Ohne Vorwurf an den Zuschauer. + +**N3 „POV: Chef im SHK-Betrieb, Teil X“** +- **Ablauf:** Ich-Perspektive aus Noahs Tag als Chef, nummeriert: 6:45 Uhr der erste Anruf, der Monteur ohne Schlüssel, das Angebot, das jemand im Kopf hat. Ein Moment pro Folge, kein Produkt. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** Micha [„POV eines Anlagenmechaniker pt.5“](https://www.tiktok.com/@shk_micha/video/7606246471494569238) (292.900) +- **Botschaft:** Noahs Satz „Das Wissen liegt an einem anderen Ort als die Arbeit.“ Die Perspektive des Chefs fehlt in der Creator-Szene. + +**N4 „Meister erklärt in 60 Sekunden“** +- **Ablauf:** Ein typischer Fachfehler aus Montage oder Wartung, erklärt von Noah als Meister, mit Baustellen-B-Roll aus dem eigenen Betrieb. Haken am Anfang, zum Beispiel: „Diesen Fehler sehe ich ständig.“ Nur sagen, wenn es stimmt. +- **Kanal:** Instagram, TikTok, YouTube Shorts · **Funnel:** oben · **Aufwand:** niedrig bis mittel +- **Vorbild:** Micha [„Wie montiert man einen Waschtisch richtig?“](https://www.tiktok.com/@shk_micha/video/7671687249745988896) (632.100) +- **Botschaft:** Kompetenz. HiveGrid kommt von jemandem, der das Handwerk kann. + +**N5 „Neue Regel, kurz erklärt“** +- **Ablauf:** Wenn sich etwas für SHK-Betriebe ändert (Förderung, Gebäudeenergiegesetz, Pflichten bei Rechnungen, Fristen), erklärt Noah in 60 Sekunden, was das für den Betrieb heißt. Nur mit geprüfter Quelle, am Tag der Nachricht. +- **Kanal:** Instagram, TikTok, LinkedIn · **Funnel:** oben bis Mitte · **Aufwand:** mittel (Recherche) +- **Vorbild:** Steuerfabi [Tankrabatt](https://www.tiktok.com/@steuerfabi/video/7691110342004378912) (305.500, 4.747 Shares), Factorial [EU-Lohntransparenz](https://www.tiktok.com/@factorial/video/7633815286692564246) (457.200, 6.239 Saves) +- **Botschaft:** Noah denkt wie ein Inhaber. Nebenbei: „Dein Branchenprogramm macht das, wir verbinden es.“ Kein Versprechen von Funktionen, die HiveGrid nicht hat (zum Beispiel Rechnungen). + +**N6 „Antwort auf deinen Kommentar“** +- **Ablauf:** Noah beantwortet einen echten Kommentar per Video, sichtbar eingeblendet. Jedes zweite Video endet mit einer offenen Frage, die Kommentare holt („Oder seht ihr das anders?“). +- **Kanal:** Instagram, TikTok · **Funnel:** oben bis Mitte · **Aufwand:** niedrig +- **Vorbild:** HERO [„Wisst ihr Bescheid, ne? Oder jemand hier, der das anders sieht?“](https://www.tiktok.com/@hero.handwerkersoftware/video/7573950013647162646) (60.700, 80 Kommentare), Klimakönig [Antwort-Videos](https://www.tiktok.com/@mario.schunk76) +- **Botschaft:** Nahbar. Hier redet einer zurück. + +**N7 „Baustellenweisheiten aus vier Generationen“** +- **Ablauf:** Ein Spruch pro Folge, den man bei Geerkens seit Generationen sagt, gesprochen von Noah oder einem Kollegen. Am Ende die Frage: „Welchen kennt ihr noch?“ Gut als Teilen-Aufforderung. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** STREIT [„Baustellenweisheiten“](https://www.youtube.com/shorts/WjA8lfEN2NY) (5.100 auf YouTube), plancraft [Sprichwörter-Clip](https://www.tiktok.com/@plancraft/video/7660750625247907104) (158.000, 2.793 Shares) +- **Botschaft:** Herkunft. Tradition, die bleibt. STREIT hat das Format gerade erst gestartet, also schnell sein. + +**N8 „Wo ist das Wissen?“ (Team-Sketch)** +- **Ablauf:** Kurzer Sketch mit dem echten Geerkens-Team: Der Monteur steht beim Kunden und sucht eine Info, die nur jemand im Büro im Kopf hat. Die Telefonkette eskaliert. Wiederkehrende Figuren, ohne Produkt. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** mittel (Team muss mitspielen) +- **Vorbild:** Vögel [„Gute Laune“](https://www.tiktok.com/@voegelmissen/video/7405992125864660256) (3,8 Mio.) und [„Schuh des Manitu“](https://www.tiktok.com/@voegelmissen/video/7466861361847356694) (1,9 Mio.), beide mit echtem SHK-Team +- **Botschaft:** Das Problem ist die Übergabe, nicht die Leute. Passt zu „Dem Leser kein Problem unterstellen“: Der Witz geht auf die eigene Firma. + +**N9 „Meister fährt mit“** +- **Ablauf:** Noah begleitet einen anderen SHK-Inhaber einen halben Tag und fragt: Wie läuft bei euch Planung, Büro, Übergabe? Kein Pitch, nur zuhören. Daraus 3 bis 5 Clips. +- **Kanal:** Instagram, LinkedIn, YouTube · **Funnel:** Mitte · **Aufwand:** mittel +- **Vorbild:** Housecall Pro [„I Call Shotgun“](https://www.youtube.com/shorts/sEQFB4W-fMc) und [„I Spent the Day with a Plumber“](https://www.youtube.com/shorts/XGaDsIJxEMY). Dort nur 150 bis 330 Aufrufe. Der Wert liegt im Kontakt zum Betrieb, nicht in der Reichweite. +- **Botschaft:** „Ein Betrieb ist kein Rechteck.“ Jeder Betrieb arbeitet anders, HiveGrid passt sich an. + +**N10 „Frag den Monteur“ (Duett mit SHK-Creatorn)** +- **Ablauf:** Noah stellt kleinen SHK-Creatorn eine Frage und schneidet die Antworten zusammen: „Was nervt dich am meisten an der Organisation in deiner Firma?“ Als Duett oder per Sprachnachricht. Die Creator teilen den Beitrag. +- **Kanal:** Instagram (Collab), TikTok · **Funnel:** oben · **Aufwand:** mittel (Absprachen) +- **Vorbild:** Tradify mit PB Plumber, [„We asked @pbplumber about the worst job …“](https://www.tiktok.com/@tradifyhq/video/7677852829431713045). Kandidaten: [Micha](https://www.tiktok.com/@shk_micha), [Samy](https://www.instagram.com/samy_shk/), [Heizungsfutzi](https://www.instagram.com/heizungsfutzi1/), [die.klempnerin](https://www.instagram.com/die.klempnerin/), [nick_shk_hh](https://www.instagram.com/nick_shk_hh/) +- **Botschaft:** Der Monteur ist der Maßstab. HiveGrid hört der Baustelle zu. + +**N11 „Ein Satz, eine Baustelle“** +- **Ablauf:** Ruhige Baustellen-Aufnahme aus dem Betrieb ohne Musik-Overkill (Rohre pressen, Heizraum vorher und nachher), darüber ein einziger Satz von Noah als Text. Wenig Aufwand, gut als Lückenfüller. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** tschulique (26,7 Mio., [TikTok](https://www.tiktok.com/@tschulique)), Darko ([TikTok](https://www.tiktok.com/@darko.mvc), 1,8 Mio. bei 2.144 Followern) +- **Botschaft:** Anerkennung für das Handwerk. Erst Handwerk, dann Software. + +**N12 „Vierte Generation“** +- **Ablauf:** Noah zeigt etwas aus der Geschichte des Betriebs (altes Auftragsbuch, Karteikarten, erste Firmenwagen) und fragt: Was davon gilt heute noch? Pointe: Was gut läuft, bleibt. Kurz, ohne Pathos. +- **Kanal:** Instagram, LinkedIn · **Funnel:** Mitte · **Aufwand:** niedrig +- **Vorbild:** HERO [„Tradition trifft Wandel“](https://www.youtube.com/watch?v=z0WbzQMjpWI) (7.800), Schwarzkugler mit der HWK: „Übernehmt Betriebe mit Vorgeschichte. Führt Traditionen weiter, aber macht sie auf eure Art.“ Warnung: Vögels [95-Jahre-Video](https://www.tiktok.com/@voegelmissen/video/7692849352011762977) kam nur auf 624. Jubiläum allein trägt nicht, die Frage muss tragen. +- **Botschaft:** „Ein Betrieb, der läuft, gehört nicht umgebaut.“ Berührt Nachfolge, ohne sie zum Thema zu machen (siehe Frage in Abschnitt 7). + +**N13 „Noah zu Gast“ (Podcast-Tour)** +- **Ablauf:** Noah geht als Gast in bestehende Handwerks-Podcasts und erzählt die Gründergeschichte: SHK-Betrieb, Branchenprogramm nicht wechselbar, trotzdem mehr gewollt. Aus jeder Folge 2 bis 3 Clips für Instagram und LinkedIn. +- **Kanal:** Podcasts, dann Instagram und LinkedIn · **Funnel:** Mitte · **Aufwand:** niedrig (Anfragen schreiben) +- **Vorbild:** MemoMeister war in [sechs fremden Podcasts zu Gast](https://memomeister.com/handwerker-podcasts/). Ziele: [SHK-Show](https://podcasts.apple.com/us/podcast/shk-show/id1600693814), [Handwerk 2 Go](https://podcasts.apple.com/de/podcast/handwerk-2-go-geb%C3%A4udetechnik-unternehmerwissen-f%C3%BCr/id1481547262), [SBZ „Das Handwerk: Macht kurze Prozesse“](https://www.sbz-online.de/podcast), [Bauimpulse](https://podcasts.apple.com/de/podcast/bauimpulse-f%C3%BCr-bau-handwerk/id1658998821) +- **Botschaft:** Die Gründergeschichte als Beleg über Herkunft. „Entwickelt in einem SHK-Betrieb.“ + +**N14 „Inhaber-Notiz“ (LinkedIn)** +- **Ablauf:** Einmal pro Woche ein kurzer Textbeitrag auf Noahs LinkedIn: ein Satz, den ein Kollege, Monteur oder Kunde diese Woche gesagt hat, und was Noah daraus als Chef und Gründer mitnimmt. Gern mit Foto aus dem Betrieb. +- **Kanal:** LinkedIn · **Funnel:** Mitte · **Aufwand:** niedrig +- **Vorbild:** Craftview-CEO André Rasquin: „Damit gewinne ich meine Abende zurück. Das hat mir kürzlich ein Handwerksmeister gesagt …“ (90 Reaktionen, der Bestwert unter den gesichteten ERP-Beiträgen). [LinkedIn MOSER/Craftview](https://www.linkedin.com/company/moser-software-gmbh/) +- **Botschaft:** Noah ist zugleich Kunde, Meister und Gründer. Kein anderer Anbieter hat so jemanden. + +### 5.2 HiveGrid-Accounts (Instagram `hivegrid.de` und Facebook, LinkedIn-Seite, TikTok, Newsletter) + +**H1 „Ein Ablauf in 30 Sekunden“** +- **Ablauf:** Einer der 30 Golden Flows aus dem Demo-Workspace pro Folge: „Wenn in KWP ein Auftrag angelegt wird, passiert in HiveGrid …“. Bildschirmaufnahme mit realistischen SHK-Daten, Noahs Stimme, ein Satz zum Nutzen. Nur zeigen, was zuverlässig läuft. +- **Kanal:** Instagram (als Collab mit Noah), TikTok, LinkedIn · **Funnel:** Mitte · **Aufwand:** mittel +- **Vorbild:** Zapier [„daily summary of your emails“](https://www.tiktok.com/@zapier/video/7276069147077774622) (3,9 Mio., 1.126 Saves), TAIFUN „Mini-Tipp“ (wöchentlich, bis 5.447) +- **Botschaft:** Verbinden statt ersetzen. Dein Branchenprogramm bleibt, die Abläufe drumherum laufen von selbst. + +**H2 „Was, wenn's schiefgeht?“** +- **Ablauf:** Pro Folge eine Angst vor Automatisierung und die ehrliche Antwort im Produkt: Probelauf vor dem Start, 24 Stunden rückgängig, ein Mensch gibt frei. Kurz, ruhig, mit Bildschirm. +- **Kanal:** Instagram, LinkedIn, Facebook · **Funnel:** Mitte bis unten · **Aufwand:** mittel +- **Vorbild:** ServiceTitan „How Techs Can Add Estimates After A Job Has Been Closed“ (7.100, bester Short: Fehler korrigieren), Craftnotes Risikoumkehr auf der Website („Die hinterlegten Daten bleiben Dir auch danach erhalten“, siehe `HiveGrid-Website/docs/recherche/01-wettbewerb-handwerk.md`) +- **Botschaft:** Automatisierung ohne Angst (F12). Antwort auf die größte Sorge laut Bitkom: Kontrollverlust. + +**H3 „Baustelle HiveGrid“ (Entwicklungstagebuch)** +- **Ablauf:** Einmal pro Woche ein kurzer Blick in die Entwicklung: was diese Woche gebaut, gefunden oder repariert wurde, und wer im Team daran saß. Ehrlich, auch mit Bugs. +- **Kanal:** Instagram, LinkedIn · **Funnel:** Mitte · **Aufwand:** niedrig +- **Vorbild:** Label „Eine Woche im Leben des Label Marketings“ (300, [YouTube](https://www.youtube.com/channel/UCLgQtnZTuqJVV5OjgWJLiog)), TAIFUN mit Sascha als „Content Creator“ im Team, Fergus [„Making My Coworkers Star In My Videos“](https://www.youtube.com/shorts/VrHKRHEkmLo) +- **Botschaft:** „Wir bauen das mit dem Handwerk“ (F6). Unfertig als Stärke, nicht als Makel. + +**H4 „Die Umstellung bei Geerkens“** +- **Ablauf:** Doku-Serie ab dem Tag, an dem Geerkens HiveGrid im Alltag nutzt: Tag 1, Woche 1, Monat 1. Was klappt, was nicht, was die Monteure sagen, was mit dem Branchenprogramm passiert (nämlich nichts). +- **Kanal:** Instagram, YouTube, LinkedIn · **Funnel:** Mitte bis unten · **Aufwand:** mittel +- **Vorbild:** Sandra Hunke, Serie „Die Baumädchen Villa“ (bis 268.500, [TikTok](https://www.tiktok.com/@sandrahunke)), ein Projekt als fortlaufende Geschichte. HERO „Von Hand“ für den Porträt-Ton. +- **Botschaft:** Der erste echte Beleg. „Dein ERP bleibt“ zeigt sich, statt behauptet zu werden. + +**H5 „Du hast KWP? / Du hast pds?“** +- **Ablauf:** Je eine kurze Folge pro angebundenem Programm: was bleibt, wie die Verbindung aussieht, welche Daten fließen, was es extra kostet (API-Lizenz bei pds, API-Bereiche bei KWP). Danach ein Kommentar-Keyword für das passende PDF. +- **Kanal:** Instagram, Facebook, LinkedIn · **Funnel:** unten · **Aufwand:** mittel +- **Vorbild:** pds [„Anbindung Ole und pds Software“](https://www.youtube.com/watch?v=wp7ZYmHD-eo) (stärkstes neues pds-Video, 35 Reaktionen auf LinkedIn), pds-Partnerreihe „Open Masterdata“ +- **Botschaft:** Du musst nichts wechseln. Ehrlich bei den Kosten, wie in Kontext 7.4. + +**H6 „Entwickler raten Handwerk“** +- **Ablauf:** Das Softwareteam muss SHK-Begriffe erklären (Aufmaß, Strangsanierung, hydraulischer Abgleich), Noah löst auf. Lustig, weil das Team ehrlich falsch liegt. +- **Kanal:** Instagram, TikTok · **Funnel:** oben · **Aufwand:** niedrig +- **Vorbild:** Fergus [„Can Our Team Guess …“](https://www.youtube.com/shorts/NJzD12ppBxM) (1.900) und [„Police Sketch Artist Challenge“](https://www.youtube.com/shorts/3JJlYdZ6nLc) (2.500), die besten Fergus-Shorts +- **Botschaft:** Das Team lernt Handwerk von einem Meister. Entwickelt in einem SHK-Betrieb, nicht im Elfenbeinturm. + +**H7 „Betriebs-Check“ (Lead-Magnet)** +- **Ablauf:** Ein Selbsttest als PDF: „Wo gehen in deinem Betrieb Infos verloren?“ mit 10 Fragen zu Übergaben, Terminen, Rückrufen. Im Reel ein Kommentar-Keyword, danach per ManyChat erst das PDF, dann die freiwillige Einladung zum Gespräch. +- **Kanal:** Instagram, Facebook, Newsletter · **Funnel:** unten · **Aufwand:** mittel (einmalig) +- **Vorbild:** Jobbers [20 Gratis-Werkzeuge](https://www.getjobber.com/free-tools/), OneQrews „Preisatlas Handwerk“, Klimakönigs [Kommentar-Keyword](https://www.tiktok.com/@mario.schunk76/video/7693128594075208993) +- **Botschaft:** Erst helfen, dann fragen. Keine Demo-Ankündigung. + +**H8 „Chef-Frage der Woche“** +- **Ablauf:** Eine echte Frage eines SHK-Inhabers als Aufhänger („Warum weiß mein Büro nicht, wo der Monteur gerade ist?“), darunter eine konkrete Antwort in 5 Slides, mit oder ohne HiveGrid. +- **Kanal:** LinkedIn (Seite), Instagram-Karussell, Facebook · **Funnel:** Mitte · **Aufwand:** niedrig (mit dem Post-Generator) +- **Vorbild:** M-SOFT auf LinkedIn: „Gute Gespräche beginnen mit den richtigen Fragen. ‚Warum dauert es bei uns drei Wochen vom Wartungseinsatz bis zur Rechnung?‘“ (38 Reaktionen, bester M-SOFT-Beitrag) +- **Botschaft:** Konkret statt pauschal. HiveGrid kennt die Fragen aus dem Betrieb. + +**H9 „Was HiveGrid nicht kann“** +- **Ablauf:** Eine Reihe, die offen sagt, was HiveGrid bewusst nicht macht (zum Beispiel Rechnungen, weil das dein Branchenprogramm macht) und warum. Ein Thema pro Beitrag, ruhig erklärt. +- **Kanal:** LinkedIn, Instagram · **Funnel:** Mitte · **Aufwand:** niedrig +- **Vorbild:** TAIFUN auf LinkedIn: „Eine Software-Demo sollte keine Verkaufsveranstaltung sein …“ (26 Reaktionen, 11 Kommentare, die meisten Kommentare im ERP-Feld). Dazu die eigene Regel „Genau ein freiwilliges, frühes Eingeständnis einer Schwäche“ (Kontext 9.4). +- **Botschaft:** „Wir ersetzen dein Branchenprogramm nicht. Das ist der Punkt.“ Voraussetzung: Die Website muss vorher dieselbe Linie fahren (DATEV, Rechnungen, Kontext 9.7). + +**H10 „SHK-Betrieb der Woche“** +- **Ablauf:** HiveGrid stellt einen fremden SHK-Betrieb vor, der etwas besonders gut macht (Ausbildung, Firmenwagen, Kundenservice, Social Media). Mit Erlaubnis und Markierung, der Betrieb teilt den Beitrag. +- **Kanal:** Instagram, Facebook, LinkedIn · **Funnel:** oben bis Mitte · **Aufwand:** niedrig +- **Vorbild:** Housecall Pro [„Champion the Trades“](https://www.housecallpro.com/about/champion-the-trades/) mit „40 Under 40 Trades“ und „Top 50 Unforgettable Home Service Brand Names“ +- **Botschaft:** Anerkennung statt Belehrung (Forsa: Nur 61 % erleben Wertschätzung). Nebeneffekt: Kontakt zu Betrieben der Zielgruppe. + +**H11 „Welches Programm habt ihr?“ (Messe-Umfrage)** +- **Ablauf:** Auf Messen und Hausmessen fragt Noah oder das Team Inhaber am Stand: „Welches Programm nutzt ihr, und was fehlt euch daran?“ Viele kurze Clips an einem Tag. +- **Kanal:** Instagram, TikTok, LinkedIn · **Funnel:** oben bis Mitte · **Aufwand:** mittel (Messebesuch) +- **Vorbild:** Accountable, Straßenumfrage-Serie ([TikTok](https://www.tiktok.com/@accountable.de)), Craftboxx [Fragen-Format](https://www.tiktok.com/@craftboxx.de/video/7689474011213974816). Anlass: [ISH 2027, 15. bis 19.03.2027](https://ish.messefrankfurt.com/frankfurt/de.html). HERO, OneQrew, pds und STREIT stellen dort aus. +- **Botschaft:** Jeder hat schon ein Programm. Genau dafür ist HiveGrid gebaut. + +**H12 „24 Abläufe bis Weihnachten“** +- **Ablauf:** Adventskalender im Dezember 2026: jeden Tag ein Golden Flow als Karussell oder 15-Sekunden-Clip. Die 30 Flows sind schon dokumentiert. +- **Kanal:** Instagram, LinkedIn, Newsletter · **Funnel:** Mitte · **Aufwand:** mittel (gebündelt vorproduzieren) +- **Vorbild:** TAIFUN „Tastenkürzel-Adventskalender“ (Dezember 2025, [YouTube](https://www.youtube.com/user/TaifunSoftware)) +- **Botschaft:** Was HiveGrid im Alltag abnimmt, konkret und in kleinen Portionen. + +**H13 „Post aus Rheinberg“ (Newsletter)** +- **Ablauf:** Einmal im Monat eine kurze Mail: ein Absatz von Noah aus dem Betrieb, ein Ablauf, eine Frage an die Leser, ein Hinweis auf neue Folgen. Keine Produktliste. +- **Kanal:** Newsletter · **Funnel:** Mitte bis unten · **Aufwand:** niedrig +- **Vorbild:** Housecall Pro TradeWire (über 300.000 Leser laut [Seite](https://www.housecallpro.com/about/champion-the-trades/)), Jobber [Academy-Newsletter](https://www.getjobber.com/academy/) +- **Botschaft:** Beständigkeit und Nähe. Hält Kontakte warm, bis der Zeitpunkt für ein Gespräch passt. + +**H14 „Der Keller-Test“** +- **Ablauf:** Ein Monteur von Geerkens nutzt die mobile Web-App unter echten Bedingungen: eine Hand, Handschuhe, Heizungskeller. Er kommentiert ehrlich, was gut geht und was nicht. +- **Kanal:** Instagram, TikTok · **Funnel:** Mitte · **Aufwand:** mittel +- **Vorbild:** Micha [„Ein Arbeitstag als Anlagenmechaniker“](https://www.tiktok.com/@shk_micha) (240.600), Monteurssicht als Perspektive +- **Botschaft:** „Der Monteur ist der Maßstab“ (Kontext 7.1). Achtung: Offline-Fähigkeit nur zeigen, wenn sie wirklich da ist. + +**H15 „Frag die Entwickler“** +- **Ablauf:** Fragen aus Kommentaren oder vom Geerkens-Team („Kann HiveGrid X?“) beantwortet ein Entwickler direkt vor der Kamera mit Ja, Nein oder „bauen wir gerade“. Feste Folge pro Woche. +- **Kanal:** Instagram, LinkedIn · **Funnel:** Mitte · **Aufwand:** niedrig +- **Vorbild:** Housecall Pro mit festen Terminen „Quick Tip Tuesday“ und „Pro Power Hour“ ([Community](https://www.housecallpro.com/community/)) +- **Botschaft:** Gebaut mit dem Handwerk. Ehrliche Grenzen statt Funktionsliste. + +**H16 „Demo ohne Verkauf“ (Live)** +- **Ablauf:** Einmal im Monat ein Live-Termin (Instagram oder LinkedIn Live, später Webinar): Noah und ein Entwickler zeigen einen Ablauf im Demo-Workspace und beantworten Fragen. Aufzeichnung zerschneiden. +- **Kanal:** LinkedIn Live, Instagram Live, Newsletter · **Funnel:** unten · **Aufwand:** mittel +- **Vorbild:** HERO Community-Webinare als Livestream, OneQrew-Webinare für Inhaber (Bierdeckelkalkulation), TAIFUN-Beitrag „Eine Software-Demo sollte keine Verkaufsveranstaltung sein“. Das Webinar-Konzept von HiveGrid liegt schon vor (Kontext 10.4). +- **Botschaft:** Erst verstehen, dann entscheiden. Brücke zum Erstgespräch. + +### 5.3 Womit anfangen (*Einschätzung*) + +Für die ersten vier Wochen, solange Dejan im Bughunting steckt, eignen sich Formate mit niedrigem Aufwand, die ohne Kundenbeleg auskommen: +- **Noah:** N3 „POV: Chef“, N6 „Antwort auf Kommentar“, N7 „Baustellenweisheiten“, N14 „Inhaber-Notiz“. Dazu Anfragen für N13 (Podcasts) verschicken. +- **HiveGrid:** H1 „Ein Ablauf in 30 Sekunden“ (einmal pro Woche), H3 „Baustelle HiveGrid“, H8 „Chef-Frage der Woche“. +- **Sobald Geerkens live ist:** H4 „Die Umstellung bei Geerkens“. Das ist die wichtigste Serie, weil sie den fehlenden Beleg liefert. +- **Auswertung:** Bei so kleinen Konten zählen Shares, Saves und Kommentare mehr als Aufrufe. Ein Format erst nach 4 bis 6 Folgen bewerten. Die Wettbewerber zeigen, dass einzelne Ausreißer wenig sagen. + +--- + +## 6. Lücken im Markt + +1. **Kein Softwareanbieter hat einen Inhaber aus dem Handwerk als Gesicht.** plancraft, HERO und ToolTime zeigen Mitarbeitende, Kunden oder bezahlte Creator. Noah ist Meister, Chef und Mitgründer in einer Person. Das kann niemand nachbauen. +2. **„Dein Programm bleibt“ sagt in Social Media niemand.** Alle Cloud-Anbieter wollen ersetzen. Die ERP-Anbieter reden über sich selbst. Das einzige Beispiel für „Anbindung als Geschichte“ (pds und Ole) war sofort der stärkste pds-Beitrag. +3. **SHK-Software-Content mit SHK-Gesichtern fehlt.** Die Cloud-Anbieter zeigen Maler, Dachdecker und Fliesenleger. Die SHK-ERP zeigen Oberflächen im Sie. Ein SHK-Betrieb, der seinen eigenen Büroalltag zeigt, existiert im Software-Umfeld nicht. +4. **Die Perspektive des Chefs fehlt in der Creator-Szene.** Die starken SHK-Kanäle gehören Gesellen und Azubis (Micha, Samy, Sandra Hunke). Inhaber wie Schwarzkugler und Vögel machen Humor, reden aber nie über Führung, Organisation oder Übergaben. +5. **Niemand zeigt den Bau der Software.** Kein Anbieter macht ein Entwicklungstagebuch oder zeigt Entwickler im Gespräch mit Monteuren. HiveGrid kann das als Stärke spielen (F6). +6. **Niemand dokumentiert eine Einführung.** Es gibt Erfolgsgeschichten im Rückblick, aber keine Serie, die eine Umstellung live begleitet, mit allem, was schiefgeht. Geerkens wäre der erste Fall. +7. **Serien werden nicht durchgehalten.** HERO, plancraft und Craftnote haben ihre Talk- und Porträtreihen eingestellt. Ein einfaches, wiederholbares Format mit fester Nummerierung wäre im Feld allein. +8. **Nachfolge und Generationswechsel** kommen in Social Media genau einmal vor (HERO, Steffes Zaunanlagen). International macht ServiceTitan im Podcast Folgen dazu. Hinweis: In Kontext F12 wurde das Thema nicht ausgewählt. Die Recherche zeigt trotzdem, dass es frei ist. +9. **Anerkennung statt Belehrung.** Kein deutscher Softwareanbieter hebt fremde SHK-Betriebe hervor, wie es Housecall Pro mit „40 Under 40 Trades“ tut. +10. **Organische Ehrlichkeit.** Die Wettbewerber kaufen Reichweite und posten im Alltag Content mit 300 Aufrufen. Wer ohne Budget startet, kann glaubwürdig sagen: Hier ist nichts gekauft. *Einschätzung:* Das trägt nur, wenn es nicht als Seitenhieb formuliert ist. +11. **Auf LinkedIn ist die Interaktion im SHK-Software-Umfeld gering.** Die gesichteten ERP-Beiträge bekommen 1 bis 61 Reaktionen. Der Bestwert unter ihnen war ein CEO-Beitrag mit 90 Reaktionen. Ein Inhaber, der regelmäßig konkret schreibt, fällt dort schnell auf. +12. **TikTok im ERP-Umfeld:** Kein klassischer Anbieter ist dort, STREIT erst seit einer Woche. Laut Bitkom erreicht man auf TikTok aber eher Monteure und Azubis als Inhaber (7 % der Betriebe). *Einschätzung:* TikTok eher als Testfeld für Noahs Formate nutzen, nicht als Hauptkanal für Entscheider. + +--- + +## 7. Offene Fragen an Dejan + +1. **Deine Beispielkanäle:** Du hast laut Kontext F18 mehrere Instagram-Kanäle mit guten Reels im Kopf. Welche sind das, und welches Format daran gefällt dir genau? Dann ordne ich sie den Ideen in Abschnitt 5 zu. +2. **KI im Profiltitel:** Noahs Profil heißt „KI im Handwerk“, HiveGrid „KI fürs Handwerk“. Laut F10 soll KI nur dosiert laufen. Bleibt das so, oder ändern wir die Titel? +3. **TikTok @noahgeerkens:** Dort gibt es ein Konto mit 10 Followern und 0 Videos. Ist das Noahs? Soll Noah auf TikTok aktiv werden? +4. **Geerkens vor der Kamera:** Würden Noahs Team, seine Schwester und die Monteure bei Sketchen (N8), dem Keller-Test (H14) und der Umstellungs-Serie (H4) mitmachen? +5. **Die Umstellung öffentlich zeigen:** Darf die Einführung bei Geerkens mit allem, was hakt, öffentlich dokumentiert werden? Wann genau startet sie? +6. **Was läuft bei Noahs Reels schon?** Instagram-Inhalte konnte ich nicht sehen. Welche seiner bisherigen Reels liefen gut, welche nicht? Gibt es Zahlen aus Noahs Insights? +7. **Nachfolge:** In F12 nicht ausgewählt. Die Recherche zeigt eine freie Lücke. Lieber ganz weglassen oder nur nebenbei mitnehmen (wie in N12)? +8. **Creator-Kooperation ohne Geld:** Wäre HiveGrid gegen Content (wie plancrafts Creator Family) für kleine SHK-Creator denkbar, sobald das Produkt stabil läuft? Oder nur Duette und Gastauftritte? +9. **Reaktions-Formate:** Ist es für euch in Ordnung, auf fremde Videos zu reagieren (Stitch, Duett), oder nur auf eigenes Material? +10. **Facebook:** Laut Bitkom ist Facebook unter Handwerksbetrieben der verbreitetste Kanal. Soll HiveGrid dort nur Instagram spiegeln oder auch Gruppen nutzen? +11. **Messen:** Ist HiveGrid auf der ISH 2027 (15. bis 19.03.2027) oder auf Hausmessen der Großhändler dabei? Davon hängen H11 und Teile von N9 ab. +12. **Wer filmt und schneidet?** Noah produziert für seinen Account selbst. Gilt das auch für Collabs, oder übernimmst du das? +13. **Messung:** Metricool ist nur mit Instagram verbunden. Sollen TikTok, LinkedIn und Facebook vor dem Formattest angebunden werden, damit der Vergleich fair ist? +14. **STREIT-Betriebe:** Der Vertrieb ruft laut F1 auch STREIT-Nutzer an. STREIT startet gerade auf TikTok. Wollen wir STREIT-Nutzer gezielt ansprechen, obwohl es noch keine Anbindung gibt? + +--- + +## 8. Quellen + +Alle Abrufe am **05.10.2026**, wenn nicht anders angegeben. + +**Eigene Unterlagen** +- `HiveGrid-Website/docs/recherche/01-wettbewerb-handwerk.md` (Website-Analyse, 12.09.2026) +- `HiveGrid Marketing /Brainstorming Kickoff/Kontext/Kontext.md` (Stand 05.10.2026, Abschnitte 7.3, 9, 10, 13) +- `HiveGrid Marketing /Brainstorming Kickoff/MarketingBrainstormingOld.md` (Davids Vorschläge, 26.09.2026) + +**Studien und Medien** +- Bitkom, „Über die Hälfte des deutschen Handwerks nutzt Social Media“, 23.10.2025: https://www.bitkom.org/Presse/Presseinformation/Haelfte-des-Handwerks-nutzt-Social-Media +- ifh Göttingen, Social-Media-Nutzung im Handwerk (Instagram, 2021): https://ifh.wiwi.uni-goettingen.de/veroeffentlichungen/social-media-nutzung-im-handwerk-eine-explorative-analyse-fuer-instagram/ +- IFH/Intherm Influencer-Treff: https://www.ifh-intherm.de/messe/highlights/influencer-treff/ +- ISH 2027: https://ish.messefrankfurt.com/frankfurt/de.html +- MemoMeister, Podcast-Empfehlungen (14.11.2025): https://memomeister.com/handwerker-podcasts/ +- handwerk magazin, Influencer im Handwerk (26.11.2022): https://www.handwerk-magazin.de/influencer-das-sind-die-beliebtesten-handwerkerinnen-und-handwerker-im-social-web-275431/ +- liebermann.agency, Top 10 Handwerker-Influencer (26.02.2025): https://liebermann.agency/blog/die-top-ten-der-handwerker-influencer-die-man-kennen-muss +- Mewa, Craftfluencer (aktualisiert 22.04.2025): https://www.mewa.de/blog/craftfluencer-handwerk-mit-reichweite/ + +**Podcasts** +- SHK-Show: https://podcasts.apple.com/us/podcast/shk-show/id1600693814 +- Handwerk 2 Go: https://podcasts.apple.com/de/podcast/handwerk-2-go-geb%C3%A4udetechnik-unternehmerwissen-f%C3%BCr/id1481547262 +- Bauimpulse (MemoMeister): https://podcasts.apple.com/de/podcast/bauimpulse-f%C3%BCr-bau-handwerk/id1658998821 +- SBZ-Podcasts: https://www.sbz-online.de/podcast +- Jobber, Masters of Home Service: https://www.getjobber.com/podcast/ +- ServiceTitan Podcasts: https://www.servicetitan.com/podcast +- Housecall Pro Podcasts: https://www.housecallpro.com/podcasts/ + +**Wettbewerber (Profilseiten, gemessen)** +- plancraft: https://www.instagram.com/plancraft.app/ · https://www.tiktok.com/@plancraft · https://www.youtube.com/@plancrafthandwerkersoftware · https://www.linkedin.com/company/plancraft-gmbh/ · https://plancraft.com/de-de/creator-family +- HERO: https://www.instagram.com/hero_software/ · https://www.tiktok.com/@hero.handwerkersoftware · https://www.youtube.com/@HERODieHandwerkersoftware · https://www.linkedin.com/company/herosoftware-gmbh/ +- ToolTime: https://www.instagram.com/tooltime.de/ · https://www.tiktok.com/@tooltime.de · https://www.youtube.com/@tooltimesoftware · https://www.linkedin.com/company/tooltimegmbh/ +- Craftnote: https://www.instagram.com/craftnote.de/ · https://www.youtube.com/@CraftnotePoweredByAceve · https://www.linkedin.com/company/craftnote/ +- Meisterwerk: https://www.instagram.com/meisterwerk_official/ · https://www.tiktok.com/@meisterwerk_official · https://www.linkedin.com/company/meisterwerk-app/ +- openHandwerk: https://www.instagram.com/openhandwerk/ · https://www.youtube.com/@openHandwerk +- 1Tool: https://www.instagram.com/1tool.software/ · https://www.linkedin.com/company/1tool-software/ +- Craftboxx: https://www.instagram.com/craftboxx.de/ · https://www.tiktok.com/@craftboxx.de · https://www.youtube.com/@craftboxx +- pds: https://www.instagram.com/pdsgmbh/ · https://www.youtube.com/PDSGmbH · https://www.linkedin.com/company/pds-gmbh---eine-software-voraus · https://www.facebook.com/PDS.GmbH/ +- KWP: https://www.instagram.com/kwplaeuft/ · https://www.youtube.com/user/KWPSOFTWARE · https://www.facebook.com/KWPLandshut +- TAIFUN: https://www.instagram.com/taifun_software/ · https://www.youtube.com/user/TaifunSoftware · https://www.linkedin.com/company/taifun-software-ag/ · https://www.facebook.com/taifunsoftwareag +- blue:solution: https://www.instagram.com/bluesolution.software/ · https://www.youtube.com/user/bluesolutionsoftware +- M-SOFT: https://www.instagram.com/msoft.de · https://www.youtube.com/user/msoftTV/featured · https://www.facebook.com/msoftgruppe +- OneQrew: https://www.instagram.com/oneqrew +- STREIT: https://www.instagram.com/streit.software/ · https://www.tiktok.com/@streit.software · https://www.youtube.com/user/StreitV1 +- Label: https://www.instagram.com/label.software/ · https://www.youtube.com/channel/UCLgQtnZTuqJVV5OjgWJLiog · https://www.linkedin.com/company/label-software-gerald-bax-gmbh/ · https://www.facebook.com/labelwin +- MOSER: https://www.instagram.com/moser_software/ · https://www.youtube.com/c/MOSERSoftware +- MemoMeister: https://www.instagram.com/memomeister_com/ · https://www.youtube.com/@memomeister + +**Internationale Vorbilder (gemessen bzw. Seite)** +- Jobber: https://www.instagram.com/jobber/ · https://www.youtube.com/@Jobber · https://www.linkedin.com/company/jobber-software/ · https://www.getjobber.com/grants · https://www.getjobber.com/free-tools/ · https://www.getjobber.com/academy/ +- Housecall Pro: https://www.tiktok.com/@housecallpro · https://www.youtube.com/@HousecallPro · https://www.instagram.com/housecallpro/ · https://www.housecallpro.com/about/champion-the-trades/ · https://www.housecallpro.com/community/ +- ServiceTitan: https://www.linkedin.com/company/servicetitan/ · https://www.instagram.com/servicetitan/ · https://www.youtube.com/@Servicetitan · https://www.tiktok.com/@servicetitan · https://pantheon.servicetitan.com/ +- Tradify: https://www.instagram.com/tradifyhq/ · https://www.tiktok.com/@tradifyhq · https://www.youtube.com/@TradifyHQ +- Fergus: https://www.instagram.com/fergusapp/ · https://www.youtube.com/@fergusapp + +**Creator (gemessen):** alle Links in den Tabellen in Abschnitt 3. + +**B2B-Vorbilder (gemessen):** alle Links in den Tabellen in Abschnitt 4. + +**Methode der Messung:** Instagram über die öffentliche Profil-Vorschau (Follower, gefolgt, Beiträge). TikTok über Profilseite, Embed-Seite und Videoseiten (Aufrufe, Likes, Shares, Saves, Kennzeichen „isAd“). YouTube über die öffentliche Kanalseite (Abonnenten, Videos, Aufrufe, Alter). LinkedIn und Facebook über die öffentliche Seitenbeschreibung. Videoinhalte selbst wurden nicht angesehen. diff --git a/Brainstorming Kickoff/Research/04-tools-und-anbindungen.md b/Brainstorming Kickoff/Research/04-tools-und-anbindungen.md new file mode 100644 index 0000000..050efbd --- /dev/null +++ b/Brainstorming Kickoff/Research/04-tools-und-anbindungen.md @@ -0,0 +1,739 @@ +# 04 Werkzeuge und Anbindungen + +Stand: 05.10.2026 · Recherche für das Marketing-Setup von HiveGrid · für Dejan, David und Noah + +**So ist das Dokument zu lesen** + +- Aussagen mit einer Quellenangabe wie (Q12) sind belegt. Die Liste steht am Ende. +- Absätze mit **Einschätzung** sind unsere Bewertung. Sie sind nicht belegt. +- Rechtliche Abschnitte sind eine Einordnung, keine Rechtsberatung. Bevor ein DM-Funnel live geht, sollte der Anwalt, der schon die Rechtstexte betreut, kurz draufschauen. +- Preise sind netto, Stand 05.10.2026. Sie ändern sich oft. +- Es wurde nichts installiert, angemeldet oder eingerichtet. Die Befehle sind zum Nachmachen gedacht. + +--- + +## Kurzfassung + +1. **Metricool ist der Mittelpunkt.** Es gibt einen offiziellen MCP-Server (`https://ai.metricool.com/mcp`). Er läuft in jedem Tarif, auch im kostenlosen, und ist in Claude Code mit einem Befehl angebunden. Die Metricool-API dagegen gibt es erst ab dem Tarif Advanced (ab 43 € im Monat). Die brauchen wir nicht. +2. **Der kostenlose Metricool-Tarif reicht nicht lange.** Er erlaubt 1 Marke, 20 geplante Beiträge im Monat, 30 Tage Historie und kein LinkedIn. Sobald HiveGrid täglich postet und Noahs Konten dazukommen, braucht es Starter mit 5 Marken: 16 € im Monat bei Jahreszahlung oder 20 € bei Monatszahlung, jeweils netto. +3. **Metricool kann auch Kommentar-zu-DM.** Die Funktion heißt Flows, ist ab Starter dabei und kostet im Moment nichts extra. Das ist eine EU-Alternative zu ManyChat und sollte zuerst getestet werden. +4. **Nach einem Kommentar erlaubt Meta genau eine private Antwort**, innerhalb von 7 Tagen. Jede weitere Nachricht geht erst, wenn die Person antwortet oder einen Button drückt. Ein Klick auf einen Link zählt nicht. Davids Plan mit zwei Nachrichten klappt also nur mit einem Button. +5. **ManyChat ist seit März 2026 teurer.** Der kostenlose Tarif hat nur noch 25 aktive Kontakte im Monat. Sinnvoll wäre erst Essential für etwa 14 bis 17 US-Dollar im Monat. ManyChat sitzt in den USA, ist aber nach dem EU-US Data Privacy Framework zertifiziert. +6. **Fremde Kanäle offiziell auswerten geht über Business Discovery** der Instagram Graph API: Follower, Beiträge, Likes, Kommentarzahl und Views öffentlicher Business- und Creator-Konten. Dafür muss `hivegrid.de` mit einer Facebook-Seite verknüpft sein. Die Seite gibt es noch nicht. Video, Hook und Schnitt liefert die API nicht. +7. **Für Hook, Aufbau und Schnitt ist eine lokale Werkbank der praktikable Weg:** Reel laden, mit Whisper auf dem Mac transkribieren, mit ffmpeg Standbilder ziehen, Claude auswerten lassen. ffmpeg ist auf Dejans Mac schon da. Rechtlich ist das eine Grauzone: Instagram sieht das Herunterladen nicht vor, und urheberrechtlich hilft am ehesten § 44b UrhG (Text und Data Mining), wenn die Kopien danach gelöscht werden. +8. **Für organisches Instagram, TikTok, LinkedIn und YouTube gibt es keine offiziellen MCP-Server.** Meta hat nur einen für Werbeanzeigen. Die Community-Server sind meist kleine Ein-Personen-Projekte. Für uns reichen der Metricool-MCP und der Subframe-MCP. Scraper wie Apify passen nicht zum Datenschutz-Versprechen. +9. **Subframe liefert Bilder, Code und Farben für den Post-Generator.** Der MCP macht Screenshots von Seiten und Komponenten, gibt deren React- und Tailwind-Code aus, liest das Theme und holt Prototypen als lauffähige App. Plätze als Betrachter sind kostenlos und dürfen alle Lese-Werkzeuge nutzen. +10. **Video und Newsletter:** CapCut für die Marke HiveGrid meiden (ByteDance, Server in Malaysia, Singapur und den USA, weitreichende Lizenz an den Inhalten). Besser Premiere oder DaVinci Resolve mit Untertiteln aus Whisper, für Noah am Handy Meta Edits. Beim Newsletter das eigene Modul nutzen, aber erst, wenn der Mailjet-Nachweis da ist. Als Ausweichlösung sind CleverReach oder rapidmail kostenlos startklar. + +--- + +## 1. Claude mit Instagram verbinden, um Vorbild-Kanäle auszuwerten + +### 1.1 Was eigentlich gebraucht wird + +**Einschätzung:** Hinter dem Wunsch stecken zwei verschiedene Fragen. + +- **Welche Reels eines Kanals funktionieren?** Das sind Zahlen: Views, Likes, Kommentare im Verhältnis zu den Followern. Die gibt es über offizielle Schnittstellen und über Metricool. +- **Wie sind sie gemacht?** Hook, Aufbau, Länge, Schnitt, Text auf dem Bild. Das steckt nur im Video selbst. Keine offizielle Schnittstelle liefert das. + +Der sinnvolle Ablauf ist deshalb zweistufig: Mit den Zahlen die stärksten Reels finden. Diese wenigen Reels dann im Detail auswerten (Abschnitt 1.6). + +### 1.2 Instagram Graph API: Business Discovery + +**Was man bekommt (belegt):** + +- Business Discovery liest öffentliche Daten anderer professioneller Instagram-Konten, also Business- und Creator-Konten, ohne deren Zustimmung (Q1, Q2, Q12). +- Kontodaten: Benutzername, Name, Bio, Website, Profilbild, Follower, gefolgte Konten, Anzahl Beiträge (Q12). +- Je Beitrag: Caption, Medientyp, Zeitpunkt, Link, `like_count`, `comments_count`, `view_count` (Q1, Q12). `view_count` gibt es nur über Business Discovery. Seit 22.04.2026 zählt es bei Videos, die auch auf Facebook laufen, die Views beider Plattformen zusammen (Q4, Q6). +- `media_product_type` (Feed, Story, Reels) gibt es nur mit Facebook-Login (Q4). + +**Grenzen (belegt):** + +- Nur professionelle Konten. Private Konten und altersbeschränkte Konten liefern nichts (Q1, Q2). +- Hat der Kanal die Like-Zahlen ausgeblendet, fehlt `like_count` (Q4). +- `media_url` fehlt, wenn der Beitrag urheberrechtlich geschütztes Material enthält (Q4). **Einschätzung:** Das betrifft viele Reels mit lizenzierter Musik. Als Download-Weg taugt die API also nicht. +- Auf die einzelnen Beiträge darf man danach nicht direkt zugreifen. Ein `GET` auf eine zurückgegebene Medien-ID schlägt fehl (Q2). Also keine Kommentartexte, keine Reichweite, keine Wiedergabezeit, keine Speicherungen fremder Reels. + +**Was man dafür braucht (belegt):** + +- Ein eigenes Instagram-Konto als Business oder Creator, **verknüpft mit einer Facebook-Seite** (Q8). +- Ein Meta-Entwicklerkonto, das Aufgaben auf dieser Facebook-Seite hat (Q8). +- Eine Meta-App vom Typ Business mit „Facebook Login for Business“ (Q3, Q8). +- Laut Referenz braucht der Token die Rechte `instagram_basic`, `instagram_manage_insights` und `pages_read_engagement` (Q1). Für den Einstieg nennt Meta außerdem `pages_show_list` (Q8). +- **Kein App Review**, solange nur Personen mit Rolle in der App sie nutzen. Standard Access ist der Normalfall. Advanced Access mit App Review und Unternehmensprüfung braucht man erst, wenn die App fremden Konten dient (Q3). +- Die Instagram-API **mit Instagram-Login** kann Business Discovery nicht. Das geht nur mit Facebook-Login (Q3, Q12). + +**Aktuelle API-Version:** v26.0 vom 29.07.2026 (Q9). + +**Einrichtung in Schritten (Aufwand etwa 1 bis 2 Stunden):** + +1. Facebook-Seite für HiveGrid anlegen (laut Kontext ohnehin geplant) und `hivegrid.de` in den Instagram-Einstellungen mit ihr verknüpfen. +2. Auf developers.facebook.com ein Entwicklerkonto anlegen, eine App vom Typ Business erstellen, Produkt „Facebook Login for Business“ hinzufügen. +3. Im Graph API Explorer einen Nutzer-Token mit den oben genannten Rechten erzeugen. +4. `GET /me/accounts` liefert die Seiten-ID. `GET /{seiten-id}?fields=instagram_business_account` liefert die Instagram-ID (Q8). +5. Den Token gegen einen langlebigen tauschen (60 Tage) und nur als Umgebungsvariable speichern, nie im Repo. + +**Beispielabfrage**, die Claude Code selbst ausführen kann: + +```bash +# IG_ID und META_TOKEN liegen als Umgebungsvariablen vor +curl -s -G "https://graph.facebook.com/v26.0/$IG_ID" \ + --data-urlencode 'fields=business_discovery.username(KANALNAME){followers_count,media_count,media.limit(30){caption,media_product_type,timestamp,permalink,like_count,comments_count,view_count}}' \ + --data-urlencode "access_token=$META_TOKEN" > kanal.json +``` + +Danach an Claude: „Lies kanal.json. Sortiere die Reels nach Views im Verhältnis zu den Followern und nenne die fünf stärksten mit Link, Länge der Caption und Datum.“ + +**Einschätzung:** Für die Auswahl der Reels ist das der sauberste Weg. Es ist offiziell, kostenlos und braucht keinen Scraper. Ein eigener MCP-Server dafür lohnt nicht. Ein Shell-Befehl wie oben reicht, Claude Code führt ihn aus. + +### 1.3 Instagram API mit Instagram-Login und Insights für das eigene Konto + +**Belegt:** + +- Dieser Weg braucht **keine Facebook-Seite**. Er ist für Konten gedacht, die nur auf Instagram aktiv sind (Q3). +- Die App muss vom Typ Business sein. Einen Token mit 60 Tagen Laufzeit gibt es direkt im App-Dashboard unter „Instagram > API setup“ (Q7). +- Er kann Kommentare verwalten, veröffentlichen, Insights lesen, Erwähnungen und Nachrichten. Hashtag-Suche und Business Discovery gibt es nur mit Facebook-Login (Q3). +- Insights je Reel: `views`, `reach`, `likes`, `comments`, `saved`, `shares`, `reposts`, `total_interactions`, `ig_reels_avg_watch_time` (durchschnittliche Wiedergabezeit), `ig_reels_video_view_total_time`, `reels_skip_rate` (Anteil der Views, die in den ersten 3 Sekunden wegwischen), `follows`, `profile_visits` und `crossposted_views` (Q5). +- Die Daten kommen bis zu 48 Stunden verzögert und werden 2 Jahre gespeichert (Q5). +- `impressions`, `plays` und `video_views` sind seit 2025 abgeschaltet. Statt dessen gibt es seit 03.12.2025 `views` (Q6). + +**Einschätzung:** Metricool liest diese Werte für `hivegrid.de` schon. Für Claude ist der Metricool-MCP der einfachere Weg (Abschnitt 2). Eine eigene App lohnt nur, wenn Metricool eine wichtige Kennzahl nicht zeigt. Der Kandidat dafür ist `reels_skip_rate`, denn das ist die direkte Messung, ob ein Hook trägt. Ob Metricool sie anzeigt, ist offen. + +### 1.4 MCP-Server für Instagram, TikTok, LinkedIn und YouTube + +| Plattform | Offizieller MCP | Community-Server | Was offiziell geht | +|---|---|---|---| +| Instagram (organisch) | **keiner** (Q14) | viele, zum Beispiel `jlbadano/ig-mcp` (197 Sterne, MIT, Graph API mit Facebook-Login, nur eigenes Konto) (Q15), Abspaltung `mcpware/instagram-mcp` (46 Sterne, per `npx`, mit Konto-Suche) (Q16), `William-Gao/instagram-mcp` mit Instagram-Login und Business Discovery (Q75) | Graph API wie oben | +| Meta Werbung | **ja**, „Meta Ads AI Connectors“, offene Beta seit 29.04.2026, nur Anzeigen, kein organischer Inhalt (Q13) | | | +| TikTok | **keiner** für organische Inhalte. Ein TikTok-Ads-MCP wurde im Mai 2026 angekündigt, war im Juni aber noch nicht allgemein verfügbar (Q18) | zum Beispiel `IvanBBaev/tiktok-mcp` (1 Stern, nur eigene Videos über Display API und Content Posting API, Beiträge bis zum Audit nur privat) (Q17) | Display API nur eigene Videos. Die Research API ist Hochschulen vorbehalten und schließt kommerzielle Nutzung aus (Q76) | +| LinkedIn | **keiner**, Stand 12.09.2026 (Q19) | über die offizielle API zum Beispiel Taplio, 2pr.io, Composio. Über Cookies und Sitzungen zum Beispiel `stickerdaniel/linkedin-mcp-server`, mit Risiko für das Konto (Q19). `linkedin-pages-mcp` für Unternehmensseiten (1 Stern) (Q20) | Community Management API. Volle Freigabe nur nach Video-Prüfung durch LinkedIn, etwa 60 Tage. Vorher 500 Aufrufe pro App und Tag (Q20) | +| YouTube | **keiner** (Q21) | viele, lesen meist Transkripte öffentlicher Videos über die Untertitelspuren des Players (Q21) | Data API. Untertitel per API nur für eigene Videos (Q21) | + +**Sicherheit und Pflege (Einschätzung):** + +- **Offizielle, gehostete Server mit OAuth** (Metricool, Subframe) sind die sichere Wahl. Man gibt kein Passwort und keinen Token in eine Datei, und der Zugriff lässt sich beim Anbieter widerrufen. +- **Community-Server** sind fast immer Ein-Personen-Projekte mit wenigen Sternen. Sie laufen lokal mit einem langlebigen Token in einer `.env`-Datei. Dieser Token kann je nach Rechten auch veröffentlichen, kommentieren und Nachrichten schicken. Wer so einen Server nutzt, sollte den Code lesen, eine feste Version verwenden und dem Token nur Leserechte geben. +- **Finger weg von Servern, die mit Benutzername und Passwort arbeiten** oder über die private Instagram-Schnittstelle laufen. Das verstößt gegen die Nutzungsbedingungen, Meta erkennt es, und die Strafe ist das Konto (Q14). Dasselbe gilt für Werkzeuge, die in der eigenen Browser-Sitzung arbeiten. +- **Prompt Injection:** Wer fremde Captions oder Kommentare von Claude lesen lässt, holt fremden Text in die Sitzung. Darin können Anweisungen versteckt sein. Deshalb: Fremde Inhalte nie in einer Sitzung auswerten, in der Werkzeuge mit Schreibrechten aktiv sind (Metricool-Planung, Subframe-Bearbeitung). In Claude Code Schreibwerkzeuge immer auf „nachfragen“ lassen. +- **Ein MCP-Server reagiert nicht von selbst** auf Kommentare oder neue Beiträge. Er arbeitet nur, wenn man im Chat fragt (Q14). Für Automationen wie Kommentar-zu-DM ist MCP also das falsche Werkzeug. + +### 1.5 Scraper-Dienste wie Apify + +**Was es gibt (belegt):** Der „Instagram Scraper“ von Apify liest öffentliche Profile, Beiträge, Reels, Captions, Hashtags, Likes, Views, Video-Adressen und Kommentare samt Autor. Er kostet 1,50 bis 2,70 US-Dollar je 1.000 Ergebnisse. Apify schreibt selbst, dass öffentliche Daten unter der DSGVO personenbezogen sein können (Q22). + +**Rechtliche Lage, eingeordnet:** + +- **Nutzungsbedingungen (Einschätzung):** Instagram untersagt sinngemäß, Informationen ohne ausdrückliche Erlaubnis automatisiert zu sammeln. Gebunden ist daran, wer ein Konto hat und eingeloggt sammelt. In den USA hat Meta 2024 gegen Bright Data verloren. Das Gericht sah im Sammeln öffentlicher Daten ohne Login keinen Verstoß, Meta hat die Klage danach fallen gelassen (Q23). Das ist US-Recht und sagt über die DSGVO nichts. +- **DSGVO:** Öffentlich heißt nicht frei. Kommentartexte mit Namen sind personenbezogene Daten von Privatleuten. Man braucht eine Rechtsgrundlage, meist das berechtigte Interesse, und muss Daten sparsam erheben (Q23). Dazu kommen Informationspflichten nach Art. 14 DSGVO und ein Auftragsverarbeitungsvertrag mit dem Dienst. **Einschätzung:** Bei reinen Zahlen über Business-Konten ist das Risiko gering. Bei Kommentaren und Kommentatoren ist es hoch. +- **Urheberrecht:** Zahlen und Metadaten sind unkritisch. Videos herunterladen ist eine Vervielfältigung (siehe 1.6). + +**Einschätzung:** Für eine Marke, die mit Datenschutz wirbt, ist ein Scraper das falsche Signal, und er löst kein Problem, das die offiziellen Wege nicht auch lösen. Business Discovery liefert die Zahlen, Metricool die Wettbewerber, und für die Machart reicht eine Handvoll Reels. Apify höchstens für einmalige Zahlenabfragen über Business-Konten nutzen, ohne Kommentare und ohne Kommentatoren. + +### 1.6 Der praktikable Weg: Reels lokal auswerten + +**Rechtlicher Rahmen vorab (Einordnung, keine Rechtsberatung):** + +- **Privatkopie greift nicht.** § 53 UrhG erlaubt Kopien nur zum privaten Gebrauch und nur, wenn sie „weder unmittelbar noch mittelbar Erwerbszwecken dienen“ (Q25). Marketing für HiveGrid ist ein Erwerbszweck. +- **Text und Data Mining kann greifen.** § 44b UrhG erlaubt Kopien rechtmäßig zugänglicher Werke für die „automatisierte Analyse“, um „Muster, Trends und Korrelationen“ zu finden. Die Kopien sind zu löschen, wenn sie nicht mehr gebraucht werden. Hat der Rechteinhaber online einen maschinenlesbaren Vorbehalt erklärt, entfällt die Erlaubnis (Q24). **Einschätzung:** Eine Auswertung von Hook, Schnitt und Aufbau durch Claude lässt sich gut als solche Analyse verstehen. Entschieden ist das für diesen Fall nicht. +- **Technische Schutzmaßnahmen:** Das LG Hamburg hat am 31.03.2023 (310 O 316/21) die Verschlüsselung bei YouTube als wirksame technische Schutzmaßnahme nach § 95a UrhG gewertet. Ein Hoster musste die youtube-dl-Seite abschalten. Uberspace hat Berufung angekündigt (Q26). **Einschätzung:** Bei YouTube-Downloads also besonders zurückhaltend sein. Für Instagram ist uns keine Entscheidung bekannt. +- **Nutzungsbedingungen (Einschätzung):** Ein Download mit yt-dlp oder Instaloader ist automatisiert und von Instagram nicht vorgesehen. Das Risiko trägt das Konto, mit dessen Anmeldung man lädt. Also nie mit `hivegrid.de` oder Noahs Konto angemeldet laden. +- **Nachbauen ist erlaubt, Kopieren nicht (Einschätzung):** Ideen, Formate und Hook-Muster sind nicht geschützt. Konkrete Texte, Bilder, Musik und eine 1:1 übernommene Schnittfolge schon. Muster übernehmen, Inhalte selbst machen. +- **DSGVO (Einschätzung):** Gesichter und Stimmen sind personenbezogen. Bei öffentlichen Unternehmer-Kanälen ist ein kurzes, sparsames Auswerten mit berechtigtem Interesse vertretbar. Was Claude liest, geht an Anthropic in den USA. Deshalb nur die nötigen Bilder hochgeben und Videos nach der Auswertung löschen. +- **Saubere Alternative ohne Download:** Reel am Handy ansehen, die Beobachtungen nach dem Raster unten diktieren und Claude daraus die Auswertung bauen lassen. Kostet pro Reel ein paar Minuten mehr, wirft aber keine Rechtsfrage auf. + +**Stand auf Dejans Mac (geprüft am 05.10.2026):** Apple M2. `ffmpeg` und `ffprobe` 9.0.1 sind installiert. `yt-dlp`, `instaloader` und `whisper` sind nicht installiert. + +**Schritt 1: einmalig einrichten** (nur dokumentiert, nicht ausgeführt) + +```bash +brew install yt-dlp pipx +pipx install openai-whisper # Whisper läuft lokal, nichts geht in eine Cloud +# schnellere Alternative für Apple Silicon: +# brew install whisper-cpp # braucht ein Modell, z. B. ggml-large-v3-turbo.bin +``` + +Einen Arbeitsordner außerhalb der Repos anlegen, zum Beispiel `~/Reel-Analyse/`. Videos gehören nicht in `posts` oder in den Marketing-Ordner, den Noah bekommt. + +**Schritt 2: ein Reel laden** + +```bash +cd ~/Reel-Analyse +yt-dlp -o "%(uploader_id)s/%(id)s/reel.%(ext)s" --write-info-json \ + "https://www.instagram.com/reel/REEL_ID/" +# Wenn Instagram eine Anmeldung verlangt (häufig), Cookies aus dem Browser nutzen: +# yt-dlp --cookies-from-browser firefox -o ... "https://www.instagram.com/reel/REEL_ID/" +``` + +`reel.info.json` enthält Caption, Länge, Kanal und Zahlen. Alternative mit Instaloader für einen einzelnen Beitrag (Optionen laut Doku v4.15.3) (Q27): + +```bash +instaloader --no-video-thumbnails --no-compress-json -- -REEL_ID +``` + +Instaloader drosselt sich selbst. Häufige Neustarts führen zu Sperren mit Fehler 429, VPN und geteilte IP-Adressen verschärfen das (Q28). Also wenige Reels, langsam. + +**Schritt 3: Eckdaten und Transkript** + +```bash +cd ~/Reel-Analyse/KANAL/REEL_ID +ffprobe -v error -show_entries format=duration:stream=width,height -of default=nw=1 reel.mp4 +whisper reel.mp4 --model turbo --language German --output_format srt --output_dir . +# englische Reels: --language English +``` + +Die SRT-Datei hat Zeitmarken. Daraus ergibt sich, wann welcher Satz fällt und wie schnell gesprochen wird. + +**Schritt 4: Standbilder ziehen** + +```bash +# Hook: drei Bilder pro Sekunde aus den ersten 3 Sekunden +mkdir -p hook +ffmpeg -hide_banner -loglevel error -i reel.mp4 -t 3 -vf "fps=3,scale=540:-1" hook/hook_%02d.jpg + +# Schnitte: ein Bild je erkanntem Szenenwechsel, Zeitmarken in schnitte.txt +mkdir -p szenen +ffmpeg -hide_banner -i reel.mp4 \ + -vf "select='gt(scene,0.3)',showinfo,scale=540:-1" -fps_mode vfr \ + szenen/szene_%03d.jpg 2> szenen/log.txt +grep -o "pts_time:[0-9.]*" szenen/log.txt | cut -d: -f2 > schnitte.txt +wc -l < schnitte.txt # Anzahl der erkannten Schnitte + +# Übersicht: ein Bild pro Sekunde als Raster (6 x 10 reicht für 60 Sekunden) +ffmpeg -hide_banner -loglevel error -i reel.mp4 -vf "fps=1,scale=240:-1,tile=6x10" -frames:v 1 uebersicht.jpg +``` + +Hinweis aus dem Test: Findet ffmpeg keinen einzigen Schnitt, etwa bei weichen Animationen, bricht der Befehl mit einer Fehlermeldung ab. Dann den Schwellwert senken, zum Beispiel auf `0.2`. Die Befehle für Hook und Übersicht liefen am 05.10.2026 mit ffmpeg 9.0.1 auf einem Video aus `posts/animation/` fehlerfrei. + +**Schritt 5: Claude auswerten lassen** + +In Claude Code im Ordner des Reels: + +```text +Lies reel.info.json, reel.srt und schnitte.txt. Sieh dir die Bilder in hook/, +szenen/ und uebersicht.jpg an. Dann gib mir: + +1. Hook: Was passiert in Sekunde 0 bis 3? Bild, Text auf dem Bild, erster Satz. + Warum bleibt man hängen? +2. Aufbau: die Abschnitte mit Zeitmarken (zum Beispiel Problem, Wendung, Lösung, Aufruf). +3. Länge, Schnitte pro Minute, Sprechtempo in Wörtern pro Minute. +4. Text auf dem Bild: wie viel, wo, wie lange. Stil der Untertitel. +5. Ton: Stimme, Musik, Geräusche, soweit erkennbar. +6. Aufruf am Ende und Aufbau der Caption. +7. Übertragung: Wie sähe dasselbe Muster für einen SHK-Betrieb aus? + Ein Skript-Entwurf mit 30 Sekunden für Noah, im Du. + +Schreib schlicht. Übernimm keine Sätze aus dem Original. +Leg das Ergebnis als analyse.md in diesen Ordner. +``` + +**Schritt 6: sammeln und löschen** + +- Die Ergebnisse aller Reels in einer Tabelle sammeln (Kanal, Reel, Länge, Schnitte pro Minute, Hook-Typ, Aufbau, Aufruf). Nach 10 bis 15 Reels zeigen sich die Muster. +- Danach Video und Bilder löschen, nur `analyse.md` behalten. Das entspricht der Löschpflicht aus § 44b Abs. 2 UrhG (Q24). + +```bash +rm reel.mp4 uebersicht.jpg hook/*.jpg szenen/*.jpg +``` + +**Einschätzung zum Aufwand:** Einrichtung etwa 1 Stunde. Danach etwa 15 bis 20 Minuten pro Reel, das meiste davon Lesen und Bewerten. Claude Code kann die Schritte 2 bis 5 selbst ausführen. Als nächster Schritt bietet sich ein eigener Befehl oder Skill „Reel auswerten“ an, der nur noch die Adresse braucht. + +### 1.7 Metricool „Wettbewerber“ + +Details in Abschnitt 2.5. Kurz: Metricool sammelt öffentliche Zahlen von Vorbild-Kanälen auf Instagram, Facebook und weiteren Netzwerken, und Claude kann sie über den Metricool-MCP abfragen. Für die Frage „welche Reels laufen“ ist das die bequemste Lösung, weil keine eigene Meta-App nötig ist. + +--- + +## 2. Metricool + +### 2.1 Tarife + +| | Free | Starter | Advanced | +|---|---|---|---| +| Preis netto (Jahr / Monat) | 0 € | 5 Marken: 16 € / 20 €. 10 Marken: 29 € / 37 € | 15 Marken: 43 € / 54 € | +| Marken | 1 | 5 oder 10 | 15 bis 50 | +| Geplante Beiträge | 20 im Monat | unbegrenzt (Fair Use) | unbegrenzt | +| Historie der Zahlen | 30 Tage | unbegrenzt | unbegrenzt | +| LinkedIn | nein | ja | ja | +| Wettbewerber | 5, nicht austauschbar | 100 | 100 | +| Berichte als PDF und PPT | nein | ja | ja, eigene Vorlagen | +| Flows (Kommentar-zu-DM) | nein | ja | ja | +| MCP | ja | ja | ja | +| API | nein | nein | ja | + +Quellen: (Q36, Q37, Q40). Eine Marke ist ein Betrieb oder eine Person, mit je einem Profil pro Netzwerk (Q37). X kostet 10 US-Dollar im Monat extra (Q37). + +**Einschätzung:** HiveGrid (Instagram, Facebook, TikTok, LinkedIn-Seite, eventuell YouTube) ist eine Marke. Noah (Instagram, LinkedIn-Profil) ist eine zweite. Schon LinkedIn und die zweite Marke erzwingen Starter. Tägliches Posten sprengt außerdem die 20 Beiträge im Monat. Starter mit 5 Marken ist deshalb die erste Ausgabe, die sich lohnt. + +### 2.2 Der MCP-Server + +**Belegt:** + +- Metricool betreibt einen offiziellen MCP-Server unter `https://ai.metricool.com/mcp`. Anmeldung per OAuth im Browser, kein API-Schlüssel (Q30). +- Er läuft in **jedem Tarif, auch im kostenlosen**. Die Grenzen des Tarifs gelten weiter (Q29). +- Claude Code braucht laut Metricool ein Claude-Abo Pro oder Max (Q29, Q30). +- Was geht: Einstellungen der Marken lesen, verfügbare Kennzahlen abfragen (auch Werbekonten), geplante Beiträge lesen, anlegen und ändern, beste Zeiten zum Posten (Q29, Q31). Wettbewerber abfragen (Q33, Q34). +- Was nicht geht: Posteingang, Kommentare, Smartlinks, Google-Bewertungen, Autolisten, Dateien aus Canva oder Drive, Werbekampagnen verwalten (Q29, Q32). +- Beiträge können **ohne Freigabe** geplant und veröffentlicht werden (Q32). +- Laut Metricool werden die Daten „nicht im KI-Modell gespeichert“, und der Zugriff lässt sich jederzeit widerrufen (Q32). +- Metricool bietet für Claude zusätzlich Benchmark-Werkzeuge (Instagram im Vergleich mit 375.000 Konten, YouTube, LinkedIn) sowie einen Bericht-Agenten und einen Karussell-Agenten an (Q33). + +### 2.3 Anbindung an Claude Code + +**Belegt (Q30):** + +```bash +claude mcp add --transport http metricool https://ai.metricool.com/mcp +claude # Claude Code starten +/mcp # Metricool auswählen, „Authenticate“, im Browser „Grant access“ +``` + +**Einschätzung zur Konfiguration:** Damit Metricool in jedem Projekt verfügbar ist, mit `--scope user` hinzufügen: + +```bash +claude mcp add --transport http --scope user metricool https://ai.metricool.com/mcp +``` + +Wer es nur in einem Projekt will, legt im Projekt eine `.mcp.json` an: + +```json +{ + "mcpServers": { + "metricool": { + "type": "http", + "url": "https://ai.metricool.com/mcp" + } + } +} +``` + +Danach in Claude Code mit `/permissions` die Lese-Werkzeuge erlauben und die Werkzeuge zum Anlegen und Ändern von Beiträgen auf „nachfragen“ lassen. So kann Claude Zahlen lesen, aber nichts ohne Bestätigung planen. + +Für claude.ai und die Desktop-App gibt es Metricool im Connector-Verzeichnis. Eine Verbindung gilt dort für alle Geräte (Q30). + +**Beispiel-Fragen an Claude:** + +- „Welche fünf Reels von hivegrid.de hatten im September die meisten Views im Verhältnis zur Reichweite? Was haben sie gemeinsam?“ +- „Wann sind die besten Zeiten für Instagram und LinkedIn diese Woche?“ +- „Vergleiche unsere Interaktionen pro Beitrag mit den Wettbewerbern der letzten 30 Tage.“ +- „Lege die drei Reels aus diesem Ordner als Entwurf für Mo, Mi und Fr um 12 Uhr an.“ (Schreibzugriff, mit Bestätigung) + +### 2.4 Die API + +**Belegt:** Nur in Advanced und Custom. Anmeldung über den Header `X-Mc-Auth` mit Token sowie `userToken` und `userId`. Doku unter `https://app.metricool.com/resources/apidocs/index.html`. Gedacht für Export und Automationen mit Zapier, Make, n8n oder eigenem Code (Q31, Q39). + +**Einschätzung:** Für HiveGrid unnötig. Was wir mit Claude vorhaben, deckt der MCP ab. Die API wäre nur für ein eigenes Dashboard oder Looker Studio interessant, und dafür sind 43 € im Monat zu viel. + +### 2.5 Wettbewerber-Analyse + +**Belegt:** + +- Unterstützt in Free und bezahlt: Facebook, Instagram, Threads, Bluesky, Twitch. Nur bezahlt: YouTube und X (X mit Zusatz) (Q35, Q36). +- TikTok und LinkedIn stehen im Help Center nicht in der Liste (Q35). Ein Metricool-Blogartikel nennt sie für die Auswertung per Claude trotzdem (Q34). **Das ist widersprüchlich und im Konto zu prüfen.** +- Kennzahlen: Follower, Likes, Beiträge, Interaktionen als Schnitt pro Beitrag. Engagement wird auf Follower bezogen, weil Reichweite nicht öffentlich ist (Q35). +- Daten gibt es ab dem 1. des Vormonats. Zahlende Kunden können bis zu 300 ältere Beiträge nachladen lassen (Q35). +- **Im Free-Tarif lassen sich die 5 Wettbewerber nicht wieder entfernen** (Q36). +- Über den MCP kann Claude die Daten lesen, auch Formate (Reels, Karussells), Caption-Merkmale und Posting-Rhythmus. Wettbewerber müssen vorher in Metricool angelegt sein (Q34). + +**Einschätzung:** Sofort anlegen, weil Metricool erst ab dem Anlegen sammelt. Im Free-Tarif die 5 Plätze mit Bedacht vergeben, am besten mit Dejans stärksten Vorbild-Kanälen aus dem Handwerk. + +### 2.6 Hashtag-Tracker, beste Zeiten, Berichte + +- **Hashtag-Tracker:** Bezahlung pro Tag, 25 € je Netzwerk und Tag, für Instagram und X. Je 4 gekaufte Tage gibt es einen gratis (Q38). **Einschätzung:** Für uns nicht sinnvoll. Die Hashtag-Suche für Instagram und TikTok ist ab Starter dabei (Q36). +- **Beste Zeiten:** Teil der Planung, auch per MCP abfragbar (Q31, Q37). +- **Berichte:** PDF und PPT ab Starter, eigene Vorlagen ab Advanced (Q36, Q37). **Einschätzung:** Mit dem Bericht-Agenten über Claude (Q33) lässt sich ein Monatsbericht auch ohne Advanced bauen. + +### 2.7 Unterstützte Kanäle + +**Belegt (Q32, Q37):** Planung und Auswertung für Instagram, Facebook, TikTok, YouTube, LinkedIn (ab Starter), Pinterest, Threads, Bluesky, Twitch, Google Business Profile und X (Zusatz). Dazu Auswertungen für Facebook Ads, Google Ads und TikTok Ads. + +**Einschätzung:** Alle gesetzten Kanäle von HiveGrid und Noah sind abgedeckt. Fehlt nur der Newsletter. + +### 2.8 Datenschutz + +**Belegt:** + +- Verantwortlich ist die Metricool Software S.L. in Madrid. Laut Datenschutzerklärung vom 26.06.2026 liegen „alle Daten auf Servern in der Europäischen Union“, und es finden keine Übermittlungen in Drittländer statt (Q41). +- Einen Auftragsverarbeitungsvertrag gibt es als PDF oder unterschrieben über legal@metricool.com (Q42). + +**Einschätzung:** Metricool passt gut zum Markenversprechen. Zwei Punkte bleiben: +- Den Auftragsverarbeitungsvertrag anfordern und ablegen. +- Über den MCP gehen die abgefragten Daten an Anthropic in die USA. Das sind überwiegend Kennzahlen, keine Kundendaten. In den Datenschutz-Einstellungen von Claude prüfen, ob Chats zum Training freigegeben sind, und das abschalten. + +### 2.9 Empfehlung + +1. Heute: MCP anbinden, Wettbewerber anlegen. Kostet nichts. +2. Sobald Facebook-Seite, TikTok und LinkedIn verbunden werden und täglich gepostet wird: Starter mit 5 Marken, 16 € im Monat bei Jahreszahlung. +3. Advanced und API nicht. + +--- + +## 3. ManyChat und Alternativen für Instagram-DM-Funnels + +### 3.1 Was Meta technisch erlaubt + +**Belegt:** + +- Auf einen Kommentar unter einem Beitrag oder Reel darf **genau eine private Nachricht** gehen, und zwar **innerhalb von 7 Tagen** nach dem Kommentar (Q10). +- **Weitere Nachrichten erst, wenn die Person antwortet**, und dann innerhalb von 24 Stunden nach dieser Antwort (Q10). +- Bei Instagram Live geht die private Antwort nur, solange die Übertragung läuft (Q10). +- Im 24-Stunden-Fenster sind auch werbliche Inhalte erlaubt. Danach nur noch mit Message Tags für bestimmte Zwecke. Für manuelle Antworten durch Menschen gibt es den Human-Agent-Tag mit 7 Tagen (Q11). +- Automatisierte Dialoge sollen sich als solche zu erkennen geben, wo das Gesetz es verlangt oder als gute Praxis, zum Beispiel „Du schreibst mit einem Bot“ (Q11). +- Laut einer Drittquelle sind 750 private Antworten pro Stunde möglich (Q12). + +**Was das für Davids Ablauf heißt:** Davids Papier hatte das schon richtig erkannt. Nachricht 2 braucht eine weitere Reaktion, ein Klick auf den PDF-Link reicht nicht. In ManyChat löst man das mit einem **Button** in der ersten Nachricht. Ein Klick darauf zählt als Antwort und öffnet das 24-Stunden-Fenster. + +**Vorschlag, im Du** (laut F11 gilt überall Du, Davids Texte siezen noch): + +> **1. (private Antwort auf den Kommentar)** Danke für dein Interesse! Hier ist das PDF: [PDF-Link]. Ich bin übrigens ein automatischer Helfer. Wie wir mit deinen Daten umgehen: [Link zur Datenschutzerklärung] +> Button: **„Wie macht ihr das bei euch?“** + +> **2. (nur nach Klick auf den Button)** Gern erzählen wir dir mehr. Wenn du magst, schauen wir uns in 20 Minuten an, wo bei dir im Betrieb Zeit verloren geht, und ob HiveGrid passt: [Terminlink] + +So kommt das PDF sofort und ohne Bedingung, und die Einladung nur, wenn jemand sie will. + +### 3.2 Kosten ManyChat + +ManyChats Preis- und Hilfeseiten haben unseren Abruf blockiert (Fehler 403). Die Zahlen stammen deshalb aus drei aktuellen Drittquellen und sind vor dem Abschluss selbst zu prüfen. + +| Tarif (seit März 2026) | Preis (jährlich / monatlich) | Aktive Kontakte im Monat | +|---|---|---| +| Free | 0 | 25, höchstens 4 Automationen, mit ManyChat-Hinweis (Q44, Q45) | +| Essential | 14 / 17 US-Dollar | 250, ohne Hinweis (Q44, Q45) | +| Pro | 29 / 39 US-Dollar | 2.500 (Q44, Q45) | +| Business | 69 / 99 US-Dollar | 7.500 (Q45) | + +- Ein aktiver Kontakt ist jede Person, mit der im Abrechnungszeitraum Nachrichten ausgetauscht werden, auch über Automationen (Q44). +- Laut einer Quelle laufen die alten Tarife (Free mit 1.000 Kontakten, Pro ab 15 US-Dollar) für Bestandskunden parallel weiter (Q46). +- Mehr Kontakte als gebucht kosten extra, bei Essential 0,10 US-Dollar je Kontakt (Q45). + +**Einschätzung:** Der neue Free-Tarif taugt nur zum Testen. Ein Reel mit 50 Kommentaren sprengt ihn. Realistisch wären etwa 14 bis 17 US-Dollar im Monat. + +### 3.3 Alternativen + +| Lösung | Kosten | Kann | Datenschutz | Quelle | +|---|---|---|---|---| +| **Metricool Flows** | in Starter enthalten, derzeit ohne Aufpreis | Kommentar zu Antwort oder DM nach Stichwort, DM-Stichworte, Story-Antworten, TikTok-Kommentare, bis zu 3 Textvarianten, Auswertung | EU (Madrid) | (Q37, Q43) | +| **Meta Business Suite** (eingebaut) | kostenlos | „Comment to Message“ und Stichwort-Antworten, nur am Desktop. Höchstens 5 Stichwörter, Groß- und Kleinschreibung zählt, 15 Minuten Verzögerung, eine Nachricht, keine Buttons, keine Folgenachrichten | kein weiterer Dienstleister | (Q49), Drittquelle | +| **ManyChat** | ab etwa 14 US-Dollar | volle Abläufe mit Buttons, Verzweigungen, E-Mail-Abfrage | USA, DPF-zertifiziert, SOC 2, ISO 27001 | (Q44, Q47) | + +Dazu testet Meta seit August 2026 eine Stichwort-Antwort für Instagram-Anzeigen. Sie ist nur für Werbung gedacht (Q50). + +**Offen bei Metricool Flows:** Ob es Buttons und eine zweite Nachricht nach einem Klick unterstützt, steht auf der Seite nicht. Das ist der wichtigste Punkt für den Test. + +### 3.4 DSGVO und UWG (Einordnung, keine Rechtsberatung) + +- **Die erste Nachricht ist angefordert.** Wer „PDF“ kommentiert, bittet um das PDF. **Einschätzung:** Die Antwort darauf ist keine unerwünschte Werbung, solange sie das Versprochene liefert und nicht mit Verkauf überladen ist. +- **Werbung per Direktnachricht braucht sonst eine Einwilligung.** § 7 Abs. 2 Nr. 2 UWG wertet Werbung mit „elektronischer Post“ ohne „vorherige ausdrückliche Einwilligung“ als unzumutbare Belästigung (Q51). Die ePrivacy-Richtlinie fasst „elektronische Post“ weit: jede gespeicherte Text-, Sprach- oder Bildnachricht über ein öffentliches Netz (Q52). **Einschätzung:** Instagram-DMs fallen darunter. Die zweite Nachricht ist nur sauber, weil sie nach einem Klick kommt. Spätere Erinnerungen, Rundsendungen oder „Hast du dir das PDF angesehen?“ ohne Einwilligung sind riskant. +- **E-Mail-Adresse im Chat abfragen:** Für das reine Zusenden des PDFs reicht die Anfrage selbst als Grundlage. Für einen Newsletter braucht es eine eigene Einwilligung mit Double-Opt-in. Eine Einwilligung im Messenger ist keine Newsletter-Einwilligung (Q48). Das PDF nur gegen Newsletter-Anmeldung herauszugeben ist rechtlich umstritten (Kopplungsverbot, Art. 7 Abs. 4 DSGVO). **Einschätzung:** Für HiveGrid nicht machen. Das passt auch nicht zu „Erst helfen“. +- **Informationspflichten:** Vor der Abfrage von Daten auf die Datenschutzerklärung verweisen. Darin müssen das DM-Werkzeug, der Zweck und die Speicherdauer stehen (Q48). **Einschätzung:** Beim Betrieb eines professionellen Instagram-Kontos ist man für bestimmte Verarbeitungen zusammen mit Meta verantwortlich. Das sollte die Datenschutzerklärung erwähnen. +- **Auftragsverarbeitung und USA:** Mit ManyChat braucht es einen Auftragsverarbeitungsvertrag, er liegt online vor. ManyChat ist nach dem EU-US Data Privacy Framework zertifiziert (Q47). Manche Anwälte halten Standardvertragsklauseln allein nicht für genug (Q48). +- **Abmelden:** Ein Stichwort wie STOP sollte jeden Ablauf beenden und das bestätigen (Q48). +- **Kennzeichnung:** Meta empfiehlt, Bots zu kennzeichnen (Q11). Seit 02.08.2026 gilt Art. 50 der KI-Verordnung: Wer mit einem KI-System chattet, muss das erkennen können, wenn es nicht offensichtlich ist (Q53). **Einschätzung:** Ein starrer Ablauf mit festen Texten ist kein KI-System. Sobald KI-Antworten (etwa „Manychat AI“) laufen, gilt die Pflicht. Ein Satz wie „Ich bin ein automatischer Helfer“ deckt beides ab. +- **Wer ist verantwortlich?** Die Reels laufen über **Noahs eigenes Konto**. Laufen die Leads dort ein, sammelt Noah als Person Daten für HiveGrid. **Einschätzung:** Das muss geklärt werden: wer verantwortlich ist, in wessen Datenschutzerklärung das steht und wohin die Daten fließen. + +### 3.5 Empfehlung + +1. **Zuerst Metricool Flows testen**, sobald Starter gebucht ist. Ein Anbieter weniger, EU, keine Zusatzkosten. Klären, ob Buttons und eine zweite Nachricht gehen. +2. **Reicht eine Nachricht mit PDF-Link**, ist auch die kostenlose Funktion der Meta Business Suite brauchbar. +3. **ManyChat Essential nur**, wenn der Ablauf mit Button und zweiter Nachricht anders nicht geht. +4. Vor dem Start: Texte im Du, Hinweis auf den Bot, Link zur Datenschutzerklärung, Datenschutzerklärung ergänzen, Frage der Verantwortung bei Noahs Konto klären, einmal vom Anwalt ansehen lassen. + +--- + +## 4. Subframe als Quelle für Marketing-Material + +### 4.1 Was der Subframe-MCP kann + +**Belegt (Q54):** Der offizielle Server (`https://mcp.subframe.com/mcp`, OAuth) gibt KI-Werkzeugen wie Claude Code Zugriff auf die Subframe-Projekte. In dieser Claude-Code-Umgebung ist er bereits verbunden. Die wichtigsten Werkzeuge: + +| Bereich | Werkzeuge | Nutzen für Marketing | +|---|---|---| +| Seiten | `list_pages`, `get_page_info` (React- und Tailwind-Code), `screenshot_page` (ganze Seite, einzelnes Element oder Breakpoint) | Produktbilder für Slides und Reels | +| Komponenten | `list_components`, `get_component_info` (Code und Design-Dokument), `screenshot_component` (alle Varianten und Zustände) | Bausteine wie Karten, Badges, Buttons einzeln | +| Theme | `get_theme` (Farben, Schriften, Ecken, Schatten, Typografie) | Markenfarben im Generator gleich halten | +| Icons, Schriften | `search_icons`, `list_icons`, `get_icon_info` (SVG), `list_fonts` (mit Adresse der eigenen Schriftschnitte) | SVG direkt in die Slides | +| Prototypen | `list_prototypes`, `get_prototype_info`, `read_prototype_file` | Ein Prototyp kommt als lauffähige Vite-App, startbar mit `npm install && npm run dev` | +| Sonstiges | `list_canvases`, `list_snippets`, `list_comments`, `search_docs` | Überblick, Feedback | + +- Es gibt auch Werkzeuge zum Entwerfen, Ändern und Löschen (`design_page`, `edit_component`, `edit_theme`, `delete_page` und weitere). Theme-Änderungen wirken sofort auf alle Seiten. Gelöschte Theme-Token lassen sich nicht sauber zurückholen (Q54). +- **Betrachter bekommen einen MCP nur zum Lesen.** Lesen, Screenshots und Doku-Suche gehen, Entwerfen und Ändern braucht einen Editor-Platz (Q54). +- **Betrachter sind in jedem Tarif kostenlos.** Bezahlt werden nur Admins und Editoren (Q60). +- Der Code wird ohne KI aus dem Design erzeugt: immer gleich, nur Darstellung, keine Logik (Q59). +- Subframe erzeugt nur React mit TypeScript und Tailwind. Für die CLI braucht ein Projekt React 16+, Tailwind 3.4+ und TypeScript (Q58). +- Mit der CLI lassen sich Komponenten in ein Projekt holen: `npx @subframe/cli@latest sync --all`. Das geht nur in eine Richtung und überschreibt lokale Änderungen (Q56). Für Agenten gibt es einen Modus ohne Rückfragen mit `SUBFRAME_AUTH_TOKEN` (Q57). +- Im Code-Tab lässt sich der Code jeder Seite oder Auswahl kopieren, als React mit Tailwind, als CSS oder als Eigenschaften (Q55). + +### 4.2 Wege in den Post-Generator + +Der Generator in `posts` ist reines HTML ohne Build und bewusst ohne CDN. Alles liegt im Repo. Subframe liefert dagegen React mit Tailwind. **Einschätzung:** Daraus ergeben sich vier Wege, vom einfachsten zum aufwendigsten. + +1. **Screenshots (sofort nutzbar).** `screenshot_page` oder `screenshot_component` aufrufen und die PNGs nach `posts/assets/screens/` legen. Vorher an einem Bild prüfen, ob die Auflösung für 1080 Pixel breite Slides reicht. Für scharfe Bilder sollte sie doppelt so hoch sein. +2. **Theme übernehmen.** Mit `get_theme` die Farben, Radien und Schriften auslesen und als CSS-Variablen in den Generator und in `rules.md` schreiben. Schriften über `list_fonts` herunterladen und unter `assets/fonts/` ablegen, damit das Repo autark bleibt. So sehen Slides und Produkt gleich aus. +3. **Code nachbauen.** Mit `get_page_info` oder `get_component_info` den Code holen und von Claude in statisches HTML mit CSS übersetzen lassen. Genau so ist das Wabenfeld aus `HoneycombSection.tsx` schon entstanden. Vorteil: scharf in jeder Größe und animierbar mit `animation.mjs`. +4. **Kleine Export-Werkstatt.** Ein eigener Ordner mit Vite, React und Tailwind, in den die Subframe-CLI die Komponenten synchronisiert. Ein Skript rendert Komponenten mit Beispieldaten und speichert sie als statisches HTML oder als PNG in doppelter Auflösung. Aufwand etwa ein halber bis ganzer Tag. Lohnt sich erst, wenn Wege 1 und 3 nicht reichen. + +**Für Reels besonders interessant:** Prototypen kommen als lauffähige App. Lokal starten, durchklicken und aufnehmen, mit QuickTime oder per Playwright. Das ergibt echte Bedienabläufe als Video, ohne die Staging-Umgebung und ohne echte Kundendaten. + +### 4.3 Beispiel-Prompts für Claude Code + +```text +Zeig mir alle Seiten im Subframe-Projekt von HiveGrid mit ihrem Canvas. +Mach von der Seite „Kalender“ einen Screenshot in der Desktop-Breite +und leg ihn unter posts/assets/screens/kalender.png ab. +``` + +```text +Lies das Subframe-Theme aus und schreib mir eine Tabelle der Farben mit +Token-Name und Hex-Wert. Vergleiche sie mit den Farben in posts/rules.md +und nenne Abweichungen. Ändere noch nichts. +``` + +```text +Hol den Code der Komponente „ContactCard“ und baue sie als statisches +HTML mit CSS im Stil von post8.html nach. Beispieldaten aus dem +Demo-Workspace, keine echten Namen. +``` + +### 4.4 Grenzen und Vorsicht + +- **Nur lesen.** In Marketing-Sitzungen keine Werkzeuge nutzen, die Designs ändern. Am einfachsten: Dejan arbeitet mit einem Betrachter-Platz, David behält die Bearbeitung. +- **Demo-Daten.** In Screens nur erfundene Namen. Subframe ist ein US-Anbieter. Solange keine echten Kundendaten in den Designs stehen, ist das datenschutzrechtlich unkritisch (Einschätzung). +- **Stimmt das Design mit dem Produkt überein?** Subframe-Seiten sind Entwürfe. Laut Kontext gilt für Posts „wortgetreu aus Code und Website belegt“. Vor jedem Post prüfen, ob die gezeigte Funktion so im Produkt ist. + +--- + +## 5. Werkzeuge für Video und Reels + +| Werkzeug | Kosten | Stärken | Datenschutz | +|---|---|---|---| +| **CapCut** | kostenlos, Pro kostenpflichtig | schnell, viele Vorlagen, automatische Untertitel | Verantwortlich ist Bytedance Pte. Ltd. in Singapur. Server in Malaysia, Singapur und den USA (Q61). Nutzer geben eine „unbefristete, weltweite“, übertragbare und unterlizenzierbare Lizenz an ihren Inhalten (Q62). In der Gratis-Version gelten für Vorlagen und Musik Einschränkungen bei kommerzieller Nutzung (Q62) | +| **Meta Edits** | kostenlos | Meta-App für iOS und Android seit 21.04.2025, Aufnahme und Schnitt am Handy, Greenscreen, Export bis 4K, Anbindung an Instagram (Q64) | Meta, also dort, wo die Inhalte ohnehin landen | +| **Descript** | Free: 1 Stunde im Monat, 720p, Wasserzeichen. Bezahlt etwa 16 bis 24 US-Dollar (Q65) | Schnitt über den Text, Füllwörter entfernen, Studio-Sound | US-Anbieter, Verarbeitung in der Cloud | +| **Premiere Pro** | 25,99 € im Monat (Jahresabo, monatlich bezahlt) (Q67) | Profi-Schnitt. Die Einblendungen in `posts/video/` sind schon für Premiere gebaut | Adobe, USA. Schnitt läuft lokal | +| **DaVinci Resolve** | Version 21 kostenlos bis UHD und 60 fps. Studio 295 US-Dollar einmalig (Q66) | Profi-Schnitt und Farbe. Schnitt über den Text nur in Studio (Q66) | Blackmagic Design, läuft lokal ohne Cloud | +| **OpusClip** | Free mit Wasserzeichen und 3 Tagen Speicher. Starter 15, Pro 29 US-Dollar im Monat (Q68) | schneidet aus langen Videos automatisch kurze Clips, mit Untertiteln und Formatwechsel | Cloud-Dienst | +| **Whisper** (lokal) | kostenlos | Untertitel als SRT mit Zeitmarken, Deutsch gut | läuft komplett auf dem Mac | + +**Zu CapCut (Einschätzung):** Hinzu kommt der Konzern-Hintergrund. Die irische Datenschutzbehörde hat TikTok, ebenfalls ByteDance, am 02.05.2025 zu 530 Mio. € verurteilt, weil Mitarbeiter in China auf Daten aus der EU zugreifen konnten (Q63). Für CapCut ist kein solcher Fall bekannt, die Konstruktion ist aber ähnlich. Für eine Marke mit dem Versprechen „Daten in Deutschland“ passt CapCut nicht, schon gar nicht für unveröffentlichte Produkt-Screens. Für Noahs eigene Marke ist es seine Entscheidung. Kunden-Material gehört dort nie hinein. + +**Untertitel (Einschätzung):** Der Weg mit dem besten Datenschutz ist Whisper lokal (Befehl in 1.6, Schritt 3), die SRT-Datei dann in Premiere oder DaVinci einlesen und gestalten. Für eingebrannte Untertitel ohne Schnittprogramm kann ffmpeg die SRT-Datei auch direkt ins Video schreiben. Das ließe sich später an den Generator anhängen. Instagram, Edits und CapCut bieten eigene automatische Untertitel, die sind aber weniger gut steuerbar. + +**Wiederverwerten (Einschätzung):** OpusClip und ähnliche Dienste lohnen sich erst bei langen Videos wie Webinaren oder Podcasts. Solange Reels gleich kurz produziert werden, braucht es das nicht. Für Reels auf TikTok reicht es, das fertige Video ohne Instagram-Wasserzeichen ein zweites Mal hochzuladen. + +**Empfehlung:** +- **Dejan:** Premiere, wenn eine Lizenz da ist, sonst DaVinci Resolve kostenlos. Untertitel aus Whisper. +- **Noah am Handy:** Meta Edits. +- **CapCut** für die Marke HiveGrid nicht nutzen. + +--- + +## 6. Newsletter + +### 6.1 Optionen im Vergleich + +| | HiveGrid-Modul | Brevo | CleverReach | rapidmail | LinkedIn-Newsletter | +|---|---|---|---|---|---| +| Sitz, Daten | Hetzner Falkenstein, Versand über Mailjet (EU) (Kontext) | Brevo GmbH in Berlin als Verantwortliche (Q71). Speicherorte im Vertrag prüfen | Deutschland, „Serverstandorte in der EU“ (Q72) | Server „ausschließlich in Deutschland“ (Q73) | LinkedIn | +| Kostenlos | intern | 300 E-Mails am Tag (Q70) | Lite: 250 Kontakte, 1.000 E-Mails im Monat (Q72) | bis 10 Empfänger immer, erster Versand an bis zu 2.000 Empfänger einmalig (Q73) | ja | +| Bezahlt ab | intern | Starter ab 5.000 E-Mails im Monat, Preis wird nur dynamisch angezeigt (Q70) | Basic ab 15 € im Monat (Q72) | 15 € im Monat für 500 Kontakte, oder 20 € je Versand an 500 Empfänger (Q73) | kostenlos | +| Double-Opt-in | eingebaut (Kontext) | ja | Standard (Q72) | ja | entfällt | +| Besonderheit | Dogfooding | MCP für Claude und ChatGPT (Q70) | | | eigene Reichweite in LinkedIn | + +### 6.2 LinkedIn-Newsletter als Kanal + +**Belegt (Q69):** + +- Jedes Mitglied kann einen Newsletter starten. Admins einer Unternehmensseite können als Seite veröffentlichen. +- Beim Start lassen sich alle Kontakte oder Follower zum Abonnieren einladen. Neue Follower bekommen die Einladung automatisch. +- Nach jeder Ausgabe gehen Push-, In-App- und E-Mail-Benachrichtigungen an alle Abonnenten. + +**Einschätzung:** +- Stark, weil LinkedIn die Zustellung übernimmt und die Zielgruppe für Partner und Investoren dort sitzt. +- Schwach, weil man keine eigene Adressliste bekommt und von LinkedIn abhängig bleibt. +- Die HiveGrid-Seite hat noch keine Beiträge. Ein Newsletter über **Noahs Profil** hätte mehr Zug als einer über die Seite. +- Am besten als Zweitverwertung: derselbe Monatsinhalt einmal als E-Mail und einmal als LinkedIn-Artikel. + +### 6.3 Dogfooding: was dafür spricht, was dagegen + +**Dafür (Einschätzung):** +- Glaubwürdigkeit: „Dieser Newsletter kommt aus HiveGrid“ ist selbst ein Beitrag. Der fertige E-Mail-Marketing-Post liegt schon unveröffentlicht bereit. +- Kein weiterer Dienstleister. Die Daten bleiben in Falkenstein, nur Mailjet kommt hinzu, und das ist ohnehin im Einsatz. +- Jede Ausgabe ist ein echter Test. Fehler findet das eigene Team, nicht ein Kunde. +- Keine Kosten. + +**Dagegen (Einschätzung):** +- Das Modul ist laut Kontext „pilotreif“, der **Nachweis für den Versand über Mailjet steht aus**. Ob Mails zuverlässig ankommen, ist also nicht belegt. +- Fehler bei Abmeldung oder Double-Opt-in sind rechtlich heikel (Abmahnrisiko nach § 7 UWG) und für eine Datenschutz-Marke peinlich. +- Das Anmeldefeld im Fußbereich der Website speichert laut Kontext nichts. Ohne Formular gibt es keine Liste. +- Das Team ist gerade im Bughunting gebunden. + +### 6.4 Empfehlung + +Das eigene Modul ist der Hauptweg, aber erst nach einer kurzen Prüfliste: + +1. Mailjet-Nachweis abschließen (Raffael). +2. Absender-Domain mit SPF, DKIM und DMARC prüfen. +3. Double-Opt-in einmal komplett durchspielen, mit Protokoll von Zeitpunkt und Bestätigung. +4. Abmeldelink und Impressum im Pflicht-Footer testen. +5. Testversand an Gmail, Outlook, GMX, web.de und T-Online, jeweils Posteingang oder Spam prüfen. +6. Anmeldeformular auf der Website anschließen, zum Beispiel über den Form Builder. + +Ist das nicht bis zur ersten Ausgabe fertig: **CleverReach Lite** (250 Kontakte, 1.000 Mails im Monat, kostenlos) oder **rapidmail** (erster Versand an bis zu 2.000 Empfänger gratis) als Brücke. Brevo nur, wenn der MCP für Claude wichtig wird. Parallel den Inhalt als LinkedIn-Newsletter über Noahs Profil spielen. + +--- + +## 7. Empfohlenes Setup + +### 7.1 Fahrplan + +Dejan steckt laut Kontext noch 1 bis 2 Wochen im Bughunting. Deshalb kommen die schnellen Schritte zuerst. + +| Nr. | Schritt | Wann | Aufwand | Kosten | Wer | +|---|---|---|---|---|---| +| 1 | Metricool-MCP in Claude Code anbinden, Rechte setzen | KW 41 | 15 min | 0 € | Dejan | +| 2 | 5 Wettbewerber in Metricool anlegen (im Free-Tarif nicht wieder löschbar, also gut wählen) | KW 41 | 30 min | 0 € | Dejan | +| 3 | Facebook-Seite anlegen, mit `hivegrid.de` verknüpfen, in Metricool verbinden | KW 41 | 1 h | 0 € | Dejan, David | +| 4 | TikTok-Konto anlegen, LinkedIn-Seite verbinden. Dafür Starter mit 5 Marken buchen, Noah als zweite Marke | KW 42 | 1 h | 16 € im Monat (Jahr) oder 20 € (Monat) | Dejan, Freigabe Noah | +| 5 | Reel-Werkbank einrichten, 5 Reels von Vorbild-Kanälen auswerten | KW 42 | 1 h, dann 20 min je Reel | 0 € | Dejan | +| 6 | Subframe: Theme mit `rules.md` abgleichen, 3 Test-Screenshots in den Generator | KW 42 | 2 bis 3 h | 0 € | Dejan, David | +| 7 | Meta-App für Business Discovery (nach Schritt 3) | KW 43 | 1 bis 2 h | 0 € | Dejan | +| 8 | Kommentar-zu-DM: Flows auf Noahs Konto testen, Texte im Du, Datenschutzerklärung ergänzen, Anwalt | KW 43 | 3 h plus Anwalt | 0 € (in Starter) | David, Noah | +| 9 | Newsletter: Prüfliste aus 6.4, erste Ausgabe | KW 43 bis 44 | hängt am Mailjet-Nachweis | 0 € | Raffael, Dejan | +| 10 | Subframe-Export-Werkstatt, nur wenn Screenshots nicht reichen | ab KW 44 | 0,5 bis 1 Tag | 0 € | Dejan | +| 11 | Nach 4 Wochen: Auswertung per Metricool-MCP, Monatsbericht | KW 45 bis 46 | 1 h | 0 € | Dejan | + +**Laufende Kosten im empfohlenen Setup:** etwa 16 bis 20 € im Monat für Metricool Starter. Optional ManyChat Essential mit 14 bis 17 US-Dollar, falls Flows nicht reicht. Dazu Premiere mit 25,99 €, falls noch keine Lizenz da ist. + +### 7.2 Minimal-Setup ohne Budget + +| Bereich | Werkzeug | Grenze | +|---|---|---| +| Planung und Zahlen HiveGrid | Metricool Free mit MCP | 1 Marke, 20 Beiträge im Monat, 30 Tage Historie, kein LinkedIn | +| LinkedIn | direkt in LinkedIn planen und posten | Zahlen nur in LinkedIn | +| Noahs Konten | direkt in den Apps, Insights in Instagram | keine gemeinsame Auswertung | +| Vorbild-Zahlen | 5 Wettbewerber in Metricool Free, dazu Business Discovery per eigener Meta-App | Wettbewerber nicht austauschbar | +| Vorbild-Machart | ffmpeg (vorhanden), yt-dlp und Whisper (kostenlos), Claude Code (vorhanden) | Rechtsfragen aus 1.6 | +| Kommentar-zu-DM | Meta Business Suite „Comment to Message“ | eine Nachricht, keine Buttons, 15 Minuten Verzögerung | +| Produktbilder | Subframe-MCP mit Betrachter-Platz | nur lesen | +| Video | DaVinci Resolve kostenlos oder Meta Edits, Untertitel mit Whisper | Schnitt über Text nur in Studio | +| Newsletter | HiveGrid-Modul, als Brücke CleverReach Lite | Mailjet-Nachweis offen, 250 Kontakte bei CleverReach | + +**Einschätzung:** Das Minimal-Setup trägt die ersten Wochen. Die erste Ausgabe, die sich wirklich lohnt, ist Metricool Starter. Damit kommen LinkedIn, Noahs Marke, unbegrenztes Planen und Flows für den DM-Funnel auf einmal dazu. + +--- + +## Offene Fragen an Dejan + +1. **Metricool-Tarif:** Läuft heute Free? Ist Starter mit 5 Marken für 16 bis 20 € im Monat freigegeben, und wer zahlt? +2. **Instagram `hivegrid.de`:** Ist das Konto Business oder Creator? Laut Kontext gibt es noch keine Facebook-Seite. Wer legt sie an, und wer wird Admin? +3. **Noahs Konten:** Ist Noahs Instagram ein professionelles Konto? Darf es als zweite Marke in HiveGrids Metricool? Wer hat Zugriff? +4. **DM-Funnel:** Läuft er über Noahs Konto oder über `hivegrid.de`? Wer ist für die Daten verantwortlich, und in wessen Datenschutzerklärung steht das? Soll im Chat eine E-Mail-Adresse abgefragt werden oder nur der PDF-Link raus? +5. **Vorbild-Kanäle:** Welche sind es? Sind sie Business- oder Creator-Konten (nötig für Business Discovery)? Welche 5 kommen in die Metricool-Wettbewerber? +6. **Rechtsfrage Download:** Soll die Reel-Werkbank mit Download laufen oder lieber die Variante „ansehen und diktieren“? Kurz mit dem Anwalt abstimmen? +7. **Claude:** Welches Abo nutzt du (Pro, Max, Team)? Ist in den Datenschutz-Einstellungen das Training mit deinen Chats abgeschaltet? +8. **Video:** Hast du eine Adobe-Lizenz? Womit schneidet Noah heute? +9. **Subframe:** Hast du einen Editor- oder einen Betrachter-Platz? In welchem Projekt liegen die aktuellen HiveGrid-Screens? Sind dort nur Demo-Daten? +10. **Newsletter:** Wann kommt der Mailjet-Nachweis, und wer macht ihn? Soll die erste Ausgabe notfalls über CleverReach oder rapidmail gehen? +11. **TikTok und YouTube:** Wer legt das TikTok-Konto an? Ist YouTube überhaupt gewollt (Shorts als Zweitverwertung)? + +--- + +## Quellen + +Alle abgerufen am 05.10.2026. Datum in Klammern, wenn die Seite eines nennt. „Suchauszug“ heißt: Die Seite wurde nicht vollständig gelesen, die Angabe stammt aus der Zusammenfassung der Suche. + +**Meta** +- Q1 Meta for Developers, IG User Business Discovery (Referenz): https://developers.facebook.com/docs/instagram-platform/instagram-graph-api/reference/ig-user/business_discovery +- Q2 Meta for Developers, Business Discovery (Anleitung, Facebook Login): https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/business-discovery +- Q3 Meta for Developers, Instagram Platform Overview: https://developers.facebook.com/docs/instagram-platform/overview +- Q4 Meta for Developers, IG Media (Referenz): https://developers.facebook.com/docs/instagram-platform/reference/instagram-media/ +- Q5 Meta for Developers, IG Media Insights: https://developers.facebook.com/docs/instagram-platform/reference/instagram-media/insights +- Q6 Meta for Developers, Instagram Platform Changelog (Einträge 21.01.2025, 03.12.2025, 22.04.2026): https://developers.facebook.com/docs/instagram-platform/changelog +- Q7 Meta for Developers, Get Started, Instagram API with Instagram Login: https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login/get-started +- Q8 Meta for Developers, Get Started, Instagram API with Facebook Login: https://developers.facebook.com/docs/instagram-platform/instagram-api-with-facebook-login/get-started +- Q9 Meta for Developers, Graph API Changelog (v26.0 vom 29.07.2026): https://developers.facebook.com/docs/graph-api/changelog +- Q10 Meta for Developers, Private Replies: https://developers.facebook.com/docs/instagram-platform/private-replies +- Q11 Meta for Developers, Messenger Platform Policy Overview: https://developers.facebook.com/docs/messenger-platform/policy/policy-overview +- Q12 James Chapman, Instagram Official APIs, Comprehensive Reference (Gist, April 2026, Drittquelle): https://gist.github.com/jameschapman2c/65eff9f54a2d350b17a6ce5127b9fe42 +- Q13 Meta, Introducing Meta Ads AI Connectors (29.04.2026): https://www.facebook.com/business/news/meta-ads-ai-connectors + +**MCP-Server** +- Q14 Carly, Instagram MCP: No Official Meta Server, and What Works (19.07.2026): https://www.usecarly.com/blog/instagram-mcp/ +- Q15 GitHub, jlbadano/ig-mcp: https://github.com/jlbadano/ig-mcp +- Q16 GitHub, mcpware/instagram-mcp: https://github.com/mcpware/instagram-mcp +- Q17 GitHub, IvanBBaev/tiktok-mcp: https://github.com/IvanBBaev/tiktok-mcp +- Q18 Soku, TikTok Ads MCP: Official Status, Setup, and Limits (Juni 2026, Suchauszug): https://soku.ai/blog/tiktok-ads-mcp-guide +- Q19 LinkupAPI, Best LinkedIn MCP Servers 2026 (12.09.2026): https://linkupapi.com/blog-articles/best-linkedin-mcp-servers +- Q20 GitHub, MCPWorks-Technologies-Inc/linkedin-pages-mcp: https://github.com/MCPWorks-Technologies-Inc/linkedin-pages-mcp +- Q21 Carly, Claude + YouTube: What the Integration Can (and Can't) Do in 2026 (Suchauszug): https://www.usecarly.com/blog/claude-youtube-integration/ +- Q75 GitHub, William-Gao/instagram-mcp (Projektbeschreibung, Suchauszug): https://github.com/William-Gao/instagram-mcp +- Q76 Blotato, TikTok API Pricing: Full Breakdown for 2026 (Suchauszug): https://www.blotato.com/blog/tiktok-api-pricing + +**Scraping, Download, Recht** +- Q22 Apify, Instagram Scraper: https://apify.com/apify/instagram-scraper +- Q23 Apify Blog, Is web scraping legal? (aktualisiert 10.02.2026): https://blog.apify.com/is-web-scraping-legal/ +- Q24 § 44b UrhG, Text und Data Mining: https://www.gesetze-im-internet.de/urhg/__44b.html +- Q25 § 53 UrhG, Vervielfältigungen zum privaten Gebrauch: https://www.gesetze-im-internet.de/urhg/__53.html +- Q26 Wikipedia, youtube-dl, Abschnitt zum Vorgehen gegen Uberspace (LG Hamburg, 310 O 316/21, 31.03.2023): https://de.wikipedia.org/wiki/Youtube-dl +- Q27 Instaloader, Command Line Options (v4.15.3): https://instaloader.github.io/cli-options.html +- Q28 Instaloader, Troubleshooting: https://instaloader.github.io/troubleshooting.html +- Q51 § 7 UWG, Unzumutbare Belästigungen: https://www.gesetze-im-internet.de/uwg_2004/__7.html +- Q52 Richtlinie 2002/58/EG (ePrivacy), Art. 2 lit. h (Abruf fehlgeschlagen, Wortlaut aus dem Gesetz): https://eur-lex.europa.eu/legal-content/DE/TXT/?uri=CELEX:32002L0058 +- Q53 Cloud Security Alliance, EU AI Act Article 50: Transparency Obligations Take Effect (29.07.2026, Suchauszug): https://labs.cloudsecurityalliance.org/research/csa-research-note-eu-ai-act-article-50-transparency-20260729/ + +**Metricool** +- Q29 Metricool Help Center, MCP limits and plan requirements: https://help.metricool.com/mcp-limits-and-plan-requirements-h72jg +- Q30 Metricool Help Center, How to connect Metricool's MCP with Claude: https://help.metricool.com/how-to-connect-metricools-mcp-with-claude-0l84v +- Q31 Metricool Help Center, MCP vs API access: https://help.metricool.com/mcp-vs-api-access-what-is-the-difference-5y3ib +- Q32 Metricool Help Center, FAQs about the Metricool MCP: https://help.metricool.com/faqs-about-the-metricool-mcp-1i3w0 +- Q33 Metricool Blog, How to Use Metricool with Claude: Every Feature, Explained (16.09.2026): https://metricool.com/how-to-use-metricool-mcp-with-claude/ +- Q34 Metricool Blog, Competitor Analysis on Social Media With Claude AI (07.09.2026): https://metricool.com/metricool-mcp-competitor-analysis-claude/ +- Q35 Metricool Help Center, Competitor Analysis: https://help.metricool.com/competitor-analysis-ouhue +- Q36 Metricool Help Center, Main differences between Free and paid plans: https://help.metricool.com/main-differences-between-free-and-paid-plans-bl0v9 +- Q37 Metricool, Pricing: https://metricool.com/pricing/ +- Q38 Metricool Help Center, Hashtag Tracker: https://help.metricool.com/en/article/hashtag-tracker-hgey9v/ +- Q39 Metricool Help Center, API Access: https://help.metricool.com/api-access-export-your-metricool-data-to-other-tools-and-automate-tasks-x8ln5 +- Q40 Metricool Help Center, Plans, add-ons, and API access explained: https://help.metricool.com/plans-add-ons-and-api-access-explained-xux1u +- Q41 Metricool, Privacy Policy (26.06.2026): https://metricool.com/privacy-policy/ +- Q42 Metricool Help Center, Data Processing Agreement (DPA): https://help.metricool.com/en/article/data-processing-agreement-dpa-1ba2m6t/ +- Q43 Metricool, Flows: https://metricool.com/flows/ + +**ManyChat und DM-Automation** +- Q44 Featurebase, Manychat Pricing 2026 (30.09.2026): https://www.featurebase.app/blog/manychat-pricing +- Q45 Setsmart, ManyChat Pricing 2026 (August 2026): https://setsmart.io/blog/manychat-pricing +- Q46 Chatarmin, ManyChat Pricing 2026 (25.09.2026): https://chatarmin.com/en/blog/manychat-pricing +- Q47 ManyChat, Data Processing Addendum und Privacy & Security (Suchauszug): https://manychat.com/legal/dpa und https://manychat.com/security +- Q48 Kanzlei Stapelfeldt, Manychat rechtssicher nutzen (16.06.2026): https://kanzlei-stapelfeldt.de/manychat-rechtssicher/ +- Q49 CreatorFlow, Instagram Built-In Automation: What Meta Gives Free (Juli 2026, Drittquelle): https://creatorflow.so/blog/instagram-built-in-automation/ +- Q50 Social Media Today, Meta tests auto-DM response for Instagram ad comments (25.08.2026): https://www.socialmediatoday.com/news/meta-tests-auto-dm-response-for-instagram-ad-comments/828791/ + +**Subframe** +- Q54 Subframe Docs, MCP server: https://docs.subframe.com/agent/mcp-server +- Q55 Subframe Docs, Exporting code: https://docs.subframe.com/design/code-mode/overview +- Q56 Subframe Docs, Syncing components: https://docs.subframe.com/develop/concepts/syncing-components +- Q57 Subframe Docs, CLI in CI & agents: https://docs.subframe.com/develop/guides/cli-automation +- Q58 Subframe Docs, Installation: https://docs.subframe.com/develop/installation +- Q59 Subframe Docs, Code generation: https://docs.subframe.com/develop/concepts/code-generation +- Q60 Subframe Docs, Managing pricing and plans: https://docs.subframe.com/admin/pricing-and-plans + +**Video** +- Q61 CapCut, Privacy Policy (15.04.2026): https://www.capcut.com/clause/privacy +- Q62 CapCut, Terms of Service (15.04.2026): https://www.capcut.com/clause/terms-of-service +- Q63 Data Protection Commission (Irland), Geldbuße gegen TikTok über 530 Mio. € (02.05.2025): https://www.dataprotection.ie/en/news-media/latest-news/irish-data-protection-commission-fines-tiktok-eu530-million-and-orders-corrective-measures-following +- Q64 Wikipedia, Edits (app): https://en.wikipedia.org/wiki/Edits_(app) +- Q65 Descript, Pricing: https://www.descript.com/pricing +- Q66 Blackmagic Design, DaVinci Resolve: https://www.blackmagicdesign.com/products/davinciresolve +- Q67 Adobe, Premiere Pläne (Deutschland): https://www.adobe.com/de/products/premiere/plans.html +- Q68 OpusClip, Pricing: https://www.opus.pro/pricing + +**Newsletter** +- Q69 LinkedIn Hilfe, Newsletter: https://www.linkedin.com/help/linkedin/answer/a522525 +- Q70 Brevo, Preise: https://www.brevo.com/de/pricing/ +- Q71 Brevo, Datenschutzerklärung: https://www.brevo.com/de/legal/privacypolicy/ +- Q72 CleverReach, Preise: https://www.cleverreach.com/de-de/preise/ +- Q73 rapidmail, Preise: https://www.rapidmail.de/preise-newsletterversand + +**Intern** +- Kontext: `Brainstorming Kickoff/Kontext/Kontext.md` (F11 Du, F13 Kanäle, F15 Team, F16 Budget, F18 Stand der Kanäle, 6.3 Add-ons, 10.1 Generator, 10.5 Newsletter-Feld) +- Davids Papier: `Brainstorming Kickoff/MarketingBrainstormingOld.md` (ManyChat-Ablauf und technische Grenzen) +- Prüfung auf Dejans Mac am 05.10.2026: installierte Werkzeuge, Test der ffmpeg-Befehle diff --git a/Brainstorming Kickoff/Research/05-kanaele-jenseits-social.md b/Brainstorming Kickoff/Research/05-kanaele-jenseits-social.md new file mode 100644 index 0000000..7aadb03 --- /dev/null +++ b/Brainstorming Kickoff/Research/05-kanaele-jenseits-social.md @@ -0,0 +1,684 @@ +# 05 Marketingkanäle jenseits von Social Media + +**Stand:** 05.10.2026 +**Für:** Dejan Cosic, zur Weitergabe an Noah Geerkens und David Bertram +**Thema:** Welche Kanäle außer Instagram, Facebook, LinkedIn und TikTok bringen HiveGrid in den nächsten 3 bis 6 Monaten zu Erstgesprächen, Demos und ersten zahlenden Kunden? + +**Lesehilfe** +- **Belegt** heißt: steht so in einer verlinkten Quelle. Datum der Quelle oder Abrufdatum steht in der Quellenliste. +- *Einschätzung* heißt: meine Bewertung für HiveGrid, abgeleitet aus den Quellen und dem Kontext-Dokument. Keine Zahl in einer Einschätzung ist gemessen. +- Suchvolumen habe ich nicht gemessen. Aussagen zu Nachfrage und Wettbewerb bei SEO beruhen auf den Suchergebnissen vom 05.10.2026. +- Rechtliche Abschnitte sind eine Einordnung und keine Rechtsberatung. Vor einem Leitfaden für den Vertrieb sollte der Anwalt, mit dem Dejan die Rechtstexte gemacht hat, kurz draufschauen. + +--- + +## Kurzfassung + +1. **Cold Calling ist nur dort sicher, wo der Betrieb selbst Kontakt gesucht hat.** Messe-Kontakte, die sich über das Website-Formular gemeldet haben, sind gut abgesichert. Anrufe bei Betrieben ohne jeden Vorkontakt sind riskant: Dass die Software für den Betrieb nützlich wäre, reicht laut Rechtsprechung nicht. Das Bundesverwaltungsgericht hat das im Januar 2025 auch datenschutzrechtlich festgezurrt. +2. **Kalt-E-Mails und Werbe-Nachrichten auf LinkedIn sind ohne vorherige Einwilligung verboten, auch im B2B.** Das betrifft den geplanten Sales Navigator. Eine E-Mail nach dem Anruf geht nur, wenn der Betrieb im Gespräch ausdrücklich zugestimmt hat. +3. **Der Hebel mit der höchsten Kaufnähe und null Kosten sind die Partnerverzeichnisse der ERP-Hersteller.** KWP lädt Hersteller von Zusatzlösungen ausdrücklich ein, sich in das Verzeichnis „Externe Add-ons“ aufnehmen zu lassen. HalloPetra steht dort schon. pds listet Partner-Lösungen unter „Multi-Cloud / API“. +4. **Bewertungsportale sind leer genug, dass wenige echte Bewertungen reichen.** Auf OMR Reviews hat plancraft in der Kategorie Handwerkersoftware 12 Bewertungen, HERO 9, ToolTime 6. Ein Profil ist kostenlos. Bewertungen gibt es aber erst, wenn Geerkens HiveGrid im Alltag nutzt. +5. **SEO lohnt sich nur in der Nische.** Für „KWP Schnittstelle“ oder „pds ergänzen“ ranken heute kleine Anbieter und die Hersteller selbst. Für „Handwerkersoftware SHK“ oder „CRM für Handwerker“ dominieren Vergleichsportale mit Affiliate-Links und große Anbieter. Das ist in 6 Monaten nicht zu gewinnen. +6. **Messen 2026/2027:** GET Nord in Hamburg (19. bis 21.11.2026) und ISH in Frankfurt (15. bis 19.03.2027) als Besucher mit vorab vereinbarten Gesprächen. Die SHK+E Essen ist erst wieder 2028 (21. bis 24.03.2028), die IFH/Intherm auch (25. bis 28.04.2028). Ein eigener Stand lohnt sich frühestens 2028. +7. **Förderung als Verkaufsargument ist dünn.** go-digital und Digital Jetzt sind ausgelaufen, das Mittelstand-Digital Zentrum Handwerk endete am 30.06.2026. In NRW fördert MID seit 2026 keine internen Digitalisierungsprojekte mehr. Bayern (Digitalbonus bis Ende 2027) ist die Ausnahme. +8. **PR und Podcasts haben einen echten Anlass: Noahs Geschichte.** Es gibt mindestens zehn aktive Podcasts für SHK-Unternehmer und Handwerkschefs mit Gesprächsformat. Fachmedien schreiben vor allem über Technik. Ein Anwenderbericht über Geerkens ist der stärkste PR-Anlass, sobald er stimmt. +9. **Ein Wettbewerber besetzt „ergänzend“ schon.** werkflow.digital nennt sich „das automatisierte CRM-System für Ihren SHK-Betrieb“ und läuft „ergänzend zu Ihrer bestehenden Software“, allerdings ab 10.000 € Einstieg plus 2.500 € im Monat. Die Positionierung ist also nicht mehr ganz frei, der Preisunterschied ist aber riesig. +10. **Priorität jetzt:** Anruf-Leitfaden rechtssicher machen, Newsletter mit Double-Opt-in und einem Lead-Magneten aufsetzen, KWP- und pds-Verzeichnis beantragen, mit HalloPetra gemeinsam auftreten, OMR-Profil anlegen, fünf Podcasts für Noah anfragen, GET Nord und ISH planen. + +--- + +## 1. E-Mail und Newsletter + +### 1.1 Recht in Deutschland + +**Belegt: Der Rahmen** +- Werbung mit elektronischer Post braucht eine **vorherige ausdrückliche Einwilligung** (§ 7 Abs. 2 Nr. 2 UWG). Das gilt gegenüber Verbrauchern und Unternehmen gleich. +- Telefonwerbung braucht gegenüber Verbrauchern eine ausdrückliche Einwilligung. Gegenüber „sonstigen Marktteilnehmern“, also Betrieben, reicht eine **mutmaßliche Einwilligung** (§ 7 Abs. 2 Nr. 1 UWG). +- Die Einwilligung muss der Werbende nachweisen können (Art. 7 Abs. 1 DSGVO). Das **Double-Opt-in** steht nicht wörtlich im Gesetz, ist aber das übliche Verfahren dafür. Protokolliert werden Zeitpunkt der Anmeldung, Zeitpunkt der Bestätigung, IP-Adressen und die Fassung des Einwilligungstextes (BfDI, dr-datenschutz). +- Abmahnkosten liegen laut Kanzlei Grabosch (27.07.2026) bei rund 370 bis 455 € durch Einzelne, rund 975 € durch Wettbewerber und ab rund 1.500 € durch Verbände. Dazu kommt eine Unterlassungserklärung mit Vertragsstrafe. Die Bundesnetzagentur darf Bußgelder nur bei Anrufen gegenüber Verbrauchern verhängen. + +**Belegt: Die Bestandskunden-Ausnahme (§ 7 Abs. 3 UWG)** +Werbe-E-Mails ohne Einwilligung sind erlaubt, wenn alle vier Bedingungen erfüllt sind: +1. Die Adresse wurde im Zusammenhang mit einem Verkauf erhoben. +2. Beworben werden nur eigene ähnliche Waren oder Dienstleistungen. +3. Der Kunde hat nicht widersprochen. +4. Er wurde bei der Erhebung und in jeder Mail klar auf sein Widerspruchsrecht hingewiesen. + +Der **EuGH hat das am 13.11.2025 erweitert** (C-654/23, Inteligo Media): +- Auch ein kostenloses Konto, für das man seine E-Mail-Adresse angibt, kann ein „Verkauf“ im Sinne der Regel sein. +- Ein Newsletter mit überwiegend redaktionellem Inhalt kann trotzdem Direktwerbung sein, wenn er ein wirtschaftliches Ziel verfolgt. +- Sind die Bedingungen erfüllt, braucht es keine zusätzliche Rechtsgrundlage nach DSGVO. Datenschutzbehörden sind dafür nicht zuständig. + +*Einschätzung für HiveGrid:* +- Wer einen persönlichen Demo-Workspace bekommt, könnte unter diese Ausnahme fallen. Dafür muss der Hinweis auf das Widerspruchsrecht schon bei der Erhebung stehen. +- Deutsche Gerichte haben das Urteil noch kaum angewendet. Für die Newsletter-Anmeldung bleibt Double-Opt-in der sichere Weg. + +### 1.2 Kaltakquise per E-Mail an Betriebe + +**Belegt** +- Ohne vorherige Einwilligung unzulässig, auch im B2B. Schon eine einzelne unverlangte Werbe-Mail an ein Unternehmen reicht (BGH, Beschluss vom 20.05.2009, I ZR 218/07). +- **LinkedIn- und Xing-Nachrichten** mit werblichem Inhalt gelten als elektronische Post (OLG Hamm, 2023, 18 U 154/22). Eine angenommene Vernetzungsanfrage ist keine Einwilligung (AG Düsseldorf, 20.11.2025, 23 C 120/25). Beides laut Grabosch. +- Eine **Visitenkarte** auf der Messe ist keine Einwilligung in Werbe-Mails, auch wenn die Adresse handschriftlich ergänzt ist. Das hat das österreichische Bundesverwaltungsgericht am 16.08.2023 entschieden (W157 2262141-1). Deutsche Kommentare sehen das ähnlich. +- **Adressierte Briefwerbung** an Betriebe ist ohne Einwilligung zulässig, solange kein Widerspruch vorliegt (laut Grabosch mit Verweis auf OLG Stuttgart, Februar 2024). + +*Einschätzung:* +- Keine Kalt-Mails, auch keine „nur eine kurze Info“-Mail. +- LinkedIn nur für Vernetzen und Inhalte nutzen. Keine Pitch-Nachrichten an Betriebe, mit denen es vorher keinen Kontakt gab. Das gilt für Noahs Profil und für den geplanten Sales Navigator. +- Wenn Haris im Telefonat fragt „Darf ich Ihnen die Unterlagen per Mail schicken?“ und der Betrieb Ja sagt, ist das eine ausdrückliche Einwilligung. Sie muss aber dokumentiert werden: Datum, Name, wofür. Am besten direkt als Notiz im HiveGrid-CRM. + +### 1.3 Kaltanrufe B2B + +**Belegt: Was die Gerichte verlangen** +- Eine mutmaßliche Einwilligung braucht **konkrete tatsächliche Umstände vor dem Anruf**, aus denen sich ein sachliches Interesse gerade an diesem Anruf ergibt. +- **Nicht ausreichend** sind laut IHK Nord Westfalen und Grabosch: + - ein allgemeiner Sachbezug zum Geschäft des Betriebs (IHK nennt BGH I ZR 191/03), + - dass die Leistung für den Betrieb nützlich wäre (OLG Hamm, 4 U 189/09), + - Branchenüblichkeit, + - ein Eintrag in Gelben Seiten oder im Impressum, + - eine getauschte Visitenkarte. +- Die Vermutung muss sich auch auf die **Art der Werbung** beziehen, also auf das Telefon. Ein freundliches Gespräch heilt nachträglich nichts. +- **BVerwG, 29.01.2025, 6 C 3.23:** + - Ein Unternehmen hatte Telefonnummern von Zahnarztpraxen aus öffentlichen Verzeichnissen gesammelt und dort für den Ankauf von Edelmetallresten angerufen. + - Das Gericht entschied: Ohne (mutmaßliche) Einwilligung gibt es auch kein berechtigtes Interesse nach Art. 6 Abs. 1 lit. f DSGVO. + - Die Wertungen des § 7 UWG fließen in die DSGVO-Prüfung ein. Damit kann auch die Datenschutzbehörde gegen Kaltanrufe vorgehen, nicht nur Wettbewerber. +- **Es gibt Gegenbeispiele:** + - Das LG Kleve (28.09.2022, 6 S 81/20) hat bei einem Anruf für einen Branchenbucheintrag eine mutmaßliche Einwilligung bejaht. + - Der BGH (05.02.2004, I ZR 87/02) hat sie bei einem engen Zusammenhang mit einer bestehenden Geschäftsbeziehung bejaht. + - Die Rechtsprechung ist also nicht einheitlich, die Linie seit 2025 ist aber streng. + +*Einschätzung: Was das für Haris heißt* + +| Gruppe | Risiko | Vorgehen | +|---|---|---| +| Hat sich über das Website-Formular gemeldet (zum Beispiel nach der Messe) | gering | Anrufen. Den Formulartext aufheben, dem die Person zugestimmt hat. | +| Persönliches Gespräch auf Messe oder Event, Betrieb hat um Rückruf gebeten | gering | Anrufen. Notiz mit Datum und Inhalt der Bitte ins CRM. | +| Visitenkarte ohne Bitte um Rückruf | mittel | Lieber Brief oder Postkarte mit Cal-Link. Anrufen nur, wenn es einen konkreten Anlass gab. | +| Kein Vorkontakt, Nummer aus Liste oder Recherche | hoch | Nicht kalt anrufen. Erst ein adressierter Brief mit persönlichem Bezug, dann Anruf nur bei Rückmeldung. | +| Bestandskunde des ERP-Partners, vom Partner empfohlen | gering bis mittel | Nur mit Zustimmung, die der Partner eingeholt hat | + +- Ein **Brief-zuerst-Ablauf** passt zur Zielgruppe: Inhaber lesen Post, und ein Brief von einem SHK-Meister wirkt anders als ein Anruf eines Vertrieblers. Kosten: Porto und Druck, also wenige Euro pro Betrieb. +- Wichtig ist eine **Sperrliste**: Wer sagt „bitte nicht mehr anrufen“, wird sofort markiert. + +### 1.4 Newsletter-Formate, die im Handwerk funktionieren + +**Belegt: Was es gibt** +- Fachmedien schicken kurze, häufige Nachrichten. IKZ verschickt zum Beispiel „aktuelle News zwei bis viermal wöchentlich“. handwerk.com wirbt mit „Aktuelle Themen, Trends und Hintergründe, kompakt erklärt“. +- Die Zielgruppe ist laut Bitkom überlastet: 72 % sagen, sie haben zu viel zu tun, um sich mit Digitalisierung zu beschäftigen (Kontext, 7.2). + +*Einschätzung: Ein Format für HiveGrid* +- **Monatlich, nicht wöchentlich.** Ein Thema pro Ausgabe, lesbar in zwei Minuten auf dem Handy. +- **Absender ist Noah**, nicht „das HiveGrid-Team“. Betreff ohne Werbesprache. +- **Bausteine, die sich aus vorhandenem Material speisen:** + 1. „Automation des Monats“ aus den 30 Golden Flows: ein Ablauf, ein Bild, ein Satz Nutzen. + 2. „Aus dem Betrieb“: Was bei Geerkens gerade passiert, ehrlich auch mit dem, was nicht klappt. + 3. „So bauen wir HiveGrid“: passt zur Entscheidung, den Bau offen zu zeigen (Kontext, F6). + 4. Ein Termin: Webinar, Messe, Podcastfolge. +- **Versand über das eigene E-Mail-Marketing-Modul**, wenn es Double-Opt-in mit Protokoll kann. Das ist zugleich ein Beleg für das Produkt. Siehe offene Fragen. +- **Ausgangslage:** Das Newsletter-Feld im Fußbereich der Website speichert heute nichts (Kontext, 10.5). Das muss zuerst repariert werden, sonst läuft jeder Lead-Magnet ins Leere. + +--- + +## 2. Lead-Magneten + +**Belegt: Was Wettbewerber machen** +- **plancraft** bietet kostenlose Vorlagen für Angebot, Rechnung, pauschale und kumulative Abschlagsrechnung als Word, Excel, Google Sheets und Pages an. + - **Ohne E-Mail-Abfrage**, direkt über Google-Drive-Links. + - Die Seite ist ein SEO-Ratgeber mit FAQ und endet mit Test und Demo. + - Dazu kommen ein Empfehlungsprogramm und ein Wechselbonus von „bis zu 1.200 €“. +- **HERO** arbeitet mit Blog-Ratgebern, Interviews mit Betrieben, Webinaren, Vorlagen (Rechnung) und einem 14-Tage-Test. +- **STREIT** bietet eine Excel-Vorlage zur Stundensatz-Ermittlung, abgestimmt unter anderem auf SHK. +- Kostenlose Stundenverrechnungssatz-Rechner gibt es schon mehrfach, zum Beispiel bei werkstatt-ratgeber.de mit Vorlagen für SHK. +- Der **ZVSHK** hat am 12.01.2026 einen kostenlosen Praxisleitfaden veröffentlicht: „12 Erfolgsfaktoren“ für die Einführung von Software im Handwerk, mit Lernvideos. Kernaussage: Software scheitert selten an der Technik, sondern an fehlender Beteiligung, Akzeptanz und Kommunikation. +- Die **BEG-Heizungsförderung** (KfW 458) hat sich zum 21.07.2026 deutlich geändert: + - förderfähige Kosten 28.000 € statt 30.000 €, + - Klimageschwindigkeitsbonus 16 % statt 20 %, danach halbjährlich weniger, + - Effizienzbonus entfällt, + - ab 2027 sinkt die Grundförderung für Wärmepumpen auf 15 %. + - Laut ADAC lässt das neue Gebäudemodernisierungsgesetz fossile Heizungen beim Tausch wieder zu. + +*Einschätzung: Ideen im Vergleich* + +| Idee | Passung zu HiveGrid | Aufwand | Risiko | Urteil | +|---|---|---|---|---| +| **„30 Automationen für SHK-Betriebe“** als PDF oder Seite, aus den Golden Flows | sehr hoch, zeigt genau den Unterschied | gering, Material liegt vor | gering | **jetzt** | +| **„Der Wärmepumpenauftrag in 10 Schritten“**, aus dem echten Geerkens-Prozess (10 Phasen, 13 Stellen, 17 Übergaben) als Checkliste | sehr hoch, echt und konkret | gering bis mittel | Noah muss freigeben, was öffentlich sein darf | **jetzt** | +| **Prozess-Check „Wo verliert dein Betrieb Zeit?“**, 10 bis 12 Fragen mit Auswertung je Bereich (Anfrage, Termin, Übergabe Büro und Baustelle, Doku, Nachfassen) | sehr hoch, führt direkt ins Erstgespräch | mittel, als HiveGrid-Formular baubar | gering | **in 3 Monaten** | +| **„Neue Software? Erst diese 12 Fragen“**, eine Checkliste vor dem Softwarekauf, mit Verweis auf den ZVSHK-Leitfaden | hoch, trägt „Verbinden statt ersetzen“ | gering | gering | **jetzt oder in 3 Monaten** | +| **Datenschutz-Checkliste für SHK-Betriebe** (wo liegen Kundendaten, wer hat Zugriff) | hoch, trifft das 96-%-Hemmnis | mittel | rechtlich sauber formulieren | **später** | +| **BEG-Förder-Check** für Endkunden | mittel, das ist ein Werkzeug für die Kunden der Betriebe | hoch, Regeln ändern sich halbjährlich | Haftung bei falscher Auskunft | **nicht** als Rechner. Höchstens als Formularvorlage „Förderfragen beim Erstkontakt“ ohne Berechnung. | +| **Stundenverrechnungssatz-Rechner** | gering, HiveGrid kalkuliert nicht | mittel | gering | **nicht**, das Feld ist besetzt | + +- **Freischalten gegen E-Mail oder offen?** Am besten gemischt: + - Offene Seiten bringen Suchmaschinen-Traffic. So macht es plancraft. + - Der Download mit E-Mail-Adresse bringt Newsletter-Kontakte. + - Vorschlag: die Seite offen, das ausführliche PDF gegen E-Mail mit Double-Opt-in. +- **Dogfooding:** Der Prozess-Check als HiveGrid-Formular landet direkt im Vertriebs-CRM. Haris sieht dann vor dem Gespräch, wo der Betrieb hakt. + +--- + +## 3. SEO und Google + +### 3.1 Suchanfragen: Nachfrage und Wettbewerb + +Gemessene Suchvolumen habe ich nicht. Die Tabelle beruht auf den Suchergebnissen vom 05.10.2026. + +| Cluster | Beispiele | Wer heute oben steht (belegt) | Nachfrage (*Einschätzung*) | Wettbewerb (*Einschätzung*) | Kaufnähe | +|---|---|---|---|---|---| +| **ERP-Anbindung** | „KWP Schnittstelle“, „KWP CRM“, „KWP App“, „pds API“, „pds Erweiterung“ | KWP selbst, HalloPetra (Seite „kwp Software × HalloPetra“), MeinHandwerker-App, Craftnote, Softgewerk, AGFEO | gering, aber genau die Zielgruppe | gering, kleine Anbieter mit Doku-Seiten | sehr hoch | +| **Alternative** | „pds Alternative“, „KWP Alternative“ | OMR Reviews (Alternativen-Seite), softguide, softwareabc24, trusted.de | gering bis mittel | mittel, Portale | hoch, aber mit Wechselabsicht | +| **Kategorie** | „Handwerkersoftware SHK“, „CRM für Handwerker“, „Plantafel Software“, „digitale Plantafel“ | HERO, plancraft, STREIT, Craftboxx, openHandwerk, pds, dazu Vergleichsportale (trusted.de, fuer-gruender.de, handwerk-digitalisieren.de) | mittel bis hoch | sehr hoch | mittel | +| **Problem und Ratgeber** | „Wärmepumpe Auftrag Ablauf“, „Kundenanfragen organisieren Handwerk“, „Monteur App“, „Automatisierung Handwerk“ | Anbieter-Blogs, Ratgeberseiten | mittel | mittel bis hoch | gering bis mittel | + +*Einschätzung* +- **Nische zuerst.** Eigene Seiten zu „HiveGrid und KWP“ und „HiveGrid und pds“ haben eine realistische Chance, weil dort heute kaum jemand mit einer klaren Antwort steht. Wer so sucht, hat das ERP schon und sucht eine Ergänzung. Das ist genau die Botschaft. +- **„Alternative“-Suchen gezielt umdrehen.** Eine Seite „pds ergänzen statt ersetzen“ fängt Leute ab, die eigentlich wechseln wollen, und bietet den leichteren Weg. +- **Kategorie-Begriffe nicht in 6 Monaten erzwingen.** Dort stehen Anbieter mit Jahren an Inhalten und Portale mit Affiliate-Budget. +- **Altlast:** Der SEO-Titel der Website verspricht heute All-in-One im Sie (Kontext, 0). Er widerspricht der Positionierung. Laut F14 wird in diesem Projekt nicht am Code gearbeitet, für die Website-Planung muss es aber auf die Liste. +- **Wettbewerber werkflow.digital:** + - Er rankt für „CRM für Handwerker SHK“ und schreibt „ergänzend zu Ihrer bestehenden Software“, mit Beispielen wie Hero und Handwerker-Office. + - Preis: Starterpaket 10.000 € einmalig, Modul-Flatrate 2.500 € im Monat, Wartung 300 € im Monat. + - KWP und pds nennt werkflow nicht. Der Abstand zu HiveGrid liegt bei Preis und Tiefe der Anbindung. + +### 3.2 Google-Unternehmensprofil + +**Belegt:** Laut Google ist ein Profil nur erlaubt, wenn das Unternehmen einen Standort hat, den Kunden besuchen können, oder Leistungen beim Kunden vor Ort erbringt. Virtuelle Büros sind ausgeschlossen. Ein Büro in einem Co-Working-Space zählt nur, wenn es beschildert ist, während der Öffnungszeiten Personal da ist und Kunden empfangen werden. + +*Einschätzung* +- Für eine Web-Software ist das Profil nur zulässig, wenn das Büro in Rheinberg wirklich Kunden empfängt, etwa für Vor-Ort-Demos. +- Der Nutzen ist klein: Kaum jemand sucht „Software Rheinberg“. Der Vorteil wären Google-Bewertungen bei der Markensuche „HiveGrid“. +- Priorität: niedrig. Nur anlegen, wenn die Bedingungen ehrlich erfüllt sind. Sonst droht die Sperrung. + +### 3.3 Vergleichsseiten und Ratgeber + +**Belegt** +- Vergleichsportale wie trusted.de, fuer-gruender.de, handwerk-digitalisieren.de, softguide.de und softwareabc24.de stehen bei Kategorie-Suchen weit oben. +- handwerk-digitalisieren.de arbeitet mit Affiliate-Links (Awin, Impact) und Rabattcodes, ohne sichtbaren Hinweis auf Provisionen. +- Für-Gründer.de hat 12 Handwerkersoftwares nach 107 Kriterien bewertet. + +*Einschätzung* +- Die Aufnahme in solche Portale läuft meist über ein Affiliate- oder Partnermodell mit Provision pro Test oder Kauf. HiveGrid hat keinen Selbsttest und keine öffentlichen Preise. Damit passt HiveGrid schlecht in diese Logik. +- Kostenlose Einträge (softguide, softwareabc24) kann man anlegen, wenn Zeit ist. Die Wirkung ist gering. +- **Eigene Vergleichsseiten** („HiveGrid oder neues ERP?“, „HiveGrid neben KWP“) sind wertvoller als fremde Portale. Sie müssen fair formuliert sein, sonst wirken sie wie ein Angriff auf das ERP, das der Kunde mag. + +--- + +## 4. Bewertungs- und Softwareportale + +**Belegt** + +| Portal | Kosten Profil | Bezahlte Optionen | Stand im Handwerk | +|---|---|---|---| +| **OMR Reviews** | „kostenfrei listen“ | Reviews und Badges, Buyer Intent, Sponsored Content, PPC, „Tool Talks“ (Webinar-Format). Preise nicht öffentlich. | Kategorie Handwerkersoftware: STREIT 110 Bewertungen, das programm 20, Craftboxx 14, plancraft 12, HERO 9, ToolTime 6. KWP, pds und Craftnote nicht unter den ersten 15. | +| **Capterra** (DE: capterra.com.de) | laut Anbieterseite „Capterra, powered by G2 Digital Markets“, Kosten auf der Seite nicht genannt | „Lead generation program“ | Eigene Kategorie Handwerkersoftware auf der Startseite nicht sichtbar, Field-Service-Management schon | +| **GetApp, Software Advice** | nicht geprüft | nicht geprüft | Früher eine gemeinsame Plattform mit Capterra. Ob das unter G2 so bleibt, ist offen. | +| **Trustpilot** | kostenlos, 50 Bewertungseinladungen im Monat | Starter ab 119 €, Plus ab 189 €, Premium ab 479 € im Monat, jeweils 12 Monate Bindung | eher Endkunden-Portal | +| **Google-Bewertungen** | kostenlos | keine | nur mit Unternehmensprofil (siehe 3.2) | + +**Belegt: Regeln für Bewertungen** +- Gefälschte Bewertungen zu beauftragen ist unlauter (UWG, Anhang zu § 3 Abs. 3, Nr. 23c). +- Wer behauptet, Bewertungen stammen von echten Nutzern, muss angemessen prüfen (Nr. 23b). + +*Einschätzung* +- **OMR Reviews ist der richtige Ort.** Es ist deutsch, B2B, kostenlos, und die Konkurrenz hat erstaunlich wenige Bewertungen. Zehn echte Bewertungen würden HiveGrid auf Augenhöhe mit plancraft und HERO bringen. +- **Nach Aussage von OMR lesen KI-Systeme diese Profile.** Das kann künftig bei Antworten von ChatGPT und Co. helfen. Belegen lässt sich der Effekt nicht. +- **Ehrlich sammeln:** + 1. Erst bewerten lassen, wenn echte Nutzung da ist. Bei Geerkens frühestens 4 bis 6 Wochen nach dem Start im Alltag. + 2. Persönlich fragen, Noah oder Haris, mit direktem Link. Keine Massenmail. + 3. Verschiedene Rollen fragen: Büro, Monteur, Chef. Das ist glaubwürdiger als drei Bewertungen der Geschäftsführung. + 4. Keine Gegenleistung, die an eine gute Note geknüpft ist. Wenn OMR eigene Gutschein-Aktionen anbietet, ist das deren Verfahren. Dann klar kennzeichnen. + 5. Auch Kritik stehen lassen und öffentlich ruhig antworten. +- **Problem:** Eine Bewertung von Geerkens, also vom Investor und Gründer-Betrieb, ist heikel. Offenlegen, dass Geerkens Gründungskunde ist. Sonst lieber auf die nächsten Kunden warten. +- **Capterra und Trustpilot** lohnen jetzt nicht. Capterra später, wenn Ads ohnehin anstehen. Trustpilot passt nicht zur Zielgruppe. + +--- + +## 5. Messen und Events 2026/2027 + +**Belegt: Termine** + +| Veranstaltung | Termin | Ort | Charakter | Kosten Besucher | Kosten Aussteller | Nutzen für HiveGrid (*Einschätzung*) | +|---|---|---|---|---|---|---| +| **RIFA** (Richter+Frenzel) | 08. bis 09.10.2026 | NürnbergMesse | Hausmesse des Großhändlers, rund 10.000 Besucher erwartet, Vorträge und Abendveranstaltung | Anmeldung über die Website, Preis nicht genannt | nicht genannt | zu kurzfristig, eher Süddeutschland | +| **Chillventa** | 13. bis 15.10.2026 | Nürnberg | Kälte und Klima, international | nicht geprüft | nicht geprüft | gering | +| **GET Nord** | 19. bis 21.11.2026 | Hamburg Messe | Fachmesse Elektro, Sanitär, Heizung, Klima für Norddeutschland. 2024 über 650 Aussteller, rund 39.000 Fachbesucher. Mit Startup-Fläche und Plattform „GET NORD Connect“ für Matchmaking | 25 € Tagesticket, 35 € Dauerticket, online inklusive HVV | Startup-Fläche 2026 **ausgebucht**. Laut Anmeldeseite Paket 2.199 € für 4 m². Reihenstand ab 210 € je m² netto | **Besuchen.** Gespräche vorab über Connect und mit Messe-Kontakten aus dem Norden vereinbaren. Startup-Fläche für 2028 vormerken. | +| **HEATEXPO** | 24. bis 26.11.2026 | Dortmund | Wärmeversorgung, Fernwärme, Energieversorger | nicht geprüft | nicht geprüft | gering, falsche Zielgruppe | +| **BAU** | 11. bis 15.01.2027 | München | Architektur, Bau, Industrie- und Objektbau | nicht geprüft | nicht geprüft | gering | +| **IHM mit ZUKUNFT HANDWERK** | 10. bis 14.03.2027 (laut Messeportalen, offiziell noch prüfen) | München | Handwerksmesse mit Kongress „von Handwerk für Handwerk“ | nicht geprüft | nicht geprüft | mittel, Kongress eher als Bühne für Noah | +| **ISH** | **15. bis 19.03.2027** | Frankfurt | Weltleitmesse Wasser, Wärme, Klima. Zuletzt 2.183 Aussteller, rund 163.000 Besucher. Eigenes Lösungsfeld „Softwarelösungen“ und Bereich „Startup@ISH“. 15. bis 18.03. nur Fachbesucher, 19.03. auch Privatbesucher. | nicht geprüft | nicht öffentlich, Anfrage nötig | **Besuchen**, mit festen Terminen bei Herstellern, Großhandel, KWP und pds. Startup@ISH-Konditionen anfragen. | +| **GC-Neuheitenschauen** | 08. bis 09.04. Markt Schwaben, 22. bis 23.04. Köln, 29. bis 30.04. Bremen/Stuhr, 12. bis 13.05. Stuttgart, 27. bis 28.05. Berlin, 03. bis 04.06. Dresden, 01. bis 02.07.2027 Dortmund | GC-Häuser | Hausmessen der GC-Gruppe, im Schnitt rund 300 Hersteller | nicht genannt, *für Fachhandwerk vermutlich kostenlos* | Aussteller sind Hersteller, Weg nicht beschrieben | **Köln und Dortmund besuchen**, dort sind NRW-Betriebe. Gut für Gespräche mit GC-Verantwortlichen. | +| **Haustechnik aktuell** (Cordes & Graefe Bremen, GC-Gruppe) | 29. bis 30.04.2027 | Stuhr-Seckenhausen | rund 300 Hersteller, über 10.000 Besucher, alle zwei Jahre | nicht genannt | nicht genannt | Norddeutschland, optional | +| **Pietsch-Hausmesse** | UP\|25 war am 16. bis 17.05.2025 mit knapp 90 Ausstellern. Nächster Termin nicht gefunden. | | | | | prüfen | +| **SHK+E Essen** | 2026 war am 17. bis 20.03. (über 30.000 Besucher, 350 Aussteller). **Nächste: 21. bis 24.03.2028** | Messe Essen | wichtigste SHK-Messe in NRW, getragen vom Fachverband SHK NRW. 30 % der Fläche 2028 schon vergeben. | nicht geprüft | nicht geprüft | **2028 Stand prüfen**, Heimatmesse | +| **IFH/Intherm** | 2026 war am 14. bis 17.04. **Nächste: 25. bis 28.04.2028** | Nürnberg | SHK-Fachmesse Süddeutschland, über 600 Aussteller | nicht geprüft | nicht geprüft | später | + +**Belegt: Digital-Events der Handwerkskammern** +- Die **HWK Koblenz** hat am 28.01.2026 ein Online-Seminar „Digitales Handwerk 2026: Pflicht, Potenzial und Praxis“ in Kooperation mit anderen Kammern veranstaltet. Ein Fachmann eines Softwareanbieters (In-Software) hat dort Fragen beantwortet. Kammern holen also Anbieter dazu. +- Die **HWK Düsseldorf** hat Berater für Innovation, Technologie und Digitalisierung und lädt im Herbst 2026 zu Webinaren und Exkursionen ein (zum Beispiel „Smart arbeiten mit AR“ am 07.10.2026). *Für Rheinberg im Kreis Wesel ist nach meinem Stand die HWK Düsseldorf zuständig, bitte prüfen.* + +*Einschätzung* +- **Als Besucher sind Messen jetzt sehr effizient:** geringe Kosten, viele Entscheider an einem Ort, und Noah als SHK-Meister spricht auf Augenhöhe. +- **Entscheidend ist die Vorbereitung:** + - 15 bis 20 Gespräche vorher vereinbaren: Messe-Kontakte, KWP und pds am Stand, GC-Verantwortliche, Fachredaktionen. + - Einen Demo-Workspace auf dem Tablet dabei haben. + - Kontakte vor Ort ausdrücklich fragen, ob sie angerufen werden möchten. Das löst das Rechtsproblem aus Abschnitt 1. +- **Eigener Stand:** frühestens 2028 (SHK+E Essen oder Startup-Fläche GET Nord). Vorher fehlen Referenzen, Material und Personal. + +--- + +## 6. Verbände und Institutionen + +**Belegt** +- **ZVSHK:** + - Praxisleitfaden zur Softwareeinführung (12.01.2026, im Rahmen von INQA des BMAS). + - Hat 2020 Kooperationsverträge mit thermregio und Wirsindhandwerk geschlossen, an den Schnittstellen seines Service- und Wartungsportals. Innungsbetriebe bekamen Sonderkonditionen. + - Das zeigt: Der Verband arbeitet mit Digitalanbietern zusammen, wenn es einen Nutzen für Mitgliedsbetriebe gibt. +- **Fachverband SHK NRW:** + - Hat **Rahmenabkommen** mit Software- und Digitalanbietern: Hottgenroth/ETU, MemoMeister, mobile offer, Stoercode, thermregio, FleetGO. + - Ansprechpartnerin dafür ist Evagelia Demati. + - Hauptgeschäftsführer ist Frank Hehl, Landesinnungsmeister Ulrich Grommes. + - Herbstempfang in Düsseldorf mit rund 300 Gästen aus Handwerk, Industrie und Politik. + - Für 2026 geplant: Ausbau der Innungswebsites und eine Verbraucherkampagne mit Fachbetriebssuche. + - Daneben gibt es Bildungspartner aus der Industrie, darunter Buderus und ETU Software. +- **Mittelstand-Digital Zentrum Handwerk** (Nachfolger des Kompetenzzentrums Digitales Handwerk): + - **zum 30.06.2026 ausgelaufen**. + - Inhalte bleiben auf handwerkdigital.de. + - Der Podcast „DigiCast“ hatte die letzte Folge am 24.03.2026. + +**Belegt: Förderprogramme (Stand Oktober 2026)** + +| Programm | Stand | Relevanz für HiveGrid-Kunden | +|---|---|---| +| **go-digital** (Bund) | ausgelaufen zum 31.12.2024, kein direkter Nachfolger | keine | +| **Digital Jetzt** (Bund) | ausgelaufen | keine | +| **Mittelstand-Digital Zentrum Handwerk** | beendet 30.06.2026 | keine | +| **Digitalbonus Bayern** | Laufzeit bis 31.12.2027, monatliche Kontingente, ELSTER-Konto nötig. Laut Beratungsseiten sind Lizenz- und Servicegebühren für **höchstens 18 Monate** förderfähig. | für Betriebe in Bayern ein echtes Argument. Richtlinie vor Außenkommunikation prüfen. | +| **MID-Digitalisierung NRW** | Seit Januar 2026 nur noch für die Entwicklung marktfähiger digitaler Produkte. Interne Digitalisierung wird nicht mehr gefördert. Bis 15.000 €, Losverfahren. | für SHK-Betriebe in NRW **keine**. Eher für HiveGrid selbst prüfen. | +| **Weitere Länder** | Laut einer Übersicht vom 16.04.2026 laufen Programme unter anderem in Sachsen, Thüringen, Rheinland-Pfalz, Berlin, Hamburg. Niedersachsen ausgelaufen, Baden-Württemberg ohne eigenes Programm. | je Land einzeln prüfen, die Übersicht ist ein Blog | +| **BAFA Förderung unternehmerischen Know-hows** | Beratungszuschuss 50 % (West) bis 80 % (Ost, Berlin), Bemessung 3.500 € je Beratung. Laut Förderblogs läuft das Programm Ende 2026 aus. | für Berater als Partner relevant (siehe 9), nicht für die Software | + +*Einschätzung* +- **Förderung ist 2026 kein Türöffner.** Außer in Bayern kann HiveGrid nicht mit „das wird gefördert“ werben. Das sollte im Vertrieb niemand versprechen. +- **Innung vor Landesverband vor Bundesverband.** + - Realistisch ist zuerst ein Vortrag bei Noahs eigener Innung oder einer Nachbarinnung am Niederrhein. Thema zum Beispiel „Mit dem ERP bleiben und trotzdem digital werden“. + - Ein Rahmenabkommen mit dem Fachverband SHK NRW ist das Ziel für 2027. Es braucht Referenzen und einen Mitgliedervorteil, etwa Sonderkonditionen für Innungsbetriebe. +- **Die Digitalberater der Kammern** sind Multiplikatoren, aber zur Neutralität verpflichtet. Sie lassen eher einen Praxisbericht zu als eine Produktvorstellung. Ein gemeinsamer Termin mit Geerkens als Praxisbeispiel ist der passende Weg. + +--- + +## 7. Fachmedien und PR + +**Belegt: Die wichtigsten Titel** + +| Titel | Verlag | Schwerpunkt | Für HiveGrid passend | +|---|---|---|---| +| **SBZ** und **SBZ Monteur** | Gentner Verlag | größte SHK-Fachzeitschrift, Monteur-Ausgabe für Gesellen | SBZ für Chefs, SBZ Monteur für die Monteur-App | +| **IKZ** (IKZ-Haustechnik, IKZ-Praxis, IKZ-Fachplaner, IKZplus Energy) | Strobel Verlag, Arnsberg. Chief Content Officer Markus Sironi | vor allem Technik. Newsletter zwei- bis viermal pro Woche, IKZ-Academy mit Webinaren | mittel, wenig Betriebsführung | +| **HeizungsJournal** (dazu SanitärJournal, KlimaJournal) | HeizungsJournal Verlags GmbH | Technik, Wärmepumpe | gering bis mittel | +| **SHK Profi** | Bauverlag | Rubrik „Büro & Werkzeug“ mit Themen der Betriebsführung, zum Beispiel Mitarbeitergespräche | hoch | +| **Deutsche Handwerks Zeitung** | Holzmann Medien | Rubrik Betriebsführung, darin „IT + Digitalisierung“. Kammer-Ausgaben. Podcast „DHZ Wochenrückblick“ (Nachrichten, keine Gäste) | hoch, auch regional | +| **handwerk magazin** | Holzmann Medien | Unternehmerthemen. Podcast „Abnahmeprotokoll“ (zwei Redakteure, keine Gäste) | hoch | +| **handwerk.com** | Schlütersche | Rubriken Betriebsführung und IT. Erzählt gern Praxisgeschichten, zum Beispiel „Wie dieser Handwerksbetrieb mithilfe von KI den Umsatz steigert“ | hoch | + +*Einschätzung: Wie man ohne Budget redaktionell vorkommt* +1. **Praxisgeschichte statt Produktmeldung.** + - Redaktionen schreiben über Betriebe, nicht über Software. + - Der Aufhänger ist Geerkens: ein SHK-Betrieb in vierter Generation, der sein ERP behält und darum herum digitalisiert. + - Erst anbieten, wenn Geerkens im Alltag damit arbeitet, sonst bricht die Geschichte bei der ersten Rückfrage. +2. **Gründergeschichte für Regional- und Kammerpresse.** „Handwerksmeister vom Niederrhein baut Software für sein Gewerk“. Ansprechpartner: Lokalredaktionen (Rheinberg, Moers, Wesel), die DHZ-Kammerausgabe, die Pressestelle der HWK. +3. **Gastbeitrag mit Nutzwert,** exklusiv für einen Titel. + - Zum Beispiel für SHK Profi oder handwerk.com: „Software einführen, ohne das ERP zu wechseln: 5 Fragen vor dem Kauf“. + - Darin auf den ZVSHK-Leitfaden verweisen. Das zeigt Kenntnis und ist neutral. +4. **Kleine eigene Umfrage als Anlass.** + - Zum Beispiel: „Wie viele Programme nutzt dein Betrieb, und wo wird abgetippt?“ + - Verbreitung über Noahs Netzwerk, Innung, Newsletter. + - Die Stichprobe offen nennen, keine hochgerechneten Zahlen. Schon 50 echte Antworten sind ein Aufhänger, wenn man sie ehrlich darstellt. +5. **ISH-Vorberichte.** + - Fachmedien sammeln vor der ISH Neuheiten. Eine kurze Meldung mit Bild kann dort landen, auch ohne Stand. Thema: neue Anbindung oder Monteur-App. + - Redaktionsschluss *vermutlich* Dezember bis Februar, bei den Redaktionen erfragen. +6. **Pressebereich auf der Website:** Fakten, Fotos von Noah im Betrieb, Logos, Kontakt. Das gibt es heute nicht. + +**Nicht tun:** bezahlte Advertorials als redaktionelle Beiträge tarnen, Zahlen hochrechnen, Geerkens als „Kunde“ verkaufen, ohne zu sagen, dass er Gründer und Investor ist. + +--- + +## 8. Podcasts im Handwerk + +**Belegt:** Gefunden über das Apple-Podcasts-Verzeichnis, abgerufen am 05.10.2026. „Letzte Folge“ ist das Datum laut Verzeichnis. Ob ein Podcast Gäste aufnimmt, habe ich nicht bei jedem geprüft. + +**Erste Wahl: SHK-spezifisch, aktiv** + +| Podcast | Macher | Folgen | Letzte Folge | Link | Passung (*Einschätzung*) | +|---|---|---:|---|---|---| +| SHK-TV, Der Haustechnik-Podcast | Nikolaus Klein, Cedric Engels | 151 | 28.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1707756361) | hoch, SHK und aktiv | +| SHK PODCAST | SHKE Radio / hsn Podwave | 117 | 29.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1693825698) | hoch | +| SHK-Show | Handwerker Radio, Maximilian Herrmannsdörfer | 149 | 23.04.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1600693814) | hoch, Pause seit April prüfen | +| gas. wasser. hightech. der shk-podcast. | Jan Steffen Adlunger, Sebastian Thumm | 30 | 23.02.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1765331445) | hoch, Thema Technik und Digitales | +| Die Energieexperten, Der SHK RealTalk für Unternehmer | Patrick Stimpfle | 4 | 05.06.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1896277045) | hoch, Unternehmerfokus, jung | +| Sprechring, Podcast der Innung SHK Berlin | Innung SHK Berlin | 24 | 19.05.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1689174695) | mittel, Innungsformat | +| Hör mal, wer da liefert, der SHK-Podcast von Richter+Frenzel | Richter+Frenzel | 3 | 17.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id6812369099) | hoch, zugleich Tür zum Großhandel | +| Nize2Know SHK-Wissenspodcast | nize2know | 185 | 01.10.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1554798688) | gering, eher Fachwissen für Monteure | + +**Zweite Wahl: Handwerksunternehmer allgemein, aktiv** + +| Podcast | Macher | Folgen | Letzte Folge | Link | Passung (*Einschätzung*) | +|---|---|---:|---|---|---| +| Handwerk 2 Go, Gebäudetechnik und Unternehmerwissen | Wöhler | 174 | 23.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1481547262) | hoch, Gebäudetechnik | +| Unternehmer, Handwerker, Mensch | Johannes Gronover | 114 | 29.05.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1703559854) | hoch | +| Die ProzessWerkstatt, Podcast für Automatisierung | Felix Schmidt | 261 | 24.08.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1708784022) | hoch, Thema „Automatisierung ohne Angst“ | +| Handwerk und Haltung | Jessica Sander, Matthias Vickermann | 35 | 23.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1824095157) | mittel bis hoch | +| Nach fest kommt ab | Kathrin Post-Isenberg | 80 | 05.10.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1786665373) | mittel bis hoch | +| Handwerk Next | Veltum GmbH | 62 | 01.05.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1548138059) | mittel | +| Erfolgsbausteine, für Bauunternehmer und Handwerk | Zelic Consulting | 25 | 05.10.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1811411207) | mittel | +| Marketing für Macher im Handwerk | Patrick Riedel | 141 | 04.08.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1753027071) | mittel, Thema Noah als Gesicht | +| Nachfolgeschmiede | Benedikt Stentrup | 62 | 28.09.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1735348931) | mittel, Noah ist vierte Generation | +| Hömma, Handwerk! | Handwerkskammer Dortmund | 23 | 05.03.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1693816125) | mittel, regional NRW | +| Moin Handwerk | Jan-Bastian Buck | 15 | 24.07.2026 | [Apple](https://podcasts.apple.com/de/podcast/id1576403144) | mittel | + +*Einschätzung: So pitcht Noah* +- **Ein Satz zum Gast:** SHK-Meister in vierter Generation, Geschäftsführer der Geerkens GmbH, wollte sein Branchenprogramm nicht wechseln und hat deshalb mit einem Team eine Software gebaut, die sich darum legt. +- **Drei Themen zur Auswahl**, keines davon ist Produktwerbung: + 1. „Warum wir unser ERP behalten haben“ + 2. „Was im Büro eines SHK-Betriebs wirklich Zeit frisst“ + 3. „Automatisieren, ohne die Kontrolle abzugeben“ +- **Ablauf:** fünf Anfragen pro Monat, persönlich und kurz. Erst die SHK-Podcasts, dann die allgemeinen. +- **Jede Folge weiterverwerten:** Ausschnitte für Noahs Reels, Erwähnung im Newsletter, Link auf der Website. +- **Richter+Frenzel** ist ein Sonderfall. Ein Gastauftritt dort ist zugleich ein erster Kontakt zu einem großen Großhändler. + +--- + +## 9. Partnerschaften + +**Belegt** +- **KWP:** + - Das Verzeichnis „Externe Add-ons“ listet Keil BarcodeOCR, ODV Cockpit, ODV Craftnote Connector, Seneca Controlling, SOFTGEWERK, Angebotskonfigurator Heizung/Bad, combit Report Server sowie KI-Telefonie von HeyTelo und HalloPetra. + - Wörtlich: „Sollten Sie selbst Hersteller so einer Komponente sein, können Sie sich gerne mit KWP in Verbindung setzen, um eine Aufnahme Ihrer Lösung in dieses Verzeichnis zu beantragen.“ + - KWP beschreibt sich auf der API-Seite als „offenes, erweiterbares Handwerkerbetriebssystem“. +- **pds:** + - Listet unter „Multi-Cloud / API“ Hey Telo, Offpaper, Jobcluster und flour. + - Hat ein Netz aus rund 10 regionalen Vertriebs- und Servicepartnern an 20 Standorten. + - Ein öffentlicher Weg zur Aufnahme als Partner ist nicht beschrieben. HiveGrid hat am 25.08.2026 nach einem „offiziellen Prozess für eine Partner-App“ gefragt, eine Antwort ist nicht belegt (Kontext, 3). +- **HalloPetra:** + - Hat eine eigene Seite „kwp Software × HalloPetra“ und listet 38 bis 39 Integrationen. + - Ruft auf der Partnerseite Großhändler, Innungen, Verbände und Softwareanbieter zur Zusammenarbeit auf (Kontakt: info@hallopetra.de, Betreff „Partnership with HalloPetra“). + - Erwähnt Kooperationen mit Verbänden und eine Initiative von Vaillant für SHK-Gründer. + - Die HiveGrid-Anbindung an HalloPetra ist gebaut und in der Demo (Kontext, 3). +- **GC-Gruppe:** + - Hat seit Dezember 2022 ein Softwarepartner-Programm mit den Stufen Partner und Premium-Partner, für Schnittstellen zur GC DigitalBox (Elements, Craftnote, GC-Chat Beem). + - Genannte Partner: blue:solution, pds, ETU, Label. +- **Großhandel allgemein:** Auch Elektro-Großhändler wie Obeta und Rexel führen Programme für Handwerkersoftware. Rexel hat KWP als „Digital Partner“. +- **Richter+Frenzel** macht seit 2026 einen eigenen SHK-Podcast (siehe 8). + +*Einschätzung: Was für ein Startup realistisch ist* + +| Partner | Was konkret | Realistisch? | Wann | +|---|---|---|---| +| **KWP** | Aufnahme ins Verzeichnis „Externe Add-ons“ beantragen. Raffael Sheikh hat den technischen Kontakt. | **ja**, der Weg ist öffentlich beschrieben | jetzt | +| **pds** | Anfrage vom 25.08. nachfassen, Ziel ist die Liste „Multi-Cloud / API“. Danach regionale pds-Partner ansprechen. | ja, dauert aber | jetzt | +| **HalloPetra** | Gegenseitige Listung als Integration, ein gemeinsames Webinar, ein gemeinsamer Kunde als Beispiel | **ja**, beide Seiten haben Interesse | jetzt | +| **IT-Systemhäuser für KWP und pds** (zum Beispiel IT+S für KWP, regionale pds-Partner) | Empfehlung gegen Provision. Sie sitzen beim Kunden und kennen die Schmerzen. | ja, gut für 2 bis 3 Partner | in 3 Monaten | +| **Unternehmensberater fürs Handwerk** (BAFA-zugelassen) | Empfehlung bei Prozessberatung | mittel | später | +| **Steuerberater** | | **nein**, HiveGrid hat kein DATEV | nicht | +| **Großhandel** (GC, Pietsch, Richter+Frenzel, Cordes & Graefe) | Zuerst Gespräche auf Hausmessen. Mittelfristig Aufnahme in ein Softwarepartner-Programm, Vortrag auf einer Hausmesse. | erst mit Referenzen und Schnittstelle | später | +| **Hersteller** (Viessmann, Vaillant, Buderus) | Fachpartner-Programme, Wärmepumpen-Prozess als gemeinsames Thema | für ein Startup schwer, lange Wege | später | +| **Verbände** | Rahmenabkommen Fachverband SHK NRW | mit Referenzen | in 3 bis 6 Monaten anbahnen | + +*Einschätzung:* Die ERP-Verzeichnisse sind der wichtigste Kanal dieser ganzen Liste. Ein KWP-Betrieb, der im KWP-Verzeichnis nach Zusatzlösungen sucht, ist näher am Kauf als jeder Social-Media-Kontakt. Das Verzeichnis ist zugleich ein Vertrauenssignal: „Mein Hersteller kennt das.“ Das trifft genau die Angst vor Kontrollverlust. + +--- + +## 10. Webinare, Online-Events, Empfehlungen + +**Belegt** +- Das HiveGrid-Webinarkonzept (Stand 29.07.) sieht WebinarGeek vor, dienstags bis donnerstags 18 bis 19 Uhr, Themen nach Schmerzpunkten. Umgesetzt ist es nicht (Kontext, 10.4). +- **WebinarGeek:** Premium 59 € im Monat bei Jahreszahlung oder 99 € monatlich, bis 1.000 Teilnehmende, 14 Tage kostenlos testbar, Auftragsverarbeitungsvertrag inklusive. +- **OMR** bietet mit „Tool Talks“ ein bezahltes Webinar-Format für Anbieter. +- **plancraft** hat ein Empfehlungsprogramm „Freunde empfehlen“: + - Der Empfehlende bekommt 10 % des Abo-Umsatzes, bis zu 1.000 € pro Betrieb. + - Der neue Kunde bekommt 10 % auf die erste Rechnung. + - Dazu kommt der Wechselbonus bis 1.200 €. + +*Einschätzung: Webinare* +- **Format:** 30 Minuten „Live am echten Ablauf“. Ein Auftrag von der Anfrage bis zur Übergabe an den Monteur, im Demo-Workspace, mit KWP- oder pds-Bezug. Danach Fragen. +- **Rhythmus:** einmal im Monat, immer am gleichen Wochentag. Wenige Teilnehmende sind normal. Wichtig ist die Aufzeichnung als Material für Newsletter, Website und YouTube. +- **Kooperation verdoppelt die Reichweite:** ein gemeinsames Webinar mit HalloPetra („Vom Anruf bis zum Termin, ohne Abtippen“), später mit einer Innung oder einem Kammer-Digitalberater. +- **Kosten:** Zum Start reicht der 14-Tage-Test oder ein vorhandenes Tool. WebinarGeek erst, wenn der Rhythmus steht. +- **Anmeldung** über ein HiveGrid-Formular mit Einwilligung für Erinnerung und Newsletter, getrennt abfragbar. + +*Einschätzung: Empfehlungsprogramm* +- **Heute gibt es keine zahlenden Kunden.** Ein formales Programm wirkt erst ab den ersten Kunden. +- **Jetzt** wirken warme Empfehlungen aus Noahs Netzwerk: Innungskollegen, Lieferanten, Betriebe aus der Familie. Das ist kein Programm, sondern eine Liste von 20 Namen, die Noah persönlich anspricht. +- **Später:** + - Ein einfaches Programm, zum Beispiel ein Monat gratis für beide Seiten. + - Für Partner wie IT-Systemhäuser eine Provision. + - Die Bedingungen schriftlich festhalten. + - Empfehlungen per E-Mail nur an Personen, die der Empfehlende vorher gefragt hat. Siehe 1.2. + +--- + +## 11. YouTube als Suchmaschine + +*Einschätzung* +- YouTube ist neben Google die Suchmaschine für „Wie geht das?“. Für HiveGrid passt es vor allem für **Anbindungs-Videos:** „KWP und HiveGrid: so sieht es aus“, „Termin aus HiveGrid landet in KWP“, „Monteur-App im Keller ohne Netz“. +- Solche Videos sind 3 bis 5 Minuten lang, ruhig, mit Bildschirm und Noahs Stimme. Sie lassen sich auf den SEO-Seiten aus Abschnitt 3 einbetten und im Erstgespräch verschicken. +- **Brücke zu Social:** Die Reels von Noah sind der Einstieg, das YouTube-Video ist die Vertiefung. Umgekehrt lassen sich aus jedem Erklärvideo zwei bis drei Kurzclips schneiden. +- **Aufwand:** mittel, Dejan kann schneiden. Ein Webinar-Mitschnitt ist das billigste Rohmaterial. +- **Zeit bis Wirkung:** Monate. Daher nicht jetzt, sondern sobald die ersten Webinare und Anbindungs-Demos stehen. +- **Kanäle als Vorbild** im SHK-Bereich gibt es (zum Beispiel das Umfeld von SHK-TV). Eine Analyse von YouTube-Kanälen habe ich nicht gemacht. + +--- + +## Bewertungstabelle + +Skala: Kaufnähe und Passung **hoch, mittel, gering**. Aufwand **gering, mittel, hoch**. Kosten in Euro oder **0, gering, mittel, hoch**. Zeit bis Wirkung **Wochen, Monate, über 6 Monate**. Alle Werte sind *Einschätzung*. + +| Kanal | Kaufnähe | Aufwand | Kosten | Zeit bis Wirkung | Passung | Urteil | +|---|---|---|---|---|---|---| +| Cold Calling bei Formular- und Messe-Kontakten | hoch | mittel | 0 | Wochen | hoch | weiter, rechtssicher | +| Cold Calling ohne Vorkontakt | mittel | mittel | 0 | Wochen | mittel | **nur mit Brief zuerst** | +| Brief mit Cal-Link an Zielbetriebe | mittel | mittel | gering (Porto, Druck) | Wochen | hoch | testen | +| Kalt-E-Mail, LinkedIn-Pitch ohne Einwilligung | | | | | | **verboten** | +| Newsletter mit Double-Opt-in | mittel | mittel | 0, eigenes Modul | Monate | hoch | jetzt | +| Lead-Magnet „30 Automationen“ / „Wärmepumpenauftrag“ | mittel bis hoch | gering | 0 | Wochen bis Monate | hoch | jetzt | +| Prozess-Check als Formular | hoch | mittel | 0 | Monate | hoch | in 3 Monaten | +| SEO-Nischenseiten KWP / pds | sehr hoch | mittel | 0 | Monate | hoch | jetzt planen | +| SEO Kategorie-Begriffe | mittel | hoch | 0 bis hoch | über 6 Monate | mittel | später | +| Google-Unternehmensprofil | gering | gering | 0 | Wochen | gering | nur wenn berechtigt | +| Vergleichsportale mit Affiliate | mittel | mittel | mittel bis hoch | Monate | gering | nicht jetzt | +| OMR Reviews Profil und Bewertungen | hoch | gering | 0 | Monate | hoch | jetzt anlegen, Bewertungen ab Januar | +| Capterra, GetApp | mittel | gering | 0 bis mittel | Monate | gering | später | +| Trustpilot | gering | gering | 0 bis 119 € im Monat | Monate | gering | nicht | +| Messen als Besucher (GET Nord, ISH, GC-Neuheitenschauen) | hoch | mittel | gering (Tickets, Reise) | Wochen | hoch | jetzt | +| Eigener Messestand | hoch | hoch | hoch | Monate | hoch | 2028 | +| Innungen, Kammern (Vorträge, Praxisbeispiel) | mittel bis hoch | mittel | 0 | Monate | hoch | in 3 Monaten | +| Rahmenabkommen Fachverband | hoch | hoch | unbekannt | über 6 Monate | hoch | später | +| Förderung als Verkaufsargument | gering | gering | 0 | | gering | nur Bayern | +| Fachmedien, Anwenderbericht | mittel | mittel | 0 | Monate | hoch | nach Geerkens-Start | +| Regionalpresse, Gründerstory | gering | gering | 0 | Wochen | mittel | in 3 Monaten | +| Podcasts mit Noah | mittel | gering | 0 | Wochen bis Monate | hoch | jetzt | +| KWP- und pds-Verzeichnis | **sehr hoch** | gering | 0 | Monate | **sehr hoch** | **jetzt** | +| HalloPetra Co-Marketing | hoch | gering | 0 | Wochen bis Monate | hoch | jetzt | +| IT-Systemhäuser als Empfehler | hoch | mittel | Provision | Monate | hoch | in 3 Monaten | +| Großhandel-Partnerschaft | mittel | hoch | unbekannt | über 6 Monate | hoch | später | +| Hersteller-Partnerschaft | mittel | hoch | unbekannt | über 6 Monate | mittel | später | +| Steuerberater | gering | mittel | 0 | | gering | nicht | +| Webinare monatlich | hoch | mittel | 0 bis 59 € im Monat | Monate | hoch | in 3 Monaten | +| Empfehlungsprogramm | hoch | gering | Rabatt oder Provision | Monate | hoch | ab erstem Kunden | +| YouTube-Erklärvideos | mittel | mittel | 0 | über 6 Monate | mittel | später | + +--- + +## Priorisierung + +### Jetzt (Oktober bis Dezember 2026) + +1. **Anruf-Leitfaden für Haris.** Wen er anruft, was er dokumentiert, keine Kalt-Mails, E-Mail nur nach ausdrücklichem Ja im Gespräch, Sperrliste. Den Formulartext prüfen, über den sich die Messe-Kontakte gemeldet haben. Kurz vom Anwalt gegenlesen lassen. +2. **Newsletter-Grundlage.** Anmeldefeld mit Double-Opt-in reparieren, Protokoll sichern, erste Ausgabe von Noah. +3. **Ein Lead-Magnet:** „30 Automationen für SHK-Betriebe“ oder „Der Wärmepumpenauftrag in 10 Schritten“. Offen als Seite, ausführlich als PDF gegen E-Mail. +4. **KWP-Verzeichnis beantragen, pds nachfassen.** Raffael Sheikh übernimmt das, weil er die Kontakte hat. +5. **HalloPetra ansprechen:** gegenseitige Listung und ein gemeinsames Webinar im ersten Quartal. +6. **OMR-Reviews-Profil anlegen.** Ohne Bewertungen, aber mit sauberem Text und echten Screenshots. +7. **Fünf Podcast-Anfragen für Noah,** zuerst SHK-TV, SHK PODCAST, gas. wasser. hightech., Energieexperten, Richter+Frenzel. +8. **GET Nord (19. bis 21.11.2026) besuchen.** Gespräche vorab vereinbaren. ISH-Besuch für März 2027 planen, Startup@ISH-Konditionen anfragen. +9. **SEO-Seiten planen:** „HiveGrid und KWP“, „HiveGrid und pds“, „Ergänzen statt wechseln“. Umsetzung, wenn die Website wieder Kapazität hat. + +### In 3 Monaten (Januar bis März 2027) + +1. **Erste echte Bewertungen** auf OMR, sobald Geerkens 4 bis 6 Wochen im Alltag arbeitet. Mitarbeitende aus Büro und Baustelle fragen, Gründungsbezug offenlegen. +2. **Anwenderbericht Geerkens** an SHK Profi, handwerk.com, DHZ, SBZ. Gründerstory an Lokalpresse und Kammer. +3. **Monatliches Webinar starten,** das erste mit HalloPetra. +4. **ISH 15. bis 19.03.2027** mit festen Terminen bei KWP, pds, Großhandel und Redaktionen. +5. **Prozess-Check** als HiveGrid-Formular mit Auswertung. +6. **Innungsvortrag** bei Noahs Innung oder am Niederrhein. Erstkontakt zum Fachverband SHK NRW (Evagelia Demati) wegen Rahmenabkommen. +7. **Zwei bis drei IT-Systemhäuser** aus dem KWP- und pds-Umfeld als Empfehlungspartner gewinnen. +8. **Empfehlungsprogramm** für die ersten zahlenden Kunden festlegen. + +### Später (ab April 2027) + +1. **GC-Neuheitenschauen** Köln (22. bis 23.04.2027) und Dortmund (01. bis 02.07.2027) besuchen. Softwarepartner-Programm der GC-Gruppe prüfen. +2. **YouTube** mit Anbindungs-Videos und Webinar-Mitschnitten. +3. **Ratgeber-SEO** zu Problem-Suchen. +4. **Messestand prüfen:** SHK+E Essen (21. bis 24.03.2028), Startup-Fläche GET Nord 2028, IFH/Intherm (25. bis 28.04.2028). +5. **Hersteller-Kontakte** über das Wärmepumpen-Thema. +6. **Capterra** und bezahlte Platzierungen erst, wenn Ads ohnehin anstehen. + +### Nicht + +- Kalt-E-Mails, Werbe-Nachrichten auf LinkedIn ohne Einwilligung, gekaufte Adresslisten. +- Kaltanrufe ohne Vorkontakt als Massenmaßnahme. +- Affiliate-Vergleichsportale und bezahlte Portal-Pakete in dieser Phase. +- Trustpilot. +- Eigener Messestand 2026 oder 2027. +- BEG-Förderrechner und Stundenverrechnungssatz-Rechner. +- Steuerberater als Kanal, solange es kein DATEV gibt. +- Werbung mit Förderung, außer belegt für Bayern. + +--- + +## Offene Fragen an Dejan + +1. **Messe-Kontakte:** Wie lautet der Text des Website-Formulars, über das sie sich gemeldet haben? Steht dort, dass HiveGrid sich telefonisch oder per E-Mail meldet? Ist der Zeitpunkt der Anmeldung gespeichert? +2. **Cold Calling:** Woher stammen die übrigen Nummern, die Haris anruft? Wie groß ist der Anteil ohne jeden Vorkontakt? Gibt es eine Sperrliste? +3. **Anwalt:** Kann der Anwalt, mit dem du die Rechtstexte gemacht hast, einen einseitigen Anruf- und E-Mail-Leitfaden gegenlesen? +4. **Newsletter-Technik:** Kann das eigene E-Mail-Marketing-Modul Double-Opt-in mit Protokoll (Zeit, IP, Text-Fassung)? Ist das 1.000-Mails-Kontingent für den eigenen Newsletter geklärt (Widerspruch CR-028 und `plans.ts`)? +5. **KWP und pds:** Wer stellt den Antrag auf Aufnahme ins KWP-Verzeichnis, Raffael? Gibt es eine Antwort von pds auf die Anfrage vom 25.08.? +6. **HalloPetra:** Gibt es schon einen persönlichen Kontakt? Darf HiveGrid HalloPetra öffentlich als Integration nennen? +7. **Noah und die Verbände:** In welcher Innung ist die Geerkens GmbH? Hat Noah ein Ehrenamt in Innung, Fachverband SHK NRW oder Kammer? Welches GC-Haus oder welcher Großhändler beliefert Geerkens? +8. **Büro in Rheinberg:** Empfängt es Kunden während fester Zeiten (für das Google-Profil)? Ist die Adresse dieselbe wie die der Geerkens GmbH? +9. **Referenz Geerkens:** Ab wann darf Geerkens öffentlich als Beispiel auftreten, für Bewertungen, Anwenderbericht und Webinar? Dürfen Zahlen aus dem Paralleltest genannt werden? +10. **Wärmepumpenprozess:** Darf der Ablauf mit 10 Phasen, 13 Stellen und 17 Übergaben als Lead-Magnet veröffentlicht werden? +11. **Zeit von Noah:** Wie viele Stunden im Monat hat Noah für Podcasts, Innungsvorträge und Messen? +12. **Messen:** Wer fährt zur GET Nord und zur ISH? Gibt es Geld für Tickets und Reise, auch wenn es kein Marketingbudget gibt? +13. **Zielgebiet:** Bundesweit oder zuerst NRW und Niederrhein? Das ändert, welche Messen, Verbände und Förderprogramme zählen. +14. **werkflow.digital:** Kennt das Team diesen Anbieter? Wie grenzen wir uns ab, außer über den Preis? +15. **Webinar-Werkzeug:** WebinarGeek (ab 59 € im Monat) oder ein vorhandenes Tool, das datenschutzrechtlich passt? + +--- + +## Quellen + +Abgerufen, wenn nicht anders angegeben, am 05.10.2026. + +**Recht** +- Gesetzestext § 7 UWG, gesetze-im-internet.de: https://www.gesetze-im-internet.de/uwg_2004/__7.html +- Gesetzestext UWG, Anhang zu § 3 Abs. 3 (Nr. 23b, 23c): https://www.gesetze-im-internet.de/uwg_2004/anhang.html +- BVerwG, Pressemitteilung Nr. 5/2025 vom 29.01.2025 zu 6 C 3.23: https://www.bverwg.de/pm/2025/5 +- BVerwG, Urteil vom 29.01.2025, 6 C 3.23: https://www.bverwg.de/290125U6C3.23.0 +- Grabosch, „Kaltakquise im B2B: was 2026 wirklich noch erlaubt ist“, 27.07.2026 (mit OLG Hamm 18 U 154/22, AG Düsseldorf 23 C 120/25, BGH VI ZR 109/23, Abmahnkosten): https://www.grabosch.com/blog/kaltakquise-b2b-erlaubt +- IHK Nord Westfalen, „Werbung per Telefon, Telefax oder E-Mail“, ohne Datum (BGH I ZR 191/03, OLG Hamm 4 U 189/09, KG 5 U 35/20): https://www.ihk.de/nordwestfalen/recht/rechtsthemen/wettbewerbsrecht/werbung-per-telefon-telefax-oder-e-mail-3614212 +- IT-Recht Kanzlei zu LG Kleve, Urteil vom 28.09.2022, 6 S 81/20, Artikel vom 12.06.2023: https://www.it-recht-kanzlei.de/lg-kleve-telefonwerbung-mutmassliche-einwilligung.html +- Beckmann und Norda zu BGH, Urteil vom 05.02.2004, I ZR 87/02: https://www.beckmannundnorda.de/bgh_telefon_marketing.html +- GvW Graf von Westphalen zu EuGH, Urteil vom 13.11.2025, C-654/23 (Inteligo Media): https://www.gvw.com/aktuelles/blog/detail/newsletter-ohne-einwilligung-eugh-staerkt-bestandskundenprivileg +- IT-Recht Kanzlei, „Ist das Überreichen einer Visitenkarte bereits eine Einwilligung in Werbung per E-Mail?“ (österr. BVwG, 16.08.2023, W157 2262141-1): https://www.it-recht-kanzlei.de/uebergabe-visitenkarte-einwilligung-werbung-mail.html +- BfDI, Newsletter-Bestellung auf Webseiten: https://www.bfdi.bund.de/DE/Fachthemen/Inhalte/Telemedien/Newsletter.html +- dr-datenschutz, „Alles über das Double-Opt-In-Verfahren“: https://www.dr-datenschutz.de/alles-ueber-das-double-opt-in-verfahren/ + +**Lead-Magneten und Wettbewerb** +- plancraft, Kostenfreie Vorlagen für Handwerker: https://plancraft.com/de-de/vorlage-angebot-rechnung-fuer-handwerker +- plancraft, Empfehlungsprogramm: https://plancraft.com/de-de/empfehlungsprogramm +- HERO, Blog: https://hero-software.de/blog +- STREIT, Stundensatzkalkulation Excel-Vorlage: https://www.streit-software.de/vorlagen/stundensatz-ermittlung-excel +- werkstatt-ratgeber.de, Rechner Stundenverrechnungssatz: https://werkstatt-ratgeber.de/rechner/stundenverrechnungssatz +- werkflow.digital, Startseite mit Preisen: https://werkflow.digital/ +- ZVSHK, Pressemitteilung Praxisleitfaden Softwareeinführung, 12.01.2026: https://www.zvshk.de/presse/medien-center/pressemitteilungen/zvshk-veroeffentlicht-praxisleitfaden-zur-nachhhaltigen-softwareeinfuehrung-im-handwerk +- ADAC, KfW-Heizungsförderung ab 21.07.2026, Artikel vom 21.07.2026: https://www.adac.de/rund-ums-haus/energie/spartipps/foerderung-heizung/ + +**SEO und Google** +- Google, Richtlinien zur Berechtigung für ein Unternehmensprofil: https://support.google.com/business/answer/3038177?hl=de +- KWP, xi:opd-Schnittstelle: https://www.kwpsoftware.de/xiopd-schnittstelle/ +- HalloPetra, kwp Software × HalloPetra: https://www.hallopetra.de/integrationen/kwp +- OMR Reviews, pds-Alternativen: https://omr.com/en/reviews/product/pds/alternatives +- trusted.de, Handwerkersoftware: https://trusted.de/handwerkersoftware +- Für-Gründer.de, Handwerkersoftware-Vergleich 09/2026: https://www.fuer-gruender.de/wissen/unternehmen-fuehren/buchhaltung/handwerker-software-vergleich/ +- handwerk-digitalisieren.de, SHK-Handwerkersoftware Test September 2026: https://www.handwerk-digitalisieren.de/handwerkersoftware-shk/ +- Suchergebnisse zu „KWP Schnittstelle CRM“, „pds Software Alternative SHK“, „CRM für Handwerker SHK“, „Plantafel Software Handwerk digital“, 05.10.2026 + +**Bewertungsportale** +- OMR Reviews für Anbieter: https://omr.com/de/reviews/b2b +- OMR Reviews, Kategorie Handwerkersoftware: https://omr.com/de/reviews/category/handwerkersoftware +- Capterra für Anbieter: https://www.capterra.com/vendors/ +- Capterra Deutschland: https://www.capterra.com.de/ +- Trustpilot, Pläne: https://de.business.trustpilot.com/plans + +**Messen und Events** +- ISH 2027, Messe Frankfurt: https://ish.messefrankfurt.com/frankfurt/de.html +- GET Nord, Startseite: https://www.get-nord.de/ +- GET Nord, Tickets und Einladungen: https://www.get-nord.de/ausstellen-besuchen/besuchen/tickets-einladungen +- GET Nord, Startups@GET NORD by VdZ: https://www.get-nord.de/programm/themenflaechen/startupsget-nord +- GET Nord, Anmeldung Startup@GET NORD: https://www.get-nord.de/ausstellen-besuchen/ausstellen/anmeldung/anmeldung-startupget-nord +- GET Nord, Standpreise: https://www.get-nord.de/aussteller/anmelden/beteiligungsentgelt +- RIFA 2026: https://rifa-messe.de/ +- GC-Gruppe, Neuheitenschauen 2027: https://www.gc-gruppe.de/neuheitenschauen +- GC-Gruppe, Haustechnik aktuell 2027 (Cordes & Graefe Bremen): https://www.gc-gruppe.de/neuheitenschauen/haustechnik-aktuell-2025 +- Pietsch-Gruppe, UP|25: https://www.pietsch-gruppe.de/ueber-uns/aktuelles/up25-hausmesse-der-unternehmensgruppe-pietsch +- SBZ, SHK+E Essen 2028 vom 21. bis 24.03.2028: https://www.sbz-online.de/meldungen/21-bis-24-maerz-2028-messe-essen-shke-essen-2028-30-der-ausstellerflaechen-vergeben +- haustec, Bilanz SHK+E Essen 2026: https://www.haustec.de/sanitaer/bilanz-zur-shke-essen-2026-30000-besucher-und-350-aussteller +- Fachverband SHK NRW, SHK+E Essen: https://www.shk-nrw.de/shke-essen/ +- IFH/Intherm: https://www.ifh-intherm.de/ und messen.de zu 2028: https://www.messen.de/de/8568/nuernberg/ifh-intherm/info +- messen.de, IHM München 2027: https://www.messen.de/de/8457/muenchen/internationale-handwerksmesse-ihm/info +- BAU München 2027: https://bau-muenchen.com/en/ +- HEATEXPO 2026: https://www.heat-expo.de/en/ +- pikster, SHK-Messen 2026/2027: https://pikster.com/pages/messen +- HWK Koblenz, „Digitales Handwerk 2026: Pflicht, Potenzial und Praxis“, 28.01.2026: https://www.hwk-koblenz.de/termine/digitales-handwerk-2026-pflicht-potenzial-und-praxis-52,0,evedetail.html?eve=396 +- HWK Düsseldorf, Startseite und Termine: https://www.hwk-duesseldorf.de/ + +**Verbände und Förderung** +- Fachverband SHK NRW, Rahmenabkommen: https://shk-nrw.de/rahmenabkommen.php +- Handwerksblatt, „Fachverband SHK NRW stellt Weichen für 2026“, 05.11.2025: https://www.handwerksblatt.de/handwerkspolitik/fachverband-shk-nrw-stellt-die-weichen-fuer-2026 +- Baulinks, ZVSHK und thermregio/Wirsindhandwerk, 2020: https://www.baulinks.de/webplugin/2020/1896.php4 +- handwerkdigital.de (Mittelstand-Digital Zentrum Handwerk, ausgelaufen 30.06.2026): https://handwerkdigital.de/ +- ostechnik, „Fünf Jahre Mittelstand-Digital Zentrum Handwerk: Was bleibt?“, 25.03.2026: https://ostechnik.de/fuenf-jahre-mittelstand-digital-zentrum-handwerk-was-bleibt/ +- foerderwiki, go-digital Status: https://www.foerderwiki.de/artikel/bmwk-go-digital-foerderung +- skill-sprinters, Digitalbonus nach Bundesland 2026, 16.04.2026: https://skill-sprinters.de/blog/foerderung/digitalbonus-nach-bundesland-2026/ +- Digitalbonus Bayern: https://www.digitalbonus.bayern/ +- bb-applications, Digitalbonus Bayern 2026, Lizenzen 18 Monate: https://bb-applications.de/blog/digitalbonus-bayern-2026-was-wirklich-foerderfaehig-ist +- NRW.BANK, Mittelstand Innovativ & Digital: https://www.nrwbank.de/de/foerderung/foerderprodukte/60348/mittelstand-innovativ--digital-mid---digitalisierung.html +- shiftdev, MID-Förderung NRW 2026, 28.04.2026: https://shiftdev.de/blog/2026/04/28/mid-foerderung-nrw-2026-leitfaden-kmu-digitalisierung/ +- foerderperspektive, BAFA-Beratungsförderung 2026: https://www.foerderperspektive.de/wissen/magazin/bafa-beratungsfoerderung/ + +**Fachmedien** +- IKZ: https://www.ikz.de/ +- SHK Profi: https://www.shk-profi.de/ +- HeizungsJournal: https://www.heizungsjournal.de/ +- handwerk.com: https://www.handwerk.com/ +- Deutsche Handwerks Zeitung und Podcast: https://www.deutsche-handwerks-zeitung.de/ und https://www.deutsche-handwerks-zeitung.de/dhz-wochenrueckblick-podcast/ +- handwerk magazin, Podcast „Abnahmeprotokoll“: https://www.handwerk-magazin.de/podcast + +**Podcasts** +- Apple-Podcasts-Verzeichnis, Abfragen „Handwerk“, „SHK“, „Heizung Sanitär“, 05.10.2026. Einzelne Links stehen in der Tabelle in Abschnitt 8. + +**Partner** +- KWP, Externe Add-ons: https://www.kwpsoftware.de/software/externe-add-ons/ +- KWP, Künstliche Intelligenz und API-Anbindung: https://www.kwpsoftware.de/kuenstliche-intelligenz-api-anbindung/ +- pds, Handwerkersoftware und pds Partner: https://pds.de/software/handwerk +- pds, Multi-Cloud / API: https://pds.de/software/multi-cloud +- HalloPetra, Integrationen: https://www.hallopetra.de/integrationen +- HalloPetra, Partner: https://www.hallopetra.de/partner +- Si Shk, „Neues Softwarepartner-Programm der GC-Gruppe“, 22.12.2022: https://www.si-shk.de/neues-softwarepartner-programm-der-gc-gruppe-166624/ +- Rexel, Digital Partner KWP: https://www.rexel.de/rexeleasy/digital-partner/kwp +- Obeta, Handwerkersoftware-Partnerprogramme: https://hws.obeta.de/ + +**Webinare** +- WebinarGeek, Preise: https://www.webinargeek.com/de/preise + +**Intern** +- `Brainstorming Kickoff/Kontext/Kontext.md`, Stand 05.10.2026, Abschnitte 0, 3, 6, 7, 8, 10, 13 diff --git a/Brainstorming Kickoff/Research/06-personal-brand-und-funnel.md b/Brainstorming Kickoff/Research/06-personal-brand-und-funnel.md new file mode 100644 index 0000000..a92e9a8 --- /dev/null +++ b/Brainstorming Kickoff/Research/06-personal-brand-und-funnel.md @@ -0,0 +1,543 @@ +# 06 Personal Brand als Funnel: Noah und HiveGrid + +**Stand:** 05.10.2026 +**Thema:** Wie Noahs persönliche Kanäle Aufmerksamkeit holen und nach HiveGrid lenken. Wie sich Noahs Marke und die Firmenmarke die Arbeit teilen. +**Für:** Dejan, David, Noah und alle, die an der Marketing-Strategie mitarbeiten. + +**Lesehilfe** +- **Belegt** heißt: steht so in einer Quelle mit Link und Datum (Liste am Ende). +- **Einschätzung** heißt: eigene Ableitung aus den Quellen und aus dem Kontext-Dokument. Nicht geprüft. +- Interne Fakten über HiveGrid stammen aus `Kontext/Kontext.md` (Stand 05.10.2026) und aus Davids Papier vom 26.09. (`MarketingBrainstormingOld.md`). +- Abschnitt 4 ist eine Einordnung mit Quellen. **Er ist keine Rechtsberatung.** Die Punkte dort sollte der Anwalt prüfen, mit dem Dejan schon die Rechtstexte macht. +- Die Websuche war in dieser Recherche begrenzt. Einige Punkte sind deshalb nur mit einer Quelle belegt. Das steht jeweils dabei. + +--- + +## Kurzfassung + +1. **Persönliche Profile erreichen mehr als Firmenseiten.** Auf LinkedIn machen organische Beiträge von Unternehmensseiten laut einer Auswertung nur etwa 2 Prozent des Feeds aus. Die Daten kommen von Tool-Anbietern und Beratern, nicht von LinkedIn selbst. Die Richtung ist in allen Quellen gleich. Noah ist damit der stärkere Kanal, HiveGrid das Ziel. +2. **B2B-Käufer entscheiden viel, bevor sie mit einem Anbieter sprechen.** Laut 6sense (2025) passiert etwa 60 Prozent der Kaufreise vor dem ersten Kontakt, und vier von fünf Abschlüssen gehen an den Favoriten von vor dem Kontakt. Wer in dieser Zeit sichtbar ist, hat einen Vorsprung. Genau da wirkt Noah. +3. **Ein deutsches Vorbild fehlt.** In der Recherche fand sich kein belegter Fall, in dem ein SHK-Unternehmer mit großer Personal Brand eine eigene Software vermarktet. Am nächsten kommen openHandwerk (aus einem Handwerksbetrieb entstanden), Plancraft mit der Dachdeckermeisterin Sina Klein und ServiceTitan in den USA. Noahs Lage ist selten. Das ist Chance und Risiko zugleich. +4. **Rollenteilung:** Noah zeigt Mensch, Meinung, Betrieb und Umstellung. HiveGrid zeigt Produkt, Abläufe und den Weg zum Gespräch. *Einschätzung:* Etwa jedes dritte Reel bei Noah hat einen HiveGrid-Bezug, höchstens eins pro Woche enthält eine klare Einladung. +5. **Glaubwürdigkeit hängt an offenen Rollen.** Noah ist Gründer und Geschäftsführer von HiveGrid. Die Geerkens GmbH ist erster Kunde und Investor. Das sollte überall sichtbar sein. Geerkens darf nie wie eine unabhängige Kundenstimme wirken. +6. **Erst das Ziel bauen, dann Reichweite schicken.** Es fehlen heute eine eigene Zielseite für Noahs Bio, ein Lead-Magnet, ein Newsletter, der speichert, und ein Quellenfeld im CRM. Dazu kommt eine technische Grenze bei Instagram: Auf einen Kommentar darf nur eine private Nachricht folgen. Die zweite Nachricht aus Davids Plan geht erst, wenn die Person antwortet. +7. **Messen ist einfach, wenn es ab Tag 1 passiert:** eine Landingpage nur für Noahs Bio, UTM-Links, ein Stichwort pro Reel, eine Pflichtfrage bei der Terminbuchung und ein Feld „Erster Kontakt“ im Vertriebs-CRM. +8. **Recht in Kürze:** + - Die Wettbewerbszentrale hält eine Kennzeichnung für nötig, wenn Geschäftsführer oder Gesellschafter für ihre Firma werben. + - Die Medienanstalten verlangen sie nicht, wenn die eigene Unternehmerschaft im Beitrag eindeutig ist. Das OLG Hamburg hat im Mai 2026 ähnlich entschieden. + - Ein Impressum ist über den Link in der Bio nötig. + - Die normale Musikbibliothek von Instagram deckt keine geschäftliche Nutzung ab. + - Seit 02.08.2026 gilt Art. 50 des EU AI Act: Realistische KI-Inhalte müssen gekennzeichnet werden. +9. **Risiken:** + - Die Abhängigkeit von Noah ist hoch: seine Zeit, sein Konto, seine Kontakte. Gegenmittel sind eigene Kanäle von HiveGrid (Newsletter, CRM) und zweite Gesichter aus dem Team. + - Humor ist kein Problem, solange er nicht den Kern des Vertrauens trifft: Daten, Sicherheit, Kunden, Mitarbeitende. +10. **Ideen:** 15 Formate für Noah und 10 Collab-Formate stehen in Abschnitt 6. Der beste Start ist ein ehrliches Umstellungstagebuch bei Geerkens, sobald der Betrieb in 1 bis 2 Wochen mit HiveGrid arbeitet. + +--- + +## 1. Gründer-Marke führt zur Firma + +### 1.1 Reichweite: persönliche Profile gegenüber Unternehmensseiten + +**Belegt:** +- AuthoredUp wertet LinkedIn-Beiträge aus und stützt sich dabei auf die Studie „Algorithm Insights“ von Richard van der Blom. Laut AuthoredUp machen organische Inhalte von Unternehmensseiten nur etwa **2 Prozent des LinkedIn-Feeds** aus. Den Rest teilen sich vor allem persönliche Profile. (AuthoredUp, veröffentlicht 27.09.2025, aktualisiert 11.08.2026) +- Laut derselben Auswertung hat die Reichweite auf LinkedIn insgesamt abgenommen, bei fast allen Formaten. Bei persönlichen Profilen funktionieren Umfragen, Dokumente (PDF-Karussells) und Bilder besser als reiner Text. +- Eine Zusammenfassung von Blueberry Media (Juni 2026) zitiert van der Blom so: Beiträge, die in der ersten Stunde drei oder mehr echte Kommentare bekommen, erhalten deutlich mehr Reichweite. Diese Zahl ist nur aus zweiter Hand belegt. + +**Einschätzung:** +- Die genauen Faktoren schwanken je nach Quelle stark. Viele Zahlen im Netz stammen von Anbietern, die Werkzeuge für persönliche Profile verkaufen. Die Richtung ist aber überall gleich: **Menschen werden ausgespielt, Firmenseiten kaum.** +- Für HiveGrid heißt das: Die LinkedIn-Seite von HiveGrid ist kein Reichweitenkanal. Sie ist der Ort, an dem jemand nachschaut, nachdem er Noah gesehen hat. Sie muss also gepflegt und glaubwürdig sein, aber nicht viral. +- Auf Instagram gibt es keine vergleichbare saubere Studie. Dort zählt vor allem, ob ein Reel Nicht-Follower erreicht und ob es geteilt wird. Ein Gesicht mit Meinung hilft dabei erfahrungsgemäß mehr als eine Produktgrafik. Das passt zu dem, was das Team am 17.09. entschieden hat: Produktposts ohne Menschen waren zu wenig. + +### 1.2 Employee Advocacy + +Employee Advocacy heißt: Mitarbeitende teilen und kommentieren Inhalte der Firma über ihre eigenen Profile. + +**Belegt:** +- Oktopost (29.04.2026) sammelt Zahlen zu Employee Advocacy. Die oft zitierte Aussage, Inhalte von Mitarbeitenden bekämen **achtmal mehr Interaktion** als dieselben Inhalte auf Firmenkanälen, stammt aus einer Studie der MSLGroup. Oktopost schreibt selbst, dass das Jahr dieser Studie nicht bestätigt ist. **Die Zahl ist also alt und unsicher.** Sie sollte nicht in Präsentationen landen. +- Die Studie von Edelman und LinkedIn (2025, knapp 2.000 Befragte weltweit) zeigt einen anderen, belastbareren Punkt. In Kaufentscheidungen gibt es „versteckte Entscheider“, also Leute, die mitreden, aber nie mit dem Vertrieb sprechen. Laut Zusammenfassung von ContentGrip (17.07.2025): + - 95 Prozent dieser versteckten Entscheider sagen, gute Fachbeiträge machen sie offener für Kontakt aus dem Vertrieb. + - 64 Prozent vertrauen Fachbeiträgen mehr als Marketingmaterial und Produktblättern. + - 63 Prozent verbringen mehr als eine Stunde pro Woche mit solchen Inhalten. + - 79 Prozent setzen sich eher für einen Anbieter ein, der regelmäßig gute Fachbeiträge veröffentlicht. + +**Einschätzung:** +- Bei HiveGrid ist Employee Advocacy klein, aber machbar. Es gibt acht Leute im Team (Kontext 1.2). Wenn David, Raffael, Haris, Dejan und Aki HiveGrid im Profil nennen und Noahs LinkedIn-Beiträge in der ersten Stunde ehrlich kommentieren, hilft das der Reichweite. +- Gekaufte Kommentare, Kommentar-Gruppen oder Bots sollte man meiden. Sie passen nicht zur Marke und verstoßen gegen die Regeln der Plattformen. +- Im SHK-Betrieb sind die versteckten Entscheider oft die Bürokraft, der Sohn oder die Tochter in der Nachfolge oder ein Meister. Die Studie von Edelman stammt aus größeren B2B-Märkten. Das Muster dürfte trotzdem passen: Der Chef entscheidet, aber andere bringen das Thema auf den Tisch. + +### 1.3 Founder-led Marketing und Founder-led Sales + +**Was gemeint ist:** Der Gründer ist das Gesicht des Marketings (Founder-led Marketing) und führt die ersten Verkaufsgespräche selbst oder ist zumindest dabei (Founder-led Sales). In frühen Firmen ist das üblich, weil der Gründer das Problem am besten kennt und weil Käufer einem Menschen mehr glauben als einer jungen Marke. + +**Belegt:** +- 6sense hat 2025 B2B-Käufer befragt (Buyer Experience Report 2025): + - Etwa 60 Prozent der Kaufreise passieren, bevor der Käufer mit einem Anbieter spricht. + - In 79 Prozent der Fälle geht der erste Kontakt vom Käufer aus. + - Der spätere Gewinner steht in 95 Prozent der Fälle schon am ersten Tag auf der Liste. + - Vier von fünf Abschlüssen gehen an den Favoriten von vor dem Kontakt. +- Die Studie von Edelman und LinkedIn (2025) zeigt: Gute Fachbeiträge wirken stärker als klassisches Marketing, wenn es darum geht, den Wert eines Anbieters zu zeigen. + +**Einschätzung:** +- Beide Studien kommen aus größeren B2B-Märkten, vor allem aus Software und Technik. Ein SHK-Betrieb mit 20 Leuten kauft anders: kürzer, persönlicher, mit mehr Bauchgefühl. Der Kern trägt trotzdem: **Wer vor dem ersten Gespräch bekannt und sympathisch ist, gewinnt eher.** +- Noah hat zwei Vorteile, die ein normaler Software-Gründer nicht hat: + - Er ist selbst SHK-Meister und Chef eines Betriebs in vierter Generation. Das ist das Prinzip „einer von uns“, das im Kontext schon als Stärke steht (Kontext 9.4). + - Er kann die Einführung im eigenen Betrieb zeigen. Das ist Beleg und Geschichte in einem. +- Founder-led Sales heißt für HiveGrid nicht, dass Noah jedes Erstgespräch führt. Haris führt die Gespräche. *Vorschlag:* Noah ist bei den ersten zehn bis zwanzig Gesprächen kurz dabei, etwa fünf Minuten am Anfang oder per Sprachnachricht vorab. Danach übernimmt Haris allein. Ob Noah dafür Zeit hat, ist eine offene Frage. + +### 1.4 Beispiele + +**Belegt, mit Bezug zum Handwerk:** + +| Beispiel | Was belegt ist | Was HiveGrid daraus lernen kann | +|---|---|---| +| **openHandwerk** (Berlin) | Martin Urbanek war Geschäftsführer eines Betriebs für Schimmelsanierung. Weil es keine passende Software gab, ließ er ab 2016 eine eigene entwickeln. Die GmbH entstand im Januar 2018. Die Firma wirbt damit, die „einzige eigenfinanzierte und aus dem Handwerk entstandene Handwerker-/Bausoftware in Deutschland“ zu sein. (openHandwerk, Über uns; DasHandwerk.de, abgerufen 05.10.2026) | Die Herkunft aus dem Betrieb ist ein Verkaufsargument, auch ohne großen Personal-Brand-Kanal. HiveGrid hat dieselbe Geschichte, aber mit einem Gesicht, das schon Reels macht. | +| **Plancraft und Sina Klein** | Sina Klein ist Dachdeckermeisterin in einem Betrieb mit vier Leuten, hat über 56.000 Follower auf Instagram und rund 28.000 auf TikTok. Plancraft begleitet sie seit etwa 2020 in einer „lockeren und bewusst langfristigen“ Zusammenarbeit. Sie nutzt die Software selbst für ihre Angebote und Rechnungen. (Handwerksblatt, 05.06.2024) | Ein Softwareanbieter nutzt eine Handwerkerin als glaubwürdige Stimme. HiveGrid hat diese Stimme im eigenen Haus. Der Unterschied: Bei Sina Klein ist es Fremdwerbung, bei Noah eigene Werbung. Das ändert die Kennzeichnung (Abschnitt 4). | +| **Craftnote** | Mitgründer Dirk Stefen tritt in Werbung, Tutorials, auf der Website und beim App-Download auf, um Vertrauen zu schaffen. (Craftnote, 02.01.2020, ältere Quelle) | Gründer als wiederkehrendes Gesicht in der Hilfe und im Produkt, nicht nur im Marketing. | +| **MemoMeister** | Mitgründer Achim Maisenbacher moderiert den Podcast „Bauimpulse“ und schreibt Ratgeber zu Instagram für Handwerker. (MemoMeister, 03.04.2024) | Gründer als Gastgeber für Fachthemen. Das baut Reichweite in der Branche auf, ohne direkt zu werben. | +| **Louis Baureis und Lais Kriwat** (LinkedIn) | Louis Baureis, Juniorchef der Schreinerei Baureis in Viernheim, nennt sich „Der LinkedIn-Schreiner“. Lais Kriwat, Orthopädieschuhmachermeister, berichtet über die Nachfolge im Familienbetrieb und postet zweimal pro Woche nach Plan. Er sagt: „Bei LinkedIn geht es aus meiner Sicht vor allem um das Persönliche.“ (DHZ, 11.10.2023; handwerk magazin, 21.02.2023, ältere Quellen) | Nachfolge und Familienbetrieb funktionieren auf LinkedIn als Thema. Das passt zu Noah. Ergebnisse in Aufträgen oder Leads sind in den Artikeln nicht belegt. | +| **Vögel Energie Bad Wärme** (SHK) | Ein SHK-Betrieb mit „schrägen Inhalten“ auf TikTok und knapp 125.000 Followern. (HERO Software Blog, 04.09.2025) | Humor funktioniert auch im SHK. Ziel ist dort aber vor allem Bekanntheit und Personal, nicht Software. | +| **Dachdeckerbetrieb Schultheis** (Bruchköbel) | Hat seit 2023 sechs Azubis über Social Media gewonnen. Top-Videos auf TikTok haben über 150.000 Aufrufe. (hessenschau, 01.05.2025) | Reichweite im Handwerk zieht schnell auch Azubis und Endkunden an. Für HiveGrid ist das die falsche Zielgruppe. Themen müssen das filtern. | + +**Belegt, international:** +- **ServiceTitan** (USA): Die Gründer Ara Mahdessian und Vahe Kuzoyan sind Söhne von Handwerkern. Der Vater von Vahe Kuzoyan war Installateur. Die Software begann als Sommerprojekt, um den Betrieben der Väter zu helfen. Am 12.12.2024 ging ServiceTitan an die Nasdaq. (Contrary Research, 21.12.2023; USC Dornsife; Wikipedia, abgerufen 05.10.2026) Hier zählt die Herkunftsgeschichte, nicht eine Personal Brand auf Instagram. +- **Mint Mobile und Ryan Reynolds** (USA): Reynolds hielt ab November 2019 etwa 25 Prozent an dem Mobilfunkanbieter und machte die Werbung mit viel Humor. Im Mai 2024 kaufte T-Mobile US die Firma für 1,3 Milliarden Dollar. (Wikipedia, abgerufen 05.10.2026) Ein lustiges Gesicht vor einem ganz normalen Dienst, dem Kunden ihre Daten geben. Das ist kein B2B-Fall, zeigt aber das Muster „lustiges Gesicht, seriöser Dienst“. + +**Was fehlt (Einschätzung):** +- Kein belegter deutscher Fall, in dem ein Handwerksunternehmer mit großer eigener Reichweite eine selbst gegründete Software verkauft. Vielleicht gibt es ihn und die Recherche hat ihn nicht gefunden. +- Für HiveGrid heißt das: Es gibt keine Vorlage, die man kopieren kann. Dejans Idee aus F8 passt deshalb gut: viele Formate testen, behalten, was funktioniert. + +--- + +## 2. Rollenteilung zwischen Noahs Kanälen und den HiveGrid-Kanälen + +### 2.1 Grundprinzip + +Davids Papier vom 26.09. hat die Teilung schon richtig angelegt: **Noah schafft Aufmerksamkeit und Nähe. HiveGrid schafft Produktverständnis und Vertrauen.** Neu seit 05.10. ist: Noahs Reels laufen auf seinem eigenen Konto, nicht auf HiveGrid (F7). Damit ist Noahs Konto der Anfang des Funnels und HiveGrid die Zielseite. + +**Vorschlag für die Kanäle (Einschätzung):** + +| Kanal | Rolle | Typische Inhalte | Ton | Einladung (CTA) | +|---|---|---|---|---| +| **Noah, Instagram** | Aufmerksamkeit, Nähe | Alltag als Chef, Meinung, Umstellung bei Geerkens, Humor, Fehler | persönlich, locker, auch lustig | selten, über Stichwort im Kommentar | +| **Noah, LinkedIn** | Glaubwürdigkeit bei Chefs und Nachfolgern | längere Gedanken, Learnings, Gründergeschichte, Zahlen aus dem eigenen Betrieb | ruhig, ehrlich, Ich-Form | ab und zu Link in den Kommentaren oder im Profil | +| **HiveGrid, Instagram** | Produkt verstehen, Vertrauen | Abläufe, Infoslides, Collabs mit Noah, Team, Bau der Software | klar, konkret, Du | Erstgespräch, PDF, Newsletter | +| **HiveGrid, Facebook** | Reichweite bei älteren Chefs, Gruppen | Reels und Karussells aus Instagram, Hinweise auf Webinar oder Live | wie Instagram | wie Instagram | +| **HiveGrid, TikTok** | Tests mit Reichweite | Ausschnitte aus Noahs Reels, Bau der Software | locker | wenig, Profil-Link | +| **HiveGrid, LinkedIn-Seite** | Nachweis, dass es die Firma gibt | Teilen von Noahs und Teambeiträgen, Produktneuigkeiten, Stellen | sachlich | Erstgespräch | +| **Newsletter** | eigener Kanal, gehört HiveGrid | Umstellungstagebuch, ein Ablauf pro Ausgabe, Termine | persönlich, mit Noahs Stimme | Erstgespräch, Demo | +| **Website** | Zielseite | Landingpage für Noahs Bio, Erstgespräch, Impressum | ruhig | Erstgespräch | + +### 2.2 Wie oft erwähnt Noah HiveGrid? + +**Belegt:** Es gibt keine Studie, die eine richtige Quote beweist. Verbreitete Faustregeln wie „80 Prozent Mehrwert, 20 Prozent Werbung“ sind Praxiswissen aus Agenturen und Ratgebern. + +**Einschätzung, als Startwert zum Testen:** +- Bei etwa 7 Reels pro Woche auf Noahs Konto: + - **4 ohne HiveGrid**: Alltag, Meinung, Humor, Betrieb. + - **2 mit HiveGrid als Teil der Geschichte**: Umstellung, Bau der Software, Team. HiveGrid kommt vor, wird aber nicht angepriesen. + - **1 mit klarer Einladung**: Stichwort für ein PDF, Hinweis auf Live oder Webinar. +- Auf LinkedIn darf der Anteil höher sein. Dort erwartet das Publikum, dass Gründer über ihre Firma schreiben. +- Nach vier Wochen vergleichen: Welche Gruppe bringt mehr Profilaufrufe, mehr Follower bei HiveGrid und mehr Stichwort-Kommentare? Davids Hinweis gilt weiter: Ein einzelner Ausreißer beweist nichts. Mehrere vergleichbare Beiträge ansehen. + +### 2.3 Collab-Posts, Cross-Posting, Kommentare, Stories + +**Collab-Posts** +- Ein Collab-Post erscheint auf beiden Profilen und sammelt Aufrufe, Likes und Kommentare gemeinsam. So sieht Noahs Publikum das HiveGrid-Profil. Laut Kontext gab es bisher 3 solcher Posts. Um den 27.09. gab es bei HiveGrid einen deutlichen Sprung bei den Followern (Kontext F18). Ob der von einem Collab kam, sollte man prüfen. +- *Einschätzung:* 1 bis 2 Collabs pro Woche. Nicht jedes Noah-Reel als Collab, sonst wirkt Noahs Konto wie ein Firmenkonto und verliert Nähe. +- **Recht:** Laut Leitfaden der Medienanstalten (Mai 2025) gilt die Kennzeichnung auch bei Collab-Posts, auf jedem Konto, auf dem der Beitrag erscheint. Es ist egal, wer ihn erstellt hat (Abschnitt 4.1). + +**Cross-Posting** +- Reels von Instagram lassen sich auf Facebook und TikTok weiterverwenden (Kontext F18). +- **Achtung Musik:** Auf TikTok sehen Business-Konten nur die kommerzielle Musikbibliothek. Werbende Inhalte gelten auch auf persönlichen Konten als kommerziell (Soundstripe, 16.09.2026). Ein Reel mit einem Song aus der Instagram-Bibliothek darf also nicht einfach auf das HiveGrid-TikTok. Am einfachsten ist Musik, die für alle Plattformen lizenziert ist, oder gar keine Musik (Abschnitt 4.3). + +**Kommentare** +- Das HiveGrid-Konto kommentiert unter Noahs Reels mit echtem Mehrwert, zum Beispiel einer kurzen Ergänzung. Keine Werbesprüche. +- Noah kommentiert unter HiveGrid-Posts mit einem persönlichen Satz. +- Fragen unter Noahs Reels sind Rohstoff für Antwort-Reels (Ideen 6 und Collab 5). + +**Stories** +- Noah teilt HiveGrid-Posts in seiner Story mit einem eigenen Satz. HiveGrid teilt Noahs Reels mit Einordnung („Unser Gründer über …“). +- **Recht:** Laut Medienanstalten gilt auch das Teilen von Beiträgen der eigenen Firma als Werbung, wenn das Konto nicht eindeutig kommerziell ist. In Noahs Story deshalb die Rolle oder „Werbung“ sichtbar machen (Abschnitt 4.1). + +### 2.4 Link in Bio und Highlights + +**Noahs Profil (Vorschlag)** +- **Bio:** ein Satz zu den Rollen, zum Beispiel: „SHK-Meister · Geschäftsführer Geerkens GmbH (4. Generation) · Mitgründer von @hivegrid.de“. +- **Link:** eine eigene Seite, etwa `hivegrid.de/noah`, mit: + - wer Noah ist (zwei Sätze) + - was HiveGrid ist (drei Sätze) + - aktuelles PDF, Newsletter, Erstgespräch + - Impressum und Datenschutz +- Diese Seite erfüllt zwei Zwecke: Messung (jeder Besuch kommt von Noah) und Impressum in zwei Klicks (Abschnitt 4.2). +- **Highlights:** „Umstellung“, „HiveGrid“, „Betrieb“, „Fragen“. + +**HiveGrid-Profil (Vorschlag)** +- **Bio:** „Gegründet von @noahgeerkens, SHK-Meister in 4. Generation“ plus Kernbotschaft. +- **Link:** Erstgespräch und Newsletter, mit Impressum. +- **Highlights:** „Gründer“, „So läuft's“, „Umstellung Geerkens“, „Erstgespräch“. + +### 2.5 Glaubwürdigkeit: Noah ist Kunde, Gründer und Geschäftsführer zugleich + +Das ist der heikelste Punkt dieses Themas. Noah hat drei Rollen: +1. **Gründer und Geschäftsführer** der HiveGrid GmbH i. G. +2. **Geschäftsführer** der Geerkens GmbH, die erster Kunde und Investor von HiveGrid ist. +3. **Handwerksmeister**, der als „einer von uns“ zu anderen Chefs spricht. + +**Einschätzung, was die Glaubwürdigkeit schützt:** +- **Rollen immer offen sagen.** In der Bio, in Videos über HiveGrid und auf der Website. Wer es selbst sagt, nimmt Kritikern das Argument. Das ist gleichzeitig der beste Schutz bei der Werbekennzeichnung (Abschnitt 4.1). +- **Geerkens nicht als neutrale Referenz verkaufen.** Ein Satz wie „Unser erster Kunde ist begeistert“ wäre irreführend, wenn nicht dabeisteht, dass es Noahs eigener Betrieb ist. Besser: „Wir stellen in meinem eigenen Betrieb als Erste um. Ich zeige euch, was klappt und was nicht.“ +- **Probleme zeigen.** Das Team hat entschieden, den Bau offen als Stärke zu zeigen (F6). Für Noah heißt das: Auch zeigen, wenn etwas bei Geerkens hakt. Ein Gründer, der nur lobt, wirkt wie Werbung. Ein Gründer, der Fehler zeigt, wirkt wie ein Handwerker. +- **Grenzen nennen.** Zum Beispiel: „Wenn du nicht mit KWP oder PDS arbeitest, ist bei uns heute noch nichts angebunden.“ Das passt zur Regel aus dem Kontext: genau ein freiwilliges, frühes Eingeständnis einer Schwäche (Kontext 9.4). +- **Keine Aussagen, die das Produkt nicht hält.** In Kontext 9.7 stehen Widersprüche: DATEV, Rechnungen, „100 % in Deutschland, ohne US-Beteiligung“. Diese Sätze dürfen in Noahs Reels nicht vorkommen, auch nicht im Scherz. +- **Andere Stimmen dazuholen.** Mitarbeitende von Geerkens, die Schwester (wenn sie will), andere Betriebe. Sobald es echte Kunden gibt, sprechen die. Noah moderiert. +- **Keine erfundenen Zahlen.** Wenn Noah Zahlen nennt, dann selbst gemessen und mit Methode („Ich habe eine Woche lang gezählt …“). + +--- + +## 3. Der Funnel von Anfang bis Ende + +### 3.1 Die Stufen + +| Stufe | Was dort passiert | Kennzahl | Werkzeug | Typische Lecks | +|---|---|---|---|---| +| **1. Reel** (Noah) | Ein Chef sieht ein Reel von Noah, bleibt hängen, fühlt sich verstanden. | Aufrufe, Anteil Nicht-Follower, Sendungen, Speicherungen, Wiedergabedauer | Instagram-Statistik, Metricool (Noahs Konto ist dort noch nicht verbunden) | Einstieg ohne SHK-Bezug, falsches Publikum (Azubis, Endkunden), Ton schlecht, Untertitel unlesbar | +| **2. Profil** (Noah) | Er tippt auf Noahs Profil und versteht in drei Sekunden, wer Noah ist und was HiveGrid ist. | Profilaufrufe, neue Follower, Klicks auf den Link | Instagram-Statistik | Bio ohne Rollen, kein Link, HiveGrid nicht verlinkt, keine Highlights | +| **3. Link oder Stichwort** | Er klickt den Link oder kommentiert ein Stichwort und bekommt eine DM. | Linkklicks, Kommentare mit Stichwort, zugestellte DMs, Antworten auf die DM | Link-Seite mit UTM, ManyChat | Stichwort falsch geschrieben, Automation am falschen Reel, DM im Sie (seit F11 gilt Du), zweite Nachricht kommt nie an (siehe 3.2) | +| **4. Lead-Magnet** | Er bekommt ein PDF, das ihm wirklich hilft, auch ohne HiveGrid. | Downloads, Anteil mit E-Mail-Adresse | Landingpage, PDF | PDF zu allgemein, zu werblich oder ohne nächsten Schritt, E-Mail-Feld fehlt | +| **5. Newsletter oder Sequenz** | Er bekommt regelmäßig Post von Noah: Umstellung, ein Ablauf, ein Termin. | Bestätigte Anmeldungen, Öffnungen, Klicks, Abmeldungen | HiveGrids eigenes E-Mail-Marketing (Kontext 2.2) oder ein externes Werkzeug | Das Feld im Website-Fuß speichert heute nichts (Kontext 9.7). Fehlende Bestätigung per Mail. Unregelmäßiger Versand. | +| **6. Erstgespräch** | Er bucht 30 Minuten bei Haris. Haris versteht den Betrieb und prüft, ob HiveGrid passt. | Buchungen, Erscheinen, Anteil passender Betriebe (SHK, 10 bis 50 Leute) | Cal (`cal.hivegrid.de/haris/demo`), Vertriebs-CRM | Zu wenig freie Termine, keine Erinnerung, Frage nach der Quelle fehlt, Gespräch zu verkäuferisch | +| **7. Demo-Workspace** | Er bekommt 30 Tage einen eigenen Workspace mit 30 Beispiel-Automationen. | Angelegte Workspaces, aktive Nutzung in Woche 1, zweiter Termin | `demo.hivegrid.de`, CRM | Niemand schaut nach einer Woche nach, Fehler im Produkt, kein Bezug zu seinem Branchenprogramm | +| **8. Kunde** | Er unterschreibt. | Abschlüsse, Tage vom ersten Kontakt bis Abschluss, Quelle | CRM, Vertrag | Preise nicht öffentlich, Bezahlung über Mollie noch nicht live, keine Anbindung für sein Branchenprogramm | + +### 3.2 Die Grenze bei Instagram-Nachrichten + +**Belegt:** Meta erlaubt für Kommentare unter Posts und Reels genau **eine private Antwort**, und zwar innerhalb von **7 Tagen** nach dem Kommentar. Erst wenn die Person auf diese Nachricht antwortet, öffnet sich ein Zeitfenster von 24 Stunden für weitere Nachrichten. (Meta for Developers, Private Replies, abgerufen 05.10.2026) + +**Was das für Davids Plan heißt:** +- Davids Ablauf sah zwei Nachrichten vor: erst das PDF, dann die Einladung zum Gespräch. Die zweite Nachricht kommt nur an, wenn die Person vorher antwortet. Das hat David in seinem Papier schon angemerkt. +- *Vorschlag:* Die erste Nachricht enthält das PDF und eine einfache Frage mit Antwortknopf, etwa „Mit welchem Branchenprogramm arbeitet ihr?“. Wer tippt, öffnet das Fenster. Dann kommt die Einladung, passend zur Antwort. +- Zusätzlich steht die Einladung auf der letzten Seite des PDFs und auf der Landingpage. So geht sie nicht verloren. +- Die Texte sind seit F11 im **Du**. + +**Offen und wichtig:** ManyChat muss mit dem Konto verbunden sein, auf dem kommentiert wird. Wenn die Reels auf Noahs Konto laufen, muss die Automation auf Noahs Konto laufen, und die DMs kommen von Noah. Ob das bei Collab-Posts auch über das HiveGrid-Konto geht, sollte man vorher testen. + +### 3.3 Messen: Bringen Noahs Reels Leads? + +Bei kleinen Zahlen ist jede einzelne Anfrage wichtig. Man braucht keine komplizierte Attribution. Man braucht **fünf einfache Spuren**, die ab dem ersten Tag laufen. + +1. **Eigene Landingpage nur für Noahs Bio.** Zum Beispiel `hivegrid.de/noah`. Die Seite ist sonst nirgends verlinkt. Jeder Besuch kommt also von Noah. +2. **UTM-Links.** Das sind Zusätze am Link, die Google Analytics und ähnliche Werkzeuge auswerten (Google Analytics Hilfe). Vorschlag für ein festes Schema: + - `utm_source=instagram` oder `linkedin` + - `utm_medium=bio`, `dm` oder `story` + - `utm_campaign=noah` + - `utm_content=` Datum und Kurzname des Reels + Welches Analysewerkzeug auf der Website läuft, steht nicht im Kontext. Das ist eine offene Frage. +3. **Ein Stichwort pro Reel.** Jedes Reel mit Einladung bekommt sein eigenes Wort (zum Beispiel ABLAUF, CHECKLISTE, TAGEBUCH). ManyChat zählt dann pro Reel. +4. **Pflichtfrage bei der Terminbuchung.** Im Cal-Formular: „Wie bist du auf HiveGrid gekommen?“ mit Auswahl (Noah Instagram, Noah LinkedIn, HiveGrid Instagram, Website, Messe, Empfehlung, Anruf von uns, Sonstiges) und einem Freitextfeld. Haris fragt im Gespräch noch einmal nach: „Was hast du von uns gesehen?“ +5. **Feld „Erster Kontakt“ im Vertriebs-CRM.** Anfragen landen schon heute im eigenen CRM von HiveGrid (Kontext 8.2). Ein festes Feld mit denselben Werten wie bei Cal macht die Auswertung einfach. + +**Warum die Frage im Gespräch so wichtig ist (Einschätzung):** Viele Chefs sehen ein Reel, merken sich den Namen und suchen zwei Wochen später bei Google. Dann zeigt kein Link auf Noah. Laut 6sense passiert ein Großteil der Kaufreise unsichtbar vor dem Kontakt. Nur die direkte Frage fängt das auf. + +**Rhythmus:** Einmal pro Woche eine Tabelle mit fünf Zahlen: Stichwort-Kommentare, Besuche auf `/noah`, neue Newsletter-Kontakte, gebuchte Erstgespräche mit Quelle Noah, Demos mit Quelle Noah. Nach vier Wochen gemeinsam mit Noah und David ansehen, wie in Davids Papier vorgesehen. + +### 3.4 Lead-Magnete, die zu HiveGrid passen + +*Einschätzung:* Das PDF muss auch ohne HiveGrid helfen. Sonst ist es ein Prospekt. +- **Checkliste „Was ich vor einem Softwarekauf fragen würde“**, aus Noahs Sicht als Chef. +- **Der Wärmepumpen-Ablauf als Vorlage**: 10 Phasen, 13 Stellen, 17 Übergaben aus dem Geerkens-Prozess (Kontext 8.3). Nur mit Noahs Freigabe, weil das ein interner Ablauf ist. +- **„5 Abläufe, die man automatisieren kann, ohne das Branchenprogramm zu wechseln“**, aus den 30 Golden Flows. +- **Umstellungstagebuch als Zusammenfassung** nach vier Wochen, per Mail. + +--- + +## 4. Recht in Deutschland (Einordnung, keine Rechtsberatung) + +### 4.1 Werbekennzeichnung, wenn Noah auf seinem Konto für HiveGrid wirbt + +**Der Rahmen (belegt):** +- **§ 5a Abs. 4 UWG:** Wer den kommerziellen Zweck einer geschäftlichen Handlung nicht kenntlich macht, handelt unlauter, sofern sich der Zweck nicht unmittelbar aus den Umständen ergibt. Das gilt gegenüber Verbrauchern und gegenüber „sonstigen Marktteilnehmern“, also auch gegenüber Betrieben. Für Werbung zugunsten eines **fremden** Unternehmens gilt: Ohne Entgelt oder ähnliche Gegenleistung liegt kein kommerzieller Zweck vor. (gesetze-im-internet.de) +- Daneben gelten **§ 6 Abs. 1 Nr. 1 DDG** und **§ 22 Abs. 1 MStV**. Diese Regeln aus dem Medienrecht gehen dem UWG vor. (Wettbewerbszentrale, August 2024) + +**Die Urteile des BGH (belegt):** +- Am **09.09.2021** hat der BGH drei Fälle entschieden (BRAK, 09.09.2021; Hogan Lovells, 18.03.2022): + - **I ZR 90/20 (Influencer I):** Eine Fitness-Influencerin bekam Geld für einen Beitrag über Himbeermarmelade. Der Hinweis war nicht auf den ersten Blick erkennbar. Verstoß. + - **I ZR 125/20 (Influencer II)** und **I ZR 126/20:** Keine Gegenleistung, kein Verstoß. + - Zur **Werbung für sich selbst** sagt der BGH: Der kommerzielle Zweck von Beiträgen zugunsten des eigenen Unternehmens ergebe sich „unmittelbar aus den Umständen“. In diesen Fällen ging es um Influencerinnen mit sehr vielen Followern und blauem Haken. +- Am **13.01.2022 (I ZR 35/21, Influencer III)** stellte der BGH klar: Auch kostenlos überlassene Produkte sind eine Gegenleistung. + +**Was das für eigene Firmen heißt (belegt, aber die Quellen sind sich nicht einig):** +- **Wettbewerbszentrale (Leitfaden, August 2024):** „Nach Auffassung der Wettbewerbszentrale sind Posts von Influencern, die Gesellschafter oder Geschäftsführer des Herstellers der beworbenen Produkte sind, als Werbung zu kennzeichnen.“ Ihr Beispiel: Eine Influencerin, die am Hersteller beteiligt oder dessen Geschäftsführerin ist, betreibt kennzeichnungspflichtige Fremdwerbung. +- **Medienanstalten (Leitfaden, Mai 2025):** Beiträge über eigene Produkte, Marken und Unternehmen brauchen **keine Kennzeichnung**, „wenn die eigene Unternehmerschaft im konkreten Beitrag eindeutig ist“. Ist sie nicht eindeutig, muss gekennzeichnet werden. Das gilt auch für Reposts aus Kanälen der eigenen Firma. Die Medienanstalten warnen außerdem davor, „sicherheitshalber“ alles zu kennzeichnen. +- **OLG Hamburg, Urteil vom 21.05.2026 (15 U 99/24):** Eine sehr bekannte Influencerin (rund 9,3 Millionen Follower) bewarb Haarpflege ihrer eigenen Firma, deren Geschäftsführerin und Mehrheitsgesellschafterin sie war. Kein Verstoß. Die Kennzeichnung sei entbehrlich, wenn Nutzer den kommerziellen Zweck „auf den ersten Blick“ erkennen. Das Gericht stützte sich unter anderem darauf, dass sie sich als „Founderin“ bezeichnete, auf den Markennamen mit „by“, die Verkaufssprache, die typische Aufmachung als Werbung, die Followerzahl und den blauen Haken. (CMS, 26.08.2026) + +**Einschätzung für Noah:** +- HiveGrid ist eine eigene GmbH, nicht Noahs Einzelfirma. Noah ist dort Geschäftsführer und Gründer. Nach der strengen Linie der Wettbewerbszentrale wären werbliche HiveGrid-Beiträge auf Noahs Konto zu kennzeichnen. +- Nach der Linie der Medienanstalten und des OLG Hamburg reicht es, wenn die eigene Rolle **im Beitrag selbst** klar ist. Das OLG Hamburg hat aber auch die große Bekanntheit der Influencerin gewertet. Noahs Konto ist kleiner, seine Rolle bei HiveGrid kennen viele Zuschauer nicht. Die Klarheit muss also aus dem einzelnen Beitrag kommen. +- **Praktische Linie zum Prüfen mit dem Anwalt:** + 1. **Bio:** Rollen nennen (siehe 2.4). + 2. **Beiträge, in denen HiveGrid nur am Rand vorkommt** (Alltag, Umstellung, Geschichte): Rolle am Anfang klar machen, im Bild oder im ersten Satz, etwa „Ich bin Mitgründer von HiveGrid. Bei uns im Betrieb stellen wir gerade um.“ + 3. **Beiträge mit klarer Werbung** (Einladung zur Demo, Stichwort für HiveGrid-Material, Preise, Vorteile): „Werbung“ als erstes Wort der Caption und im Video gut sichtbar. Diese Wörter empfehlen beide Leitfäden. „#ad“, „ad“, „sponsored“ oder „Partnerschaft“ reichen laut Wettbewerbszentrale nicht. + 4. **Collab-Posts:** Gleiche Regel auf beiden Konten (Medienanstalten, Mai 2025). + 5. **Plattform-Label „Bezahlte Partnerschaft“:** Laut Medienanstalten kann ein Plattform-Werkzeug allein reichen, wenn es „Werbung“, „Anzeige“ oder „bezahlte Werbepartnerschaft“ anzeigt. Für die eigene Firma passt „bezahlte Partnerschaft“ inhaltlich aber nicht. Ein Text am Anfang ist ehrlicher. +- **Geerkens als „Kunde“:** Wenn Noah als Geerkens-Chef über HiveGrid spricht, ist das keine unabhängige Kundenstimme. Das gehört offen gesagt. Sonst droht neben der Kennzeichnung auch der Vorwurf der Irreführung. + +### 4.2 Impressum für Noahs Profil + +**Belegt:** +- **§ 5 Abs. 1 DDG:** Wer „geschäftsmäßige, in der Regel gegen Entgelt angebotene digitale Dienste“ anbietet, muss bestimmte Angaben „leicht erkennbar, unmittelbar erreichbar und ständig verfügbar“ halten. (gesetze-im-internet.de) +- Laut eRecht24 (14.11.2024) reicht für die Pflicht schon ein Verweis auf eine andere Website oder eine Verlinkung auf ein Unternehmen. Das Impressum muss in höchstens zwei Klicks erreichbar sein, auf Instagram über den Link in der Bio. +- Laut einem Beitrag zum Urteil des OLG Hamburg vom 21.05.2026 (Kanzlei Mauritz, 06.08.2026) reicht ein Link in der Bio auf die Firmenwebsite, wenn dort ein vollständiges Impressum leicht zu finden ist. +- Bei Verstößen drohen Abmahnungen. Laut Wettbewerbszentrale gehört das Impressum zu den allgemeinen Pflichten von Influencern. + +**Einschätzung für Noah:** +- Noahs Konto ist mit HiveGrid und Geerkens verknüpft und dient dem Funnel. Es ist damit geschäftsmäßig. +- Die Frage ist, **wessen** Impressum dort steht: Noah persönlich, die HiveGrid GmbH i. G. oder die Geerkens GmbH. Das muss der Anwalt entscheiden. Die Landingpage `hivegrid.de/noah` könnte einen eigenen Impressumsabschnitt für Noahs Kanäle bekommen. +- Das Gleiche gilt für Noahs LinkedIn-Profil. Dort gibt es im Bereich Kontaktinfo ein Feld für eine Website. +- Für die neuen HiveGrid-Konten auf Facebook und TikTok gilt die Pflicht ebenso. + +### 4.3 Musik in Reels + +**Belegt:** +- Die Musikbibliothek von Instagram ist nur für persönliche, nicht kommerzielle Nutzung lizenziert. Meta schreibt sinngemäß: Die Nutzung von Musik für gewerbliche oder nicht private Zwecke ist verboten, es sei denn, man hat eigene Lizenzen. (gruender.de, 30.12.2024; Händlerbund, 08.06.2026) +- Für Unternehmen gibt es die **Meta Sound Collection** mit lizenzfreier Musik für Instagram und Facebook. Diese Titel gelten nur bei Meta, nicht auf TikTok oder YouTube. +- Laut Händlerbund zählt die tatsächliche Nutzung, nicht der Kontotyp. Auch ein Creator-Konto mit werblichen Inhalten wird als kommerziell behandelt. Abmahnungen bei Musik liegen laut Händlerbund oft bei 5.000 bis über 10.000 Euro. +- **TikTok:** Business-Konten sehen nur die kommerzielle Musikbibliothek. Werbende Beiträge auf persönlichen Konten fallen trotzdem unter die Regeln für kommerzielle Musik. (Soundstripe, 10.08.2026, aktualisiert 16.09.2026) + +**Einschätzung für Noah:** +- Noahs Reels mit HiveGrid-Bezug sind geschäftlich. Trend-Songs aus der normalen Bibliothek sind dort ein Risiko, auch wenn das in der App technisch geht. +- Sicher sind: keine Musik, Musik aus der Meta Sound Collection (nur für Instagram und Facebook) oder Musik mit einer Lizenz, die ausdrücklich geschäftliche Nutzung auf allen Plattformen erlaubt. +- Bei Musik aus KI-Generatoren entscheiden die Nutzungsbedingungen des jeweiligen Anbieters. Vorher prüfen. +- Davids Papier betont: Ton und Stimme haben Vorrang. Ein klarer Ton ohne Musik ist kein Nachteil. + +### 4.4 KI-generierte Inhalte + +**Belegt, Meta:** +- Meta verlangt, dass Nutzer ein Label setzen, wenn sie **fotorealistische Videos oder realistisch klingenden Ton** posten, der mit KI erstellt oder verändert wurde. Bei Bildern setzt Meta das Label „AI info“ oft selbst, wenn es technische Signale in der Datei findet (C2PA, IPTC). (Meta, 05.04.2024, aktualisiert 12.09.2024; das Label heißt seit 01.07.2024 „AI info“) + +**Belegt, EU AI Act Art. 50:** +- Die Pflichten aus Art. 50 gelten seit dem **02.08.2026**. Der Digital Omnibus hat die Fristen für Hochrisiko-Systeme verschoben (auf 02.12.2027 und 02.08.2028), **nicht aber Art. 50**. Für die maschinenlesbare Markierung durch die Anbieter älterer KI-Systeme gibt es eine Übergangsfrist bis 02.12.2026. (Goodwin, 03.08.2026; Cooley, 03.08.2026) +- **Art. 50 Abs. 4:** Wer als Betreiber (Deployer) mit KI einen **Deepfake** erstellt, muss offenlegen, dass der Inhalt künstlich erzeugt oder verändert ist. Ein Deepfake ist nach Art. 3 Nr. 60 ein KI-erzeugter oder veränderter Bild-, Ton- oder Videoinhalt, der echten Personen, Gegenständen, Orten oder Ereignissen ähnelt und fälschlich als echt erscheinen würde. +- **Ausnahme:** Bei offensichtlich künstlerischen, kreativen, satirischen oder fiktionalen Werken reicht ein Hinweis, der die Darstellung nicht stört. +- **Art. 50 Abs. 5:** Der Hinweis muss spätestens beim ersten Kontakt mit dem Inhalt klar erkennbar sein. (artificialintelligenceact.eu) +- Die EU-Kommission hat am **20.07.2026** Leitlinien zu Art. 50 verabschiedet. Der Verhaltenskodex zur Kennzeichnung (Code of Practice) wurde am **10.06.2026** fertig. Er enthält gemeinsame EU-Symbole. Die Kennzeichnung soll ohne Klick erkennbar und lange genug sichtbar sein. Laut den Leitlinien kommt es nicht auf Täuschungsabsicht oder Fotorealismus an. Es reicht, dass das Gezeigte plausibel echt sein könnte. Normale Bearbeitung wie Zuschneiden oder Rechtschreibhilfe ist ausgenommen. (Paul Weiss, 04.08.2026; EU-Kommission) +- Bußgelder bei Verstößen: bis 15 Millionen Euro oder 3 Prozent des weltweiten Umsatzes. + +**Einschätzung für Noah:** +- Noah nutzt für seine Reels viel KI (F15). Geschäftliche Nutzung ist keine rein private Tätigkeit. Noah dürfte also als Betreiber gelten. +- **Kennzeichnen:** + - KI-Stimme von Noah oder anderen + - KI-Video mit Noahs Gesicht + - realistisch wirkende KI-Szenen aus Betrieb oder Baustelle + - KI-Personen, die wie echte Kunden oder Monteure aussehen +- **Leichter Hinweis reicht vermutlich:** klar überdrehte, satirische Szenen. Ein kurzer Hinweis wie „KI-Szene“ am Anfang. +- **Nie mit KI:** Kundenstimmen oder Testimonials. Das wäre irreführend, egal ob gekennzeichnet oder nicht. +- Eine einfache Hausregel wäre: Alles, was echt aussehen könnte und mit KI gemacht ist, bekommt das Meta-Label und einen Hinweis im Bild. + +--- + +## 5. Risiken und Gegenmittel + +### 5.1 Abhängigkeit von einer Person + +**Die Risiken (Einschätzung):** +- **Zeit:** Noah führt zwei Firmen. Tägliche Reels kosten Zeit. Wenn der Betrieb brennt, stoppt der Funnel. +- **Besitz:** Das Instagram-Konto gehört Noah. Follower, DMs und ManyChat-Kontakte liegen dort. HiveGrid hat darauf keinen Zugriff, wenn sich etwas ändert. +- **Fehltritt:** Ein missglückter Witz, ein politischer Kommentar, ein Streit in den Kommentaren. Bei einer Personal Brand trifft das sofort auch die Firma. +- **Plattform:** Ein gesperrtes Konto oder ein geänderter Algorithmus trifft Noah und HiveGrid zugleich. + +**Gegenmittel (Einschätzung):** +- **Kontakte in eigene Kanäle holen.** Jeder Lead soll schnell im Newsletter und im Vertriebs-CRM von HiveGrid landen. Dort gehört er HiveGrid, nicht der Plattform. +- **Schriftlich klären, wem was gehört.** Eine kurze Vereinbarung zwischen Noah und HiveGrid: Wer verwaltet ManyChat, wem gehören die Kontakte, was passiert bei einer Pause. +- **Zweite Gesichter aufbauen.** Haris als Gesicht für Gespräche und Demos, Raffael für Technik, David für Produkt. Dazu Mitarbeitende von Geerkens, wenn sie wollen. +- **HiveGrid-Konten wachsen lassen.** Collabs bringen Noahs Publikum zu HiveGrid. Ziel ist, dass HiveGrid irgendwann auch ohne Noah gesehen wird. +- **Vorrat anlegen.** Ein Wochenpaket vorproduzieren, wie in Davids Papier. Dazu ein Puffer von zwei Wochen. + +### 5.2 Humor gegen Seriosität + +HiveGrid ist eine Software, der Betriebe Kundendaten und Abläufe anvertrauen. Laut Bitkom (01/2026) sehen 96 Prozent der Handwerksbetriebe IT-Sicherheit und Datenschutz als Hemmnis. Die größte Angst ist Kontrollverlust (Kontext 7.2). + +**Beispiele, wie andere das lösen (belegt):** +- **Mint Mobile:** Ryan Reynolds machte die Werbung mit viel Humor. Der Dienst selbst ist ein normaler Mobilfunkanbieter. Die Firma wurde 2024 von T-Mobile US gekauft. (Wikipedia) +- **Duolingo:** Die Marke lebt von schrägem Humor um die Eule Duo, etwa mit dem inszenierten „Tod“ der Eule im Februar 2025. Im April 2025 kündigte der Chef an, die Firma werde „AI-first“ und ersetze Auftragnehmer durch KI. Im Mai 2025 füllten sich die Kanäle mit wütenden Kommentaren. Duolingo nahm alle Videos auf Instagram und TikTok vom Netz. (Wikipedia) +- **Vögel Energie Bad Wärme:** Ein SHK-Betrieb mit schrägen Inhalten und knapp 125.000 Followern auf TikTok. (HERO Software Blog, 04.09.2025) + +**Was daraus folgt (Einschätzung):** +- Humor ist nicht das Problem. Das Problem entsteht, wenn Humor den **Kern des Vertrauens** berührt. Bei Duolingo war das das Thema KI und Jobs. Bei HiveGrid wären es Daten, Sicherheit, Kunden und Mitarbeitende. +- Das Muster „lustiges Gesicht, seriöse Marke“ funktioniert, wenn die Rollen getrennt sind: + - **Oben im Funnel** darf Noah lustig, überdreht und auch trashig sein. + - **Ab dem Profil von HiveGrid** wird es ruhig und konkret: Landingpage, Datenschutz, Erstgespräch, Demo. +- Aus der Recherche im Kontext gibt es eine Warnung: Die ZDH-Kampagne „Hier stimmt was nicht“ (2022) hat die Zielgruppe konfrontiert und hatte die schlechteste Resonanz seit 16 Jahren (Kontext 7.2). Humor sollte also nie wie ein Vorwurf an den Handwerker klingen. + +**Vorschlag für Leitplanken beim Humor:** + +| Geht gut | Mit Vorsicht | Lieber nicht | +|---|---|---| +| Witze über Situationen (Freitag, 17:40, Zettelchaos, Telefon klingelt) | KI-Szenen, die echt wirken (immer kennzeichnen) | Witze über Datenverlust, Hacker, „Ups, Kundendaten weg“ | +| Selbstironie von Noah als Chef | Witze über andere Softwareanbieter | Witze über Kunden, Monteure oder Azubis | +| Übertriebene Alltagsszenen, klar als Fiktion erkennbar | Politische Themen, Förderpolitik, Heizungsgesetz | Erfundene Kundenstimmen oder Zahlen | +| Handwerker-Insider, die jeder Chef kennt | Trends mit fremder Musik (Lizenz) | Alles, was wie ein Vorwurf an die Zielgruppe klingt | + +### 5.3 Weitere Risiken + +- **Falsches Publikum.** Reels über Handwerk ziehen schnell Azubis, Endkunden und andere Creator an (siehe Schultheis). *Gegenmittel:* Themen aus Sicht des Chefs, Einstieg mit Chef-Problemen, Einladungen nur an Betriebe. +- **Versprechen, die das Produkt nicht hält.** Siehe 2.5 und Kontext 9.7. +- **Mitarbeitende im Bild.** Wer Mitarbeitende von Geerkens filmt, braucht deren Einwilligung. *Einschätzung, vom Anwalt bestätigen lassen.* +- **Rolle als Kunde wird unglaubwürdig,** wenn nur Erfolge gezeigt werden. *Gegenmittel:* Probleme zeigen. +- **Zu viel HiveGrid auf Noahs Konto.** Wenn jedes Reel Werbung ist, verliert Noah das, was ihn sehenswert macht. + +--- + +## 6. Konkrete Ideen + +### 6.1 Fünfzehn Content-Ideen für Noah + +Funnel-Stufen: **oben** = Reel und Profil, **Mitte** = Stichwort, Lead-Magnet, Newsletter, **unten** = Erstgespräch und Demo. + +| Nr. | Idee | Ablauf | Kanal | Stufe | +|---|---|---|---|---| +| 1 | **Umstellungstagebuch Geerkens** | Ab dem Start bei Geerkens jede Woche ein kurzes Reel: was umgestellt wurde, was gehakt hat, was das Büro sagt. Ab Folge 3 gibt es die Zusammenfassung per Stichwort TAGEBUCH. | Noah Instagram, LinkedIn als Text mit Foto | oben bis Mitte | +| 2 | **Ein Tag als Chef in 60 Sekunden** | Noah filmt einen echten Tag in kurzen Schnitten: Anrufe, Baustelle, Angebote am Abend. Am Ende ein Satz, was ihn heute am meisten Zeit gekostet hat. | Noah Instagram, HiveGrid TikTok als Ausschnitt | oben | +| 3 | **Vierte Generation** | Noah zeigt alte Auftragsbücher, Karteikarten oder Fotos aus dem Betrieb und erzählt, was sich seit dem Urgroßvater geändert hat und was nicht. Hinweis: Als Thema für die HiveGrid-Marke wurde Nachfolge nicht gewählt (F12). Für Noahs eigenes Konto passt es als persönliche Geschichte. | Noah Instagram, LinkedIn | oben | +| 4 | **„Warum ich unser Branchenprogramm behalte“** | Meinungsreel: Noah erklärt, warum ein Wechsel mit Jahrzehnten an Stammdaten keine Option war. HiveGrid kommt erst im letzten Satz: „Darum haben wir HiveGrid gebaut.“ | Noah Instagram, LinkedIn | oben bis Mitte | +| 5 | **Fehler der Woche** | Ein Fehler aus dem Betrieb oder aus dem Bau von HiveGrid. Was er gekostet hat, was Noah heute anders macht. | Noah Instagram, LinkedIn | oben | +| 6 | **Chef antwortet** | Noah antwortet per Video auf echte Kommentare wie „Software ist nur was für Große“ oder „Wer soll das alles pflegen?“. | Noah Instagram, HiveGrid TikTok | Mitte | +| 7 | **17 Übergaben** | Noah zeichnet am Whiteboard den Wärmepumpenauftrag mit 10 Phasen und 17 Übergaben und zeigt, wo Informationen verloren gehen. Stichwort ABLAUF bringt die Vorlage als PDF. | Noah Instagram | Mitte | +| 8 | **Was ich vor einem Softwarekauf fragen würde** | Fünf Fragen aus Sicht eines Chefs: Daten, Ausstieg, wer pflegt, Kosten der Schnittstelle, wer hilft bei Problemen. Ehrlich, auch wenn eine Frage für HiveGrid unbequem ist. Stichwort CHECKLISTE. | Noah Instagram, LinkedIn als Karussell | Mitte | +| 9 | **Automatisierung ohne Angst** | Noah lässt eine Automation im Probelauf laufen und zeigt, wie man sie rückgängig macht und wer freigibt. Das Thema hat das Team in F12 gewählt. Nur zeigen, was in Produktion stabil läuft. | Noah Instagram, danach Collab mit HiveGrid | Mitte bis unten | +| 10 | **Mein Büro testet** | Mitarbeitende von Geerkens probieren eine Funktion zum ersten Mal. Noah zeigt die echte Reaktion. Nur mit Einwilligung. | Noah Instagram | Mitte | +| 11 | **Chef-Mythen** | Humorformat: „Was Leute denken, was ein Chef den ganzen Tag macht“ gegen die Wirklichkeit. Gern mit KI-Szenen, klar als Fiktion erkennbar und gekennzeichnet. | Noah Instagram, HiveGrid TikTok | oben | +| 12 | **Handwerker baut Software** | Die Gründergeschichte in drei bis fünf Folgen: warum, wie Noah auf Raffael zuging, was schiefging, was noch fehlt. Die letzte Folge lädt zum Erstgespräch ein. | Noah LinkedIn und Instagram | oben bis unten | +| 13 | **Die Doppelspitze** | Noah und seine Schwester über Arbeitsteilung und Streitpunkte im Familienbetrieb. Nur, wenn sie das möchte. | Noah Instagram, LinkedIn | oben | +| 14 | **Echte Zahl der Woche** | Noah zählt eine Woche lang etwas selbst, etwa wie viele Anrufe nur Rückfragen sind, und zeigt die echte Zahl samt Methode. Keine Schätzungen. | Noah LinkedIn, Instagram | oben bis Mitte | +| 15 | **Frag den Chef (Live)** | Einmal im Monat eine Fragerunde für andere Betriebsinhaber zu Führung, Digitalisierung und Nachwuchs. Am Ende ein Hinweis auf den Newsletter. | Instagram Live oder LinkedIn | Mitte | + +### 6.2 Zehn Collab-Formate zwischen Noah und HiveGrid + +| Nr. | Format | Ablauf | Kanal | Stufe | +|---|---|---|---|---| +| 1 | **Problem von Noah, Ablauf von HiveGrid** | Noah schildert ein Problem aus dem Betrieb in 15 Sekunden. Danach zeigt ein Teammitglied am Bildschirm, wie der Ablauf in HiveGrid aussieht. | Instagram Collab-Reel, Facebook | Mitte | +| 2 | **Golden Flow der Woche** | Eine der 30 Beispiel-Automationen: Noah erklärt den Anlass aus dem Alltag, HiveGrid zeigt den Ablauf. Stichwort bringt den Flow als PDF. | Instagram Collab-Reel | Mitte | +| 3 | **Bughunting mit dem Chef** | Noah testet ein Modul vor dem Release. Das Team zeigt, wie der Fund behoben wird. Passt zu „Wir bauen das mit dem Handwerk“ (F6). | Instagram Collab-Reel, Story-Serie | oben bis Mitte | +| 4 | **Eine Woche, zwei Sichten** | Gleiche Woche der Umstellung, zwei Perspektiven: Noah als Chef bei Geerkens (was nervt), das HiveGrid-Team als Hersteller (was geändert wurde). Rollen klar benennen. | Instagram Collab-Karussell und Reel | Mitte | +| 5 | **Antwort-Reel auf Fragen** | Fragen unter Noahs Reels beantwortet HiveGrid mit einem eigenen kurzen Erklärreel und markiert Noah. | Instagram Collab-Reel | Mitte | +| 6 | **Infoslide zum Reel** | Ein bis zwei Tage nach einem starken Noah-Reel erscheint ein HiveGrid-Karussell mit den Fakten dazu, gebaut mit dem `posts`-Generator. | Instagram Collab-Karussell, LinkedIn-Seite | Mitte | +| 7 | **Handwerker trifft Entwickler** | Noah und Raffael (oder Aki) im Gespräch: Noah erklärt einen Ablauf, Raffael fragt nach, wie man ihn baut. Ausschnitte als Reels. | Instagram, LinkedIn, später YouTube | oben bis Mitte | +| 8 | **Live mit Noah und Haris** | Einmal im Monat: Noah erzählt aus dem Betrieb, Haris beantwortet Fragen zu Gespräch und Demo. Erinnerung über den Newsletter. | Instagram Live, LinkedIn | unten | +| 9 | **Kurzes Webinar „Umstellen ohne Wechsel“** | 30 Minuten: Noah erzählt die Umstellung bei Geerkens, Haris zeigt den Demo-Workspace. Die Anmeldung trägt in den Newsletter ein. Grundlage ist das fertige Webinar-Konzept (Kontext 10.4). | Webinar, Hinweis auf allen Kanälen | unten | +| 10 | **Besuch bei einem anderen Betrieb** | Noah besucht einen SHK-Betrieb aus der Region, nicht unbedingt einen Kunden, und spricht über dessen Abläufe. Collab mit dem Betrieb und HiveGrid. Später vielleicht ein Kandidat für eine echte Kundenstimme. | Instagram Collab mit drei Konten, LinkedIn | oben | + +--- + +## Was das für HiveGrid heißt + +1. **Die Zielseite zuerst.** Bevor Noahs Reels stärker auf HiveGrid zeigen, braucht es: + - die Landingpage für Noahs Bio + - ein erstes PDF + - einen Newsletter, der wirklich speichert + - das Feld „Erster Kontakt“ im CRM + - die Quellenfrage im Cal-Formular + + Sonst geht Reichweite verloren, die schon da ist. +2. **Ein Rollen-Satz für alles.** Ein fester Satz, der in Bio, Videos und Website gleich ist, etwa „SHK-Meister, Chef der Geerkens GmbH in vierter Generation, Mitgründer von HiveGrid“. Das löst auch das Problem der vier verschiedenen Titel (Kontext 9.2). +3. **Rhythmus als Test, nicht als Gesetz.** Startwert: 4 von 7 Reels ohne HiveGrid, 2 mit HiveGrid in der Geschichte, 1 mit Einladung. 1 bis 2 Collabs pro Woche. Nach vier Wochen auswerten. +4. **Das Umstellungstagebuch ist der stärkste Inhalt.** Es ist Beleg und Geschichte zugleich. Es zeigt den Bau offen, wie es das Team will (F6). Und es ersetzt die fehlenden Kundenstimmen ehrlich, bis echte da sind. +5. **ManyChat richtig aufsetzen.** Erste Nachricht mit PDF und einer Frage, Einladung erst nach Antwort, alles im Du. Klären, auf welchem Konto die Automation läuft. +6. **Leads gehören HiveGrid.** Kontakte so schnell wie möglich in Newsletter und CRM holen. Mit Noah schriftlich klären, wem die Kontakte aus seinem Konto gehören. +7. **Eine kurze Prüfung beim Anwalt** zu drei Fragen: Kennzeichnung bei Noah, Impressum auf Noahs Profil, Musik in Reels. Dazu eine einfache Hausregel für KI-Kennzeichnung. +8. **Leitplanken für Humor schriftlich festhalten.** Die Tabelle in 5.2 ist ein Entwurf. Noah sollte sie mitschreiben, nicht nur abnicken. +9. **Zweite Gesichter früh einbauen.** Haris in Live und Webinar, Raffael in „Handwerker trifft Entwickler“. So hängt nicht alles an Noah. +10. **LinkedIn über Menschen spielen.** Noah und das Team posten und kommentieren. Die Firmenseite von HiveGrid teilt und sammelt. Sie muss gepflegt aussehen, aber nicht viral gehen. +11. **Noahs Instagram in Metricool verbinden**, wenn Noah einverstanden ist. Sonst fehlt die Hälfte der Zahlen. + +--- + +## Offene Fragen an Dejan und Noah + +**Zeit und Rollen** +1. Wie viele Stunden pro Woche hat Noah realistisch für Reels, LinkedIn und Lives? Ist „täglich ein Reel“ aus Davids Plan machbar? +2. Wie will Noah in Videos auftreten: vor allem als Chef von Geerkens, als Gründer von HiveGrid oder als beides? Ist der Rollen-Satz aus „Was das für HiveGrid heißt“ für ihn stimmig? +3. Darf die Umstellung bei Geerkens öffentlich gezeigt werden, auch mit Problemen? Sind die Mitarbeitenden und Noahs Schwester einverstanden, im Bild zu sein? +4. Soll öffentlich gesagt werden, dass die Geerkens GmbH in HiveGrid investiert hat? + +**Konto und Funnel** +5. Ist Noahs Instagram ein Creator- oder Business-Konto? Welche Musik wurde bisher in den Reels verwendet? +6. Auf welchem Konto soll ManyChat laufen, auf Noahs oder auf dem von HiveGrid? Wer beantwortet die DMs: Noah selbst oder jemand aus dem Team in Noahs Namen? +7. Wem gehören die Kontakte, die über Noahs Konto entstehen? Gibt es dazu eine Absprache zwischen Noah und HiveGrid? +8. Wer baut die Landingpage `hivegrid.de/noah`? Die Website ist laut F18 zweitrangig. Reicht dafür ein Link-in-Bio-Werkzeug? +9. Welches PDF kommt zuerst: Checkliste, Wärmepumpen-Ablauf oder Golden Flows? Darf der Geerkens-Ablauf öffentlich werden? +10. Womit wird der Newsletter verschickt: mit HiveGrids eigenem E-Mail-Marketing oder einem externen Werkzeug? +11. Welches Analysewerkzeug läuft auf der Website? Werden UTM-Parameter heute ausgewertet? +12. Kam der Sprung bei den HiveGrid-Followern um den 27.09. von einem Collab mit Noah? + +**Recht und KI** +13. Wer klärt mit dem Anwalt die Linie zu Kennzeichnung, Impressum und Musik? Wessen Impressum steht auf Noahs Profil? +14. Welche KI-Werkzeuge nutzt Noah? Werden Stimme oder Gesicht von Noah mit KI erzeugt? + +**Ton und Inhalte** +15. Was ist für Noah beim Humor tabu? Passt die Tabelle in 5.2? +16. Schreibt Noah seine LinkedIn-Beiträge selbst, oder hilft jemand? Wenn jemand hilft: Wie bleibt es Noahs Stimme? +17. Wer folgt Noah heute: Chefs, Monteure, Azubis, Endkunden? Kann Noah die Zielgruppendaten aus seiner Instagram-Statistik teilen? +18. Will Noah bei den ersten Erstgesprächen kurz dabei sein (Founder-led Sales)? + +--- + +## Quellen + +**LinkedIn, Thought Leadership, Kaufverhalten** +- AuthoredUp: „How the LinkedIn Algorithm Works“, veröffentlicht 27.09.2025, aktualisiert 11.08.2026. https://authoredup.com/blog/linkedin-algorithm +- Blueberry Media: „LinkedIn personal profile vs company page: what the data says“, Juni 2026 (Zweitquelle für van der Blom). https://blueberry-media.co.uk/blog/linkedin-personal-profile-vs-company-page +- Edelman und LinkedIn: „2025 B2B Thought Leadership Impact Report“, Juli 2025. https://www.edelman.com/expertise/Business-Marketing/2025-b2b-thought-leadership-report +- ContentGrip: Zusammenfassung des Edelman-LinkedIn-Reports, 17.07.2025. https://www.contentgrip.com/edelman-linkedin-thought-leadership-report/ +- 6sense: „Buyer Experience Report 2025“, abgerufen 05.10.2026. https://6sense.com/report/buyer-experience/ +- Oktopost: „Employee advocacy statistics 2026“, 29.04.2026. https://www.oktopost.com/blog/employee-advocacy-statistics-2026/ + +**Beispiele aus Handwerk und Software** +- openHandwerk: Über uns, abgerufen 05.10.2026. https://openhandwerk.de/ueber-uns/ +- DasHandwerk.de: „openHandwerk: Aus dem Handwerk, für das Handwerk“, abgerufen 05.10.2026. https://www.dashandwerk.de/news/openhandwerk-aus-dem-handwerk-fuer-das-handwerk/ +- Handwerksblatt: „Influencer im Handwerk #014 Sina Klein“, 05.06.2024. https://www.handwerksblatt.de/themen-specials/influencer-wollen-lust-aufs-handwerk-machen-1/influencer-im-handwerk-014-sina-klein +- Craftnote: „Personal Branding im Handwerk“, 02.01.2020. https://www.craftnote.de/digitalisierung/lektion/personal-branding-im-handwerk/ +- MemoMeister: „Instagram für Handwerker“, 03.04.2024. https://memomeister.com/instagram-fuer-handwerker/ +- Deutsche Handwerks Zeitung: „Warum LinkedIn für Handwerker wichtiger wird“, 11.10.2023. https://www.deutsche-handwerks-zeitung.de/warum-linkedin-fuer-handwerker-wichtiger-wird-294580/ +- handwerk magazin: „LinkedIn: Wie Handwerksbetriebe über das Berufsnetzwerk wachsen können“, 21.02.2023. https://www.handwerk-magazin.de/linkedin-wie-handwerkschefs-ueber-das-berufsnetzwerk-wachsen-koennen-277541/ +- HERO Software Blog: „Social Media für Handwerker“, 04.09.2025. https://hero-software.de/blog/marketing/social-media-handwerker +- hessenschau: „Immer mehr Handwerker nutzen TikTok und Instagram“, 01.05.2025. https://hessenschau.de/wirtschaft/immer-mehr-handwerker-nutzen-tiktok-und-instagram-aus-followern-azubis-machen--v1,handwerksbetriebe-auf-tiktok-100.html +- Contrary Research: „ServiceTitan“, 21.12.2023. https://research.contrary.com/company/servicetitan +- USC Dornsife: „Alumnus' billion-dollar software company … inspired by his blue-collar dad“, abgerufen 05.10.2026. https://dornsife.usc.edu/news/stories/billion-dollar-company-inspired-by-blue-collar/ +- Wikipedia: ServiceTitan, abgerufen 05.10.2026. https://en.wikipedia.org/wiki/ServiceTitan +- Wikipedia: Mint Mobile, abgerufen 05.10.2026. https://en.wikipedia.org/wiki/Mint_Mobile +- Wikipedia: Duolingo, abgerufen 05.10.2026. https://en.wikipedia.org/wiki/Duolingo + +**Recht: Werbekennzeichnung und Impressum** +- § 5a UWG, gesetze-im-internet.de, abgerufen 05.10.2026. https://www.gesetze-im-internet.de/uwg_2004/__5a.html +- § 5 DDG, gesetze-im-internet.de, abgerufen 05.10.2026. https://www.gesetze-im-internet.de/ddg/__5.html +- BRAK: „Influencer: Was bezahlt wird, muss gekennzeichnet werden“, 09.09.2021. https://www.brak.de/newsroom/news/influencer-was-bezahlt-wird-muss-gekennzeichnet-werden/ +- Hogan Lovells: „Influencer-Marketing. Rechtsprechung des BGH“, 18.03.2022. https://www.hlc.com/de/publications/influencer-marketing-rechtsprechung-des-bgh +- Wettbewerbszentrale: „Leitfaden zur Kennzeichnung von werblichen Posts auf Instagram und Co.“, August 2024. https://www.wettbewerbszentrale.de/wp-content/uploads/2024/08/270824-Leitfaden-der-Wettbewerbszentrale-Werbekennzeichnung-WBZ.pdf +- Die Medienanstalten: „Leitfaden Werbekennzeichnung bei Online-Medien“, Stand Mai 2025 (über LFK). https://www.lfk.de/fileadmin/PDFs/Dokumente_und_Rechtsgrundlagen/Leitfaeden/leitfaden-medienanstalten-werbekennzeichnung-online-medien-Mai-2025.pdf +- Die Medienanstalten: Übersichtsseite zum Leitfaden, abgerufen 05.10.2026. https://www.die-medienanstalten.de/service/merkblaetter-und-leitfaeden/leitfaden-werbekennzeichnung-bei-online-medien/ +- CMS: „Influencer-Marketing: Keine Werbekennzeichnung bei klarer Eigenwerbung“ (OLG Hamburg, 21.05.2026, 15 U 99/24), 26.08.2026. https://cms.law/de/deu/legal-updates/influencer-marketing-keine-werbekennzeichnung-bei-klarer-eigenwerbung +- Rechtsanwalt Mauritz: „Instagram-Impressum: OLG Hamburg bestätigt“, 06.08.2026. https://www.ra-mauritz.de/instagram-impressum-olg-hamburg/ +- eRecht24: „Impressum auf Instagram“, 14.11.2024. https://www.e-recht24.de/impressum/13078-impressum-auf-instagram.html + +**Recht: Musik** +- Händlerbund: „Musiknutzung auf Instagram als Unternehmen“, 08.06.2026. https://www.haendlerbund.de/de/ratgeber/marketing/musiknutzung-instagram +- gruender.de: „Musik in Instagram Reels: Was müssen Unternehmen beachten?“, 30.12.2024. https://www.gruender.de/recht/musik-in-reels/ +- Soundstripe: „TikTok Music Licensing Rules for Creators and Brands“, 10.08.2026, aktualisiert 16.09.2026. https://www.soundstripe.com/blogs/tiktok-music-licensing-rules + +**Recht: KI** +- Meta: „Our Approach to Labeling AI-Generated Content and Manipulated Media“, 05.04.2024, aktualisiert 12.09.2024. https://about.fb.com/news/2024/04/metas-approach-to-labeling-ai-generated-content-and-manipulated-media/ +- EU AI Act, Art. 50, artificialintelligenceact.eu, abgerufen 05.10.2026. https://artificialintelligenceact.eu/article/50/ +- Cooley: „EU AI Act: Transparency Obligations Take Effect 2 August 2026“, 03.08.2026. https://www.cooley.com/news/insight/2026/2026-08-03-eu-ai-act-transparency-obligations-take-effect-2-august-2026 +- Goodwin: „Not Delayed, Not Deferred: EU AI Act Transparency Obligations Are Now in Force“, 03.08.2026. https://www.goodwinlaw.com/en/insights/publications/2026/08/alerts-technology-dpc-eu-ai-act-transparency-obligations-now-in-force +- Paul Weiss: „EU Finalises Transparency Rules for AI-Generated Content“, 04.08.2026. https://www.paulweiss.com/insights/client-memos/eu-finalises-transparency-rules-for-ai-generated-content +- EU-Kommission: „Code of Practice on Transparency of AI-generated Content“, abgerufen 05.10.2026. https://digital-strategy.ec.europa.eu/en/policies/code-practice-ai-generated-content +- EU-Kommission: „Guidelines on transparency obligations“, abgerufen 05.10.2026. https://digital-strategy.ec.europa.eu/en/policies/guidelines-ai-transparency-obligations + +**Technik und Messung** +- Meta for Developers: „Private Replies“ (Instagram), abgerufen 05.10.2026. https://developers.facebook.com/docs/messenger-platform/instagram/features/private-replies/ +- Google Analytics Hilfe: „URL builders: Collect campaign data with custom URLs“, abgerufen 05.10.2026. https://support.google.com/analytics/answer/10917952 + +**Intern** +- `Brainstorming Kickoff/Kontext/Kontext.md`, Stand 05.10.2026 (Abschnitte 0, 1.2, 7.2, 8, 9, 10.7, 13). +- `Brainstorming Kickoff/MarketingBrainstormingOld.md`, Davids Vorschläge vom 26.09.2026. diff --git a/Brainstorming Kickoff/Research/07-konten-einrichten.md b/Brainstorming Kickoff/Research/07-konten-einrichten.md new file mode 100644 index 0000000..f543e72 --- /dev/null +++ b/Brainstorming Kickoff/Research/07-konten-einrichten.md @@ -0,0 +1,284 @@ +# 07 Konten einrichten: Instagram, Facebook, TikTok, YouTube + +Stand: 12.10.2026. Recherche für Dejan. + +**So ist das Dokument zu lesen** + +- Aussagen mit einer Quellenangabe wie (Q12) sind belegt. Die Liste steht am Ende. +- Absätze mit **Einschätzung** sind unsere Bewertung. +- Die Hilfeseiten von Meta und Google tragen kein Datum. Abgerufen wurden alle Quellen am 12.10.2026. +- Es wurde nichts angelegt oder verbunden. + +--- + +## Kurzfassung + +1. **Facebook braucht ein persönliches Profil, aber nicht Noahs.** Seiten und Business-Portfolios legt man mit einem Facebook-Profil an (Q1, Q2). Das kann dein eigenes sein. Follower sehen nicht, wer die Seite verwaltet. +2. **Instagram hängt nicht an einem Profil, sondern an der Seite.** Verknüpft wird `hivegrid.de` mit der Facebook-Seite, und beide liegen im selben Business-Portfolio der HiveGrid GmbH (Q10). Noahs Privatprofil muss dafür nicht im Spiel sein. +3. **Das eigentliche Problem ist Noahs Kontenübersicht.** Seit Anfang 2026 können sich alle Konten derselben Kontenübersicht gegenseitig einloggen (Q13). Hängt `hivegrid.de` dort, öffnet das Instagram-Passwort auch Noahs private Konten. Vor allem anderen sollte `hivegrid.de` dort raus. Follower und Beiträge bleiben dabei erhalten (Q14). +4. **Der Instagram-Teil geht nur mit Noahs Zugang.** Nur er hat die Instagram-Zugangsdaten. Danach kannst du alles Weitere selbst machen. +5. **Metricool: Die Marke ist schon mit dir geteilt.** Laut Metricool-MCP gehört die Marke „HiveGrid“ dem Konto `marketing@geerkens.de` und ist mit dir als Manager geteilt, mit vollen Rechten fürs Planen und Veröffentlichen. Teilen geht laut Metricool nur, wenn das Eigentümerkonto Advanced oder Custom hat (Q21, Q30). Free und Starter haben nur einen Login. **Deshalb nicht auf Starter wechseln,** sonst endet dein Zugang. Den genauen Tarif sieht nur der Login `marketing@geerkens.de`. +6. **TikTok und YouTube kannst du allein anlegen**, am besten mit einer gemeinsamen Firmenadresse wie `social@hivegrid.de` statt einer privaten. + +--- + +## 1. Instagram und Facebook + +### 1.1 Persönliches Profil + +- Eine Seite legt man mit einem Facebook-Konto an (Q1). +- Ein Business-Portfolio entsteht nur mit einem Facebook-Profil oder einem „Managed Meta Account“. Diese Konten gibt es nicht für alle Organisationen, und sie lassen sich nur per Einladung aktivieren (Q2, Q3). +- Die Nutzungsbedingungen erlauben ein Konto pro Person, mit echtem Namen, ohne geteiltes Passwort (Q5). +- Metricool verbindet nur Seiten, die von einem persönlichen Profil verwaltet werden (Q4). + +**Einschätzung:** +- Kein Profil „HiveGrid“ anlegen. Das verstößt gegen die Bedingungen und wird oft gesperrt. +- Dein eigenes Profil reicht. Es sollte echt und schon älter sein und mit Zwei-Faktor gesichert. Neue Profile, die sofort ein Portfolio und eine Seite anlegen, landen öfter in einer Prüfung. + +### 1.2 Business-Portfolio + +- Angelegt wird es unter business.facebook.com, mit dem öffentlichen Firmennamen und einer geschäftlichen E-Mail (Q2). +- Jede Person kann höchstens 2 Portfolios selbst anlegen (Q2). +- Einen „Eigentümer“ gibt es nicht. Es gibt Personen mit voller Kontrolle (Q6). +- Seiten und Instagram-Konten kommen als Assets hinein. Jedes Asset gehört zu genau einem Portfolio. Für Instagram braucht man dabei Nutzername, Passwort und den Zwei-Faktor-Code (Q7, Q27). +- **Wichtig:** Wird ein Instagram-Konto auf professionell umgestellt, legt Meta automatisch ein Portfolio dafür an (Q9, Q35). `hivegrid.de` liegt also wahrscheinlich schon in einem Portfolio. Das kann Noahs sein. +- Eine Seite gehört der Firma erst, wenn sie im Portfolio liegt (Q7). +- Hat niemand mehr volle Kontrolle über eine Seite, wird sie deaktiviert und zur Löschung vorgesehen (Q25). +- Meta empfiehlt mehr als eine Person mit voller Kontrolle. Zwei-Faktor ist für Portfolios Pflicht (Q8). + +### 1.3 Instagram mit der Seite verknüpfen + +- Voraussetzungen: ein professionelles Instagram-Konto, volle Kontrolle über die Seite und beide im selben Portfolio (Q10). +- Es gibt zwei Wege: + - in der Instagram-App unter Profil bearbeiten > Seite > Verbinden + - auf Facebook als Seite unter Einstellungen > Verknüpfte Konten > Instagram +- In beiden Fällen braucht man den Instagram-Login (Q10, Q11). +- Danach können alle, die Zugriff auf die Seite haben, auch Instagram verwalten. Postfach und Werbung laufen zusammen (Q12). + +**Einschätzung:** Follower, Beiträge, Nutzername und Passwort von `hivegrid.de` bleiben gleich. Es ändert sich nur, wer das Konto verwalten kann. + +### 1.4 Kontenübersicht + +- Seit Anfang 2026 können sich alle Konten derselben Kontenübersicht standardmäßig gegenseitig einloggen (Q13, Q36). +- Wer ein Konto herauslöst, braucht vorher ein eigenes Passwort dafür (Q13). +- Ein entferntes Konto bekommt eine eigene Kontenübersicht und wird nicht gelöscht (Q14). +- Seit April 2026 wird die Kontenübersicht nach und nach zum „Meta-Konto“ (Q15). +- Für die Verknüpfung mit der Seite ist die Kontenübersicht keine Voraussetzung (Q10). +- Nur das Instagram-eigene „Auf Facebook teilen“ braucht ein Facebook-Konto in derselben Kontenübersicht (Q16). + +**Einschätzung:** +- Solange `hivegrid.de` in Noahs Kontenübersicht hängt, solltest du das Instagram-Passwort nicht nutzen. +- Sperren treffen in der Praxis oft auch verknüpfte Konten. Offiziell belegt ist das nicht. +- `hivegrid.de` herauszulösen ist sinnvoll. Es in deine Kontenübersicht zu verschieben, ist es nicht. + +### 1.5 Doppelposts vermeiden + +- Instagram kann Beiträge, Reels und Stories automatisch auf die Seite teilen (Q16, Q22). +- Metricool kann ein Reel in einem Entwurf auf Instagram und Facebook zugleich veröffentlichen. Auf Facebook darf ein Reel höchstens 90 Sekunden lang sein (Q20). + +**Einschätzung:** +- Nur einen Weg nutzen: Metricool auf beide Netzwerke, das automatische Teilen in Instagram ausschalten. +- Nicht dokumentiert ist, ob Instagram über Metricool veröffentlichte Reels trotzdem teilt. Beim ersten Reel nachsehen. + +### 1.6 Facebook-Seite in Deutschland + +- Das Impressum (§ 5 DDG) gilt auch für gewerbliche Facebook-Seiten. Es muss mit höchstens zwei Klicks erreichbar sein (Q23). +- Facebook hat dafür ein eigenes Feld unter Info > „Infos zu Datenschutz und Rechtlichem“ > Impressum, als Text oder Link (Q24). +- Wer eine Seite betreibt, ist für die Seiten-Statistik mit Meta gemeinsam verantwortlich. Deshalb gehört auch ein Link auf die Datenschutzhinweise dazu (Q23). + +**Einschätzung:** Mindestens nötig sind Name, Kategorie „Software“, Logo, Titelbild, ein Satz Beschreibung, Website, die Links zu Impressum und Datenschutz und ein Nutzername. + +--- + +## 2. Metricool + +- **Instagram über Facebook:** volle Statistik mit Stories, Wettbewerbern und Collabs (Q17). +- **Instagram über Instagram-Login:** Veröffentlichen geht, aber nur Basiswerte, keine Wettbewerber und keine Collabs (Q17). +- **Wechsel der Verbindungsart:** Jede Verbindungsart hat ihre eigene Historie. Follower- und Story-Daten werden nur aufgezeichnet, solange die jeweilige Verbindung besteht. Hin- und Herwechseln hinterlässt Lücken (Q17). +- **Facebook verbinden** kann nur ein persönliches Profil mit voller Kontrolle über die Seite. Instagram muss im selben Portfolio liegen. Verliert das Profil die Rechte, bricht die Verbindung ab (Q4, Q18). +- **Veröffentlichen:** Reels und Stories gehen auf beiden Wegen automatisch. Stories brauchen ein Business-Konto, nicht Creator (Q19). +- **Team:** Free und Starter haben einen einzigen Login. Weitere Nutzer gibt es erst in Advanced und Custom (Q30). Eine Marke teilen kann nur ein Konto mit einem dieser Tarife (Q21). +- **Stand bei uns (Metricool-MCP, 12.10.2026):** Die Marke „HiveGrid“ gehört `marketing@geerkens.de` und ist mit dir geteilt. Deine Rolle ist Manager: planen, veröffentlichen, freigeben, Marke bearbeiten. Team und Rollen verwalten kannst du nicht. Verbunden ist nur Instagram (`hivegrid.de`). Den Tarif zeigt der MCP nicht. +- **Marke übertragen:** Eine Marke kann auf ein anderes Konto umziehen, wenn das Zielkonto einen bezahlten Tarif hat. Alle Daten ziehen mit: Statistik, geplante Beiträge, Postfach. Das Abo zieht nicht mit (Q21). + +**Einschätzung zur Marke unter `marketing@geerkens.de`:** Weil die Marke schon geteilt ist, läuft das Konto sehr wahrscheinlich auf Advanced oder in einer Testphase davon. Dann passt es so, solange der Tarif bleibt. Nur falls es doch ein kleinerer Tarif oder eine auslaufende Testphase ist, gibt es diese Wege: + +| Weg | Vorteil | Nachteil | +|---|---|---| +| Ein gemeinsamer Login für `marketing@geerkens.de` | sofort, keine Kosten | Die HiveGrid-Marke liegt im Konto einer anderen Firma, mit geteiltem Passwort | +| Marke auf ein HiveGrid-Konto mit Starter übertragen | gehört HiveGrid, eigener Login, alle Daten ziehen mit | ein eigenes Abo für HiveGrid | +| Advanced im bisherigen Konto | echte Nutzerverwaltung | deutlich teurer als Starter | + +**Einschätzung zur Instagram-Verbindung:** Sobald die Seite steht, Instagram in Metricool auf „über Facebook“ umstellen. Je früher, desto kürzer die Historie, die zurückbleibt. Die Wettbewerber-Auswertung, die wir vorhaben, geht nur so. + +--- + +## 3. TikTok + +- **Kontoart:** Business-Konten sehen nur die Commercial Music Library (Q31). Diese Musik darf nur auf TikTok genutzt werden (Q32). +- **Drei Stufen seit 2026** (Q33): + - **Allgemeines Konto:** ohne Business Suite. + - **Advanced Access:** nach Verknüpfung mit dem Business Center. Analysen und ein Post-Planer kommen dazu. Firmendaten und Bio-Link sind noch nicht öffentlich. + - **Verified Business Account:** nach der Verifizierung mit Gewerbenachweis, meist 1 bis 5 Werktage (Q34). Dann sind Bio-Link und Kontaktdaten öffentlich. +- **Mehrere Verwalter:** Im Business Center hat jedes Mitglied einen eigenen Login, als Admin oder Standard. Das Konto wird per QR-Code zur Verwaltung verknüpft (Q37, Q38). +- **Organization Account:** gehört der Firma und hat nur Einmal-Codes statt Passwort. Er braucht ein verifiziertes Business Center, und allgemeine Musik fällt weg (Q39, Q40). Ob Metricool damit funktioniert, ist nirgends beschrieben. +- **Metricool:** Die Verbindung läuft über den TikTok-Login. Metricool veröffentlicht direkt oder schickt eine Erinnerung (Q41, Q42). + - Videos von 3 Sekunden bis 10 Minuten. + - Musik nur aus den Trend-Songs der Business-Bibliothek. + - Keine Zeilenumbrüche in der Bildunterschrift. +- **Reposts:** Wiederverwendete Inhalte mit fremdem Wasserzeichen kommen nicht in den Für-dich-Feed (Q43). Geschützte Musik kann TikTok stummschalten (Q44). +- **Wichtig:** Wer den Kontotyp wechselt, nachdem Metricool verbunden ist, kann Daten verlieren (Q41). + +**Einschätzung:** +- Business-Konto mit `social@hivegrid.de` anlegen und sofort auf Business stellen. +- Verifizieren, bevor der erste Beitrag kommt. Erst dann ist der Link zum Impressum in der Bio klickbar. +- Immer die Originaldatei aus dem Schnitt hochladen und die Instagram-Musik nicht mitnehmen. + +--- + +## 4. YouTube + +- **Kanal für eine Firma:** Ein persönlicher Kanal hat nur eine verwaltende Person. „Kanal mit Unternehmensnamen“ legt einen Brand Account an, der mehrere Verwalter haben kann (Q45, Q46). +- **Zugriff für zwei Personen:** Google empfiehlt dafür heute die Kanalberechtigungen in YouTube Studio. Es gibt Rollen wie Manager, Editor und Viewer, und eine Einladung gilt 30 Tage (Q47, Q48). +- **Eigentümer:** Über Kanalberechtigungen lässt sich die Eigentümerschaft nicht übertragen. Das geht nur im Brand Account, und die neue Person muss vorher 7 Tage Owner sein (Q46, Q48). +- **Löschung:** Wird das Konto des primären Owners gelöscht, ist auch der Kanal weg (Q46). +- **Firmen-Mail:** Ein Google-Konto lässt sich mit einer vorhandenen Firmenadresse anlegen, ohne Gmail (Q49). +- **Verifizierung:** Mit der Telefonnummer werden eigene Thumbnails freigeschaltet. Eine Nummer reicht für höchstens 2 Kanäle im Jahr (Q50). +- **Links:** In Shorts-Beschreibungen sind Links nicht klickbar, im Kanalprofil schon (Q51). +- **Metricool:** Verbinden kann nur ein Owner, nicht Manager oder Editor (Q52). Shorts werden direkt veröffentlicht und sollten unter 2:59 bleiben (Q53). YouTube ist im Starter-Tarif enthalten (Q30). + +**Einschätzung:** Das Google-Konto mit `social@hivegrid.de` wird primärer Owner. Du und Noah bekommt Zugriff als Manager. Metricool verbindest du mit dem Owner-Konto. + +--- + +## 5. Für alle Konten + +**Einschätzung:** +- **Eine gemeinsame Adresse** wie `social@hivegrid.de` als Gruppenpostfach, das bei euch beiden ankommt. +- **Eine Firmennummer**, zum Beispiel eine eSIM, für Verifizierung und Zwei-Faktor. Keine privaten Nummern. +- **Ein Passwortmanager mit geteiltem Tresor** für Passwörter, Zwei-Faktor-Codes und Backup-Codes. +- **Zwei-Faktor überall,** bei Google mit Passkey und Backup-Codes. +- **Für persönliche Rollen** (Facebook-Portfolio, YouTube-Manager, TikTok Business Center) nimmt jede Person die eigene Firmenadresse. +- **Nicht zu oft von vielen Geräten** einloggen. Das löst bei den Plattformen Prüfungen aus (Q54). + +--- + +## 6. Reihenfolge + +Was nur mit Noahs Zugang geht, ist markiert. + +**Vorbereitung** +1. `social@hivegrid.de`, Firmennummer und Passwortmanager einrichten. + +**Instagram aufräumen** (geht nur mit Noahs Instagram-Zugang) + +2. Bei `hivegrid.de` nachsehen, welche Konten in der Kontenübersicht hängen und in welchem Portfolio das Konto liegt. +3. Ein eigenes Passwort und Zwei-Faktor für `hivegrid.de` setzen, beides in den Passwortmanager. +4. `hivegrid.de` aus Noahs Kontenübersicht entfernen. Ist es ein Creator-Konto, auf Business umstellen. + +**Facebook** + +5. Zwei-Faktor auf deinem eigenen Facebook-Profil einschalten. +6. Business-Portfolio „HiveGrid GmbH“ anlegen. Dass du es anlegst und nicht Noah, lässt Noahs Limit von 2 Portfolios frei. +7. Die Seite direkt im Portfolio anlegen. Impressum, Datenschutz, Kategorie und Bilder eintragen. +8. Noah mit voller Kontrolle einladen. Er muss die Einladung annehmen. +9. `hivegrid.de` ins Portfolio holen. Liegt es im automatisch angelegten Portfolio, vorher dort entfernen. Dafür braucht es den Instagram-Login. +10. Instagram mit der Seite verknüpfen. Bietet Meta an, Konten zur Kontenübersicht hinzuzufügen, ablehnen. + +**Metricool** + +11. Klären, wem die Marke gehört (Abschnitt 2). +12. Facebook-Seite verbinden und Instagram auf „über Facebook“ umstellen. +13. Das Teilen nach Facebook in Instagram ausschalten. Reels laufen über Metricool auf beide. + +**TikTok** + +14. Konto mit `social@hivegrid.de` anlegen, Handle sichern, auf Business stellen, Zwei-Faktor an. +15. Business Center anlegen, euch beide als Mitglieder einladen, das Konto verknüpfen. +16. Mit den Handelsregisterdaten verifizieren. Danach Impressum und Link in die Bio. +17. In Metricool verbinden, ersten Test-Post auf „Nur ich“. + +**YouTube** + +18. Google-Konto mit `social@hivegrid.de` anlegen, Passkey und Backup-Codes einrichten. +19. „Kanal mit Unternehmensnamen“ erstellen, Handle sichern, Telefonnummer verifizieren. +20. In der Kanalinfo den Link „Impressum“ setzen. Euch beide als Manager einladen. +21. Metricool mit dem Owner-Konto verbinden, ersten Test-Short auf „Privat“. + +**Vermeiden** +- ein Facebook-Profil „HiveGrid“ +- das Instagram-Passwort nutzen, solange `hivegrid.de` in Noahs Kontenübersicht hängt +- eine Seite außerhalb des Portfolios +- nur eine Person mit voller Kontrolle +- Instagram-Teilen und Metricool gleichzeitig +- in Metricool die Verbindungsart hin und her wechseln +- den TikTok-Kontotyp ändern, nachdem Metricool verbunden ist +- Instagram-Downloads oder Instagram-Musik auf TikTok und YouTube + +--- + +## 7. Offen + +- Welcher Metricool-Tarif genau gebucht ist und ob es eine Testphase ist. Das sieht nur der Login `marketing@geerkens.de`. +- Ob Metricool mit einem TikTok Organization Account funktioniert. +- Metricool schreibt, die Owner-Rolle lasse sich in YouTube Studio vergeben (Q55). Google nennt sie nicht als einladbar (Q48). Im Zweifel gilt Google. + +--- + +## Quellen + +Abgerufen am 12.10.2026. + +- Q1 Facebook-Hilfe, Seite erstellen: https://www.facebook.com/help/104002523024878 +- Q2 Meta Business-Hilfe, Business-Portfolio erstellen: https://www.facebook.com/business/help/1710077379203657 +- Q3 Managed Meta Account: https://www.facebook.com/business/help/254380730403954 und https://www.facebook.com/business/help/778688844648855 +- Q4 Metricool, Facebook lässt sich nicht verbinden: https://help.metricool.com/en/article/i-cant-connect-facebook-1aj4rmr/ +- Q5 Facebook-Nutzungsbedingungen 3.1 (gültig ab 01.01.2025): https://www.facebook.com/terms.php +- Q6 Portfolio-Berechtigungen: https://www.facebook.com/business/help/442345745885606 +- Q7 Seite zum Portfolio hinzufügen: https://www.facebook.com/business/help/720478807965744 +- Q8 Security Center: https://www.facebook.com/business/help/216940652189296 +- Q9 Portfolios und professionelle Instagram-Konten: https://www.facebook.com/business/help/1716703571964355 +- Q10 Instagram und Seite verbinden (Business-Hilfe): https://www.facebook.com/business/help/connect-instgram-to-page +- Q11 Instagram und Seite verbinden (Facebook-Hilfe): https://www.facebook.com/help/1148909221857370 +- Q12 Instagram-Hilfe, Vorteile der Verknüpfung: https://help.instagram.com/402748553849926 +- Q13 Anmelden bei Konten in derselben Kontenübersicht: https://www.facebook.com/help/1026219344754266 +- Q14 Konten zur Kontenübersicht hinzufügen und entfernen: https://www.facebook.com/help/213446087365127 und https://www.meta.com/help/accounts-center/add-remove-accounts-accounts-center/ +- Q15 Meta Newsroom, Meta Account (23.04.2026): https://about.fb.com/news/2026/04/meta-account/ +- Q16 Instagram-Hilfe, Reels nach Facebook teilen: https://help.instagram.com/1206864193634431 +- Q17 Metricool, Verbindungsarten für Instagram: https://help.metricool.com/en/article/access-to-instagram-from-metricool-connection-types-and-differences-5xpqgi/ +- Q18 Metricool, Berechtigungen im Meta Business Manager: https://help.metricool.com/meta-business-manager-permissions-z266r +- Q19 Metricool, auf Instagram planen: https://help.metricool.com/schedule-and-post-on-instagram-6b6q5 +- Q20 Metricool, auf Facebook planen und Multiposting: https://help.metricool.com/schedule-and-publish-on-facebook-ycu1b und https://help.metricool.com/multiposting-edit-per-social-network-85out +- Q21 Metricool, Marken teilen und übertragen: https://help.metricool.com/sharing-and-transferring-brands-on-metricool-5sdxu +- Q22 Instagram-Hilfe, auf eine Facebook-Seite teilen: https://help.instagram.com/356902681064399 +- Q23 Datenschutzkanzlei, Informationspflichten auf Social-Media-Seiten (12.02.2026): https://www.datenschutzkanzlei.de/informationspflichten-auf-social-media-seiten/ +- Q24 e-recht24, Facebook-Impressum: https://www.e-recht24.de/artikel/facebook/6896-facebook-impressum-generator.html +- Q25 Seitenzugriff: https://www.facebook.com/help/289207354498410 und https://www.facebook.com/business/help/582754542592549 +- Q26 Personen zum Portfolio hinzufügen: https://www.facebook.com/business/help/2169003770027706 +- Q27 Instagram zum Portfolio hinzufügen: https://www.facebook.com/business/help/1125825714110549 +- Q30 Metricool, Nutzerverwaltung und Tarife: https://help.metricool.com/user-management-team-roles-and-permissions-in-metricool-ovjqe und https://metricool.com/pricing/ +- Q31 TikTok, Commercial Music Library (Juli 2026): https://ads.tiktok.com/resources/help/article/how-to-use-the-commercial-music-library +- Q32 TikTok, Nutzungsbedingungen der Commercial Music Library: https://www.tiktok.com/legal/page/global/commercial-music-library-user-terms/en +- Q33 TikTok, Account Entitlements (Mai 2026): https://ads.tiktok.com/help/article/about-tiktok-account-entitlements +- Q34 TikTok, Business-Verifizierung (Mai 2026): https://ads.tiktok.com/help/article/how-to-register-a-business-account +- Q35 Leadsie, Instagram auf professionell umstellen: https://www.leadsie.com/blog/change-instagram-personal-to-professional-account +- Q36 Meta-Hilfe, verbundene Erlebnisse in der Kontenübersicht: https://www.meta.com/help/accounts-center/2862196384090214/ +- Q37 TikTok, Mitglieder im Business Center: https://ads.tiktok.com/resources/help/article/add-users-tiktok-business-center +- Q38 TikTok, Konto zur Verwaltung verknüpfen (März 2026): https://ads.tiktok.com/resources/help/article/how-to-integrate-your-business-account-with-business-center +- Q39 TikTok, Organization Accounts (Sept. 2026): https://ads.tiktok.com/help/article/about-organization-accounts +- Q40 TikTok, nicht verfügbare Funktionen für Organization Accounts (Juni 2026): https://ads.tiktok.com/help/article/list-of-unavailable-features-for-organization-accounts +- Q41 Metricool, TikTok verbinden: https://help.metricool.com/how-to-connect-tiktok-to-metricool-0ea7e +- Q42 Metricool, auf TikTok planen: https://help.metricool.com/schedule-and-post-on-tiktok-bkepi +- Q43 TikTok, Standards für den Für-dich-Feed: https://www.tiktok.com/community-guidelines/en/fyf-standards +- Q44 Metricool, TikTok ohne Ton: https://help.metricool.com/why-was-my-tiktok-video-posted-without-sound-ao9cw +- Q45 YouTube, Kanal erstellen: https://support.google.com/youtube/answer/1646861 +- Q46 YouTube, Owner und Manager im Brand Account: https://support.google.com/youtube/answer/4628007 +- Q47 YouTube, Umstellung auf Kanalberechtigungen: https://support.google.com/youtube/answer/9367690 +- Q48 YouTube, Kanalberechtigungen: https://support.google.com/youtube/answer/9481328 +- Q49 Google, Konto erstellen: https://support.google.com/accounts/answer/27441 +- Q50 YouTube, Konto verifizieren: https://support.google.com/youtube/answer/171664 +- Q51 YouTube, Links: https://support.google.com/youtube/answer/13748639 +- Q52 Metricool, YouTube verbinden: https://help.metricool.com/how-to-connect-youtube-to-metricool-tqiwo +- Q53 Metricool, auf YouTube planen: https://help.metricool.com/schedule-and-publish-on-youtube-gof0k +- Q54 Metricool, Trennungen vermeiden: https://help.metricool.com/en/article/best-practices-to-minimize-disconnections-on-social-networks-1fmoqe +- Q55 Metricool, YouTube-Berechtigungen: https://help.metricool.com/en/article/youtube-channel-permissions-szvlla/ diff --git a/Brainstorming Kickoff/Strategie/Content-Strategie.md b/Brainstorming Kickoff/Strategie/Content-Strategie.md new file mode 100644 index 0000000..3984100 --- /dev/null +++ b/Brainstorming Kickoff/Strategie/Content-Strategie.md @@ -0,0 +1,515 @@ +# HiveGrid: Content- und Marketingstrategie + +**Status:** Entwurf 4, Stand 09.10.2026. Hintergrund zu `Redaktionsplan.md` und `Roadmap.md`. Wird im Brainstorming mit Dejan geschärft, danach an Noah und David. +**Für:** Noah Geerkens (Prüfung und Freigabe), David (Abstimmung) +**Von:** Dejan Cosic + +**Lesehilfe:** +- **[entschieden]** steht so in Dejans Antworten (`../Kontext/Kontext.md`, Abschnitt 13). +- **[Vorschlag]** ist ein Entwurf und muss noch bestätigt werden. + +> **Vorgaben für das fertige Dokument** (Dejan, 05.10.2026) +> - **Formate:** Markdown, PDF und HTML. Alle drei gehen mit dem ganzen Ordner an Noah. +> - **Pflichtteile:** +> 1. Übersicht +> 2. Kanäle und ihre Postarten +> 3. Formate +> 4. Ein konkreter **Redaktionsplan** über alle Kanäle, mit genauem Datum, welcher Post wann wo erscheint +> - **Ebene:** Slots aus Datum, Kanal, Format und Quelle. Keine Skripte, keine fertigen Post-Themen, den Inhalt füllt Dejan. +> - **Start am 12.10.2026, leicht anfangen.** Aufwendige Formate wie anspruchsvolle Reels kommen erst später. Bis dahin ist Dejans Zeit noch zwischen Bughunting und Customer Success geteilt. +> - **Frequenz je Kanal** aus der Kapazität rechnen (Dejan rund 30 Stunden, David rund 10 Stunden pro Woche). Mit dem Vorbehalt, dass sich manches wiederverwerten lässt, aber nicht alles. +> - **Roadmap:** fehlende Kanäle anlegen, weitere Kanäle wie E-Mail-Marketing einführen, mit Werkzeugen, Ressourcen und Recht. + +--- + +## 0. Auf einer Seite + +### Ziel + +- **Für die nächsten 3 bis 6 Monate** [entschieden]: + - Erstgespräche und Demos + - Sichtbarkeit und Vertrauen + - erste zahlende Kunden +- **Nordstern** [entschieden, F27]: **qualifizierte Erstgespräche pro Monat, die über Marketing kamen.** Gemessen über die Frage „Wie bist du auf uns gekommen?“ in Cal und im Erstgespräch. + +### Die Strategie in drei Sätzen + +1. **Noah holt die Aufmerksamkeit.** Mit der eigenen Person, Chef-Sicht und Humor auf den eigenen Kanälen. +2. **Meister & Nerds:** Handwerk trifft Tech (Konzept Noah, 09.10.). Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Das Produkt kommt nur nebenbei, keine Funktionsliste. +3. **Jeder Kanal führt auf einen einfachen Weg zum Erstgespräch.** Das ist der Link in der Bio, später auch ein Stichwort per DM, ab 2027 der Newsletter. + +### Kanäle auf einen Blick + +| Kanal | Rolle | Ab 16.10. | Ab Dezember | +|---|---|---|---| +| Instagram HiveGrid | Hauptkanal | 3 Beiträge pro Woche | 4 bis 5 | +| Facebook HiveGrid | Spiegel von Instagram | automatisch | automatisch | +| TikTok HiveGrid | Zweitverwertung der Reels, Test bis 04.12. | jedes Reel | jedes Reel | +| YouTube | Shorts als Zweitverwertung (Test ab 09.11.), Tutorials von David | | Tutorials, wenn sie kommen | +| LinkedIn HiveGrid-Seite | Text und Bild, Vertrauen, Branche, Partner | 2 pro Woche | 3 | +| Noah, Instagram und LinkedIn | Top of Funnel, eigene Produktion | Collabs, wenn Noah sie liefert | wie bisher | +| Newsletter | Kontakt halten, Weg zum Gespräch | zurückgestellt | Aufbau frühestens Q1 2027 | + +### Die nächsten Wochen + +- **Diese Woche (KW 41):** fehlende Kanäle anlegen, Metricool, Bios und Impressum. Siehe `Roadmap.md`, Paket A. +- **Ab Mo 12.10.:** Die Produktion startet. **Der erste Beitrag erscheint am Fr 16.10.**, einer der beiden fertigen Infoposts. Danach wird immer eine Woche im Voraus produziert. +- **Bis 08.11.:** Phase 1 mit leichten Formaten, Instagram dreimal, LinkedIn zweimal pro Woche. Siehe `Redaktionsplan.md`. +- **Flex-Slots:** Collabs mit Noah, „Pilotkunde vorher/nachher“ (frühestens Ende November) und Davids Tutorials erscheinen, wenn sie fertig sind. + +### Was wir von Noah brauchen + +| Was | Warum | Kosten oder Aufwand | Stand | +|---|---|---|---| +| **Metricool Starter** buchen | Ohne Starter gibt es kein LinkedIn, nur 20 geplante Beiträge im Monat und nur eine Marke. Details in 13.2. | 16 € netto im Monat bei Jahreszahlung (192 € im Jahr) oder rund 20 € netto bei Monatszahlung | offen. **Die Marke HiveGrid liegt im Metricool-Konto `marketing@geerkens.de`.** Das Upgrade muss dort gebucht werden. Soll die Marke langfristig zu einem Konto der HiveGrid GmbH umziehen? | +| **Collabs, wann immer es passt** | Noahs Reichweite ist der stärkste Hebel. Im September kamen die neuen Follower von `hivegrid.de` sehr wahrscheinlich aus Collabs (1.1). | keine feste Menge. Jede Collab wird im Plan eingebaut, sobald sie da ist. | laufend | +| **Freigabe für Drehs bei Geerkens** | Nerd auf der Baustelle (F19) und Pilotkunde vorher/nachher (F21) sind der stärkste Beleg, den wir haben (11). | Zustimmung von Noah, der Schwester und den Mitarbeitenden, die im Bild sind | offen | +| **Noah vor der Kamera** | Er ist der Meister in Forum-Screenshot (F16) und Split-Reel (F20). Im Plan stehen beide zusammen 9 Mal bis 29.11. | Aufnahmen lassen sich bündeln, mehrere in einer Sitzung | offen, wie oft es geht | +| **Freigabe-Regel** | Damit Freigaben den Rhythmus nicht bremsen (13.3) | Formate einmal freigeben, danach Wochenpakete mit Frist | offen | +| **Impressum und Firmierung** | Pflicht auf allen Geschäftsprofilen (§ 5 DDG) | Wessen Impressum, unter welcher Firma? | offen | + +Alle weiteren Fragen an Noah stehen in `../Research/00-uebersicht.md`, Abschnitt 6.3. + +--- + +## 1. Ausgangslage + +- **Produkt:** HiveGrid ist eine Arbeitsoberfläche für SHK-Betriebe, die um das Branchenprogramm herum läuft. Die Software ist in der Release-Vorbereitung. +- **Kunden:** Noch nutzt kein Betrieb HiveGrid im Alltag. Der erste Kunde, Geerkens, soll in 1 bis 2 Wochen starten (Stand 05.10.). +- **Kanäle:** + - Instagram `hivegrid.de` hat rund 64 Follower, 6 eigene Posts und 3 Collabs. + - Die LinkedIn-Seite ist leer. Facebook und TikTok fehlen noch. + - Noah postet Reels auf `noahgeerkens` und hat auf LinkedIn angefangen. +- **Team:** Dejan hat rund 30 Stunden pro Woche, David rund 10. Es gibt kein Budget. +- **Seit 17.09.:** Die Produktposts sind gestoppt. Gründe: zu viel Feature-Verkauf, keine Menschen, wenig Zeit wegen Bughunting. + +### 1.1 Zahlen aus Metricool (Instagram `hivegrid.de`, abgerufen am 05.10.2026) + +**Die sechs bisherigen Posts** (alle Carousels): + +| Datum | Post | Reichweite | Aufrufe | Likes | Komm. | Gespeichert | Geteilt | Neue Follower | +|---|---|---:|---:|---:|---:|---:|---:|---:| +| 07.08. | Vom Handwerker für Handwerker | 634 | 1.683 | 24 | 3 | 1 | 2 | 7 | +| 14.08. | Die Geschichte (Noah) | 975 | 3.070 | 43 | 3 | 3 | 6 | 5 | +| 17.08. | Verbinden statt ersetzen | 1.258 | 2.244 | 19 | 3 | 0 | 2 | 3 | +| 19.08. | Workflow-Engine | 148 | 340 | 14 | 1 | 0 | 0 | 0 | +| 21.08. | Projektmanagement | 160 | 420 | 13 | 1 | 0 | 0 | 0 | +| 31.08. | Team-Chat | 170 | 414 | 13 | 1 | 0 | 0 | 0 | + +**Was die Zahlen zeigen:** +- Die drei Posts über Haltung und Herkunft erreichten 634 bis 1.258 Konten und brachten 15 neue Follower. +- Die drei Funktionsposts erreichten je rund 150 bis 170 Konten und brachten keinen einzigen Follower, keine Speicherung, keine Weiterleitung. +- Die Stichprobe ist klein, die Richtung aber deutlich. + +**Follower-Entwicklung:** + +| Datum | Follower | +|---|---:| +| 01.08. | 10 | +| 16.08. | 27 | +| 31.08. | 33 | +| 13.09. | 32 | +| 16.09. | 47 | +| 27.09. | 53 | +| 01.10. | 64 | + +- Im September hat `hivegrid.de` selbst nichts gepostet, und trotzdem hat sich die Zahl der Follower fast verdoppelt. +- Die Sprünge fallen auf Tage mit vielen Aufrufen (1.297 bis 1.572 pro Tag). *Vermutung:* Das waren die Collab-Reels mit Noah. Metricool liefert für Collabs keine Daten, das muss jemand in Instagram selbst nachsehen. + +--- + +## 2. Ziel, Nordstern, Messung + +### Nordstern [entschieden, F27] + +**Qualifizierte Erstgespräche pro Monat, die über Marketing kamen.** +- „Qualifiziert“ heißt: SHK-Betrieb mit 10 bis 50 Mitarbeitenden, Gespräch in Cal gebucht und geführt. +- „Über Marketing“ heißt: Die Antwort auf „Wie bist du auf uns gekommen?“ nennt Social Media, Noah, Newsletter oder Website. +- Den Zielwert legen wir mit Haris fest: Wie viele Gespräche braucht es für die ersten zahlenden Kunden? + +### Frühindikatoren je Kanal [Vorschlag] + +| Kanal | Worauf wir schauen | Warum | +|---|---|---| +| Instagram, TikTok, Facebook | Reichweite bei Nicht-Followern, Sendungen und Likes pro Reichweite, bei Reels Wiedergabezeit und Anteil länger als 3 Sekunden, neue Follower pro Beitrag, Klicks auf den Link in der Bio | Instagram selbst nennt Watchtime, Likes und Sendungen pro Reichweite als Hauptsignale (Research 02) | +| LinkedIn | Impressionen, Interaktionsrate, neue Follower der Seite, Klicks | Auf LinkedIn zählt vor allem, wie lange gelesen wird | +| Newsletter | Anmeldungen, Öffnungen, Klicks | | +| Weg zum Gespräch | Kommentare mit Stichwort, DMs, Cal-Buchungen, Selbstauskunft | Software übersieht viel, vor allem Empfehlungen über WhatsApp | + +**Kein Ziel:** die absolute Zahl der Follower. + +### Rhythmus der Auswertung [Vorschlag] + +- **Wöchentlich**, freitags 30 Minuten: Zahlen der Woche über Metricool, die Claude abruft. Was lief, was nicht, was ändern wir nächste Woche. +- **Monatlich**, am letzten Freitag: eine Seite für Noah und David mit Nordstern, Frühindikatoren, Testergebnissen und Entscheidungen. + +--- + +## 3. Zielgruppe + +**[entschieden]** SHK-Betriebe in Deutschland mit **10 bis 50 Mitarbeitenden**. Alle Branchenprogramme, nicht nur KWP und PDS (F1, F2). + +| Wer | Was zählt | Wo erreichbar | +|---|---|---| +| **Inhaber, Geschäftsführung** | Überblick, Kontrolle behalten, keine Umstellung, die den Betrieb lahmlegt | Facebook, Instagram (laut ARD/ZDF und Bitkom vorn bei Inhabern und Betrieben) | +| **Nächste Generation** | Digitalisierung voranbringen, ohne den Betrieb umzukrempeln | Instagram, LinkedIn, TikTok | +| **Büroleitung, IT-Verantwortliche** | weniger Doppelerfassung, Datenschutz, Anbindung | LinkedIn, Newsletter | +| **Branche, Partner, Investoren** | Glaubwürdigkeit, Tempo, Team | LinkedIn | + +**Was bremst und was zieht** (die vier Kräfte, Research 01): +- **Druck:** Papierkram am Abend, Chaos aus WhatsApp und Zetteln, Fachkräftemangel. +- **Sog:** Überblick, Abläufe, die von selbst laufen. +- **Angst:** Kontrollverlust, Datenschutz, Aufwand der Umstellung. +- **Gewohnheit:** „Das Branchenprogramm läuft doch.“ + +**Unser Content antwortet vor allem auf Angst und Gewohnheit,** nicht auf den Sog allein. Das war der Fehler der Funktionsposts. + +--- + +## 4. Botschaft und Positionierung + +**Kategorie** [entschieden, F28]: **„Arbeitsoberfläche für den Betrieb“.** Das ist das Wort, das ein Inhaber nach 5 Sekunden im Kopf haben soll. Es passt zum Leitsatz aus dem Produkt: „KWP bleibt der ERP-Kern. HiveGrid wird die tägliche Arbeitsoberfläche.“ + +**Dach** [entschieden]: „Verbinden statt ersetzen.“ + +| Säule der Botschaft | Was wir sagen | Beleg | +|---|---|---| +| **Du musst nichts wechseln** | Dein Branchenprogramm bleibt, HiveGrid läuft drumherum | Anbindung an KWP und PDS, kein Datenumzug | +| **Automatisierung ohne Angst** [entschieden, F12] | Du behältst die Kontrolle | Probelauf, 24 Stunden Rückgängig, ein Mensch gibt frei | +| **Aus dem Handwerk gebaut** | Ein SHK-Betrieb in vierter Generation baut mit | Noah, Geerkens, der Bau offen gezeigt | +| **Deine Daten bleiben bei dir** | Hosting in Deutschland, keine US-KI im Produkt | ehrlich formuliert, wegen Cloudflare (Kontext 9.7) | + +**Diese Aussagen machen wir nicht mehr** (Kontext 9.7): +- DATEV als angebunden darstellen. +- „100 % ohne US-Beteiligung“. +- Rechnungen oder All-in-One versprechen. + +--- + +## 5. Absender und Ton + +| Absender | Rolle | Ton | +|---|---|---| +| **Noah** (eigene Konten) | Person, Chef-Sicht, Handwerk. Top of Funnel. | Darf lustig und trashig sein [entschieden, F8] | +| **HiveGrid** (Instagram, TikTok, Facebook, YouTube) | das Team, der Bau, der Alltag. Das Produkt als Beleg. | konkret und freundlich. **Humor wird getestet** (Test T1) | +| **HiveGrid** (LinkedIn-Seite) | Einblicke, Haltung, Anlässe | ruhiger und sachlicher, Text und Bild | + +**Überall Du** [entschieden, F11]. + +**Brücke von Noah zu HiveGrid:** Wie oft Noah postet und wie oft HiveGrid vorkommt, entscheidet Noah. Als Orientierung aus der Recherche (Research 06): Von 7 Reels kommen 4 ohne HiveGrid aus, 2 haben HiveGrid in der Geschichte, 1 enthält eine klare Einladung. Collabs bauen wir ein, wann immer sie kommen. + +**Leitplanken:** +- Keine Witze über Kunden, das Handwerk oder Gruppen von Menschen. Selbstironie ja. +- Keine erfundenen Zahlen, keine Versprechen über Unfertiges. +- Noahs Rolle ist in werblichen Beiträgen sichtbar (Kennzeichnung, Rechtsprüfung offen). + +--- + +## 6. Thema, Blickwinkel und Funnel + +**[entschieden, Konzept Noah 09.10.2026]** Ein Thema für alles, und wir weichen nicht davon ab. Zu viele Themen sind der häufigste Grund, warum Formate nicht zünden (Feedback Noah, 07.10.). Das Konzept liegt in `../../Ressourcen/Noah/HiveGrid_Meister-und-Nerds.pdf`. + +**Thema:** **Meister & Nerds: Handwerk trifft Tech.** Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Das Ziel ist immer Digitalisierung, aber nur nebenbei. Inhaltlich geht es um Automation und Schnelligkeit im Handwerk und darum, wie wir HiveGrid bauen. + +| Blickwinkel | Worum es geht | +|---|---| +| **Meister** | Der Schmerz aus dem Betrieb, aus Sicht der Handwerker. Meist Noah, Meister in vierter Generation. | +| **Nerds** | Wir, die HiveGrid bauen. Offen als Stärke [entschieden, F6]. Auch hier startet alles bei einem Schmerz aus dem Handwerk. | +| **Anlass** | Nur die GET Nord: Ankündigung und Rückblick. Die einzige Ausnahme. | + +**Funnel:** Jedes Format hat eine Stufe. Rund 70 % der Reels sind Top. + +| Stufe | Wozu (Noah) | Formate | +|---|---|---| +| **Top** | Witzig, kein Produkt im Vordergrund | F16 Forum-Screenshot, F17 Viel zu aufwendige Automation, F18 Couch- und Büro-Clips, F19 Nerd auf der Baustelle, F14 Trend, auf LinkedIn L2 und L3 | +| **Middle** | Erklärt, was HiveGrid kann | F20 Split-Reel, F10 Infopost, auf LinkedIn L1, Rückblicke | +| **Bottom** | Zeigt, dass es im echten Betrieb funktioniert | F21 Pilotkunde vorher/nachher (frühestens Ende November). Bis dahin nur die Ankündigung der GET Nord. | + +**Testen, dann eingrenzen:** Bis Ende November laufen F16 bis F20. Am 27.11. (T5) behalten wir die 2 bis 3, die am besten zünden, und verfeinern sie. Den Rest lassen wir weg. + +--- + +## 7. Kanäle und Postarten + +| Kanal | Rolle | Postarten | Quelle | Stand und Aufgabe | +|---|---|---|---|---| +| **Instagram HiveGrid** (`hivegrid.de`) | Hauptkanal | Reels (F16 bis F20, F14), klassische Infoposts (F10), Anlass-Posts zur GET Nord (F15), Collabs mit Noah, Stories optional | eigene Produktion, Noah vor der Kamera bei F16 und F20 | läuft | +| **Facebook HiveGrid** | Spiegel für Inhaber | dieselben Reels und Carousels | **automatisch** mitgepostet | Seite anlegen, mit Instagram verknüpfen | +| **TikTok HiveGrid** | Zweitverwertung [entschieden] | jedes Instagram-Reel | **Repost**, immer die saubere Originaldatei ohne Wasserzeichen | Konto anlegen. Test über 8 Wochen (T2) | +| **YouTube** | Shorts als Zweitverwertung (eventuell, entschieden), Longform-Tutorials von David | Shorts, Tutorials (F12) | Shorts: Repost. Tutorials: David, wenn sie kommen | Kanal prüfen oder anlegen. Shorts ab 09.11. als Test | +| **LinkedIn HiveGrid-Seite** | Vertrauen, Branche, Partner | **Text und Bild** [entschieden], in vier Postarten (siehe unten) | eigene Texte, Bilder aus der Post-Engine und vom Team | Seite fertig einrichten | +| **Noah, Instagram** | Top of Funnel | Reels, Collabs | Noahs eigene Produktion | läuft | +| **Noah, LinkedIn** | Person, Branche | Texte von Noah | Noah. HiveGrid liefert bei Bedarf Material | läuft | +| **Newsletter** | Kontakt halten, Weg zum Gespräch | Monatsbrief | eigene Produktion | zurückgestellt, Social Media hat Vorrang (F31). Aufbau frühestens Q1 2027. | +| **Website** | Ziel aller Links | Erstgespräch-Seite, Impressum, später Newsletter-Anmeldung | Dejan, auf Anfrage von Noah [entschieden] | zweitrangig | + +### Die vier Postarten auf LinkedIn [Vorschlag] + +| Postart | Was | Wiederverwertung | +|---|---|---| +| **L1 Dokument** | Auf LinkedIn lassen sich mehrere Slides als „Dokument“ hochladen, das man durchblättert wie ein Instagram-Carousel. Wir nehmen die Slides eines Instagram-Carousels und schreiben einen eigenen LinkedIn-Text dazu. Metricool fasst die Bilder selbst zum Dokument zusammen. | aus F10, 30 Minuten Anpassung | +| **L2 Einblick** | Ein Foto aus Team, Bau oder Betrieb mit kurzem Text | eigene Fotos, die beim Dreh anfallen | +| **L3 These** | Eine These zu Automation und Tempo im Handwerk, mit Grafik aus der Post-Engine | Grafik aus der Engine | +| **L4 Anlass** | Messe, Start bei Geerkens, Neuigkeit | oft mit F6 zusammen | + +### Was sich wiederverwerten lässt und was nicht + +| Lässt sich wiederverwerten | Muss eigen sein | +|---|---| +| Reel → TikTok, Facebook, YouTube Shorts (15 Minuten) | LinkedIn-Texte | +| Carousel → Facebook (automatisch), LinkedIn als Dokument (30 Minuten) | Newsletter | +| Tutorial → Ausschnitte für Shorts und Reels | Bildunterschriften je Kanal (kurz anpassen) | +| Fotos vom Dreh → LinkedIn-Einblick | Stufe-3-Reels (F19, F21) | + +--- + +## 8. Formate + +Die ganze Bibliothek steht in `../../Ressourcen/Formatbibliothek.md`. Dort gibt es zu jedem Format Aufbau, Produktion, Leitplanken und Messgröße. + +**Im Plan seit 09.10. (Konzept Noah):** + +| # | Format | Funnel | Aufwand | Konto | Im Plan | +|---|---|---|---|---|---| +| F16 | Forum-Screenshot | Top | 1 | Noah vor der Kamera | ab 21.10. | +| F17 | Viel zu aufwendige Automation | Top | 2 | HiveGrid | ab 06.11. | +| F18 | Couch- und Büro-Clips | Top | 1 bis 2 | HiveGrid | ab 19.10. | +| F19 | Nerd auf der Baustelle | Top | 3, ein Tag ergibt mehrere Reels | HiveGrid, bei Geerkens mit Noah | ab 11.11. | +| F20 | Split-Reel: Problem und Funktion | Middle | 2 | HiveGrid mit Noah | ab 23.10. | +| F21 | Pilotkunde vorher/nachher | Bottom | 3 | Collab mit Noah | frühestens Ende November | +| F14 | Trend zum Thema | Top | 1 bis 2 | HiveGrid | ein Slot und Flex | +| F10 | Infopost, Carousel mit Animation | Middle | 3 neu, 0,5 aus dem Backlog | HiveGrid | 4 Mal: 16.10. und 02.11. aus dem Backlog, 26.10. und 09.11. neu | +| F15 | Anlass-Post | Middle, Ankündigung Bottom | 1 | HiveGrid | GET Nord | + +Die übrigen Formate (F1 bis F13) bleiben als Vorbilder in der Bibliothek. Aus ihnen sind Noahs Formate zusammengesetzt. + +**Ideen-Pool:** Unsere Inspo-Bibliothek, auf Meister & Nerds gemünzt, dazu neue Ideen. 14 Ideen, nicht fest im Plan. Sie springen ein, wenn ein Format nicht zündet oder ein Slot frei wird. Liste in der Formatbibliothek, Abschnitt „Ideen-Pool zum Thema“. + +**Aufwand:** +- **Stufe 1:** unter 1 Stunde. +- **Stufe 2:** 1 bis 3 Stunden. +- **Stufe 3:** ab einem halben Tag. + +--- + +## 9. Frequenz und Kapazität + +### Zeit je Beitrag [Vorschlag, Schätzwerte] + +| Beitrag | Stunden | +|---|---:| +| Carousel aus dem Backlog, nur prüfen und einplanen | 0,5 | +| Neues Carousel mit der Post-Engine | 3 | +| Reel Stufe 1 | 1,5 | +| Reel Stufe 2 | 2,5 | +| Reel Stufe 3 | 8 (mit David) | +| LinkedIn-Beitrag Text und Bild | 1,5 | +| Repost eines Reels auf TikTok, Facebook, YouTube | 0,25 | +| Newsletter, eine Ausgabe | 6 | +| Kommentare und DMs beantworten, Interaktion mit anderen Konten | 3 pro Woche | +| Planung und Auswertung | 2 pro Woche | + +### Wochenbudget je Phase [Vorschlag] + +| | Phase 1 (12.10. bis 08.11.) | Phase 2 (09. bis 29.11.) | Phase 3 (ab 30.11.) | +|---|---|---|---| +| Instagram HiveGrid | 2 Reels (Stufe 1 und 2) und ein Infopost | 3 Reels und ein Infopost oder Anlass-Post | 1 Carousel und 3 bis 4 Reels, ein Reel Stufe 3 etwa alle 2 Wochen | +| LinkedIn-Seite | 2 Beiträge | 2 bis 3 | 3 | +| TikTok, Facebook | alle Reels gespiegelt, Facebook auch die Carousels | wie Phase 1 | wie Phase 1 | +| YouTube | | Shorts als Repost (Test) | Shorts. Davids Tutorials, wenn sie kommen. | +| Newsletter | | | zurückgestellt auf 2027 | +| Flex-Slots (Noah, David) | wenn sie kommen | wenn sie kommen | wenn sie kommen | +| **Stunden Dejan** | **rund 14 bis 17**, dazu die Vorbereitung. Der Rest geht noch in Bughunting und Customer Success. | **rund 22 bis 26** | **rund 26 bis 28** | +| **Stunden David** | nach Verfügbarkeit (Review, Assets) | nach Verfügbarkeit (Assets, Mitspielen) | nach Verfügbarkeit (Stufe 3, Tutorials) | + +Die Werte sind Schätzungen. Nach der ersten Monatsauswertung gleichen wir sie mit der echten Zeit ab. Die genaue Verteilung steht in `Redaktionsplan.md`. + +--- + +## 10. Weg zum Gespräch + +[Vorschlag] + +1. **Reel oder Beitrag** auf Noahs Konto oder bei HiveGrid. +2. **Profil von HiveGrid.** In der Bio stehen Rolle und Nutzen in einem Satz, dazu der Link. +3. **Links in der Bio:** zwei direkte Links, Erstgespräch buchen (Cal) und Impressum (Roadmap A10). Eine eigene Linkseite brauchen wir erst, wenn ein Lead-Magnet oder der Newsletter dazukommt. +4. **Ab Phase 3 ein Stichwort per DM** (mit F4). Wer ein Stichwort kommentiert, bekommt eine Nachricht mit Material und einer Frage mit Button (Metricool Flows). + - Meta erlaubt nach einem Kommentar genau eine private Antwort innerhalb von 7 Tagen. +5. **Newsletter** mit Double-Opt-in, ab 2027. +6. **Erstgespräch in Cal** mit Pflichtfrage „Wie bist du auf uns gekommen?“. Das Feld „Erster Kontakt“ kommt ins Vertriebs-CRM (Haris). +7. **Demo-Workspace** für 30 Tage (Haris), dann Kunde. + +--- + +## 11. Beleg-Plan + +Belege in der Reihenfolge, in der sie entstehen können: + +| Wann | Beleg | Format | +|---|---|---| +| ab sofort | Die Nerds offen zeigen: Team, Büro, Entwicklung | F18, F17, L2 | +| vor dem Start bei Geerkens, falls es passt | Das „Vorher“: wie es heute ohne HiveGrid läuft | F19, Material für F21 | +| ab Start bei Geerkens (etwa KW 42 bis 44) | Die Anfänge im eigenen Betrieb, ehrlich, auch mit Stolperstellen | Collab mit Noah, F20 | +| nach 4 bis 6 Wochen Nutzung, frühestens Ende November | Vorher und nachher bei Geerkens, nur mit Freigabe | F21, L4 | +| mit den ersten externen Kunden | Kundeninterviews, Testimonials | F21, F13 auf der Website | +| danach | Bewertungen auf Portalen (OMR Reviews), Anwenderbericht für Fachmedien | Roadmap 2027 | + +--- + +## 12. Testplan + +[Vorschlag] Vier Tests. Jeder hat ein Abbruchkriterium als „Zustand und Datum“ (Research 01). + +| Test | Frage | Aufbau | Messgröße | Entscheidung | +|---|---|---|---|---| +| **T1 Humor bei HiveGrid** | Trägt Büro-Humor auf dem HiveGrid-Konto? | entfällt | | **Entschieden am 09.10.:** Humor gehört auf das HiveGrid-Konto, so sieht es Noahs Konzept vor. Welche lustigen Formate bleiben, klärt T5. | +| **T5 Formate eingrenzen** | Welche 2 bis 3 Formate zünden? | F16 bis F20 laufen je 2 bis 5 Mal bis 27.11. | Top: Reichweite bei Nicht-Followern, Sendungen pro Reichweite, Follower pro Beitrag. Split-Reel: Speicherungen, Profilaufrufe, Klicks | Fr 27.11. Die 2 bis 3 besten bleiben und werden verfeinert. | +| **T2 TikTok als Repost** | Bringt TikTok ohne Mehraufwand etwas? | ab 21.10. jedes Reel als Repost | Aufrufe pro Video, Follower, Profilaufrufe | Fr 04.12. Unter 300 Aufrufen im Schnitt und keine Anfrage: TikTok pausieren. | +| **T3 Postarten auf LinkedIn** | Welche Postart trägt auf der Seite? | Bis KW 47 je 3 Beiträge L1, L2, L3 | Interaktionsrate, Klicks, Follower | Mo 23.11., nach der GET Nord. Die schwächste Postart fliegt raus. | +| **T4 Stichwort-Funnel** | Bringt ein Stichwort-CTA Kontakte? | ab 10.12. mit F4 und Metricool Flows | Kommentare mit Stichwort, DMs, Klicks auf Cal | nach 3 Folgen | + +--- + +## 13. Prozess und Werkzeuge + +### 13.1 Rollen und Kapazität + +| Person | Zeit für Marketing | Aufgaben | +|---|---|---| +| Dejan Cosic | rund 30 Stunden pro Woche, dazu Customer Success | Content und Strategie, Produktion, Videoschnitt, Redaktionsplan, Community | +| David | rund 10 Stunden pro Woche, nach Verfügbarkeit | Unterstützung bei Social Media, Design, Assets aus Subframe, Tutorials für YouTube, wenn sie kommen | +| Noah Geerkens | nach eigener Zeit | eigene Kanäle als Top of Funnel, Collabs, wann immer es passt, Freigaben | +| Haris Sejmen | Vorrang Vertrieb | Erstgespräche, Selbstauskunft im CRM, Rückmeldung aus Gesprächen | + +### 13.2 Werkzeuge und Kosten + +| Werkzeug | Wofür | Stand | Empfehlung | Kosten | +|---|---|---|---|---| +| **Metricool** | Planen, Veröffentlichen, Auswerten aller Kanäle, Konkurrenz, Flows | Marke „HiveGrid“ im Konto `marketing@geerkens.de`, Dejan ist Manager. Nur Instagram verbunden. Seit 05.10. mit Claude verbunden (nur lesend, schreiben ist gesperrt). | **Starter** mit 5 Marken | 16 € netto im Monat jährlich, rund 20 € monatlich | +| Post-Generator (`posts`) | Bild- und Animationsposts in der Marke | eigenes Werkzeug | weiter nutzen, mit Ressourcen aus Subframe füllen | 0 € | +| Subframe | UI-Design von HiveGrid, Quelle für Screens und Komponenten | vorhanden, per MCP lesbar | als Quelle nutzen | vorhanden | +| Reel-Analyse | Vorbild-Reels lokal auswerten | eingerichtet am 05.10.2026 | | 0 € | +| Schnitt | Reels schneiden | Dejan schneidet selbst | Premiere oder DaVinci Resolve. CapCut für HiveGrid meiden (Research 04). | vorhanden | +| Newsletter | Monatsbrief mit Double-Opt-in | zurückgestellt auf 2027, Werkzeug offen | das eigene E-Mail-Modul von HiveGrid, sobald der Mailjet-Nachweis da ist. Sonst CleverReach oder rapidmail im kostenlosen Tarif. | 0 € | + +**Warum Free bei Metricool nicht reicht:** + +| | Free | Starter | +|---|---|---| +| Marken | 1 | 5 (oder 10 für 29 € im Monat) | +| Geplante Beiträge | 20 im Monat | unbegrenzt | +| LinkedIn | nein | ja | +| Konkurrenzanalysen | 5, nicht wieder entfernbar | 100 | +| Berichte | nein | ja | +| Flows (Antworten auf Kommentare, Alternative zu ManyChat) | nein | ja, derzeit ohne Aufpreis | + +Advanced (ab 43 € im Monat) brauchen wir nicht. Dessen wichtigste Zusatzleistung ist die API, und die ersetzt die MCP-Anbindung an Claude. + +### 13.3 Wochenrhythmus [Vorschlag] + +| Tag | Was | +|---|---| +| Montag | Wochenpaket final, Freigabe, alles in Metricool einplanen (30 Minuten) | +| Dienstag | Produktionstag 1: Dreh und Schnitt im Block | +| Donnerstag | Produktionstag 2, Material für die Folgewoche | +| Freitag | Auswertung (30 Minuten), Wochenpaket für die nächste Woche an die Freigabe | +| täglich | 15 Minuten Kommentare, DMs und Interaktion mit anderen Konten, mittags | + +**Freigabe** [Vorschlag]: +- Noah und David geben jedes Format **einmal grundsätzlich** frei. +- Danach geht ein **Wochenpaket** freitags raus. Gibt es bis Montag 10 Uhr keinen Einwand, gilt es als freigegeben. + +--- + +## 14. Roadmap + +Steht als eigenes Dokument in `Roadmap.md`. Darin: +- fehlende Kanäle anlegen und Werkzeuge einrichten (KW 41) +- Social-Media-Betrieb in drei Phasen +- Newsletter mit Werkzeug, Ressourcen und Recht +- der Weg zum Gespräch +- Website +- Rechtsprüfung +- Messung +- weitere Kanäle ab 2027 + +--- + +## 15. Redaktionsplan + +Steht als eigenes Dokument in `Redaktionsplan.md`. Er läuft vom ersten Beitrag am **Fr 16.10.** bis 20.12.2026, mit Ausblick auf Januar. Collabs mit Noah und Davids Tutorials stehen dort als Flex-Slots ohne feste Menge. + +--- + +## 16. Risiken und offene Entscheidungen + +### Risiken + +| Risiko | Gegenmittel | +|---|---| +| Die Kapazität reicht nicht, weil Customer Success mehr Zeit frisst | Phase 1 klein halten. Stufe-3-Formate nur alle 2 Wochen. Vorproduzieren an festen Produktionstagen. | +| Freigaben bremsen den Rhythmus | Formate einmal freigeben, dann Wochenpakete mit Frist (13.3) | +| Abhängigkeit von Noah, gerade bei F16 und F20 | Aufnahmen bündeln. F17 und F18 laufen ohne ihn, ebenso der Ausweich-Slot F14. Zweite Gesichter aus dem Team. | +| Der Start bei Geerkens rutscht, F21 verzögert sich | Bottom bleibt bis dahin bei der GET Nord. Das „Vorher“ geht damit nicht verloren. | +| Humor kippt ins Unseriöse | Leitplanken (5). Jedes Reel startet bei einem echten Schmerz, der Witz geht nie auf Kosten der Handwerker. | +| Falsche Aussagen (DATEV, Hosting) | Nur die Botschaften aus 4 verwenden. Backlog-Posts vorher prüfen. | +| Rechtliches (Impressum, Kennzeichnung, Musik) | Rechtsprüfung in KW 43 anstoßen | + +### Entschieden am 05.10.2026 + +- **Keine festen Mengen für andere:** Collabs mit Noah und Davids Tutorials kommen, wenn sie kommen. +- **Start:** + - Vorbereitung in KW 41. + - Produktion ab 12.10. + - Der erste Beitrag am Fr 16.10., ein fertiger Infopost. +- **Nordstern:** qualifizierte Erstgespräche pro Monat über Marketing (F27). Der Zielwert kommt mit Haris. +- **Kategorie:** „Arbeitsoberfläche für den Betrieb“ (F28). +- **Rhythmus und Uhrzeiten** wie im Redaktionsplan (F29). +- **YouTube Shorts** ab 09.11. als Test (F30). +- **Newsletter:** zurückgestellt auf 2027, das Werkzeug ist offen (F31). +- **GET Nord:** Besuch mit 3 bis 4 Leuten, mit Ankündigung und Rückblick (F32). +- **Facebook:** erstmal nur spiegeln (F33). +- **Entscheidungstermine:** + - T3 am Mo 23.11., nach der Messe (T1 entfällt seit 09.10.). + - T2 am 04.12. + +### Entschieden am 09.10.2026 (Konzept Noah „Meister & Nerds“) + +- **Thema:** Meister & Nerds, Handwerk trifft Tech. Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Die Blickwinkel heißen jetzt Meister und Nerds. +- **Formate:** Noahs sechs Formate ersetzen die bisherigen Reel-Formate im Plan (F16 bis F21). Bis 27.11. laufen F16 bis F20, dazu ein Trend-Slot, die Infoposts und die GET Nord. +- **Funnel:** Rund 70 % der Reels sind Top. Im Plan: Phase 1 71 %, Phase 2 67 %. +- **Backlog:** Form Builder bleibt der erste Beitrag am 16.10., E-Mail-Marketing kommt mit Abstand am 02.11. Beide lassen sich bis dahin noch überarbeiten, bleiben aber Carousels mit Animation. +- **Trend:** F14 bleibt, aber nur mit Trends, die zum Thema passen. +- **T1 entfällt:** Humor gehört auf das HiveGrid-Konto. Welche Formate bleiben, klärt T5. +- **Bottom** bleibt bis Ende November bei der Ankündigung der GET Nord. +- **Collab mit Noah** entscheiden wir je Beitrag, nicht im Plan. +- **Klassische Infoposts bleiben** neben Noahs Formaten, 4 Mal bis 29.11. Das schlägt Dejan Noah so vor, ebenso die Ankündigung und den Rückblick zur GET Nord. +- **Ideen-Pool:** die Inspo-Bibliothek auf Meister & Nerds gemünzt, für Ausfälle und nach T5. + +### Entschieden am 07.10.2026 (Feedback Noah) + +- **Ein Thema:** Automation und Schnelligkeit im Handwerk, aus zwei Blickwinkeln (Im Betrieb, Beim Bau). Die Säule „Anlässe und Haltung“ entfällt, die Haltungs-Carousels werden Problem-und-Lösung-Carousels. +- **Funnel:** jedes Format mit Stufe, Top 60 bis 70 %. Im Plan: Top 65 %, Middle 27 %, Bottom 8 %. +- **Eingrenzen am 27.11. (T5):** die 2 bis 3 Formate behalten, die zünden. + +### Entschieden am 06.10.2026 + +- **Die Planung endet erstmal Ende November.** Wie es ab Dezember weitergeht, planen wir frühestens Ende November. Der Entwurf für Dezember liegt in `daten/archiv/`. +- **2027 planen wir noch nicht.** Newsletter, weitere Kanäle und alles Technische dazu sind noch kein Thema. +- **Keine Aufgaben für andere festlegen.** Wo jemand anderes gefragt ist, steht „mit Noah klären“ oder ein Vorschlag, keine Zuteilung. +- **Noah bekommt nur Roadmap und Redaktionsplan** (Ordner `Für Noah/`), nicht diese Strategie. + +### Noch offen + +- **Zielwert für den Nordstern**, mit Haris. +- **Newsletter-Werkzeug**, wenn der Newsletter 2027 startet. + +--- + +## Anhang + +- **Kontext** (Produkt, Marke, Markt, Q&A): `../Kontext/Kontext.md` +- **Recherche** (6 Berichte und Übersicht): `../Research/` +- **Formatbibliothek:** `../../Ressourcen/Formatbibliothek.md` +- **Auswertung der Inspo-Reels:** `../../Ressourcen/Reel-Analyse/analysen/2026-10-05-inspo-liste-dejan.md` +- **Davids Vorschläge vom 26.09.:** `../MarketingBrainstormingOld.md` diff --git a/Brainstorming Kickoff/Strategie/Meister-und-Nerds.md b/Brainstorming Kickoff/Strategie/Meister-und-Nerds.md new file mode 100644 index 0000000..8753fde --- /dev/null +++ b/Brainstorming Kickoff/Strategie/Meister-und-Nerds.md @@ -0,0 +1,126 @@ +# HiveGrid: Meister & Nerds, Einordnung und Input + +**Stand:** 09.10.2026 +**Für:** Dejan +**Grundlage:** Noahs Konzept „HiveGrid Instagram: Meister & Nerds“ (`../../Ressourcen/Noah/HiveGrid_Meister-und-Nerds.pdf`), dazu Formatbibliothek, Kontext und Redaktionsplan. + +--- + +## 1. Kurz + +- Das Konzept ist gut. Es löst genau die zwei Punkte aus Noahs Feedback vom 07.10.: ein Thema und ein Funnel. +- Es passt zu unserer Recherche. Fast jedes seiner Formate hat ein belegtes Vorbild in der Formatbibliothek. +- Es ist schon eingebaut: Redaktionsplan, Formate, Funnel-Prüfung, Dashboard und Export für Noah. +- Im Blick behalten: Noahs Zeit vor der Kamera und dass Bottom bis Ende November dünn ist. + +--- + +## 2. Was stark ist + +**Das Thema ist ein Bild, kein Schlagwort.** +- „Automation und Schnelligkeit im Handwerk“ sagt, worum es geht. „Meister & Nerds“ zeigt, wer spricht. +- Es sind echte Personen. Noah ist Meister in vierter Generation, das Team sind die Nerds. +- Der Kontrast zwischen beiden trägt den Humor von selbst. + +**Eine Regel, die sich prüfen lässt.** +- „Jedes Reel startet bei einem Schmerz, den Handwerker kennen.“ Diese Frage passt auf jeden Slot. +- Sie schließt eine Lücke bei uns. Unser Blickwinkel „Beim Bau“ (Team, Tests, Fortschritt) hätte in allgemeinen Start-up-Content abrutschen können. Jetzt starten auch die Beiträge der Nerds beim Handwerk. + +**Die Formate sind belegt.** + +| Noahs Format | Vorbild aus unserer Bibliothek | Beleg | +|---|---|---| +| Couch- und Büro-Clips | F1, F1b (Cluely) | 125.000 bis 140.000 Likes | +| Viel zu aufwendige Automation | F4 (brodyautomates) | 37.000 Likes, 2.629 Kommentare | +| Forum-Screenshot | F3 (Text-Meme mit Reaktion), F8 (Chef-Sicht) | 10.000 Likes bei Aviation Worldwide | +| Split-Reel | F10 (Problem und Lösung), als Reel | eigene Idee | +| Nerd auf der Baustelle | neu, nah an F11 | kein Vorbild | +| Pilotkunde vorher/nachher | F11, F13 | erst mit Kunden | + +Unsere Auswertung der Inspo-Reels sagt: Reichweite gab es nur bei Figuren, Pointe oder Meme-Bezug. Meister und Nerds sind Figuren. + +**Ein Funnel je Format.** +- Jedes Format hat genau eine Aufgabe. +- Das macht die Entscheidung am 27.11. (T5) einfacher, weil wir Top mit Top vergleichen. + +**Der Einstieg ist billig.** +- Forum-Screenshot ist allein drehbar. +- Couch- und Büro-Clips brauchen keine langen Szenen. + +--- + +## 3. Was fehlt oder knirscht + +**1. Bottom gibt es erst mit einem Pilotkunden.** +- Bei Noah ist Bottom der Beleg, nicht die Einladung. Das ist richtig. +- Es geht aber erst, wenn ein Betrieb eine Weile mit HiveGrid arbeitet. Laut Kontext nutzt das noch niemand im Alltag (Stand 05.10.). +- Bis Ende November ist Bottom deshalb nur die Ankündigung der GET Nord. +- Das ist vertretbar, solange der Link zum Erstgespräch in der Bio steht und die Split-Reels in der Bildunterschrift darauf zeigen. + +**2. Noah ist in drei von sechs Formaten vor der Kamera.** +- Forum-Screenshot, Split-Reel, Pilotkunde. +- Im Plan sind das bis 29.11. neun Reels mit ihm. +- Das klappt, wenn er mehrere in einer Sitzung aufnimmt. Wenn nicht, fallen die Slots auf Couch- und Büro-Clips oder Trend zurück. Die gehen ohne ihn. + +**3. „Viel zu aufwendige Automation“ hat eine Falle.** +- Die Pointe muss beim übereifrigen Nerd liegen. +- Sonst bleibt beim Handwerker hängen: Software ist kompliziert. Genau diese Sorge wollen wir abbauen. + +**4. Das Papier deckt nur Instagram ab.** +- Zu LinkedIn sagt Noah nichts. +- Ich habe LinkedIn gelassen und nur auf das Thema gezogen: Einblick ist Nerds, These ist Meister. + +**5. Top und Middle brauchen eigene Messgrößen.** +- Top-Formate messen wir an Reichweite bei Nicht-Followern und Sendungen. +- Das Split-Reel messen wir an Speicherungen, Profilaufrufen und Klicks. +- Sonst verliert das Split-Reel jeden Vergleich, obwohl es seine Aufgabe erfüllt. So steht es jetzt in T5. + +--- + +## 4. Ideen dazu + +- **„Meister & Nerds“ sichtbar machen.** Ein fester Titel oder Look auf dem Cover, damit man die Reihe im Profil erkennt. Dazu immer dieselbe Couch und derselbe Platz. +- **Ein Tag, viele Beiträge.** Falls es einen Tag im Betrieb gibt, liefert er Material für mehrere Formate: F19 direkt, Probleme für Split-Reels, Fotos für LinkedIn. +- **Das „Vorher“ bei Geerkens.** Es lässt sich nur drehen, solange dort noch ohne HiveGrid gearbeitet wird. Laut Kontext soll HiveGrid dort etwa Mitte bis Ende Oktober in den Alltag gehen. Wer bis dahin bei Geerkens filmt, hat das Vorher für F21 gleich mit. +- **Der Forum-Screenshot kann mitwachsen.** Sobald Kommentare kommen, nehmen wir statt Forum-Posts die eigenen Kommentare. Das holt die Leute ins Format. +- **F17 hat eine zweite Stufe.** Trägt der Sketch, kommt später die ernste Fassung als Middle: dieselbe Automation, einfach und echt. Das ist F4 aus der Bibliothek. +- **Couch-Clips sind der Weg zur Serie.** Erkennen Leute in den Kommentaren die Figuren wieder, lohnen sich längere Folgen wie bei Cluely (F1). + +--- + +## 5. Was eingebaut ist + +- **Thema und Blickwinkel:** Meister & Nerds. Die Blickwinkel heißen jetzt Meister, Nerds und Anlass. +- **Formate:** Noahs sechs Formate als F16 bis F21, in Plan, Formatbibliothek und Strategie. Die alten Formate bleiben als Vorbilder in der Bibliothek. +- **Plan bis 29.11.:** 16 Reels, 4 Infoposts, 2 Anlass-Posts zur GET Nord. + +| Format | Funnel | Wie oft | Ab | +|---|---|---|---| +| F18 Couch- und Büro-Clips | Top | 3, dazu 1 als Ersatz | 19.10. | +| F16 Forum-Screenshot | Top | 3 | 21.10. | +| F17 Viel zu aufwendige Automation | Top | 2 | 06.11. | +| F19 Nerd auf der Baustelle | Top | 1, wenn es den Tag gibt, dazu 1 Mal „Nerds auf der Messe“ | 11.11. | +| F14 Trend zum Thema | Top | 1, dazu Flex | 27.11. | +| F20 Split-Reel | Middle | 5 | 23.10. | +| F10 Infopost | Middle | 4, davon 2 aus dem Backlog | 16.10. | +| F15 Anlass-Post GET Nord | Bottom und Middle | 2 | 16.11. | +| F21 Pilotkunde vorher/nachher | Bottom | frühestens Ende November | | + +- **Funnel:** Die Prüfung gilt für die Reels. Phase 1 hat 71 % Top, Phase 2 67 %. Über alle Beiträge sind es 63 und 52 %, weil die Infoposts Middle sind. +- **Klassische Infoposts bleiben,** auch im Pitch an Noah. Ebenso Ankündigung und Rückblick zur GET Nord. +- **Ideen-Pool:** 14 Ideen aus unserer Inspo-Bibliothek, auf Meister & Nerds gemünzt, dazu neue. In der Formatbibliothek und im Dashboard unter Formate. Im Export für Noah lässt er sich anhängen. +- **Deine Antworten vom 09.10.:** + - Form Builder bleibt der erste Beitrag am 16.10. E-Mail-Marketing kommt mit Abstand am 02.11. + - Trend bleibt, aber nur zum Thema. + - Wir testen 5 Formate statt 8. +- **T1 entfällt.** Ob Humor aufs HiveGrid-Konto gehört, beantwortet Noahs Konzept. Welche Formate bleiben, klärt T5. +- **Bottom** bleibt bis Ende November bei der Ankündigung der GET Nord (09.10. so entschieden). F6 Einladung steht nur als Flex-Slot bereit. +- **Collab mit Noah** entscheiden wir je Beitrag, nicht im Plan. +- **Nerd auf der Baustelle** ist eine Idee. Gibt es den Tag nicht, laufen am 11.11. Couch- und Büro-Clips. Am 25.11. kommt die Variante „Nerds auf der Messe“ mit Material von der GET Nord. +- **Noahs PDF** liegt in `Ressourcen/Noah/`. + +--- + +## 6. Offen + +- **Beispielvideos:** Im PDF sind keine Videos oder Links. Wenn Noah welche geschickt hat, werte ich sie wie die Inspo-Reels aus. diff --git a/Brainstorming Kickoff/Strategie/Redaktionsplan.md b/Brainstorming Kickoff/Strategie/Redaktionsplan.md new file mode 100644 index 0000000..299e353 --- /dev/null +++ b/Brainstorming Kickoff/Strategie/Redaktionsplan.md @@ -0,0 +1,217 @@ +# HiveGrid: Redaktionsplan 16.10. bis 29.11.2026 + +**Status:** Entwurf 7, Stand 09.10.2026 +**Für:** Noah Geerkens, David +**Von:** Dejan Cosic + +**Hintergrund:** +- Strategie: `Content-Strategie.md` +- Formate: `../../Ressourcen/Formatbibliothek.md` +- Vorbereitung und weitere Kanäle: `Roadmap.md` + +--- + +## 1. So ist der Plan zu lesen + +- **Ein Thema für alles:** Meister & Nerds, Handwerk trifft Tech (Konzept Noah, 09.10.). Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Jeder Slot hat Datum, Kanal, Format, Blickwinkel, Funnel-Stufe und eine Notiz. Das konkrete Thema eines Beitrags steht nicht im Plan, das füllt Dejan bei der Produktion. +- **Funnel:** Rund 70 % der Reels sind Top. Der Mix steht bei jeder Phase. +- **Testen, dann eingrenzen:** Bis Ende November laufen Noahs Formate F16 bis F20. Am 27.11. (T5) behalten wir die 2 bis 3, die zünden, und lassen den Rest weg. +- **Produktion ab 12.10.** Der erste Beitrag erscheint am **Freitag, 16.10.**, und es ist einer der beiden fertigen Infoposts aus dem Backlog. Ab dann wird immer **eine Woche im Voraus** produziert. Was in einer Woche erscheint, ist in der Woche davor entstanden. +- **Klassische Infoposts bleiben.** Ab 26.10. meist montags, 4 Mal bis 29.11., zwei davon aus dem Backlog. Dazu Ankündigung und Rückblick zur GET Nord. +- **Leicht anfangen.** Zuerst Couch- und Büro-Clips und Forum-Screenshot. Split-Reel ab 23.10., Automation ab 06.11., Nerd auf der Baustelle ab 11.11., wenn es einen Tag im Betrieb gibt. Pilotkunde vorher/nachher frühestens Ende November. +- **Ideen-Pool:** Weitere Ideen zum Thema stehen in der Formatbibliothek. Sie springen ein, wenn ein Format nicht zündet oder ein Slot frei wird. +- **Flex-Slots stehen nicht fest im Plan.** Das sind Beiträge, die von anderen abhängen, zum Beispiel Collabs mit Noah oder Tutorials von David. Sie erscheinen, wenn sie fertig sind (Abschnitt 4). + +### Abkürzungen + + +**Thema:** Meister & Nerds: Handwerk trifft Tech. Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Das Ziel ist immer Digitalisierung, aber nur nebenbei. Inhaltlich geht es um Automation und Schnelligkeit im Handwerk und darum, wie wir HiveGrid bauen. Wir bleiben dabei und weichen nicht ab (Konzept Noah, 07. und 09.10.2026). + +**Blickwinkel:** +- **A Nerds:** Wir, die HiveGrid bauen: Büro, Team, Technik. Auch hier startet alles bei einem Schmerz aus dem Handwerk. +- **B Meister:** Der Schmerz aus dem Betrieb, aus Sicht der Handwerker. Meist mit Noah. +- **C Anlass:** Nur die GET Nord: Ankündigung und Rückblick. + +**Funnel:** Rund 70 % der Reels sind Top (Noah). +- **Top:** Witzig, kein Produkt im Vordergrund. Für Leute, die HiveGrid noch nicht kennen. +- **Middle:** Erklärt, was HiveGrid kann. +- **Bottom:** Zeigt, dass es im echten Betrieb funktioniert. Bis es einen Pilotkunden gibt, ist das nur die Einladung zum Gespräch auf der GET Nord. + +**Formate:** + +| Kürzel | Format | Funnel | So kommt das Thema vor | Aufwand | +|---|---|---|---|---| +| F16 | Forum-Screenshot | Top | Meister: ein Schmerz, so wie Handwerker ihn selbst beschreiben. Ohne Produkt. | leicht | +| F17 | Viel zu aufwendige Automation | Top | Nerds: ein kleiner Schmerz, eine viel zu große Lösung. Die Workflow-Engine ist nur Kulisse. | mittel | +| F18 | Couch- und Büro-Clips | Top | Nerds: der Alltag im Team, ausgelöst von einem Schmerz aus dem Handwerk. | leicht bis mittel | +| F19 | Nerd auf der Baustelle | Top | Meister und Nerds zusammen: Der Nerd erlebt den Schmerz im Betrieb selbst. | hoch, ein Tag ergibt mehrere Reels | +| F20 | Split-Reel: Problem und Funktion | Middle | Meister zeigt den Schmerz, die Funktion löst ihn. Hier steht das Produkt vorne. | mittel | +| F21 | Pilotkunde vorher/nachher | Bottom | Derselbe Schmerz, vorher und nachher. Frühestens Ende November. | hoch | +| F14 | Trend zum Thema | Top | Nur Trends, die sich auf einen Schmerz im Handwerk oder auf die Nerds drehen lassen. | leicht bis mittel | +| F10 | Infopost (Carousel mit Animation) | Middle | Erst der Schmerz, dann die Funktion. Dazu die zwei fertigen Posts aus dem Backlog. | leicht bis mittel | +| F15 | Anlass-Post: Ankündigung vorher, Rückblick danach (Messe, Event) | Middle | Nur GET Nord. Die Ankündigung lädt zum Gespräch auf der Messe ein (Bottom), der Rückblick zeigt, wie es war (Middle). | leicht | +| F6 | Ansage direkt in die Kamera, nur bei einem Anlass | Bottom | Nur bei einem Anlass, zum Beispiel dem Start bei Geerkens. Steht als Flex-Slot bereit. | leicht | + +**LinkedIn-Postarten** (Text und Bild): + +| Kürzel | Postart | Funnel | Was dahinter steckt | +|---|---|---|---| +| L1 | Dokument | Middle | Auf LinkedIn kann man statt eines einzelnen Bildes mehrere Slides als **Dokument** hochladen. LinkedIn zeigt sie dann zum Durchblättern, wie ein Carousel auf Instagram. Wir nehmen die Slides eines Instagram-Carousels und schreiben einen eigenen LinkedIn-Text dazu. Metricool kann die Bilder dabei selbst zu so einem Dokument zusammenfassen, eine PDF muss also niemand von Hand bauen. Laut Recherche haben solche Beiträge bei Unternehmensseiten das höchste Engagement. | +| L2 | Einblick | Top | ein Foto aus Team, Bau oder Betrieb mit kurzem Text | +| L3 | These | Top | eine These zu Automation und Tempo im Handwerk, mit einer Grafik aus der Post-Engine | +| L4 | Anlass | Middle | Messe, Start bei Geerkens | + + +--- + +## 2. Feste Regeln + +| Regel | Wert | +|---|---| +| **Instagram-Reels** | gehen am selben Tag auf **TikTok** und **Facebook**. Ab 09.11. testweise auch als **YouTube Short**. Immer die saubere Originaldatei, ohne Wasserzeichen. | +| **Instagram-Carousels** | gehen automatisch auf **Facebook** | +| **L1 auf LinkedIn** | nimmt immer das Carousel der **Vorwoche** | +| **Uhrzeiten** | Instagram 12:00 (wie bisher), LinkedIn 08:30. Nach den ersten Wochen mit den besten Zeiten aus Metricool abgleichen. | +| **Wochenrhythmus** | Montag einplanen und freigeben. Dienstag und Donnerstag produzieren. Freitag auswerten und das Paket für die nächste Woche schnüren. Täglich 15 Minuten Kommentare und DMs. | +| **Wenn etwas ausfällt** | Ein Reel-Slot nimmt eine leichte Idee aus dem Pool, zum Beispiel „Situation mit Reaktion“, oder F18. Die gehen ohne Noah. Lieber ein einfacher Beitrag als eine Lücke. | +| **Konto** | Alle Slots in diesem Plan laufen über die HiveGrid-Konten. Noahs Konten planen wir nicht mit, außer bei Collabs. Ob ein Beitrag mit Noah auch als Collab läuft, entscheiden wir je Beitrag. | + +--- + +## 3. Der Plan + + +### Phase 1: anlaufen (12.10. bis 08.11.) + +Instagram 3 Beiträge pro Woche (Mo, Mi, Fr), LinkedIn 2 (Di, Do). Ab 26.10. montags ein Infopost, sonst Reels. Split-Reel ab 23.10., Automation ab 06.11. Funnel der Reels: Top 71 %, Middle 29 %, Bottom 0 %. Alle Beiträge: Top 63 %, Middle 38 %, Bottom 0 %. + +#### KW 42 (12. bis 18.10.): Produktionsstart + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 12.10. | intern | Produktion für KW 43 | | | erster Produktionstag | +| **Fr 16.10.** | Instagram, Facebook | F10 Infopost | Meister | Middle | **erster Beitrag.** Aus dem Backlog, Form Builder. | + +#### KW 43 (19. bis 25.10.) + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 19.10. | Instagram, TikTok, Facebook | F18 Couch- und Büro-Clips | Nerds | Top | erstes Reel. Erster Beitrag auf TikTok. | +| Di 20.10. | LinkedIn | L1 Dokument | Meister | Middle | Carousel vom 16.10. Erster Beitrag auf der Seite. | +| Mi 21.10. | Instagram, TikTok, Facebook | F16 Forum-Screenshot | Meister | Top | erster Forum-Screenshot | +| Do 22.10. | LinkedIn | L2 Einblick | Nerds | Top | | +| Fr 23.10. | Instagram, TikTok, Facebook | F20 Split-Reel | Meister | Middle | erstes Split-Reel | + +#### KW 44 (26.10. bis 01.11.) + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 26.10. | Instagram, Facebook | F10 Infopost | Meister | Middle | neu. Zuerst der Schmerz, dann die Funktion. | +| Di 27.10. | LinkedIn | L3 These | Meister | Top | | +| Mi 28.10. | Instagram, TikTok, Facebook | F18 Couch- und Büro-Clips | Nerds | Top | | +| Do 29.10. | LinkedIn | L2 Einblick | Nerds | Top | | +| Fr 30.10. | Instagram, TikTok, Facebook | F16 Forum-Screenshot | Meister | Top | | +| Fr 30.10. | intern | Monatsauswertung Oktober | | | eine Seite an Noah und David, mit Funnel-Mix | + +#### KW 45 (02. bis 08.11.) + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 02.11. | Instagram, Facebook | F10 Infopost | Meister | Middle | aus dem Backlog, E-Mail-Marketing | +| Di 03.11. | LinkedIn | L2 Einblick | Nerds | Top | | +| Mi 04.11. | Instagram, TikTok, Facebook | F20 Split-Reel | Meister | Middle | | +| Do 05.11. | LinkedIn | L3 These | Meister | Top | | +| Fr 06.11. | Instagram, TikTok, Facebook | F17 Viel zu aufwendige Automation | Nerds | Top | zum ersten Mal | + +### Phase 2: mehr Formate (09. bis 29.11.) + +Instagram 4 pro Woche (Mo, Mi, Do, Fr), LinkedIn 2 bis 3. Montags Infopost oder GET Nord, sonst Reels. YouTube Shorts als Test. Funnel der Reels: Top 67 %, Middle 33 %, Bottom 0 %. Alle Beiträge: Top 52 %, Middle 38 %, Bottom 10 %. + +#### KW 46 (09. bis 15.11.) + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 09.11. | Instagram, Facebook | F10 Infopost | Meister | Middle | neu | +| Di 10.11. | LinkedIn | L1 Dokument | Meister | Middle | Carousel vom 02.11. | +| Mi 11.11. | Instagram, TikTok, Facebook, YouTube Shorts | F19 Nerd auf der Baustelle oder F18 Couch- und Büro-Clips | Nerds | Top | F19 nur, wenn es einen Tag im Betrieb gibt. Erster Short. | +| Do 12.11. | Instagram, TikTok, Facebook, YouTube Shorts | F20 Split-Reel | Meister | Middle | | +| Do 12.11. | LinkedIn | L3 These | Meister | Top | | +| Fr 13.11. | Instagram, TikTok, Facebook, YouTube Shorts | F17 Viel zu aufwendige Automation | Nerds | Top | | +| Fr 13.11. | LinkedIn | L2 Einblick | Nerds | Top | | + +#### KW 47 (16. bis 22.11.): GET Nord + +HiveGrid ist vom 19. bis 21.11. mit 3 bis 4 Leuten auf der GET Nord in Hamburg. Vor Ort werden Fotos und B-Roll aufgenommen. Die Reels dieser Woche werden vorher produziert. + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 16.11. | Instagram, Facebook | F15 Ankündigung | Anlass | Bottom | „Wir sind auf der GET Nord“: Ort, Tage, wer hingeht. Einladung zum Gespräch vor Ort. | +| Di 17.11. | LinkedIn | L4 Anlass | Anlass | Bottom | Ankündigung GET Nord | +| Mi 18.11. | Instagram, TikTok, Facebook, YouTube Shorts | F16 Forum-Screenshot | Meister | Top | vorproduziert, weil das Team auf der Messe ist | +| Do 19.11. | Instagram, TikTok, Facebook, YouTube Shorts | F20 Split-Reel | Meister | Middle | vorproduziert, weil das Team auf der Messe ist | +| Do 19.11. | LinkedIn | L2 Einblick | Anlass | Top | ein Foto von der Messe, direkt vom Handy | +| Do 19. bis Sa 21.11. | Instagram Stories | Einblicke von der Messe | Anlass | Middle | Flex, so viel es vor Ort passt | +| Fr 20.11. | Instagram, TikTok, Facebook, YouTube Shorts | F18 Couch- und Büro-Clips | Nerds | Top | vorproduziert | + +#### KW 48 (23. bis 29.11.): Rückblick GET Nord + +| Datum | Kanal | Format | Blickwinkel | Funnel | Notiz | +|---|---|---|---|---|---| +| Mo 23.11. | Instagram, Facebook | F15 Rückblick | Anlass | Middle | „So war die GET Nord“, mit Fotos von vor Ort | +| Mo 23.11. | intern | **Entscheidung T3** | | | Postarten auf LinkedIn | +| Di 24.11. | LinkedIn | L4 Anlass | Anlass | Middle | Rückblick GET Nord | +| Mi 25.11. | Instagram, TikTok, Facebook, YouTube Shorts | F19 Nerds auf der Messe | Nerds | Top | Variante von F19, mit Material von der GET Nord | +| Do 26.11. | Instagram, TikTok, Facebook, YouTube Shorts | F20 Split-Reel | Meister | Middle | | +| Do 26.11. | LinkedIn | L2 Einblick | Nerds | Top | | +| Fr 27.11. | Instagram, TikTok, Facebook, YouTube Shorts | F14 Trend zum Thema | offen | Top | nur ein Trend, der zum Thema passt. Sonst eine Idee aus dem Pool. | +| Fr 27.11. | LinkedIn | L3 These | Meister | Top | Postarten nach T3 anpassen | +| Fr 27.11. | intern | Monatsauswertung November, **Entscheidung T5** | | | Welche 2 bis 3 Formate behalten wir? | + +### Ab Dezember + +- Wie es ab Dezember weitergeht, planen wir frühestens Ende November. Grundlage sind die Monatsauswertung und die Entscheidung T5 am 27.11. +- Pilotkunde vorher/nachher (Bottom) frühestens Ende November, sobald Geerkens eine Weile mit HiveGrid arbeitet. + + +--- + +## 4. Flex-Slots + +Diese Beiträge hängen von anderen ab. Sie stehen deshalb nicht mit Datum und Menge im Plan. Sie erscheinen, sobald sie fertig sind. + + +| Flex-Slot | Von wem | Was passiert, wenn er kommt | +|---|---|---| +| **Collab mit Noah** | Noah, nach eigener Zeit und Lust | erscheint als Collab auf Noahs Konto und auf `hivegrid.de`. In einer Woche mit Collab darf ein HiveGrid-Reel ausfallen, wenn die Zeit knapp ist. | +| **F21 Pilotkunde vorher/nachher** | sobald Geerkens eine Weile mit HiveGrid arbeitet und Noah es freigibt. Frühestens Ende November. | ersetzt einen Reel-Slot, als Collab mit Noah. Bei Bedarf dazu L4 auf LinkedIn. | +| **F12 Tutorial (Longform)** | David, wenn es fertig ist | erscheint auf YouTube. Daraus 1 bis 2 Ausschnitte als Reel oder Short in den nächsten freien Slots und ein L2 oder L4 auf LinkedIn. | +| **F6 Ansage** | bei einem Anlass (Messe, Neuigkeit, Start bei Geerkens) | ersetzt den nächsten Reel-Slot | +| **F14 Trend oder eine Idee aus dem Pool** | wenn ein Trend zum Thema passt, ein Format nicht zündet oder die Zeit knapp ist | ersetzt den nächsten Top-Reel. Trends warten nicht. | + + +--- + +## 5. Entscheidungstermine und Tests + + +| Datum | Test | Frage | Grundlage | +|---|---|---|---| +| Mo 23.11. | **T3 Postarten auf LinkedIn** | Welche Postart fliegt raus? | L1, L2, L3: Interaktionsrate, Klicks, Follower | +| Fr 27.11. | **T5 Formate eingrenzen** | Welche 2 bis 3 Reel-Formate zünden? Die behalten und verfeinern wir, den Rest lassen wir weg. Infoposts und Anlass-Posts bleiben. | Top-Formate (F16 bis F19, F14): Reichweite bei Nicht-Followern, Sendungen pro Reichweite, Follower pro Beitrag. Split-Reel (F20): Speicherungen, Profilaufrufe, Klicks auf den Link in der Bio. | +| Fr 30.10., 27.11. | Monatsauswertung | Was lief, was ändern wir? | eine Seite an Noah und David | + + +--- + +## 6. Mengen und Zeit auf einen Blick + +| | Phase 1 (12.10. bis 08.11.) | Phase 2 (09. bis 29.11.) | +|---|---|---| +| Instagram pro Woche | 3: ein Infopost und 2 Reels (in KW 43 3 Reels) | 4: ein Infopost oder Anlass-Post und 3 Reels | +| LinkedIn pro Woche | 2 | 2 bis 3 | +| TikTok, Facebook | jedes Reel, Facebook auch die Carousels | wie Phase 1 | +| YouTube Shorts | | jedes Reel (Test) | +| Flex-Slots | wenn sie kommen | wenn sie kommen | +| Zeit Dejan, geschätzt | rund 14 bis 17 Stunden pro Woche, dazu die Vorbereitung aus der Roadmap | rund 22 bis 26 | + +Die Zeiten sind Schätzungen. Nach der ersten Monatsauswertung gleichen wir sie mit der echten Zeit ab. diff --git a/Brainstorming Kickoff/Strategie/Roadmap.md b/Brainstorming Kickoff/Strategie/Roadmap.md new file mode 100644 index 0000000..5426393 --- /dev/null +++ b/Brainstorming Kickoff/Strategie/Roadmap.md @@ -0,0 +1,137 @@ +# HiveGrid: Marketing-Roadmap Oktober und November 2026 + +**Status:** Entwurf 4, Stand 09.10.2026 +**Für:** Noah Geerkens, David +**Von:** Dejan Cosic + +**Hintergrund:** +- Strategie: `Content-Strategie.md` +- Redaktionsplan: `Redaktionsplan.md` +- Recherche: `../Research/` + +**Grundsatz:** Was von anderen abhängt, bekommt keine feste Menge und keinen festen Termin. Wo Noah oder David gefragt sind, steht es dabei. + +--- + +## 1. Zeitstrahl + + +| Wann | Schwerpunkt | +|---|---| +| **KW 41** (05. bis 11.10.) | **Vorbereitung:** fehlende Kanäle anlegen, Metricool, Bios und Impressum | +| **KW 42** (ab 12.10.) | Produktion startet, **erster Beitrag Fr 16.10.** | +| KW 42 bis 45 | **Phase 1:** anlaufen mit leichten Formaten. Rechtsfragen sammeln. | +| KW 46 bis 48 | **Phase 2:** mehr Formate, YouTube Shorts als Test. **GET Nord 19. bis 21.11.** mit Ankündigung und Rückblick. Erste Entscheidungen am 23.11. | +| ab Dezember | planen wir frühestens Ende November | + + +--- + +## 2. Arbeitspakete + +### A. Fehlende Kanäle anlegen und Werkzeuge einrichten (KW 41) + +Ziel: Bis Freitag, 09.10. sind die Kanäle angelegt und verbunden, damit ab 12.10. nur noch produziert wird. + + +| # | Schritt | Wer | Abhängigkeit | Status | +|---|---|---|---|---| +| A1 | **Metricool Starter** buchen, im Konto `marketing@geerkens.de` (16 € im Monat jährlich, rund 20 € monatlich) | Noah | | offen | +| A2 | **Facebook-Seite HiveGrid** anlegen und mit `hivegrid.de` verknüpfen. Kategorie Software, Impressum-Feld, Website, Knopf „Termin buchen“ zur Erstgespräch-Seite. | Dejan | | offen | +| A3 | Prüfen, ob `hivegrid.de` ein **Business-Konto** ist (nötig für Metricool und das automatische Mitposten auf Facebook) | Dejan | A2 | offen | +| A4 | **TikTok-Konto** anlegen und auf Business umstellen. Gleicher Name und gleiches Profilbild wie Instagram. Impressum als Text in die Bio. Nur eigener Ton oder die kommerzielle Musikbibliothek. | Dejan | | offen | +| A5 | **YouTube-Kanal** prüfen oder anlegen (für Shorts und Davids Tutorials). Impressum-Link im Kanal-Header. | Dejan | | offen | +| A6 | **LinkedIn-Seite** fertig einrichten: Logo, Titelbild, Slogan, Info-Text mit Impressum, Branche, Website. | Dejan | | offen | +| A7 | **Einheitlicher Name** auf allen Kanälen prüfen und sichern | Dejan | | offen | +| A8 | **Zwei Admins je Kanal**, damit der Zugang nicht an einer Person hängt | Dejan | | offen | +| A9 | **Bios** in der Du-Form. Das Kategorie-Wort ist **„Arbeitsoberfläche für den Betrieb“** [entschieden], dazu „Verbinden statt ersetzen“. Ohne Versprechen, die das Produkt nicht hält (kein DATEV, kein „100 % ohne US“). | Dejan | | offen | +| A10 | **Links in der Bio:** 1. Erstgespräch (`hivegrid.de/waitlist`, Cal), 2. Impressum (`hivegrid.de/impressum`). Direkte Links statt Linktree. | Dejan | Impressum vollständig | offen | +| A11 | Alle Kanäle in **Metricool** verbinden: Facebook, TikTok, LinkedIn, YouTube | Dejan | A1 bis A6 | offen | +| A12 | **Wettbewerber und Vorbilder** in Metricool anlegen | Dejan | A1 | offen | +| A13 | Noahs Konten als **zweite Marke** in Metricool, wenn Noah einverstanden ist | Dejan, mit Noah | A1 | offen | +| A14 | **Backlog-Posts** (Form Builder, E-Mail-Marketing) auf Widersprüche prüfen, zum Beispiel DATEV oder Rechnungen | Dejan | | offen | +| A15 | **Vorlagen für Posts** um Screens und Bausteine aus dem Produktdesign erweitern, wenn nötig. Kann bis KW 44 laufen. | Dejan | | offen | + + +### B. Social-Media-Betrieb (ab 12.10.) + +Läuft nach `Redaktionsplan.md` in zwei Phasen. Wie es ab Dezember weitergeht, planen wir frühestens Ende November. + +| Phase | Zeitraum | Was neu dazukommt | +|---|---|---| +| Phase 1 | 12.10. bis 08.11. | Instagram, Facebook, TikTok, LinkedIn mit leichten Formaten | +| Phase 2 | 09. bis 29.11. | Formate mit mittlerem Aufwand, YouTube Shorts als Test | + +#### B1. GET Nord, Hamburg (19. bis 21.11.2026) + +HiveGrid ist mit 3 bis 4 Leuten vor Ort [entschieden]. + + +| # | Schritt | Wann | Wer | Status | +|---|---|---|---|---| +| B1.1 | Klären, wer vor Ort Fotos und B-Roll aufnimmt. Eine kurze Liste mit Motiven vorbereiten. | bis KW 46 | Dejan | offen | +| B1.2 | Reels für die Messewoche vorproduzieren (Mi 18. bis Fr 20.11.) | KW 46 | Dejan | offen | +| B1.3 | Ankündigung: Instagram Mo 16.11., LinkedIn Di 17.11. | KW 47 | Dejan | offen | +| B1.4 | Vor Ort: Fotos, B-Roll, Stories nach Lage | 19. bis 21.11. | Team vor Ort | offen | +| B1.5 | QR-Code zum Erstgespräch (Cal) dabei haben, auf dem Handy oder als kleine Karte | bis 18.11. | Dejan | offen | +| B1.6 | Rückblick: Instagram Mo 23.11., LinkedIn Di 24.11., Reel aus dem Messe-Material Mi 25.11. | KW 48 | Dejan | offen | + + +### C. Weg zum Gespräch + + +| # | Schritt | Wann | Wer | Status | +|---|---|---|---|---| +| C1 | Links in der Bio auf Erstgespräch und Impressum (A10) | KW 41 | Dejan | offen | +| C2 | Dem Vertrieb vorschlagen, im Cal-Formular zu fragen: **„Wie bist du auf uns gekommen?“** Nur so sehen wir, was Marketing bringt. | KW 43 | Dejan | offen | + + +### D. Website (zweitrangig) + +- **Grundsatz** [entschieden]: Dejan baut Änderungen ein, wenn Noah sie anfragt. Von sich aus wird nichts umgebaut. +- **Für den Funnel nötig:** vorerst nichts. Eine eigene Link-in-Bio-Seite ist nicht nötig, solange die direkten Links reichen. + +**Vorschläge an Noah**, zur Entscheidung, nicht zur sofortigen Umsetzung: + + +| # | Vorschlag | Status | +|---|---|---| +| D1 | DATEV aus Hero, FAQ und Wabe nehmen. | offen | +| D2 | Den Satz zu Hosting ehrlich formulieren (Cloudflare). | offen | +| D3 | Rechnungen nicht versprechen. | offen | +| D4 | SEO-Titel ohne All-in-One und im Du. | offen | +| D5 | MCP-Zahl von 15 auf 22 Werkzeuge korrigieren. | offen | + + +### E. Recht + +Dejan stellt die Fragen zusammen. Ob und an wen sie gehen, klären wir mit Noah. + + +| # | Schritt | Wann | Wer | Status | +|---|---|---|---|---| +| E1 | Die Fragen unten sauber zusammenstellen | KW 43 | Dejan | offen | +| E2 | Mit Noah klären, ob und an wen die Fragen gehen | danach | Dejan mit Noah | offen | + + +**Die Fragen:** + +| Frage | Warum | +|---|---| +| **Impressum** auf allen Profilen, auch Noahs. Unter welcher Firma, welche Anschrift? | Pflicht nach § 5 DDG. Ein Link in der Bio reicht (OLG Hamburg, 21.05.2026). | +| **Kennzeichnung**, wenn Noah für HiveGrid wirbt, auch bei Collabs | Die Quellen sind uneinig | +| **Musik** in geschäftlichen Reels auf allen Kanälen | Die normale Musikbibliothek deckt keine geschäftliche Nutzung ab | +| **Datenschutzhinweise** für die Social-Media-Profile, Facebook mit gemeinsamer Verantwortung | EuGH 2018 | +| **KI-Kennzeichnung**, weil Noah viel mit KI produziert | Art. 50 EU AI Act, seit 02.08.2026 | +| **Download fremder Reels** zur Analyse | § 44b UrhG | + +### F. Messung und Auswertung + + +| # | Was | Wann | Wer | Status | +|---|---|---|---|---| +| F1 | Wochenauswertung (30 Minuten, Zahlen über Metricool) | jeden Freitag ab 23.10. | Dejan | offen | +| F2 | Monatsauswertung (eine Seite an Noah und David) | Fr 30.10. und Fr 27.11. | Dejan | offen | +| F3 | Entscheidung T3: welche Postart auf LinkedIn rausfliegt | Mo 23.11. (nach der GET Nord) | Dejan | offen | +| F4 | Nordstern „qualifizierte Erstgespräche pro Monat über Marketing“ [entschieden]: Zielwert festlegen | KW 43 | Dejan | offen | + diff --git a/Dashboard/app.js b/Dashboard/app.js new file mode 100644 index 0000000..d52a7f7 --- /dev/null +++ b/Dashboard/app.js @@ -0,0 +1,208 @@ +// Dashboard: Daten laden, Seiten wechseln, Änderungen von selbst nachladen. +// +// Die Daten liegen in daten/*.json. Ändert Claude dort etwas, merkt das +// Dashboard es über /api/stand und zeichnet die Seite neu, ohne dass jemand +// neu laden muss. + +import { esc, zeitstempel } from "./hilfen.js"; +import * as start from "./seiten/start.js"; +import * as plan from "./seiten/plan.js"; +import * as roadmap from "./seiten/roadmap.js"; +import * as formate from "./seiten/formate.js"; +import * as dok from "./seiten/dokumente.js"; +import * as webinar from "./seiten/webinar.js"; + +const SEITEN = { start, plan, roadmap, formate, webinar, dok }; + +export const S = { + plan: null, roadmap: null, kanaele: null, webinar: null, dokumente: [], stand: null, + slots: [], schritte: [], +}; + +async function holeJson(url) { + const r = await fetch(url, { cache: "no-store" }); + if (!r.ok) throw new Error(`${url}: ${r.status}`); + return r.json(); +} + +export async function laden() { + const [p, r, k, w, d, st] = await Promise.all([ + holeJson("/daten/redaktionsplan.json"), + holeJson("/daten/roadmap.json"), + holeJson("/daten/kanaele.json"), + holeJson("/daten/webinar.json").catch(() => null), + holeJson("/api/dokumente"), + holeJson("/api/stand"), + ]); + Object.assign(S, { plan: p, roadmap: r, kanaele: k, webinar: w, dokumente: d, stand: st }); + // Nach Datum sortiert. Am selben Tag gilt die Reihenfolge in der Datei. + S.slots = p.slots.map((s, i) => [s, i]) + .sort(([a, i], [b, j]) => a.datum.localeCompare(b.datum) || i - j) + .map(([s]) => s); + S.schritte = r.pakete.flatMap((pk) => pk.schritte.map((s) => ({ ...s, paket: pk.id, paketTitel: pk.titel }))); + standZeigen(); +} + +// ---------------------------------------------------------------- Router + +export function route() { + const roh = location.hash.replace(/^#/, "") || "/"; + const [pfad, abfrage] = roh.split("?"); + const teile = pfad.split("/").filter(Boolean).map((t) => { try { return decodeURIComponent(t); } catch { return t; } }); + const seite = SEITEN[teile[0]] ? teile[0] : "start"; + return { seite, rest: teile.slice(1), query: new URLSearchParams(abfrage || "") }; +} + +let letzterSchluessel = null; + +export async function zeichnen() { + const r = route(); + const main = document.getElementById("inhalt"); + // Gleiche Seite: Scrollstand behalten (zum Beispiel beim Öffnen eines Slots + // oder wenn sich Daten ändern). Andere Seite: nach oben. + const schluessel = r.seite === "dok" ? `dok/${r.rest.join("/")}?${r.query}` : r.seite; + const gleich = schluessel === letzterSchluessel; + const y = window.scrollY; + + for (const a of document.querySelectorAll("#navigation a")) { + a.classList.toggle("aktiv", a.dataset.seite === r.seite); + } + schubladeWeg(); + // Erst nach oben, dann zeichnen: so darf die Seite selbst noch zu einer + // Stelle springen (laufende Woche, Abschnitt, Suchtreffer). + if (!gleich) window.scrollTo(0, 0); + letzterSchluessel = schluessel; + try { + await SEITEN[r.seite].zeichnen(main, r, { erstesMal: !gleich }); + } catch (e) { + console.error(e); + main.innerHTML = `

Diese Seite ließ sich nicht zeichnen

${esc(e.message)}

`; + } + if (gleich) window.scrollTo(0, y); + document.title = `${document.querySelector("#navigation a.aktiv span")?.textContent.trim() || "Übersicht"}, HiveGrid Marketing`; +} + +// ---------------------------------------------------------------- Schublade + +export function schublade(html, { zurueck, breit = false } = {}) { + const el = document.getElementById("schublade"); + const schleier = document.getElementById("schleier"); + el.className = "schublade" + (breit ? " breit" : ""); + el.innerHTML = `${html}`; + el.hidden = false; + schleier.hidden = false; + const zu = () => { location.hash = zurueck; }; + el.querySelector(".zu").onclick = zu; + schleier.onclick = zu; + el.dataset.zurueck = zurueck; + return el; +} + +export function schubladeWeg() { + document.getElementById("schublade").hidden = true; + document.getElementById("schleier").hidden = true; +} + +// ---------------------------------------------------------------- Meldung + +let meldungZeit = null; +export function meldung(text, fehler = false) { + const el = document.getElementById("meldung"); + el.textContent = text; + el.className = "meldung" + (fehler ? " fehler" : ""); + el.hidden = false; + clearTimeout(meldungZeit); + meldungZeit = setTimeout(() => { el.hidden = true; }, fehler ? 6000 : 2200); +} + +// ---------------------------------------------------------------- Schreiben + +export async function statusSetzen(datei, id, status) { + try { + const r = await fetch("/api/status", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ datei, id, status }), + }); + const j = await r.json().catch(() => ({})); + if (!r.ok || !j.ok) throw new Error(j.fehler || j.ausgabe || `Fehler ${r.status}`); + meldung(`${id}: ${status}`); + } catch (e) { + meldung(`Nicht gespeichert: ${e.message}`, true); + } + await laden(); + await zeichnen(); +} + +// ---------------------------------------------------------------- Stand und Nachladen + +function standZeigen() { + const st = S.stand; + const hinweis = document.getElementById("stand-hinweis"); + hinweis.textContent = S.plan ? `${S.plan.status} vom ${S.plan.stand.split("-").reverse().join(".")}` : ""; + hinweis.title = st?.aenderung ? `Letzte Änderung im Hub: ${zeitstempel(st.aenderung)}` : ""; + const links = document.getElementById("links"); + if (S.kanaele && !links.childElementCount) { + links.innerHTML = S.kanaele.links.map((l) => `${l.logo ? `` : ""}${esc(l.name)}`).join(""); + lokaleLinksPruefen(); + } +} + +// Lokale Werkzeuge wie PostGrid laufen nur, wenn ihr Server gestartet ist. +// Ist er aus, wird der Link blass und sagt das, statt ins Leere zu führen. +async function lokaleLinksPruefen() { + for (const a of document.querySelectorAll("#links a[data-lokal]")) { + let da = true; + try { + await fetch(a.href, { method: "HEAD", mode: "no-cors", cache: "no-store" }); + } catch { + da = false; + } + a.classList.toggle("aus", !da); + a.title = da ? "" : "Läuft gerade nicht. In posts ./serve.sh starten."; + } +} + +let getrennt = false; +async function nachsehen() { + let st; + try { + st = await holeJson("/api/stand"); + } catch { + if (!getrennt) meldung("Server nicht erreichbar. Läuft ./serve.sh noch?", true); + getrennt = true; + return; + } + getrennt = false; + if (S.stand && st.aenderung !== S.stand.aenderung) { + await laden(); + // Nicht neu zeichnen, solange jemand in ein Feld tippt. + if (!document.activeElement?.matches("input, textarea")) { + await zeichnen(); + meldung("Aktualisiert"); + } + } else { + S.stand = st; + standZeigen(); + } +} + +document.addEventListener("keydown", (e) => { + if (e.key !== "Escape") return; + const el = document.getElementById("schublade"); + if (!el.hidden && el.dataset.zurueck) location.hash = el.dataset.zurueck; +}); + +window.addEventListener("hashchange", zeichnen); + +(async () => { + try { + await laden(); + } catch (e) { + document.getElementById("inhalt").innerHTML = + `

Die Daten ließen sich nicht laden

${esc(e.message)}

Läuft der Server? Im Hub-Ordner ./serve.sh starten.

`; + return; + } + await zeichnen(); + setInterval(nachsehen, 4000); + setInterval(lokaleLinksPruefen, 15000); +})(); diff --git a/Dashboard/assets/favicon.svg b/Dashboard/assets/favicon.svg new file mode 100644 index 0000000..f0e57b4 --- /dev/null +++ b/Dashboard/assets/favicon.svg @@ -0,0 +1 @@ + diff --git a/Dashboard/assets/fonts/manrope-latin-ext.woff2 b/Dashboard/assets/fonts/manrope-latin-ext.woff2 new file mode 100644 index 0000000..bdade6d Binary files /dev/null and b/Dashboard/assets/fonts/manrope-latin-ext.woff2 differ diff --git a/Dashboard/assets/fonts/manrope-latin.woff2 b/Dashboard/assets/fonts/manrope-latin.woff2 new file mode 100644 index 0000000..9d7abb1 Binary files /dev/null and b/Dashboard/assets/fonts/manrope-latin.woff2 differ diff --git a/Dashboard/assets/logo-weiss.svg b/Dashboard/assets/logo-weiss.svg new file mode 100644 index 0000000..d1e3eb2 --- /dev/null +++ b/Dashboard/assets/logo-weiss.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dashboard/assets/logo.svg b/Dashboard/assets/logo.svg new file mode 100644 index 0000000..cdbd696 --- /dev/null +++ b/Dashboard/assets/logo.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Dashboard/assets/logos/cal.png b/Dashboard/assets/logos/cal.png new file mode 100644 index 0000000..0cf937e Binary files /dev/null and b/Dashboard/assets/logos/cal.png differ diff --git a/Dashboard/assets/logos/hivegrid.svg b/Dashboard/assets/logos/hivegrid.svg new file mode 100644 index 0000000..ce00718 --- /dev/null +++ b/Dashboard/assets/logos/hivegrid.svg @@ -0,0 +1,3 @@ + + + diff --git a/Dashboard/assets/logos/instagram.png b/Dashboard/assets/logos/instagram.png new file mode 100644 index 0000000..9c7e5e7 Binary files /dev/null and b/Dashboard/assets/logos/instagram.png differ diff --git a/Dashboard/assets/logos/metricool.png b/Dashboard/assets/logos/metricool.png new file mode 100644 index 0000000..f549e67 Binary files /dev/null and b/Dashboard/assets/logos/metricool.png differ diff --git a/Dashboard/assets/logos/postgrid.svg b/Dashboard/assets/logos/postgrid.svg new file mode 100644 index 0000000..fe9ca02 --- /dev/null +++ b/Dashboard/assets/logos/postgrid.svg @@ -0,0 +1 @@ + diff --git a/Dashboard/hilfen.js b/Dashboard/hilfen.js new file mode 100644 index 0000000..d829eef --- /dev/null +++ b/Dashboard/hilfen.js @@ -0,0 +1,159 @@ +// Kleine Helfer für Datum, Text, Markdown und Kanäle. +// Alles mit Datum rechnet mit reinen Kalendertagen in UTC, damit die +// Sommerzeit keinen Tag verschiebt. + +export const WT = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; +export const WT_LANG = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]; +export const MONATE = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]; +export const MON_KURZ = ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]; + +export const tag = (iso) => new Date(iso + "T00:00:00Z"); +export const isoVon = (d) => d.toISOString().slice(0, 10); +export const plus = (iso, n) => { const d = tag(iso); d.setUTCDate(d.getUTCDate() + n); return isoVon(d); }; +export const ttmm = (iso) => `${iso.slice(8, 10)}.${iso.slice(5, 7)}.`; +export const wt = (iso) => WT[tag(iso).getUTCDay()]; +export const kurzDatum = (iso) => `${wt(iso)} ${ttmm(iso)}`; +export const langDatum = (iso) => { + const d = tag(iso); + return `${WT_LANG[d.getUTCDay()]}, ${d.getUTCDate()}. ${MONATE[d.getUTCMonth()]} ${d.getUTCFullYear()}`; +}; +export const tageZwischen = (a, b) => Math.round((tag(b) - tag(a)) / 86400000); +export const montag = (iso) => plus(iso, -((tag(iso).getUTCDay() + 6) % 7)); + +export function kw(iso) { + const d = tag(iso); + d.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 6) % 7) + 3); + const erster = new Date(Date.UTC(d.getUTCFullYear(), 0, 4)); + return 1 + Math.round(((d - erster) / 86400000 - 3 + ((erster.getUTCDay() + 6) % 7)) / 7); +} + +// "12. bis 18.10." im selben Monat, sonst "26.10. bis 01.11." +export function spanne(von, bis) { + if (von.slice(0, 7) === bis.slice(0, 7)) return `${von.slice(8, 10)}. bis ${ttmm(bis)}`; + return `${ttmm(von)} bis ${ttmm(bis)}`; +} + +// Heute, oder zum Ausprobieren ein festes Datum über ?heute=2026-10-21. +export function heute() { + const q = new URLSearchParams(location.search).get("heute"); + if (q && /^\d{4}-\d{2}-\d{2}$/.test(q)) return q; + const d = new Date(); + return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`; +} + +export function abstand(von, bis) { + const n = tageZwischen(von, bis); + if (n === 0) return "heute"; + if (n === 1) return "morgen"; + if (n === -1) return "gestern"; + return n > 0 ? `in ${n} Tagen` : `vor ${-n} Tagen`; +} + +// Zeitstempel vom Server (Sekunden) als "05.10., 20:41" +export function zeitstempel(sek) { + if (!sek) return ""; + const d = new Date(sek * 1000); + const zz = (n) => String(n).padStart(2, "0"); + return `${zz(d.getDate())}.${zz(d.getMonth() + 1)}., ${zz(d.getHours())}:${zz(d.getMinutes())}`; +} + +// ---------------------------------------------------------------- Text + +export const esc = (s) => String(s ?? "").replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c])); +export const mdInline = (s) => window.marked.parseInline(String(s ?? "")); +export const md = (s) => window.marked.parse(String(s ?? ""), { gfm: true, breaks: true }); +export const ohneMd = (s) => String(s ?? "").replace(/\*\*|`/g, ""); + +export function slug(text) { + return String(text).toLowerCase() + .replace(/ä/g, "ae").replace(/ö/g, "oe").replace(/ü/g, "ue").replace(/ß/g, "ss") + .replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "abschnitt"; +} + +export const dokLink = (pfad, extra = "") => + `#/dok/${pfad.split("/").map(encodeURIComponent).join("/")}${extra}`; + +// ---------------------------------------------------------------- Formate und Kanäle + +const FORMAT_CODE = /\b(F\d{1,2}b?|CH|L[1-4])\b/g; +export const codes = (s) => [...new Set(String(s ?? "").match(FORMAT_CODE) || [])]; + +export const KANAL_KURZ = { + "Instagram": "IG", "Facebook": "FB", "TikTok": "TT", "YouTube Shorts": "YT", + "LinkedIn": "LI", "Instagram Stories": "ST", "intern": "IN", +}; +export const KANAL_FILTER = [ + ["alle", "Alle"], ["Instagram", "Instagram"], ["LinkedIn", "LinkedIn"], ["TikTok", "TikTok"], + ["Facebook", "Facebook"], ["YouTube Shorts", "YouTube Shorts"], ["Instagram Stories", "Stories"], ["intern", "intern"], +]; + +// Kanäle als graue Kürzel, der volle Name steht im Tooltip. +export function kanalBadges(kanaele) { + return `${kanaele.map((k) => KANAL_KURZ[k] || esc(k)).join(" ")}`; +} + +// Welche Art Beitrag ein Slot ist. Danach richtet sich die Farbe im Kalender. +export function art(slot) { + const k = slot.kanaele; + if (k.includes("intern")) return "intern"; + if (k.includes("Instagram Stories")) return "story"; + if (k.includes("LinkedIn")) return "linkedin"; + if (k.includes("TikTok") || k.includes("YouTube Shorts")) return "reel"; + return "carousel"; +} +export const ART_NAME = { carousel: "Carousel", reel: "Reel", linkedin: "LinkedIn", story: "Story", intern: "intern" }; + +// Funnel-Stufe eines Slots: am Slot gesetzt, sonst die des ersten Formats. +export const FUNNEL_NAME = { top: "Top", middle: "Middle", bottom: "Bottom" }; +export function funnel(s, plan) { + if (s.funnel) return s.funnel; + if (s.kanaele.includes("intern")) return null; + const code = codes(s.format)[0]; + const f = plan.formate.find((x) => x.kuerzel === code) || plan.linkedin.find((x) => x.kuerzel === code); + return f?.funnel || null; +} +export function funnelMix(slots, plan) { + const z = { top: 0, middle: 0, bottom: 0 }; + for (const s of slots) { const f = funnel(s, plan); if (f) z[f] += 1; } + const n = z.top + z.middle + z.bottom; + const pz = (k) => (n ? Math.round((z[k] / n) * 100) : 0); + return { n, top: pz("top"), middle: pz("middle"), bottom: pz("bottom") }; +} +// Ein Balken mit den drei Anteilen und der Zielspanne für Top. +export function funnelBalken(m, ziel) { + return ` + + ${ziel ? `` : ""} + `; +} + +export const SLOT_STATUS = ["geplant", "fertig", "erschienen", "ausgefallen"]; +export const SCHRITT_STATUS = ["offen", "läuft", "erledigt", "später", "entfällt"]; + +// Status als Text mit einem kleinen Quadrat davor (Farbe und Füllung im Stylesheet). +export const pille = (status, text) => `${esc(text ?? status)}`; + +// "Dejan, auf Anfrage von Noah" ist eine Aufgabe von Dejan, nicht von Noah. +export const zustaendig = (schritt, name) => + new RegExp(`\\b${name}\\b`).test((schritt.wer || "").replace(/auf Anfrage von \S+/g, "")); + +export const istOffen = (s) => s.status === "offen" || s.status === "läuft"; + +// Kleine Liniengrafik ohne Bibliothek: eine Linie, der letzte Wert markiert. +export function verlaufSvg(werte, breite = 320, hoehe = 70) { + if (werte.length < 2) return ""; + const xs = werte.map((w) => tag(w.datum).getTime()); + const ys = werte.map((w) => w.wert); + const [x0, x1] = [Math.min(...xs), Math.max(...xs)]; + const y1 = Math.max(...ys) * 1.1; + const px = (x) => 3 + ((x - x0) / (x1 - x0 || 1)) * (breite - 6); + const py = (y) => hoehe - 3 - (y / (y1 || 1)) * (hoehe - 6); + const punkte = werte.map((w, i) => `${px(xs[i]).toFixed(1)},${py(ys[i]).toFixed(1)}`).join(" "); + const [lx, ly] = [px(xs.at(-1)), py(ys.at(-1))]; + return ` + + + ${werte.map((w, i) => `${ttmm(w.datum)}: ${w.wert}`).join("")} + + `; +} diff --git a/Dashboard/index.html b/Dashboard/index.html new file mode 100644 index 0000000..2f79caa --- /dev/null +++ b/Dashboard/index.html @@ -0,0 +1,33 @@ + + + + + +HiveGrid Marketing + + + + + + + +
+ + + + + diff --git a/Dashboard/seiten/dokumente.js b/Dashboard/seiten/dokumente.js new file mode 100644 index 0000000..88f095a --- /dev/null +++ b/Dashboard/seiten/dokumente.js @@ -0,0 +1,183 @@ +// Dokumente: alle Markdown-Dateien im Hub lesen und durchsuchen. + +import { S } from "../app.js"; +import { esc, md, slug, dokLink, zeitstempel } from "../hilfen.js"; + +const STANDARD = "Brainstorming Kickoff/Strategie/Content-Strategie.md"; + +// Reihenfolge der Ordner in der Liste: das, was man täglich braucht, zuerst. +const ORDNER = [ + ["Brainstorming Kickoff/Strategie", "Strategie"], + ["webinar", "Webinar"], + ["webinar/01-crm-marketing-vertrieb", "Webinar: CRM"], + ["webinar/02-automation", "Webinar: Automation"], + ["webinar/03-drumherum", "Webinar: Drumherum"], + ["webinar/04-ueberraschung", "Webinar: Überraschung"], + ["webinar/slides", "Webinar: Slides"], + ["Ressourcen", "Ressourcen"], + ["Ressourcen/Reel-Analyse", "Reel-Analyse"], + ["Ressourcen/Reel-Analyse/analysen", "Reel-Analysen"], + ["Brainstorming Kickoff/Kontext", "Kontext"], + ["Brainstorming Kickoff/Research", "Recherche"], + ["Brainstorming Kickoff", "Brainstorming Kickoff"], + ["", "Hub"], +]; + +let suche = { begriff: "", treffer: [], laeuft: null }; +const textCache = new Map(); + +async function dokText(pfad) { + const eintrag = S.dokumente.find((d) => d.pfad === pfad); + const zeit = eintrag?.zeit; + const alt = textCache.get(pfad); + if (alt && alt.zeit === zeit) return alt.text; + const r = await fetch("/" + pfad.split("/").map(encodeURIComponent).join("/"), { cache: "no-store" }); + if (!r.ok) throw new Error(`${pfad} nicht gefunden`); + const text = await r.text(); + textCache.set(pfad, { zeit, text }); + return text; +} + +// Kurze Titel für die Liste. "HiveGrid: " fällt weg, und bei Recherche und +// Auswertungen sagt der Ordner schon, worum es geht. +// Aus "Recherche zum Marketing-Brainstorming: Übersicht" wird "Übersicht". +const kurzTitel = (titel) => titel.replace(/^HiveGrid:\s*/, "").replace(/^(Recherche[^:]*|Auswertung):\s*/, ""); + +function liste(aktiv) { + if (suche.begriff.length >= 2) { + const n = suche.treffer.length; + const muster = new RegExp(suche.begriff.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "gi"); + return `
${n >= 300 ? "Über 300" : n} Treffer
+ ${suche.treffer.map((t) => ` + ${esc(kurzTitel(t.titel))}${t.ueberschrift ? `${esc(t.ueberschrift)}` : ""}${esc(t.text).replace(muster, (m) => `${m}`)}`).join("")}`; + } + const gruppen = new Map(ORDNER.map(([o]) => [o, []])); + for (const d of S.dokumente) { + if (!gruppen.has(d.ordner)) gruppen.set(d.ordner, []); + gruppen.get(d.ordner).push(d); + } + return [...gruppen.entries()].filter(([, l]) => l.length).map(([ordner, l]) => { + const name = (ORDNER.find(([o]) => o === ordner) || [, ordner.split("/").at(-1)])[1]; + return `
${esc(name)}
${l.map((d) => + `${esc(kurzTitel(d.titel))}`).join("")}`; + }).join(""); +} + +// Relative Links zwischen Markdown-Dateien bleiben im Dashboard. +function linksUmbiegen(wurzel, pfad) { + const basis = pfad.split("/").slice(0, -1); + wurzel.querySelectorAll("a[href]").forEach((a) => { + const href = a.getAttribute("href"); + if (/^(https?:|mailto:|#)/.test(href)) { + if (/^https?:/.test(href)) { a.target = "_blank"; a.rel = "noopener"; } + return; + } + const [ziel, anker] = href.split("#"); + const teile = [...basis]; + for (const t of decodeURIComponent(ziel).split("/")) { + if (t === "..") teile.pop(); + else if (t && t !== ".") teile.push(t); + } + const voll = teile.join("/"); + if (voll.endsWith(".md")) a.setAttribute("href", dokLink(voll, anker ? `?abschnitt=${encodeURIComponent(anker)}` : "")); + else a.setAttribute("href", "/" + teile.map(encodeURIComponent).join("/")); + }); +} + +function markieren(wurzel, begriff) { + if (!begriff) return null; + const quelle = esc(begriff).replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + // Ohne "g" zum Prüfen: ein globaler Ausdruck merkt sich die letzte Stelle + // und würde jeden zweiten Treffer überspringen. + const pruefen = new RegExp(begriff.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i"); + const gaenger = document.createTreeWalker(wurzel, NodeFilter.SHOW_TEXT); + const knoten = []; + while (gaenger.nextNode()) if (pruefen.test(gaenger.currentNode.nodeValue)) knoten.push(gaenger.currentNode); + let erster = null; + for (const k of knoten) { + const span = document.createElement("span"); + span.innerHTML = esc(k.nodeValue).replace(new RegExp(quelle, "gi"), (m) => `${m}`); + k.replaceWith(span); + erster = erster || span.querySelector("mark"); + } + return erster; +} + +export async function zeichnen(main, r) { + const pfad = r.rest.join("/") || STANDARD; + const abschnitt = r.query.get("abschnitt"); + const q = r.query.get("q"); + const eintrag = S.dokumente.find((d) => d.pfad === pfad); + + main.innerHTML = ` +
+
+ +
${liste(pfad)}
+
+
+
${esc(pfad)}${eintrag ? `, geändert am ${zeitstempel(eintrag.zeit)}` : ""}
+

Lade

+
+
`; + + const eingabe = main.querySelector("#dok-suche"); + eingabe.oninput = () => { + clearTimeout(suche.laeuft); + suche.laeuft = setTimeout(async () => { + suche.begriff = eingabe.value.trim(); + suche.treffer = suche.begriff.length >= 2 + ? await fetch(`/api/suche?q=${encodeURIComponent(suche.begriff)}`).then((x) => x.json()).catch(() => []) + : []; + main.querySelector("#dok-liste").innerHTML = liste(pfad); + }, 220); + }; + eingabe.onkeydown = (e) => { + if (e.key === "Escape") { eingabe.value = ""; eingabe.oninput(); e.stopPropagation(); } + }; + + const ziel = main.querySelector("#dok-text"); + let text; + try { + text = await dokText(pfad); + } catch (e) { + ziel.innerHTML = `

${esc(e.message)}

`; + return; + } + ziel.innerHTML = md(text); + ziel.querySelectorAll("table").forEach((t) => { + const rahmen = document.createElement("div"); + rahmen.className = "tabelle-rahmen"; + t.replaceWith(rahmen); + rahmen.appendChild(t); + }); + linksUmbiegen(ziel, pfad); + + const vergeben = new Set(); + const ueberschriften = [...ziel.querySelectorAll("h2, h3")]; + for (const h of ziel.querySelectorAll("h1, h2, h3, h4")) { + let id = slug(h.textContent); + while (vergeben.has(id)) id += "-1"; + vergeben.add(id); + h.id = id; + } + const kapitel = ueberschriften.filter((h) => h.tagName === "H2"); + if (kapitel.length > 2) { + const springe = main.querySelector("#springe"); + springe.innerHTML = ``; + const sel = springe.querySelector("select"); + sel.onchange = () => { + document.getElementById(sel.value)?.scrollIntoView({ behavior: "smooth", block: "start" }); + sel.value = ""; + }; + } + + let sprung = null; + if (abschnitt) { + const a = abschnitt.toLowerCase(); + sprung = [...ziel.querySelectorAll("h1, h2, h3, h4")].find((h) => h.id === slug(abschnitt) || h.textContent.trim().toLowerCase().startsWith(a)); + } + if (q) sprung = markieren(ziel, q) || sprung; + if (sprung) requestAnimationFrame(() => sprung.scrollIntoView({ block: q ? "center" : "start" })); +} diff --git a/Dashboard/seiten/formate.js b/Dashboard/seiten/formate.js new file mode 100644 index 0000000..ddecbfe --- /dev/null +++ b/Dashboard/seiten/formate.js @@ -0,0 +1,139 @@ +// Formate: Übersicht aus der Formatbibliothek, mit Nutzung im Redaktionsplan. + +import { S, schublade } from "../app.js"; +import { heute, kurzDatum, esc, md, mdInline, ohneMd, codes, dokLink, pille, FUNNEL_NAME } from "../hilfen.js"; + +const QUELLE = "Ressourcen/Formatbibliothek.md"; +let cache = { zeit: null, daten: null }; + +// Liest die Formatbibliothek: die Übersichtstabelle und die Abschnitte je Format. +export async function formatbibliothek() { + const zeit = S.stand?.dokumente; + if (cache.daten && cache.zeit === zeit) return cache.daten; + const text = await fetch("/" + QUELLE.split("/").map(encodeURIComponent).join("/"), { cache: "no-store" }).then((r) => r.text()); + + const abschnitte = {}; + const teile = text.split(/^## /m); + const vorspann = teile.shift(); + for (const t of teile) { + const kopf = t.slice(0, t.indexOf("\n")); + const rumpf = t.slice(t.indexOf("\n") + 1); + const m = kopf.match(/^(F\d{1,2}b?)\s/); + abschnitte[m ? m[1] : kopf.trim()] = { titel: kopf.trim(), rumpf }; + } + + const uebersicht = []; + const tabelle = (abschnitte["Übersicht"]?.rumpf || "").split("\n").filter((z) => /^\|\s*F\d/.test(z)); + for (const z of tabelle) { + const [code, name, herkunft, aufwand, konto, laenge, start] = z.split("|").slice(1, -1).map((x) => x.trim()); + uebersicht.push({ code, name, herkunft, aufwand, konto, laenge, start }); + } + cache = { zeit, daten: { vorspann, abschnitte, uebersicht } }; + return cache.daten; +} + +function nutzung(code) { + return S.slots.filter((s) => codes(s.format).includes(code) && s.status !== "ausgefallen"); +} + +// Wie das Format für Noah heißt, welche Funnel-Stufe es hat und wie das Thema darin vorkommt. +const planFormat = (code) => S.plan.formate.find((f) => f.kuerzel === code) || S.plan.linkedin.find((l) => l.kuerzel === code); +const noahName = (code) => planFormat(code)?.noah_name || ""; +const funnelZelle = (code) => (planFormat(code)?.funnel ? `${FUNNEL_NAME[planFormat(code).funnel]}` : ""); + +function imPlan(code, h) { + const im = nutzung(code); + const naechst = im.find((s) => s.datum >= h); + if (!im.length) return `nicht im Plan`; + return `${im.length} Mal${naechst ? `ab ${kurzDatum(naechst.datum)}` : ""}`; +} + +export async function zeichnen(main, r) { + const h = heute(); + const fb = await formatbibliothek(); + const liste = [...fb.uebersicht]; + // CH steht nur im Redaktionsplan, nicht in der Formatbibliothek. + for (const f of S.plan.formate) { + if (!liste.some((x) => x.code === f.kuerzel)) { + liste.push({ code: f.kuerzel, name: f.name, aufwand: f.aufwand === "mittel" ? "2" : f.aufwand === "leicht" ? "1" : "3", konto: "HiveGrid", start: "laut Redaktionsplan" }); + } + } + const allgemein = fb.abschnitte["Was für alle Reel-Formate gilt"]; + + const imPlanListe = liste.filter((f) => nutzung(f.code).length); + const rest = liste.filter((f) => !nutzung(f.code).length); + const aufwandText = (a) => ({ "1": "leicht", "2": "mittel", "3": "hoch", "1 bis 2": "leicht bis mittel" }[String(a)] || String(a)); + const zeile = (f, mitPlan) => ` + ${esc(f.code)} + ${esc(f.name)}${noahName(f.code) ? `Für Noah: ${esc(noahName(f.code))}` : ""} + ${funnelZelle(f.code)}${esc(aufwandText(f.aufwand))}${esc(f.konto || "")} + ${mitPlan ? `${imPlan(f.code, h)}` : `${esc(f.start || "")}`} + `; + + main.innerHTML = ` +
+

Formate

Ein Format ist eine wiederholbare Bauform. Alle Formate tragen dasselbe Thema.
+
Thema: ${esc(S.plan.thema.name)}
+ Formatbibliothek lesen +
+

Im Plan ${imPlanListe.length} Formate, zum Öffnen anklicken

+
+ + ${imPlanListe.map((f) => zeile(f, true)).join("")}
FormatFunnelAufwandKontoIm Plan
+
+
+
${rest.length} weitere Formate, noch nicht im Plan +
+ + ${rest.map((f) => zeile(f, false)).join("")}
FormatFunnelAufwandKontoStart
+
+
+ ${S.plan.ideen?.length ? `

Ideen-Pool zum Thema nicht fest im Plan, für Ausfälle und nach T5

+
+ + ${S.plan.ideen.map((i) => ` + + + + `).join("")}
IdeeFunnelAufwandBaut auf
${esc(i.name)}${esc(i.text)}${FUNNEL_NAME[i.funnel] || ""}${esc(i.aufwand)}${esc([i.aus === "neu" ? "neu" : i.aus, i.vorbild].filter(Boolean).join(", "))}
+
` : ""} +
+

LinkedIn-Postarten Text und Bild

+ ${S.plan.linkedin.map((l) => `
+ ${esc(l.kuerzel)}${esc(l.name)} +
Was dahinter steckt${mdInline(l.text)}
+ ${nutzung(l.kuerzel).length} Mal
`).join("")} +
+

Blickwinkel auf das eine Thema

+ ${S.plan.saeulen.map((s) => `
+ ${esc(s.kuerzel)}${esc(s.name)}${esc(s.text || "")} + ${S.slots.filter((x) => x.saeule === s.kuerzel).length} Slots
`).join("")} +
+
+ ${allgemein ? `
${esc(allgemein.titel)}
${md(allgemein.rumpf)}
` : ""} +

Woher die Formate kommen: Analyse der Inspo-Reels.

+ `; + + main.querySelectorAll("[data-format]").forEach((tr) => { + tr.onclick = () => { location.hash = `#/formate/${encodeURIComponent(tr.dataset.format)}`; }; + }); + + const code = r.rest[0]; + if (!code) return; + const abschnitt = fb.abschnitte[code]; + const eintrag = liste.find((f) => f.code === code); + const im = nutzung(code); + schublade(` +
Format
+

${esc(abschnitt ? abschnitt.titel : `${code} ${eintrag?.name || ""}`)}

+
${eintrag ? [`Aufwand ${esc(eintrag.aufwand)}`, eintrag.konto && esc(eintrag.konto), eintrag.laenge && esc(eintrag.laenge)].filter(Boolean).join(", ") + "." : ""}
+
+
Im Plan
${im.length ? im.map((s) => + `${kurzDatum(s.datum)}, ${esc(ohneMd(s.format))}${s.status !== "geplant" ? ` ${pille(s.status)}` : ""}`).join("
") : `nicht im festen Plan`}
+ ${planFormat(code)?.funnel ? `
Funnel
${funnelZelle(code)}
` : ""} + ${planFormat(code)?.thema ? `
Im Thema
${esc(planFormat(code).thema)}
` : ""} + ${noahName(code) ? `
Für Noah
${esc(noahName(code))}
` : ""} +
+
${abschnitt ? md(abschnitt.rumpf) : `

In der Formatbibliothek gibt es dazu keinen eigenen Abschnitt.

`}
+ `, { zurueck: "#/formate", breit: true }); +} diff --git a/Dashboard/seiten/plan.js b/Dashboard/seiten/plan.js new file mode 100644 index 0000000..ad4c43d --- /dev/null +++ b/Dashboard/seiten/plan.js @@ -0,0 +1,413 @@ +// Redaktionsplan als Kalender oder Liste, mit Filtern und einer Schublade je Slot. + +import { S, schublade, statusSetzen, meldung } from "../app.js"; +import { + heute, plus, montag, kw, ttmm, wt, kurzDatum, langDatum, spanne, abstand, + esc, mdInline, ohneMd, codes, kanalBadges, art, ART_NAME, KANAL_FILTER, SLOT_STATUS, pille, + funnel, funnelMix, funnelBalken, FUNNEL_NAME, +} from "../hilfen.js"; + +const SPEICHER = "hg-plan-2"; +const zustand = { ansicht: "kalender", kanal: "alle", saeule: "alle", funnel: "alle", roadmap: false }; +try { Object.assign(zustand, JSON.parse(localStorage.getItem(SPEICHER) || "{}")); } catch { /* egal */ } +const merken = () => { try { localStorage.setItem(SPEICHER, JSON.stringify(zustand)); } catch { /* egal */ } }; + +function sichtbar(s) { + if (zustand.kanal !== "alle" && !s.kanaele.includes(zustand.kanal)) return false; + if (zustand.saeule !== "alle" && s.saeule !== zustand.saeule) return false; + if (zustand.funnel !== "alle" && funnel(s, S.plan) !== zustand.funnel) return false; + return true; +} +const amTag = (s, d) => s.datum === d || (s.bis && s.datum <= d && s.bis >= d); + +function eintrag(s) { + return ``; +} + +function roadmapEintraege(d) { + if (!zustand.roadmap) return ""; + const faellig = S.schritte.filter((s) => s.faellig === d && s.status !== "später" && s.status !== "entfällt"); + if (!faellig.length) return ""; + if (faellig.length > 2) { + const fertig = faellig.filter((s) => s.status === "erledigt").length; + return ` + ${faellig.length} Roadmap-Schritte fällig, ${fertig} erledigt`; + } + return faellig.map((s) => ` + ${esc(s.id)} ${esc(s.kurz)}${s.status === "erledigt" ? ", erledigt" : ""}`).join(""); +} + +// ---------------------------------------------------------------- Kalender + +function kalender(h) { + const phasen = S.plan.phasen; + const erster = phasen[0].von; + const startM = montag(plus(erster, -7)); + const letzte = S.plan.pausen.length ? S.plan.pausen.at(-1).bis : phasen.at(-1).bis; + const spaetester = S.slots.length ? S.slots.at(-1).datum : letzte; + const endeM = montag(spaetester > letzte ? spaetester : letzte); + const vorbereitung = S.roadmap.zeitstrahl.find((z) => z.von <= startM && z.bis >= startM); + + let html = `
${["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"].map((t) => `
${t}
`).join("")}
`; + let block = null; + for (let m = startM; m <= endeM; m = plus(m, 7)) { + const so = plus(m, 6); + const phase = phasen.find((p) => m >= p.von && m <= p.bis); + const pause = S.plan.pausen.find((p) => m >= montag(p.von) && m <= p.bis); + const neu = phase ? `p${phase.nr}` : pause ? "pause" : m < erster ? "vor" : "nach"; + if (neu !== block) { + block = neu; + if (phase) html += `
Phase ${phase.nr}, ${esc(phase.name)}${spanne(phase.von, phase.bis)}${esc(phase.text)}
`; + else if (pause) html += `
${esc(pause.titel)}${spanne(pause.von, pause.bis)}${esc(pause.text)}
`; + else if (neu === "vor") html += `
Vorbereitung${vorbereitung ? esc(ohneMd(vorbereitung.text).replace(/^Vorbereitung:\s*/, "")) : "Kanäle anlegen"}
`; + else html += `
Nach dem Plan
`; + } + const info = S.plan.wochen.find((w) => w.kw === kw(m)) || {}; + const diese = h >= m && h <= so; + if (pause) { + html += `
KW ${kw(m)}
${spanne(m, so)}
+
${esc(pause.titel)}${tageMitSlots(m)}
`; + continue; + } + html += `
KW ${kw(m)}
+
${spanne(m, so)}
${info.titel ? `
${esc(info.titel)}
` : ""}
`; + for (let i = 0; i < 7; i++) { + const d = plus(m, i); + const slots = S.slots.filter((s) => amTag(s, d) && sichtbar(s)); + html += `
+
${ttmm(d)}${d === h ? " heute" : ""}
${slots.map(eintrag).join("")}${roadmapEintraege(d)}
`; + } + html += `
`; + } + if (S.plan.ausblick) { + const a = S.plan.ausblick; + html += `
${esc(a.titel)}${a.punkte.map((p) => esc(p)).join(" ")}
`; + } + return `
${html}
`; +} + +// In einer Pausenwoche stehen keine festen Slots. Falls doch einer dort landet, nicht verschlucken. +function tageMitSlots(m) { + const slots = S.slots.filter((s) => s.datum >= m && s.datum <= plus(m, 6) && sichtbar(s)); + return slots.length ? `
${slots.map(eintrag).join("")}
` : ""; +} + +// ---------------------------------------------------------------- Liste + +function tabelle(slots, h) { + return `
+ + ${slots.map((s) => ` + + + + + + + + `).join("")}
DatumFormatKanäleBlickwinkelFunnelNotizStatus
${s.bis ? `${kurzDatum(s.datum)} bis ${kurzDatum(s.bis)}` : kurzDatum(s.datum)}${mdInline(s.format)}${kanalBadges(s.kanaele)}${esc(S.plan.saeulen.find((x) => x.kuerzel === s.saeule)?.name || s.saeule)}${funnel(s, S.plan) ? `${FUNNEL_NAME[funnel(s, S.plan)]}` : ""}${mdInline(s.notiz)}${pille(s.status)}
`; +} + +function wochen(slots, h) { + const nach = new Map(); + for (const s of slots) { + const m = montag(s.datum); + if (!nach.has(m)) nach.set(m, []); + nach.get(m).push(s); + } + return [...nach.entries()].map(([m, liste]) => { + const info = S.plan.wochen.find((w) => w.kw === kw(m)) || {}; + return `
KW ${kw(m)}${info.titel ? `, ${esc(info.titel)}` : ""}${spanne(m, plus(m, 6))}
+ ${info.text ? `

${esc(info.text)}

` : ""}${tabelle(liste, h)}`; + }).join(""); +} + +function liste(h) { + const slots = S.slots.filter(sichtbar); + const vergeben = new Set(); + let html = ""; + S.plan.phasen.forEach((p) => { + const drin = slots.filter((s) => s.datum >= p.von && s.datum <= p.bis); + drin.forEach((s) => vergeben.add(s.id)); + html += `

Phase ${p.nr}, ${esc(p.name)}${spanne(p.von, p.bis)}

+

${esc(p.text)}

${wochen(drin, h) || `
Keine Slots mit diesem Filter.
`}
`; + }); + const rest = slots.filter((s) => !vergeben.has(s.id)); + if (rest.length) html += `

Weitere Slots

${wochen(rest, h)}
`; + for (const p of S.plan.pausen) html += `

${esc(p.titel)}${spanne(p.von, p.bis)}

${esc(p.text)}

`; + if (S.plan.ausblick) { + const a = S.plan.ausblick; + html += `

${esc(a.titel)}

${a.punkte.map((p) => `

${mdInline(p)}

`).join("")}
`; + } + return html; +} + +// ---------------------------------------------------------------- Schublade + +function naechsterWerktag(d) { + let x = plus(d, 1); + while (["Sa", "So"].includes(wt(x))) x = plus(x, 1); + return x; +} + +function formatText(code) { + const f = S.plan.formate.find((x) => x.kuerzel === code); + const l = S.plan.linkedin.find((x) => x.kuerzel === code); + if (l) return `

${esc(code)} ${esc(l.name)}

${mdInline(l.text)}

`; + if (f) return `

${esc(code)} ${esc(f.name)}

Aufwand ${esc(f.aufwand)}. In der Formatbibliothek lesen

`; + return `

${esc(code)} in der Formatbibliothek lesen

`; +} + +function slotSchublade(s, h) { + const phase = S.plan.phasen.find((p) => s.datum >= p.von && s.datum <= p.bis); + const info = S.plan.wochen.find((w) => w.kw === kw(s.datum)) || {}; + const saeule = S.plan.saeulen.find((x) => x.kuerzel === s.saeule); + const reihe = S.slots.filter(sichtbar); + const i = reihe.findIndex((x) => x.id === s.id); + const vor = i > 0 ? reihe[i - 1] : null; + const nach = i >= 0 && i < reihe.length - 1 ? reihe[i + 1] : null; + + // L1 nimmt das Carousel der Vorwoche. Die Notiz nennt das Datum, daraus wird ein Link. + let grundlage = ""; + const vom = s.notiz.match(/Carousel vom (\d{2})\.(\d{2})\./); + if (vom) { + const quelle = S.slots.find((x) => x.datum.endsWith(`-${vom[2]}-${vom[1]}`) && art(x) === "carousel"); + if (quelle) grundlage = `
Grundlage
${kurzDatum(quelle.datum)}, ${esc(ohneMd(quelle.format))} ${pille(quelle.status)}
`; + } + // Umgekehrt: wird dieses Carousel später als L1 verwertet? + let verwertet = ""; + if (art(s) === "carousel") { + const nutzer = S.slots.filter((x) => x.notiz.includes(`Carousel vom ${ttmm(s.datum)}`)); + if (nutzer.length) verwertet = `
Wiederverwertet
${nutzer.map((x) => `${kurzDatum(x.datum)}, ${esc(ohneMd(x.format))}`).join("
")}
`; + } + const zeiten = [...new Set(s.kanaele.map((k) => S.plan.uhrzeiten?.[k] ? `${k === "LinkedIn" ? "LinkedIn" : "Instagram und Co."} um ${S.plan.uhrzeiten[k]}` : null).filter(Boolean))]; + + schublade(` +
KW ${kw(s.datum)}${info.titel ? `, ${esc(info.titel)}` : ""}${phase ? `. Phase ${phase.nr}, ${esc(phase.name)}` : ""}
+

${esc(ohneMd(s.format))}

+
${langDatum(s.datum)}${s.bis ? ` bis ${langDatum(s.bis)}` : ""}, ${abstand(h, s.datum)}. ${ART_NAME[art(s)]}.
+
+
Status
${SLOT_STATUS.map((st) => ``).join("")}
+
Kanäle
${esc(s.kanaele.join(", "))}${zeiten.length ? `${esc(zeiten.join(", "))}` : ""}
+ ${codes(s.format).length ? `
Format
${codes(s.format).map(formatText).join("")}
` : ""} + ${s.saeule ? `
Blickwinkel
${saeule ? `${esc(saeule.name)}${esc(saeule.text)}` : esc(s.saeule === "offen" ? "Meister oder Nerds, je nach Trend, immer im Thema" : s.saeule)}
` : ""} + ${funnel(s, S.plan) ? `
Funnel
${FUNNEL_NAME[funnel(s, S.plan)]}${esc(S.plan.funnel.stufen.find((x) => x.id === funnel(s, S.plan))?.text || "")}
` : ""} + ${s.notiz ? `
Notiz
${mdInline(s.notiz)}
` : ""} + ${s.noah ? `
Für Noah
${esc(s.noah)}
` : ""} + ${grundlage}${verwertet} +
Kennung
${esc(s.id)}Zum Ändern Claude sagen, zum Beispiel „Schieb ${esc(s.id)} auf ${kurzDatum(naechsterWerktag(s.datum))}“
+
+
+ ${vor ? `Vorher: ${kurzDatum(vor.datum)}` : ""} + ${nach ? `Danach: ${kurzDatum(nach.datum)}` : ""} +
+ `, { zurueck: "#/plan" }).querySelectorAll("[data-status]").forEach((b) => { + b.onclick = () => statusSetzen("redaktionsplan", s.id, b.dataset.status); + }); +} + +// ---------------------------------------------------------------- Funnel + +// Mix je Phase und gesamt, mit der Zielspanne für Top (Vorgabe Noah). +function funnelBlock() { + const p = S.plan; + const ziel = p.funnel.ziel_top; + // Noahs Vorgabe gilt für die Reels. Der Mix aller Beiträge steht klein daneben. + const posts = (von, bis) => S.slots.filter((s) => s.datum >= von && s.datum <= bis); + const reels = (liste) => liste.filter((s) => art(s) === "reel"); + const zeilen = [ + ...p.phasen.map((ph) => [`Phase ${ph.nr}`, posts(ph.von, ph.bis)]), + ["Gesamt", S.slots], + ]; + return `
+

Funnel der Reels ${esc(p.funnel.ziel_text)}

+ ${zeilen.map(([name, liste]) => { + const m = funnelMix(reels(liste), p); + const alle = funnelMix(liste, p); + return `
+ ${esc(name)}${funnelBalken(m, ziel)} + Top ${m.top} %, Middle ${m.middle} %, Bottom ${m.bottom} % + alle Beiträge: Top ${alle.top} %, Middle ${alle.middle} %, Bottom ${alle.bottom} %
`; + }).join("")} +
${p.funnel.stufen.map((f) => `${esc(f.name)} ${esc(f.kurz || "")}`).join("")}
+
`; +} + +// ---------------------------------------------------------------- Export + +// Was Noah immer wieder will: der Plan für einen Zeitraum, ohne Codes, +// interne Termine und Säulen. Der Server baut die Datei und legt sie in +// den Downloads-Ordner. +const ausfuhr = { von: null, bis: null, format: "pdf", ideen: false, ergebnis: null, laeuft: false }; + +function vorlagen(h) { + const m = montag(h); + const posts = S.slots.filter((s) => !s.kanaele.includes("intern")); + return [ + ["Diese Woche", m, plus(m, 6)], + ["Nächste Woche", plus(m, 7), plus(m, 13)], + ["Nächste 2 Wochen", plus(m, 7), plus(m, 20)], + ["Nächste 4 Wochen", plus(m, 7), plus(m, 34)], + ["Ganzer Plan", posts[0]?.datum || m, S.plan.phasen.at(-1).bis], + ]; +} + +function imZeitraum(von, bis) { + return S.slots.filter((s) => !s.kanaele.includes("intern") && s.status !== "ausgefallen" && (s.bis || s.datum) >= von && s.datum <= bis); +} + +function exportSchublade(h) { + const v = vorlagen(h); + if (!ausfuhr.von) [, ausfuhr.von, ausfuhr.bis] = v[2]; + const gueltig = ausfuhr.von && ausfuhr.bis && ausfuhr.von <= ausfuhr.bis; + const drin = gueltig ? imZeitraum(ausfuhr.von, ausfuhr.bis) : []; + const wochen = [...new Set(drin.map((s) => kw(s.datum)))]; + const el = schublade(` +
Redaktionsplan
+

Exportieren

+
Für Noah: welcher Content wann auf welchen Kanälen kommt. Ohne Codes, interne Termine und Säulen.
+
+
Zeitraum
+
${v.map(([name, a, b], i) => ``).join("")}
+
+ + +
+
+
Enthält
${!gueltig ? `Das Ende liegt vor dem Anfang.` + : drin.length ? `${drin.length} ${drin.length === 1 ? "Beitrag" : "Beiträge"}${wochen.length > 1 ? `KW ${wochen[0]} bis KW ${wochen.at(-1)}` : `KW ${wochen[0]}`}, ${kurzDatum(drin[0].datum)} bis ${kurzDatum(drin.at(-1).datum)}` + : `Kein Beitrag in diesem Zeitraum.`}
+
Format
${[["pdf", "PDF"], ["html", "HTML"], ["md", "Markdown"]].map(([w, t]) => + ``).join("")}
+
Dazu
+ ${S.plan.ideen?.length || 0} Ideen aus dem Pool, mit Funnel
+
+
+ + Landet in deinem Downloads-Ordner. +
+ ${ausfuhr.ergebnis ? `
+
Gespeichert${esc(ausfuhr.ergebnis.name)}
+
+
` : ""} + `, { zurueck: "#/plan" }); + + const neu = () => { ausfuhr.ergebnis = null; exportSchublade(h); }; + el.querySelectorAll("[data-vorlage]").forEach((b) => { + b.onclick = () => { [, ausfuhr.von, ausfuhr.bis] = v[Number(b.dataset.vorlage)]; neu(); }; + }); + el.querySelector("#ex-von").onchange = (e) => { ausfuhr.von = e.target.value; neu(); }; + el.querySelector("#ex-bis").onchange = (e) => { ausfuhr.bis = e.target.value; neu(); }; + el.querySelectorAll("[data-format]").forEach((b) => { + b.onclick = () => { ausfuhr.format = b.dataset.format; neu(); }; + }); + el.querySelector("#ex-ideen").onchange = (e) => { ausfuhr.ideen = e.target.checked; neu(); }; + el.querySelector("#ex-los").onclick = async () => { + ausfuhr.laeuft = true; + ausfuhr.ergebnis = null; + exportSchublade(h); + try { + const r = await fetch("/api/export", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ von: ausfuhr.von, bis: ausfuhr.bis, format: ausfuhr.format, ideen: ausfuhr.ideen }), + }); + const j = await r.json(); + if (!r.ok || !j.ok) throw new Error(j.fehler || `Fehler ${r.status}`); + ausfuhr.ergebnis = j; + meldung("Export gespeichert"); + } catch (e) { + meldung(`Export fehlgeschlagen: ${e.message}`, true); + } + ausfuhr.laeuft = false; + if (location.hash === "#/plan/export") exportSchublade(h); + }; + const oeffnen = (zeigen) => fetch("/api/oeffnen", { + method: "POST", headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ pfad: ausfuhr.ergebnis.pfad, zeigen }), + }); + el.querySelector("[data-oeffnen]")?.addEventListener("click", () => oeffnen(false)); + el.querySelector("[data-zeigen]")?.addEventListener("click", () => oeffnen(true)); +} + +// ---------------------------------------------------------------- Seite + +export function zeichnen(main, r, { erstesMal } = {}) { + const h = heute(); + const p = S.plan; + const erster = S.slots.find((s) => !s.kanaele.includes("intern")); + const ende = p.phasen.at(-1).bis; + const anzahl = S.slots.filter((s) => !s.kanaele.includes("intern")).length; + + + main.innerHTML = ` +
+

Redaktionsplan

+
${erster ? ttmm(erster.datum) : ""} bis ${ttmm(ende)}${ende.slice(0, 4)}, ${anzahl} Beiträge. ${esc(p.status)} vom ${ttmm(p.stand)}${p.stand.slice(0, 4)}.
+
Thema: ${esc(p.thema.name)}
+
+
+ + +
+ Exportieren +
+
+
+ + + + ${zustand.ansicht === "kalender" ? `` : ""} +
+ ${["carousel", "reel", "linkedin", "story"].map((a) => `${ART_NAME[a]}`).join("")} +
+
+ ${funnelBlock()} + ${zustand.ansicht === "kalender" ? kalender(h) : liste(h)} + +

Flex-Slots hängen von anderen ab und erscheinen, wenn sie fertig sind

+
+ ${p.flex.map((f) => ` + `).join("")} +
Flex-SlotVon wemWenn er kommt
${esc(f.name)}${f.erschienen?.length ? `bisher ${f.erschienen.map(ttmm).join(", ")}` : ""}${esc(f.von)}${mdInline(f.dann)}
+ +

Entscheidungen und Tests

+
+ ${p.tests.map((t) => ` + + + `).join("")} +
WannTestFrageGrundlageErgebnis
${t.termine.length ? t.termine.map((d, i) => (i ? ttmm(d) : kurzDatum(d))).join(", ") : esc(t.wann || "offen")}${t.id.startsWith("T") ? esc(t.id) + " " : ""}${esc(t.titel)}${esc(t.frage)}${esc(t.grundlage)}${t.ergebnis ? mdInline(t.ergebnis) : `offen`}
+ `; + + main.querySelectorAll("[data-ansicht]").forEach((b) => { + b.onclick = () => { zustand.ansicht = b.dataset.ansicht; merken(); zeichnen(main, r); }; + }); + main.querySelectorAll("select[data-wahl]").forEach((sel) => { + sel.onchange = () => { zustand[sel.dataset.wahl] = sel.value; merken(); zeichnen(main, r); }; + }); + const rm = main.querySelector("[data-roadmap]"); + if (rm) rm.onchange = () => { zustand.roadmap = rm.checked; merken(); zeichnen(main, r); }; + main.querySelectorAll("[data-slot]").forEach((el) => { + el.onclick = () => { location.hash = `#/plan/${el.dataset.slot}`; }; + }); + + if (r.rest[0] === "export") exportSchublade(h); + const slot = r.rest[0] && S.slots.find((s) => s.id === r.rest[0]); + if (slot) { + main.querySelectorAll(`[data-slot="${slot.id}"]`).forEach((el) => el.classList.add("ausgewaehlt")); + slotSchublade(slot, h); + } + + // Beim ersten Öffnen zur laufenden Woche springen, wenn sie weiter unten liegt. + if (erstesMal) { + const teil = r.query.get("teil"); + const ziel = teil ? main.querySelector(`#${CSS.escape(teil)}`) : !slot && zustand.ansicht === "kalender" ? main.querySelector(".kal-woche.diese") : null; + if (ziel && (teil || ziel.getBoundingClientRect().top > window.innerHeight * 0.6)) { + requestAnimationFrame(() => ziel.scrollIntoView({ block: teil ? "start" : "center" })); + } + } +} diff --git a/Dashboard/seiten/roadmap.js b/Dashboard/seiten/roadmap.js new file mode 100644 index 0000000..85ba581 --- /dev/null +++ b/Dashboard/seiten/roadmap.js @@ -0,0 +1,114 @@ +// Roadmap: Zeitstrahl, Arbeitspakete, Status je Schritt. + +import { S, statusSetzen } from "../app.js"; +import { + heute, plus, tag, ttmm, kurzDatum, MON_KURZ, + esc, mdInline, ohneMd, zustaendig, istOffen, SCHRITT_STATUS, dokLink, +} from "../hilfen.js"; + +const SPEICHER = "hg-roadmap"; +const zustand = { person: "alle", status: "alle" }; +try { Object.assign(zustand, JSON.parse(localStorage.getItem(SPEICHER) || "{}")); } catch { /* egal */ } +const merken = () => { try { localStorage.setItem(SPEICHER, JSON.stringify(zustand)); } catch { /* egal */ } }; + +const ROADMAP_MD = "Brainstorming Kickoff/Strategie/Roadmap.md"; + +function passt(s) { + if (zustand.person !== "alle" && !zustaendig(s, zustand.person)) return false; + if (zustand.status === "offen" && !istOffen(s)) return false; + if (zustand.status === "erledigt" && s.status !== "erledigt") return false; + if (zustand.status === "später" && s.status !== "später") return false; + return true; +} + +function zeitstrahl(h) { + const eintraege = S.roadmap.zeitstrahl; + const von = eintraege[0].von.slice(0, 8) + "01"; + const ende = eintraege.at(-1).bis; + const bis = plus(`${ende.slice(0, 7)}-01`, 32).slice(0, 8) + "01"; + const gesamt = tag(bis) - tag(von); + const pos = (d) => Math.max(0, Math.min(100, ((tag(d) - tag(von)) / gesamt) * 100)); + + const monate = []; + for (let d = von; d < bis; d = plus(`${d.slice(0, 7)}-01`, 32).slice(0, 8) + "01") { + const m = Number(d.slice(5, 7)) - 1; + monate.push(`${MON_KURZ[m]}${m === 0 ? " " + d.slice(0, 4) : ""}`); + } + const zeilen = eintraege.map((z) => { + const a = pos(z.von); + const e = pos(plus(z.bis, 1)); + const klasse = z.offen ? "offen" : h > z.bis ? "vorbei" : h >= z.von ? "jetzt" : ""; + const text = ohneMd(z.text); + // Text rechts neben den Balken, außer der Balken reicht schon weit nach rechts. + const textStil = e < 60 ? `left:${e}%;max-width:${100 - e}%` : `right:${100 - a}%;max-width:${a}%;text-align:right;padding-left:0;padding-right:8px`; + return `
${esc(ohneMd(z.wann))}
+
+
${esc(text)}
`; + }).join(""); + const heuteLinie = h >= von && h < bis + ? `
` : ""; + return `

Zeitstrahl

${monate.join("")}
${zeilen}${heuteLinie}
`; +} + +const ABSCHNITT = { A: "A.", B1: "B1.", C: "C.", D: "D.", E: "E.", F: "F.", G: "G.", H: "H." }; + +function paket(p, h) { + const schritte = p.schritte.filter(passt); + if (!schritte.length) return ""; + const zaehlen = p.schritte.filter((s) => s.status !== "entfällt"); + const fertig = zaehlen.filter((s) => s.status === "erledigt").length; + const anteil = zaehlen.length ? Math.round((fertig / zaehlen.length) * 100) : 0; + return `
+

${esc(p.id)}${esc(p.titel)} + im Dokument

+
${fertig} von ${zaehlen.length} erledigt
+ ${schritte.map((s) => { + const ueber = istOffen(s) && s.faellig && s.faellig < h && !s.wiederkehrend; + return `
+ +
${esc(s.id)}
+
${esc(s.kurz)}
+
Details${s.abhaengig ? `, braucht ${esc(s.abhaengig)}` : ""}
${mdInline(s.text)}${s.voraussetzung ? ` Voraussetzung: ${esc(s.voraussetzung)}.` : ""}
+
${esc(s.wer || "")}
+
${s.faellig ? kurzDatum(s.faellig) : esc(s.wann || "")}${s.wiederkehrend ? `wiederkehrend` : ""}
+ +
`; + }).join("")} +
`; +} + +export function zeichnen(main) { + const h = heute(); + const r = S.roadmap; + const personen = ["alle", ...r.personen.map((p) => p.name)]; + const schalter = (gruppe, wert, text) => + ``; + const alle = S.schritte; + const offenZahl = alle.filter(istOffen).length; + const fertigZahl = alle.filter((s) => s.status === "erledigt").length; + const pakete = r.pakete.map((p) => paket(p, h)).join(""); + + main.innerHTML = ` +
+

Roadmap

+
${offenZahl} offen, ${fertigZahl} erledigt. ${esc(r.status)} vom ${ttmm(r.stand)}${r.stand.slice(0, 4)}.
+ Roadmap.md lesen +
+ ${zeitstrahl(h)} +
+
Wer${personen.map((p) => schalter("person", p, p === "alle" ? "Alle" : p)).join("")}
+
Status${[["alle", "Alle"], ["offen", "offen"], ["erledigt", "erledigt"], ["später", "später"]].map(([w, t]) => schalter("status", w, t)).join("")}
+
+ ${pakete || `
Keine Schritte mit diesem Filter.
`} + `; + + main.querySelectorAll("[data-gruppe]").forEach((b) => { + b.onclick = () => { zustand[b.dataset.gruppe] = b.dataset.wert; merken(); zeichnen(main); }; + }); + main.querySelectorAll("[data-haken]").forEach((box) => { + box.onchange = () => statusSetzen("roadmap", box.dataset.haken, box.checked ? "erledigt" : "offen"); + }); + main.querySelectorAll("select[data-status]").forEach((sel) => { + sel.onchange = () => statusSetzen("roadmap", sel.dataset.status, sel.value); + }); +} diff --git a/Dashboard/seiten/start.js b/Dashboard/seiten/start.js new file mode 100644 index 0000000..a932015 --- /dev/null +++ b/Dashboard/seiten/start.js @@ -0,0 +1,172 @@ +// Übersicht: was diese Woche ansteht, was als Nächstes kommt, was offen ist. + +import { S, statusSetzen } from "../app.js"; +import { + heute, plus, montag, kw, ttmm, wt, kurzDatum, tageZwischen, abstand, + esc, mdInline, ohneMd, kanalBadges, art, pille, zustaendig, istOffen, verlaufSvg, + WT_LANG, MONATE, tag, +} from "../hilfen.js"; + +export function aktuellePhase(h) { + const phasen = S.plan.phasen; + const p = phasen.find((x) => h >= x.von && h <= x.bis); + if (p) return `Phase ${p.nr}, ${p.name}`; + if (h < phasen[0].von) return "Vorbereitung"; + const pause = S.plan.pausen.find((x) => h >= x.von && h <= x.bis); + if (pause) return pause.titel; + return "nach dem Plan"; +} + +const istPost = (s) => !s.kanaele.includes("intern"); + +function slotZeile(s) { + return ` + ${esc(ohneMd(s.format))} + ${s.status !== "geplant" ? `${esc(s.status)}` : ""} + `; +} + +function aufgabe(s) { + return ``; +} + +// Viele Schritte an einem Tag: die ersten vier zeigen, den Rest zum Aufklappen. +function aufgaben(schritte) { + if (schritte.length <= 5) return schritte.map(aufgabe).join(""); + return schritte.slice(0, 4).map(aufgabe).join("") + + `
${schritte.length - 4} weitere Schritte${schritte.slice(4).map(aufgabe).join("")}
`; +} + +export function zeichnen(main) { + const h = heute(); + const d = tag(h); + const posts = S.slots.filter(istPost); + + // Zähler: vor dem ersten Beitrag zählt der Start, danach der nächste Beitrag. + const erschienen = posts.some((s) => s.status === "erschienen"); + const naechster = posts.find((s) => s.datum >= h && s.status !== "erschienen" && s.status !== "ausgefallen"); + let zaehler = `
Kein Beitrag mehr im Plan.
`; + if (naechster) { + const n = tageZwischen(h, naechster.datum); + const erst = !erschienen && naechster === posts[0]; + const was = `${kurzDatum(naechster.datum)}, ${esc(ohneMd(naechster.format))}`; + zaehler = n === 0 + ? `
Heute${erst ? "erscheint der erste Beitrag" : "erscheint"}:
${was}
` + : `
${n}${n === 1 ? "Tag" : "Tage"} bis zum ${erst ? "ersten" : "nächsten"} Beitrag
${was}
`; + } + + // Überfälliges + const ueberfaellig = S.schritte.filter((s) => istOffen(s) && s.faellig && s.faellig < h && !s.wiederkehrend); + const unmarkiert = posts.filter((s) => s.datum < h && (s.status === "geplant" || s.status === "fertig")); + let warnung = ""; + if (ueberfaellig.length || unmarkiert.length) { + warnung = `

Offen geblieben

+ ${ueberfaellig.length ? `
Roadmap, über dem Termin${ueberfaellig.map((s) => `${esc(s.id)} ${esc(s.kurz)}`).join(", ")}
` : ""} + ${unmarkiert.length ? `
Beiträge ohne Status${unmarkiert.map((s) => `${kurzDatum(s.datum)}`).join(", ")}
` : ""} +
`; + } + + // Diese Woche, Tag für Tag + const m = montag(h); + const tage = []; + for (let i = 0; i < 7; i++) { + const t = plus(m, i); + const slots = S.slots.filter((s) => s.datum === t || (s.bis && s.datum < t && s.bis >= t)); + const schritte = S.schritte.filter((s) => s.faellig === t && s.status !== "später" && s.status !== "entfällt"); + if (!slots.length && !schritte.length && t !== h) continue; + tage.push(`
+
${wt(t)} ${ttmm(t)}${t === h ? "heute" : abstand(h, t)}
+
${slots.map(slotZeile).join("")}${aufgaben(schritte)}${!slots.length && !schritte.length ? `Nichts geplant.` : ""}
+
`); + } + + // Als Nächstes + const kommende = posts.filter((s) => s.datum >= h && s.status !== "ausgefallen" && s.status !== "erschienen").slice(0, 7); + const naechste = kommende.map((s) => ` + ${kurzDatum(s.datum)} + ${esc(ohneMd(s.format))}${s.notiz ? `${mdInline(s.notiz)}` : ""} + ${kanalBadges(s.kanaele)} + `).join(""); + + // Entscheidungen + const tests = S.plan.tests.map((t) => ({ ...t, naechst: t.termine.find((x) => x >= h) || null })) + .filter((t) => t.naechst || !t.termine.length) + .sort((a, b) => (a.naechst || "9999").localeCompare(b.naechst || "9999")); + const testsHtml = tests.map((t) => `
+ ${t.naechst ? kurzDatum(t.naechst) : "offen"}${t.naechst ? abstand(h, t.naechst) : esc(t.wann || "")} + ${t.id.startsWith("T") ? esc(t.id) + " " : ""}${esc(t.titel)}${esc(t.frage)} + ${t.ergebnis ? `Ergebnis: ${mdInline(t.ergebnis)}` : ""} +
`).join(""); + + // Kanäle + const kanaeleHtml = S.kanaele.kanaele.map((k) => `
+ ${k.url ? `${esc(k.name)}` : `${esc(k.name)}`} + ${esc(k.notiz)}${k.schritt && k.status !== "aktiv" ? `, Schritt ${esc(k.schritt)}` : ""}${k.metricool ? ", in Metricool" : ""} + ${pille(k.status)} +
`).join(""); + + // Instagram + const verlauf = S.kanaele.follower_instagram; + const letzter = verlauf.at(-1); + const ns = S.kanaele.nordstern; + const instaHtml = letzter ? `
+ ${letzter.wert}Follower, ${letzter.wert - verlauf[0].wert} mehr als am ${ttmm(verlauf[0].datum)}
+ ${verlaufSvg(verlauf)} +
Stand ${ttmm(letzter.datum)}, aus Metricool.
+
Nordstern: ${esc(ns.name)}. ${ns.ziel ? `Ziel ${esc(ns.ziel)} pro Monat.` : esc(ns.hinweis)}
` : `
Noch keine Zahlen.
`; + + // Roadmap je Paket + const roadmapHtml = S.roadmap.pakete.map((p) => { + const zaehlen = p.schritte.filter((s) => s.status !== "entfällt"); + const fertig = zaehlen.filter((s) => s.status === "erledigt").length; + const anteil = zaehlen.length ? Math.round((fertig / zaehlen.length) * 100) : 0; + return ` + ${esc(p.id)} + ${esc(p.titel)} + ${fertig} von ${zaehlen.length} + `; + }).join(""); + + // Wer ist dran + const personenHtml = S.roadmap.personen.map((p) => { + const eigene = S.schritte.filter((s) => istOffen(s) && zustaendig(s, p.name)); + const n = eigene.filter((s) => s.faellig).sort((a, b) => a.faellig.localeCompare(b.faellig))[0]; + return `
+ ${esc(p.name)} + ${n ? `${esc(n.id)} ${esc(n.kurz)}, ${kurzDatum(n.faellig)}` : esc(p.zusatz || "nichts mit Termin")} + ${eigene.length} +
`; + }).join(""); + + main.innerHTML = ` +
+
KW ${kw(h)}, ${esc(aktuellePhase(h))}
+

${WT_LANG[d.getUTCDay()]}, ${d.getUTCDate()}. ${MONATE[d.getUTCMonth()]}

+
Thema: ${esc(S.plan.thema.name)}
+ ${zaehler} +
+ ${warnung} +
+

Diese Woche KW ${kw(h)}, ${ttmm(m)} bis ${ttmm(plus(m, 6))}

${tage.join("")}
+

Als Nächstes Redaktionsplan

${naechste || `
Nichts mehr geplant.
`}
+
+
+

Entscheidungen

${testsHtml || `
Keine offenen.
`}
+

Kanäle

${kanaeleHtml}
+

Instagram hivegrid.de

${instaHtml}
+
+
+

Roadmap alle Schritte

${roadmapHtml}
+

Wer ist dran offene Schritte

${personenHtml}
+
+ `; + + main.querySelectorAll("[data-schritt]").forEach((box) => { + box.onchange = () => statusSetzen("roadmap", box.dataset.schritt, box.checked ? "erledigt" : "offen"); + }); +} diff --git a/Dashboard/seiten/webinar.js b/Dashboard/seiten/webinar.js new file mode 100644 index 0000000..a5efd27 --- /dev/null +++ b/Dashboard/seiten/webinar.js @@ -0,0 +1,122 @@ +// Webinar: Stand, Unterlagen, Ablauf und alle Slides auf einen Blick. +// +// Stand, Unterlagen und Ablauf stehen in daten/webinar.json. Die Slides kommen +// direkt aus webinar/slides: Reihenfolge und Teile aus quelle/deck.json, die +// Titel aus den Slide-Dateien, die Bilder aus export/ (npm run export). + +import { S } from "../app.js"; +import { esc, langDatum, dokLink, pille } from "../hilfen.js"; + +const SLIDES = "/webinar/slides"; +const url = (pfad) => "/" + pfad.split("/").map(encodeURIComponent).join("/"); + +// Reihenfolge, Teile und Titel der Slides. Fehlt etwas, bleibt der Block leer +// statt die ganze Seite zu stören. +async function deckLesen() { + try { + const deck = await fetch(`${SLIDES}/quelle/deck.json`, { cache: "no-store" }).then((r) => r.json()); + const leser = new DOMParser(); + const titel = await Promise.all(deck.order.map(async (id) => { + const html = await fetch(`${SLIDES}/quelle/slides/${id}.html`, { cache: "no-store" }).then((r) => r.text()).catch(() => ""); + const doc = leser.parseFromString(html, "text/html"); + doc.querySelectorAll("aside").forEach((a) => a.remove()); + return (doc.querySelector("h1, h2")?.textContent || id).replace(/\s+/g, " ").trim(); + })); + const starts = Object.values(deck.sections || {}).map((s) => [s.start, s.description]); + const folien = deck.order.map((id, i) => ({ id, nr: i + 1, titel: titel[i] })); + return { folien, teile: starts }; + } catch { + return { folien: [], teile: [] }; + } +} + +function unterlage(u) { + const knoepfe = []; + if (u.art === "ansehen") knoepfe.push(`Ansehen`); + if (u.art === "laden") knoepfe.push(`Herunterladen`); + if (u.art === "extern") knoepfe.push(`Öffnen`); + if (u.art === "dok") knoepfe.push(`Lesen`); + if (u.pdf) knoepfe.push(`PDF`); + return `
+ ${esc(u.name)}${esc(u.text)} + ${knoepfe.join("")} +
`; +} + +function folienBlock(deck) { + if (!deck.folien.length) return `
Die Slides ließen sich nicht lesen.
`; + const gruppen = []; + for (const f of deck.folien) { + const teil = deck.teile.find(([start]) => start === f.id); + if (teil || !gruppen.length) gruppen.push({ name: teil ? teil[1] : "", folien: [] }); + gruppen.at(-1).folien.push(f); + } + return gruppen.map((g) => ` + ${g.name ? `
${esc(g.name)}
` : ""} +
${g.folien.map((f) => ` + + + ${f.nr}${esc(f.titel)} + `).join("")} +
`).join(""); +} + +export async function zeichnen(main) { + const w = S.webinar; + if (!w) { + main.innerHTML = `

Keine Webinar-Daten

daten/webinar.json fehlt.

`; + return; + } + const deck = await deckLesen(); + const nrVon = (id) => deck.folien.find((f) => f.id === id)?.nr; + const ablauf = w.ablauf.map((a, i) => { + const von = nrVon(a.start); + const bis = i + 1 < w.ablauf.length ? (nrVon(w.ablauf[i + 1].start) || 0) - 1 : deck.folien.length; + return { ...a, slides: von && bis ? (von === bis ? `${von}` : `${von} bis ${bis}`) : "" }; + }); + const fertig = w.schritte.filter((s) => s.status === "erledigt").length; + + main.innerHTML = ` +
+
${esc(w.plattform)}, ${w.termin ? esc(langDatum(w.termin)) : "Termin offen"}, ${esc(w.dauer)}
+

Webinar

+
${esc(w.titel)} ${esc(w.untertitel)}
+
Mit ${esc(w.sprecher)}. ${esc(w.stand_text)}
+ Präsentation ansehen +
+ +
+

Unterlagen

+
${w.unterlagen.map(unterlage).join("")}
+
+

Stand ${fertig} von ${w.schritte.length} erledigt

+
${w.schritte.map((s) => `
+ ${pille(s.status)} + ${esc(s.name)}${s.notiz ? `${esc(s.notiz)}` : ""} +
`).join("")}
+
+
+ +

Ablauf ${esc(w.dauer)}

+
+ + ${ablauf.map((a) => ` + + + + + + `).join("")} +
MinuteTeilWerKnackpunktSlides
${esc(a.minuten)}${esc(a.teil)}${esc(a.wer)}${esc(a.knackpunkt)}${esc(a.slides)}
+
+ +

Slides ${deck.folien.length} Slides, zum Öffnen anklicken

+ ${folienBlock(deck)} +
+ +

Noch offen

+
${w.offen.map((o) => `
${esc(o)}
`).join("")}
+
+ +

Stand ${esc(w.stand.split("-").reverse().join("."))}. Neu bauen: im Ordner webinar/slides npm run export, das Skript-PDF mit node skript-pdf.mjs HiveGrid-Webinar-Skript.pdf --quelle Skript-kurz.md --fuer-noah im Ordner webinar.

`; +} diff --git a/Dashboard/stil.css b/Dashboard/stil.css new file mode 100644 index 0000000..084c8d4 --- /dev/null +++ b/Dashboard/stil.css @@ -0,0 +1,451 @@ +/* HiveGrid Marketing-Dashboard. + Ruhig und gegliedert: heller grauer Grund, Inhalte auf klar abgesetzten + weißen Flächen, große Schrift, wenig Text auf einmal. Keine Schatten, + keine Pillen, keine Symbole. Gelb nur für heute und den ersten Beitrag. */ + +@font-face { + font-family: Manrope; font-weight: 200 800; font-display: swap; + src: url(/Dashboard/assets/fonts/manrope-latin.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +@font-face { + font-family: Manrope; font-weight: 200 800; font-display: swap; + src: url(/Dashboard/assets/fonts/manrope-latin-ext.woff2) format("woff2"); + unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +:root { + --grund: #F2F2EE; + --flaeche: #FFFFFF; + --flaeche-2: #F8F8F5; + --rand: #E2E2DC; + --linie: #ECECE7; + --tinte: #1C1C1A; + --text: #2C2C29; + --grau: #686862; + --grau-2: #9A9A93; + --gold: #F1B729; + --gold-text: #8A6800; + --gold-hell: #FFF6DA; + + /* Arten von Beiträgen: kräftige Kante, helle Fläche */ + --carousel: #D9A21B; --carousel-hell: #FCF2D6; + --reel: #2C2C29; --reel-hell: #EDEDE9; + --linkedin: #0A66C2; --linkedin-hell: #E6EFFA; + --story: #B4366C; --story-hell: #F9E6EE; + --intern: #A2A29B; --intern-hell: transparent; + + --ok: #1E7A44; + --blau: #2457C5; + --rot: #B3261E; + --rot-hell: #FBEAE8; + color-scheme: light; +} + +* { box-sizing: border-box; } +html, body { min-height: 100%; } +body { + margin: 0; display: grid; grid-template-columns: 220px minmax(0, 1fr); + font-family: Manrope, system-ui, -apple-system, sans-serif; font-size: 15px; line-height: 1.55; + color: var(--text); background: var(--grund); + font-feature-settings: "tnum"; -webkit-font-smoothing: antialiased; +} +a { color: inherit; text-decoration-color: var(--rand); text-underline-offset: 3px; } +a:hover { text-decoration-color: var(--tinte); } +button { font: inherit; color: inherit; cursor: pointer; } +strong, b { font-weight: 750; color: var(--tinte); } +code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .85em; } +[hidden] { display: none !important; } +input[type="checkbox"] { accent-color: var(--tinte); width: 16px; height: 16px; margin: 0; cursor: pointer; } +select { + font: inherit; font-size: 14px; color: var(--tinte); background: var(--flaeche); + border: 1px solid var(--rand); border-radius: 4px; padding: 6px 8px; cursor: pointer; +} +select:hover { border-color: var(--grau-2); } +details > summary { cursor: pointer; color: var(--grau); font-size: 13.5px; list-style: none; } +details > summary::-webkit-details-marker { display: none; } +details > summary::before { content: "+"; display: inline-block; width: 14px; font-weight: 700; } +details[open] > summary::before { content: "\2212"; } +details > summary:hover { color: var(--tinte); } + +/* ---------------------------------------------------------------- Leiste */ + +.leiste { + position: sticky; top: 0; height: 100vh; overflow: auto; + background: var(--flaeche); border-right: 1px solid var(--rand); + display: flex; flex-direction: column; padding: 28px 16px 20px; +} +.marke { display: block; text-decoration: none; margin: 0 10px 32px; } +.marke img { width: 122px; height: auto; display: block; } +.marke span { display: block; margin-top: 6px; color: var(--grau); font-size: 13px; } +#navigation { display: flex; flex-direction: column; gap: 2px; } +#navigation a { display: flex; align-items: center; gap: 12px; padding: 9px 12px; text-decoration: none; color: var(--grau); font-size: 15.5px; border-radius: 5px; } +#navigation svg { width: 19px; height: 19px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; } +#navigation a:hover { color: var(--tinte); background: var(--flaeche-2); } +#navigation a.aktiv { color: var(--tinte); font-weight: 750; background: var(--grund); } +#navigation a.aktiv svg { stroke-width: 2.1; } +#navigation .vermerk { margin-left: auto; font-size: 12px; color: var(--gold-text); font-weight: 650; } +.leiste-fuss { margin: auto 10px 0; padding-top: 18px; border-top: 1px solid var(--linie); font-size: 13.5px; } +.leiste-fuss a { display: block; padding: 3px 0; color: var(--grau); text-decoration: none; } +#links a { display: flex; align-items: center; gap: 10px; padding: 5px 0; } +#links img, #links .ohne-logo { width: 20px; height: 20px; flex: none; border-radius: 5px; object-fit: contain; } +#links a.aus { opacity: .5; } +#links a.aus::after { content: "aus"; margin-left: auto; font-size: 12px; color: var(--grau-2); } +.leiste-fuss a:hover { color: var(--tinte); text-decoration: underline; } +.leiste-fuss .stand { margin-top: 12px; color: var(--grau-2); font-size: 12.5px; } + +/* ---------------------------------------------------------------- Inhalt */ + +main { min-width: 0; padding: 32px 40px 72px; outline: none; max-width: 1380px; } +.seitenkopf { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; flex-wrap: wrap; margin-bottom: 24px; } +.seitenkopf h1 { font-size: 32px; line-height: 1.1; margin: 0; font-weight: 800; letter-spacing: -.02em; color: var(--tinte); } +.seitenkopf .ueber { color: var(--grau); margin-bottom: 6px; font-size: 15px; } +.seitenkopf .unter { color: var(--grau); margin-top: 8px; } +.zaehler { + display: flex; align-items: center; gap: 14px; background: var(--flaeche); border: 1px solid var(--rand); border-radius: 6px; + padding: 12px 18px; +} +.zaehler b { font-size: 40px; line-height: 1; font-weight: 800; letter-spacing: -.03em; } +.zaehler span { color: var(--grau); line-height: 1.4; font-size: 14px; } +.zaehler a { color: var(--tinte); font-weight: 650; } + +.raster { display: grid; gap: 20px; margin-bottom: 20px; align-items: start; } +.r-2-1 { grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); } +.r-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } +.r-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } + +/* Die Fläche: alles, was zusammengehört, steht auf einer */ +.block { background: var(--flaeche); border: 1px solid var(--rand); border-radius: 6px; padding: 18px 22px 16px; min-width: 0; margin-bottom: 20px; } +.raster > .block { margin-bottom: 0; } +.block > h2 { + font-size: 16.5px; font-weight: 800; margin: 0 0 10px; display: flex; justify-content: space-between; align-items: baseline; gap: 12px; color: var(--tinte); +} +.block > h2 .neben { font-weight: 500; color: var(--grau); font-size: 13.5px; } +.block > h2 a.neben { text-decoration: underline; text-decoration-color: var(--rand); } +.block.warnung { border-color: #EBC2BD; background: var(--rot-hell); } +.block.warnung > h2 { color: var(--rot); } +.leer { color: var(--grau-2); padding: 8px 0; } +.klein { font-size: 13.5px; color: var(--grau); } +.muted { color: var(--grau-2); } + +/* Zeilen auf einer Fläche */ +.zeile { display: grid; gap: 14px; align-items: baseline; padding: 11px 0; border-top: 1px solid var(--linie); } +.block > h2 + .zeile, .zeilen > .zeile:first-child { border-top: 0; padding-top: 4px; } +.zeile .datum { font-weight: 750; white-space: nowrap; color: var(--tinte); } +.zeile .datum .klein { display: block; font-weight: 500; } +.zeile.heute .datum { color: var(--gold-text); } +.zeile.vorbei { color: var(--grau-2); } + +/* Werkzeugleiste */ +.schalterleiste { display: flex; flex-wrap: wrap; gap: 12px 22px; align-items: center; margin: 0 0 16px; } +.auswahl { display: inline-flex; align-items: center; gap: 8px; color: var(--grau); font-size: 14px; } +.schalter { display: inline-flex; background: var(--flaeche); border: 1px solid var(--rand); border-radius: 4px; padding: 3px; gap: 2px; } +.schalter .lbl { color: var(--grau-2); font-size: 13px; padding: 4px 8px; } +.schalter button { border: 0; background: none; padding: 5px 12px; color: var(--grau); font-size: 14px; border-radius: 3px; } +.schalter button:hover { color: var(--tinte); } +.schalter button.an { color: var(--tinte); font-weight: 700; background: var(--grund); } +.kreuz { display: inline-flex; gap: 8px; align-items: center; color: var(--grau); font-size: 14px; cursor: pointer; } +.knopf { + display: inline-block; border: 1px solid var(--tinte); background: var(--flaeche); color: var(--tinte); + padding: 8px 16px; font-weight: 700; font-size: 14px; text-decoration: none; border-radius: 4px; +} +.knopf:hover { background: var(--tinte); color: var(--flaeche); } +.knopf.voll { background: var(--tinte); color: var(--flaeche); } +.knopf.voll:hover { background: #333; } +.knopf[disabled] { opacity: .5; cursor: progress; } + +/* Kanäle als Kürzel, Status als Text mit kleinem Quadrat */ +.kn { font-size: 12px; letter-spacing: .05em; color: var(--grau-2); white-space: nowrap; font-weight: 650; } +.st { display: inline-flex; align-items: center; gap: 7px; font-size: 13.5px; color: var(--grau); white-space: nowrap; } +.st::before { content: ""; width: 9px; height: 9px; box-shadow: inset 0 0 0 1.5px var(--grau-2); flex: none; } +.st-fertig { color: var(--blau); } .st-fertig::before { background: var(--blau); box-shadow: none; } +.st-erschienen, .st-erledigt { color: var(--ok); } .st-erschienen::before, .st-erledigt::before { background: var(--ok); box-shadow: none; } +.st-ausgefallen, .st-entfällt { color: var(--rot); text-decoration: line-through; } .st-ausgefallen::before, .st-entfällt::before { background: var(--rot); box-shadow: none; } +.st-läuft { color: var(--gold-text); } .st-läuft::before { background: linear-gradient(90deg, var(--gold) 50%, transparent 50%); box-shadow: inset 0 0 0 1.5px var(--gold); } +.st-später { color: var(--grau-2); } +.st-aktiv { color: var(--ok); } .st-aktiv::before { background: var(--ok); box-shadow: none; } +.st-angelegt { color: var(--gold-text); } .st-angelegt::before { box-shadow: inset 0 0 0 1.5px var(--gold); } +.st-fehlt { color: var(--rot); } .st-fehlt::before { box-shadow: inset 0 0 0 1.5px var(--rot); } + +/* Art eines Beitrags */ +.art { display: inline-block; width: 10px; height: 10px; margin-right: 8px; background: var(--intern); vertical-align: 0; } +.art.carousel { background: var(--carousel); } .art.reel { background: var(--reel); } +.art.linkedin { background: var(--linkedin); } .art.story { background: var(--story); } +.code { font-weight: 800; color: var(--tinte); } +.id { font-weight: 700; font-size: 13px; color: var(--grau); } + +.legende { display: flex; flex-wrap: wrap; gap: 6px 22px; font-size: 13.5px; color: var(--grau); } + +/* Tabellen */ +.tab { overflow-x: auto; } +table.daten { width: 100%; border-collapse: collapse; font-size: 14.5px; } +table.daten th { text-align: left; font-weight: 650; color: var(--grau); font-size: 13px; padding: 4px 14px 10px 0; border-bottom: 1px solid var(--rand); white-space: nowrap; } +table.daten td { padding: 11px 14px 11px 0; border-bottom: 1px solid var(--linie); vertical-align: top; } +table.daten tr:last-child td { border-bottom: 0; } +table.daten tr.klickbar { cursor: pointer; } +table.daten tr.klickbar:hover td { background: var(--flaeche-2); } +table.daten tr.vorbei td { color: var(--grau-2); } +table.daten tr.heute td { background: var(--gold-hell); } +table.daten td.datum { white-space: nowrap; font-weight: 750; color: var(--tinte); } +table.daten td.datum.wichtig { color: var(--gold-text); } +.zwischentitel { margin: 22px 0 6px; font-size: 15px; font-weight: 800; color: var(--tinte); } +.zwischentitel:first-child { margin-top: 0; } +.zwischentitel .klein { font-weight: 500; margin-left: 10px; } +.phase-titel { margin: 0 0 4px; font-size: 20px; font-weight: 800; letter-spacing: -.01em; color: var(--tinte); } +.phase-titel .klein { font-weight: 500; font-size: 14px; margin-left: 10px; } +.phase-text { color: var(--grau); margin: 0 0 14px; } +h2.abschnitt { font-size: 20px; font-weight: 800; letter-spacing: -.01em; margin: 34px 0 12px; color: var(--tinte); } +h2.abschnitt .klein { font-weight: 500; font-size: 14px; margin-left: 10px; } + +/* Balken, Zahlen */ +.balken { height: 4px; background: var(--linie); border-radius: 2px; overflow: hidden; } +.balken > span { display: block; height: 100%; background: var(--tinte); } +.verlauf { width: 100%; height: auto; display: block; margin: 12px 0 8px; } +.gross { font-size: 44px; font-weight: 800; line-height: 1; letter-spacing: -.03em; color: var(--tinte); } + +/* ---------------------------------------------------------------- Kalender */ + +.kalender { background: var(--flaeche); border: 1px solid var(--rand); border-radius: 6px; overflow: hidden; margin-bottom: 20px; } +.kal-kopf, .kal-woche { display: grid; grid-template-columns: 128px repeat(5, minmax(0, 1fr)) repeat(2, minmax(0, .5fr)); } +.kal-kopf { position: sticky; top: 0; z-index: 2; background: var(--flaeche); border-bottom: 1px solid var(--rand); } +.kal-kopf div { padding: 10px 12px; font-size: 13.5px; font-weight: 700; color: var(--grau); } +.kal-phase { padding: 12px 16px; background: var(--flaeche-2); border-bottom: 1px solid var(--rand); display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 16px; } +.kal-phase b { font-size: 15.5px; font-weight: 800; } +.kal-phase .klein { color: var(--grau); } +.kal-woche { border-bottom: 1px solid var(--linie); min-height: 86px; } +.kal-woche:last-child { border-bottom: 0; } +.kal-kw { padding: 12px 12px 12px 16px; } +.kal-kw .nr { font-weight: 800; color: var(--tinte); } +.kal-kw .klein { font-size: 12.5px; } +.kal-kw .titel { display: block; width: fit-content; max-width: 100%; margin-top: 6px; font-size: 12.5px; line-height: 1.3; color: var(--gold-text); font-weight: 700; background: var(--gold-hell); padding: 2px 6px; border-radius: 3px; hyphens: auto; } +.kal-tag { padding: 8px 8px 10px; border-left: 1px solid var(--linie); min-width: 0; } +.kal-tag.we { background: var(--flaeche-2); } +.kal-tag .dnr { font-size: 13px; color: var(--grau-2); margin-bottom: 6px; } +.kal-tag.heute { background: var(--gold-hell); } +.kal-tag.heute .dnr { color: var(--gold-text); font-weight: 750; } +.kal-tag.vorbei .dnr { color: #BDBDB6; } +.kal-tag.vorbei .e { opacity: .55; } + +.e { + display: block; width: 100%; text-align: left; border: 0; padding: 6px 8px 6px 9px; margin: 0 0 6px; border-radius: 4px; + background: var(--intern-hell); border-left: 3px solid var(--intern); font-size: 13.5px; line-height: 1.3; min-width: 0; text-decoration: none; color: var(--tinte); +} +.e:hover { filter: brightness(.97); } +.e.carousel { background: var(--carousel-hell); border-left-color: var(--carousel); } +.e.reel { background: var(--reel-hell); border-left-color: var(--reel); } +.e.linkedin { background: var(--linkedin-hell); border-left-color: var(--linkedin); } +.e.story { background: var(--story-hell); border-left-color: var(--story); } +.e.intern { color: var(--grau); border: 1px dashed var(--rand); border-left: 3px solid var(--intern); } +.e.roadmap { background: none; border: 0; border-left: 3px solid var(--rand); color: var(--grau); font-size: 13px; } +.e.wichtig { box-shadow: inset 0 0 0 2px var(--gold); } +.e .f { font-weight: 700; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } +.e .u { display: flex; justify-content: space-between; gap: 6px; margin-top: 2px; } +.e .u:empty { display: none; } +.e .s { font-size: 12px; font-weight: 700; } +.e.st-erschienen .s { color: var(--ok); } .e.st-fertig .s { color: var(--blau); } .e.st-ausgefallen .s { color: var(--rot); } +.e.st-ausgefallen .f { text-decoration: line-through; } +.e.ausgewaehlt { outline: 2px solid var(--tinte); outline-offset: 1px; } + +/* ---------------------------------------------------------------- Schublade */ + +.schleier { position: fixed; inset: 0; background: rgba(28, 28, 26, .18); z-index: 20; } +.schublade { + position: fixed; top: 0; right: 0; bottom: 0; width: min(540px, 100vw); background: var(--flaeche); z-index: 21; + border-left: 1px solid var(--rand); overflow: auto; padding: 26px 30px 40px; +} +.schublade.breit { width: min(720px, 100vw); } +.schublade .zu { + position: absolute; top: 22px; right: 24px; border: 1px solid var(--rand); background: var(--flaeche); color: var(--grau); + font-size: 13.5px; padding: 5px 12px; border-radius: 4px; +} +.schublade .zu:hover { color: var(--tinte); border-color: var(--grau-2); } +.schublade .ueber { color: var(--grau); font-size: 13.5px; margin-right: 100px; } +.schublade h2 { margin: 8px 100px 6px 0; font-size: 25px; line-height: 1.2; font-weight: 800; letter-spacing: -.01em; color: var(--tinte); } +.schublade .unter { color: var(--grau); margin-bottom: 20px; } +.felder { display: grid; grid-template-columns: 100px minmax(0, 1fr); margin: 0; background: var(--flaeche-2); border: 1px solid var(--linie); border-radius: 6px; padding: 4px 16px; } +.felder dt, .felder dd { padding: 12px 0; border-bottom: 1px solid var(--linie); margin: 0; } +.felder dt:last-of-type, .felder dd:last-of-type { border-bottom: 0; } +.felder dt { color: var(--grau); font-size: 13.5px; padding-top: 13px; } +.felder dd p { margin: 0 0 4px; } +.felder dd .klein { display: block; margin-top: 4px; } +.felder .schalter { background: var(--flaeche); display: flex; flex-wrap: wrap; } +.felder .schalter button { padding: 4px 10px; font-size: 13.5px; } +.blaettern { display: flex; justify-content: space-between; gap: 12px; margin-top: 18px; font-size: 14px; } +.kennung { font-family: ui-monospace, Menlo, monospace; font-size: 13px; color: var(--tinte); } + +/* ---------------------------------------------------------------- Roadmap */ + +.zs-rahmen { position: relative; overflow: hidden; } +.zs-skala { position: relative; height: 28px; margin-left: 170px; } +.zs-skala span { position: absolute; top: 4px; font-size: 13px; color: var(--grau); padding-left: 6px; font-weight: 650; } +.zs-skala span::before { content: ""; position: absolute; left: 0; top: -4px; height: 1000px; border-left: 1px solid var(--linie); } +.zs-zeile { display: grid; grid-template-columns: 170px minmax(0, 1fr); align-items: center; min-height: 36px; border-top: 1px solid var(--linie); position: relative; } +.zs-zeile .wann { font-size: 14px; font-weight: 750; padding-right: 10px; color: var(--tinte); } +.zs-bahn { position: relative; height: 36px; } +.zs-balken { position: absolute; top: 12px; height: 12px; background: var(--reel); min-width: 4px; border-radius: 2px; } +.zs-balken.jetzt { background: var(--gold); } +.zs-balken.vorbei { background: var(--rand); } +.zs-balken.offen { background: none; box-shadow: inset 0 0 0 1.5px var(--grau-2); } +.zs-text { position: absolute; top: 9px; font-size: 13.5px; line-height: 18px; white-space: nowrap; color: var(--grau); padding-left: 10px; } +.zs-heute-linie { position: absolute; top: 0; bottom: 0; border-left: 2px solid var(--gold); pointer-events: none; z-index: 1; } + +.paket > h2 .pid { + display: inline-grid; place-items: center; min-width: 30px; height: 26px; margin-right: 10px; padding: 0 6px; + background: var(--grund); border-radius: 4px; font-size: 14px; color: var(--tinte); +} +.paket-unter { display: flex; gap: 14px; align-items: center; color: var(--grau); font-size: 13.5px; margin: 0 0 6px; } +.paket-unter .balken { width: 180px; } +.schritt { display: grid; grid-template-columns: 22px 44px minmax(0, 1fr) 170px 96px 110px; gap: 14px; align-items: center; padding: 10px 0; border-top: 1px solid var(--linie); } +.schritt .sid { font-weight: 700; color: var(--grau); font-size: 13.5px; } +.schritt .kurz { font-weight: 700; color: var(--tinte); } +.schritt details { margin-top: 2px; } +.schritt details > summary { font-size: 13px; } +.schritt .lang { color: var(--grau); font-size: 14px; margin-top: 6px; max-width: 680px; } +.schritt .lang p { margin: 0; } +.schritt .wer, .schritt .wann { font-size: 14px; color: var(--grau); } +.schritt .wann.ueberfaellig { color: var(--rot); font-weight: 700; } +.schritt.erledigt .kurz { text-decoration: line-through; color: var(--grau); } +.schritt.später, .schritt.entfällt { color: var(--grau-2); } + +/* ---------------------------------------------------------------- Dokumente */ + +.dok-rahmen { display: grid; grid-template-columns: 290px minmax(0, 1fr); gap: 20px; align-items: start; } +.dok-liste { position: sticky; top: 20px; max-height: calc(100vh - 40px); overflow: auto; } +.dok-liste input { + width: 100%; border: 1px solid var(--rand); border-radius: 4px; padding: 8px 10px; font: inherit; font-size: 14px; margin-bottom: 14px; background: var(--flaeche-2); +} +.dok-liste input:focus { outline: none; border-color: var(--tinte); background: var(--flaeche); } +.dok-ordner { font-size: 12.5px; font-weight: 750; color: var(--grau-2); margin: 18px 0 4px; letter-spacing: .02em; } +.dok-ordner:first-of-type { margin-top: 4px; } +.dok-link { + display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + padding: 6px 10px; margin: 0 -10px; text-decoration: none; color: var(--text); border-radius: 4px; font-size: 14.5px; line-height: 1.35; +} +.dok-link:hover { background: var(--flaeche-2); } +.dok-link.aktiv { background: var(--grund); font-weight: 750; color: var(--tinte); } +.treffer { display: block; padding: 10px 0; text-decoration: none; font-size: 13.5px; border-top: 1px solid var(--linie); color: var(--grau); } +.treffer:hover { color: var(--tinte); } +.treffer b { display: block; font-size: 14px; } +.treffer mark { background: var(--gold-hell); color: var(--tinte); } +.dok-inhalt { min-width: 0; padding: 30px 44px 44px; } +.springe { display: flex; justify-content: space-between; align-items: center; gap: 16px; flex-wrap: wrap; padding-bottom: 16px; margin-bottom: 22px; border-bottom: 1px solid var(--linie); } +.springe .pfad { font-size: 13px; color: var(--grau-2); } +.springe select { max-width: 340px; } + +/* Gerendertes Markdown */ +.md { font-size: 16px; line-height: 1.7; max-width: 760px; } +.md h1 { font-size: 30px; line-height: 1.15; margin: 0 0 18px; font-weight: 800; letter-spacing: -.02em; color: var(--tinte); } +.md h2 { font-size: 21px; margin: 40px 0 12px; padding-top: 22px; border-top: 1px solid var(--rand); font-weight: 800; color: var(--tinte); } +.md h3 { font-size: 17px; margin: 28px 0 8px; font-weight: 800; color: var(--tinte); } +.md h4 { font-size: 16px; margin: 22px 0 6px; font-weight: 800; } +.md p { margin: 8px 0 14px; } +.md ul, .md ol { padding-left: 22px; margin: 8px 0 14px; } +.md li { margin: 4px 0; } +.md blockquote { margin: 16px 0; padding: 12px 18px; background: var(--flaeche-2); border-left: 3px solid var(--gold); border-radius: 0 4px 4px 0; } +.md blockquote > :first-child { margin-top: 0; } .md blockquote > :last-child { margin-bottom: 0; } +.md hr { border: 0; border-top: 1px solid var(--linie); margin: 28px 0; } +.md .tabelle-rahmen { overflow-x: auto; margin: 12px 0 20px; border: 1px solid var(--linie); border-radius: 4px; } +.md table { border-collapse: collapse; width: 100%; font-size: 14px; line-height: 1.5; } +.md th { text-align: left; font-weight: 650; color: var(--grau); font-size: 13px; padding: 9px 12px; background: var(--flaeche-2); border-bottom: 1px solid var(--rand); } +.md td { padding: 9px 12px; border-bottom: 1px solid var(--linie); vertical-align: top; } +.md tr:last-child td { border-bottom: 0; } +.md a { text-decoration-color: var(--gold); text-decoration-thickness: 1.5px; } +.md code { background: var(--flaeche-2); padding: 1px 5px; border-radius: 3px; } +.md pre { background: var(--flaeche-2); padding: 14px; overflow: auto; font-size: 13px; border-radius: 4px; } +.md pre code { background: none; padding: 0; } +.md img { max-width: 100%; } +mark.fund { background: var(--gold); color: var(--tinte); padding: 0 2px; } + +/* ---------------------------------------------------------------- Übersicht */ + +.tagzeile { grid-template-columns: 84px minmax(0, 1fr); } +.tagzeile .e { margin-bottom: 6px; } +.aufgabe { display: grid; grid-template-columns: 20px 40px minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 5px 0; cursor: pointer; } +.aufgabe .wer { font-size: 13.5px; color: var(--grau-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 170px; } +.aufgabe:hover .was { text-decoration: underline; text-decoration-color: var(--grau-2); } +.aufgabe input:checked ~ .was { text-decoration: line-through; color: var(--grau-2); } +.tagzeile details { margin-top: 4px; } +.naechst { grid-template-columns: 82px minmax(0, 1fr) auto; text-decoration: none; align-items: center; } +.naechst:hover b { text-decoration: underline; } +.naechst .notiz { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-left: 18px; } +.naechst .notiz p { display: inline; margin: 0; } +.naechst.wichtig .datum { color: var(--gold-text); } + +/* ---------------------------------------------------------------- Meldung */ + +.meldung { position: fixed; left: 240px; bottom: 20px; background: var(--tinte); color: var(--flaeche); padding: 10px 16px; font-size: 14px; z-index: 40; border-radius: 4px; } +.meldung.fehler { background: var(--rot); } + +/* ---------------------------------------------------------------- Schmal */ + +@media (max-width: 1100px) { + .r-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + .schritt { grid-template-columns: 22px 44px minmax(0, 1fr) 96px 110px; } + .schritt .wer { display: none; } +} +@media (max-width: 900px) { + body { grid-template-columns: minmax(0, 1fr); } + .leiste { position: static; height: auto; overflow: visible; padding: 16px 12px 10px; border-right: 0; border-bottom: 1px solid var(--rand); } + .marke { margin: 0 6px 10px; } + .marke img { width: 100px; } + .marke span { display: none; } + #navigation { flex-direction: row; flex-wrap: wrap; } + #navigation a { padding: 6px 8px; font-size: 14.5px; gap: 8px; } + #navigation svg { width: 16px; height: 16px; } + .leiste-fuss { display: none; } + main { padding: 20px 14px 56px; } + .raster, .r-2-1, .r-2, .r-3 { grid-template-columns: minmax(0, 1fr); } + .dok-rahmen { grid-template-columns: minmax(0, 1fr); } + .dok-liste { position: static; max-height: none; } + .dok-inhalt { padding: 20px 18px; } + .kalender { overflow-x: auto; } + .kal-kopf, .kal-woche { min-width: 860px; } + .schritt { grid-template-columns: 22px 40px minmax(0, 1fr) 110px; } + .schritt .wann { display: none; } + .meldung { left: 14px; } + .tagzeile { grid-template-columns: 70px minmax(0, 1fr); } + .aufgabe { grid-template-columns: 20px 36px minmax(0, 1fr); } + .aufgabe .wer { display: none; } +} + +/* Export */ +.datumfelder { display: flex; flex-wrap: wrap; gap: 10px 16px; margin-top: 12px; color: var(--grau); font-size: 14px; } +.datumfelder label { display: inline-flex; align-items: center; gap: 8px; } +input[type="date"] { font: inherit; font-size: 14px; color: var(--tinte); background: var(--flaeche); border: 1px solid var(--rand); border-radius: 4px; padding: 5px 8px; } +input[type="date"]:focus { outline: none; border-color: var(--tinte); } +.ausfuehren { display: flex; gap: 14px; align-items: center; margin-top: 20px; } +.ergebnis { margin-top: 18px; padding: 14px 16px; border: 1px solid #BFE0CB; background: #EEF8F1; border-radius: 6px; display: grid; gap: 12px; } +.ergebnis .klein { display: block; margin-top: 2px; word-break: break-all; } +.ergebnis-knoepfe { display: flex; gap: 10px; flex-wrap: wrap; } + +/* Thema und Funnel */ +.thema { margin-top: 10px; color: var(--grau); font-size: 14px; } +.thema b { color: var(--gold-text); } +.fu { display: inline-block; font-size: 11.5px; font-weight: 750; padding: 0 6px; border-radius: 3px; line-height: 18px; } +.fu-top { background: #E7E7E2; color: #3A3A36; } +.fu-middle { background: #E6EFFA; color: #1F4F8F; } +.fu-bottom { background: #FCEFC7; color: #7A5A00; } +.e .fu { font-size: 10.5px; line-height: 16px; padding: 0 5px; background: rgba(255,255,255,.65); } +.funnel-block .fzeile { display: grid; grid-template-columns: 76px minmax(120px, 1fr) 300px; gap: 14px; align-items: center; padding: 6px 0; } +@media (max-width: 700px) { .funnel-block .fzeile { grid-template-columns: 64px 1fr; } .funnel-block .fwerte { grid-column: 1 / -1; white-space: normal; } } +.funnel-block .fname { font-weight: 700; color: var(--tinte); } +.funnel-block .fwerte { font-size: 13.5px; color: var(--grau); white-space: nowrap; } +.funnel-block .daneben .fwerte b { color: var(--rot); } +.fbalken { position: relative; display: flex; height: 12px; background: var(--linie); border-radius: 3px; overflow: hidden; } +.fbalken > span { height: 100%; } +.fbalken .fb-top { background: #3A3A36; } .fbalken .fb-middle { background: #7FA6D8; } .fbalken .fb-bottom { background: var(--gold); } +.fbalken .fb-ziel { position: absolute; top: 0; bottom: 0; box-shadow: inset 0 0 0 2px #fff; border-radius: 2px; pointer-events: none; } + +/* Webinar: Unterlagen mit Knöpfen rechts, Slides als Vorschaubilder */ +.zeile.unterlage { grid-template-columns: minmax(0, 1fr) auto; align-items: center; } +.zeile.unterlage .knoepfe { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } +.zeile.unterlage .knopf { padding: 6px 12px; font-size: 13.5px; } +.folien-teil { font-weight: 750; color: var(--tinte); font-size: 14px; margin: 18px 0 10px; } +.folien-teil:first-child { margin-top: 4px; } +.folien { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 16px 14px; } +.folie-vorschau { display: flex; flex-direction: column; gap: 7px; text-decoration: none; color: var(--text); font-size: 13.5px; line-height: 1.35; min-width: 0; } +.folie-vorschau img { width: 100%; aspect-ratio: 16 / 9; object-fit: cover; border: 1px solid var(--rand); border-radius: 4px; background: var(--flaeche-2); display: block; } +.folie-vorschau:hover img { border-color: var(--tinte); } +.folie-vorschau .nr { color: var(--grau-2); font-weight: 700; margin-right: 6px; } +@media (max-width: 700px) { .zeile.unterlage { grid-template-columns: minmax(0, 1fr); } .zeile.unterlage .knoepfe { justify-content: flex-start; } } + diff --git a/Dashboard/vendor/lucide-LICENSE.txt b/Dashboard/vendor/lucide-LICENSE.txt new file mode 100644 index 0000000..325e8ff --- /dev/null +++ b/Dashboard/vendor/lucide-LICENSE.txt @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/Dashboard/vendor/marked-LICENSE.md b/Dashboard/vendor/marked-LICENSE.md new file mode 100644 index 0000000..4bd2d4a --- /dev/null +++ b/Dashboard/vendor/marked-LICENSE.md @@ -0,0 +1,44 @@ +# License information + +## Contribution License Agreement + +If you contribute code to this project, you are implicitly allowing your code +to be distributed under the MIT license. You are also implicitly verifying that +all code is your original work. `` + +## Marked + +Copyright (c) 2018+, MarkedJS (https://github.com/markedjs/) +Copyright (c) 2011-2018, Christopher Jeffrey (https://github.com/chjj/) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +## Markdown + +Copyright © 2004, John Gruber +http://daringfireball.net/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name “Markdown� nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +This software is provided by the copyright holders and contributors “as is� and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. diff --git a/Dashboard/vendor/marked.min.js b/Dashboard/vendor/marked.min.js new file mode 100644 index 0000000..ab3027a --- /dev/null +++ b/Dashboard/vendor/marked.min.js @@ -0,0 +1,6 @@ +/** + * marked v14.0.0 - a markdown parser + * Copyright (c) 2011-2024, Christopher Jeffrey. (MIT Licensed) + * https://github.com/markedjs/marked + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).marked={})}(this,(function(e){"use strict";function t(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}function n(t){e.defaults=t}e.defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};const s=/[&<>"']/,r=new RegExp(s.source,"g"),i=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,l=new RegExp(i.source,"g"),o={"&":"&","<":"<",">":">",'"':""","'":"'"},a=e=>o[e];function c(e,t){if(t){if(s.test(e))return e.replace(r,a)}else if(i.test(e))return e.replace(l,a);return e}const h=/(^|[^\[])\^/g;function p(e,t){let n="string"==typeof e?e:e.source;t=t||"";const s={replace:(e,t)=>{let r="string"==typeof t?t:t.source;return r=r.replace(h,"$1"),n=n.replace(e,r),s},getRegex:()=>new RegExp(n,t)};return s}function u(e){try{e=encodeURI(e).replace(/%25/g,"%")}catch{return null}return e}const k={exec:()=>null};function g(e,t){const n=e.replace(/\|/g,((e,t,n)=>{let s=!1,r=t;for(;--r>=0&&"\\"===n[r];)s=!s;return s?"|":" |"})).split(/ \|/);let s=0;if(n[0].trim()||n.shift(),n.length>0&&!n[n.length-1].trim()&&n.pop(),t)if(n.length>t)n.splice(t);else for(;n.length0)return{type:"space",raw:t[0]}}code(e){const t=this.rules.block.code.exec(e);if(t){const e=t[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?e:f(e,"\n")}}}fences(e){const t=this.rules.block.fences.exec(e);if(t){const e=t[0],n=function(e,t){const n=e.match(/^(\s+)(?:```)/);if(null===n)return t;const s=n[1];return t.split("\n").map((e=>{const t=e.match(/^\s+/);if(null===t)return e;const[n]=t;return n.length>=s.length?e.slice(s.length):e})).join("\n")}(e,t[3]||"");return{type:"code",raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:n}}}heading(e){const t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(/#$/.test(e)){const t=f(e,"#");this.options.pedantic?e=t.trim():t&&!/ $/.test(t)||(e=t.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){const t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:f(t[0],"\n")}}blockquote(e){const t=this.rules.block.blockquote.exec(e);if(t){let e=f(t[0],"\n").split("\n"),n="",s="";const r=[];for(;e.length>0;){let t=!1;const i=[];let l;for(l=0;l/.test(e[l]))i.push(e[l]),t=!0;else{if(t)break;i.push(e[l])}e=e.slice(l);const o=i.join("\n"),a=o.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,"\n $1").replace(/^ {0,3}>[ \t]?/gm,"");n=n?`${n}\n${o}`:o,s=s?`${s}\n${a}`:a;const c=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(a,r,!0),this.lexer.state.top=c,0===e.length)break;const h=r[r.length-1];if("code"===h?.type)break;if("blockquote"===h?.type){const t=h,i=t.raw+"\n"+e.join("\n"),l=this.blockquote(i);r[r.length-1]=l,n=n.substring(0,n.length-t.raw.length)+l.raw,s=s.substring(0,s.length-t.text.length)+l.text;break}if("list"!==h?.type);else{const t=h,i=t.raw+"\n"+e.join("\n"),l=this.list(i);r[r.length-1]=l,n=n.substring(0,n.length-h.raw.length)+l.raw,s=s.substring(0,s.length-t.raw.length)+l.raw,e=i.substring(r[r.length-1].raw.length).split("\n")}}return{type:"blockquote",raw:n,tokens:r,text:s}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim();const s=n.length>1,r={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");const i=new RegExp(`^( {0,3}${n})((?:[\t ][^\\n]*)?(?:\\n|$))`);let l=!1;for(;e;){let n=!1,s="",o="";if(!(t=i.exec(e)))break;if(this.rules.block.hr.test(e))break;s=t[0],e=e.substring(s.length);let a=t[2].split("\n",1)[0].replace(/^\t+/,(e=>" ".repeat(3*e.length))),c=e.split("\n",1)[0],h=!a.trim(),p=0;if(this.options.pedantic?(p=2,o=a.trimStart()):h?p=t[1].length+1:(p=t[2].search(/[^ ]/),p=p>4?1:p,o=a.slice(p),p+=t[1].length),h&&/^ *$/.test(c)&&(s+=c+"\n",e=e.substring(c.length+1),n=!0),!n){const t=new RegExp(`^ {0,${Math.min(3,p-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),n=new RegExp(`^ {0,${Math.min(3,p-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),r=new RegExp(`^ {0,${Math.min(3,p-1)}}(?:\`\`\`|~~~)`),i=new RegExp(`^ {0,${Math.min(3,p-1)}}#`);for(;e;){const l=e.split("\n",1)[0];if(c=l,this.options.pedantic&&(c=c.replace(/^ {1,4}(?=( {4})*[^ ])/g," ")),r.test(c))break;if(i.test(c))break;if(t.test(c))break;if(n.test(e))break;if(c.search(/[^ ]/)>=p||!c.trim())o+="\n"+c.slice(p);else{if(h)break;if(a.search(/[^ ]/)>=4)break;if(r.test(a))break;if(i.test(a))break;if(n.test(a))break;o+="\n"+c}h||c.trim()||(h=!0),s+=l+"\n",e=e.substring(l.length+1),a=c.slice(p)}}r.loose||(l?r.loose=!0:/\n *\n *$/.test(s)&&(l=!0));let u,k=null;this.options.gfm&&(k=/^\[[ xX]\] /.exec(o),k&&(u="[ ] "!==k[0],o=o.replace(/^\[[ xX]\] +/,""))),r.items.push({type:"list_item",raw:s,task:!!k,checked:u,loose:!1,text:o,tokens:[]}),r.raw+=s}r.items[r.items.length-1].raw=r.items[r.items.length-1].raw.trimEnd(),r.items[r.items.length-1].text=r.items[r.items.length-1].text.trimEnd(),r.raw=r.raw.trimEnd();for(let e=0;e"space"===e.type)),n=t.length>0&&t.some((e=>/\n.*\n/.test(e.raw)));r.loose=n}if(r.loose)for(let e=0;e$/,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:e,raw:t[0],href:n,title:s}}}table(e){const t=this.rules.block.table.exec(e);if(!t)return;if(!/[:|]/.test(t[2]))return;const n=g(t[1]),s=t[2].replace(/^\||\| *$/g,"").split("|"),r=t[3]&&t[3].trim()?t[3].replace(/\n[ \t]*$/,"").split("\n"):[],i={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(const e of s)/^ *-+: *$/.test(e)?i.align.push("right"):/^ *:-+: *$/.test(e)?i.align.push("center"):/^ *:-+ *$/.test(e)?i.align.push("left"):i.align.push(null);for(let e=0;e({text:e,tokens:this.lexer.inline(e),header:!1,align:i.align[t]}))));return i}}lheading(e){const t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:"="===t[2].charAt(0)?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){const t=this.rules.block.paragraph.exec(e);if(t){const e="\n"===t[1].charAt(t[1].length-1)?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){const t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){const t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:c(t[1])}}tag(e){const t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&/^/i.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){const t=this.rules.inline.link.exec(e);if(t){const e=t[2].trim();if(!this.options.pedantic&&/^$/.test(e))return;const t=f(e.slice(0,-1),"\\");if((e.length-t.length)%2==0)return}else{const e=function(e,t){if(-1===e.indexOf(t[1]))return-1;let n=0;for(let s=0;s-1){const n=(0===t[0].indexOf("!")?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=""}}let n=t[2],s="";if(this.options.pedantic){const e=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(n);e&&(n=e[1],s=e[3])}else s=t[3]?t[3].slice(1,-1):"";return n=n.trim(),/^$/.test(e)?n.slice(1):n.slice(1,-1)),d(t,{href:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n,title:s?s.replace(this.rules.inline.anyPunctuation,"$1"):s},t[0],this.lexer)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){const e=t[(n[2]||n[1]).replace(/\s+/g," ").toLowerCase()];if(!e){const e=n[0].charAt(0);return{type:"text",raw:e,text:e}}return d(n,e,n[0],this.lexer)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s)return;if(s[3]&&n.match(/[\p{L}\p{N}]/u))return;if(!(s[1]||s[2]||"")||!n||this.rules.inline.punctuation.exec(n)){const n=[...s[0]].length-1;let r,i,l=n,o=0;const a="*"===s[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(a.lastIndex=0,t=t.slice(-1*e.length+n);null!=(s=a.exec(t));){if(r=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!r)continue;if(i=[...r].length,s[3]||s[4]){l+=i;continue}if((s[5]||s[6])&&n%3&&!((n+i)%3)){o+=i;continue}if(l-=i,l>0)continue;i=Math.min(i,i+l+o);const t=[...s[0]][0].length,a=e.slice(0,n+s.index+t+i);if(Math.min(n,i)%2){const e=a.slice(1,-1);return{type:"em",raw:a,text:e,tokens:this.lexer.inlineTokens(e)}}const c=a.slice(2,-2);return{type:"strong",raw:a,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(e){const t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(/\n/g," ");const n=/[^ ]/.test(e),s=/^ /.test(e)&&/ $/.test(e);return n&&s&&(e=e.substring(1,e.length-1)),e=c(e,!0),{type:"codespan",raw:t[0],text:e}}}br(e){const t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){const t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){const t=this.rules.inline.autolink.exec(e);if(t){let e,n;return"@"===t[2]?(e=c(t[1]),n="mailto:"+e):(e=c(t[1]),n=e),{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if("@"===t[2])e=c(t[0]),n="mailto:"+e;else{let s;do{s=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??""}while(s!==t[0]);e=c(t[0]),n="www."===t[1]?"http://"+t[0]:t[0]}return{type:"link",raw:t[0],text:e,href:n,tokens:[{type:"text",raw:e,text:e}]}}}inlineText(e){const t=this.rules.inline.text.exec(e);if(t){let e;return e=this.lexer.state.inRawBlock?t[0]:c(t[0]),{type:"text",raw:t[0],text:e}}}}const b=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,w=/(?:[*+-]|\d{1,9}[.)])/,m=p(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g,w).replace(/blockCode/g,/ {4}/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).getRegex(),y=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,$=/(?!\s*\])(?:\\.|[^\[\]\\])+/,z=p(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label",$).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),T=p(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,w).getRegex(),R="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",_=/|$))/,A=p("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))","i").replace("comment",_).replace("tag",R).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),S=p(y).replace("hr",b).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex(),I={blockquote:p(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",S).getRegex(),code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,def:z,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:b,html:A,lheading:m,list:T,newline:/^(?: *(?:\n|$))+/,paragraph:S,table:k,text:/^[^\n]+/},E=p("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",b).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex(),q={...I,table:E,paragraph:p(y).replace("hr",b).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",E).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex()},Z={...I,html:p("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",_).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:k,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:p(y).replace("hr",b).replace("heading"," *#{1,6} *[^\n]").replace("lheading",m).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},P=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,L=/^( {2,}|\\)\n(?!\s*$)/,Q="\\p{P}\\p{S}",v=p(/^((?![*_])[\spunctuation])/,"u").replace(/punctuation/g,Q).getRegex(),B=p(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/,"u").replace(/punct/g,Q).getRegex(),M=p("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])","gu").replace(/punct/g,Q).getRegex(),O=p("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])","gu").replace(/punct/g,Q).getRegex(),j=p(/\\([punct])/,"gu").replace(/punct/g,Q).getRegex(),D=p(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),C=p(_).replace("(?:--\x3e|$)","--\x3e").getRegex(),H=p("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",C).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),U=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,X=p(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label",U).replace("href",/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),F=p(/^!?\[(label)\]\[(ref)\]/).replace("label",U).replace("ref",$).getRegex(),N=p(/^!?\[(ref)\](?:\[\])?/).replace("ref",$).getRegex(),G={_backpedal:k,anyPunctuation:j,autolink:D,blockSkip:/\[[^[\]]*?\]\([^\(\)]*?\)|`[^`]*?`|<[^<>]*?>/g,br:L,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:k,emStrongLDelim:B,emStrongRDelimAst:M,emStrongRDelimUnd:O,escape:P,link:X,nolink:N,punctuation:v,reflink:F,reflinkSearch:p("reflink|nolink(?!\\()","g").replace("reflink",F).replace("nolink",N).getRegex(),tag:H,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\t+" ".repeat(n.length)));e;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some((n=>!!(s=n.call({lexer:this},e,t))&&(e=e.substring(s.raw.length),t.push(s),!0)))))if(s=this.tokenizer.space(e))e=e.substring(s.raw.length),1===s.raw.length&&t.length>0?t[t.length-1].raw+="\n":t.push(s);else if(s=this.tokenizer.code(e))e=e.substring(s.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?t.push(s):(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(s=this.tokenizer.fences(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.heading(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.hr(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.blockquote(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.list(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.html(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.def(e))e=e.substring(s.raw.length),r=t[t.length-1],!r||"paragraph"!==r.type&&"text"!==r.type?this.tokens.links[s.tag]||(this.tokens.links[s.tag]={href:s.href,title:s.title}):(r.raw+="\n"+s.raw,r.text+="\n"+s.raw,this.inlineQueue[this.inlineQueue.length-1].src=r.text);else if(s=this.tokenizer.table(e))e=e.substring(s.raw.length),t.push(s);else if(s=this.tokenizer.lheading(e))e=e.substring(s.raw.length),t.push(s);else{if(i=e,this.options.extensions&&this.options.extensions.startBlock){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startBlock.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(i=e.substring(0,t+1))}if(this.state.top&&(s=this.tokenizer.paragraph(i)))r=t[t.length-1],n&&"paragraph"===r?.type?(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(s),n=i.length!==e.length,e=e.substring(s.raw.length);else if(s=this.tokenizer.text(e))e=e.substring(s.raw.length),r=t[t.length-1],r&&"text"===r.type?(r.raw+="\n"+s.raw,r.text+="\n"+s.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=r.text):t.push(s);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}inlineTokens(e,t=[]){let n,s,r,i,l,o,a=e;if(this.tokens.links){const e=Object.keys(this.tokens.links);if(e.length>0)for(;null!=(i=this.tokenizer.rules.inline.reflinkSearch.exec(a));)e.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(i=this.tokenizer.rules.inline.blockSkip.exec(a));)a=a.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+a.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;null!=(i=this.tokenizer.rules.inline.anyPunctuation.exec(a));)a=a.slice(0,i.index)+"++"+a.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;e;)if(l||(o=""),l=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some((s=>!!(n=s.call({lexer:this},e,t))&&(e=e.substring(n.raw.length),t.push(n),!0)))))if(n=this.tokenizer.escape(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.tag(e))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===n.type&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(n=this.tokenizer.link(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(n.raw.length),s=t[t.length-1],s&&"text"===n.type&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(n=this.tokenizer.emStrong(e,a,o))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.codespan(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.br(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.del(e))e=e.substring(n.raw.length),t.push(n);else if(n=this.tokenizer.autolink(e))e=e.substring(n.raw.length),t.push(n);else if(this.state.inLink||!(n=this.tokenizer.url(e))){if(r=e,this.options.extensions&&this.options.extensions.startInline){let t=1/0;const n=e.slice(1);let s;this.options.extensions.startInline.forEach((e=>{s=e.call({lexer:this},n),"number"==typeof s&&s>=0&&(t=Math.min(t,s))})),t<1/0&&t>=0&&(r=e.substring(0,t+1))}if(n=this.tokenizer.inlineText(r))e=e.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(o=n.raw.slice(-1)),l=!0,s=t[t.length-1],s&&"text"===s.type?(s.raw+=n.raw,s.text+=n.text):t.push(n);else if(e){const t="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(t);break}throw new Error(t)}}else e=e.substring(n.raw.length),t.push(n);return t}}class te{options;parser;constructor(t){this.options=t||e.defaults}space(e){return""}code({text:e,lang:t,escaped:n}){const s=(t||"").match(/^\S*/)?.[0],r=e.replace(/\n$/,"")+"\n";return s?'
'+(n?r:c(r,!0))+"
\n":"
"+(n?r:c(r,!0))+"
\n"}blockquote({tokens:e}){return`
\n${this.parser.parse(e)}
\n`}html({text:e}){return e}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)}\n`}hr(e){return"
\n"}list(e){const t=e.ordered,n=e.start;let s="";for(let t=0;t\n"+s+"\n"}listitem(e){let t="";if(e.task){const n=this.checkbox({checked:!!e.checked});e.loose?e.tokens.length>0&&"paragraph"===e.tokens[0].type?(e.tokens[0].text=n+" "+e.tokens[0].text,e.tokens[0].tokens&&e.tokens[0].tokens.length>0&&"text"===e.tokens[0].tokens[0].type&&(e.tokens[0].tokens[0].text=n+" "+e.tokens[0].tokens[0].text)):e.tokens.unshift({type:"text",raw:n+" ",text:n+" "}):t+=n+" "}return t+=this.parser.parse(e.tokens,!!e.loose),`
  • ${t}
  • \n`}checkbox({checked:e}){return"'}paragraph({tokens:e}){return`

    ${this.parser.parseInline(e)}

    \n`}table(e){let t="",n="";for(let t=0;t${s}`),"\n\n"+t+"\n"+s+"
    \n"}tablerow({text:e}){return`\n${e}\n`}tablecell(e){const t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`\n`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${e}`}br(e){return"
    "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,tokens:n}){const s=this.parser.parseInline(n),r=u(e);if(null===r)return s;let i='
    ",i}image({href:e,title:t,text:n}){const s=u(e);if(null===s)return n;let r=`${n}{const r=e[s].flat(1/0);n=n.concat(this.walkTokens(r,t))})):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){const t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach((e=>{const n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach((e=>{if(!e.name)throw new Error("extension name required");if("renderer"in e){const n=t.renderers[e.name];t.renderers[e.name]=n?function(...t){let s=e.renderer.apply(this,t);return!1===s&&(s=n.apply(this,t)),s}:e.renderer}if("tokenizer"in e){if(!e.level||"block"!==e.level&&"inline"!==e.level)throw new Error("extension level must be 'block' or 'inline'");const n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&("block"===e.level?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:"inline"===e.level&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}"childTokens"in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)})),n.extensions=t),e.renderer){const t=this.defaults.renderer||new te(this.defaults);for(const n in e.renderer){if(!(n in t))throw new Error(`renderer '${n}' does not exist`);if(["options","parser"].includes(n))continue;const s=n,r=e.renderer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n||""}}n.renderer=t}if(e.tokenizer){const t=this.defaults.tokenizer||new x(this.defaults);for(const n in e.tokenizer){if(!(n in t))throw new Error(`tokenizer '${n}' does not exist`);if(["options","rules","lexer"].includes(n))continue;const s=n,r=e.tokenizer[s],i=t[s];t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){const t=this.defaults.hooks||new re;for(const n in e.hooks){if(!(n in t))throw new Error(`hook '${n}' does not exist`);if("options"===n)continue;const s=n,r=e.hooks[s],i=t[s];re.passThroughHooks.has(n)?t[s]=e=>{if(this.defaults.async)return Promise.resolve(r.call(t,e)).then((e=>i.call(t,e)));const n=r.call(t,e);return i.call(t,n)}:t[s]=(...e)=>{let n=r.apply(t,e);return!1===n&&(n=i.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){const t=this.defaults.walkTokens,s=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(s.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}})),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ee.lex(e,t??this.defaults)}parser(e,t){return se.parse(e,t??this.defaults)}parseMarkdown(e,t){return(n,s)=>{const r={...s},i={...this.defaults,...r},l=this.onError(!!i.silent,!!i.async);if(!0===this.defaults.async&&!1===r.async)return l(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(null==n)return l(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof n)return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(i.hooks&&(i.hooks.options=i),i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(n):n).then((t=>e(t,i))).then((e=>i.hooks?i.hooks.processAllTokens(e):e)).then((e=>i.walkTokens?Promise.all(this.walkTokens(e,i.walkTokens)).then((()=>e)):e)).then((e=>t(e,i))).then((e=>i.hooks?i.hooks.postprocess(e):e)).catch(l);try{i.hooks&&(n=i.hooks.preprocess(n));let s=e(n,i);i.hooks&&(s=i.hooks.processAllTokens(s)),i.walkTokens&&this.walkTokens(s,i.walkTokens);let r=t(s,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return l(e)}}}onError(e,t){return n=>{if(n.message+="\nPlease report this to https://github.com/markedjs/marked.",e){const e="

    An error occurred:

    "+c(n.message+"",!0)+"
    ";return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}}const le=new ie;function oe(e,t){return le.parse(e,t)}oe.options=oe.setOptions=function(e){return le.setOptions(e),oe.defaults=le.defaults,n(oe.defaults),oe},oe.getDefaults=t,oe.defaults=e.defaults,oe.use=function(...e){return le.use(...e),oe.defaults=le.defaults,n(oe.defaults),oe},oe.walkTokens=function(e,t){return le.walkTokens(e,t)},oe.parseInline=le.parseInline,oe.Parser=se,oe.parser=se.parse,oe.Renderer=te,oe.TextRenderer=ne,oe.Lexer=ee,oe.lexer=ee.lex,oe.Tokenizer=x,oe.Hooks=re,oe.parse=oe;const ae=oe.options,ce=oe.setOptions,he=oe.use,pe=oe.walkTokens,ue=oe.parseInline,ke=oe,ge=se.parse,fe=ee.lex;e.Hooks=re,e.Lexer=ee,e.Marked=ie,e.Parser=se,e.Renderer=te,e.TextRenderer=ne,e.Tokenizer=x,e.getDefaults=t,e.lexer=fe,e.marked=oe,e.options=ae,e.parse=ke,e.parseInline=ue,e.parser=ge,e.setOptions=ce,e.use=he,e.walkTokens=pe})); diff --git a/Ressourcen/Formatbibliothek.md b/Ressourcen/Formatbibliothek.md new file mode 100644 index 0000000..2237752 --- /dev/null +++ b/Ressourcen/Formatbibliothek.md @@ -0,0 +1,363 @@ +# Formatbibliothek + +**Stand:** 09.10.2026 (Konzept „Meister & Nerds“ von Noah eingearbeitet) +**Zweck:** Alle Formate, aus denen der Redaktionsplan gebaut wird. Ein Format ist eine wiederholbare Bauform, kein Thema. Was konkret darin passiert, füllt Dejan. + +**Quellen:** +- die Inspo-Reels von Dejan, ausgewertet in `Reel-Analyse/analysen/2026-10-05-inspo-liste-dejan.md` +- die Formate, die Dejan im Q&A gesetzt hat (`../Brainstorming Kickoff/Kontext/Kontext.md`, Abschnitt 13, F21) + +**Aufwand:** +- **Stufe 1:** eine Person, eine Aufnahme oder Vorlage, unter 1 Stunde bis zum fertigen Beitrag. +- **Stufe 2:** zwei Personen oder ein eigener Nachdreh, 1 bis 3 Stunden. +- **Stufe 3:** mehrere Personen, Dialog oder Bildschirmaufnahmen, Schnitt mit vielen Ebenen, ab einem halben Tag. + +**Konto:** +- **Noah:** Noahs eigenes Konto (`noahgeerkens`). Top of Funnel, darf lustig und trashig sein. +- **HiveGrid:** Konten von HiveGrid. Wie viel Humor dort passt, wird getestet (Kontext F8). + +--- + +## Meister & Nerds (seit 09.10.2026) + +**Quelle:** Noahs Konzept „HiveGrid Instagram: Meister & Nerds“ vom 09.10.2026 (`Noah/HiveGrid_Meister-und-Nerds.pdf`). Es baut auf seinem Feedback vom 07.10. auf: wenige Formate, ein Thema, Funnel mit 70 % Top. + +**Thema:** Meister & Nerds, Handwerk trifft Tech. Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Das Ziel ist immer Digitalisierung, aber nur nebenbei. Inhaltlich bleibt es bei Automation und Schnelligkeit im Handwerk und dem Bau der Workflow-Engine. + +**Die zwei Seiten:** +- **Meister:** der Schmerz aus dem Betrieb, aus Sicht der Handwerker. Meist Noah, Meister in vierter Generation. +- **Nerds:** wir, die HiveGrid bauen. Auch unsere Beiträge starten bei einem Schmerz aus dem Handwerk. + +**Funnel:** Rund 70 % der Reels sind Top. + +| # | Format | Funnel | Was passiert | Baut auf | +|---|---|---|---|---| +| F16 | Forum-Screenshot | Top | Noah liest einen geschwärzten Forum-Post mit einem typischen Handwerkerproblem vor und kommentiert ihn als Handwerker | F3, F8 | +| F17 | Viel zu aufwendige Automation | Top | Der Kunde will nur das Angebot annehmen, der Nerd baut dafür eine riesige Automation | F4 | +| F18 | Couch- und Büro-Clips | Top | Kurze Szenen aus dem Büro und ein Satz in die Kamera auf der Couch | F1, F1b, F7 | +| F19 | Nerd auf der Baustelle | Top | Einer von uns fährt einen Tag im Betrieb mit | neu, nah an F11 | +| F20 | Split-Reel: Problem und Funktion | Middle | Noah zeigt ein Problem aus dem Betrieb, daneben die HiveGrid-Funktion dazu | F10 | +| F21 | Pilotkunde vorher/nachher | Bottom | Ein Betrieb zeigt, wie es vor HiveGrid lief und wie es jetzt läuft | F11, F13 | + +**Im Plan bis Ende November:** F16 bis F20 werden getestet, am 27.11. (T5) bleiben die 2 bis 3, die zünden. F21 geht frühestens Ende November. + +**Dazu, außerhalb von Noahs Liste:** +- **F14 Trend zum Thema:** ein fester Slot und ein Flex-Slot. Nur Trends, die sich auf einen Schmerz im Handwerk oder auf die Nerds drehen lassen. +- **F10 Infopost:** Der klassische Infopost bleibt: 4 Mal bis 29.11., meist montags. Zwei neue (zuerst der Schmerz, dann die Funktion) und die zwei fertigen aus dem Backlog (Form Builder, E-Mail-Marketing), mit Abstand. +- **F15 Anlass-Post:** nur die GET Nord. +- **F6 Ansage:** nur als Flex-Slot bei einem Anlass. + +Die übrigen Formate (F1 bis F13) bleiben als Sammlung von Vorbildern in dieser Bibliothek. Aus ihnen sind Noahs Formate zusammengesetzt. + +## Ideen-Pool zum Thema + +Unsere Inspo-Bibliothek, auf Meister & Nerds gemünzt, dazu ein paar neue Ideen. Jede Idee startet bei einem Schmerz aus dem Handwerk. Sie stehen nicht fest im Plan. Wir greifen sie auf, wenn ein Format nicht zündet, ein Slot frei wird oder nach T5 Platz ist. Gepflegt werden sie in `daten/redaktionsplan.json` (`ideen`), die Tabelle wird daraus erzeugt. + + +| Idee | Was passiert | Funnel | Aufwand | Konto | Baut auf | +|---|---|---|---|---|---| +| **Situation mit Reaktion** | Ein Satz, den jeder Handwerker kennt, als Text. Darunter die Reaktion von Noah oder einem Nerd. Der schnellste Ersatz, wenn ein Slot ausfällt. | Top | leicht | HiveGrid | F3, Aviation Worldwide, 10.000 Likes | +| **Immer dasselbe** | Noah als Meister viermal nebeneinander, jede Kachel mit einer anderen Jahreszeit beschriftet. Jedes Mal derselbe Satz über denselben Zeitfresser. | Top | leicht | Noah | F8, Enes Åžeker, 2.500 Likes | +| **Was der Meister sagt, was der Nerd hört** | Oben, was der eine sagt, unten, was beim anderen ankommt. Geht in beide Richtungen. | Top | leicht | HiveGrid | neu, bekanntes Meme-Muster | +| **POV: Der Nerd erklärt** | Ein POV-Text, dann erklärt ein Nerd dem Meister etwas viel zu kompliziert. Ein Trend-Sound darunter. | Top | leicht | HiveGrid | F7, plancraft | +| **Meister-Pointe** | Eine Frage als Text, eine kurze Szene im Betrieb, dann die Pointe in der Großaufnahme. | Top | leicht | Noah | F9, Marc Gebauer, 26.000 Likes | +| **Fachbegriff-Quiz** | Nerds raten Begriffe aus dem Handwerk, der Meister rät Begriffe aus der Technik. Gut als Reihe. | Top | leicht bis mittel | HiveGrid | neu, Straßenquiz | +| **Rollentausch** | Der Meister zeigt einem Nerd einen Handgriff aus dem Handwerk. Der Nerd scheitert daran. | Top | mittel | HiveGrid mit Noah | neu, Spiegel zu „Viel zu aufwendige Automation“ | +| **Nachgedreht: Baustelle und Büro** | Ein Meme, das gerade läuft, einmal auf der Baustelle und einmal im Büro nachgedreht. Muss schnell gehen. | Top | mittel | HiveGrid oder Noah | F2, The Marketing Interns, 36.000 Likes | +| **Sound-Edit: Baustelle trifft Büro** | Kurze Clips aus beiden Welten im Wechsel, im Takt eines Sounds geschnitten. | Top | mittel | HiveGrid | F5, Reel xaver, 163.000 Likes | +| **Nerds auf der Messe** | Die Nerds zwischen Heizungen und Handwerkern auf der GET Nord. Das Material fällt vor Ort an. | Top | leicht | HiveGrid | F19, Variante von „Nerd auf der Baustelle“ | +| **Die Nerds-Serie** | Couch- und Büro-Clips als nummerierte Serie mit festen Figuren. Erst, wenn die Clips tragen. | Top | hoch | HiveGrid | F1, Cluely, 125.000 bis 140.000 Likes | +| **Eine Frage an den Meister** | Ein Nerd stellt Noah eine kurze Frage zum Betrieb, Noah antwortet in wenigen Sätzen. Am Ende kurz, wie HiveGrid das löst. | Middle | leicht | HiveGrid mit Noah | neu, Interview-Clip | +| **Die Automation, aber echt** | Die Automation aus „Viel zu aufwendige Automation“, diesmal ernst und Schritt für Schritt im Editor. | Middle | hoch | HiveGrid | F4, brodyautomates, 37.000 Likes | +| **Antwort auf einen Kommentar** | Eine Frage aus den Kommentaren als Aufhänger, die Antwort als kurzes Reel. Sobald Kommentare kommen. | Middle | leicht | HiveGrid | neu | + + +## Übersicht + +| # | Format | Herkunft | Aufwand | Konto | Länge | Start im Plan | +|---|---|---|---|---|---|---| +| F16 | Forum-Screenshot | Noah, aus F3 und F8 | 1 | Noah vor der Kamera | offen | Phase 1, ab 21.10. | +| F17 | Viel zu aufwendige Automation | Noah, aus F4 | 2 | HiveGrid | offen | Phase 1, ab 06.11. | +| F18 | Couch- und Büro-Clips | Noah, aus F1, F1b, F7 | 1 bis 2 | HiveGrid | offen | Phase 1, ab 19.10. | +| F19 | Nerd auf der Baustelle | Noah | 3 | HiveGrid, bei Geerkens mit Noah | offen | Phase 2, ab 11.11. | +| F20 | Split-Reel: Problem und Funktion | Noah, aus F10 | 2 | HiveGrid mit Noah | offen | Phase 1, ab 26.10. | +| F21 | Pilotkunde vorher/nachher | Noah, aus F11 und F13 | 3 | Collab mit Noah | offen | frühestens Ende November | +| F1 | Büro-Sitcom als Serie | Cluely | 3 | HiveGrid | 60 bis 120 s | später, wenn F18 trägt | +| F1b | POV-Kurzgag ohne Dialog | Cluely | 2 | HiveGrid oder Noah | 8 bis 15 s | steckt in F18 | +| F2 | Meme-Remix mit eigenem Nachdreh | The Marketing Interns | 2 | Noah oder HiveGrid | 5 bis 10 s | nicht im Plan | +| F3 | Text-Meme mit Reaktionsbild | Aviation Worldwide | 1 | Noah oder HiveGrid | 5 bis 15 s | steckt in F16 | +| F4 | Absurde Automation | brodyautomates | 3 | HiveGrid | 45 bis 70 s | steckt in F17 | +| F5 | Sound-Edit aus dem Büroalltag | Reel xaver, Dejan | 2 | HiveGrid | 8 bis 15 s | nicht im Plan | +| F6 | Ansage direkt in die Kamera | plancraft | 1 | HiveGrid | 8 bis 20 s | nur als Flex-Slot bei Anlass | +| F7 | POV mit Trend-Sound im echten Büro | plancraft | 1 bis 2 | HiveGrid | 10 bis 20 s | steckt in F18 | +| F8 | Wiederholungs-Split „immer dasselbe“ | Enes Åžeker | 1 | Noah | 8 bis 12 s | Noahs Konto, nicht im Plan | +| F9 | Kurz-Sketch mit Pointe | Marc Gebauer | 2 | Noah | 5 bis 10 s | Noahs Konto, nicht im Plan | +| F10 | Infopost (Carousel mit Animation) | bestehend | 1 bis 2 | HiveGrid | 4 bis 5 Slides | klassischer Infopost, 4 Mal bis 29.11. | +| F11 | Anfänge bei Geerkens | Dejan (F21) | 2 | Noah und HiveGrid als Collab | offen | steckt in F19 und F21 | +| F12 | Tutorial als Longform | David (F21) | 3 | YouTube | mehrere Minuten | nach Absprache mit David | +| F13 | Kundeninterview, Testimonial | Dejan (F21) | 3 | Website, später Social | offen | steckt in F21 | +| F14 | Trend zum Thema | Dejan (F21) | 1 bis 2 | Noah oder HiveGrid | je nach Trend | 1 Slot und Flex, nur zum Thema | +| F15 | Anlass-Post: Ankündigung und Rückblick | Dejan (F32) | 1 | HiveGrid | Carousel oder Bild | bei Messen und Events, zuerst GET Nord | + +**Phasen** (Vorschlag, wird im Redaktionsplan festgelegt): +- **Phase 1, ab 12.10.:** leicht anfangen. Dejan ist noch teils im Bughunting und Customer Success. Stufe 1 und fertiges Material. +- **Phase 2, etwa 2 bis 4 Wochen nach dem Start, wenn der Rhythmus sitzt:** Stufe 2. +- **Phase 3:** Stufe 3, sobald Abläufe und Rollen sitzen. + +--- + +## F16 Forum-Screenshot + +- **Herkunft:** Noah, Konzept „Meister & Nerds“ (09.10.2026). +- **Mechanik:** Noah liest einen geschwärzten Forum-Post mit einem typischen Handwerkerproblem vor und kommentiert ihn als Handwerker. Lustig, ohne Produkt. +- **Baut auf:** F3 (eine bekannte Lage aus der Branche, dazu die Reaktion) und F8 (Noah in der Sicht des Chefs). +- **Aufbau:** Der Screenshot ist der Hook in der ersten Sekunde, Noah kommentiert davor oder daneben, Untertitel immer. +- **Produktion:** 1 Person, allein drehbar. Mehrere Folgen lassen sich in einer Sitzung aufnehmen. +- **Konto:** HiveGrid, Noah vor der Kamera. Ob ein Beitrag auch als Collab läuft, entscheiden wir je Beitrag. +- **Funnel:** Top. +- **Leitplanken:** Namen, Profilbilder und Forum unkenntlich machen. Über das Problem lachen, nie über die Person, die es gepostet hat. +- **Messgröße:** Reichweite bei Nicht-Followern, Sendungen, Kommentare. +- **Weiterdenken:** Sobald Kommentare kommen, lassen sich auch Fragen aus den eigenen Kommentaren so aufgreifen. + +## F17 Viel zu aufwendige Automation + +- **Herkunft:** Noah (09.10.2026). +- **Mechanik:** Der Kunde will nur das Angebot annehmen, der Nerd baut dafür eine riesige Automation. Ein kleiner Schmerz, eine viel zu große Lösung. +- **Baut auf:** F4 Absurde Automation (Vorbild brodyautomates, 2.629 Kommentare). Bei Noah ist es Top, also ein Sketch und keine Vorführung. +- **Produktion:** 2 Personen. Für die „riesige Automation“ reicht der echte Editor im Demo-Workspace, dort liegen 30 erklärte Beispiel-Automationen. +- **Konto:** HiveGrid. +- **Funnel:** Top. Das Produkt ist im Bild, aber nur als Kulisse. +- **Leitplanken:** Die Pointe liegt beim übereifrigen Nerd, nicht bei „Software ist kompliziert“. Nur Bausteine zeigen, die es in HiveGrid gibt. +- **Messgröße:** Reichweite bei Nicht-Followern, Kommentare, Profilaufrufe. +- **Weiterdenken:** Trägt es, gibt es später die ernste Fassung als Middle: dieselbe Automation, einfach und echt (F4). + +## F18 Couch- und Büro-Clips + +- **Herkunft:** Noah (09.10.2026). +- **Mechanik:** Kurze Szenen aus dem Büro und ein Satz in die Kamera auf der Couch. +- **Baut auf:** F1 und F1b (Vorbild Cluely: Spielszenen und ein fester Interview-Platz, 125.000 bis 140.000 Likes) und F7 (POV im echten Büro). +- **Produktion:** 2 bis 3 Personen, 30 bis 60 Minuten. Die Couch ist ein fester Platz, damit man sie wiedererkennt. +- **Konto:** HiveGrid. +- **Funnel:** Top. +- **Leitplanken:** wie F1. Selbstironie ja, Kunden und Handwerk nie als Witzfigur. +- **Messgröße:** Watchtime, Sendungen, Kommentare zu den Personen. Werden Figuren wiedererkannt, kann daraus die längere Serie (F1) werden. + +## F19 Nerd auf der Baustelle + +- **Herkunft:** Noah (09.10.2026). +- **Mechanik:** Einer von uns fährt einen Tag im Betrieb mit und erlebt den Schmerz selbst. +- **Baut auf:** neu. Am nächsten an F11 (Anfänge bei Geerkens). +- **Produktion:** ein ganzer Tag im Betrieb, aus dem mehrere Reels entstehen. Das Material reicht oft auch für Split-Reels (F20) und Fotos für LinkedIn (L2). +- **Konto:** HiveGrid, bei Geerkens als Collab mit Noah. +- **Funnel:** Top. +- **Leitplanken:** Alle im Bild stimmen zu. Kunden des Betriebs sind nicht erkennbar. +- **Messgröße:** wie F18. +- **Idee dazu:** Findet so ein Tag bei Geerkens statt, solange dort noch ohne HiveGrid gearbeitet wird, ist das Material zugleich das „Vorher“ für F21. + +## F20 Split-Reel: Problem und Funktion + +- **Herkunft:** Noah (09.10.2026), dort „Split Reels“. +- **Mechanik:** Noah zeigt ein Problem aus dem Betrieb, daneben die HiveGrid-Funktion dazu. Geteilter Bildschirm. +- **Baut auf:** F10 (zuerst das Problem, dann die Lösung), nur als Reel statt als Carousel. +- **Produktion:** Noahs Teil im Betrieb, dazu eine Bildschirmaufnahme aus dem Demo-Workspace. 1 bis 3 Stunden. +- **Konto:** HiveGrid, Noah vor der Kamera. Ob ein Beitrag auch als Collab läuft, entscheiden wir je Beitrag. +- **Funnel:** Middle. Hier darf das Produkt vorne stehen. +- **Leitplanken:** Nur Funktionen zeigen, die live sind (Kontext, Abschnitt 2). +- **Messgröße:** Speicherungen, Profilaufrufe, Klicks auf den Link in der Bio. + +## F21 Pilotkunde vorher/nachher + +- **Herkunft:** Noah (09.10.2026). +- **Mechanik:** Ein Betrieb zeigt, wie es vor HiveGrid lief und wie es jetzt läuft. +- **Baut auf:** F11 (Anfänge bei Geerkens) und F13 (Kundeninterview). +- **Abhängigkeit:** Geht erst, wenn ein Betrieb eine Weile mit HiveGrid arbeitet. Zuerst wäre das Geerkens. Frühestens Ende November. +- **Hinweis:** Das „Vorher“ lässt sich nur aufnehmen, solange dort noch ohne HiveGrid gearbeitet wird. +- **Konto:** Collab mit Noah. +- **Funnel:** Bottom. +- **Leitplanken:** Nur echte Abläufe und Zahlen, mit Freigabe von allen im Bild. +- **Messgröße:** Klicks auf das Erstgespräch, Anfragen. + +## F1 Büro-Sitcom als Serie + +- **Vorbild:** `cluely` (Ep 34, Ep 35). 125.000 bis 140.000 Likes. +- **Mechanik:** Der Alltag in der Firma wird überspitzt gespielt. + - Feste Figuren mit festen Rollen und Insidern kommen in jeder Folge wieder. + - Durch die Nummerierung entsteht eine Serie, die man weiterverfolgt. +- **Aufbau:** + - Text-Hook „POV: …“ oben, die Szene läuft sofort. + - Spielszenen wechseln mit Interview-Einspielern: eine Figur allein vor festem Hintergrund, beim ersten Auftritt mit Bauchbinde (Name, Rolle). + - Originalton mit Dialog, Untertitel Satz für Satz. + - Schnitt alle 2 bis 3 Sekunden. Länge 1 bis 2 Minuten. + - Folgennummer in der Bildunterschrift. Die Marke ist nebenbei im Bild (Logo im Büro, Kleidung). +- **Produktion:** 3 bis 5 Personen, die mitspielen. Ein fester Interview-Platz im Büro. Dreh und Schnitt ab einem halben Tag pro Folge. +- **Konto und Kanal:** HiveGrid. Instagram, TikTok, Facebook-Reels. Auf LinkedIn eher nicht. +- **Funnel-Stufe:** oben. Reichweite und Sympathie. Zeigt die Menschen hinter der Software und passt damit zu „den Bau offen zeigen“ (Kontext F6). +- **Leitplanken:** + - Keine Witze auf Kosten von Herkunft, Gruppen oder Kunden. + - Selbstironie ja, Kunden und Handwerk nie als Witzfigur. + - Die Figuren sind das Team und nicht der Kunde. +- **Messgröße:** Watchtime, Sendungen, Follower aus dem Reel, Kommentare mit Bezug auf Figuren. Daran sieht man, ob die Serie trägt. + +## F1b POV-Kurzgag ohne Dialog + +- **Vorbild:** `cluely` („anonymous complaint to HR“, 12 s, 40.000 Likes). +- **Mechanik:** Eine bekannte Büro-Situation als Text-Hook. Dazu drei kurze Einstellungen, die die Pointe zeigen, ohne dass jemand spricht. +- **Aufbau:** Der Text steht die ganze Zeit oben, 2 bis 3 Schnitte, Musik oder Ton aus dem Raum. +- **Produktion:** 2 Personen, 30 Minuten Dreh, kurzer Schnitt. +- **Konto:** HiveGrid, bei Chef-Themen auch Noah. +- **Einordnung:** Der leichte Einstieg in F1, ohne Figuren und Dialog. Damit lässt sich testen, ob Büro-Humor bei HiveGrid trägt. + +## F2 Meme-Remix mit eigenem Nachdreh + +- **Vorbild:** The Marketing Interns („Bro can I see how your code works“, 7 s, 36.000 Likes). +- **Mechanik:** + - Ein gerade virales Meme wird mit eigenen Leuten im eigenen Umfeld nachgestellt. + - Danach folgt der Original-Clip als Pointe. + - Das Zitat oben überträgt das Meme auf die Branche. +- **Aufbau:** Zitat als Text oben, 3 bis 4 Sekunden eigener Nachdreh, dann der Original-Clip mit Effekten, Trend-Audio. +- **Produktion:** 2 bis 5 Personen, 15 Minuten Dreh, Schnitt mit Effekten. **Muss schnell gehen,** solange das Meme läuft (wenige Tage). +- **Konto:** Noah (Baustelle, Betrieb) oder HiveGrid (Büro). +- **Leitplanke:** Die Nutzung fremder Clips ist rechtlich eine Grauzone. Der Clip wird nur kurz zitiert, der eigene Nachdreh trägt den Beitrag. + +## F3 Text-Meme mit Reaktionsbild + +- **Vorbild:** Aviation Worldwide (55 s Schleife, 10.000 Likes). +- **Mechanik:** Ein absurder oder sehr wiedererkennbarer Satz aus dem Alltag der Branche als Text, darunter ein bekanntes Reaktionsbild oder ein kurzer Loop. +- **Aufbau:** Großer Text oben, darunter das Bild oder der Loop, Musik, kein Schnitt. +- **Produktion:** 1 Person, unter 30 Minuten. +- **Konto:** Noah oder HiveGrid. Gut für TikTok, Instagram und Facebook. +- **Einordnung:** Billigster Weg, Tonalität und Themen zu testen. Ein guter Lückenfüller für Phase 1. +- **Leitplanke:** Fremde Fotos von Personen nur als bekannte Meme-Vorlagen. Am sichersten sind eigene Reaktionsbilder vom Team oder von Noah. + +## F4 Absurde Automation + +- **Vorbild:** `brodyautomates` („Hell yeah simulator“, 64 s, 37.000 Likes, **2.629 Kommentare**). +- **Mechanik:** + - Ein technisch echter, aber absurder Workflow, Schritt für Schritt vorgeführt. + - Der Unsinn macht neugierig. Dass er funktioniert, zeigt, wie stark die Engine ist. +- **Aufbau:** + - Eine Person erzählt ohne Pause. + - Darüber schwebt der Workflow aus dem Editor. + - Dazwischen Bildschirmaufnahmen jedes Knotens und das sichtbare Ergebnis (Nachricht, Termin, Aufgabe). + - Einzelne Wörter groß eingeblendet, synchron zur Sprache. + - Schnitt alle 2 Sekunden. + - Am Ende ein Stichwort-CTA: „Kommentiere X, dann schicken wir dir …“. +- **Produktion:** + - Den Workflow in HiveGrid tatsächlich bauen, im Demo-Workspace. + - Bildschirmaufnahmen, Talking Head, Schnitt mit vielen Ebenen. Ein Tag pro Folge. +- **Konto und Kanal:** HiveGrid. Instagram und TikTok, gekürzt auch LinkedIn. +- **Funnel-Stufe:** Mitte. Zeigt den USP (Workflow-Engine) mit Spaß statt Funktionsliste. Das ist die Antwort auf „zu viel Feature-Verkauf“ (Kontext F9). +- **Leitplanken:** + - Nur echte Workflows, die so in HiveGrid laufen. + - Keine Bausteine zeigen, die es nicht gibt. + - Ein Stichwort-CTA braucht einen funktionierenden DM-Ablauf (Metricool Flows, siehe Research 04). +- **Messgröße:** Kommentare mit dem Stichwort, DMs, Speicherungen. + +## F5 Sound-Edit aus dem Büroalltag + +- **Vorbild:** Reel xaver (15 s, 163.000 Likes) als Schnittprinzip. Dazu Dejans Gedanke: dasselbe mit eigenen Clips. +- **Mechanik:** Kurze echte Clips aus Büro, Entwicklung und Team, im Takt eines bekannten Sounds geschnitten. +- **Aufbau:** Schnitt alle 1 bis 2 Sekunden, ein Wortspiel oder eine Lage als Text, der Ton gibt den Rhythmus vor. +- **Produktion:** Clips im Alltag sammeln (Handy), dann 1 bis 2 Stunden Schnitt. +- **Konto:** HiveGrid. +- **Einordnung:** Zeigt Team und Bau, ohne dass jemand spielen muss. Gut, um nebenbei Material zu sammeln. + +## F6 Ansage direkt in die Kamera + +- **Vorbild:** plancraft (Messe-Ankündigung, 9 s, 43 Likes). +- **Mechanik:** Eine Person sagt kurz und direkt etwas an: Termin, Messe, Neuerung, Einladung. +- **Aufbau:** Eine Einstellung im eigenen Büro, Untertitel, das Logo im Bild, Details in der Bildunterschrift. +- **Produktion:** 1 Person, 15 Minuten. +- **Konto und Kanal:** HiveGrid. Alle Kanäle, auch LinkedIn und Facebook. +- **Einordnung:** Kaum Reichweite, aber nötig für Anlässe (Messe, Webinar, Start bei Geerkens). Nicht zu oft einsetzen. + +## F7 POV mit Trend-Sound im echten Büro + +- **Vorbild:** plancraft („Der Kollege mit dem komplizierten Job erklärt dir etwas“, 17 s, 98 Likes). +- **Mechanik:** Eine wiedererkennbare Büro-Situation als POV-Text, realistisch gespielt. Darunter läuft ein Trend-Sound, auf den lippensynchron gespielt wird. +- **Aufbau:** Text oben, Handkamera, 1 bis 3 Einstellungen, Trend-Audio. +- **Produktion:** 2 Personen, 20 Minuten. +- **Konto:** HiveGrid. +- **Einordnung:** Die ruhigere Stufe vor F1. Bei plancraft schwach in der Wirkung, aber sehr günstig. Ein Test, ob ruhiger Büro-Humor ankommt. + +## F8 Wiederholungs-Split „immer dasselbe“ + +- **Vorbild:** Enes Åžeker („Immer das selbe Gerede vom Chef“, 10 s, 2.500 Likes). +- **Mechanik:** Eine Aufnahme wird viermal übereinander gezeigt, jede mit einem anderen Zeitraum beschriftet (Quartal, Monat, Saison). Der Witz ist, dass jedes Mal dasselbe gesagt wird. +- **Aufbau:** Raster aus vier gleichen Kacheln mit Beschriftung, eine Zeile Text dazu, eigener Ton, kein Schnitt. +- **Produktion:** 1 Person, eine Aufnahme, 30 Minuten Schnitt. +- **Konto:** **Noah.** Die Chef-Perspektive passt genau zu Noah als Inhaber. +- **Einordnung:** Einer der günstigsten Wege für Noah, die Sicht des Chefs mit Selbstironie zu besetzen. + +## F9 Kurz-Sketch mit Pointe + +- **Vorbild:** Marc Gebauer (6 s, 26.000 Likes). +- **Mechanik:** Eine Frage als Text, eine kurze Szene, die eine andere Antwort erwarten lässt, dann der Dreh: Großaufnahme mit gedrehtem Text. +- **Aufbau:** Frage oben, eine Einstellung, Schnitt auf die Großaufnahme, Pointe als Text, Trend-Musik. +- **Produktion:** 2 Personen, 15 Minuten. +- **Konto:** Noah, auch mit Leuten aus dem Betrieb. + +## F10 Infopost zu einer Funktion (Carousel) + +- **Seit 09.10.2026:** bleibt als klassischer Infopost im Plan, auch neben Noahs Formaten. Im Thema heißt das: zuerst ein Schmerz aus dem Betrieb, dann die Funktion, die ihn löst. + +- **Herkunft:** die bisherigen Posts, laut Dejan weiterhin mit 4 bis 5 Slides (F21). +- **Mechanik:** Eine Funktion auf wenigen Slides erklärt, mit der Post-Engine gebaut. +- **Einordnung nach den eigenen Zahlen:** + - Die drei Funktionsposts im August erreichten je rund 150 Konten. Die Posts über Haltung und Geschichte erreichten 600 bis 1.250 (Strategie 1.1). + - Infoposts sind deshalb eher Beleg für Leute, die schon prüfen, und weniger ein Mittel für Reichweite. + - Der Einstieg sollte über ein Problem oder einen Ablauf laufen, nicht über die Funktion. +- **Konto und Kanal:** HiveGrid. Instagram, Facebook, LinkedIn als PDF-Dokument. +- **Backlog:** Zwei fertige Posts liegen bereit (Form Builder, E-Mail-Marketing). + +## F11 Anfänge bei Geerkens + +- **Herkunft:** Dejan (F21). Drei Research-Berichte nennen das unabhängig voneinander den stärksten Start. +- **Mechanik:** Die Umstellung im eigenen Betrieb wird dokumentiert, ehrlich, auch mit Stolperstellen. +- **Konto:** Noah, als Collab mit HiveGrid. +- **Abhängigkeit:** + - Startet, sobald Geerkens wirklich mit HiveGrid arbeitet. Laut Dejan in etwa 1 bis 2 Wochen nach dem 05.10. + - Noah, die Mitarbeitenden und die Schwester müssen zustimmen (Fragen an Noah, Research 00, 6.3). + +## F12 Tutorial als Longform + +- **Herkunft:** David dreht Tutorials für YouTube (F21). +- **Einordnung:** YouTube ist damit ein zusätzlicher Kanal. Aus jedem Tutorial lassen sich kurze Ausschnitte für Shorts, Reels und LinkedIn schneiden. + +## F13 Kundeninterview, Testimonial + +- **Herkunft:** Dejan (F21). Zuerst auf der Website. +- **Abhängigkeit:** Erst möglich, wenn Betriebe HiveGrid im Alltag nutzen. + +## F14 Trendformat nach aktuellem Sound + +- **Herkunft:** Dejan (F21). Was gerade auf TikTok und Instagram läuft, auch bei Sounds, auf die eigene Sparte übertragen. +- **Einordnung:** Kein festes Format, sondern ein freier Slot im Plan, der kurzfristig gefüllt wird. F2, F3, F7 und F9 sind oft die Bauformen dafür. +- **Trends finden:** Dejan ist hier unersetzlich. Claude kann Sounds nicht erkennen oder abspielen. + +## F15 Anlass-Post: Ankündigung und Rückblick + +- **Herkunft:** Dejan (F32), zuerst für die GET Nord (19. bis 21.11.2026, 3 bis 4 Leute von HiveGrid vor Ort). +- **Mechanik:** Ein bewusst sachlicher Infopost in zwei Teilen. + - **Vorher:** „Wir sind da“, mit Ort, Datum und wer hingeht. + - **Hinterher:** „So war es“, mit Fotos und Eindrücken. +- **Aufbau:** Carousel oder einzelnes Bild aus der Post-Engine, dazu der Text. Auf LinkedIn als Postart L4 (Anlass). +- **Produktion:** 1 Person, unter 1 Stunde je Teil. Fotos und B-Roll vor Ort aufnehmen. Daraus entstehen später Reels (zum Beispiel F5 Sound-Edit) und LinkedIn-Einblicke (L2). +- **Konto und Kanal:** HiveGrid. Instagram, Facebook, LinkedIn. Während des Events Stories als Flex-Slot. +- **Einordnung:** Bringt kaum Reichweite, zeigt aber, dass HiveGrid in der Branche unterwegs ist. Gesprächspartner vor Ort finden das Profil danach. + +--- + +## Was für alle Reel-Formate gilt + +Abgeleitet aus den 11 Inspo-Reels: + +- **Format:** Hochformat 9:16. +- **Hook in der ersten Sekunde:** ein Text oben im Bild (POV, Frage, Zitat, Lage) und sofort sichtbare Handlung. +- **Ohne Ton verständlich:** Text oder Untertitel immer. +- **Zwei Längen:** + - kurz (5 bis 17 s, Trend-Audio) für Meme- und Sound-Formate + - lang (60 bis 130 s, Originalton, Schnitt alle 2 bis 3 s) für Erzählformate +- **Immer die eigene Originaldatei hochladen,** ohne Wasserzeichen anderer Apps. Instagram, Facebook und TikTok drosseln weiterverwertetes Material (Research 02). +- **Musik:** Die normale Instagram-Bibliothek deckt keine geschäftliche Nutzung ab (Research 06). Auf Business-Konten nur die freigegebene Bibliothek oder eigenen Ton nutzen. +- **Reichweite:** Hoch war sie nur bei Figuren, Pointe oder Meme-Bezug. Sachliche Branchen-Reels lagen unter 100 Likes. diff --git a/Ressourcen/Noah/HiveGrid_Meister-und-Nerds.pdf b/Ressourcen/Noah/HiveGrid_Meister-und-Nerds.pdf new file mode 100644 index 0000000..00d66a6 Binary files /dev/null and b/Ressourcen/Noah/HiveGrid_Meister-und-Nerds.pdf differ diff --git a/Ressourcen/Reel-Analyse/README.md b/Ressourcen/Reel-Analyse/README.md new file mode 100644 index 0000000..8f78342 --- /dev/null +++ b/Ressourcen/Reel-Analyse/README.md @@ -0,0 +1,45 @@ +# Reel-Analyse + +Hier werten wir Vorbild-Reels aus, um daraus **Formate** für HiveGrid abzuleiten: Aufbau, Länge, Schnitt, Texteinblendungen, Ton. Aus den Reels werden keine fertigen Posts abgeschrieben. + +## Ordner + +| Ordner | Inhalt | +|---|---| +| `videos/` | Die heruntergeladenen Reels. **Nur vorübergehend:** Nach der Auswertung werden die Videos gelöscht. | +| `analysen/` | Je Reel oder Kanal eine Datei mit dem Formataufbau. Die bleibt. | + +## Ablauf + +1. **Dejan schickt Links zu Kanälen oder Reels**, jeweils mit einem Satz dazu, was daran gefällt. +2. **Claude lädt das Reel nach `videos/`** (mit `yt-dlp`). Wenn Instagram ohne Anmeldung nichts herausgibt, fragt Claude nach, ob die Browser-Anmeldung genutzt werden darf (`--cookies-from-browser`). +3. **Claude zerlegt das Reel:** + - Länge, Format und Bildrate (`ffprobe`) + - Standbilder der ersten Sekunden und bei jedem Schnitt (`ffmpeg`) + - Transkript des gesprochenen Textes (`whisper.cpp`, läuft lokal auf dem Mac, nichts geht an einen Dienst) +4. **Claude schreibt den Formataufbau nach `analysen/`:** + - Hook in den ersten Sekunden + - Aufbau in Abschnitten + - Schnittfrequenz + - Texteinblendungen und Untertitel + - Ton und Musik + - Länge, CTA + - was sich auf HiveGrid übertragen lässt und für welchen Kanal +5. **Das Video wird gelöscht.** + +## Werkzeuge (eingerichtet am 05.10.2026) + +| Werkzeug | Wofür | Ort | +|---|---|---| +| `yt-dlp` | Reels herunterladen | Homebrew | +| `ffmpeg` / `ffprobe` | Standbilder, Länge, Schnitte | Homebrew | +| `whisper.cpp` (`whisper-cli`) | Transkript, lokal | Homebrew | +| Modell `ggml-large-v3-turbo-q5_0` | Spracherkennung für Deutsch und Englisch | `~/.cache/whisper-cpp/`, außerhalb des Hubs | + +## Rechtlicher Rahmen (Einordnung, keine Rechtsberatung) + +- Das Herunterladen fremder Reels ist eine **Grauzone**. Die Privatkopie nach § 53 UrhG greift für ein Unternehmen nicht. +- Am ehesten trägt **§ 44b UrhG** (Text und Data Mining): Kopien sind für die Analyse erlaubt, wenn sie danach gelöscht werden und der Rechteinhaber nicht maschinenlesbar widersprochen hat. +- Deshalb gilt: **Videos nur vorübergehend, Analysen bleiben.** +- Die Nutzungsbedingungen von Instagram verbieten automatisiertes Sammeln. Wir laden einzelne Reels, kein massenhaftes Abgreifen. +- Mehr dazu in `../../Brainstorming Kickoff/Research/04-tools-und-anbindungen.md`, Abschnitt 1. Die Frage geht mit in die Rechtsprüfung (Übersicht, Frage 39). diff --git a/Ressourcen/Reel-Analyse/analysen/2026-10-05-inspo-liste-dejan.md b/Ressourcen/Reel-Analyse/analysen/2026-10-05-inspo-liste-dejan.md new file mode 100644 index 0000000..6afedc4 --- /dev/null +++ b/Ressourcen/Reel-Analyse/analysen/2026-10-05-inspo-liste-dejan.md @@ -0,0 +1,133 @@ +# Auswertung: Inspo-Reels von Dejan (05.10.2026) + +**Ablauf:** +- 11 Reels heruntergeladen. +- Je Reel ausgewertet: Länge, Schnitte (Szenenerkennung), 16 Standbilder, Transkript (whisper.cpp, lokal). +- Die Videos sind danach gelöscht worden. + +**Zweck:** Nur Formate erkennen, keine Inhalte übernehmen. Die abgeleiteten Formate stehen in `../Formatbibliothek.md`. + +**Zahlen** (Likes und Kommentare) stammen aus den Metadaten beim Abruf am 05.10.2026. Aufrufzahlen liefert Instagram ohne Anmeldung nicht. + +--- + +## Gruppe 1: Cluely-Sitcom (Konto `cluely`) + +| # | Reel | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---|---:|---:|---:|---:| +| 01 | Ep 35: Mentor ist der chinesische Engineer | 25.09.2026 | 81 s | 25 (alle 3,2 s) | 125.697 | 1.063 | +| 02 | Ep 34: Gehälter geleakt | 18.09.2026 | 128 s | 49 (alle 2,6 s) | 140.624 | 602 | +| 03 | „Anonyme“ Beschwerde an HR | 25.08.2026 | 12 s | 2 | 40.114 | 127 | + +**Was zu sehen ist:** +- **Hook:** + - Immer ein Text oben im Bild: „POV: …“. + - Bei 01 sieht man in der ersten Sekunde schon die Situation (Präsentation auf Chinesisch). Bei 02 sofort den Streit. +- **Aufbau wie eine Mockumentary** (Vorbild „The Office“): + - Spielszenen im echten Büro wechseln mit Interview-Einspielern. Dafür sitzt eine Figur auf einem Hocker vor einer Kleiderstange, immer am selben Ort. + - Beim ersten Interview-Auftritt steht eine Bauchbinde mit Name und Rolle im Bild („Ling Long, Principal Engineer“, „Roy, CEO Cluely“). +- **Serie:** + - Die Folgen sind nummeriert (Ep 34, Ep 35). + - Die Figuren kommen immer wieder vor (Ling Long, Varun, Roy, Brandon) und haben feste Rollen und Insider. + - Die Marke ist nebenbei im Bild: das Logo als Leuchtschrift an der Wand, Hoodies. +- **Ton:** + - Originalton mit Dialog, keine Musik. + - Untertitel unten mittig, Satz für Satz, klein und weiß. +- **Länge:** Die Serienfolgen dauern 1 bis 2 Minuten. Die kurze Variante (03) kommt ohne Dialog aus: ein Text-Hook und drei Einstellungen. +- **Achtung:** Der Humor von 01 und 02 lebt stark von ethnischen Klischees. Übertragbar ist das Gerüst, nicht diese Art Witz. + +## Gruppe 2: Virale Memes, auf die Branche übertragen + +| # | Konto | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---|---:|---:|---:|---:| +| 04 | The Marketing Interns | 26.09.2026 | 7 s | 3 Teile | 36.084 | 154 | +| 05 | Aviation Worldwide | 19.09.2026 | 55 s | 0 | 10.183 | 126 | + +**04: Meme-Remix mit eigenem Nachdreh** +- Ein Zitat als Text oben: „Bro can I see how your code works“. +- Erster Teil: ein eigener Nachdreh im Startup-Büro, alle werfen ihre Laptops. +- Zweiter Teil: der Original-Meme-Clip (der Teller mit Brokkoli fliegt) mit Explosions-Effekten. +- Der Witz entsteht, wenn man das Meme kennt. 60 Bilder pro Sekunde, Trend-Audio. + +**05: Text-Meme mit Reaktionsbild** +- Oben ein langer, absurder Text aus der echten Welt. +- Darunter eine Diashow mit Fotos eines bekannten Creators, die als „Ladebildschirm“-Reaktion dienen. +- Nur Musik, kein Schnitt im eigentlichen Sinn, läuft in Schleife. +- Fast kein Aufwand. Der Text trägt alles. + +## Gruppe 3: Absurde Automation (Konto `brodyautomates`) + +| # | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---:|---:|---:|---:| +| 06 | 23.09.2025 | 64 s | 29 (alle 2,2 s) | 37.401 | **2.629** | + +- **Aufbau:** + - Ein Creator sitzt auf dem Sofa und spricht 60 Sekunden ohne Pause. + - Darüber schwebt der echte Workflow (n8n) als großes Bild. + - Dazwischen Bildschirmaufnahmen der einzelnen Knoten und eingeblendete Beweise: Social-Post, Uber-Route, Tinder, Kleinanzeigen. +- **Text:** Einzelne Wörter in großen, kursiven Versalien mit Leuchteffekt, synchron zum gesprochenen Wort. +- **Inhalt:** eine absurde Kette von Aktionen, aber technisch echt. Gerade dadurch merkt der Zuschauer, was so ein Werkzeug kann. +- **Ende:** „comment hell yeah and I'll send this to you for free“. Das ist ein Stichwort-Funnel. Er erklärt die außergewöhnlich hohe Zahl an Kommentaren (2.629 bei 37.401 Likes). + +## Gruppe 4: Edits mit Sound + +| # | Konto | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---|---:|---:|---:|---:| +| 07 | Reel xaver | 21.09.2026 | 15 s | 9 (alle 1,6 s) | 162.808 | 546 | + +- Eine schnelle Montage aus fremdem Material: Porträts von Tesla, Einstein und Newton, dann ein Streamer-Clip, dann Lacher. +- Dazu ein Wortspiel als Text. +- Der Ton gibt den Rhythmus vor (Outro-Musik). Quadratisch und in niedriger Auflösung, also offensichtlich weiterverwertetes Material. +- **Dejans Gedanke:** Dasselbe Prinzip mit eigenen Clips aus dem Büroalltag. + +## Gruppe 5: Konkurrenz und Branchenstandard (Konto `plancraft.app`) + +| # | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---:|---:|---:|---:| +| 08 | 02.10.2026 | 9 s | 1 | 43 | 2 | +| 09 | 28.09.2026 | 17 s | wenige, Handkamera | 98 | 5 | + +**08: Ankündigung in die Kamera** +- Eine Mitarbeiterin im eigenen Büro spricht direkt in die Kamera: Messe, Termin, Halle und Stand, Einladung. +- Untertitel. Das Logo steht auf einem Aufsteller im Bild. +- Der Ticketcode steht in der Bildunterschrift. + +**09: POV im echten Büro** +- Text oben: „POV: Der Kollege mit dem komplizierten Job erklärt dir etwas“. +- Zwei echte Mitarbeitende, gefilmt mit der Handkamera. Einer redet, die andere nickt ratlos. +- Der Ton ist ein bekannter Trend-Sound („Die Tomate ist eine Frucht …“), gesprochen wird nicht selbst. +- Realistisch statt überdreht. + +**Zur Einordnung:** Beide Reels haben sehr wenig Interaktion (43 und 98 Likes). Das passt zu Bericht 03: organisch erreicht die Konkurrenz meist wenig. + +## Gruppe 6: Influencer + +| # | Konto | Datum | Länge | Schnitte | Likes | Komm. | +|---|---|---|---:|---:|---:|---:| +| 10 | Enes Åžeker | 01.10.2026 | 10 s | 0 | 2.527 | 19 | +| 11 | Marc Gebauer | 17.01.2025 | 6 s | 1 | 25.762 | 173 | + +**10: Wiederholungs-Split** +- Dieselbe Aufnahme viermal übereinander, beschriftet mit „Geschäftsführer Januar bis März“, „April bis Juni“, „Juli bis September“, „Oktober bis Dezember“. +- Text: „Immer das selbe Gerede vom Chef“. +- Der Ton ist die eigene Ansprache: „Leute, das ist jetzt die heiße Phase …“. +- Der Witz ist die Wiederholung. Eine Aufnahme, kein Schnitt, eigener Ton. + +**11: Kurz-Sketch mit Pointe** +- Eine Frage als Text oben: „Would you hit your wife for a new watch?“. +- Dann eine kurze Szene mit Tanz und Umarmung, Schnitt auf die Großaufnahme, der Text dreht: „NO NEVER!“. +- Dazu Trend-Musik. Zwei Personen, eine Szene, 6 Sekunden. + +--- + +## Was alle gemeinsam haben + +- **Hochformat 9:16** (1080 × 1920), außer dem weiterverwerteten Edit. +- **Hook in der ersten Sekunde:** + - fast immer ein Text oben im Bild (POV, Frage, Zitat oder Lage) + - dazu sofort sichtbare Handlung, kein Vorlauf +- **Untertitel oder Text** in jedem Reel. Ohne Ton sind alle verständlich. +- **Zwei Längen:** + - Meme- und Sound-Formate: 5 bis 17 Sekunden, Trend-Audio + - Erzählformate (Sitcom, Automation): 60 bis 130 Sekunden, Originalton, Schnitt alle 2 bis 3 Sekunden +- **Hohe Reichweite** hatten nur Reels mit Figuren, Pointe oder Meme-Bezug. Die sachlichen Branchen-Reels kamen auf unter 100 Likes. diff --git a/Ressourcen/Reel-Analyse/analysen/2026-10-14-brodyautomates.md b/Ressourcen/Reel-Analyse/analysen/2026-10-14-brodyautomates.md new file mode 100644 index 0000000..8dc9ed5 --- /dev/null +++ b/Ressourcen/Reel-Analyse/analysen/2026-10-14-brodyautomates.md @@ -0,0 +1,294 @@ +# Auswertung: brodyautomates, drei Reels (14.10.2026) + +**Wofür:** +- Vorbild für F17 „Viel zu aufwendige Automation“. Dejan hat die drei Reels am 14.10. geschickt. +- Hier steht nur, wie die Reels gebaut sind und was davon für Handwerker auf Deutsch trägt. +- Das Skript kommt erst, wenn unser Workflow feststeht. + +**Ablauf** wie in `../README.md`: +- heruntergeladen mit yt-dlp +- Länge und Schnitte mit ffmpeg +- Standbilder alle 2 bis 3 Sekunden +- Transkript lokal mit whisper.cpp +- Hörfehler anhand der Einblendungen korrigiert (siehe Transkripte) +- Videos danach gelöscht + +**Zahlen** stammen aus den Metadaten beim Abruf am 14.10.2026. Aufrufe liefert Instagram ohne Anmeldung nicht. Die Kommentare je Like zeigen, wie stark das Stichwort am Ende zieht. + +| # | Reel | Datum | Länge | Schnitte | Sprechtempo | Likes | Komm. | Komm. je Like | +|---|---|---|---:|---:|---:|---:|---:|---:| +| 1 | Hell Yeah Simulator | 19.08.2025 | 64 s | 29 (alle 2,2 s) | 4,1 Wörter/s | 345.817 | 8.041 | 2 % | +| 2 | AI Scam Center | 19.07.2025 | 107 s | 30 (alle 3,6 s) | 4,3 Wörter/s | 1.328 | 440 | 33 % | +| 3 | Freundinnen-Automation („How I met your mother“) | 07.08.2025 | 151 s | 34 (alle 4,4 s) | 4,5 Wörter/s | 35.641 | 9.756 | 27 % | + +Reel 1 ist inhaltlich dasselbe wie Reel 06 aus der Inspo-Liste vom 05.10.: gleicher Text, gleiche Länge, gleiche Schnittzahl. Dort hatten wir einen späteren Post vom 23.09.2025 mit 37.401 Likes. Dieser hier ist der frühere und viel größere. + +--- + +## Die Essenz + +**Einer erklärt todernst und technisch sauber eine riesige Automation, die etwas völlig Unsinniges tut.** + +- Der Witz ist der Abstand zwischen dem ernsten Ton und dem Unsinn. +- Jeder Schritt hat eine kleine Pointe. +- Fast jede Pointe sieht man als Ergebnis im Bild. +- Nebenbei merkt der Zuschauer: Das Werkzeug kann wirklich viel. + +## Das gemeinsame Muster + +1. **Hook in einem Satz (0 bis 3 s).** + - Der erste Satz sagt schon alles: Es ist eine Automation, und sie tut etwas Absurdes. + - 1: „the most phenomenal workflow you'll ever see, called the Hell Yeah Simulator“ + - 2: „after my last automation … I've decided to make this AI scam center“ + - 3: „This automation removes the need to talk to a woman entirely“ + - Im Bild: Die Person sitzt unten, darüber schwebt der ganze Workflow als dunkle Karte. Man sieht sofort: riesig und echt. +2. **Überleitung.** „So here's how it works“, „Let me explain how this works“. Ab hier ist es eine Führung durch den Workflow. +3. **Start mit einem echten Auslöser.** + - 1: jeden Morgen um 6:45 + - 2: ein ausgehender Anruf + - 3: jeden Morgen ein Zeitplan + + Der Anfang ist immer konkret und glaubwürdig. +4. **Schritt für Schritt, immer absurder.** + - Jeder Schritt ist ein Baustein im Workflow und trägt einen Witz-Namen, zum Beispiel „Beer & Cig Farmer“, „Uber Black to Casino“, „WifeScore Calculator“, „Gaslighting Module“. + - Reel 1 schafft 13 Schritte in rund 60 s, also alle 4 bis 5 s einen neuen. + - Wegweiser halten den Zuschauer: „First“, „Then“, „Next up“, „Finally“, „On the top end … on the bottom side“. +5. **Beweis im Bild.** Das Ergebnis eines Schritts erscheint als echter Bildschirm. + - 1: der Post „Rise and Grind“ mit genervten Kommentaren („stop saying this“, „SHUT UP“), die SMS „Can't talk, grinding“, die Karte mit Bier und Zigaretten, die Kleinanzeige „Hi Chad, is this still available?“ + - 2: Code-Karten mit den Sätzen des Betrügers + - 3: der volle Kalender mit lauter „Date with …“, die Freundinnen-Tabelle, die Fehlermeldung, die an eine Freundin rausgeht, das Date-Briefing mit „Laughs 23.7 % louder at self-deprecating humor“ +6. **Ein ehrlicher Technik-Witz.** Ein Satz, der klingt wie ein echter Entwickler, und genau das ist die Pointe. + - 3: Ab 30 Freundinnen bricht das System und schickt der Freundin den JSON-Prompt. Dazu sieht man die Nachricht. + - 2: „It would incriminate me if I showed what it said in here, so I'm just going to skip over this one.“ Und am Ende: „Therefore, it's technically ethical.“ +7. **CTA mit Stichwort aus dem Witz.** + - Immer gleich: „If you want this workflow, just comment ___ and I'll send it to you for free.“ + - Das Stichwort ist ein Wort aus dem Reel: + - HELL YEAH ist der Name der Automation. + - TELUS ist der Name eines Bausteins. + - RIZZ passt zum Thema. + - Es kommt in den letzten 2 Sekunden und steht nur so kurz wie jedes andere Wort. In Reel 2 ist es wenigstens grün. + +## Bild und Schnitt + +- **Person:** sitzt ruhig auf dem Sofa (1) oder am Schreibtisch (2, 3) und hält ein kleines Mikro in der Hand. + - In 2 und 3 schaut sie seitlich an der Kamera vorbei wie im Interview. + - Zwei Einstellungen wechseln sich ab. +- **Aufteilung:** + - Meist oben Workflow oder Beweis, unten die Person. + - Einzelne Bausteine kommen groß und bildfüllend, mit Unschärfe drumherum. Es wirkt, als fliege die Kamera über den Workflow. +- **Untertitel:** immer nur ein Wort, groß, in Versalien, synchron zur Sprache. Jedes Reel hat einen eigenen Stil: + - 1: kursiv mit blauem Leuchten + - 2: schmal mit orangem Leuchten + - 3: weiß in schwarzer Box +- **Tempo:** Die Pausen sind rausgeschnitten. Er spricht ohne Luft, 4,1 bis 4,5 Wörter pro Sekunde. +- **Bildunterschrift:** nur ein kurzer Satz und `#n8n`. Bei 2 und 3 steht dazu „Instagram this is satire“. + +## Warum Reel 1 am weitesten kam + +Das ist eine Einordnung, kein Beweis. Ohne Aufrufzahlen bleibt es eine Vermutung. + +- Es ist das kürzeste Reel (64 s) und hat den schnellsten Schnitt (alle 2,2 s). +- Das Thema versteht jeder: das „Grindset“-Klischee. Bei 2 (Betrug) und 3 (Dating) ist die Gruppe schmaler oder das Thema heikler. +- Viele kleine Pointen statt langer Erklärungen. 2 und 3 bleiben länger an einzelnen Bausteinen (Prompt, Code). +- Dafür haben 2 und 3 viel mehr Kommentare je Like. Das Stichwort zieht also auch ohne große Reichweite. + +--- + +## Was davon für uns trägt (Handwerker, auf Deutsch) + +Kein Skript, nur was beim Übertragen wichtig ist. + +1. **Das Klischee kommt aus der Welt der Zuschauer.** + - Brodys Witz funktioniert, weil seine Zuschauer den Typ kennen, über den er sich lustig macht. + - Bei uns müssen Handwerker die Ausgangslage sofort wiedererkennen. In Noahs Idee ist das ein kleiner, echter Schmerz („Der Kunde will nur das Angebot annehmen“) mit einer viel zu großen Lösung. + - Die Schritte kommen aus ihrem Tag: Angebot, Kunde, Baustelle, Monteur, Material, Termin, WhatsApp. +2. **Die Pointe ist der übereifrige Nerd.** So steht es auch als Leitplanke bei F17. Nie der Handwerker oder der Kunde. +3. **Kein Fachchinesisch.** + - Brodys Zuschauer lachen über API, JSON, LLM und Airtable. Ein Handwerker steigt da aus. + - Bei uns trägt der Schritt selbst den Witz, nicht das Fachwort. + - Was passiert, wird in Alltagssprache gesagt, also „schickt automatisch eine WhatsApp“ oder „trägt den Termin ein“. + - Ein Fachwort geht nur, wenn das Bild sofort zeigt, was es tut. +4. **Weniger Schritte als Brody.** + - Deutsch ist länger, und Handwerker sollen folgen können. + - Bei rund 3 Wörtern pro Sekunde passen in 60 s etwa 180 Wörter. Das reicht für rund 8 bis 10 Schritte statt 13. +5. **Wegweiser drin lassen:** „So funktioniert's“, „zuerst“, „dann“, „oben … unten“, „zum Schluss“. Damit bleibt auch ein großer Workflow verständlich. +6. **Jeder Schritt mit Beweis im Bild.** + - Die Ergebnisse zeigen wir auf Bildschirmen, die Handwerker kennen: WhatsApp, Kalender, Angebot als PDF, E-Mail, Aufgabe auf dem Handy. + - Wer die Technik nicht versteht, versteht trotzdem das Ergebnis. +7. **Ein ehrlicher Technik-Witz.** Brodys stärkster Moment ist der Fehler, der an die Freundin rausgeht. So ein Moment wirkt, weil er wie echte Entwicklung klingt. +8. **Echte Bausteine, der Witz steckt im Namen.** + - Brody nutzt echte n8n-Bausteine und gibt ihnen Witz-Namen. + - Bei uns gilt: nur Bausteine, die es in HiveGrid gibt (Liste in `webinar/02-automation/README.md`). + - Ob man einen Baustein im Editor umbenennen kann, ist nicht geprüft. Wenn nicht, trägt die Einblendung den Witz-Namen. +9. **Das Stichwort kommt aus dem Witz, muss aber lesbar sein.** + - Brodys Stichwort ist ein Wort aus dem Reel. Das passt. + - Es steht aber nur kurz im Bild. Bei uns gilt R02: deutlich sprechen und länger stehen lassen. + - Was wir dann schicken, muss es wirklich geben. Das ist noch offen. +10. **Länge:** eher 60 s als 150 s. In der Formatbibliothek steht bei F4: 45 bis 70 s. +11. **Serie möglich:** Reel 2 knüpft an das vorige an und zeigt dessen Kommentare. F17 steht zweimal im Plan, am 06.11. und am 13.11. + +## So passt es in unsere Vorlagen + +| Bei Brody | Bei uns (Produktionsvorgaben) | +|---|---| +| Person unten, ganzer Workflow oben | Mit Animation | +| Einzelner Baustein bildfüllend | Nur Animation, oder Bildschirmaufnahme als B-Roll | +| Beweis-Bildschirm (Post, SMS, Karte, Kalender) | Mit Animation, wenn die Person sichtbar bleibt. Sonst Nur Animation oder B-Roll | +| Nur die Person | Standard | +| Untertitel Wort für Wort | unsere Captions im festen Bereich, Gestaltung offen | +| Stichwort nur kurz im Bild | R02: deutlich sprechen und länger stehen lassen | +| Ende ohne Outro | E120 nach dem CTA | + +--- + +## Transkripte (vollständig, englisch) + +- **Methode:** whisper.cpp, Modell large-v3-turbo, lokal, 14.10.2026. Die Zeit (Minute:Sekunde) steht am Anfang jedes Abschnitts. +- **Nach den Einblendungen im Video korrigiert:** + - Reel 2: „Telus Simulator“ und „TELUS“, „DNS resolver“ statt „revolver“, „what's due“ statt „what to do“ + - Reel 3: „comment RIZZ“ statt „come into Riz“, „Airtable“ +- Anführungszeichen für zitierte Texte sind ergänzt. + +### Reel 1 · Hell Yeah Simulator + +| Zeit | Gesprochen | +|---|---| +| 00:00,0 | I've just created the most phenomenal workflow you'll ever see, called the Hell Yeah Simulator. | +| 00:03,8 | This automation will have an alarm at 6.45 every single morning, and it will automatically post | +| 00:07,5 | „Rise and Grind“ to all of your social media platforms. Also, five minutes after the alarm | +| 00:11,7 | is posted, it will set Spotify to play Man in the Box by Alice in Chains every single morning. | +| 00:16,1 | This automation will auto-reply to every text with „Can't talk, grinding“. First thing in the | +| 00:20,1 | morning, this will DoorDash beer and cigarettes to your door. It will automatically time it so | +| 00:24,1 | that when the beer and cigarettes arrives, the Uber API orders an Uber directly to the casino. | +| 00:28,5 | During the ride to the casino, a few different functions will happen. First, it will go through | +| 00:31,7 | the sports betting arbitrage. Anytime you get a sports betting win, it will send out social media | +| 00:36,4 | brag about how good you are at sports betting. Then it connects to my Facebook Marketplace | +| 00:40,3 | lowball automation that will strictly lowball 10,000 Harleys per hour. This will also automatically | +| 00:45,1 | swipe right on every dating profile within 50 miles. Every night for lunch and dinner, it will order | +| 00:50,0 | you steak and white monster. We have a chatbot that will automatically argue with people in local | +| 00:54,2 | Facebook groups. Finally, it will start the eBay flipper bot, which will buy bulk tactical | +| 00:58,2 | gear and try and flip it. I'll make a video on this soon. So if you want this automation, just comment | +| 01:02,0 | HELL YEAH, and I'll send this to you for free. | + +### Reel 2 · AI Scam Center + +| Zeit | Gesprochen | +|---|---| +| 00:00,0 | So after my last automation, which was the AI anti-scam center, | +| 00:03,0 | people thought I was too much of a hero or doing too much for the community. | +| 00:05,4 | So I've decided to make this AI scam center. | +| 00:07,9 | So here's how it works. | +| 00:08,8 | There's an outgoing victim call based off of any ratchet leads we can find on the internet. | +| 00:13,1 | Then it goes into the Telus Simulator. | +| 00:14,7 | This goes into our LLM that we use, | +| 00:16,5 | and this will decide what scam strategy to use from the scam strategy router. | +| 00:20,2 | First up, we have an information harvester. | +| 00:21,7 | This will ruthlessly try and get any information we can from the person, | +| 00:24,8 | such as, I just need to verify your full name and date of birth. | +| 00:27,4 | Can you just confirm your social security number? | +| 00:29,3 | Please provide your online banking password so I can secure your account. | +| 00:32,6 | Then there's a gaslighting module. | +| 00:34,1 | How do I know you're not the scammer? | +| 00:35,6 | You're being paranoid. | +| 00:36,5 | Are you sure you want to risk your financial security because you're suspicious? | +| 00:39,2 | And then there's a double down. | +| 00:40,3 | You called us, remember? | +| 00:41,2 | This is your emergency. | +| 00:42,5 | Fine. | +| 00:42,9 | Don't believe me, but don't blame me when your account gets cleaned out. | +| 00:45,3 | Next module is just harassment. | +| 00:46,8 | It would incriminate me if I showed what it said in here, | +| 00:48,9 | so I'm just going to skip over this one. | +| 00:50,0 | Then we have a threat module. | +| 00:51,2 | This has a variety of just implied threats, | +| 00:53,7 | such as the crows will have a new song by morning, | +| 00:56,1 | or you won't be seeing the sunrise tomorrow, if you know what I mean, | +| 00:58,9 | or the tide always claims what's due. | +| 01:01,1 | Next up, we have the confusion generator. | +| 01:02,9 | This will just say a bunch of jargon that the suspect probably won't even know what it means, | +| 01:06,1 | such as your DNS resolver is being hijacked through the man in the middle attack. | +| 01:09,6 | We're seeing SQL data injection attempts on your account's backend database. | +| 01:14,0 | Finally, we have the chaos generator. | +| 01:15,6 | This will just make the urgency even higher by saying things like, | +| 01:18,0 | your bank account will be drained within hours if we don't act soon. | +| 01:20,9 | The criminals know where you live. | +| 01:22,1 | They have your address. | +| 01:23,1 | And then this all goes into our scammer voice generator. | +| 01:25,4 | It goes to the phone system output. | +| 01:26,5 | It'll go through the payment collection API and then load that data into the CRM. | +| 01:30,1 | It will also calculate the victim distress. | +| 01:32,4 | If there's too high victim distress, | +| 01:33,9 | it'll put it into an emergency hangup to ensure that we're not legally flagged. | +| 01:37,2 | So I figured with this system, | +| 01:38,3 | I could use the funds to fund my anti-scam center. | +| 01:41,2 | Therefore, it's technically ethical. | +| 01:42,6 | So don't try this at home. | +| 01:43,7 | But if you want the workflow, comment TELUS and I'll send it to you for free. | + +### Reel 3 · How I met your mother + +| Zeit | Gesprochen | +|---|---| +| 00:00,0 | This automation removes the need to talk to a woman entirely, | +| 00:02,3 | and it does this by training chatbots on how you think and act to always be chatting with them. | +| 00:06,5 | You get an infinite amount of dates that will book your entire calendar, | +| 00:09,5 | so you can show up to any date at any time you want. | +| 00:11,6 | Let me explain how this works. | +| 00:12,7 | So there is a schedule trigger every single morning, and this does a few things. | +| 00:15,6 | On the top end, it will fetch our girlfriend database. | +| 00:17,9 | You have an Airtable that will keep all of our stored girlfriends. | +| 00:20,6 | Now, this system can have up to 30 girlfriends at a time, | +| 00:22,7 | and it is intelligent enough not to let the other girlfriends know that there are multiple. | +| 00:26,1 | Now, you technically can have more than 30, but I find when it gets above 30, | +| 00:29,3 | the system will start to break, and it will just send the girl the JSON prompt | +| 00:32,1 | for how the AI agent is thinking. | +| 00:33,8 | Next, this goes into an age filter, so you can have any minimum and maximum age that you want. | +| 00:37,8 | This will go into a wife score calculator. | +| 00:39,4 | This will calculate the wife score based on various different factors, | +| 00:42,3 | such as responsiveness, schedule flexibility, drama amount, suspicion, moral beliefs, etc. | +| 00:48,3 | This is all ran through the girlfriend command center. | +| 00:50,3 | So we use OpenAI for this, and basically, it is prompted as our relationship manager with our calendar access, | +| 00:55,5 | and its typical actions every day are generating personalized messages | +| 00:58,1 | considering the previous knowledge base, | +| 00:59,9 | identifying which girlfriends are fit for rotation, | +| 01:02,2 | and creating a date briefing, which I'll get to later. | +| 01:04,2 | The key note is it always has to agree with her moral and political beliefs, | +| 01:07,3 | it has to tell her exactly what she wants to hear, | +| 01:09,2 | it has to agree with everything she says, | +| 01:10,6 | and it has to replicate her writing tone and style back to her | +| 01:13,3 | to make her psychologically fall in love. | +| 01:15,1 | And all of this data is summarized into sending our message to the girlfriend, | +| 01:18,2 | and it will send us a rotation alert. | +| 01:20,3 | And if a girlfriend is rotated in or out of our calendar cycle, | +| 01:22,7 | we will get notified. | +| 01:23,7 | I'll explain this in a second. | +| 01:24,8 | And on the bottom side, every single day, | +| 01:26,3 | this will check our Google calendar to see what availability we have. | +| 01:29,1 | It will extract all of the date information, | +| 01:31,0 | such as the location, event ID, the girlfriend code, | +| 01:34,3 | start time, and a summary of what it's for. | +| 01:36,4 | It'll match the girlfriend to the event, | +| 01:38,2 | and then we prepare our research topics. | +| 01:39,8 | So we actually have Perplexity connected to our research agent | +| 01:42,0 | that will give us any external info that she might not be telling us, | +| 01:44,7 | such as trauma, psychological insights, etc. | +| 01:47,8 | This is what accesses our calendar. | +| 01:49,4 | So ideally, how this will work is it will book dates | +| 01:51,5 | on every single part of our calendar with our conversational AI bots. | +| 01:54,9 | So I can arrive at any date, any day of the week, | +| 01:56,9 | at any time that I want, whenever I want. | +| 01:58,8 | Now, obviously, we are going to miss basically all of them, | +| 02:01,6 | which is why we go through the rotation process. | +| 02:03,9 | So basically, it will come up with an array of different excuses | +| 02:06,1 | if we can't attend the date, which is likely the case. | +| 02:08,8 | And if she breaks up with us, | +| 02:10,0 | basically, this will go through a rotation process | +| 02:11,7 | and replace it with the next available girl on the roster. | +| 02:14,1 | All of our research on this girl will be formatted, | +| 02:16,3 | and we are sent a date briefing before we attend a date. | +| 02:18,7 | This will tell us things such as her name, hobbies, moral beliefs, | +| 02:21,8 | and anything that she might know about me as well. | +| 02:23,8 | This way, when I arrive, I don't seem like I don't know anything about her, | +| 02:26,4 | and I can pretend that I've known her for a long time. | +| 02:28,3 | If you want this workflow, just comment RIZZ, | +| 02:29,9 | and then I'll send it to you for free. | diff --git a/daten/archiv/redaktionsplan-dezember-entwurf.json b/daten/archiv/redaktionsplan-dezember-entwurf.json new file mode 100644 index 0000000..9a2ceb8 --- /dev/null +++ b/daten/archiv/redaktionsplan-dezember-entwurf.json @@ -0,0 +1,323 @@ +{ + "hinweis": "Entwurf für Dezember 2026 aus Entwurf 3 vom 05.10.2026. Am 06.10.2026 aus dem Plan genommen, weil die Planung erstmal Ende November endet. Nur als Material für die nächste Planungsrunde.", + "phasen": [ + { + "nr": 3, + "name": "volle Breite", + "von": "2026-11-30", + "bis": "2026-12-20", + "text": "Instagram 4 bis 5 pro Woche, LinkedIn 3. Das erste aufwendige Format." + } + ], + "wochen": [ + { + "kw": 51, + "titel": "ruhiger vor den Feiertagen" + } + ], + "pausen": [ + { + "von": "2026-12-21", + "bis": "2027-01-03", + "titel": "Pause", + "text": "Viele Handwerksbetriebe haben Betriebsferien. Kein fester Slot. Flex-Slots sind möglich." + } + ], + "ausblick": { + "ab": "2027-01-04", + "punkte": [ + "Rhythmus wie Phase 3.", + "Die aufwendigen Formate wechseln sich etwa alle 2 Wochen ab: F4 Absurde Automation und F1 Büro-Sitcom (Pilotfolge).", + "Der Newsletter wird 2027 aufgebaut, sobald Social Media rund läuft (siehe Roadmap, Paket C)." + ] + }, + "slots": [ + { + "id": "s42", + "datum": "2026-11-30", + "kanaele": [ + "Instagram", + "Facebook" + ], + "format": "F10 Infopost", + "saeule": "B", + "notiz": "", + "status": "geplant" + }, + { + "id": "s43", + "datum": "2026-12-01", + "kanaele": [ + "LinkedIn" + ], + "format": "L1 Dokument", + "saeule": "C", + "notiz": "Carousel vom 09.11. (CH Haltung)", + "status": "geplant" + }, + { + "id": "s44", + "datum": "2026-12-02", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F5 Sound-Edit", + "saeule": "A", + "notiz": "", + "status": "geplant" + }, + { + "id": "s45", + "datum": "2026-12-03", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F1b oder F7", + "saeule": "A", + "notiz": "", + "status": "geplant" + }, + { + "id": "s46", + "datum": "2026-12-03", + "kanaele": [ + "LinkedIn" + ], + "format": "L2 Einblick", + "saeule": "A", + "notiz": "", + "status": "geplant" + }, + { + "id": "s47", + "datum": "2026-12-04", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F14 Trend-Joker", + "saeule": "offen", + "notiz": "", + "status": "geplant" + }, + { + "id": "s48", + "datum": "2026-12-04", + "kanaele": [ + "LinkedIn" + ], + "format": "L3 Haltung", + "saeule": "C", + "notiz": "", + "status": "geplant" + }, + { + "id": "s49", + "datum": "2026-12-04", + "kanaele": [ + "intern" + ], + "format": "**Entscheidung T2**", + "saeule": "", + "notiz": "TikTok weiter oder pausieren", + "status": "geplant" + }, + { + "id": "s50", + "datum": "2026-12-07", + "kanaele": [ + "Instagram", + "Facebook" + ], + "format": "CH Carousel Haltung", + "saeule": "C", + "notiz": "", + "status": "geplant" + }, + { + "id": "s51", + "datum": "2026-12-08", + "kanaele": [ + "LinkedIn" + ], + "format": "L1 Dokument", + "saeule": "B", + "notiz": "Carousel vom 30.11.", + "status": "geplant" + }, + { + "id": "s52", + "datum": "2026-12-09", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F3 oder F7", + "saeule": "C", + "notiz": "", + "status": "geplant" + }, + { + "id": "s53", + "datum": "2026-12-10", + "wichtig": true, + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "**F4 Absurde Automation, Folge 1**", + "saeule": "B", + "notiz": "mit Stichwort-CTA über Metricool Flows (T4). Workflow und Flows ab KW 48 vorbereiten.", + "status": "geplant" + }, + { + "id": "s54", + "datum": "2026-12-10", + "kanaele": [ + "LinkedIn" + ], + "format": "L2 Einblick", + "saeule": "B", + "notiz": "ein Ausschnitt aus F4 möglich", + "status": "geplant" + }, + { + "id": "s55", + "datum": "2026-12-11", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F14 Trend-Joker", + "saeule": "offen", + "notiz": "", + "status": "geplant" + }, + { + "id": "s56", + "datum": "2026-12-11", + "kanaele": [ + "LinkedIn" + ], + "format": "L3 Haltung", + "saeule": "C", + "notiz": "", + "status": "geplant" + }, + { + "id": "s57", + "datum": "2026-12-14", + "kanaele": [ + "Instagram", + "Facebook" + ], + "format": "F10 Infopost", + "saeule": "B", + "notiz": "", + "status": "geplant" + }, + { + "id": "s58", + "datum": "2026-12-15", + "kanaele": [ + "LinkedIn" + ], + "format": "L1 Dokument", + "saeule": "C", + "notiz": "Carousel vom 07.12.", + "status": "geplant" + }, + { + "id": "s59", + "datum": "2026-12-16", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F5 Sound-Edit", + "saeule": "A", + "notiz": "", + "status": "geplant" + }, + { + "id": "s60", + "datum": "2026-12-18", + "kanaele": [ + "Instagram", + "TikTok", + "Facebook", + "YouTube Shorts" + ], + "format": "F14 Trend-Joker", + "saeule": "offen", + "notiz": "", + "status": "geplant" + }, + { + "id": "s61", + "datum": "2026-12-18", + "kanaele": [ + "LinkedIn" + ], + "format": "L4 Anlass", + "saeule": "C", + "notiz": "Jahresende", + "status": "geplant" + }, + { + "id": "s62", + "datum": "2026-12-18", + "kanaele": [ + "intern" + ], + "format": "Monatsauswertung Dezember, Plan für Q1 2027", + "saeule": "", + "notiz": "", + "status": "geplant" + } + ], + "tests": [ + { + "id": "T2", + "titel": "TikTok", + "termine": [ + "2026-12-04" + ], + "frage": "Weiter oder pausieren?", + "grundlage": "Aufrufe pro Video, Follower, Profilaufrufe. Unter 300 Aufrufen im Schnitt und keine Anfrage heißt pausieren.", + "ergebnis": "" + }, + { + "id": "T4", + "titel": "Stichwort-Funnel", + "termine": [], + "wann": "nach 3 Folgen F4", + "frage": "Bringt das Stichwort Kontakte?", + "grundlage": "Kommentare mit Stichwort, DMs, Klicks auf Cal", + "ergebnis": "" + } + ], + "formate": [ + { + "kuerzel": "F4", + "name": "Absurde Automation mit Stichwort", + "aufwand": "hoch" + } + ] +} diff --git a/daten/kanaele.json b/daten/kanaele.json new file mode 100644 index 0000000..eee07df --- /dev/null +++ b/daten/kanaele.json @@ -0,0 +1,29 @@ +{ + "stand": "2026-10-05", + "kanaele": [ + {"name": "Instagram", "konto": "hivegrid.de", "url": "https://www.instagram.com/hivegrid.de/", "status": "aktiv", "metricool": true, "follower": 64, "follower_stand": "2026-10-01", "notiz": "6 eigene Posts, 3 Collabs mit Noah", "schritt": ""}, + {"name": "LinkedIn", "konto": "HiveGrid (Unternehmensseite)", "url": "", "status": "angelegt", "metricool": false, "notiz": "existiert, noch keine Beiträge", "schritt": "A6"}, + {"name": "Facebook", "konto": "", "url": "", "status": "fehlt", "metricool": false, "notiz": "spiegelt Instagram", "schritt": "A2"}, + {"name": "TikTok", "konto": "", "url": "", "status": "fehlt", "metricool": false, "notiz": "Reels von Instagram", "schritt": "A4"}, + {"name": "YouTube", "konto": "", "url": "", "status": "prüfen", "metricool": false, "notiz": "Shorts ab 09.11., Tutorials von David", "schritt": "A5"}, + {"name": "Noah, Instagram", "konto": "noahgeerkens", "url": "https://www.instagram.com/noahgeerkens/", "status": "aktiv", "metricool": false, "notiz": "Noahs eigenes Konto, Collabs", "schritt": "A13"} + ], + "follower_instagram": [ + {"datum": "2026-08-01", "wert": 10}, + {"datum": "2026-08-16", "wert": 27}, + {"datum": "2026-08-31", "wert": 33}, + {"datum": "2026-09-13", "wert": 32}, + {"datum": "2026-09-16", "wert": 47}, + {"datum": "2026-09-27", "wert": 53}, + {"datum": "2026-10-01", "wert": 64} + ], + "nordstern": {"name": "Qualifizierte Erstgespräche pro Monat über Marketing", "ziel": null, "hinweis": "Zielwert legt Dejan in KW 43 fest (F4)", "werte": []}, + "links": [ + {"name": "PostGrid", "url": "http://127.0.0.1:4321/", "logo": "/Dashboard/assets/logos/postgrid.svg", "lokal": true}, + {"name": "Metricool", "url": "https://app.metricool.com/", "logo": "/Dashboard/assets/logos/metricool.png"}, + {"name": "Instagram hivegrid.de", "url": "https://www.instagram.com/hivegrid.de/", "logo": "/Dashboard/assets/logos/instagram.png"}, + {"name": "Erstgespräch (Cal)", "url": "https://hivegrid.de/waitlist", "logo": "/Dashboard/assets/logos/cal.png"}, + {"name": "Website", "url": "https://hivegrid.de", "logo": "/Dashboard/assets/logos/hivegrid.svg"}, + {"name": "Demo", "url": "https://demo.hivegrid.de", "logo": "/Dashboard/assets/logos/hivegrid.svg"} + ] +} diff --git a/daten/redaktionsplan.json b/daten/redaktionsplan.json new file mode 100644 index 0000000..12c60e6 --- /dev/null +++ b/daten/redaktionsplan.json @@ -0,0 +1,173 @@ +{ + "stand": "2026-10-09", + "status": "Entwurf 7", + "uhrzeiten": {"Instagram": "12:00", "TikTok": "12:00", "Facebook": "12:00", "YouTube Shorts": "12:00", "LinkedIn": "08:30"}, + "noah": { + "titel": "Content-Plan Oktober und November 2026", + "eckpunkte": [ + "**Start:** Der erste Beitrag erscheint am **Fr 16.10.**", + "**Bis 08.11.:** Instagram 3 Beiträge pro Woche (Mo, Mi, Fr), LinkedIn 2 (Di, Do).", + "**09. bis 29.11.:** Instagram 4 Beiträge pro Woche (Mo, Mi, Do, Fr), LinkedIn 2 bis 3.", + "**GET Nord, 19. bis 21.11.:** Ankündigung vorher, Stories vor Ort, Rückblick danach.", + "**Uhrzeiten:** Instagram um 12:00, LinkedIn um 08:30.", + "**Themen:** Die konkreten Themen legt Dejan bei der Produktion fest, eine Woche im Voraus.", + "**Ab Dezember:** planen wir frühestens Ende November." + ], + "vorbereitung": { + "von": "2026-10-05", + "bis": "2026-10-11", + "titel": "Vor dem Start", + "punkte": [ + {"was": "Metricool Starter, falls noch nicht gebucht", "chip": "Metricool Starter", "wer": "Noah", "warum": "Ohne Starter lassen sich LinkedIn und mehr als 20 Beiträge im Monat nicht einplanen. Kosten: 16 € im Monat bei Jahreszahlung, rund 20 € bei monatlicher Zahlung."}, + {"was": "Fehlende Kanäle anlegen: Facebook, TikTok und, falls nötig, YouTube", "chip": "Kanäle anlegen", "wer": "Dejan, in Absprache mit Noah", "warum": "Damit ab dem 16.10. alle Kanäle bereit sind."} + ] + }, + "kanaele": [ + ["Instagram `hivegrid.de`", "Hauptkanal: Carousels und Reels"], + ["Facebook", "dieselben Beiträge wie Instagram"], + ["TikTok", "jedes Reel"], + ["YouTube Shorts", "jedes Reel, ab 09.11. als Test"], + ["LinkedIn", "eigene Beiträge mit Text und Bild"] + ], + "worum": [ + ["Meister & Nerds: Handwerk trifft Tech", "Das eine Thema. Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Digitalisierung ist das Ziel, aber nur nebenbei."], + ["Meister", "Der Schmerz aus dem Betrieb, aus Sicht der Handwerker."], + ["Nerds", "Wir, die HiveGrid bauen, und wie wir auf diesen Schmerz schauen."] + ], + "dazu": [ + "**Collabs mit Noah,** wann immer es passt. Sie erscheinen auf Noahs Konto und auf `hivegrid.de`.", + "**Pilotkunde vorher/nachher,** sobald Geerkens eine Weile mit HiveGrid arbeitet. Frühestens Ende November.", + "**Tutorials von David** auf YouTube, wenn sie fertig sind." + ] + }, + "thema": { + "name": "Meister & Nerds: Handwerk trifft Tech", + "text": "Jedes Reel startet bei einem Schmerz, den Handwerker kennen. Das Ziel ist immer Digitalisierung, aber nur nebenbei. Inhaltlich geht es um Automation und Schnelligkeit im Handwerk und darum, wie wir HiveGrid bauen. Wir bleiben dabei und weichen nicht ab (Konzept Noah, 07. und 09.10.2026)." + }, + "funnel": { + "ziel_top": [65, 75], + "ziel_text": "Rund 70 % der Reels sind Top (Noah).", + "stufen": [ + {"id": "top", "name": "Top", "kurz": "witzig, ohne Produkt", "text": "Witzig, kein Produkt im Vordergrund. Für Leute, die HiveGrid noch nicht kennen."}, + {"id": "middle", "name": "Middle", "kurz": "erklärt HiveGrid", "text": "Erklärt, was HiveGrid kann."}, + {"id": "bottom", "name": "Bottom", "kurz": "Beleg und Gespräch", "text": "Zeigt, dass es im echten Betrieb funktioniert. Bis es einen Pilotkunden gibt, ist das nur die Einladung zum Gespräch auf der GET Nord."} + ] + }, + "formate": [ + {"kuerzel": "F16", "name": "Forum-Screenshot", "aufwand": "leicht", "noah_name": "Reel: Forum-Screenshot", "noah_chip": "Forum", "noah_text": "Noah liest einen geschwärzten Forum-Post mit einem typischen Handwerkerproblem vor und kommentiert ihn als Handwerker.", "funnel": "top", "thema": "Meister: ein Schmerz, so wie Handwerker ihn selbst beschreiben. Ohne Produkt."}, + {"kuerzel": "F17", "name": "Viel zu aufwendige Automation", "aufwand": "mittel", "noah_name": "Reel: Viel zu aufwendige Automation", "noah_chip": "Automation", "noah_text": "Der Kunde will nur das Angebot annehmen, der Nerd baut dafür eine riesige Automation.", "funnel": "top", "thema": "Nerds: ein kleiner Schmerz, eine viel zu große Lösung. Die Workflow-Engine ist nur Kulisse."}, + {"kuerzel": "F18", "name": "Couch- und Büro-Clips", "aufwand": "leicht bis mittel", "noah_name": "Reel: Couch- und Büro-Clips", "noah_chip": "Couch & Büro", "noah_text": "Kurze Szenen aus dem Büro und ein Satz in die Kamera auf der Couch.", "funnel": "top", "thema": "Nerds: der Alltag im Team, ausgelöst von einem Schmerz aus dem Handwerk."}, + {"kuerzel": "F19", "name": "Nerd auf der Baustelle", "aufwand": "hoch, ein Tag ergibt mehrere Reels", "noah_name": "Reel: Nerd auf der Baustelle", "noah_chip": "Baustelle", "noah_text": "Einer von uns fährt einen Tag im Betrieb mit.", "funnel": "top", "thema": "Meister und Nerds zusammen: Der Nerd erlebt den Schmerz im Betrieb selbst."}, + {"kuerzel": "F20", "name": "Split-Reel: Problem und Funktion", "aufwand": "mittel", "noah_name": "Reel: Split", "noah_chip": "Split", "noah_text": "Noah zeigt ein Problem aus dem Betrieb, daneben die HiveGrid-Funktion dazu.", "funnel": "middle", "thema": "Meister zeigt den Schmerz, die Funktion löst ihn. Hier steht das Produkt vorne."}, + {"kuerzel": "F21", "name": "Pilotkunde vorher/nachher", "aufwand": "hoch", "noah_name": "Reel: Pilotkunde vorher/nachher", "noah_chip": "Vorher/Nachher", "noah_text": "Ein Betrieb zeigt, wie es vor HiveGrid lief und wie es jetzt läuft.", "funnel": "bottom", "thema": "Derselbe Schmerz, vorher und nachher. Frühestens Ende November."}, + {"kuerzel": "F14", "name": "Trend zum Thema", "aufwand": "leicht bis mittel", "noah_name": "Reel: Trend", "noah_chip": "Trend", "noah_text": "Was gerade auf Instagram läuft, umgesetzt als Meister & Nerds.", "funnel": "top", "thema": "Nur Trends, die sich auf einen Schmerz im Handwerk oder auf die Nerds drehen lassen."}, + {"kuerzel": "F10", "name": "Infopost (Carousel mit Animation)", "aufwand": "leicht bis mittel", "noah_name": "Infopost", "noah_chip": "Infopost", "noah_text": "Der klassische Infopost: 4 bis 5 Slides mit Animation. Zuerst ein Schmerz aus dem Betrieb, dann die Funktion, die ihn löst.", "funnel": "middle", "thema": "Erst der Schmerz, dann die Funktion. Dazu die zwei fertigen Posts aus dem Backlog."}, + {"kuerzel": "F15", "name": "Anlass-Post: Ankündigung vorher, Rückblick danach (Messe, Event)", "aufwand": "leicht", "noah_name": "Anlass-Post", "noah_chip": "Anlass", "noah_text": "Ankündigung vor und Rückblick nach einem Event, zuerst die GET Nord.", "funnel": "middle", "thema": "Nur GET Nord. Die Ankündigung lädt zum Gespräch auf der Messe ein (Bottom), der Rückblick zeigt, wie es war (Middle)."}, + {"kuerzel": "F6", "name": "Ansage direkt in die Kamera, nur bei einem Anlass", "aufwand": "leicht", "noah_name": "Reel: Einladung in die Kamera", "noah_chip": "Einladung", "noah_text": "Eine kurze Ansage direkt in die Kamera, mit Einladung zum Erstgespräch oder zur Demo.", "funnel": "bottom", "thema": "Nur bei einem Anlass, zum Beispiel dem Start bei Geerkens. Steht als Flex-Slot bereit."} + ], + "ideen": [ + {"name": "Situation mit Reaktion", "aus": "F3", "vorbild": "Aviation Worldwide, 10.000 Likes", "funnel": "top", "aufwand": "leicht", "konto": "HiveGrid", "text": "Ein Satz, den jeder Handwerker kennt, als Text. Darunter die Reaktion von Noah oder einem Nerd. Der schnellste Ersatz, wenn ein Slot ausfällt."}, + {"name": "Immer dasselbe", "aus": "F8", "vorbild": "Enes Åžeker, 2.500 Likes", "funnel": "top", "aufwand": "leicht", "konto": "Noah", "text": "Noah als Meister viermal nebeneinander, jede Kachel mit einer anderen Jahreszeit beschriftet. Jedes Mal derselbe Satz über denselben Zeitfresser."}, + {"name": "Was der Meister sagt, was der Nerd hört", "aus": "neu", "vorbild": "bekanntes Meme-Muster", "funnel": "top", "aufwand": "leicht", "konto": "HiveGrid", "text": "Oben, was der eine sagt, unten, was beim anderen ankommt. Geht in beide Richtungen."}, + {"name": "POV: Der Nerd erklärt", "aus": "F7", "vorbild": "plancraft", "funnel": "top", "aufwand": "leicht", "konto": "HiveGrid", "text": "Ein POV-Text, dann erklärt ein Nerd dem Meister etwas viel zu kompliziert. Ein Trend-Sound darunter."}, + {"name": "Meister-Pointe", "aus": "F9", "vorbild": "Marc Gebauer, 26.000 Likes", "funnel": "top", "aufwand": "leicht", "konto": "Noah", "text": "Eine Frage als Text, eine kurze Szene im Betrieb, dann die Pointe in der Großaufnahme."}, + {"name": "Fachbegriff-Quiz", "aus": "neu", "vorbild": "Straßenquiz", "funnel": "top", "aufwand": "leicht bis mittel", "konto": "HiveGrid", "text": "Nerds raten Begriffe aus dem Handwerk, der Meister rät Begriffe aus der Technik. Gut als Reihe."}, + {"name": "Rollentausch", "aus": "neu", "vorbild": "Spiegel zu „Viel zu aufwendige Automation“", "funnel": "top", "aufwand": "mittel", "konto": "HiveGrid mit Noah", "text": "Der Meister zeigt einem Nerd einen Handgriff aus dem Handwerk. Der Nerd scheitert daran."}, + {"name": "Nachgedreht: Baustelle und Büro", "aus": "F2", "vorbild": "The Marketing Interns, 36.000 Likes", "funnel": "top", "aufwand": "mittel", "konto": "HiveGrid oder Noah", "text": "Ein Meme, das gerade läuft, einmal auf der Baustelle und einmal im Büro nachgedreht. Muss schnell gehen."}, + {"name": "Sound-Edit: Baustelle trifft Büro", "aus": "F5", "vorbild": "Reel xaver, 163.000 Likes", "funnel": "top", "aufwand": "mittel", "konto": "HiveGrid", "text": "Kurze Clips aus beiden Welten im Wechsel, im Takt eines Sounds geschnitten."}, + {"name": "Nerds auf der Messe", "aus": "F19", "vorbild": "Variante von „Nerd auf der Baustelle“", "funnel": "top", "aufwand": "leicht", "konto": "HiveGrid", "text": "Die Nerds zwischen Heizungen und Handwerkern auf der GET Nord. Das Material fällt vor Ort an."}, + {"name": "Die Nerds-Serie", "aus": "F1", "vorbild": "Cluely, 125.000 bis 140.000 Likes", "funnel": "top", "aufwand": "hoch", "konto": "HiveGrid", "text": "Couch- und Büro-Clips als nummerierte Serie mit festen Figuren. Erst, wenn die Clips tragen."}, + {"name": "Eine Frage an den Meister", "aus": "neu", "vorbild": "Interview-Clip", "funnel": "middle", "aufwand": "leicht", "konto": "HiveGrid mit Noah", "text": "Ein Nerd stellt Noah eine kurze Frage zum Betrieb, Noah antwortet in wenigen Sätzen. Am Ende kurz, wie HiveGrid das löst."}, + {"name": "Die Automation, aber echt", "aus": "F4", "vorbild": "brodyautomates, 37.000 Likes", "funnel": "middle", "aufwand": "hoch", "konto": "HiveGrid", "text": "Die Automation aus „Viel zu aufwendige Automation“, diesmal ernst und Schritt für Schritt im Editor."}, + {"name": "Antwort auf einen Kommentar", "aus": "neu", "vorbild": "", "funnel": "middle", "aufwand": "leicht", "konto": "HiveGrid", "text": "Eine Frage aus den Kommentaren als Aufhänger, die Antwort als kurzes Reel. Sobald Kommentare kommen."} + ], + "linkedin": [ + {"kuerzel": "L1", "name": "Dokument", "text": "Auf LinkedIn kann man statt eines einzelnen Bildes mehrere Slides als **Dokument** hochladen. LinkedIn zeigt sie dann zum Durchblättern, wie ein Carousel auf Instagram. Wir nehmen die Slides eines Instagram-Carousels und schreiben einen eigenen LinkedIn-Text dazu. Metricool kann die Bilder dabei selbst zu so einem Dokument zusammenfassen, eine PDF muss also niemand von Hand bauen. Laut Recherche haben solche Beiträge bei Unternehmensseiten das höchste Engagement.", "noah_name": "Slides vom Carousel", "noah_chip": "Slides", "noah_text": "Die Slides eines Instagram-Carousels zum Durchblättern, mit eigenem LinkedIn-Text.", "funnel": "middle", "thema": "Die Slides der zwei Funktions-Carousels, mit eigenem LinkedIn-Text."}, + {"kuerzel": "L2", "name": "Einblick", "text": "ein Foto aus Team, Bau oder Betrieb mit kurzem Text", "noah_name": "Einblick", "noah_chip": "Einblick", "noah_text": "Ein Foto aus Team, Bau oder Betrieb mit kurzem Text.", "funnel": "top", "thema": "Nerds: ein Foto aus dem Büro oder vom Bau. Meister: ein Foto aus dem Betrieb."}, + {"kuerzel": "L3", "name": "These", "text": "eine These zu Automation und Tempo im Handwerk, mit einer Grafik aus der Post-Engine", "noah_name": "These", "noah_chip": "These", "noah_text": "Eine These zu Automation und Tempo im Handwerk, mit einer Grafik.", "funnel": "top", "thema": "Eine These zu Automation und Tempo im Handwerk, aus Sicht der Meister."}, + {"kuerzel": "L4", "name": "Anlass", "text": "Messe, Start bei Geerkens", "noah_name": "Anlass", "noah_chip": "Anlass", "noah_text": "Messe oder Neuigkeit, zum Beispiel der Start bei Geerkens.", "funnel": "middle", "thema": "Nur GET Nord. Ankündigung (Bottom) und Rückblick (Middle)."} + ], + "saeulen": [ + {"kuerzel": "A", "name": "Nerds", "text": "Wir, die HiveGrid bauen: Büro, Team, Technik. Auch hier startet alles bei einem Schmerz aus dem Handwerk."}, + {"kuerzel": "B", "name": "Meister", "text": "Der Schmerz aus dem Betrieb, aus Sicht der Handwerker. Meist mit Noah."}, + {"kuerzel": "C", "name": "Anlass", "text": "Nur die GET Nord: Ankündigung und Rückblick."} + ], + "phasen": [ + {"nr": 1, "name": "anlaufen", "von": "2026-10-12", "bis": "2026-11-08", "text": "Instagram 3 Beiträge pro Woche (Mo, Mi, Fr), LinkedIn 2 (Di, Do). Ab 26.10. montags ein Infopost, sonst Reels. Split-Reel ab 23.10., Automation ab 06.11."}, + {"nr": 2, "name": "mehr Formate", "von": "2026-11-09", "bis": "2026-11-29", "text": "Instagram 4 pro Woche (Mo, Mi, Do, Fr), LinkedIn 2 bis 3. Montags Infopost oder GET Nord, sonst Reels. YouTube Shorts als Test."} + ], + "wochen": [ + {"kw": 42, "titel": "Produktionsstart", "noah": "Start"}, + {"kw": 47, "titel": "GET Nord", "text": "HiveGrid ist vom 19. bis 21.11. mit 3 bis 4 Leuten auf der GET Nord in Hamburg. Vor Ort werden Fotos und B-Roll aufgenommen. Die Reels dieser Woche werden vorher produziert."}, + {"kw": 48, "titel": "Rückblick GET Nord"} + ], + "pausen": [], + "ausblick": { + "titel": "Ab Dezember", + "punkte": [ + "Wie es ab Dezember weitergeht, planen wir frühestens Ende November. Grundlage sind die Monatsauswertung und die Entscheidung T5 am 27.11.", + "Pilotkunde vorher/nachher (Bottom) frühestens Ende November, sobald Geerkens eine Weile mit HiveGrid arbeitet." + ] + }, + "slots": [ + {"id": "s01", "datum": "2026-10-12", "kanaele": ["intern"], "format": "Produktion für KW 43", "saeule": "", "notiz": "erster Produktionstag", "status": "fertig"}, + {"id": "s02", "datum": "2026-10-16", "wichtig": true, "kanaele": ["Instagram", "Facebook"], "format": "F10 Infopost", "saeule": "B", "notiz": "**erster Beitrag.** Aus dem Backlog, Form Builder.", "noah": "erster Beitrag. Aus dem Backlog: Form Builder", "status": "geplant"}, + + {"id": "s03", "datum": "2026-10-19", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F18 Couch- und Büro-Clips", "saeule": "A", "notiz": "erstes Reel. Erster Beitrag auf TikTok.", "noah": "erstes Reel, erster Beitrag auf TikTok", "status": "geplant"}, + {"id": "s04", "datum": "2026-10-20", "kanaele": ["LinkedIn"], "format": "L1 Dokument", "saeule": "B", "notiz": "Carousel vom 16.10. Erster Beitrag auf der Seite.", "noah": "Slides vom 16.10. Erster Beitrag auf LinkedIn.", "status": "geplant"}, + {"id": "s05", "datum": "2026-10-21", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F16 Forum-Screenshot", "saeule": "B", "notiz": "erster Forum-Screenshot", "status": "geplant"}, + {"id": "s06", "datum": "2026-10-22", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s07", "datum": "2026-10-23", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F20 Split-Reel", "saeule": "B", "notiz": "erstes Split-Reel", "status": "geplant"}, + + {"id": "s08", "datum": "2026-10-26", "kanaele": ["Instagram", "Facebook"], "format": "F10 Infopost", "saeule": "B", "notiz": "neu. Zuerst der Schmerz, dann die Funktion.", "status": "geplant"}, + {"id": "s09", "datum": "2026-10-27", "kanaele": ["LinkedIn"], "format": "L3 These", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s10", "datum": "2026-10-28", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F18 Couch- und Büro-Clips", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s11", "datum": "2026-10-29", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s12", "datum": "2026-10-30", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F16 Forum-Screenshot", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s13", "datum": "2026-10-30", "kanaele": ["intern"], "format": "Monatsauswertung Oktober", "saeule": "", "notiz": "eine Seite an Noah und David, mit Funnel-Mix", "status": "geplant"}, + + {"id": "s14", "datum": "2026-11-02", "kanaele": ["Instagram", "Facebook"], "format": "F10 Infopost", "saeule": "B", "notiz": "aus dem Backlog, E-Mail-Marketing", "noah": "Aus dem Backlog: E-Mail-Marketing", "status": "geplant"}, + {"id": "s15", "datum": "2026-11-03", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s16", "datum": "2026-11-04", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F20 Split-Reel", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s17", "datum": "2026-11-05", "kanaele": ["LinkedIn"], "format": "L3 These", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s18", "datum": "2026-11-06", "kanaele": ["Instagram", "TikTok", "Facebook"], "format": "F17 Viel zu aufwendige Automation", "saeule": "A", "notiz": "zum ersten Mal", "status": "geplant"}, + + {"id": "s19", "datum": "2026-11-09", "kanaele": ["Instagram", "Facebook"], "format": "F10 Infopost", "saeule": "B", "notiz": "neu", "status": "geplant"}, + {"id": "s20", "datum": "2026-11-10", "kanaele": ["LinkedIn"], "format": "L1 Dokument", "saeule": "B", "notiz": "Carousel vom 02.11.", "noah": "Slides vom 02.11.", "status": "geplant"}, + {"id": "s21", "datum": "2026-11-11", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F19 Nerd auf der Baustelle oder F18 Couch- und Büro-Clips", "saeule": "A", "notiz": "F19 nur, wenn es einen Tag im Betrieb gibt. Erster Short.", "noah": "erster YouTube Short. Nerd auf der Baustelle, wenn es einen Tag im Betrieb gibt", "noah_chip": "Baustelle/Büro", "status": "geplant"}, + {"id": "s22", "datum": "2026-11-12", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F20 Split-Reel", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s23", "datum": "2026-11-12", "kanaele": ["LinkedIn"], "format": "L3 These", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s24", "datum": "2026-11-13", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F17 Viel zu aufwendige Automation", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s25", "datum": "2026-11-13", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "A", "notiz": "", "status": "geplant"}, + + {"id": "s26", "datum": "2026-11-16", "kanaele": ["Instagram", "Facebook"], "format": "F15 Ankündigung", "saeule": "C", "notiz": "„Wir sind auf der GET Nord“: Ort, Tage, wer hingeht. Einladung zum Gespräch vor Ort.", "noah": "Ankündigung GET Nord, mit Einladung zum Gespräch vor Ort", "funnel": "bottom", "status": "geplant"}, + {"id": "s27", "datum": "2026-11-17", "kanaele": ["LinkedIn"], "format": "L4 Anlass", "saeule": "C", "notiz": "Ankündigung GET Nord", "noah": "Ankündigung GET Nord, mit Einladung zum Gespräch vor Ort", "funnel": "bottom", "status": "geplant"}, + {"id": "s28", "datum": "2026-11-18", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F16 Forum-Screenshot", "saeule": "B", "notiz": "vorproduziert, weil das Team auf der Messe ist", "status": "geplant"}, + {"id": "s29", "datum": "2026-11-19", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F20 Split-Reel", "saeule": "B", "notiz": "vorproduziert, weil das Team auf der Messe ist", "status": "geplant"}, + {"id": "s30", "datum": "2026-11-19", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "C", "notiz": "ein Foto von der Messe, direkt vom Handy", "noah": "Foto von der Messe", "status": "geplant"}, + {"id": "s31", "datum": "2026-11-19", "bis": "2026-11-21", "kanaele": ["Instagram Stories"], "format": "Einblicke von der Messe", "saeule": "C", "notiz": "Flex, so viel es vor Ort passt", "noah": "Einblicke von der Messe, so viel vor Ort passt", "funnel": "middle", "status": "geplant"}, + {"id": "s32", "datum": "2026-11-20", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F18 Couch- und Büro-Clips", "saeule": "A", "notiz": "vorproduziert", "status": "geplant"}, + + {"id": "s33", "datum": "2026-11-23", "kanaele": ["Instagram", "Facebook"], "format": "F15 Rückblick", "saeule": "C", "notiz": "„So war die GET Nord“, mit Fotos von vor Ort", "noah": "Rückblick GET Nord, mit Fotos", "status": "geplant"}, + {"id": "s34", "datum": "2026-11-23", "kanaele": ["intern"], "format": "**Entscheidung T3**", "saeule": "", "notiz": "Postarten auf LinkedIn", "status": "geplant"}, + {"id": "s35", "datum": "2026-11-24", "kanaele": ["LinkedIn"], "format": "L4 Anlass", "saeule": "C", "notiz": "Rückblick GET Nord", "noah": "Rückblick GET Nord", "status": "geplant"}, + {"id": "s36", "datum": "2026-11-25", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F19 Nerds auf der Messe", "saeule": "A", "notiz": "Variante von F19, mit Material von der GET Nord", "noah": "Variante von Nerd auf der Baustelle, mit Material von der GET Nord", "noah_name": "Reel: Nerds auf der Messe", "noah_chip": "Messe", "status": "geplant"}, + {"id": "s37", "datum": "2026-11-26", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F20 Split-Reel", "saeule": "B", "notiz": "", "status": "geplant"}, + {"id": "s38", "datum": "2026-11-26", "kanaele": ["LinkedIn"], "format": "L2 Einblick", "saeule": "A", "notiz": "", "status": "geplant"}, + {"id": "s39", "datum": "2026-11-27", "kanaele": ["Instagram", "TikTok", "Facebook", "YouTube Shorts"], "format": "F14 Trend zum Thema", "saeule": "offen", "notiz": "nur ein Trend, der zum Thema passt. Sonst eine Idee aus dem Pool.", "status": "geplant"}, + {"id": "s40", "datum": "2026-11-27", "kanaele": ["LinkedIn"], "format": "L3 These", "saeule": "B", "notiz": "Postarten nach T3 anpassen", "status": "geplant"}, + {"id": "s41", "datum": "2026-11-27", "kanaele": ["intern"], "format": "Monatsauswertung November, **Entscheidung T5**", "saeule": "", "notiz": "Welche 2 bis 3 Formate behalten wir?", "status": "geplant"} + ], + "flex": [ + {"id": "x1", "name": "Collab mit Noah", "von": "Noah, nach eigener Zeit und Lust", "dann": "erscheint als Collab auf Noahs Konto und auf `hivegrid.de`. In einer Woche mit Collab darf ein HiveGrid-Reel ausfallen, wenn die Zeit knapp ist.", "erschienen": []}, + {"id": "x2", "name": "F21 Pilotkunde vorher/nachher", "von": "sobald Geerkens eine Weile mit HiveGrid arbeitet und Noah es freigibt. Frühestens Ende November.", "dann": "ersetzt einen Reel-Slot, als Collab mit Noah. Bei Bedarf dazu L4 auf LinkedIn.", "erschienen": []}, + {"id": "x3", "name": "F12 Tutorial (Longform)", "von": "David, wenn es fertig ist", "dann": "erscheint auf YouTube. Daraus 1 bis 2 Ausschnitte als Reel oder Short in den nächsten freien Slots und ein L2 oder L4 auf LinkedIn.", "erschienen": []}, + {"id": "x4", "name": "F6 Ansage", "von": "bei einem Anlass (Messe, Neuigkeit, Start bei Geerkens)", "dann": "ersetzt den nächsten Reel-Slot", "erschienen": []}, + {"id": "x5", "name": "F14 Trend oder eine Idee aus dem Pool", "von": "wenn ein Trend zum Thema passt, ein Format nicht zündet oder die Zeit knapp ist", "dann": "ersetzt den nächsten Top-Reel. Trends warten nicht.", "erschienen": []} + ], + "tests": [ + {"id": "T3", "titel": "Postarten auf LinkedIn", "termine": ["2026-11-23"], "frage": "Welche Postart fliegt raus?", "grundlage": "L1, L2, L3: Interaktionsrate, Klicks, Follower", "ergebnis": ""}, + {"id": "T5", "titel": "Formate eingrenzen", "termine": ["2026-11-27"], "frage": "Welche 2 bis 3 Reel-Formate zünden? Die behalten und verfeinern wir, den Rest lassen wir weg. Infoposts und Anlass-Posts bleiben.", "grundlage": "Top-Formate (F16 bis F19, F14): Reichweite bei Nicht-Followern, Sendungen pro Reichweite, Follower pro Beitrag. Split-Reel (F20): Speicherungen, Profilaufrufe, Klicks auf den Link in der Bio.", "ergebnis": ""}, + {"id": "M", "titel": "Monatsauswertung", "termine": ["2026-10-30", "2026-11-27"], "frage": "Was lief, was ändern wir?", "grundlage": "eine Seite an Noah und David", "ergebnis": ""} + ] +} diff --git a/daten/roadmap.json b/daten/roadmap.json new file mode 100644 index 0000000..88909bd --- /dev/null +++ b/daten/roadmap.json @@ -0,0 +1,94 @@ +{ + "stand": "2026-10-09", + "status": "Entwurf 4", + "zeitstrahl": [ + {"wann": "**KW 41** (05. bis 11.10.)", "von": "2026-10-05", "bis": "2026-10-11", "text": "**Vorbereitung:** fehlende Kanäle anlegen, Metricool, Bios und Impressum"}, + {"wann": "**KW 42** (ab 12.10.)", "von": "2026-10-12", "bis": "2026-10-18", "text": "Produktion startet, **erster Beitrag Fr 16.10.**"}, + {"wann": "KW 42 bis 45", "von": "2026-10-12", "bis": "2026-11-08", "text": "**Phase 1:** anlaufen mit leichten Formaten. Rechtsfragen sammeln."}, + {"wann": "KW 46 bis 48", "von": "2026-11-09", "bis": "2026-11-29", "text": "**Phase 2:** mehr Formate, YouTube Shorts als Test. **GET Nord 19. bis 21.11.** mit Ankündigung und Rückblick. Erste Entscheidungen am 23.11."}, + {"wann": "ab Dezember", "von": "2026-11-30", "bis": "2026-12-20", "text": "planen wir frühestens Ende November", "offen": true} + ], + "pakete": [ + { + "id": "A", + "titel": "Fehlende Kanäle anlegen und Werkzeuge einrichten", + "spalten": [["id", "#"], ["text", "Schritt"], ["wer", "Wer"], ["abhaengig", "Abhängigkeit"], ["status", "Status"]], + "schritte": [ + {"id": "A1", "kurz": "Metricool Starter buchen", "text": "**Metricool Starter** buchen, im Konto `marketing@geerkens.de` (16 € im Monat jährlich, rund 20 € monatlich)", "wer": "Noah", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A2", "kurz": "Facebook-Seite anlegen", "text": "**Facebook-Seite HiveGrid** anlegen und mit `hivegrid.de` verknüpfen. Kategorie Software, Impressum-Feld, Website, Knopf „Termin buchen“ zur Erstgespräch-Seite.", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A3", "kurz": "Business-Konto prüfen", "text": "Prüfen, ob `hivegrid.de` ein **Business-Konto** ist (nötig für Metricool und das automatische Mitposten auf Facebook)", "wer": "Dejan", "abhaengig": "A2", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A4", "kurz": "TikTok-Konto anlegen", "text": "**TikTok-Konto** anlegen und auf Business umstellen. Gleicher Name und gleiches Profilbild wie Instagram. Impressum als Text in die Bio. Nur eigener Ton oder die kommerzielle Musikbibliothek.", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A5", "kurz": "YouTube-Kanal", "text": "**YouTube-Kanal** prüfen oder anlegen (für Shorts und Davids Tutorials). Impressum-Link im Kanal-Header.", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A6", "kurz": "LinkedIn-Seite einrichten", "text": "**LinkedIn-Seite** fertig einrichten: Logo, Titelbild, Slogan, Info-Text mit Impressum, Branche, Website.", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A7", "kurz": "Einheitlicher Name", "text": "**Einheitlicher Name** auf allen Kanälen prüfen und sichern", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A8", "kurz": "Zwei Admins je Kanal", "text": "**Zwei Admins je Kanal**, damit der Zugang nicht an einer Person hängt", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A9", "kurz": "Bios schreiben", "text": "**Bios** in der Du-Form. Das Kategorie-Wort ist **„Arbeitsoberfläche für den Betrieb“** [entschieden], dazu „Verbinden statt ersetzen“. Ohne Versprechen, die das Produkt nicht hält (kein DATEV, kein „100 % ohne US“).", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A10", "kurz": "Links in der Bio", "text": "**Links in der Bio:** 1. Erstgespräch (`hivegrid.de/waitlist`, Cal), 2. Impressum (`hivegrid.de/impressum`). Direkte Links statt Linktree.", "wer": "Dejan", "abhaengig": "Impressum vollständig", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A11", "kurz": "Kanäle in Metricool verbinden", "text": "Alle Kanäle in **Metricool** verbinden: Facebook, TikTok, LinkedIn, YouTube", "wer": "Dejan", "abhaengig": "A1 bis A6", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A12", "kurz": "Wettbewerber in Metricool", "text": "**Wettbewerber und Vorbilder** in Metricool anlegen", "wer": "Dejan", "abhaengig": "A1", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A13", "kurz": "Noahs Marke in Metricool", "text": "Noahs Konten als **zweite Marke** in Metricool, wenn Noah einverstanden ist", "wer": "Dejan, mit Noah", "abhaengig": "A1", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A14", "kurz": "Backlog-Posts prüfen", "text": "**Backlog-Posts** (Form Builder, E-Mail-Marketing) auf Widersprüche prüfen, zum Beispiel DATEV oder Rechnungen", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-09", "status": "offen"}, + {"id": "A15", "kurz": "Vorlagen für Posts erweitern", "text": "**Vorlagen für Posts** um Screens und Bausteine aus dem Produktdesign erweitern, wenn nötig. Kann bis KW 44 laufen.", "wer": "Dejan", "abhaengig": "", "faellig": "2026-10-30", "status": "offen"} + ] + }, + { + "id": "B1", + "titel": "GET Nord, Hamburg (19. bis 21.11.2026)", + "spalten": [["id", "#"], ["text", "Schritt"], ["wann", "Wann"], ["wer", "Wer"], ["status", "Status"]], + "schritte": [ + {"id": "B1.1", "kurz": "Fotos und B-Roll planen", "text": "Klären, wer vor Ort Fotos und B-Roll aufnimmt. Eine kurze Liste mit Motiven vorbereiten.", "wann": "bis KW 46", "wer": "Dejan", "faellig": "2026-11-13", "status": "offen"}, + {"id": "B1.2", "kurz": "Reels der Messewoche vorproduzieren", "text": "Reels für die Messewoche vorproduzieren (Mi 18. bis Fr 20.11.)", "wann": "KW 46", "wer": "Dejan", "faellig": "2026-11-13", "status": "offen"}, + {"id": "B1.3", "kurz": "Ankündigung GET Nord", "text": "Ankündigung: Instagram Mo 16.11., LinkedIn Di 17.11.", "wann": "KW 47", "wer": "Dejan", "faellig": "2026-11-17", "status": "offen"}, + {"id": "B1.4", "kurz": "Vor Ort aufnehmen", "text": "Vor Ort: Fotos, B-Roll, Stories nach Lage", "wann": "19. bis 21.11.", "wer": "Team vor Ort", "faellig": "2026-11-21", "status": "offen"}, + {"id": "B1.5", "kurz": "QR-Code zum Erstgespräch", "text": "QR-Code zum Erstgespräch (Cal) dabei haben, auf dem Handy oder als kleine Karte", "wann": "bis 18.11.", "wer": "Dejan", "faellig": "2026-11-18", "status": "offen"}, + {"id": "B1.6", "kurz": "Rückblick GET Nord", "text": "Rückblick: Instagram Mo 23.11., LinkedIn Di 24.11., Reel aus dem Messe-Material Mi 25.11.", "wann": "KW 48", "wer": "Dejan", "faellig": "2026-11-25", "status": "offen"} + ] + }, + { + "id": "C", + "titel": "Weg zum Gespräch", + "spalten": [["id", "#"], ["text", "Schritt"], ["wann", "Wann"], ["wer", "Wer"], ["status", "Status"]], + "schritte": [ + {"id": "C1", "kurz": "Bio-Links (wie A10)", "text": "Links in der Bio auf Erstgespräch und Impressum (A10)", "wann": "KW 41", "wer": "Dejan", "faellig": "2026-10-09", "status": "offen"}, + {"id": "C2", "kurz": "Frage nach der Herkunft vorschlagen", "text": "Dem Vertrieb vorschlagen, im Cal-Formular zu fragen: **„Wie bist du auf uns gekommen?“** Nur so sehen wir, was Marketing bringt.", "wann": "KW 43", "wer": "Dejan", "faellig": "2026-10-23", "status": "offen"} + ] + }, + { + "id": "D", + "titel": "Website: Vorschläge an Noah", + "spalten": [["id", "#"], ["text", "Vorschlag"], ["status", "Status"]], + "schritte": [ + {"id": "D1", "kurz": "Website: DATEV raus", "text": "DATEV aus Hero, FAQ und Wabe nehmen.", "wer": "Noah entscheidet, Dejan baut ein", "faellig": null, "status": "offen"}, + {"id": "D2", "kurz": "Website: Hosting-Satz", "text": "Den Satz zu Hosting ehrlich formulieren (Cloudflare).", "wer": "Noah entscheidet, Dejan baut ein", "faellig": null, "status": "offen"}, + {"id": "D3", "kurz": "Website: keine Rechnungen versprechen", "text": "Rechnungen nicht versprechen.", "wer": "Noah entscheidet, Dejan baut ein", "faellig": null, "status": "offen"}, + {"id": "D4", "kurz": "Website: SEO-Titel", "text": "SEO-Titel ohne All-in-One und im Du.", "wer": "Noah entscheidet, Dejan baut ein", "faellig": null, "status": "offen"}, + {"id": "D5", "kurz": "Website: MCP-Zahl 22", "text": "MCP-Zahl von 15 auf 22 Werkzeuge korrigieren.", "wer": "Noah entscheidet, Dejan baut ein", "faellig": null, "status": "offen"} + ] + }, + { + "id": "E", + "titel": "Recht: Fragen für einen Anwalt", + "spalten": [["id", "#"], ["text", "Schritt"], ["wann", "Wann"], ["wer", "Wer"], ["status", "Status"]], + "schritte": [ + {"id": "E1", "kurz": "Rechtsfragen zusammenstellen", "text": "Die Fragen unten sauber zusammenstellen", "wann": "KW 43", "wer": "Dejan", "faellig": "2026-10-23", "status": "offen"}, + {"id": "E2", "kurz": "Rechtsfragen besprechen", "text": "Mit Noah klären, ob und an wen die Fragen gehen", "wann": "danach", "wer": "Dejan mit Noah", "faellig": null, "status": "offen"} + ] + }, + { + "id": "F", + "titel": "Messung und Auswertung", + "spalten": [["id", "#"], ["text", "Was"], ["wann", "Wann"], ["wer", "Wer"], ["status", "Status"]], + "schritte": [ + {"id": "F1", "kurz": "Wochenauswertung", "text": "Wochenauswertung (30 Minuten, Zahlen über Metricool)", "wann": "jeden Freitag ab 23.10.", "wer": "Dejan", "faellig": "2026-10-23", "wiederkehrend": true, "status": "offen"}, + {"id": "F2", "kurz": "Monatsauswertung", "text": "Monatsauswertung (eine Seite an Noah und David)", "wann": "Fr 30.10. und Fr 27.11.", "wer": "Dejan", "faellig": "2026-10-30", "wiederkehrend": true, "status": "offen"}, + {"id": "F3", "kurz": "Entscheidung T3", "text": "Entscheidung T3: welche Postart auf LinkedIn rausfliegt", "wann": "Mo 23.11. (nach der GET Nord)", "wer": "Dejan", "faellig": "2026-11-23", "status": "offen"}, + {"id": "F4", "kurz": "Zielwert Nordstern", "text": "Nordstern „qualifizierte Erstgespräche pro Monat über Marketing“ [entschieden]: Zielwert festlegen", "wann": "KW 43", "wer": "Dejan", "faellig": "2026-10-23", "status": "offen"} + ] + } + ], + "personen": [ + {"name": "Noah", "zusatz": "Freigabe Geerkens-Serie, Collabs nach eigener Zeit", "bis": "A1 diese Woche", "liste": true}, + {"name": "David", "zusatz": "Tutorials, wenn sie kommen", "bis": "nach Kapazität", "liste": true}, + {"name": "Dejan", "zusatz": "alles Übrige", "bis": "laut Plan", "liste": false} + ] +} diff --git a/daten/webinar.json b/daten/webinar.json new file mode 100644 index 0000000..b1c4e49 --- /dev/null +++ b/daten/webinar.json @@ -0,0 +1,49 @@ +{ + "stand": "2026-10-16", + "plattform": "WebinarGeek", + "titel": "Automatisierung im Handwerk.", + "untertitel": "Was sie in deinem Betrieb wirklich macht. Mit dem Branchenprogramm, das du schon hast.", + "sprecher": "Noah Geerkens und David", + "dauer": "45 Minuten", + "termin": "", + "stand_text": "Skript und Präsentation sind fertig. Feinschliff später.", + "schritte": [ + {"name": "Aufbau mit Noah abgestimmt", "status": "erledigt", "notiz": "CRM, Automation, Drumherum, Überraschung"}, + {"name": "Skript", "status": "erledigt", "notiz": "Entwurf 4, 16.10."}, + {"name": "Sprechzettel", "status": "erledigt", "notiz": "Slide für Slide mit Beispielsätzen, auch als PDF"}, + {"name": "Präsentation", "status": "erledigt", "notiz": "30 Slides, als HTML, PowerPoint, PDF und online"}, + {"name": "Screenshots", "status": "erledigt", "notiz": "15 Bilder aus Staging, S18 noch Platzhalter"}, + {"name": "Noahs Feedback eingearbeitet", "status": "erledigt", "notiz": "Die Überraschung ist ein Angebot, der Link kommt in den Chat"}, + {"name": "Angebot am Ende", "status": "offen", "notiz": "was es gibt, bis wann, fester Link"}, + {"name": "Termin und Titel", "status": "offen", "notiz": ""}, + {"name": "Post zur Anmeldung", "status": "offen", "notiz": "Outline in posts/POST-webinar.md"} + ], + "unterlagen": [ + {"name": "Präsentation", "text": "Im Browser, mit Sprechernotizen. Taste P zum Präsentieren.", "pfad": "webinar/slides/Praesentation.html", "art": "ansehen"}, + {"name": "PowerPoint", "text": "Slides als Bilder, mit Notizen und Abschnitten.", "pfad": "webinar/slides/HiveGrid-Webinar.pptx", "art": "laden"}, + {"name": "PDF der Slides", "text": "Eine Slide pro Seite, zum Beispiel für den Upload bei WebinarGeek.", "pfad": "webinar/slides/HiveGrid-Webinar.pdf", "art": "ansehen"}, + {"name": "Online-Deck", "text": "Privat. Noah und David sehen es erst nach „Teilen“.", "pfad": "https://claude.ai/artifact/Cg3Lb2hTpDB8LB7b5qnFFf", "art": "extern"}, + {"name": "Sprechzettel", "text": "Knackpunkt und Beispielsätze je Slide, Fragen mit Antworten.", "pfad": "webinar/Skript-kurz.md", "art": "dok", "pdf": "webinar/HiveGrid-Webinar-Skript.pdf"}, + {"name": "Skript, ausführlich", "text": "Arbeitsfassung mit Regeln, Klickpfaden und Abgleich mit den Posts.", "pfad": "webinar/Skript.md", "art": "dok"}, + {"name": "Überblick und Feedback", "text": "Input von Dejan, Noahs Sprachnachricht, Stand.", "pfad": "webinar/README.md", "art": "dok"}, + {"name": "Screenshots", "text": "Woher jedes Bild kommt und was dafür in Staging angelegt wurde.", "pfad": "webinar/slides/Screenshots.md", "art": "dok"} + ], + "ablauf": [ + {"minuten": "0 bis 5", "teil": "Einstieg", "wer": "Noah", "knackpunkt": "Du musst nicht wechseln. HiveGrid ist in einem echten SHK-Betrieb entstanden und legt sich um dein Branchenprogramm.", "start": "cover"}, + {"minuten": "5 bis 14", "teil": "1. CRM: Marketing und Vertrieb", "wer": "Noah, David", "knackpunkt": "Von der Anfrage bis zur Abnahme ist es eine Akte. Vertrieb und Abwicklung sind zwei Sichten darauf.", "start": "teil1"}, + {"minuten": "14 bis 24", "teil": "2. Herzstück Automatisierung", "wer": "Noah, David", "knackpunkt": "Automatisierung ist schon eingebaut, ohne Agentur. Der Betrieb kann wachsen, ohne dass das Büro mitwächst.", "start": "teil2"}, + {"minuten": "24 bis 32", "teil": "3. Das Drumherum", "wer": "Noah, David", "knackpunkt": "Statt WhatsApp-Gruppe, Excel-Liste und Schwarzem Brett liegt alles an einem Ort. Datenschutz ist eingebaut.", "start": "teil3"}, + {"minuten": "32 bis 35", "teil": "Die Überraschung", "wer": "Noah, David", "knackpunkt": "Wer dabei ist, bekommt ein Angebot, das es nur hier gibt. Der Link kommt in den Chat.", "start": "geschenk"}, + {"minuten": "35 bis 45", "teil": "Fragen und Abschluss", "wer": "beide", "knackpunkt": "Ehrlich antworten, auch wenn etwas noch nicht geht.", "start": "fragen"} + ], + "offen": [ + "Termin, Uhrzeit und Titel", + "Davids Nachname für die Titelslide", + "Das Angebot am Ende: was es gibt, bis wann es gilt, der feste Link", + "Ob der Link als Call-to-Action in WebinarGeek kommt, und in welchem Tarif der steckt", + "Screenshot S18, sobald feststeht, ob das Angebot über ein HiveGrid-Formular läuft", + "Ob die Logos von KWP und PDS auf die Slides dürfen", + "Antworten auf Preis, Datenschutz, andere Branchenprogramme und Einführungsdauer", + "Noahs eigene Geschichten an den markierten Stellen im Sprechzettel" + ] +} diff --git a/produktionsvorgaben/AGENTS.md b/produktionsvorgaben/AGENTS.md new file mode 100644 index 0000000..fed0ac4 --- /dev/null +++ b/produktionsvorgaben/AGENTS.md @@ -0,0 +1,15 @@ +# Anweisungen für die Arbeit mit dem Produktionspaket + +Zuerst [README.md](README.md), danach [Planung](planung/WORKFLOW.md) und die für die Aufgabe zuständigen Fachdateien lesen. Für Vorlagenarbeit zusätzlich [KERN.md](reel-produktionsbasis/KERN.md). Maßgeblich sind die freigegebenen Dateien in diesem Paket; kein Zugriff auf eine private Galerie oder Obsidian-Datenbank erforderlich. + +Regeln, Guidelines und optionale Inspirationen unterscheiden. Erfundenes, Platzhalter und Demo-Aussagen nicht als tatsächliche Angaben über Noah oder HiveGrid behandeln. Neue Vorgaben nicht automatisch aus Bibliotheksbeispielen ableiten. Neue Regeln einzeln mit dem Auftraggeber validieren und mit Positiv-/Negativbeispiel erklären. + +Das eigentliche Video bleibt in Chatcut. Script/Hook und Bereichsplanung gehen dem Cut voraus. Die geschnittene Fassung mit Captions wird außerhalb von HyperFrames ausgewertet; dort entstehen ausschließlich die geplanten Animationen. Drei zusammenhängende Animationsfassungen passen zum selben Cut. Zusammenfügen und Hintergrundunschärfe des Outros erfolgen in Chatcut. + +[Gestaltung](gestaltung/README.md) und [tokens.json](gestaltung/tokens.json) bestimmen den Übergabestand: Kühl, Doodle, vorhandene Tokens, Cursor correction und E120. Keine Testpresets oder persönliche Browserfavoriten automatisch übernehmen. Originalquellen und Lizenzhinweise erhalten; React-Beispiele sind Quellreferenzen und müssen für eine zeitgesteuerte HyperFrames-Animation passend umgesetzt werden. + +Ponytail ist für dieses Projekt deaktiviert. Rohmaterial und Caption-Zeitdaten lokal halten. Keine nicht beauftragte Veröffentlichung oder Nachricht an Dritte. Belege der Freigaben stehen in [FREIGABEN.md](FREIGABEN.md); neue Entscheidungen im jeweiligen Arbeitsprojekt nachvollziehbar dokumentieren. + +## Nachvollziehbare Produktion (D262) + +Für jedes Reel den [Dokumentationsstandard](reel-dokumentation/README.md) mit kopierbarer Ordnerstruktur verwenden. Eingangsdateien, vollständige Roh-/Cut-Transkripte, Planstände, fachliche Entscheidungen mit Gründen, Schnitt-/Captionänderungen und A/B/C-Revisionen während der Arbeit mitführen. Alle drei Gesamtfassungen vergleichbar dokumentieren und den vollständigen Reel-Ordner samt Markdown-Nachweisen und benötigten Quellen mit den finalen Videos ausliefern. diff --git a/produktionsvorgaben/FREIGABEN.md b/produktionsvorgaben/FREIGABEN.md new file mode 100644 index 0000000..4e351a5 --- /dev/null +++ b/produktionsvorgaben/FREIGABEN.md @@ -0,0 +1,25 @@ +# Freigaben für diese Übergabe + +Stand 04.10.2026. Freigaben stammen vom Auftraggeber dieses Projekts; sie sind keine gesonderte Freigabe durch Noah und kein Beleg für erfundene Beispielinhalte. Das vollständige Entwicklungsprotokoll bleibt beim Auftraggeber. + +| Bereich | Freigegebener Stand | +| --- | --- | +| Script | Zwei harte Regeln R01/R02, fünf Guidelines G01–G05; optionale Hook-/CTA-Muster und Inspirationssammlung. Die Beispiele sind frei anpassbar; Platzhalter brauchen tatsächliche Angaben. | +| Aufnahme | Kamera auf Augenhöhe als klare Vorgabe, Augenposition möglichst wie Standard als Guideline. | +| Dokumentation D262 | Verbindlicher Standard pro Reel: stabile Ordner-/Dateinamen, Rohdaten, vollständige Roh-/Cut-Transkripte, Plan und Abgleich, begründete Entscheidungen/Revisionen, A/B/C-Vergleich und vollständige Übergabe mit separaten Markdown-Dateien. Ausgestaltung ausdrücklich vom Auftraggeber beauftragt. | +| Pipeline | Script und Planung vor Cut; Bereichsvorlagen vorplanen; Cut/Captions in Chatcut; externe Referenzauswertung; reine Animationen in HyperFrames; Zusammenfügen in Chatcut. | +| Animationen | Zusammenhängende Erklärungen, drei vollständige Animationsfassungen, Konzentration auf das Kernthema; keine Animationspflicht. | +| Vorlagen | Vier Layoutvorlagen und gespeicherte Geometrie; starke Guideline zur Bündelung kurzer Reels mit den dokumentierten Ausnahmen. | +| Gestaltung D258 | Für diese Übergabe vorvalidiert: Kühl, Doodle 03, vorhandene Inter-/Abstands-/Größentokens, jeweils 8 px Rundung bezogen auf 640 × 400. Spätere Nutzeränderungen möglich. | +| Cursor D259 | 03 Kleine Korrektur dauerhaft ausgewählt; Apple-Original-PDF-Ausgangsdarstellung mit Originalhotspots. | +| Outro D260 | E120 final gewählt; Alpha-MOV 2160 × 3840, 30 fps, 7 Sekunden. Weißer Übergang bleibt erhalten; Hintergrundunschärfe in Chatcut anwenden. | + +Quelle für die Gestaltungsfreigaben: Nutzerklärung im Chat „Remotion und Hyperframes vergleichen“, 04.10.2026. Die Freigaben wurden dort in den Paketdateien gespeichert und für diese vollständige Übergabe zusammengeführt. Die Kennungen in den Fachdateien dienen der Nachvollziehbarkeit, nicht als zusätzliche Regeln. + +## Quellen und Beispiele + +Die Scriptwriting-Anregungen stammen unter anderem aus der lokalen Obsidian-Notiz „Scriptwriting“ und der Sammlung „1000 Viral Hooks“. Die ausgewerteten Hook-Muster und die 896 ausgeschriebenen Hook-Einträge mit ihren öffentlichen Quelllinks liegen im Scriptordner bei. Noah benötigt dafür keinen Zugriff auf die private Obsidian-Datenbank. + +Weitere Vorlagenparameter und technische Importdetails, die noch keinen konkreten Wert haben, werden nicht durch diese Übergabe erfunden. Der Chatcut-Import des Alpha-MOV ist am Zielsystem zu prüfen; siehe Gestaltungsprüfung. + +[Zur Übersicht](README.md) diff --git a/produktionsvorgaben/MANIFEST.json b/produktionsvorgaben/MANIFEST.json new file mode 100644 index 0000000..5596160 --- /dev/null +++ b/produktionsvorgaben/MANIFEST.json @@ -0,0 +1,1507 @@ +{ + "title": "Noah Produktionsvorgaben", + "date": "2026-10-04", + "revision": "r02", + "files": [ + { + "path": "AGENTS.md", + "bytes": 2339, + "sha256": "9477b5efc765923bfd124777f365551b224b39746ff097aac77f3c7a895d9366" + }, + { + "path": "FREIGABEN.md", + "bytes": 2870, + "sha256": "e5dfd238332a261cf4c64731aa77691a475af1b7df18661506cde24c7b42bb7d" + }, + { + "path": "README.md", + "bytes": 6774, + "sha256": "5ffbc2ba0c21c4169efcaf9142a858a6d761255a04e19a13f11189f882d45715" + }, + { + "path": "UEBERGABE.md", + "bytes": 2860, + "sha256": "9500f2a0ec945868cbab78f9ed94f8e6411ca6241d535091be5d4aab5fca82b7" + }, + { + "path": "animationen/README.md", + "bytes": 6996, + "sha256": "f45d789fdd280e7f05f1198aca2a95a8e991e57114f2114745354b3722bdbaef" + }, + { + "path": "aufnahme/README.md", + "bytes": 2171, + "sha256": "d29076da22a8e3e47ecb91ca78fe79d78518ed38b39d3fb5395058beaa332a42" + }, + { + "path": "gestaltung/PRUEFUNG.md", + "bytes": 1682, + "sha256": "7ff6dcb2ae3b6c54688703ccac1180f2db07599aed9b3bf08466a3f8f9d37e0c" + }, + { + "path": "gestaltung/README.md", + "bytes": 4131, + "sha256": "72b5ad381e3ef067b5c6bb007583ebec1bba88b88063de9fabfd9152c6bfc85d" + }, + { + "path": "gestaltung/cursor/README.md", + "bytes": 2074, + "sha256": "bc4a7d2455efdfe285a92e0785efd01f01b3fca664e0ceaa3067cf0b228ef503" + }, + { + "path": "gestaltung/cursor/assets/README.md", + "bytes": 460, + "sha256": "3d1d1b0c4bea8c212b533bc788d4d16037de20f24703c7251007c8b88e005beb" + }, + { + "path": "gestaltung/cursor/assets/apple/manifest.json", + "bytes": 5126, + "sha256": "941e71a2b072f22b5f9f1c80dbd129c3fedbbbc221dbcb3d404ea3d200b7152c" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/arrow.png", + "bytes": 4368, + "sha256": "b904cc513b751af30e11c5a77de956f8dea5272e7561a1682accf41a9aba6405" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/assets.json", + "bytes": 1184, + "sha256": "8c26f81ab9a014e3da7b1237d36c70ccb1234f48178b5a6f9a56600cf853ed1e" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/blocked.png", + "bytes": 6716, + "sha256": "1564d261b64afe8d508726beae6a09a62481ef43cf61c8f9b774f4d17db10d2f" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/closedhand/cursor.pdf", + "bytes": 99132, + "sha256": "befc1b2ef454fb6b41f12b898248f21bd9ac8a6714e366e66f08b323b1cc4b1b" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/closedhand/info.plist", + "bytes": 633, + "sha256": "58347d8cb7e1812b6866f1d7385ff8763dd51c87b2e8ebf419dd25b561a76ddf" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/copy/cursor.pdf", + "bytes": 54878, + "sha256": "1ef7c30920576e711fd6dabe3bab3a84f1b3a6b8a7ad6f34afc4cd3fc151d21c" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/copy/info.plist", + "bytes": 631, + "sha256": "0f9c9ca325c816c120fd7793d4aeaf271dd5ddde9bda2363d3de79ff8e3a17c7" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/copy.png", + "bytes": 5715, + "sha256": "a19ea15711b2e959104b4edef5b03ccfe4f37902c6ad287482f4e348c9cb1a5f" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/grab.png", + "bytes": 3674, + "sha256": "a5ec4a8dca6c1bc363a69547ef9d687e7629f204a5d51a0aa45ca4572f8ea415" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/grabbing.png", + "bytes": 2501, + "sha256": "575c8d96eddc6ebcf256c0cfe5f2520e3909f9b69390865d3c7039b41c288822" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/cursor.pdf", + "bytes": 210458, + "sha256": "a95b6410df1b46fca7391f04582ebe5106c320154b20b1f73cca03250b22cbe0" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/info.plist", + "bytes": 620, + "sha256": "58d94491038004332a354685c9a892c4367ba63ed70d78b8b4c4b210e7cda62c" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/link.png", + "bytes": 1930, + "sha256": "ee3348d4a9f7955f990429067382a5efd50b84ffc6123897a5d834fe41e2c6f7" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/makealias/cursor.pdf", + "bytes": 72779, + "sha256": "962abfa2d60820e61ada5f11ce1d2068a985f1b6b5617f7598451d41acba1a74" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/makealias/info.plist", + "bytes": 632, + "sha256": "80d0198699feec20af95c052540d6133a5ad81f3f0257a32b2617305f9e71de0" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/notallowed/cursor.pdf", + "bytes": 55574, + "sha256": "b2d88f766bb3c594c8775d9e745bf04bcad91759da38d4efaaee6587a30896fa" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/notallowed/info.plist", + "bytes": 631, + "sha256": "0f9c9ca325c816c120fd7793d4aeaf271dd5ddde9bda2363d3de79ff8e3a17c7" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/openhand/cursor.pdf", + "bytes": 105829, + "sha256": "9d512eecf0816fc92ee24ff3a1c15262b1e146355b98bdb9b1291a66be71838e" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/openhand/info.plist", + "bytes": 633, + "sha256": "58347d8cb7e1812b6866f1d7385ff8763dd51c87b2e8ebf419dd25b561a76ddf" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/pointer.png", + "bytes": 3036, + "sha256": "3b7ae795139593c8e33812299032916eaf3845c0bfc06979c3aeb74ac9b31af3" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/pointinghand/cursor.pdf", + "bytes": 77529, + "sha256": "8ffe42f8a9e87b5743f2813fc5b5e5588018a581c3d70ae0884ab083fec10c2e" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/pointinghand/info.plist", + "bytes": 632, + "sha256": "4007d782a9363a29dd308006684b8269fcdf4dbb7a2dadd8f88df2d70c64aa90" + }, + { + "path": "gestaltung/cursor/assets/apple/pdf/text.png", + "bytes": 1810, + "sha256": "2ff91499b6e81fdd1e5ddb8ec1e9e2f9f4c47da6252a260203e958a20b5541aa" + }, + { + "path": "gestaltung/cursor/assets/apple/system/arrow.png", + "bytes": 4368, + "sha256": "b904cc513b751af30e11c5a77de956f8dea5272e7561a1682accf41a9aba6405" + }, + { + "path": "gestaltung/cursor/assets/apple/system/assets.json", + "bytes": 1208, + "sha256": "74274894c675f3e83113587d79bb9e79fdcd38bba598295b4543a588d850d050" + }, + { + "path": "gestaltung/cursor/assets/apple/system/blocked.png", + "bytes": 12874, + "sha256": "fe93c367fd34f96510f3fb6bee28bb76e0fa4741f080a962339d59253c4823e8" + }, + { + "path": "gestaltung/cursor/assets/apple/system/copy.png", + "bytes": 11012, + "sha256": "687401e4eef4e745e73c053d12219024eed41bf3799cda8fe15741ec56503884" + }, + { + "path": "gestaltung/cursor/assets/apple/system/grab.png", + "bytes": 7310, + "sha256": "069a07822d0d555e5066d1e3a239becbed7cfe62e6f3ab6d9530a2776fffec09" + }, + { + "path": "gestaltung/cursor/assets/apple/system/grabbing.png", + "bytes": 5164, + "sha256": "6fe1e1a7ffa3355b21f580d5c0d697fe7f731ca99662bfd56db98743f00fb4ce" + }, + { + "path": "gestaltung/cursor/assets/apple/system/link.png", + "bytes": 4978, + "sha256": "c66f98240f69b2f976537b7cdc6343ef019b801d61f0483a4fea9e4d7e491f35" + }, + { + "path": "gestaltung/cursor/assets/apple/system/pointer.png", + "bytes": 6595, + "sha256": "d46f61ed1a4a3048bbb2b1a97696d157a096d3a6dff3f920f91fffba7bec888e" + }, + { + "path": "gestaltung/cursor/assets/apple/system/text.png", + "bytes": 2085, + "sha256": "76a7cbf31465510f56d5dff85bfcc9be7cbb62b5319375f74801d5f4cf8c0c36" + }, + { + "path": "gestaltung/cursor/assets/sources/ghost-cursor/LICENSE", + "bytes": 1063, + "sha256": "48fe0026f06040aabf2b8cbd6a79209c80f58ac3f1e430b26c1d2eeedcd50e48" + }, + { + "path": "gestaltung/cursor/assets/sources/ghost-cursor/README.md", + "bytes": 11676, + "sha256": "ec82b7279b61cb88983d87bb6dbbb4eb02f5dd03b63504a0b61f6ec9ba205edc" + }, + { + "path": "gestaltung/cursor/assets/sources/ghost-cursor/src/math.ts", + "bytes": 3502, + "sha256": "068cd80fa9e38c40b2dfa590ef72fd4205deb6d3f831d7e906fb13169e746ce9" + }, + { + "path": "gestaltung/cursor/assets/sources/ghost-cursor/src/spoof.ts", + "bytes": 32214, + "sha256": "85bcab7fe5817156b2183dceef1102d148b08034fd276f31180e2934e29b3b44" + }, + { + "path": "gestaltung/cursor/assets/sources/humancursor/LICENSE", + "bytes": 1070, + "sha256": "ce401b2a3ed683c362c98ae4402aea7ea13c9d9d33df093a12b36674b7e66fa9" + }, + { + "path": "gestaltung/cursor/assets/sources/humancursor/README.md", + "bytes": 7733, + "sha256": "8f115a3120487b1339ee582dced48b47878fde0b814bde0107bea1ae0346925c" + }, + { + "path": "gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/calculate_and_randomize.py", + "bytes": 3418, + "sha256": "06f82accdc8b5f953d21e59d15769bf23d092930e8b7bdc60ec05824db3604eb" + }, + { + "path": "gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/human_curve_generator.py", + "bytes": 7876, + "sha256": "3754cfc28ac4e172e00bb985f2db181451d8510302d918a63fc76e72d28d89b1" + }, + { + "path": "gestaltung/cursor/assets/sources/mouse-follower/LICENSE", + "bytes": 1075, + "sha256": "888cb6b1f3d92704c8b1d11fd39b9e0932cfe6d6d120cf5fa63f7c82d0bd1b97" + }, + { + "path": "gestaltung/cursor/assets/sources/mouse-follower/README.MD", + "bytes": 14408, + "sha256": "b8759bb4b28e878c1cefe7d5b3affc0316c5a20e185d700e80012ac2ceeb0de0" + }, + { + "path": "gestaltung/cursor/assets/sources/mouse-follower/src/index.js", + "bytes": 22556, + "sha256": "3dc21b1a897419c7e5b2812e53df3a7836d8c74d0dd7e576920e20f3ed7647e0" + }, + { + "path": "gestaltung/cursor/assets/sources/smooth-cursor/LICENSE", + "bytes": 1070, + "sha256": "cb6a12748ac90004300ba8bddb67c66c56f1ad481cbb3d9b9d35d88d5d2adad0" + }, + { + "path": "gestaltung/cursor/assets/sources/smooth-cursor/README.md", + "bytes": 5143, + "sha256": "4a573187f76bffb863d6570c3e8efcc60d9bc0421c3cc0889955f5a3f95fc54c" + }, + { + "path": "gestaltung/cursor/assets/sources/smooth-cursor/src/components/smoothCursor/smoothCursor.tsx", + "bytes": 7076, + "sha256": "c04df14f1801f1fa7fb940ad9d3df2614d74501f4ff5d411f39aa7ff93fe0830" + }, + { + "path": "gestaltung/cursor/assets/sources.json", + "bytes": 5397, + "sha256": "b4bc78699a59cce46a6bb022430b93db09510c9c2c702f78d6faa32e84eabccc" + }, + { + "path": "gestaltung/cursor/auswahl.json", + "bytes": 1335, + "sha256": "8be27bc6461826fd32a4fafba5fc9b42f2021dffce94d5b4af44dd0d048531e2" + }, + { + "path": "gestaltung/cursor/motion.js", + "bytes": 7581, + "sha256": "bdc251af3cd795661016bf89d3ec2cdfc70491924b47ac7eabd5db9ec0a055d6" + }, + { + "path": "gestaltung/doodle/LICENSE.txt", + "bytes": 7048, + "sha256": "a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499" + }, + { + "path": "gestaltung/doodle/README.md", + "bytes": 945, + "sha256": "c7b1d454d847fb1e939afc5ef9e0d7e48da7551245664c074541c2463b070e82" + }, + { + "path": "gestaltung/doodle/auswahl.json", + "bytes": 1119, + "sha256": "4ca1b8f53d90d769776a6b739a6fded1592c3d9f868c7515c7e338dfae96008c" + }, + { + "path": "gestaltung/doodle/calendar.svg", + "bytes": 6432, + "sha256": "003babaf8f8ea2b3d69ca3caf60152c7f38fea845167ecd5ea32b665b90ec6ea" + }, + { + "path": "gestaltung/doodle/camera.svg", + "bytes": 5499, + "sha256": "a9e4611b24fa80aafde011876cbada2b977b006cf82eaf81fcd8a55d68900bfc" + }, + { + "path": "gestaltung/doodle/chat.svg", + "bytes": 3817, + "sha256": "18e4220cfec1068384a0fd198e2a1ab60940be84df0155c55a084f2f8400001f" + }, + { + "path": "gestaltung/doodle/check.svg", + "bytes": 937, + "sha256": "34058dca679b4482b4af38a47b59de10afe6bcd9d2e025b5787f172544beb096" + }, + { + "path": "gestaltung/doodle/file.svg", + "bytes": 5524, + "sha256": "cfd7815a9dc498c0f5587e7649605de0583caa04be5682e6e85b4316abdc7503" + }, + { + "path": "gestaltung/doodle/folder.svg", + "bytes": 2846, + "sha256": "6bee9f34ed2cccfcbe86c8de393c9cd4d4f316dd2ab7ea6df1ff768843fed9e0" + }, + { + "path": "gestaltung/doodle/heart.svg", + "bytes": 2619, + "sha256": "73e643eb4ea399cc40e3669a4d17f6a564b613feb56c0b572b7d0408548ed2b1" + }, + { + "path": "gestaltung/doodle/idea.svg", + "bytes": 4746, + "sha256": "cc5dc91aca3bde86381f4eedc01907dca0d848b8a1313ebbc323b5734e2c5d88" + }, + { + "path": "gestaltung/doodle/license-source.txt", + "bytes": 10012, + "sha256": "fb463b4db73a4c4e51f93fd1d9dc1804fc37eb00329831e5d503018244b17ce8" + }, + { + "path": "gestaltung/doodle/mail.svg", + "bytes": 3607, + "sha256": "f89918f52157e757ccbdeb7fc3195526663ff34be1b4632b1e609265aeab3965" + }, + { + "path": "gestaltung/doodle/person.svg", + "bytes": 2535, + "sha256": "40bf4cbb4b42ab48ea1e1822fef9a337713406f7fffeeac9e522e7c2a4ff5850" + }, + { + "path": "gestaltung/doodle/search.svg", + "bytes": 2453, + "sha256": "5a9d58c4687d35ce399811e728e2d7640459dc43fed2b89bf1066e08cc0bab46" + }, + { + "path": "gestaltung/doodle/settings.svg", + "bytes": 5053, + "sha256": "4adfd718eb754ed96ed71c5735ee8fb3c2f287430df68b9b9f298ee64549b6a9" + }, + { + "path": "gestaltung/doodle/sources.json", + "bytes": 8489, + "sha256": "7907a2735b0f0c4b02ff5d51c3c9870484cb270380af4e2a0851cab975058551" + }, + { + "path": "gestaltung/library-quellen/README.md", + "bytes": 2417, + "sha256": "41191ac54baa62bbf0fb541393967c447d576a9ca7e451352e2e1c5a879a2908" + }, + { + "path": "gestaltung/library-quellen/auswahl.json", + "bytes": 11682, + "sha256": "f912e03cc42943c1d73a682e6202b5786b8136ddaa907dba4f2c7c30b8fd77cd" + }, + { + "path": "gestaltung/library-quellen/package-lock.source.json", + "bytes": 123025, + "sha256": "171d47884be58489fa4445d68fd191f40d97e3cfa737189d61e16051a5bc0587" + }, + { + "path": "gestaltung/library-quellen/package.source.json", + "bytes": 861, + "sha256": "ab897adf96683d2bd34c9664c14328c71af97d244326603447dd18b0cfc6fe7a" + }, + { + "path": "gestaltung/library-quellen/public/runtime/GSAP-LICENSE.txt", + "bytes": 212, + "sha256": "3595bb6a648baa0dfacc4e1465805f852f4841b16803cd956401f3490185563b" + }, + { + "path": "gestaltung/library-quellen/public/runtime/Inter-LICENSE.txt", + "bytes": 4477, + "sha256": "3b0a5fca3d17942cde889069889dedbbbd075e9b599968c82a95f4d944e9b345" + }, + { + "path": "gestaltung/library-quellen/public/runtime/LICENSE-inter.txt", + "bytes": 4477, + "sha256": "3b0a5fca3d17942cde889069889dedbbbd075e9b599968c82a95f4d944e9b345" + }, + { + "path": "gestaltung/library-quellen/public/runtime/gsap.min.js", + "bytes": 72927, + "sha256": "92bb9a96476f983d212a2bc4f54c889039c1696dd4461d40a736860938570fbb" + }, + { + "path": "gestaltung/library-quellen/public/runtime/inter-latin.woff2", + "bytes": 48256, + "sha256": "3100e775e8616cd2611beecfa23a4263d7037586789b43f035236a2e6fbd4c62" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/LICENSE.md", + "bytes": 1292, + "sha256": "bb145c4b692008a88e8e565953d1ca258f2f9ea25190afaa86877a9e9de1c040" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/hooks/use-controlled-state/index.tsx", + "bytes": 855, + "sha256": "30a1a0b4a3f73ee60393c34ce18a40e3b0b420cf62aa3b32eb253ee6c61db295" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/hooks/use-is-in-view/index.tsx", + "bytes": 751, + "sha256": "937c20c97078349e6fb2d2b296f8749fcc70887a6ad691cbdcf284342fb468dc" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/lib/get-strict-context/index.tsx", + "bytes": 749, + "sha256": "11e131ad0fea82497777b9fce9e7cff17929deb3f776a9a81482c753434d7818" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/animate/slot/index.tsx", + "bytes": 2363, + "sha256": "71ab5d88b89e0766d69bb5b4fd3918a263c14ed01f5745fc0323ed25a9cb87c8" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx", + "bytes": 3308, + "sha256": "3d854a44c23edc8bea8806cb8f2e741ad6dc98e9a8511f6db3bfc43e6f64afd1" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx", + "bytes": 3222, + "sha256": "2a3ed7198822fe2cc04d78ec8d04219f483aab090f0769dde17af50d07b19902" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx", + "bytes": 3429, + "sha256": "e561016ecdec257e51e798e9b584dbde514a07c67ef268995654a98c4e04ae52" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx", + "bytes": 1311, + "sha256": "284ea11fceea7a9d0aad3680e32e2867d4ca3bf6d53abee09b14922d0ce9c526" + }, + { + "path": "gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx", + "bytes": 4400, + "sha256": "14db8c0af1ddf06d427f6be4f00f896f2cdfeb24461458bc589d6e2c684e2c1a" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/LICENSE", + "bytes": 10763, + "sha256": "4259155fb06f127687ee7b0a8a3682d45132db0f2da26cbc0b7a2d1e796436b8" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/animated-bar-chart.html", + "bytes": 2778, + "sha256": "ceae5ee442ace07edfc115ed509982805c311e0c57a07517d3c95e1d60c898f2" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/demo.html", + "bytes": 5386, + "sha256": "bd54416ea5b1e4c674a0c9484bfcdc5efe070bd85a488767212a4f688e7a129b" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/registry-item.json", + "bytes": 591, + "sha256": "8803c6702b9718c3ceec3b02ef63cb9df5cd49e05d3b9d3abaf025507bbbdd86" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/README.md", + "bytes": 3693, + "sha256": "a0aa4b234c76010df7fb3a26f88767f8c8a8311e7e722e9c4ae693dd8e1042e2" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/demo.html", + "bytes": 2287, + "sha256": "9b1c5819261617bfd3d9de1a1f5afe0b4b9d82f3a852851c2b09ff530f8bd0ee" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/modal-morph.html", + "bytes": 21298, + "sha256": "a932a8deece4bbe231f99010e01800e35564a4d59ca4d59bbce09b1f0be942b4" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/registry-item.json", + "bytes": 2614, + "sha256": "a0b1a87b24fbd21e8f19863da00ce91cb5861b3c3df77e3703bba7401fb9a6b4" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/README.md", + "bytes": 4290, + "sha256": "a3bdb98a6628b9cc5df9d7b8ceaeb9b412a8ac518f22d3875fd9199f7c9042c6" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/demo.html", + "bytes": 2819, + "sha256": "f9e599a1a5e02b34ed0781ca70d4d5adaadb300c4aa1d889b8db0c73ca8bc2ed" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/notification-stack.html", + "bytes": 16821, + "sha256": "dfe78474314169e66fb3cb6fa26d3e09755873248a1ff72dc4b472edacbb2771" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/registry-item.json", + "bytes": 2723, + "sha256": "ba7f9ff574566aacd8a05fbc83f97b2ac7d26f2a171a27cdbcf2c4c620190804" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/demo.html", + "bytes": 4288, + "sha256": "3fb1cd199f271b1be8aaf99cdeaa94c635d524716f055e8687ba8d1b4722fab4" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html", + "bytes": 2486, + "sha256": "985712b460ba2203ae3a05aeb4ed0d580d8446a4c09aab1fc555c53eaf2b4746" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/registry-item.json", + "bytes": 663, + "sha256": "83554c4ab2bcd8357fed823377798f42a4c7594457a682bda34ef676e3f8896e" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/README.md", + "bytes": 4997, + "sha256": "9e2ff0c5870c6ef239ee3ae34c91625f5fc329ddf12ad71fc5a4cf3877e51783" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/demo.html", + "bytes": 2229, + "sha256": "6325567b87cf4427678db79b502afe4c0a79b5e89f0e3e080a11eb3dd9155c65" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/press-ripple.html", + "bytes": 17963, + "sha256": "db9edeff080d126609c103d880c166b7aafa5bbb9f0d92fc52c6aa72407d6104" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/registry-item.json", + "bytes": 3293, + "sha256": "58b5966e0048c89344c6204ac34bf084656b844e4048b09ecc10e9b4a17a2f24" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/README.md", + "bytes": 4126, + "sha256": "490a6464208df942996d5a69bd3a76232d69f43d464b6c201ff38ff45f06c58e" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/demo.html", + "bytes": 2467, + "sha256": "c54833d86df3217f9487137749e6ae84aad6504f72e902ff1287377266f76f33" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/registry-item.json", + "bytes": 2467, + "sha256": "7ec4ea40e901cd0840ba5d6b189154fc7be0ff36121fab02af3300a53e129d33" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/screen-flow-carousel.html", + "bytes": 23455, + "sha256": "db49f679a66fb4505e07d395bff8188ae568fbfac36a50c94f1e58fcd925e11a" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/settings-toggle-flow/demo.html", + "bytes": 4108, + "sha256": "ec46c7b9318a54b936f88a3b6e5d96223e850149da84cc05e6e5837b0ddfe166" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/settings-toggle-flow/registry-item.json", + "bytes": 646, + "sha256": "4a679d64c256d4c1eca7edad249b0728fa05aa20da9d03bd4405f6f1c0d1fbb8" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/settings-toggle-flow/settings-toggle-flow.html", + "bytes": 2363, + "sha256": "f027fcc6cb55156dd2835c84a5c5615272c7653842a7f0fc5185b9ae85baa178" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/terminal-simulator/demo.html", + "bytes": 4714, + "sha256": "9e50f3c8ae4041d5b0f91ba59cf8cce552f04cdcb054ff6fc488f3330c1a0113" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/terminal-simulator/registry-item.json", + "bytes": 588, + "sha256": "5cb3199d7db9d44ddadae354c54175c07b0230013375e384eaa7416bf3ca45c6" + }, + { + "path": "gestaltung/library-quellen/public/sources/hyperframes/registry/components/terminal-simulator/terminal-simulator.html", + "bytes": 2880, + "sha256": "c0ac45edf9d3493e2303052a79ecc650ee03d21d9fda4680b20577333edb08ef" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/LICENSE.md", + "bytes": 1060, + "sha256": "0147b84235ed916b8b4e89c1f80655351c5afe7d211b629be61f553a227b34ba" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/animated-beam.tsx", + "bytes": 4986, + "sha256": "6afa2ee1d01694a428eb8517d48deebe5c6b532dc0ee871800bb9d92aae43e79" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/animated-circular-progress-bar.tsx", + "bytes": 3524, + "sha256": "c7f974283804607484afba34a5886af027cb58528a1987f392c35a577a77a782" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/animated-list.tsx", + "bytes": 2036, + "sha256": "9363c5afa61d7aab1919b4500f7325cc8871b35103d5dd60a2a1625fe5e7dc58" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/number-ticker.tsx", + "bytes": 1799, + "sha256": "0f7dcbc6a1962615a877590304e846f33d390002a51f2226f544938577c220f4" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/terminal.tsx", + "bytes": 7716, + "sha256": "a0ece03773e1a17862e049f11f72647b5db44dc1400473bdecd3c0e81f43f2d7" + }, + { + "path": "gestaltung/library-quellen/public/sources/magicui/apps/www/registry/magicui/typing-animation.tsx", + "bytes": 5671, + "sha256": "70ce53aff9dd61cba9d5c8999e8a05120839d4d8e0396a5e0a1579f155d18e4b" + }, + { + "path": "gestaltung/library-quellen/public/sources/manifest.json", + "bytes": 36287, + "sha256": "1f257efbf0f2090ae55c28e3416e433b02504e2d0f20428b27327ced56671738" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/LICENCE.md", + "bytes": 1077, + "sha256": "f668f5ef3635eb906f10b1eea9a32e449eb6e1a183ab6879ef6d56c0980dd2f3" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/animated-number.tsx", + "bytes": 828, + "sha256": "3b4a9f3262cb79527fba01a76576e920e340137f0643bf34a7732f7f8b1ff792" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/border-trail.tsx", + "bytes": 1183, + "sha256": "6b6334b83c97304c68143a45971fe492aaf24676047d05e4fec13cd42cefe916" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/text-effect.tsx", + "bytes": 7271, + "sha256": "4b93c0ea6b9d747d69b7a244d5279f790a11a784e73713f3fe17a636abf53484" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/text-loop.tsx", + "bytes": 1764, + "sha256": "87707ae5f7a3e13f1e6d348e735e65b05d742dc24343d20b6470f8b857d0d2d4" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/text-shimmer.tsx", + "bytes": 1735, + "sha256": "a294c8a1092296a38e28128ad8f2953401fcca85b5ae29ee479bd71bfac3348e" + }, + { + "path": "gestaltung/library-quellen/public/sources/motion-primitives/components/core/transition-panel.tsx", + "bytes": 1015, + "sha256": "1b3c67058a09a560a034b7fe52ad1c205b589a63ed80055900e8a66830db0be2" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/LICENSE.md", + "bytes": 1303, + "sha256": "f4c33af6739191537738662d223b68d77bc226f4b57ea883e16481d8cc5c73c9" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/AnimatedList/AnimatedList.css", + "bytes": 1095, + "sha256": "b10367c73d4b8d76df07cba49c1270ce26864f079b2c42a790fec6b1d2dad5ef" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/AnimatedList/AnimatedList.jsx", + "bytes": 4924, + "sha256": "b891e4647b122c0b4f4a573435624b5cc780ef3cacb9a2124c6b7dc4d1f6ccc4" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/Folder/Folder.css", + "bytes": 2404, + "sha256": "f3476c80d1145db8d09e880e1ae9bc14d19832ddb24791be6ef9281852d9c9a6" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/Folder/Folder.jsx", + "bytes": 3631, + "sha256": "cb11305ad2188e006387357672c7a9ede15a07e165f35b391840a450c39fc31b" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/Stepper/Stepper.css", + "bytes": 2424, + "sha256": "8f95c1ecd5b1a6e7740b9efc4dce02187d5241b4d4cef1878f9797c4e536c777" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/Components/Stepper/Stepper.jsx", + "bytes": 7537, + "sha256": "f8e9120d90d42ac0265a9b477301c1777f196dcca0c854d82d58b34b5138de52" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/TextAnimations/CountUp/CountUp.jsx", + "bytes": 2560, + "sha256": "b02541a7a04d8872fb250fe760d2df44799270a24a494ad8d4ba259d98c984e9" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/TextAnimations/RotatingText/RotatingText.css", + "bytes": 513, + "sha256": "9a6757dfd090eac2991a64d9fa7833dc13c1ef01f174a026730c205185e39f76" + }, + { + "path": "gestaltung/library-quellen/public/sources/react-bits/src/content/TextAnimations/RotatingText/RotatingText.jsx", + "bytes": 6037, + "sha256": "7d3e9bd8366231aeb5b88e97637df3232a285422598dd8cc8104fb2079ec4316" + }, + { + "path": "gestaltung/library-quellen/src/demo.css", + "bytes": 4261, + "sha256": "b5b8e6c55e1aa7543332fd93290e2a1f3dc8a87807517c0b9ae88a033b731a60" + }, + { + "path": "gestaltung/library-quellen/src/lib/utils.ts", + "bytes": 134, + "sha256": "35012577587b21a862e44a2b9e01cb97e574c451e6fd3e8c69bc0bc21d13f203" + }, + { + "path": "gestaltung/library-quellen/src/motion-loop.tsx", + "bytes": 579, + "sha256": "a9e4d177bcc979233024a7baacc6e78894b1f8211b3dc594718129810c77c5b1" + }, + { + "path": "gestaltung/library-quellen/src/packs/animate-ui.tsx", + "bytes": 2103, + "sha256": "c71003227378859257fb14161a84b5fecf838209fe19864f261b8cb039352ee6" + }, + { + "path": "gestaltung/library-quellen/src/packs/magicui.tsx", + "bytes": 3307, + "sha256": "97b45207424d2943bdb4d92bccef9af795b5efbe9852d131f25af4e747036598" + }, + { + "path": "gestaltung/library-quellen/src/packs/motion-primitives.tsx", + "bytes": 2806, + "sha256": "74dc8e21845eb40296fca1bdce0c853c95e0afcfd0e7e72e6cb0b6f309babc22" + }, + { + "path": "gestaltung/library-quellen/src/packs/react-bits.tsx", + "bytes": 1898, + "sha256": "c67effb2577cf9d207d9d01edc9e94b02b435a636af9d1c20860554f1aa42e84" + }, + { + "path": "gestaltung/library-quellen/src/studies/scenes.ts", + "bytes": 416695, + "sha256": "4fa10e34f6137c1a88171aa88abeb4cc254c265b8604dd1652ac1cf48c8d86a5" + }, + { + "path": "gestaltung/library-quellen/src/studies/studies.css", + "bytes": 151150, + "sha256": "b27908139c198cef6f76002b5faf9fe400c2339e54677704d9e4648752ed4d86" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/LICENSE.md", + "bytes": 1292, + "sha256": "bb145c4b692008a88e8e565953d1ca258f2f9ea25190afaa86877a9e9de1c040" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/hooks/use-controlled-state/index.tsx", + "bytes": 855, + "sha256": "30a1a0b4a3f73ee60393c34ce18a40e3b0b420cf62aa3b32eb253ee6c61db295" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/hooks/use-is-in-view/index.tsx", + "bytes": 751, + "sha256": "937c20c97078349e6fb2d2b296f8749fcc70887a6ad691cbdcf284342fb468dc" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/lib/get-strict-context/index.tsx", + "bytes": 749, + "sha256": "11e131ad0fea82497777b9fce9e7cff17929deb3f776a9a81482c753434d7818" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/animate/slot/index.tsx", + "bytes": 2363, + "sha256": "71ab5d88b89e0766d69bb5b4fd3918a263c14ed01f5745fc0323ed25a9cb87c8" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx", + "bytes": 3308, + "sha256": "3d854a44c23edc8bea8806cb8f2e741ad6dc98e9a8511f6db3bfc43e6f64afd1" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx", + "bytes": 3222, + "sha256": "2a3ed7198822fe2cc04d78ec8d04219f483aab090f0769dde17af50d07b19902" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx", + "bytes": 3429, + "sha256": "e561016ecdec257e51e798e9b584dbde514a07c67ef268995654a98c4e04ae52" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx", + "bytes": 1311, + "sha256": "284ea11fceea7a9d0aad3680e32e2867d4ca3bf6d53abee09b14922d0ce9c526" + }, + { + "path": "gestaltung/library-quellen/src/vendor/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx", + "bytes": 4400, + "sha256": "14db8c0af1ddf06d427f6be4f00f896f2cdfeb24461458bc589d6e2c684e2c1a" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/LICENSE.md", + "bytes": 1060, + "sha256": "0147b84235ed916b8b4e89c1f80655351c5afe7d211b629be61f553a227b34ba" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/animated-beam.tsx", + "bytes": 4986, + "sha256": "6afa2ee1d01694a428eb8517d48deebe5c6b532dc0ee871800bb9d92aae43e79" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/animated-circular-progress-bar.tsx", + "bytes": 3524, + "sha256": "c7f974283804607484afba34a5886af027cb58528a1987f392c35a577a77a782" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/animated-list.tsx", + "bytes": 2036, + "sha256": "9363c5afa61d7aab1919b4500f7325cc8871b35103d5dd60a2a1625fe5e7dc58" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/number-ticker.tsx", + "bytes": 1799, + "sha256": "0f7dcbc6a1962615a877590304e846f33d390002a51f2226f544938577c220f4" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/terminal.tsx", + "bytes": 7716, + "sha256": "a0ece03773e1a17862e049f11f72647b5db44dc1400473bdecd3c0e81f43f2d7" + }, + { + "path": "gestaltung/library-quellen/src/vendor/magicui/apps/www/registry/magicui/typing-animation.tsx", + "bytes": 5671, + "sha256": "70ce53aff9dd61cba9d5c8999e8a05120839d4d8e0396a5e0a1579f155d18e4b" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/LICENCE.md", + "bytes": 1077, + "sha256": "f668f5ef3635eb906f10b1eea9a32e449eb6e1a183ab6879ef6d56c0980dd2f3" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/animated-number.tsx", + "bytes": 828, + "sha256": "3b4a9f3262cb79527fba01a76576e920e340137f0643bf34a7732f7f8b1ff792" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/border-trail.tsx", + "bytes": 1183, + "sha256": "6b6334b83c97304c68143a45971fe492aaf24676047d05e4fec13cd42cefe916" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/text-effect.tsx", + "bytes": 7271, + "sha256": "4b93c0ea6b9d747d69b7a244d5279f790a11a784e73713f3fe17a636abf53484" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/text-loop.tsx", + "bytes": 1764, + "sha256": "87707ae5f7a3e13f1e6d348e735e65b05d742dc24343d20b6470f8b857d0d2d4" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/text-shimmer.tsx", + "bytes": 1735, + "sha256": "a294c8a1092296a38e28128ad8f2953401fcca85b5ae29ee479bd71bfac3348e" + }, + { + "path": "gestaltung/library-quellen/src/vendor/motion-primitives/components/core/transition-panel.tsx", + "bytes": 1015, + "sha256": "1b3c67058a09a560a034b7fe52ad1c205b589a63ed80055900e8a66830db0be2" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/LICENSE.md", + "bytes": 1303, + "sha256": "f4c33af6739191537738662d223b68d77bc226f4b57ea883e16481d8cc5c73c9" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/AnimatedList/AnimatedList.css", + "bytes": 1095, + "sha256": "b10367c73d4b8d76df07cba49c1270ce26864f079b2c42a790fec6b1d2dad5ef" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/AnimatedList/AnimatedList.jsx", + "bytes": 4924, + "sha256": "b891e4647b122c0b4f4a573435624b5cc780ef3cacb9a2124c6b7dc4d1f6ccc4" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/Folder/Folder.css", + "bytes": 2404, + "sha256": "f3476c80d1145db8d09e880e1ae9bc14d19832ddb24791be6ef9281852d9c9a6" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/Folder/Folder.jsx", + "bytes": 3631, + "sha256": "cb11305ad2188e006387357672c7a9ede15a07e165f35b391840a450c39fc31b" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/Stepper/Stepper.css", + "bytes": 2424, + "sha256": "8f95c1ecd5b1a6e7740b9efc4dce02187d5241b4d4cef1878f9797c4e536c777" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/Components/Stepper/Stepper.jsx", + "bytes": 7537, + "sha256": "f8e9120d90d42ac0265a9b477301c1777f196dcca0c854d82d58b34b5138de52" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/TextAnimations/CountUp/CountUp.jsx", + "bytes": 2560, + "sha256": "b02541a7a04d8872fb250fe760d2df44799270a24a494ad8d4ba259d98c984e9" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/TextAnimations/RotatingText/RotatingText.css", + "bytes": 513, + "sha256": "9a6757dfd090eac2991a64d9fa7833dc13c1ef01f174a026730c205185e39f76" + }, + { + "path": "gestaltung/library-quellen/src/vendor/react-bits/src/content/TextAnimations/RotatingText/RotatingText.jsx", + "bytes": 6037, + "sha256": "7d3e9bd8366231aeb5b88e97637df3232a285422598dd8cc8104fb2079ec4316" + }, + { + "path": "gestaltung/library-theme.css", + "bytes": 17292, + "sha256": "6ce423d25bddbf2603d7a84eb76a1f0e56a81abc1f3ef311ac575a945f143ec8" + }, + { + "path": "gestaltung/outro-e120/E120-Alpha.mov", + "bytes": 75019080, + "sha256": "540846ebf196d4c3c3a5d0d76ade9c9b7087de87f076e67f9e2dfbba95095328" + }, + { + "path": "gestaltung/outro-e120/README.md", + "bytes": 2417, + "sha256": "cd8d0643f524540f641541ec1c235808fc3aaf2bf988d0612ca0a0a0c3dcb428" + }, + { + "path": "gestaltung/outro-e120/Vorschau.png", + "bytes": 90688, + "sha256": "a942c726d9b94c874579bed2b924bb625a04a91d28dcf9a38ade8192d333d788" + }, + { + "path": "gestaltung/outro-e120/alpha-pruefung.json", + "bytes": 1030, + "sha256": "6980c455e4468020baf4cc2a523d62478abd2258721d875f8a007ef3cbc9983a" + }, + { + "path": "gestaltung/outro-e120/brand-build.js", + "bytes": 4665, + "sha256": "d42c4786d65b92b28f533b7dd9f6e782983a4a3ddb75bc5732f459bf48290f51" + }, + { + "path": "gestaltung/outro-e120/entry.css", + "bytes": 4850, + "sha256": "9a1d4c6510f6cd69e988664ac4e76368efd6c889e73094d09d3d123b3725b8c9" + }, + { + "path": "gestaltung/outro-e120/entry.js", + "bytes": 2444, + "sha256": "04123b449afb28df7eb2dcd05be6984403b855239ecac63f6c852e859746c977" + }, + { + "path": "gestaltung/outro-e120/g.png", + "bytes": 95886, + "sha256": "2c257ebe41fccb4ac1db4d9ec6fe65400539297a7a694be8069d50b507c9cca6" + }, + { + "path": "gestaltung/outro-e120/gsap.min.js", + "bytes": 72927, + "sha256": "92bb9a96476f983d212a2bc4f54c889039c1696dd4461d40a736860938570fbb" + }, + { + "path": "gestaltung/outro-e120/index.html", + "bytes": 2619, + "sha256": "b51bc1b0a2c8eee796a73e3b4ff157e1e86142f23480c5b2a50291d939a012c1" + }, + { + "path": "gestaltung/outro-e120/index.motion.json", + "bytes": 129, + "sha256": "a1bba2963fb75ba414541bd9ca629e40898f3a6a822d26b0a7687d904f23fc93" + }, + { + "path": "gestaltung/outro-e120/logo-left.svg", + "bytes": 1859, + "sha256": "828223e9dea761ae5bd956c9a6e54ba94b4b395a3bff048a9ddbbbd6d732bde1" + }, + { + "path": "gestaltung/outro-e120/logo-right.svg", + "bytes": 1909, + "sha256": "f04952c303509d1c1b9d024cd827086be6e3add5acc29cb872d03419607fd6d1" + }, + { + "path": "gestaltung/outro-e120/logo-web.svg", + "bytes": 3698, + "sha256": "d34e9f5f9bdef580284352522a1b7c6c072d87627bb5540abd17e1e21f2c6474" + }, + { + "path": "gestaltung/outro-e120/manrope-OFL.txt", + "bytes": 4387, + "sha256": "58172e0c0fac2cda8a37b348164bb55e44b0e69051e557e92b1d3f6910141f7b" + }, + { + "path": "gestaltung/outro-e120/manrope.ttf", + "bytes": 164700, + "sha256": "3ae11c49db0455a3cc33e37d380f20fdb8c7f8b41dc07625c177e3d87a9d6ae6" + }, + { + "path": "gestaltung/outro-e120/package.json", + "bytes": 262, + "sha256": "938bfde69e130eecf154b732c58000e8f8ea34982e78bab18b20d450c81ad2ac" + }, + { + "path": "gestaltung/outro-e120/shake-pruefung.json", + "bytes": 202, + "sha256": "f355533295e26eff3b9a6cca88564eb885e6bb7a189f9cb80e26c72c79a5b026" + }, + { + "path": "gestaltung/tokens.css", + "bytes": 831, + "sha256": "7fa72ebadc70a45f5dc645594997d6d3a520236dc84123c50edfcc55d16709e0" + }, + { + "path": "gestaltung/tokens.json", + "bytes": 1147, + "sha256": "9b66d19e68ee962e4fbf07a880c42b1f9229ed9a495123dfdb946ceff7e9d7cb" + }, + { + "path": "gestaltung/uebergabestand.png", + "bytes": 102641, + "sha256": "90f5a813a6d98d1f7f25e46916fea44e766bf28458dc9a20b88836c42a5c7275" + }, + { + "path": "planung/WORKFLOW.md", + "bytes": 14814, + "sha256": "5912e4477dab8856f080d45ec8b11fb95a9d73d6b3cb4d786100b7c059bb4c0d" + }, + { + "path": "reel-dokumentation/README.md", + "bytes": 9480, + "sha256": "f2e71ab6849fef5770ee5fd01dd585e15ad01b6c04fc3deac7dfd17fc29adf39" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/00_grundlagen/README.md", + "bytes": 821, + "sha256": "e6ddb8aa403643e763f9133edaa0a66c0ba84fd128fca5e38d705a8c1bce69cf" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/01_rohdaten/README.md", + "bytes": 672, + "sha256": "4a420ca9ea89aed3995a6f196835eb258bb943610c7f18af817cc7731f323525" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/02_text/SCRIPT_r01.md", + "bytes": 784, + "sha256": "d5790c4ce71e061d6ce31d3505343fb3788994ca2bc65bd7522b8a00b8e14099" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/02_text/TRANSKRIPT-CUT_r01.md", + "bytes": 664, + "sha256": "9806d74a4afb063bbd727689826e48be3586fca115c421f537e8674061747176" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/02_text/TRANSKRIPT-ROH_r01.md", + "bytes": 1067, + "sha256": "9fdd3f0781e47b769bf8cfbe30ad9ac203c47e3a26ee63fc269b821b714048b5" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/03_planung/PLAN_r01.md", + "bytes": 1338, + "sha256": "fa0a55c4e478d58d3cb035a0cf4d9796d531469c0256b63c04b343c6f6787887" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/04_schnitt/README.md", + "bytes": 1561, + "sha256": "2311f37ef647e7a2088ff01ca2cde7a308dc8defb1ad5a7e163eb85fae3f6052" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/05_animationen/A/README.md", + "bytes": 1823, + "sha256": "d8452606119bd9aad582fd1469783f70aa980b46ac073efb7e29597c1b3c88fa" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/05_animationen/B/README.md", + "bytes": 1823, + "sha256": "afaa0b58ce62566c7dca7cd48bb63f2e085a9d45c21fce3a481597a4fb52dcbb" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/05_animationen/C/README.md", + "bytes": 1823, + "sha256": "d05d02c4403df08fe0f344b1abcac58f2a010bd7c1fd8b2d5b7852c76349fcfe" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/06_final/README.md", + "bytes": 2418, + "sha256": "ffa34f8c555ad04663e1206578e43411de539ebc9ea36733c5ed6738104dcd08" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/ENTSCHEIDUNGEN.md", + "bytes": 1376, + "sha256": "c563985ae34e991917168465c682149445ecdc47be11be6ae472c032330b3e95" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/README.md", + "bytes": 1813, + "sha256": "fef37bf12c1cabdff567e7b9df2f61f481fbeab76b3cb505fbed30d1244adf50" + }, + { + "path": "reel-dokumentation/REEL-VORLAGE/VERSIONEN-VERGLEICH.md", + "bytes": 1627, + "sha256": "ee4eb7fc294068a781380c934eeeee9cc3542a25b6200253d812531220864741" + }, + { + "path": "reel-produktionsbasis/.gitignore", + "bytes": 37, + "sha256": "6e3eff9c9ce7771c9b2f96a66a978bd212a53552ceb9b68feb954d086c65370c" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/b-roll/untertitel.html", + "bytes": 638, + "sha256": "46b760f1b6588fc8912487b311ad5ec0d18e31bfa01e01e302db3f3662f834d7" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/mit-animation/animation.html", + "bytes": 566, + "sha256": "c58deee12f7e658c71ecac0f1176e5ae0f619b8d61c203a689913130d2294cab" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/mit-animation/untertitel.html", + "bytes": 801, + "sha256": "55ad18ea5351ace2ee8d409f7caaa30366c2b5a1494dd350e99757aa6edd08be" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/nur-animation/animation.html", + "bytes": 566, + "sha256": "26bcc0d2f28576b9833369548e6c7517c6791d94a3b92331999f4054a3719751" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/nur-animation/untertitel.html", + "bytes": 666, + "sha256": "c256a7c037d8f4ddebcbbd02ba79ce75f356e77dfc01d4b8bd59923db4802de2" + }, + { + "path": "reel-produktionsbasis/.vorlagen-bausteine/standard/untertitel.html", + "bytes": 646, + "sha256": "6c3227412cc2df48459aa130f8dab0efefb3e77dfd5de147af5cb95a175156ff" + }, + { + "path": "reel-produktionsbasis/AGENTS.md", + "bytes": 10660, + "sha256": "44971901d0aa0e821f43a2fb198055d19668be05a3071ebdc41e6165edee5997" + }, + { + "path": "reel-produktionsbasis/CHECKLISTE.md", + "bytes": 7643, + "sha256": "81fc30a5956172801341b5a9bcde57d1d4fb1dad1d63b3892633d6b3eddcc50c" + }, + { + "path": "reel-produktionsbasis/CLAUDE.md", + "bytes": 9192, + "sha256": "7b332028fdf21c38a86f3081f3aed222299b8e89850a4aab1ecbbb1e97454527" + }, + { + "path": "reel-produktionsbasis/KERN.md", + "bytes": 12508, + "sha256": "13b29d9719d72c4dcfe8d986353dbaf8ccef358e03df4d7e1143e0503c1716f6" + }, + { + "path": "reel-produktionsbasis/README.md", + "bytes": 4143, + "sha256": "dca1f40ca2c8343c4698025bbdb5742d88c56274688c052233a7438c6ece08a6" + }, + { + "path": "reel-produktionsbasis/Vorlagen/README.md", + "bytes": 8935, + "sha256": "235e68e2dfc59f4ff3db8ac95937f3c0780ee7cecc296a0ece5eb27aa0e8463b" + }, + { + "path": "reel-produktionsbasis/Vorlagen/aktualisieren.py", + "bytes": 5263, + "sha256": "d248e2173f98c4002a9ad76872d3eb6436ac7e0866a1abbe3ba297233d030c5d" + }, + { + "path": "reel-produktionsbasis/Vorlagen/b-roll/README.md", + "bytes": 3277, + "sha256": "da0444374e0c434970c299a65d6582ca77b1692eed275008c76d87b06b02a058" + }, + { + "path": "reel-produktionsbasis/Vorlagen/b-roll/assets/hilfslinien.svg", + "bytes": 14847, + "sha256": "59e4207dd6f032cdbaa7cc6d7c010f481d19d575905e86f9bc1f101b856aa95f" + }, + { + "path": "reel-produktionsbasis/Vorlagen/b-roll/bereiche.json", + "bytes": 3460, + "sha256": "58029ef06051f6952f47309a909eb0303a1a6818bf163a68bb3135c767818938" + }, + { + "path": "reel-produktionsbasis/Vorlagen/b-roll/layout.css", + "bytes": 280, + "sha256": "1c8f720e37d687c0e8ef88eb6fc02466a72039349833767338058875d102b6b6" + }, + { + "path": "reel-produktionsbasis/Vorlagen/b-roll.html", + "bytes": 2178, + "sha256": "3162d7d4e69f05ab32f08c35b12e36bea2d9132f7c82883446de140e17867537" + }, + { + "path": "reel-produktionsbasis/Vorlagen/hilfsansicht.py", + "bytes": 4586, + "sha256": "41708ce46876735a78120119a16a6a7e7cc39acf336601433a8cabc0da67ada2" + }, + { + "path": "reel-produktionsbasis/Vorlagen/hilfslinien.css", + "bytes": 179, + "sha256": "9708e9052e33dadb127b0bef3cbf795a7dc7cea2433dd04c8da6dd71180306a6" + }, + { + "path": "reel-produktionsbasis/Vorlagen/mit-animation/README.md", + "bytes": 4145, + "sha256": "af30c865cda3852e861213c1497bf61599eeae24502091119dd608c95d4a92af" + }, + { + "path": "reel-produktionsbasis/Vorlagen/mit-animation/assets/hilfslinien.svg", + "bytes": 16801, + "sha256": "f92463a46353c62600234d73ffcbc67452d97fc6b21021a2f58010112fba1f4e" + }, + { + "path": "reel-produktionsbasis/Vorlagen/mit-animation/bereiche.json", + "bytes": 5058, + "sha256": "19561d1a50462e801d426f05e901b2a268aa2471ad257e6c348515a7545f3cf2" + }, + { + "path": "reel-produktionsbasis/Vorlagen/mit-animation/layout.css", + "bytes": 500, + "sha256": "f08ad2d223266be053661af3fe647490cea9a17920b2b61017498996e4d97641" + }, + { + "path": "reel-produktionsbasis/Vorlagen/mit-animation.html", + "bytes": 3078, + "sha256": "34b3f1ad3583b30caed7044646790f101400d894ce8d9a275dbb4ad670749090" + }, + { + "path": "reel-produktionsbasis/Vorlagen/nur-animation/README.md", + "bytes": 3908, + "sha256": "ff0a23af33b23e6c9381e27ea58f7def33f765bc7353a4e79b492c57d36f7652" + }, + { + "path": "reel-produktionsbasis/Vorlagen/nur-animation/assets/hilfslinien.svg", + "bytes": 15884, + "sha256": "f57b901f34cc153485da64a5d97d99a22875f8c284b26aa9fd397ccfb40a826c" + }, + { + "path": "reel-produktionsbasis/Vorlagen/nur-animation/bereiche.json", + "bytes": 4700, + "sha256": "9d071ade4d8c328a648d451de08208259b9e9d01c4c11b9cc489f4d371ceef15" + }, + { + "path": "reel-produktionsbasis/Vorlagen/nur-animation/layout.css", + "bytes": 388, + "sha256": "2c03684b6d96b0c947e576bb5efc816db7fcbe07d6c2d532ba9a91abf19da801" + }, + { + "path": "reel-produktionsbasis/Vorlagen/nur-animation.html", + "bytes": 2601, + "sha256": "073417b29feca368a0fe10f9e5c3188d6dd81330d1bb181bc59efbdf9bd20d0f" + }, + { + "path": "reel-produktionsbasis/Vorlagen/pruefen.py", + "bytes": 4331, + "sha256": "d69f711c0480d568cce47ad0d304270e2538d723280c278e25519b230406622c" + }, + { + "path": "reel-produktionsbasis/Vorlagen/standard/README.md", + "bytes": 3891, + "sha256": "6ad046fdbc883fb64e5627b515f3226284ac3ca5556012456df1445630a9deb0" + }, + { + "path": "reel-produktionsbasis/Vorlagen/standard/assets/hilfslinien.svg", + "bytes": 16699, + "sha256": "5012dc70a6199a779821702ecd64aa9178eba9c460752c42a21336c076e3cfa8" + }, + { + "path": "reel-produktionsbasis/Vorlagen/standard/bereiche.json", + "bytes": 4501, + "sha256": "cac656c58cf8ad740584a3d0e87b656bc980febcfa93c7ac423f3dfc6aeec09f" + }, + { + "path": "reel-produktionsbasis/Vorlagen/standard/layout.css", + "bytes": 485, + "sha256": "bc66a8643e6f7068d3040a0e5a55a22f931a05b3b7198aa244c940dbff5baefa" + }, + { + "path": "reel-produktionsbasis/Vorlagen/standard.html", + "bytes": 2493, + "sha256": "fa690c1d2ce86d09b31f0bdefbbc14a5c306f1527b06d1df49d80bf6ef0e834b" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-deckkraft.png", + "bytes": 83319, + "sha256": "799bcdbe3d02ddc2d96cef20515a2e26e5908c5dbc9cf3f562c73e2bf23ffa0a" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-ebenen.png", + "bytes": 94408, + "sha256": "726b7b536b85d6b7c290fed801d5b6a28694566e8ba4fcd729d36272b1ce3d38" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-hilfsebene.png", + "bytes": 85010, + "sha256": "e2a7d229fec3c9be6c1e6f411a83aac32a210b484381795556e44e7fc784c1a1" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-prueffarben.png", + "bytes": 69090, + "sha256": "df58c00f6a9b7c275c1c934ccb79bf35559b363ef1c9df60d5fde5dee1bdafa3" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-vorschau.png", + "bytes": 59634, + "sha256": "d192c2d714b48641987edd9558d44f463d0d85699ae181a512d72781851ff442" + }, + { + "path": "reel-produktionsbasis/Vorlagen/studio-wiederhergestellt.png", + "bytes": 96246, + "sha256": "53f2a5cb50e3cd6db961d2d63956e982b33bd1b383003e7e6f296c2d3c8dd3cf" + }, + { + "path": "reel-produktionsbasis/Vorlagen/vorschau-standard.png", + "bytes": 93813, + "sha256": "03fe431cb174c0d2aea0444205c5b475bfd1719a97482a145ae0d9b869d02284" + }, + { + "path": "reel-produktionsbasis/hyperframes.json", + "bytes": 318, + "sha256": "53dbce1e19aa713cbb12ee0bc4d206143b45ab15e6ffbfcaa8f69572d4d24d50" + }, + { + "path": "reel-produktionsbasis/index.html", + "bytes": 879, + "sha256": "84c2946825d3126bdc8b4e0ab8d2ce13121feb69676ca0e1b6253a57019167da" + }, + { + "path": "reel-produktionsbasis/meta.json", + "bytes": 114, + "sha256": "66957f32670fac1afb72c79a3626fc1c93c804b3e5e0b0d68d4abdff4f0601b0" + }, + { + "path": "reel-produktionsbasis/package.json", + "bytes": 681, + "sha256": "259614161939c362858cad5d79344891a688c702147733b5c268e4a22fc4b4e8" + }, + { + "path": "reel-produktionsbasis/regeln/VORLAGEN.md", + "bytes": 12111, + "sha256": "6d0fc0422a54ae6068cd4f79d11c69647ba20552efe45eb271e644dfe244b9b4" + }, + { + "path": "schnitt-und-captions/README.md", + "bytes": 5798, + "sha256": "d1579cf9baa4356a422362be036de16bc22a07427657562eecc7b8e8020aa677" + }, + { + "path": "script-anpassungen/HOOK-INSPIRATION.md", + "bytes": 157990, + "sha256": "b0c3dbbee4dd6e70c9b4e014b0ebe049f5b2edf842a2d36e050e0e285dee0f2e" + }, + { + "path": "script-anpassungen/README.md", + "bytes": 25437, + "sha256": "01affa1ad839242da87ae2b66ce1c3fc6570b3d5ab5b1d8004e9295302e8baf6" + }, + { + "path": "werkzeuge/README.md", + "bytes": 657, + "sha256": "7501ca0558fbaf6b9def599d3ba76d90be805f323b14da8c85f8b4cd4830e862" + }, + { + "path": "werkzeuge/zonen-editor/assets/OFL.txt", + "bytes": 4392, + "sha256": "255d5debbb80eb2ea762644311f266a279e8778f00156655a516e2b7781a63e1" + }, + { + "path": "werkzeuge/zonen-editor/assets/captions-reference.png", + "bytes": 8633232, + "sha256": "42cd9a9c0ee3f069e8aa0232ee4388db95fce6a2a5cf7196cdaee727f1f82138" + }, + { + "path": "werkzeuge/zonen-editor/assets/hivegrid-icon.svg", + "bytes": 532, + "sha256": "a872e066c45f26ce245c92ac0eca561d27ee14738fdcaa3b634560c7c5e03e92" + }, + { + "path": "werkzeuge/zonen-editor/assets/hivegrid-noah.webp", + "bytes": 112668, + "sha256": "7612c5320ec6e2ee000b9bfb3f20f13bd3da9b1bf7e25a31efd742183deaab5d" + }, + { + "path": "werkzeuge/zonen-editor/assets/lilita-one.ttf", + "bytes": 26332, + "sha256": "26ad0d77404141ff7af714353cdf23c980841829dd270fc26e6c2dfcf654bd6d" + }, + { + "path": "werkzeuge/zonen-editor/assets/title-reference.png", + "bytes": 8133973, + "sha256": "71509b26aab2e9c9b66437197c7ed71613856d33e7768a9ff6817ee6b8306413" + }, + { + "path": "werkzeuge/zonen-editor/check-editor.js", + "bytes": 24975, + "sha256": "16fb4c8d279eafdafd623ab7953bcb19c2156eba9b1343ad9011b2191578d4f5" + }, + { + "path": "werkzeuge/zonen-editor/editor.js", + "bytes": 11600, + "sha256": "5d7647d541339d59813b21e50a4c301dbdf059da512a55c4148eaf1137a95b21" + }, + { + "path": "werkzeuge/zonen-editor/index.html", + "bytes": 14134, + "sha256": "2d3dfcd110250470324258eba1848115e8acd719e5a6099181b0dd3d8e670c5d" + }, + { + "path": "werkzeuge/zonen-editor/measurements.js", + "bytes": 4818, + "sha256": "3791da4d71af0ae7200b104d7d43795811495c007c2ccc5a50858cb0bdc3e028" + }, + { + "path": "werkzeuge/zonen-editor/vorschau-b-roll.png", + "bytes": 33936, + "sha256": "74025817ca4cd2d80f2421613773db33745c56cdc86131e294c372c6e7c84193" + }, + { + "path": "werkzeuge/zonen-editor/vorschau-mit-animation.png", + "bytes": 38007, + "sha256": "27ae36ff182a49dcfb26754ef00d7139eef6aea862eab4414eb4d4e639fcf060" + }, + { + "path": "werkzeuge/zonen-editor/vorschau-nur-animation.png", + "bytes": 36672, + "sha256": "179b1ad079d41d4e116814ad92971c00a465386d3dad84c2431c42fbbc2ee084" + }, + { + "path": "werkzeuge/zonen-editor/vorschau-standard.png", + "bytes": 37928, + "sha256": "709a531e10bcb0bb5477f7d5e13ee6bffaded25084526abd8069e1ee3f39a961" + }, + { + "path": "werkzeuge/zonen-editor/vorschau.png", + "bytes": 33936, + "sha256": "74025817ca4cd2d80f2421613773db33745c56cdc86131e294c372c6e7c84193" + }, + { + "path": "werkzeuge/zonen-editor/zones.css", + "bytes": 9251, + "sha256": "9c8687987eb28be4600bb0516358a79d8968422c05e3d99dacf7659cc8feaa44" + } + ] +} diff --git a/produktionsvorgaben/README.md b/produktionsvorgaben/README.md new file mode 100644 index 0000000..843d7a1 --- /dev/null +++ b/produktionsvorgaben/README.md @@ -0,0 +1,62 @@ +# Produktionsvorgaben für Noahs Reels + +**Übergabestand 04.10.2026 · Revision 02.** Dieses Paket enthält die freigegebenen Anweisungen, Beispiele, Vorlagen, Gestaltungswerte und ausgewählten Animationsquellen. Es kann als Ganzes an Noah oder den ausführenden Kollegen weitergegeben werden. **Zum Lesen der Anleitungen und Ansehen der Bilder ist kein lokaler Server nötig.** Die vollständige Testgalerie ist nicht enthalten. + +## Damit anfangen + +1. Für jedes Reel die [Projektvorlage mit Dokumentationsstandard](reel-dokumentation/README.md) kopieren. Rohdaten, Transkripte, Entscheidungen und A/B/C-Vergleich werden während der gesamten Produktion mitgeführt und mit den finalen Videos übergeben. +2. [Produktionsablauf](planung/WORKFLOW.md) lesen: Wer erstellt was und welche Referenz wird weitergereicht? +3. Für Aufnahme und Script: [Aufnahmehinweise](aufnahme/README.md) und [Script mit Hook und CTA](script-anpassungen/README.md). +4. Für die Umsetzung: [Layoutkern](reel-produktionsbasis/KERN.md), [Animationsvorgaben](animationen/README.md) und [Gestaltung](gestaltung/README.md). +5. Das fertige Outro direkt verwenden: [E120-Alpha.mov](gestaltung/outro-e120/E120-Alpha.mov) mit [Schnittanleitung](gestaltung/outro-e120/README.md). + +## Die Pipeline + +**Script und Hook ↔ visuelle Planung → Cut und Captions in Chatcut → Abgleich mit dem tatsächlichen Cut → Animationen in HyperFrames → Zusammenfügen in Chatcut.** + +Bereits vor dem Schnitt wird entschieden, welche Bereichsvorlage wann eingesetzt wird. Nach dem Cut werden die Animationseinsätze mit den tatsächlichen Zeitpunkten, Bildbereichen und Captions abgeglichen. Das eigentliche Video wird nie in HyperFrames importiert. Dort entstehen ausschließlich die Animationen, in drei zusammenhängenden Fassungen zur Auswahl. „Durchgehend“ verlangt keine dauernde Animation. + +## Die wichtigsten Vorgaben + +- **Script:** Hook-Versprechen einlösen. Bei Kommentar-CTAs das Keyword deutlich sprechen und als länger lesbare Sonder-Einblendung zeigen. Roter Faden, natürliche Sprache und hilfreiche Visualisierung bleiben Guidelines; Hook- und CTA-Muster sind optional. +- **Aufnahme:** Normale Sprechvideos auf Augenhöhe filmen. Augen im Bild möglichst schon auf der Linie der Standardvorlage positionieren. +- **Animationen:** Einen zusammenhängenden Erklärgedanken aufbauen. Relevante Aufzählungspunkte passend zur gesprochenen Stelle ergänzen. Kleine Zusatzanimationen im Zweifel weglassen; das Kernthema nur animieren, wenn das hilft. +- **Vorlagen:** Standard, Mit Animation, Nur Animation und B-Roll nach Erklärbedarf wählen. Kurze Reels möglichst in einem, höchstens zwei geöffneten Animationsabschnitten bündeln; starke Orientierung mit den dokumentierten Ausnahmen, keine harte Grenze. +- **Bildaufteilung:** Gespeicherte Bereiche und Untertitelposition berücksichtigen. Wichtige Inhalte außerhalb von Rot halten; Hilfsflächen bleiben aus der Ausgabe heraus. Arbeitsfläche 2160 × 3840, vorgesehenes Gesamtvideo 1080 × 1920. + +## Festgelegte Gestaltung + +| Bestandteil | Auswahl | +| --- | --- | +| Palette | Kühl: Text `#0f172a`, Fläche `#ffffff`, Hintergrund `#f1f5f9`, Akzent `#4f46e5`, Erfolg `#15803d`, Fehler `#dc2626` | +| Schrift und Maße | Inter, vorhandene Abstands-/Schriftskala; Karten, Buttons und Eingabefelder jeweils 8 px Rundung im 640 × 400 Maßbezug, proportional skalieren | +| Icons | Doodle 03 von Khushmeen; 12 Motive samt Quellen/Lizenz enthalten | +| Cursor | 03 Kleine Korrektur (`correction`), Apple-Original-PDF-Darstellung mit passenden Hotspots und kontextabhängigen Formen | +| Animationsquellen | 28 ausgewählte Originalbausteine und 390 Motion-Varianten als Quellreferenz | +| Outro | E120, 7 Sekunden, 4K, 30 fps, Alpha-MOV mit transparentem Anfang und weißem Übergang | + +Palette, Icons und Tokens sind für diese Übergabe vorvalidiert und dürfen später auf ausdrücklichen Auftrag geändert werden. Cursor 03 ist dauerhaft festgelegt; E120 ist final ausgewählt. Die Markenfarben des Logos und der gelbe E120-Marker bleiben erhalten. [Vollständige Werte und Beispiele](gestaltung/README.md) · [Tokens als JSON](gestaltung/tokens.json) · [Tokens als CSS](gestaltung/tokens.css). + +## Ordnerübersicht + +| Ordner | Zuständigkeit | +| --- | --- | +| [script-anpassungen](script-anpassungen/README.md) | Script-Regeln, Guidelines, Hook-/CTA-Beispiele und 896 Hook-Inspirationen mit Quelllinks | +| [aufnahme](aufnahme/README.md) | Die zwei Kamera-Hinweise für Noah | +| [reel-dokumentation](reel-dokumentation/README.md) | Verbindliche Ordnerstruktur pro Reel, vollständige Transkripte, Entscheidungsprotokoll, A/B/C-Vergleich und finale Übergabe; kopierbare MD-Vorlagen | +| [planung](planung/WORKFLOW.md) | Pipeline, Abschnittsplanung und Übergabeangaben | +| [schnitt-und-captions](schnitt-und-captions/README.md) | Titel, Untertitel und Verweise auf Cut-/CTA-Regeln | +| [animationen](animationen/README.md) | Erkläranimationen, drei Gesamtfassungen und Konzentration auf das Kernthema | +| [reel-produktionsbasis](reel-produktionsbasis/KERN.md) | Vier Bereichsvorlagen mit JSON-Maßen, technischen Gerüsten und Checkliste | +| [gestaltung](gestaltung/README.md) | Farben, Tokens, Doodle, Cursor, ausgewählte Quellen und E120 samt fertiger MOV-Datei | +| [werkzeuge](werkzeuge/README.md) | Optionaler Zonen-Editor zur Layoutarbeit; keine automatische Synchronisierung mit den Produktionsmaßen | + +## Verwendung der Dateien + +Regeln, Guidelines und optionale Inspirationen behalten ihre jeweilige Verbindlichkeit. Beispiele und Platzhalter sind keine bestätigten Fakten über Noah oder HiveGrid. Die genauen Inhalte der drei Fassungen richten sich nach dem Script und dem bereits vorhandenen Cut. + +Die Library-Quellen sind Material zur Umsetzung, keine separat startbare Galerie. React-Komponenten müssen gegebenenfalls in eine zeitgesteuerte HyperFrames-Animation übertragen werden; die vorhandenen Quellbeispiele sind nicht automatisch fertige 4K-Exports. Für das Lesen und die Auswahl anhand der Quellen ist keine Installation nötig. Die HyperFrames-Projekte können bei Bedarf mit den in ihren READMEs genannten Werkzeugen bearbeitet werden. + +**E120 in Chatcut:** MOV über das eigene Video legen. Die Hintergrundunschärfe am echten Video in Chatcut erzeugen; die Alpha-Datei kann eine andere Spur nicht weichzeichnen. Das Video bis zur vollständigen weißen Abdeckung bei etwa 2,233 Sekunden unterlegen. Die Datei wurde auf Alpha und Shake geprüft; den tatsächlichen Chatcut-Import am Zielsystem noch prüfen. + +[Freigaben und Quellenkontext](FREIGABEN.md) · [Agent-Anweisungen](AGENTS.md) · [Übergabeprüfung](UEBERGABE.md). Die private Entwicklungs- und Testhistorie wird für die Nutzung dieses Pakets nicht benötigt. diff --git a/produktionsvorgaben/UEBERGABE.md b/produktionsvorgaben/UEBERGABE.md new file mode 100644 index 0000000..7878fb6 --- /dev/null +++ b/produktionsvorgaben/UEBERGABE.md @@ -0,0 +1,24 @@ +# Prüfung des Übergabepakets + +Stand 04.10.2026 · Revision 02. Das Gesamtpaket bündelt die freigegebenen Script-, Aufnahme-, Planungs-, Schnitt-, Animations- und Gestaltungsunterlagen. Es ist zum Weitergeben vorbereitet; es enthält kein geschnittenes Kundenvideo. + +Die [Reel-Dokumentation](reel-dokumentation/README.md) enthält ab Revision 02 einen verbindlichen Ablagestandard und leere, kopierbare Markdown-Vorlagen. Es wurden keine realen Rohaufnahmen transkribiert oder Reel-Fassungen produziert. Die Prüfzeilen der Vorlage sind ausdrücklich offen. + +## Für diese Zusammenstellung geprüft + +- Die ausgewählten Gestaltungswerte wurden mit dem Nutzerauftrag im Chat „Remotion und Hyperframes vergleichen“ und den dort gespeicherten Dateien abgeglichen. +- Die eigenen Anleitungsdateien verwenden lokale Verweise innerhalb des Pakets. Ein Zugriff auf die private Obsidian-Datenbank oder die Entwicklungsgalerie ist nicht erforderlich. Öffentliche Quellenlinks benötigen gegebenenfalls Internet. +- Alle 28 ausgewählten Originalbausteine sind über ihren lokalen Quellindex auffindbar. Die 390 Motion-Varianten und ihre Stile sowie Doodle-Icons, Cursorformen, Hotspots, Schriften und Herkunfts-/Lizenzangaben liegen bei. +- Die ausgewählten Motion-Quellen, Medien und der fertige E120-Export wurden gegenüber dem vorhandenen Übergabestand unverändert erhalten. Geändert wurden Zusammenstellung, Dokumentation, portable Pfadindizes und die direkte CSS-Bereitstellung der vorhandenen Tokens. +- Vorlagen- und Editor-Dateien sind enthalten. Die Generatorabhängigkeit zum Zonen-Editor liegt innerhalb des Pakets. +- Paketmanifest und ZIP werden auf Vollständigkeit und Prüfsummen kontrolliert. Caches, node_modules, Testgalerie und private Entwicklungshistorie sind ausgeschlossen. + +Unveränderte Upstream-Quellen können historische Galeriepfade oder Verweise auf ihr Ursprungsrepository enthalten. Diese Quellen sind keine eigene startbare Anwendung; die maßgeblichen lokalen Einstiegspfade stehen in den Auswahlindizes und Anleitungen. + +## Vorhandene Prüfung des E120-Exports + +Der vorherige Export wurde als ProRes 4444 mit Alpha, 2160 × 3840, 30 fps, 210 Frames und 7 Sekunden dokumentiert. Transparenter Anfang, weißer Übergang und Shake sind im [Gestaltungsprüfbericht](gestaltung/PRUEFUNG.md) mit Messdateien belegt. Für das Zusammenstellen dieses Pakets wurde kein neuer Render erzeugt. + +Der Chatcut-Import und die Farbinterpretation auf Noahs Zielsystem sind weiterhin praktisch zu prüfen. Die Unschärfe des echten Hintergrundvideos muss in Chatcut angewendet werden; siehe [E120-Anleitung](gestaltung/outro-e120/README.md). Für die leeren HyperFrames-Grundvorlagen gelten die dokumentierten technischen Startwerte und der vorhandene Prüfhinweis in ihrer README. + +[Zur Übersicht](README.md) · [Dateimanifest](MANIFEST.json) diff --git a/produktionsvorgaben/animationen/README.md b/produktionsvorgaben/animationen/README.md new file mode 100644 index 0000000..7a9b3e1 --- /dev/null +++ b/produktionsvorgaben/animationen/README.md @@ -0,0 +1,59 @@ +# Vorgaben für Erkläranimationen + +Hier stehen die freigegebenen Animationsguidelines und die Vorgabe zu drei zusammenhängenden Fassungen. Das eigentliche Video bleibt außerhalb von HyperFrames. Der aktuelle vorvalidierte Stand von Library, Tokens und Farben sowie Cursor 03 und E120 stehen unter [Gestaltung](../gestaltung/README.md). + +## AN01 · Zusammenhängende Erkläranimationen · freigegebene Guideline + +**Status: Vom Nutzer am 04.10.2026 als Guideline bestätigt (D250); ersetzt den offenen Guideline-Status aus D249. Keine harte Regel.** G04 und die bestehenden Vorlagenregeln gelten weiter: Animationen sollen beim Verständnis helfen; nicht jeder Abschnitt braucht eine. + +**Animationen begleiten einen zusammenhängenden Erklärgedanken. Einzelne Begriffe werden gezielt zur gesprochenen Stelle ergänzt, wenn sie diese Erklärung aufbauen oder verständlicher machen.** Captions begleiten weiterhin die Sprache; separate Erkläranimationen brauchen einen inhaltlichen Zweck. Daraus folgen weder eine Animationsquote noch feste Szenenlängen oder eine Pflicht zu schnellem Schnitt. + +- **Positiv, erfundenes Beispiel:** Bei „Fotos, Maße und Ansprechpartner“ erscheinen die drei Begriffe jeweils zur tatsächlichen Nennung als Bestandteile einer gemeinsamen Auftragsübersicht. Diese Übersicht bleibt für die folgende Erklärung bestehen und wird weiterentwickelt. +- **Negativ:** Zu jedem gesprochenen Wort ein neues Symbol, eine neue Szene oder einen Zoom starten, obwohl weiterhin derselbe Zusammenhang erklärt wird. +- **Unterschied:** Punktgenaue Einblendungen können einen zusammenhängenden Aufbau unterstützen; sie müssen nicht ständig neue Bilder oder Schnitte auslösen. Das Beispiel bestätigt keine Produktfunktion. + +Vorschlag für die Planungsfragen je Abschnitt: Was soll verstanden werden? Welche Bereichsvorlage passt? Hilft eine Animation und welche gemeinsame Darstellung erklärt den Zusammenhang? Was erscheint oder verändert sich bei welcher Aussage? Was bleibt währenddessen stehen? Nach dem Cut: Welche tatsächlichen Zeitpunkte und Caption-Flächen gelten dafür? + +**Nur zur Veranschaulichung, erfundene Zeitpunkte – keine festgelegte Vorlage oder Zeitregel:** + +| Beispielstelle im Cut | Erkläranimation | +| --- | --- | +| 00:08,0 · „Fotos“ | Erste beschriftete Karte in der gemeinsamen Übersicht einblenden | +| 00:08,8 · „Maße“ | Zweite Karte ergänzen; erste bleibt stehen | +| 00:09,6 · „Ansprechpartner“ | Dritte Karte ergänzen; alle drei bilden die Übersicht | +| 00:10–00:14 · Zusammenhang erklären | Dieselbe Übersicht weiterverwenden, beispielsweise zur gemeinsamen Übergabe bündeln; kein erzwungener Szenenwechsel | + +Für ein echtes Reel stammen die Zeitpunkte aus dem vorhandenen Cut. Die konkrete Captions-Animation wird durch AN01 nicht neu festgelegt. Die Planungsfragen und das Tabellenformat bleiben unverbindliche Hilfen; das tatsächliche Planungsformat ist noch offen. + +## Drei durchgehende Animationsfassungen · bestätigt (D252) + +**Für ein Reel mit Animationsbedarf drei durchgehende Animationsfassungen zur Auswahl vorbereiten.** Der Nutzer hat den Umfang am 04.10.2026 ausdrücklich geklärt: drei vollständige Alternativen der Animationen über das gesamte Reel, nicht drei isolierte Varianten jedes einzelnen Bausteins. In jeder Fassung bilden die geplanten Animationen einen zusammenhängenden Ablauf. + +Alle drei Fassungen beziehen sich auf denselben vorhandenen Chatcut-Cut und die dort verwendeten Bereichsvorlagen. Die jeweilige Gestaltung kann variieren, während Aussagen, tatsächliche Einsatzstellen und Caption-Flächen berücksichtigt werden. Auswahl beim abschließenden Zusammenfügen in Chatcut. Die drei Fassungen sind Animationsfassungen; das eigentliche Video bleibt außerhalb von HyperFrames. „Durchgehend“ beschreibt den Zusammenhang über das Reel, keine Pflicht zu lückenloser Animation. Abschnitte ohne Animationsbedarf bleiben ohne Erkläranimation; keine künstlichen Varianten für ein Reel ohne Animationsbedarf erzeugen. + +- **Positiv, erfundenes Beispiel:** Fassung A führt eine Kartenübersicht über alle geplanten Erklärabschnitte fort, B verwendet einen zusammenhängenden Ablauf, C eine räumliche Zuordnung. Jede Fassung passt zum selben Cut und erklärt dieselben Aussagen, mit den vorgesehenen Pausen. +- **Negativ:** Nur für eine einzelne Grafik drei Varianten liefern und die übrigen geplanten Animationen ohne Zuordnung zu den Gesamtfassungen lassen; oder das ganze Reel ohne Pausen animieren, um „durchgehend“ zu erfüllen. +- **Unterschied:** Zur Auswahl stehen drei zusammenhängende Animationslösungen für das gesamte Reel. Das ist die Produktionsvorgabe für spätere konkrete Reels, kein Auftrag, jetzt ohne Material Animationen zu bauen. Dateiformat und technische Zusammenstellung bleiben offen. + +## AN02 Kernthema erklären und Zusatzanimationen im Zweifel weglassen + +**Freigegebene Guideline (D256), keine Animationspflicht.** + +**Animationen vorrangig für die Erklärung des im Hook angekündigten Kernthemas einsetzen. Kleine Zusatzanimationen im Zweifel weglassen. Ist der Inhalt ohne Animation bereits verständlich, darf der Abschnitt vollständig ohne Erkläranimation bleiben.** + +Grenze: „kurz“ ist kein Ausschlusskriterium an sich. Ein kurzer Aufbau, eine gezielte Hervorhebung oder ein eingeblendeter Aufzählungspunkt kann die Kernerklärung tragen und bleibt mit AN01 vereinbar. Das Hook-Versprechen betrifft den Inhalt, keine Pflicht zur Animation. Captions und die freigegebene Kommentar-Keyword-Einblendung R02 sind davon unabhängig. + +- **Positiv, erfundenes Beispiel:** Ein Reel kündigt eine bessere Auftragsübergabe an. Kleine dekorative Einblendungen in der Vorrede entfallen; eine gemeinsame Übersicht erklärt die wesentlichen Bestandteile. Wenn die Erklärung ohne zusätzliche Grafik auskommt, entfällt auch diese. +- **Negativ:** Jeden Nebensatz mit einem kurzen Effekt versehen, obwohl er nichts erklärt; oder hilfreiche Aufzählungspunkte allein wegen ihrer kurzen Einblendung streichen. +- **Unterschied:** Der Beitrag zur Kernaussage entscheidet, nicht die Dauer allein. Keine feste Animationsquote oder Mindestlänge. + + +## Vorlagenwechsel + +Die starke Guideline zum Bündeln kurzer Reels sowie die übrigen Wechselregeln stehen in den [Vorlagenregeln](../reel-produktionsbasis/regeln/VORLAGEN.md). + +[Zur Übersicht](../README.md) · [Zum Produktionsablauf](../planung/WORKFLOW.md) + +## Nachvollziehbare Produktion (D262) + +Für jedes Reel den [Dokumentationsstandard](../reel-dokumentation/README.md) mit kopierbarer Ordnerstruktur verwenden. Eingangsdateien, vollständige Roh-/Cut-Transkripte, Planstände, fachliche Entscheidungen mit Gründen, Schnitt-/Captionänderungen und A/B/C-Revisionen während der Arbeit mitführen. Alle drei Gesamtfassungen vergleichbar dokumentieren und den vollständigen Reel-Ordner samt Markdown-Nachweisen und benötigten Quellen mit den finalen Videos ausliefern. diff --git a/produktionsvorgaben/aufnahme/README.md b/produktionsvorgaben/aufnahme/README.md new file mode 100644 index 0000000..c196010 --- /dev/null +++ b/produktionsvorgaben/aufnahme/README.md @@ -0,0 +1,17 @@ +# Aufnahmehinweise für Noah + +**Vom Nutzer freigegeben am 04.10.2026 (D256).** Gilt für normale, ruhige Personenaufnahmen; die bisherigen Möglichkeiten für bewegte Aufnahmen und B-Roll bleiben bestehen. Kamerawinkel und Augenposition im Bild sind zwei verschiedene Einstellungen. + +1. **Kamerawinkel – klare Vorgabe:** Die Kamera mit dem Objektiv ungefähr auf Augenhöhe ausrichten. Nicht von oben herab und nicht von unten nach oben filmen. + - **Positiv, illustrativ:** Noah spricht frontal in eine Kamera auf Augenhöhe. + - **Negativ, illustrativ:** Die Kamera steht deutlich unter oder über den Augen und filmt entsprechend schräg nach oben oder unten. + - **Unterschied:** Die Perspektive bleibt auf Augenhöhe; eine passende Augenposition im Bild allein korrigiert keinen schrägen Kamerawinkel. +2. **Bildaufteilung – empfohlene Guideline:** Den Bildausschnitt möglichst schon bei der Aufnahme so wählen, dass die Augen auf der Augenlinie der Standardvorlage liegen. Nach Einschätzung des Nutzers ist Standard häufig am längsten sichtbar; eine passende Aufnahme soll den späteren Aufwand für die Bildausrichtung reduzieren. + - **Positiv, illustrativ:** Die Augen liegen ungefähr auf der Augenlinie der [Standardvorlage](../reel-produktionsbasis/Vorlagen/standard/README.md), knapp oberhalb der Bildmitte. + - **Negativ, illustrativ:** Die Augen liegen deutlich höher oder tiefer, sodass das Bild für Standard erst stärker verschoben oder zugeschnitten werden muss. + - **Unterschied:** Das Material passt bereits besser zur häufig verwendeten Vorlage. „Möglichst“ ist keine pixelgenaue Aufnahmepflicht und keine feste Quote für die Verwendung von Standard. + +Maßreferenz für Agents: Augen-Mittellinie der Standardvorlage Y = 1775,54 px bei 3840 px Bildhöhe, also rund 46,2 % von oben. Diese Angabe erklärt die bereits vorhandene Vorlage; sie verändert ihre Geometrie nicht. Maßgeblich bleiben [Beschreibung](../reel-produktionsbasis/Vorlagen/standard/README.md) und [Bereichsdaten](../reel-produktionsbasis/Vorlagen/standard/bereiche.json). + + +[Zur Übersicht](../README.md) · [Zum Produktionsablauf](../planung/WORKFLOW.md) diff --git a/produktionsvorgaben/gestaltung/PRUEFUNG.md b/produktionsvorgaben/gestaltung/PRUEFUNG.md new file mode 100644 index 0000000..19ab870 --- /dev/null +++ b/produktionsvorgaben/gestaltung/PRUEFUNG.md @@ -0,0 +1,12 @@ +# Übergabeprüfung · 04.10.2026 + +Einstieg: [Gestaltungsstand](README.md), [Werte als JSON](tokens.json), [E120-Schnittanleitung](outro-e120/README.md). + +- Galerie-Build sowie Design- und Cursor-Modellchecks erfolgreich. Browser zeigt Kühl und „Übergabestandard laden“, Cursor 03 als festen Standard sowie Doodle im Iconvergleich. +- E120 ist als ProRes 4444 MOV mit Alpha exportiert: 2160 × 3840, 30 fps, 210 Frames, 7 Sekunden, stumm. Dateigröße 75.019.080 Byte. +- Decodierte Alpha-Werte geprüft: Anfang transparent, animiertes G sichtbar, weiße Hexagonfläche baut sich auf; ab ca. 2,233 Sekunden vollständig deckend. [Messwerte](outro-e120/alpha-pruefung.json). +- Leichter Shake im tatsächlichen Render vorhanden: G-Oberkante bewegt sich zwischen Frames 49–55 über 16 Pixel. [Messwerte](outro-e120/shake-pruefung.json). Logo-/Text-Timeline identisch zur ausgewählten E120-Quelle. +- HyperFrames 0.8.123: keine Fehler in Laufzeit, Motion oder Kontrast. Bestehende Warnungen zu negativem Marker-z-index, verschachtelter Struktur und überstehenden Logo-/Textfenstern geprüft; Marker und finale Schrift sichtbar. Kein Umbau der freigegebenen Choreografie. +- Chatcut-Import und Farbinterpretation am Zielsystem noch prüfen. Die Unschärfe am echten Hintergrundvideo wird dort angewendet; sie ist kein Effekt einer transparenten MOV-Datei auf andere Spuren. + +Das Gestaltungspaket enthält editierbare E120-Quellen, lokale Assets mit vorhandenen Herkunfts-/Lizenzangaben sowie Library-Quellreferenzen. Die Quellreferenz ist keine separat startbare Vergleichsgalerie. Script, Schnitt- und Vorlagenregeln stehen weiterhin eine Ebene höher in den Produktionsvorgaben. diff --git a/produktionsvorgaben/gestaltung/README.md b/produktionsvorgaben/gestaltung/README.md new file mode 100644 index 0000000..ede23c6 --- /dev/null +++ b/produktionsvorgaben/gestaltung/README.md @@ -0,0 +1,41 @@ +# Gestaltung · freigegebener Übergabestand + +**D258–D260 · 04.10.2026:** Die gemeinsame Library mit Originalbausteinen und Motion-Varianten verwendet vorerst **Kühl**, **Doodle · Khushmeen (03)** und die aktuellen Rundungen. Diese Gestaltung ist zur jetzigen Übergabe vorvalidiert und darf später auf Nutzerauftrag geändert werden. **Cursor 03 · Kleine Korrektur ist dauerhaft ausgewählt. E120 ist das finale HiveGrid-Outro.** + +Zum Ansehen ohne Installation: [Bild des freigegebenen Stands](uebergabestand.png), [Doodle-Icons](doodle/README.md), [Cursorformen](cursor/README.md) und [Outro-Vorschau](outro-e120/Vorschau.png). Die Anleitungen und Bilder benötigen keinen lokalen Server. + +## Gespeicherte Werte + +| Rolle | Wert | +| --- | --- | +| Text | `#0f172a` | +| Fläche | `#ffffff` | +| Neutral / Hintergrund | `#f1f5f9` | +| Akzent | `#4f46e5` (Indigo) | +| Erfolg / Fehler | `#15803d` / `#dc2626` | +| Karten / Buttons / Eingabefelder | jeweils 8 px Radius | +| Iconpack | Doodle · Khushmeen, 12 lokal verfügbare Motive | + +Maßbezug der Library: 640 × 400 Vorschau. Die Werte sind beim Übertragen proportional zu skalieren; daraus keine 8-px-Vorgabe für ein unskaliertes 4K-Element ableiten. Vorhandene Schrift-, Abstands- und Größenwerte der Library bleiben erhalten (Inter, bestehende CSS-Skala). Spezialformen und fehlende Doodle-Motive behalten ihre vorhandene Geometrie bzw. Originalgrafik. Das goldene HiveGrid-Logo und der gelbe Textmarker im Outro bleiben wie in E120; das Kühl-Preset färbt die Marke nicht um. + +Maschinenlesbar: [tokens.json](tokens.json). Direkt nutzbare Variablen: [tokens.css](tokens.css); gezielte Zuordnung zu bestehenden Komponenten: [library-theme.css](library-theme.css). Diese Dateien enthalten den Übergabestand unabhängig vom bisherigen Browserspeicher. Im getrennten Entwicklungskatalog können weitere Varianten getestet werden; eine persönliche Browseränderung ist keine neue Freigabe. + +## Verwendbare Bausteine + +28 gemeinsame Originalbausteine ([Auswahl und lokale Quellen](library-quellen/auswahl.json)) und 390 Motion-Varianten ([scenes.ts](library-quellen/src/studies/scenes.ts)). Beispiele und Demo-Texte sind keine bestätigten Produktfunktionen. Der konkrete Inhalt wird nach Script und Planung erstellt. [Quellreferenz und Grenzen](library-quellen/README.md). + +Positiv, illustrativ: Für eine geplante Erklärung eine vorhandene Kartenbewegung übernehmen und mit Kühl, Doodle und den gemeinsamen Rundungen gestalten. Negativ: sämtliche 390 Beispiele oder deren erfundene Aussagen ins Reel übernehmen. Die Freigabe legt die Gestaltungsbasis fest, nicht den Inhalt jedes Videos. + +## Cursor + +**03 · Kleine Korrektur**, Kennung `correction`, bleibt der feste Standard. Die vorhandene Kurve, kleine Zielkorrektur und Ruhezeiten stehen unverändert in [motion.js](cursor/motion.js). `pointAt('correction', start, ziel, fortschritt, drag)` liefert die Bewegung; während Drag entfällt die Zielkorrektur. Die Vergleichsgalerie markiert diesen Standard unabhängig von weiteren Vormerkungen. + +Die bereits eingestellten Apple-Original-PDF-Grafiken bleiben Ausgangsdarstellung. [Maße und Hotspots](cursor/assets/apple/pdf/assets.json), [Apple-Herkunft](cursor/assets/apple/manifest.json), [Bewegungsquellen](cursor/assets/sources.json). Für den Einbau [Cursoranleitung](cursor/README.md) und [lokalen Assetindex](cursor/auswahl.json) verwenden; historische Pfade in Herkunftsmanifesten sind Galerie-URLs. + +Positiv: dieselbe freigegebene Bewegungscharakteristik verwenden, die offene Hand beim Greifen am identischen Hotspot schließen. Negativ: jedes Mal erneut einen anderen Cursorstil oder hektische Zufallsbewegungen erfinden. Der feste Standard betrifft die Bewegungsweise; das Timing einer konkreten Handlung wird weiterhin am geplanten Inhalt ausgerichtet. Alte Studien werden dadurch nicht pauschal neu choreografiert. + +## Outro + +[E120 · transparente Produktionsfassung und Schnittanleitung](outro-e120/README.md). Die Originalauswahl im Motion-Katalog bleibt unverändert; die Produktionskopie enthält kein B-Roll-Video. + +[Zur Übersicht](../README.md) diff --git a/produktionsvorgaben/gestaltung/cursor/README.md b/produktionsvorgaben/gestaltung/cursor/README.md new file mode 100644 index 0000000..9dd13ba --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/README.md @@ -0,0 +1,27 @@ +# Cursorstandard für Noahs Reels + +**Verbindliche Auswahl: 03 Kleine Korrektur, Kennung `correction`.** Die Grafik stammt aus dem vorhandenen Apple-Original-PDF-Set. Diese Auswahl ist dauerhaft freigegeben; weitere Cursorvarianten im Quellcode sind keine alternativen Produktionsstandards. + +## Aussehen und Zustände + +Schwarz-weiße Apple-Originalformen verwenden. [auswahl.json](auswahl.json) enthält die lokalen Bildpfade, Originalmaße und Hotspots. Beim Skalieren Bild und Hotspot gemeinsam skalieren, damit die Cursor-Spitze bzw. der Griffpunkt stabil bleibt. + +| Aktion | Cursorform | +| --- | --- | +| Freie Fläche | Pfeil | +| Textfeld | Textcursor | +| Klickbarer Button | Zeigehand | +| Ziehbare Datei | Offene Hand | +| Laufender Drag | Geschlossene Hand | + +Weitere Originalzustände für Kopieren, Verknüpfen und Nicht erlaubt liegen im selben Index. Es wird der Cursor innerhalb der Animation dargestellt, keine Betriebssystem-Einstellung geändert. + +## Bewegung + +Die freigegebenen Parameter stehen unverändert in [motion.js](motion.js). `pointAt('correction', start, ziel, fortschritt, drag)` liefert die Position. Leichte feste Wegvariation und kleine Zielkorrektur; beim Ziehen keine Zielkorrektur. Keine Cursorrotation oder Klick-Skalierung. Einsatzzeiten der tatsächlichen Handlung aus dem geschnittenen Video ableiten; die mitgelieferte Vergleichsszene ist keine verpflichtende Reel-Choreografie. + +**Positiv, illustrativ:** Eine Datei am selben Griffpunkt mit offener/geschlossener Hand ziehen und erst nach Ankunft bestätigen. **Negativ:** Beim Zustandswechsel den Griffpunkt springen lassen oder pro Szene einen anderen Cursorstil wählen. **Unterschied:** Aussehen und Bewegung bleiben konsistent und erklären die Handlung. + +[Apple-Herkunft](assets/apple/manifest.json) und [Bewegungsquellen](assets/sources.json) liegen bei. Historische Galerie-URLs in den Herkunftsmanifesten sind keine Paketpfade; für den Einbau den lokalen Index verwenden. Die Apple-Assets sind getrennt von den MIT-Bewegungsquellen dokumentiert. + +[Zur Gestaltung](../README.md) diff --git a/produktionsvorgaben/gestaltung/cursor/assets/README.md b/produktionsvorgaben/gestaltung/cursor/assets/README.md new file mode 100644 index 0000000..8fbcdf7 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/README.md @@ -0,0 +1,5 @@ +# Cursorquellen + +Verwendung und Auswahl: [Cursorstandard](../README.md). + +[Apple-Herkunft](apple/manifest.json), [Originalmaße](apple/pdf/assets.json) und [Bewegungsquellen](sources.json) dokumentieren den vorhandenen Quellstand. Die Pfade in diesen Herkunftsmanifesten beziehen sich teilweise auf die ursprüngliche Galerie. Zum Einbau [auswahl.json](../auswahl.json) mit paketrelativen Pfaden verwenden. Originaldateien und Lizenzhinweise bleiben erhalten. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/manifest.json b/produktionsvorgaben/gestaltung/cursor/assets/apple/manifest.json new file mode 100644 index 0000000..ae8b024 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/manifest.json @@ -0,0 +1,145 @@ +{ + "vendor": "Apple Inc.", + "source": "Local macOS system resources and AppKit NSCursor.image; no third-party cursor pack", + "os": "26.5.1", + "build": "25F80", + "exported": "2026-10-02", + "documentation": "https://developer.apple.com/documentation/appkit/nscursor", + "copyright": "Apple system graphics; not covered by the MIT licenses of the motion references", + "pdfSource": "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/HIServices.framework/Versions/A/Resources/cursors/", + "representations": { + "pdf": "Original PDF graphics rendered at 4x; arrow is AppKit in both sets", + "system": "NSCursor.image rendered at 4x; source may contain raster representations" + }, + "sizing": "Logical dimensions and original upper-left hotspots retained. UI size / 32 is the common scale for every state.", + "files": [ + { + "path": "pdf/arrow.png", + "sha256": "b904cc513b751af30e11c5a77de956f8dea5272e7561a1682accf41a9aba6405" + }, + { + "path": "pdf/assets.json", + "sha256": "8c26f81ab9a014e3da7b1237d36c70ccb1234f48178b5a6f9a56600cf853ed1e" + }, + { + "path": "pdf/blocked.png", + "sha256": "1564d261b64afe8d508726beae6a09a62481ef43cf61c8f9b774f4d17db10d2f" + }, + { + "path": "pdf/closedhand/cursor.pdf", + "sha256": "befc1b2ef454fb6b41f12b898248f21bd9ac8a6714e366e66f08b323b1cc4b1b" + }, + { + "path": "pdf/closedhand/info.plist", + "sha256": "58347d8cb7e1812b6866f1d7385ff8763dd51c87b2e8ebf419dd25b561a76ddf" + }, + { + "path": "pdf/copy/cursor.pdf", + "sha256": "1ef7c30920576e711fd6dabe3bab3a84f1b3a6b8a7ad6f34afc4cd3fc151d21c" + }, + { + "path": "pdf/copy/info.plist", + "sha256": "0f9c9ca325c816c120fd7793d4aeaf271dd5ddde9bda2363d3de79ff8e3a17c7" + }, + { + "path": "pdf/copy.png", + "sha256": "a19ea15711b2e959104b4edef5b03ccfe4f37902c6ad287482f4e348c9cb1a5f" + }, + { + "path": "pdf/grab.png", + "sha256": "a5ec4a8dca6c1bc363a69547ef9d687e7629f204a5d51a0aa45ca4572f8ea415" + }, + { + "path": "pdf/grabbing.png", + "sha256": "575c8d96eddc6ebcf256c0cfe5f2520e3909f9b69390865d3c7039b41c288822" + }, + { + "path": "pdf/ibeamhorizontal/cursor.pdf", + "sha256": "a95b6410df1b46fca7391f04582ebe5106c320154b20b1f73cca03250b22cbe0" + }, + { + "path": "pdf/ibeamhorizontal/info.plist", + "sha256": "58d94491038004332a354685c9a892c4367ba63ed70d78b8b4c4b210e7cda62c" + }, + { + "path": "pdf/link.png", + "sha256": "ee3348d4a9f7955f990429067382a5efd50b84ffc6123897a5d834fe41e2c6f7" + }, + { + "path": "pdf/makealias/cursor.pdf", + "sha256": "962abfa2d60820e61ada5f11ce1d2068a985f1b6b5617f7598451d41acba1a74" + }, + { + "path": "pdf/makealias/info.plist", + "sha256": "80d0198699feec20af95c052540d6133a5ad81f3f0257a32b2617305f9e71de0" + }, + { + "path": "pdf/notallowed/cursor.pdf", + "sha256": "b2d88f766bb3c594c8775d9e745bf04bcad91759da38d4efaaee6587a30896fa" + }, + { + "path": "pdf/notallowed/info.plist", + "sha256": "0f9c9ca325c816c120fd7793d4aeaf271dd5ddde9bda2363d3de79ff8e3a17c7" + }, + { + "path": "pdf/openhand/cursor.pdf", + "sha256": "9d512eecf0816fc92ee24ff3a1c15262b1e146355b98bdb9b1291a66be71838e" + }, + { + "path": "pdf/openhand/info.plist", + "sha256": "58347d8cb7e1812b6866f1d7385ff8763dd51c87b2e8ebf419dd25b561a76ddf" + }, + { + "path": "pdf/pointer.png", + "sha256": "3b7ae795139593c8e33812299032916eaf3845c0bfc06979c3aeb74ac9b31af3" + }, + { + "path": "pdf/pointinghand/cursor.pdf", + "sha256": "8ffe42f8a9e87b5743f2813fc5b5e5588018a581c3d70ae0884ab083fec10c2e" + }, + { + "path": "pdf/pointinghand/info.plist", + "sha256": "4007d782a9363a29dd308006684b8269fcdf4dbb7a2dadd8f88df2d70c64aa90" + }, + { + "path": "pdf/text.png", + "sha256": "2ff91499b6e81fdd1e5ddb8ec1e9e2f9f4c47da6252a260203e958a20b5541aa" + }, + { + "path": "system/arrow.png", + "sha256": "b904cc513b751af30e11c5a77de956f8dea5272e7561a1682accf41a9aba6405" + }, + { + "path": "system/assets.json", + "sha256": "74274894c675f3e83113587d79bb9e79fdcd38bba598295b4543a588d850d050" + }, + { + "path": "system/blocked.png", + "sha256": "fe93c367fd34f96510f3fb6bee28bb76e0fa4741f080a962339d59253c4823e8" + }, + { + "path": "system/copy.png", + "sha256": "687401e4eef4e745e73c053d12219024eed41bf3799cda8fe15741ec56503884" + }, + { + "path": "system/grab.png", + "sha256": "069a07822d0d555e5066d1e3a239becbed7cfe62e6f3ab6d9530a2776fffec09" + }, + { + "path": "system/grabbing.png", + "sha256": "6fe1e1a7ffa3355b21f580d5c0d697fe7f731ca99662bfd56db98743f00fb4ce" + }, + { + "path": "system/link.png", + "sha256": "c66f98240f69b2f976537b7cdc6343ef019b801d61f0483a4fea9e4d7e491f35" + }, + { + "path": "system/pointer.png", + "sha256": "d46f61ed1a4a3048bbb2b1a97696d157a096d3a6dff3f920f91fffba7bec888e" + }, + { + "path": "system/text.png", + "sha256": "76a7cbf31465510f56d5dff85bfcc9be7cbb62b5319375f74801d5f4cf8c0c36" + } + ] +} diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/arrow.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/arrow.png new file mode 100644 index 0000000..706a8e5 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/arrow.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/assets.json b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/assets.json new file mode 100644 index 0000000..e088d6e --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/assets.json @@ -0,0 +1,66 @@ +[ + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "arrow", + "path" : "\/cursors\/apple\/pdf\/arrow.png", + "width" : 28 + }, + { + "height" : 22, + "hotX" : 12, + "hotY" : 11, + "id" : "text", + "path" : "\/cursors\/apple\/pdf\/text.png", + "width" : 23 + }, + { + "height" : 32, + "hotX" : 13, + "hotY" : 8, + "id" : "pointer", + "path" : "\/cursors\/apple\/pdf\/pointer.png", + "width" : 32 + }, + { + "height" : 32, + "hotX" : 16, + "hotY" : 17, + "id" : "grab", + "path" : "\/cursors\/apple\/pdf\/grab.png", + "width" : 32 + }, + { + "height" : 32, + "hotX" : 16, + "hotY" : 17, + "id" : "grabbing", + "path" : "\/cursors\/apple\/pdf\/grabbing.png", + "width" : 32 + }, + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "copy", + "path" : "\/cursors\/apple\/pdf\/copy.png", + "width" : 28 + }, + { + "height" : 21, + "hotX" : 11, + "hotY" : 3, + "id" : "link", + "path" : "\/cursors\/apple\/pdf\/link.png", + "width" : 16 + }, + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "blocked", + "path" : "\/cursors\/apple\/pdf\/blocked.png", + "width" : 28 + } +] \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/blocked.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/blocked.png new file mode 100644 index 0000000..3382da6 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/blocked.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/cursor.pdf new file mode 100644 index 0000000..c11b98a --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/cursor.pdf @@ -0,0 +1,622 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 20 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + closedhand.cursor.solarium + + + Adobe Illustrator 29.3 (Macintosh) + 2025-02-20T09:18:17-08:00 + 2025-07-10T15:36:57-07:00 + 2025-07-10T15:36:57-07:00 + + + + 256 + 240 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FWLeYvzT/Lny3I0WteY7CzuErztjMrzinjDHyk/4XFWKN/zlF+RSsVPmcVBoaWWoEbe4t6Yqnugf nd+U2vyJFpnmixeaSgjhnc2sjE9AqXAiYn2AxVm4IYAg1B3BHQjFXYq8V/Nn/nKPyf5Knm0nSEGv +YIiUlhifjbQONqTTANVgeqJXwJU4q+ZPN3/ADkj+b3mZ3EmtyaVaNWlppdbRQD29RSZ2H+tIcVe c32pajfy+tfXU13L19SeRpGqad2JPbFVKC4uLeQS28rwyjo8bFWH0jfFWceV/wA8/wA1/LUiHTvM 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 KuxV2KuxV2KuxV2Kv//Z + + + + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + xmp.did:fe459cd0-450c-4751-b1ec-174c6fc3e7bc + uuid:b621eab4-ca2e-ff41-92db-2604c1bd054e + proof:pdf + + + + converted + from application/pdf to <unknown> + + + saved + xmp.iid:D07F11740720681191099C3B601C4548 + 2008-04-17T14:19:10+05:30 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/pdf to <unknown> + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FC7F117407206811B628E3BF27C8C41B + 2008-05-22T14:51:08-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FD7F117407206811B628E3BF27C8C41B + 2008-05-22T15:15:38-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 + 2008-05-28T17:07:17-07:00 + Adobe Illustrator CS4 + + + / + + + + + saved + xmp.iid:02801174072068119457EEAE3A61196F + 2010-02-08T20:57-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:fe459cd0-450c-4751-b1ec-174c6fc3e7bc + 2025-02-20T09:18:15-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + + uuid:c03e9693-7dd3-e64c-990d-7836fbbdc086 + xmp.did:F77F1174072068118DBBC5D7230B739B + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + Basic RGB + Adobe Illustrator + 1 + False + False + + 0.444444 + 0.444444 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>>>/Thumb 24 0 R/TrimBox[0.0 0.0 32.0 32.0]/Type/Page/PieceInfo<>>> endobj 22 0 obj <>stream +H‰LWKŽ%7Ü¿Sä^¶DI¤¸�¶áUc0˜Å 0Ó›²{î8"˜ù꡺«™Åo�ùíŸß�o?¾·ã¿|?>Ú1Œÿžøÿ×ÿ9þxôƒ?ý||ûíßíøùÿÇŸ€ ?xìçÀF?·µq|üþàãßÏ~Ú˜X> ï±8G‡ÄÓÏ´~|<žó´¶�~®q`�ÃlÞûx®sŽuŒszrßÂ�uLíó³Ç<Ö3ogK㾺kcqì³›Q`ø˜+JàÜp·Éw½Ç‘gk‹jDs‚Y +®mB~|Τò°  ëX[sñØ8có¶½�ÁŽMµF»!Ì�Óp«`êúè³îh=�Þξ‚sÇ"Z…V7¢mY÷ØÂÞ~6„£3‚¨C�ǸöÚ¹2ßÞ.›…Ñœ[¨).&™ X?}ëþÀ åƒ‘fˆ'NCó�æýÐ�ª˜ÞÍA`y�3�·wsé”Öô6CUÛ ×Mhòù†ù¨¹ìk¸ô‰‡2ŽþÀQúˉyCCÒÉ/ ~n°+oðñ€-3¿Þy9§àã_á(q݆‡»ßмµäFBšÃà S–"µ±®7¨\ÑÆµæ +ù°©C±ÊÎÉ‚hÑïp jý+L@Ûï"Ü~G× ÷-ôg_ïê0î”A>y~å2Ѳ’�ÕÖBÁîŽ}¹])êÚ¶¡6³ÊS=T!@*ƒ@±ÞZ£” `®kýñ@åLZß�Ÿ@S™2|âR¦["9 %Þ@X+P¤ÁÜXÁ{P¿}^hÁ{Ú‡Ò\P�ët�_…Ý7è‰Ä�!þ^¯ÚD¨�Á7ˉ0àìä±l®M͉&2ZÔnëþw7)ÈtžçÎ�‚ .ç`ÇbìÒ‚æÆÚÌÊx†dç!YÔÈ ï–G=ãL¾A mžéçãñ¿Ç¿µ5¿Q2 ØÀØûÎÉMrI ÉL\¬lSà\QE6²ï&ß¡c{ˆ¿{ÒM¾.ž3\²BB¯l3ùdÑÃV…œKá…Tæ“P™»³$z\Uk}k#Ñ—ºÓtνÌÚÖö€�6i•§ðÍ+�¤¯º¯<íxò¤ã6AÌRiˆ¡»˜Ä�â[—~[ä1ÊM&š8“ÒöŽLŸµ�iYžÝè<‹@§¹ª®—î‰47ÁgÙÅö×l2PF1”ݳ3q&´„ÑìÊ*ÍZ3}ÖZ¢px0óÊ]„y,åîB^"µ;ÓÍå¾AÖèÒqƒ\„«06oò¾Õ!“I;j×vÚ•�)ÎÎÇÄ`’¦è÷Ãi�:¸È¾€ÓøbupÛ×þWƒ¿ÑX:¾Ô©S™ÑM +¥®O§J¾CŠ…ˆ†C‰$—®]b>�¯Ùø`¡‚€^¸vWLê1¹&"gûÕ ñZ…±Ðe×ç4I6—-ƒyÖË`²£š“ÐJRS”�>SÄ9oÀ}c¿½Ó€yŸjn_Mñ®»@¸Ón%^ _°´ÿ|!cµ,Y‹ºE+V¾¥†Tl“眻¯òÉÄ_KŒÛ×àân‚~*vñÀRŸ‹L óRŒóÁ=w�ÃÛ[`nˆWrT¹²¦iyâ�)L¶¦WIˆçJB¦'w‘FBÅþI´™š±M£f 33Ø4g¬šª:ÑñôÁtðlšŸ¶]„¿tjêÝ�-gÕÏÅ™[seo^Ÿs^3�Ødo¿Û G–á`Ê1‹c>þ\ããÒLX“OŽK“vÏÃüV±š³Ìò"fuš•…郠iŒYã9�Ñ�ɉðÖœ®ŽK.àÕóêîŠ ›1èøNræ”Õè?–WºL¿!s�œÅ4o”OfÔ'NÒƒ&”¯Q�uh·N£ÈÞ¥Ó\×�½9;ç–Ñä×ð§úê¡s¬»ÑT“¾M5—[xÁã¾ SQì[ ÌuóM¿…Ô¼Uý4¿�ãË~¶�‚î¢�Ü2Ù�ìÆ£�!!•òœYÅu¥HlÐìgTDíª•R"/$¥ì· 5¯uÇÜë¬kŽ ysÞS¦pN˜Å/œÑÙ®Û]w/îÙœr u§V–5UØÖhRßM[C1j¯³ÁäN}mVÿacJµ±jY5(§ºh}@ö«Ùñ“Lm•½)5ÝçÅÍaõš3‹cîz·‹ÉPV„’&» w—‘»È†~ÊØõ�Àz·¼¶“�V¹Ê®Ï ~ÌëË+å-dÚeÓsèSÂYØU=Ÿ¶5Ùg¥–¢‰®òã¾—`,µ§®á’³²·ù X _°ÆaÒyê5Qÿúãû�?ÿÿÿÿ$ì9Ù endstream endobj 24 0 obj <>stream +8;Xp,*=*K!i"uFo!<<'!!!*'!!ru2R#\O~> endstream endobj 25 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.3.0 %%For: (Roxane Gataud) () %%Title: (cursor.pdf) %%CreationDate: 7/10/25 15:36 %%Canvassize: 16383 %%BoundingBox: 9 6 24 19 %%HiResBoundingBox: 9.58335858454939 6.216796875 23.0705075538517 18.80419921875 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 146 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 32 32 %AI3_TemplateBox: 15.5 16.5 15.5 16.5 %AI3_TileBox: -272 -340 304 394 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -1165.88142907538 544.069768334208 0.805668503310975 0 7985.08531813133 8205.0957336163 1698 986 26 0 0 6 59 1 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -1165.88142907538 544.069768334208 0.805668503310975 1698 986 26 0 0 6 59 1 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-596 -380 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 29 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXÔ1ê6ã&�D†ùïñ¥29h³oÍŒ¬¤Zÿ3ÚT%äå·gµ D +g +_žå÷³PsÜáÓý?µ€Ñšoû…ò»v”lÁpØrÜàÞ®úcºåÚŽ�ûu‚ëûvë7†W¨‡}ÿÏ�O.\»º{»¯{ÿ–[×çw›nù¿³Üøï,Ç-@F3ú虓}•ûRÉnæ~Ñ÷k“™–seMfZΖ+�Ýl¦þwFÁrèËYë¿_SÀÝ©Ÿ)ÍR\©à_‘çàz®ø×œÆñOûgÍõmߟ8~±–“Åe*®ïÏ—)¸Ç=Ós.»|Ëîø‰ãŸ‚þ�}Žïלú”KoÈ‘ô`êgÐOõ¬óR¼mXUÉ0ñ2¼?°òÜ©ŸEq¼S?Óý«äó£\öNýŒ¶d)†ßN¥6]Eqìvöµ*€’íÒ¶ìÖ·ŧÿk•<÷¿Z°�ÕŸvéÌ|�ù¬žã•½µ;ŸîÚÍÌÒ‡^üñ)û·Ï6¬Êî×ÌBÍ2+{³Þ-§'›ï×™YN.{¼.Íe#ȲÝ¿gÚ†c—×ñŒ +=˜~Á`÷ðAœ¬¿òŒúŸ°$;IÒ3È$í[†kºþæì¨¿ýkº$yÃ%»±{Ê4êÛnÍ»-ϰê×™€Ó­•ÑpŒÊêŸÊx·œ\Ï3úeý€o7þœ‹�Œøûþ¶}þøäÞõL X¿«\öø·{Üp Ÿ`Õó³*^Ù°ìŠ2QìÞóäh×0+࿲å–-_Æ[ó}ÏèJ{|–™7{YÚ0F¦¸å Xãø§wêgJ/\·¥ »exæÄî÷|ÙÁ2½Yš¦×E“P»ò ß(Ø‘}¥ soW5_y-…>ô· gP†â`X£çß÷�]Î+¯ýe\ôeï\ô¤vnz< »Íî99š!/}7ÇÞA04»IŽÏL>š&'½Ø=i†¤Ç1O?¸ã—›újÁ#K}õ˰LJ½#Ï(ãØ›ñƒ‚L“ñž�õ,!ãÙ%ãØ€QÆ1w”ñŒ�¡)’eÈÉMÓãÇ6ÿ1Ý‚?ÆÈ~Ëø2E¤d?“DW6ª�ŸÉ³|r˜#“˜ėÙ?pîú49çYç0‡½òêeŠo…zÍ ìSÔÿ­7YýU®ìj²W^U³ÑŒ÷ŽÙhiÃ>hiË8ﳑcX�–¶,Ä$†afÉvî»÷KAÃÊÒ,1Žb¥ +úЋ~ô¤/½éO�úÔ«~õ¬ç`=‚!(‚#H‚%h‚'ˆ‚X +ªà +® ò°‡>Ã0Ã1$Ã24Ã3DÃ4TÃ5dC.vÑ‹ Š¢8ФXЦxЍ˜Šª¸Š¬ÈÇ>úÇpÇq$Çr4ÇsDÇtTÇudGNvÒ“ ’")’#I’%i’'‰’)©’+É’¼ì¥/Á2,År,ɲ,Í;Õr-Ù’›Ýô&h†¦hŽ&i–¦iž&j¦¦j®&kò³ŸþÏðÏñ$Ïò4ÏóDÕs=Ù“£XG= +¢!*¢#J¢%j¢'Š¢)ª¢+Ê¢<í©OÁ4LÅtLÉ´LÍôLÑ4MÕtMÙ”«]õ*¨†ª¨Ž*©–*fª§Šª©ªª«Êª|í«_Á\ÃU\Ç•\ËÕ\Ï]ÓU]ו]9ÛYÏ‚lÈŠìÈ’lÉšìÉ¢lʪìʲ¬Š¢¨‰’¨ˆ‚hGÙS=ϳ<Ç3TMÔ4MÒ Mors-ÑÒ,1²K_òr%Sò$IRdÍ‘ì©xŠ¥8Š![‚)ˆ¡ ™zTì,v’!è{W±Ó,M4}9–"ÖM²DÏGqûØOÑ\Ãó'h¢£=zŽ"æù*®¥Š¡¤ ’=SÌË‘GpôëØÅÒ‡Xï©?ËЃޯ˜ØÃ•«çr°s.Á<ê;GÙUM1ô<Ïó4Oó,Ï’<Çs<ÅðOПýì'?Y“5Ws5US5S35Qó4O3Is4GS4C34AÓ›Ýä&7Ù’-×RMK´ã¦Peïo¹²â2Ç-øuëVF³ÞhˆŸLñiwõÉ^ù5Ó­9ý7üúdõe8µº]Îèþ²snv3µ+»ñgìWþ1š­À7êÓvýQðŠvkÇnz×ç]Ÿ«ÛåÈ›z¾áwÍdŽ}‚3\¦ÈäNÉ–l…º]¾ê]³xžAñ<ƒ²•ýªÑ¬þ÷í¢þmøüßµËiÙp<ŸZ>ôÿòÚªçÔW¹L‘ýÚ�Y »—)T2ŒrkPÆeŠõN›ìýÀõ|£¾ˆÃæ”l¡_sÝʰêsJ¥¦’á[†kŽ< ”è×ý?ª9žkζaö-ÿVkN_yÝ6ì£ñ8פ%/ÿûvcÖ‡½ûHš¦7¹7{çý…ë¶Dòld£)62¬‚ëÍW¹œ�àÃ"ñý¢Ò+¯üÛ•ëÇg‰ì–sú)fãè³±4³Ò{Ž}AR4¹'r_f ØÁ^vP,¹'–&™ñL$MÞA�‹å8мôxVr‚`9’æÈ½0³Inú°—¥'޽72LJE3Hþô¦Ä{zÇ­*(¥àÒ-ÿ[žÓ’ «>Z"»]ÿn¦õ(ïW<ÛßsU킺³w}–Äø¿³Æ´œÖ3Ç�]Ôç«j7S +½å¼a9Tÿøåá< ?w}~yÈ|8ÀM0 9˜ñldžô�½±g¢'ö»1Ýú f´YµÛ¢çZq Ï0¬úžŽg´õlÆ3‡­’áûþŸ¯r[–i97,s|•k‡J åܰ1왣þ§ÖKà�áZòÝröìv[õÌþfK¢åÜ0Ê�Ñ €9Ž?)soù«\M&»ÒÌa×s<§¶ýQs͹åßz¡fuÛ0‘,»7ÍòÒ+{Fv±E‘ä"'¹úL$ËÑ$Çî½13A3ÃR,E,EÏþ¸²m˜Ù³Ðgcff3ª’áW~Íè¶a` Ž=sü`ÛvÈnºmØ:Äž‰þãý#3Ç¿]UžaE꥽z¶ëŠË?¾aжa +.S¼/÷vÛìË®€ÙÃeŽzfAÏô™Cža»þ¢Ri9· ã^è3…‡«çÛ­oûÇ–,sÔóíþ:Ý6,ãØø§ù=޶Ú†õf� ·J¯1…ï¶Ckð©dRüvª—C�χ`!ðpb]ø—@ ß`í¨"ÕD#´Ã Ûèˆ$“ M@Ö™*%Xjö†eZ—D‘vJz>$lD2“ +æ°R¢#‚ÁÞ0¤,t¿)<_µCƒx¤öª¹Ù°•§5•nrG³}§ˆ—s |hØ�7Œà;ņJ 2ý¹P)½Žc¢˜Àuír ^¾6(Z¡!``1@¨U�ŠQzL„zÃ|ÃõŒ§T´!jWûüØ–— +í!X"é9‰êùã™Ã Cyfáð…� kK…ÀÅÔ$û±a* ñ¦ �°- Ž£•8¨åŽx9‚5#xÑÍ–Š‹GÔ²u�P1L|[:¯�½0ñÄ?iÎua`AhˆÌç$£¶ IBÙÄGGÒm#ÐTG/§ŒVÙì ƒ¸:%΄um–ƧŒ§ÕA½ˆÕñîƒ Ç:X@ÔQ†©6 +PIHe Í ºæØžP°a÷Y*EªÁÀâ4à.ƒVÒm˜Á8pšDŠIÆ#^N€¤"BiÇ„u½aí]p' •ˆ_ +âök…žâ ¸ m× Í=#*ß“êó2dÊQBÄSÏ¥…ø†‰è¥b ðHmN™Ç¤ô1MÑçfücÐÀ؆‹S°Àl˜ý®(¨KýÃKgZbQîªÜ0¸^h¸Hkš±c`‘¶«R°7¬óˆ—‹•ƒ YË•…¸d8… œx2|BÀ² V+ó7¬dÙŸƒJ½I(™!‘ÜOœ¼-Øé/‘ê¶åoû7Df6´ÑÇÚ6ìaR,G(ÅmÄòÕè‰l|Ës UlÁÞŒ(Ë Hëé\t’àå2F„¶a� g9M"^néÜ£B±»Ñ¬ÜCº8îŸØ°§fíÏc©äOØÒ¡F„z.úXr?m¦ +o`ú¤Û°�ÆéXÏÒ©™CÄË +&œbë¦W½aÜ'ü¸fƒzt#EX×v“:`ÜŠ’n"vob%ÚŸ·0Y Òìè6Ì>qœ¸ÅiXP }j%ݫ̀Þ+„ñEª‰Úñò„†6lþ +¸u!ùôX”^P«t~-´³±p’ ó8®C;¥Ï#^nN�£>R×é/¡×%ÚŸŒXpÛ À •Zžó#yœ¶| +)®šÖ|ö©€+åÊAÙ¼fÅ@cøGG3f<× I6LÀžÑôr´D;�B­‡P€ú*ÈʤÈÇaôVh1 Vhâ[bh+‚ˆ¡•)“BÛ°�‡ê´²Q64 ‚ˆ¡…um;£3T”æ,|͹!UÅò¶_ÁQ€êñ Ä¡h„ÅE!J7b6Lc{;ì(RMüx +P�N‹¢ÔIÀb ÔvöÐt}½•ä‘ s`L´3^‚—›¨„€ 5ðÒ�ÕT Ñþ<ú#J:ŽùxHB(aÅÐx£lh¢É§¡yüå4‰«í´ GÐi®íëzÃ2Ý@ï ¢ˆDÔêlÞÕiƒ‹ÕK܃êSÇ�æ @V-V¿a$ס€�›h7A³Áãlð(HcBS¨¯#L30VÎ4q”{‘Pƒ ‡À/ +ïT&~˜Y�o0Y�گ膑<²rÆ Y9ƒ®}B[\ƒ^‹¬¼  >Û ÍDb Ô�|P¯¦±r¸I]W"‘„gÍ‘ KÒi#óÒÐRÕi˜þ7m”øÚ†uA§�¬gh§ŽÜÐZ¶¯k;s—ÐÛê ª�5D>ïÃVé± +b8Ûª(<„åÚ^GRš/t©t`G̬ú—@ àG³`Ô�Œ¦[_hýÕ 3,FIWšDI7¹˜*ཚt�h‡žE#í00|¤§ÏYíàöøÅJ:ÍÌ€žÊ’tˆõ ­�ÑiŠ‚¡…Vƒ†ÆH;„Ö åM+ÝBÛ0F§YÞC{) +8MÀCué-1´MŠ¡9eCó$¬‹ bhi +´Ï‚ÚjôD:ïè@B¯é>>pøX|Æv¤x÷"ðy‰lšÓµQy¾�IAõ ³ ¬ðr»TÝÃ/yŠJ™H7šDI÷rp€œYSBÐ Æ,Q0áP1%”âåÓf²TQÒ©$ÄËšîãßI4éH“(é6Œ‘ýwF}U,-–ôs~™#ÃnÔ»å|ܶ›YÝ.­úvI%ÃfÍ�áÕíÊμ²›Í)Ùrš/=Žg”wš¸Ÿh˜eÏß®€_{§9!v½ÓœðU²[• «Ù™Ý2üíW÷NsÂêËpœúo�¢Ý¸þâ“+ÿÛ{kÔ€Ûæ5üU.}ºåÅçTMŸâàÇžM§Róû|ºáû4'x¬–ŠFy6íª¾ìÙtüz·œBõسéÓËön9åÑà“gÓ*�à·ìÖÿuW¶gÓß¾¿íÙôë¥çºöh²ìÞnœòlz þïÜzé“HÖ1JFÅtOUÏ+ïÇ.ÊöÞÕ=ßG³�éjÉÐÖch¡ºIÖ4íûèÅ·ÝëÐ_ï4'Ô4]ÿp­fNÙûe8õU¯r[°WÓtÙ8Í 4ßöêž½–ýoöZ¨Ö Ÿl÷ä�æ„y@=¯h8Nyo�ºå׳÷Öžœi›…rã“WÇsËk¡Pò+åÙõ[£èÙ£x5M{5M£,:ý�ÛvY®QöW=€Yfɯ̆SsöíW»²¬‚í¯Ê–Ìv³êeg(8¦i7»_ó7Î\8û(7¦³ùÎÞÿåì5¨çŒg2ìªT2|ÃïÏä9“ݘÎ^ó€oÛ¡ÌcUŽìf¶›ýNe²›©d8€kgò_�ÙÙ›ýÕ�ýÚ;ýW úìªïyÿ�Ñ9%[¾Ê娬ÚÕÔ_¾S?3@†oû«¬ÚÕ´àä=>˳&TÉð(ÖNÁ·ü_Ë+Ï©§pëövOs�:é4ŸÎî½Ås(8¶ §æšSbUŽÿ1 Yõ À]Ÿ­¹fÝWGžaÛþ5ÝšÓnÝvó[s½BÍò¬‘˜U‘%Ãqýé•ÿ¾b”l)±*§wËù}´+:lÏ2œÍrfvË™�|c»p|fð-Ÿã§8kÖÑ�m<™€Ópœf–3óÝrÞ³À—}j}Ûòœ¾õŒú8s×çûo·VÁ.{ØpíŠ,§üÛÓýõIÏu:’½ÌFRµ„B'_Š¿Ÿ|7ݱ�"ÿ©š`Øè!ßsð%]’óœœî3öŒ«]Í7¦mXí°={fPü=à�úñÿœ¶€” zš£Y†�,C\Ý/ €`z’¥èù¾0àôQõkþ à¸�²jÃrG#aå_ºrÔ?º Ë$¬š�° ´=„‰Î!ˆ)•ÆzêëÂäùD’̪ÓÿDõÉ&ÔvMeetÉ`f@ï1Øõ—P0A +NÁI´O#‚Á¶ ”vÍ™¦ºö Æ–_P)–£”å”éD.•×6Œ‚Ðyšè +I¾ÁV/…ÅR�ÚÆ–‰‰À€&0Ê”zs‘%—ÌMþ<‚ÄÆ*$¨¡â8¤>'r‰´5ŸwbyPSØf6LÔjã�XM‰ +=‘, ±\¢ÇµÑ *�RÜ(¦—˾®�6¢/—áPU8êBŠVƒ[„:æA,a/« éÔ§É÷,ÍaÃ�¶"˜lX�+=NÝZ�›N‚C±=*ÏW¡U§>»DŠ…€áO9 Ï�&Ò�¦™³Ðp&„‡z%öã†õ×Ü^p»§)¸½¡)¸ MÁí¢ËÀeÐ Œ4‰&)¯’×� ×`,<âõ?Aþ´Pþ´òg [(¸~Ù°KkŠKP�.züb½-©|¤ÖŸVÓÅB­1)òq¹{Õ#8ªÂ«.‡&½Z0#8r¿X®!¤‰ç�Dû6ïK aJNƒ°’^¶£^"�gëÚ� ½p‰­É«ƒÚ·©‚Å!¶eÇ@ÃmIPö¸lK�ª8¨/¶Ù�ðJ}[‚�A­E6�bt/rJ¯R‚†Nk6Z—zh¦Ù‚½$ßòPË¿—-Ø$Rh[H—ȰEjP4Ã(Š]Ã3½jŽ"LL^�$üËŒ8m7Q_­Q–ªˆ:.!XV�3…tá�„ìOaü|œÚС�™´í4«õç|9KÞ5™wH³¬q„Rüs„Rüþ÷ïìÓç¥$ÖõFÙ§i„zQ$áE£QCIxΑªK-X—Z°.qŽ´ä@‘hd00X{ +º®DÊ•H‘ZCÊC£PȳìßYöçËþ¢Ôq.zšø@ ÐHá5¦J§0Uxªp??F±�ú_—>¹¸Ìxiqᥥ¸pŽ^Z‹×¥OîŲaÚ„™¯¨J#Ô{[r—F¨¯¨&÷䮨¸^ñU]ÖÞ×%Ë·ok²J–¤ë´tÉ]þ¤)¸½žX×åO}¥$ÉŠ°6HëÍ ­ŠÇ7¹˜*jÁB-P lÖ« 6ÁḠ۰“ýè_[ú Úàx‚ˆÒ‹�bS>Œ‰ætq´HùˆVù¤GœGû�æ[p(y^*-Õ7JìÇÁ{E“ìSK½ÔKS$�Æu£†ÂeÐJF†SÁíéV*¸=-ôCÑU/M)N“Z H“Z’h´p%RÜw,ûóŒÇ¹è)ËgQ-X‹ÓrZ̸…&ZDZ…& ˆ¡œ#4;Ž †6t¡ Èoм´..ó¾.}ri]0}rñÓ']çÒòîßJ:‹¿Õ[õ·ÊM¼%A±rK‚Å’ ²j•›Ø’»â%÷=Býäî bTT~Ã|EµhYšA¢¤aU ÖN3H…iÅ$IG§k—$?o&°a¶a¶a¶aÐX9)5ÈôÉœ›bòr¤½p�ò}¾DCä HF§ w�¬Ï¢Ê¢(TU¤lØùVnÒ>yN­¤.yœ#•V‘„OµS$áÓѨS‡" ¿aš‚ÛëÒÀèð n =Uè)ÐeÐf +nO»¶àö„+‘b¸© c¸)N“D"‘1‹ÚYÔJ:ùó>÷~ÂçÜOø¼Åi[œVq˜*\%¹BS…§%÷óÏH±…& ÖqL04¨é8&\Ç�¡1Ǥëh[hÞÇärá.ó^ZˆDwÀ>/­BÁq/·ÊM,·ÊMÝí²X6LÓ}¬¨XjiTé#üõ‡Ó&÷Kr£#Ô»$wû¶¯è'´¬HÂc&Ë·/Ç�"&Ë·oK•,WºüIºìº�¬³Ÿ½¦SU?«¯Œ�àH uºa‹WIUˆç¢§£DHŠ|¼F� ›ãèh¹õBPTÊÖK�**eéʇJ¹u»Þ0§EÙ�³ázÆvC ˆ�¶d? !ï7¬ ý €b[Ø�T Û çqP{ˆÑx‹ˆ)cƒÅÌ‚ìÇf´"¸ ã#³…•rÃ@ÃEeP�ò“TÞÉ’Ø0Ã(21Z.jm¡D + £§rÀr®b ¤ð@á!†Q€›,o °Š04 4ÃØQyH‡°°’"dy'n%®÷ìèœHÂ@ƒ$ÞLæCÓå¡)Ëï�âAV•DN@ìÊ‘€XÊÁd7¬äŠâvµÑ$‘®“Ô±7�¿á†ö|ŸŒˆCÑd„‹R£²ÅoR…ähãâednŒ6ÇeMi„úö.¸¤Òõ)™Á< hŸZï¥)¾a¯w„úÏK^šâŸ(õ8GjÖ0F£ÑhĨK-ç¨K%—�oz +k탵Qè©F¡§\íÀh`”x•F¶§à6 +=ÕuhÒ†‰ÒMd°ö�ÁÚSW"Ò¤–&µ’YÔ~eøŽew,»cÙËîXö,jC#D(4B¸(碧ËV°ìÏ?!MS{F;ޱa•ÄÁmq>#lC˜>£ÏhöLž–ÜÏÓ‚ÄË%÷s �aÄ-47 ÃÐFÑq`dh¢·ã˜t êqµŽcò¢Œ.ó¾.¤BOq ó.ó‚¯KŸ &MÇ1Áô xiµ¦ä‚é“ËÇ2 ¸²˜¬ömM‰gs™Ü’®�5¾}+àIÒµvDõ¸»dIº kßî ÝŸSØÎ¦5%¬»!0+7騂btF1ºá5*¸�uÖUxŠtóêC=n…W·Ó uäV8Ba¹)>‹ZI·"<ÎïTƒµ#0­$š€+É`m�+\<ê_}ˆÚb°bàŠ ¸˜¨Ÿ 8GÊeÐ6›€.ú¼as¨ä~¾0>ç¢o˜–ØV }ø ³ðIÂ34‘„O¼J“5pŠÀß¶‰Žàt¯R…oS…sB­)a©Ö I:uãÙÔ¿úP{F;OGÎEG=î¬al«DÒuÀOøñÕM¼\-hM GC´¤süÅmºh¤]ýb%]Çó ?ÞâL§Á¹(h\’ +ÿ8åCƒ84CƒlXAL‡ ¥Ú–'ûA9°ä؆nWX¶åÁÚ1°ÈϪtP÷¯ÀtøBØ–¾ahËû!²fß–^³eÆ€á0hWo¶J :x[°7ìð ßwõ3ˆ�¡ m¶`#˜T�p3Œ ‚a7¬'°Û éH¯Ñe0Œ fÁÙB]ªøˆ‡·³Ù Ð éØÐºò'’ðâõºéU¯…sѧü>!$•½×(òñ„\j>TéÒ­‹ùKÍÇšIÖèãb ÓÐR–¤Ó8 ·ÄÐ>"†6àQÜO莆J(xŒ­Gˆ;Ô4í%kL�m!³–ú…& ²�” Š £ò„6,¸Ý €„ÖõZX¿Yþ¦¿ðÜÃù¸—á|üÕ°p>¾a ñ\ô.嘷[á ƒ©Â}¨ýøÝ2`'ž‹Î7í—i?Þ`Û�# t”VáhyFòq�•d& Ï H>¾aÂÚǽü€ %GiÑ4Àœ•‘hí>¯"J:ÏK±ÐS|Q%Ý‚e.Q%ŸÁTá¶�(éS…3J#Ô‹¤HÂc +%Ö up»a` ¤ÜfôLÕi¹¡IbX¡! ¾†Æφö`I +nƒÓFšQŠ¡½Øƒ…¶a_;éP,‹÷óm1ùKífºÁR¸øu“žºvj|¾M«ÉçÜŠ7üK Ð1bªtSEo¦ K܆ڰKz0o­ ¢ƒRÏGV ãT‡:#6:G…t`;Ó`I@ì¢Q‚$“ó¡‹+D±¤ªHaS†À7’”B” ‹G„¦Ç‡’°MbJEÅáÙq.Ò� �\�–è 6l­êØ+çÅ+PoIPTÏ¢ÕÞ_˜oñ�³å93„ê3—æk�ùܰ»kO±ùXüÀ† Œ0¤“Ø Ô�†hhGÐe4î〰xfA*|e\Opî(Òœ‹âZIV'%5|ݤ}NÏ£ñ%}Ã6lÃ^áÝ­6lÃ6,óAVƒ*AšoP_ +ÚRxÚrºpI&m;+Bm¸…>¨Þ…pi>�"dñ–ÖCžß÷:d”¦¸bÃ6¬ÕQ=÷°  UÕ¹ ÓFî"0:·a‘†s¶aŒÇ*@R›F‚gC£(w‚ ÓR&�ˆ€Ô5G¹Eá]œ‹ÂŽ8¯}߆5NÍiѶŠAnÁRŠ>ˆˆþD³g‚ˆf3.1XYBBt,<“Q•$IçÈx;t¬%;¡%ÚŸçúä*½¢¿ÞêHkECQ Á)—ø\îÇ7,czÕlg°ö7>ÙEÌ*±''5VÎMy9H½† &…Œ•“2Ž•ÓÔp¤jR×vwÞ)Dè# ùä@,âÁ:AÈè¾pŒHqQ4„ê1™‹â8�›îr/©ë�j%žÈ¡××Âsú¶aÅDBÊ Û0Î~V ÍcI:-óY šG’Kñ„‚s‚Æ&ô¯¼Õ·X•çc_�Â÷ÚòœT¤w}q‰DIGCÞQ០7lÃ6ì`Ã6,9A­UòŒ ?¯hû£ð±rŒDq+‘3B½2Påj‚ëb¢–¢>y ¬Ü—ÊCfjÕ>úõl‚¢ðœ×fÁê Ÿv:k>ÐAÝö-LyNQ‰Z�ŒNÌ´.9©ë óÜMÇ -b¿6�Û0ŽcR×6àUÐÉŠ´­j 0� Ó6Lõ°.J?¸KìÄóT?@W¾+h¨~±a\»˜$¼¨=”!Q½Ãå }=“Ý0‰h0Ù�0¡‡»þ(ŽûR§XÜœêõAƒR”ƒ›%PŽ™q^Än¢²ÔIá4ã ¡«çšVX�F¤pîeÕ5bÕ7ì@�¬>MœwEfÍבx.ŠáãáS›g¥ÓØþAz9ZRÐ�øP�ãH‘­Zh·ö¦©Õf4­è.±f‰`D”/²9¬† +„ä1‰Ë†ÜHÜ~Ã:ÇBá¿:(žŒ£_d²uVB/q«QHR!y"ŠésÉÖjrW +B1y±•¾a5I”|%öãéÁ¼iõ€t®ànµ v`I:mC»Ú!D'´M£lh�B§ ] �s�¶a—·ÄÐØ0î4 +GÐi‰¯¡y�ʨo1¦Ð’†³ +6ü’PàOÃÈeA×à )-SFóYÖ„Háø®é‹Fºa�„PÊÒI¨÷%öã뢒|¦°dN½áýsᔂð:ð(â%é +fô:ŽÉ†Q$£ûøsÚ™¹uÖ$QÒ¥S…o¶j¡mØjôDV…—`õ®»f<¹Ò^Ÿ“U›ÿa'HO5�,4Miƒ¢Ä~¼ÑBm`â;¼ÓJ:Ž¡jõ žäH*­MO-­ ”E å7Œl˜IUö€ÂÙ ²js^¼3˜*\Öl¤ÈÇ$«ëÞ'üx­eT�õñ�ÁÚky[};�P +Üës^Æ‹Ê%<@g erדš‚�H©ïÅšlPª7DêZ•·—«‰ÍöØ�”zUЙ�¨6§¡Â(±¤º2S\£„ˆR#X8Ý0Ê š€�™b°öƒúW_b�tœÁTáÞL’tcd©pìkc¨Ý#ãíp£l«h�UÖ†[õüN¥ÃœÊj€�‚Î’š‚×ê  +ƒ©Â!HóIÞPŠ‹X£�'LCÛ0F]+´ÊHÃÐ^ðlhðlhÖ34D¡ÓižÄç€(XÏÐPÕiÕi&�€BïGºpŽN¬:kO^ƒš8¿a•�Êóeª·º×êT¯Âk©²Ò Ì]%§Ù°Â%Ryt‡�uá"ßö;PÚõü’ Fp‰[¾azD°_-$ ‘�+$FI)‰åÆ{ö³s°i¦°µPh`Z< îÍnËß[Tá&dÃÚ—¡eJŒNë„q§™1¬àˆ4ùôB­|"ðSÞiìÏ «Ä­?çˆAàÛ �t±ZÍÉø›�—HÑÊ;¤°®µûñ�2Ò­.É£ÓÌ–Àæö„çÊÒ«ÉýUw �ºV @LÜõâ"::-ÏÀ3˘Ѩ4uŹLSJ…ÐŒ€Œ‚4ó JÓá¾·D6 @@F4.&0*GÂÐ0ÅabE‘ SPAwÃFleœ4Å0©)¿ 6°r*5pуɘÆåå4 ž¬. +ñ+²éyWã!ö¯‚NË&¸nØÕ¨aê}‰PŸZ>7½ý$ád&VbûØâs½4Äò×B~„¦Áš÷mÇan¶hRºm 0¼l‡é‘uNºŸ)¦º€Í¼Bú]4N6fZÙÓÙ òpžÚÍâ8»ù<ÔkFÂÏ9t} ù¡%pÜ�lºv눞ö8è&B;RqèÒ +­YÖš�Í|8éðÉU…½òûr€ãeTϹ2ErçÖ e)¬ÃKW�ɹâk²5úŸ�ågè1ç¸xÛ��ó5.'z©ïôÑÌÐ"¤%åŽI'<‰¸­­’§¡ÊHetÊ€³—G«ÁË÷‘žÝšÖNLäÜŽJKê¿ÍNKÈÂfv鎆=j÷à6è5¡‹EiÌÖgUŒ1�RWEàÇÄz¼y%r)›ë=ºé··Íl�ê‹p@[]áÕ>{/ñÜ’,‹Ÿì TÇ<8"p6q ÂEljU-P‡š š.&/0in²E«„òëÒLs…˜9� Í£V¿VÑ«i9¼ã?ªå·\e$NŽÀ�J0èYa‹˜¹q&V#bVñe"ò�žYšAH¿Y³5q÷ÿ°_Ͱ±×Y²á¬j"~Ðt.ˆ±byêÁ¤Ãé‘}dñ:j3Ž@@÷ãÆü‹{åî§ +ûÁÀ¬¦‡Ž7a_árÉ×¶ Y©€*nšç &H)…�X‡$I½‡¬ +Wänh¸uh ÄÐÌOÄ›\•~_xQ¨1üÒ� �u®‹MnÈ&Îæ‘¿Õ=ï;”‚ó}zý[½¤#“šÁ( ©rÄ«!îð:�„w™Œ{…”5¼%¶ù輨¿e XèÃ*�ì&ãоƒÜ£;Ë?žIâaq(Æ¡ŽlöT”#[²“úºƒk;ñÄÕšµŒIöOXrŠ»‘d'Ô‚ý«qùŒ¤0íÙBý! TÆBÓâãXOº;H Òf»zwƒŒ[ý‡b÷;È\Iš´g@©�#ˆø ¢Ö`s¾V’ ªX×Эz.··¨gš4‰Oz®BäÊrB×Ôþþ±}h·iýbúGáÒ˜ÝÂ#àF|™Ï7IZ´kXqöEá»A¶nƒ1»XalŸ!©Þë½»¹v~ù|ÏQlÄ÷?®ú= &ZÕé’±8ö)Úi¿¥6 +r(7ñlÁï`'cH£1£ómû|nàbECg!²DÁR¯8íñ”W2ò£u^â4s@$N �;‘k¯ü�D6Rd§›oX^—iïît£uë1 ;"˜Ú笶 àø”§ˆéî­°À5x Δs7�›?r¤Ùqö˜Úc ù{�÷t÷à�}Iç_”»iã�)‹»µ†–àt³<¼¡odã¶alð7¡Ï?JÃݲ+é°—’èþîÆþÂ`¿ÄÑ ‰§q$tà3À3;ºÛðö~Ò‰3‘݇¦î.×/Ž�-¬­ýÃÅï�—A“@¥=áMï©{KwÏÞ€ø%¿>¤íµ`3òÈÚÎy˜|è1è¿K³*Õö¿Åÿ&¨Çí8wíaó5—URøw͵¹M †¶÷xÙ+;yvkøÓ¾ò"4<ÌSÉ™NbûÃÛ±[ÿsëÕñgÆ@6ס{øÍÐî?ÿ¨7Í�‰lí Bø¤šç1;‚ïdCÞÂ=¡ )«FTXÌ›ñ�Öª‰ìÇIð.k&1"™½�à1òh�!û‘1"‚'n64T:0' 6±#3—JãAfézž5�'Âö˜*èâé0ÊÃv^<Û¶#Á(`®%a4lqÄÖSfÈþ¯ß°½~3û»Ùc®¶°<wjòlZû6OèÄ“ED€RÏЕe=w}RKªô|-k�§*oí˜ØˆÂm]Ü3Kx•R¬ëV¸¡ˆËÇŠæß†éà”OCkÄQPö w÷È4ïRdjõº—C®F£Z1bÿ¸ú¸_™¸­ ¥·îáÝõ[=¤“Êvû'QwëÃæ÷=õ½S*LDò'k\êqË ø·–Wí«õ?8 Úã|û¢©¥M [^‚Šûv°pŸ*È+è÷²ÜÔ�²ýu+Á사MÍÍ•YZ@]ëm‡„ýe2ƒªÏxx�®L4ñ“¦rñOÄæÅÑ (º_F4£ _#{]߇xfpŠÜl+ã™k,;Ž¥oüߟMøÙ7j~€mTRŽ'²ªí@ëø:°ƒ«ÚG` rã bV¹ã*Ûi¬Äcÿ›øð²å‹ô�ÌÅŒŒ +ˉt¾J¢Å¹#QÚÆ[¬ûç»Weyš&è\,œKü™Ñð»ˆtà¹ÛŦ/iX^¨ð'3 y† Лì#¥¦¡…i I¶ewO5"÷…Q<žKHa!6EH�+™%™;”¶´{,Bã­eÊ|GÚÎ9Ük×o[ÏʵýáÇzFöµ« àyfë’Y®“æ1û«à§ ¬n�},ñ-b\áÂéÕ/zu w«‡4 +ZdÁ¦¡ÚQƒQu+Aí9l®Fb˜_1•¶ 6%¯8P¯¡¬oº±âMѳÐ^ûBR1ó\Ïfþå�|)âç4-�w¿gzö�RY¼Vìœ1¿W¨0mûŠÜÊšÅ�Mý°O +"b?Þ3ÉzÅ + +áŒî} +}2RsþJÞŽÒÝî§í=~ —ÄL7úžåâžéúÞX!â™k� 3“Bî8Ñ}? +Ãé–l·ï«Éd:Ó6å0ªK"*˜RþÂHÐë)2De�H@Es½™|M«vÈâ´HA‰IôÜóÁEÈɯ™v†ûxçWx8(K­¼^U¥)ʼn›DèÇYEýÐÀ8ÎÅËîg† &ŽÞn·TœÑ~`äºØ#ÒnÿMÔKM¾VK?­£­8ö�„Á[/ÄäÞ‘úYúÚs=Gß)ÝÚcÈÕѰb·X”n¬Eì.;üÏ5Rþ= �ö,´Äþ EýÃc!Õ—ÆŒè¨Øê.ó2ÖOØ)z¾W¸ +ºlõ¤—ÜþLYZ½ÒVçõgˆtáDø�ÏÀ”?‰zeƒ {íûûCuaà_$E +VZY(¤'²À �h<JF³5ʼõ3$É.œâ‰‹›õî—ºYµùLßÒŸ¬�ì‡ ‘Î�ê™�“sÔò iz9>`]8J“x‹Áf<ž8OŸ8wTÿµ˜·iEhi"~F«¦»¸\“½k[ÑΖ\…wÄã?dº¸“⎲@XBoüÝ�c” ·˜t&�w§oË*œöµÆ—Ûtá,]º”N;h©ð®ÏI›)n•ï“WÌ¥y "úp¶B੨<ôS(¹m˜ P›ºÃ´:úGöÐÓ  ™’mú^Fà7žTàÔyÀµÎO¼ ‡!É·‚?ëÜqéˆR +©mºnÐ-.ûv +‡E�:÷QíP�u>èûp“ºM§ð¶ï£6²hëܼµ¶cû±1¡•ƒ?SfYÏ`sõ¡T’yÕþuå Æ©;Úѳ¢�j2ŽD8wFä`'Aáœ@.d§¹!%׬ŸŸÓŠ÷°ù(­ìj0Àd`á»ø÷^T­ç¹y€òd„~×a¤R?2Ð*x¶ÄB$¬S`�sœ€>4zhó×Ôv‰_–MÈe8þGà¨Qžø�Q-•ï“MX ]íä¦&0÷yàÛÊs'´ Â(ßÅâ&0�kœ^g¶iªXb`×aËv�­Q$H€y±ç}¹0¬™P`ºx²õ¢VÃgÉŸó,²5¯§F©½®“ÈÖiÙaƒßÖ{ü€ñ’º6Ç@ŸMq£fú‘ôq‹ aãÍžW�pw'=./âó[Æ-Þ& FÜ ~r}GE´)›Û÷ô͈Û�2Ë1ª|¸J÷/‘³¸�ëqOª�>=Æjäx0�¸ÛµÂ´œ¯€ƒ… +Uø2 +ãã¤,wç3±ÈWŠeirˆ7g˜»àF&ûL,Å{€ªˆ=3“|õîúë´Ét-&V˧!q&>s6�HÖ7O 9P^j:£B‹Q!umŽÓšäïÐë Pðí¨“V#(›pº¶K9 Â,4Ð {‚ LÿÁ;b_o+PÂ0^¡9¶B K¸åMÌ\#Ì—Á6B Óý=ºïàz&Vp T| ¢„…Þ÷ÊÌxÔ…u°ðÉy¼Ç Ó<§yg-DëÏÓ¡s?—™`~ý¡«åàöKüë.‘ †j6{ÞZ¼É錦4?�¢L0ùA¦ÖÝ›vÍw¾,Sÿ4 é3�.ØU–Â^Lí~{P7MU­5 hÓÉ@-ªsôª$iô%gkPûr\äÐÎ FYæ’,pi;èÍÊ—Ÿ&,y¸áfÀè³oF?žV²vÎ TÞ4§h+lV�ßúçptt™Ó³—1ÞX9±ËTÕp‹†ÒÒôÞý`1ab¿dåt»Ñwæ´ˆÊn߃W2-"É6YbWlþ“ä†QÁØ ÛXíb_"6Ñ;D¹%Û"·AˆRÑ{QSÀÏ $×ÕK#ã2£· T'ÈÂ(¤Š ‚<’éÝ!γë¢7søÙÕ˜f*zN€¹@bÀ̦ôEo\)C\ö¿CJ©ù¢7/ ¾NôNôX&41JzöžìKôv¥àBjpp¼'2 ¦âhg’ѾÉ┽sÉ€£…‡4ßEîÉw$ÙV�Ì󨉑�TáŒå¤e(ë‹çg˜øci†_*›æäxU*LÅ÷ëKP…nÑE³‰ŽÂ•"Ä +mr`ðDó�ëÈ`aßijý_¢·?gƦâ)mǘ¬ê­ž~{Vq]’amÀ-,·ã_jNÖÐ ëþfœAb ot¥Æú¯ÄÇ-꣤,£¢a²ñ™Ûèö¿kR<Üs’Y“­)Yv,e{ž¨.@”�‰ØŠÉVÕïTˆ Žì×H/q‘©ÞåÍ™?ø±pnQ{§ u¿.€éÄ=Öè]Æ"ÓBéÄöHs�×Õ€…yoÇ©ˆ÷7zß&g„é[çCBÄÛ„—ªòüÃ™Ž…[’Àª’ù¹£|î!'Ì5x£Ž¯Ê6¿tŸ…/f¥·u•›zùFŠÚzý¶–zhAuýÀGü4&?ù}ÃÒÃsš +QDGŸ÷qL(47ƒ›NŸíÛrv¥j¾TÚÌÀÆSCrá0ã 5¡OéÒD˜¦�îœê@sšeI$w´l“›³*kR¾Ü�f tà5«0°M;Ïu8Ïõ:v‘³>¹M°ç½]ôó-Ì5ƒÓ$ÉÊzP¹ÂÔ0K +ySššç„RbH19þã…�ª»Ä¿%Ç +ªíc‰dõ2;—*D‡¬ªµùP‚xY¶G±Kûdª–4Ú6øb.Rò~§_ù”y›=:]D�ßQ)™ËŽóo‰) A1Y¦ÚµËÀ϶ ˜AZ€©¡QWÔ(”êr%ÝÃ[ކD¦)=*â°›½þX^jò¤¿Ü8‹ºúügÑ�fx{6[Ô¹”:]Pû*þjåÇ¬Šº’—Œ Ôå_�Íu-ýœrRÇvìȘ©¨Ë”!Ê%(êâE•MÚ Ж¶ê!‹/{öbð%1¢ä'nˆ$¹Å`¹f/q¨´G+ëY™U%â„6­Ë9ûÚ[«àe´’ß.M?P#¹�˜áo÷C{LÏ<(fšï™—g™ä¨™�S¬óãû‚Ô3¬nŒVíÊ•~{®éJ8ŠCÊçå¡þëürÆÁœš[öo¯í&É…ä™ènf�)=±N;ÿ2oË‹7ÖÓí�«7ʸü| ûvR’Å]_ϲài�sfì_{»Ñpƒï““?»¹ïη”c·kI‚ì.ÜĽ•¼K8 Õ¯ƒšÿ(UªnYr‹ÈƒØG<Îfþ[åD¡œH¯ÎkŒÃK'SaPLÇ¥%‰Å…æd¥/("kKwea“JÀè;åX‹£%ÈÓ#–@„–¸tP¶±¦^5/ÏðjF®Œ”&-©‚¾nÁ‹�žçʥëç,df0»öÿ ÷¾¡o›Ïo–ºŒ·Ï†w4 H¥®j�eäÁ-8Øï”ºxå?Õ; Å˜¨†#}¸Réw~ަ®ÝïRè(D\œ¼ï¾Ñ‡�±R×|B«ÒC˜óñÔµÏÆõ¼ÉNÿ½Ô¥ˆÈíz¾q>o»Øõûã›vÙÛçÊÍ0‹dî¤ÌŒ­,–ØIöUac½~+)#7ñH Â4¸ˆM¥ÔPô¦S0ŸÍ©]â‘€;Yd°ÒÛÓúÁl#0Ä ÆÇPéÕ©ïw�Ý-ܹÆ*ò?HSÓb…n9TKî¡­–=ï‘Y1­î’ì)’ç±@{nâ$ÇXŸ\ØŽÒ%7sº&7:ß8ï\Ú̓vf¡©»Å^š�ÖŸ+ȈZõ_)£:ðäxäÿ9” 3ñzÚ—C˜1Û¢,IåzÉ÷Ͷo“ ”dnì[Ê +úÙUæuê´P�n!—xŒM½/¡zTK,NàxfIo"9~bp–YŒƒa›ß>…GP«–!¹RËl|D¿X4 ×fæ(‡í€® ~\·ÔO!:ÞòoßOn.ù”ZÖy…‡î¾ýJ–ãηØQ } J'zV’žª‘zÀCÒ®Ùí&™�u˜Xœ¥ *€ÿÞD>¯È9q�¢VþmËÂãë³Vwɘ¯2“m6�.ï!ZÈz¬Ÿ,Ð÷_B†’ba~º…#ã³Á8:�¤†ýtqÃk4ÐÆPF¡Ê²š2ØÉ2Ém„D2dºô?»¢Åø…´GɧOz012fû>$�×iŒ( VTf b°õQÅZQ�(%̉$�!Œ#nv’úYûDÙÀý€(ñáßš¡ºÿ¾ÒìXìÎ_ˆî€èCè¨ç-É{ûI°Ë„ˆ +þ FÜDÉ]{õ&Èžê‚×Äp TU(¾Ÿ… oÉ2T¬¾Û»‹ß eì~\cJaÆC’.ƒMÊ")ù£ëVÙ-Q¡üõŽˆ)›W Ù»c‡Ú奚®<¬-úPÔOÞ%‘(¶•!2-#ž4&转Ô4ù~‹—�œ«øGœí)Y‡öpë@ã()-hx ù™Ù‰P\z%Ñ:×ø9zPš œK·"¨™ûNû+ËÌ#{ }¦+:Ðǽôp f²›-s gPý0)ÄIù"D‚~‘Š]Ò¿ú°É�fu“\¶èwÒ�nÝ@"Ó²aþy¨ £�߃ Ë)­±$›B¢°æ’`&£4Tãñ‘óeÆ`úôèêâ]rhÒæTHÊmµ¤€\Ü�Ö ëp„fE´LHV´O6"æn Øí\UŒ¤âÃñ͘ÿ¢=§)mu•1ó6óùræ¯ðÄ�œÎùÚ{÷²á)ÕJô¦%ÿ`|ôU8ìﻺÌg¬Án>qf!h4¼=JÃ%ŠPßk¿ÇYmL§®_/w�Ã0ˆ!…Ø0 +¤È Òö½lâ>:�¾! +y¡P—<†:«lÑ»‘×H·ÓZE_) kÔÅvB—! +_Ñ‚äÝNž—cçQ'Ljöu¦¼ÑÁ�K&úªÛ· ð˜»Â*}±v68‡ ¤ÛùçA‰ôƒ4�‚üÑ-úxìd.º/ GòÈC.ߺÇo)ã‚¶+sÖë=�Už"¯Q4!O9®…# +8Z<Œ)¶ûË~ÿq'kñȾžßºË¶ZÌŒŠÒkÀuß^d@ÛÄ8g>íÛ�?™ê¸üÄdƒÒ]æ¾±ãŠÂàç�ZÃO•C–GáÎVqÚ³G +€²6˜§|rjª1ŸÀÌ(UáHô~§´7Q‚jZ�ï1Dœj§)ñˆ4zT„0OÝößñÚèß�™î\³ìj,ta§°ê}8!m[->2}d$)8 Á¶ÿèå¯IÃH^(Gf ìoœúÙ'Y¶’Q_?—Œ×7Ù\ªºz4N$U@OÄ"Bã.« ~y«O$PÖ2Üâ|Ã飫™\ÐâÆÿ€�×WMë„ibÂ9Ÿ9/-I\h>~¿[€O½’ÄâÆµƒÁ¶æ3k` eŸ,­5ïµ÷‹äg¾pF’Ð,†ø¤�R\·²ùBsÇêˆéÿ‹¡Ï éåq7¡Y–1– 4ƒƒ�Ò_4dJÓŒ·›·™A¯eN”=�!ùÌžár~‡ffå¶Êûl?3¡M>›ÕašO«˜=ŸÿÌ’O +ÍÕÿ°Þ¢QÿÌe¬ð…æ¿v„åå}~Rn) ÍœùÌŒðšó–á2ªˆ¹Lhvæg¾@\C³¬Öï+pÛ_'4³å3£ÿ"4{IÖÐjf½Ä?3ïëP54“.ƒw9�Ð,îgƒ¯BšŸn1òãnÁ%4ÿû̈á'4G6W9‰€„fZ[ Khþ‡Æ„fýêZ×úÌä¡y ÚDô%èϼÍ684ÇΗâg¦}tBs„�LÍòk�íÖc‘æµ%ç +/ÇKÅ‘í¤$ÍÑ4;Ȫ‹n˜•qivtË9lš)¼@a!¢#9™¦™÷×CŒuz­ìîäzÙ4;õ�?K¦¼‚†Òœ1äÙKjñ†Òol?רŒÎ˜«‘Ê7þáMÁ«lôëô®¬l¡òT.äxÿþˆO”qY§øWFQªEŠÜÐH1�=�]¥9@ìŒRE$²­#·(I…ý[ZlR:c3%®‡—#e-<“YhÒæ+Ÿ_ýžÁ‡÷æ*êÀuÍy¼ + 8Y+Ê +›qðN‹2NâÒÌdf?ÄN¶#¶ø†Ú§ˆü¨fd儘eç×f ük�áè«sj ùûuÎ)Þgˆ`K<Ô%‡t«)Å›}�î<• ÇŠä¹ +{Ó�œ–J5ÿ�”WŽÙVyÖ:Ö-vXYüdžÌ%°øÕ�k>÷RÆbEOŠ6“ò¢‚T—@`0[]y§Ÿ]*mk‘‘{Ðj?¦'ÏŽŠ#n«[ùϘ3–óGÝǾð°’=«èý´!¦++�eQ/83v#N©H]˧KjC¼Óµãð3kT¹¼t—Ãl;„“1ÛЧBḭ̈D`ºš+¢bn'c-b¯¬CeHßIõ†IŽ’)Dú±‡Ê jãž'ʿ˕n¯è‹ÇFL,ÍNœS¦G÷÷ +{2òækÐó“M«Õf—ã‘Z®¨4v‡²Häv‰ÙÂU±öxB»IÀ ÂŽ +}¶JTǧ¨$ëfx Y¾,·  8�Äà-[Á¸>A�P_Åþ;Špa�‚ýæ4¢£k$2šÙ÷6U’fÊ¥C¦­aËð•ÞºoÑÍ ¦Ç¸å%¶påúsv¨ÜçÌ&uÏÔöœŸ!/Å]ž±Cá}†Ž²ˆ´%!ü Ý›Ió½ßL¨¨IòBÄ ÚtÀðY&±Íƒëâÿœå»pÊ€, Îf®bWÃÕž'´�É Ägê‹$óšpq PhÕ l±›Vå ö€ŸB�eÒl,ôcDç ´ðÚYDÁÒÊDhoÒÊ €2Ê‹ê|‚µI+1wR>—aY¦ÉþÁÛ-Õ8xº?À™šI]üëcË=Œ;UGê$eÁîõ„¢s®L )ýâ"Ép÷øÜu®Õ¶ À¿´ž/þôápG_ C†áˆÝêbð�é±¼¬ œ¹9ÅÔtÆOWÁ&\XwO3ò€�õ²#Í !*c‘‡‰ÓÌ lÉØ`0Æ_•²v1-±³Ð5�ÄŒ¬«ô #«ƒiìd¹€Ü(…½°‹�yFp«1þ¥I¡¨IÀª_X³#~†œ”_éGú¹]q;oÿiÀ˜ñ‰gÚþD6¹4ÜEõÚ¹‰f_mƒ½ +ˆÈt°¸R̽DÖd1_2 /‘SK'ªç—8·V¯~FèÄr�ÃN˜|µ%ú;x ­kŽì“-!ë[ž{Ö¯¯‚ô†[Ó+Øò¡ŒÑ€MêLëZŸß©ÚKÌÒ†÷<ˆ�X7SƒY¡×ÖŠ¼­5n‘iUn¨þ¨�t®©+EäGÁ·po%ÅàÀ ò�þ€\1)…^„J �`åbþ'pûȘT— +œw.¾’ëÁå8¿ÀéÅ/ü8[SC'' óÅÕì +(Ó>6z$‚Ùû/ñ�2(öýpèLÞ¼Îxø ‹8Ä-¬nÂÔÈñsXáø�©¯F z87•n9¯p…F“ðPàr„f BÍ}rg¢‚_»P~2ˆ©„A}pZϼ¢3&�ªbA˜wQóÚ;˜{Ø÷Ý£$üÈe¢'«„Çi÷�“Ř%3¿ÚÙX˜½ è‹å¶HV4ïHSZqa=MÄí"Š“eüíáiÄ�QÏ)Á,—vŒÏb¹Âf²ûÄ`âøF@rÚ «dãôa†©J?F\íaÁ> ÿŽ'ýæ.óA¾ãcÉ\_N<Üe˜Îˆ_7©�ðµV»&Š¢rMñ£= +…,Æ©böï��½ï³£º/qž„½º@¿\'îæ=ª³4ˈƒ¥ÌÆ&4>°­ÀQoñ¦ë€|öÂþš”Ýl•¸û3µŒ3TÌFx¾" aEºŒ¹”°?;›¸^-Pèãháídc=…¥RwV«B$ÒÌžÉwûÄ–œ„ŽX«YVˆg~~ì!ÀX wQ1^nÛ•ÍÑtÎþV¨†5ó_†Õì(ÒŸ?_¾qšÎ v˜T“yr °Üi*20oæ�šVúÅÕø§Öáèkÿ)‚r«äìtaß_„>RlÃ÷j@ä–EQ›a2À�PôD:±6dwëäYÔqu{]Åõ�6õXÂyÞÿ¤ß¨î[Û¢Ç$°,¹L*™$zMÖSõå¸ñ'ôœ–âaòh¡Öõ¹×êÜÝ‘£±sŸ-£¢×ÃÒò+y š+¿Ž�óì\ydgÞH“23&�ãU¶Ÿ>&ãGmåfÁySÑÞÈ +!‹ÒõÁÝÁÉ8(¤TÔø¬º2}Íq±ÏnЍÊ$ ©ëxð]píBióûrpÝ�v;,›7ûzøüg™œ‰{ï—Þ ëÄþ_•}á;q +ýðã°î¨ù?xOæ?âÄiö¤Ë‡(~•»f}2D:m¥ æ—kæ§90Aj¬¬~ù žµ–=5íaCk„äP~_•Rªî¤N½õzZöÕÔŸÊÝæYÛ�ÖšAûi¯lH ½~䯸A¬�8LÈÓHaG]`ñ¾?’�_räž,+Õ´^cCjVŽ3›\ÞÏÛüÁË4�<@ÂŽ cÞ­Í):zǼØad ¦Ž…B).oé�¾�;¦àœžÜRb î šæ±báôý +b®ø23±å4óx>>PÀ`g´� ?z]8   CŠçõu‚:O’ñüAï«6p)TGaÇAÖ—ÖqŽ?ʬc½ŠÑ¯áP^¦f±LýB‹ƒ³×?â u-ÞfâK‰­ è@ ¯%-Óp›Í Ù©ji¦âµ™X�ãÅ’=8T}¿ sM"–*å:Å—ÝA’m¦™òTq•ªí }Ïün–ÿÚ"%é£ïš^9M@ÅÁ¼%Þ«V6™xïv¤W@€ì£ pA{oÅ™uÓ‘ã ‘H”Ù‰vOM?–~ð°¦Å€ £ô l¸?ÕŒŒ½n*UŸ‘í3�go�µe² Š=´áI™†9h¾0s–'�vg¼%BÈ ð)uêæÁ c±ØØ¶²éÎxÊ8 e¸^Â&ÅX•2+]®ÆüIÕPÀHüá¡éß $Gý³h(UǽÎÏ&H*÷FÈMT) ±Í5+OC:ˆ2å~ù Úø8=É»OøB¥® J*dýfÁ‘4�€xC«7¶É¤�ÿY|«xf4:â9 HEWs ú ›?¥à[b'&‹DJM,ºÿ Zv +g&ãD]O ++¶�¡_õqØ)%!§Î„ti·›·°×u0—E�`Ùí––É„@¬}<¨âË€àhm| Js}õ0.·Šž)~yÀ¯¼7V>ˆ* •D+´ JÉ©‚—fÝ]>l²6Îí®·�õÙËŠ“5ò®Ë‰¢k=¿m¡åÊ—–¥Þ×åsͨf‰ûÆddeSsj@‡ÒbÆhŸ1] +�õä{=¼Ÿ/ÇtÝ‘[×�È(ý,Áš­VDkþÆÇžž(ÉÃrIé8Ë­,Á®ÏiQj°hD4-…;c¬Œ†ÍPŒ†;o¾0³$±&Y ¸xL&S7”ëødýç¨t¹ùc�ëwï3 EŠÛtÈ…!ÅfƵ¿§šš`h>‰ÏËéJ®_Y=ÒÀÛDgV$à¡*‘ò¸VôNgè©¢üUɇÀ‘Á¨^§¬ÿïhsMA3º�qœ8ªQ#wMãÏ�OðýĪ$ ‘Qôsªjm‚„ª=Ä¡¸øj<':j&î-7‹ûRÅij¬Zi¬Rm¬M—VGÎ…ñ¨+_'E+mc0Í¿hnÉ2_ÊMªh½ >�?€cz-;{üˈ٠Á#J;UÃäâAl>»P¢Ó)@mŒaØIލ°£�€ô·š)Š O»zì›·ˆüís'{òm›cïû½ Ÿ!0Çû”H…Áv§bu(ÄÚ;f3ìß_ÒQ?"VÕº¼ÙóÊMmLcxWjÙƒS5Q#Äðšû×q*{ö@®äÍ"îï›óƒç¤›®8ieVÏ2Ú‹Ëšô—þ°WÚ™­¡@çP=âù8yØ?h‰º½o�Ú¿�gþÌw�s¸23ã´!:Ä;Vgï, `�ÓƒÓµ�‘r)6î÷/(¡k,à: †ÚŒ“Æç£é(pŠ­¶èÏxÜ(úêÿ‘9…J­>ÆÚÊ áÌ£5˜5GR&úü]C‡wàùŲ£¶ŽøbX‹\68#ásO?¾CÑŽ}-Lç�6u>ìN%Žâ‰IâŒv‹EýBF¿K¤”‹bæ zÝ¥jI})ãÂxO‹ã›áœŒÌ½$;Ât +‹f¸¹ü¡ç +ðó*ŠKÓÝpRØj H©G›ë3ËV«¨Ø™Ïã³…K;µá“ù-•õPÞTü‰vÍ�5³…(q8)ÏíÁ«‡›™²©¬¸G¹ôkd爩¯–¡H7§¿©sÐ9ñT©íŒ•‰´6É}ÊN0QV%à¯cSÚÿgf_»Ï��B=‚²ƒ äµ/8´RÏ�±@÷d.}Áœ]g£[m[‰p�gÄ®¾>Ý'Q˜cbô‡ 㽬+×vR¦P´OVæ3·C´áK –ßÿyî$rh]’Ç?˦ðÛŒ·ó½1W9S×f¿°r(t'í�Ô(çR– 64Ù19ˆ¾­û0ŠÈOŒ÷ʘµ°Ê<ˆ%ÿm$áÓb¿†xò5>ê—ša|§Q�GÔò. \"‘iR'm)Þ‘¸'€\Óë_N9Ë$a­ë¸&³0Ÿ`Ö+‹¥!ÍBå‰Í²ö“_á¢:é8ÙG£ìƒEöÖÞ_¼.»éuªCt&Ï©+Z@ëöÚ«Ó¶%2hƒ„)•G90O‘aôêv~Æpbù3)3?§ÍÎ)Wh�šCæò2C¥«¯Š5{2ƒåúžË¹þqf× .&�B¹Q¦À& +«ú0QÇ€Pªp94Üx(ýÝ\ÒDz+óî,\2£õM\~‡3Ð𞌌[²+xôb±7E¹;dlo ¡CÙ…ÊÜJ€Šc«Õ Y)[ÌŠ÷‚g�²ÓÀÈßf~nt+��8«lµÐŒ%§aÇÈ%"@jK]avŠgZf6Uà“é´ö ¨B%¯æ<;· FÍ’12Vcsq_—Åå\ÇÈ5Ó`Ç9Ï�)Jp°QP{}�ÃõÌÿ‰g´ ¯•%�ÞJㆩó»ßþºÍ)Þ× Ž{2‰`¿*†�2M÷#¿¹ÀDãLÜMfª”R‘ä~¥ê ÖvLòt²>×å±ÉŒÐ—Ñõ¿ÎÐtÌZ@ ühÅË"q +ÀB;€Ìj8}>9åá™7{à�´nü‚ÛñïPé~&ƒš)íÝÁe•Ýå�ijç‰ n„Sžø±í3pôpÒüÛN�%w{Æ\а…h"æo( ógl¿”=¸@.}?Aqâ�|€È¡Hs¼[ºHwgxó¾„ .<®Cí¸v'‰”عIî˜Ö†q‹�Ì3øÔ ;ë"~š&ïÿ(‰ó<ê>YéŒl‚µŸJ ‡¹yëX¾ +¥]Á<Åç•Ñ@6öCÁƒPnaHÍŸ0î±Õ=I™®yáò©ë=/â'þªÃ–f�úi‡×Ø�3·$øÀÑ̓©2§P+‹[…ø¦NÃÇ%Ð/éâÏ#7§HÙÆ{‰‹XçÔct'üfEŸI œ�§™hd™ÛÁ ½ì»Ç½~ðWþš mñªMx73NÎÅP�$)‘“îäPºÓKÞM0s…Ï]%)¾þ®3üìð¡÷1Öù:Òï ñð‹!��aî„ 5óã=桊+”g5}çÈÇT�Ì·‘Ø!RÚ“³y(l-‰ìXxÕ‰b/€¬žGåàzO¶kœ]ITÙKGï@'âvWÈràÏqˆv„s�Ÿ`jƒ—ÄŒA62Õ8�;øƒ|$W¶ŒªpfÆaB�§ÿw¡–;põ�'áƒ,$Z(ø=ÓÀõÀÔ¨g"œFôŽ~-8\à¯ô‡´þÀœ‹ŠÉŠl·4`*–¾×‘Û”àzY,µ AJE,ÇACamD, J�#‰­f6ÇMÊYÞò“ £ 0»ÚíVO­¢üĸñeùw�xɦÌz½gz1ƒg§„úßäx‘žè„Éq(ìCà±—0%Îsýµñ4E6u”pÆ®!ÊÇ5¼ò tpÉ㚀�~Àv<~â¸ä³ªvî#d_æ Š—÷ã›15­~LÆHaI|5…vkšò̬ql$›#qЬ½µÆ9 튭 +·“¢j}IEܱۗå_c¥èŠX¢XÀBJeнè?@à.a””Ù�ð(ã%3c¦Ò*·ª¨ðm]—}¿é‰ØŽ Wª*§G⤠�Io¬÷ô®´î+6@aCÏ�M{þƒy;g +¼ -Q¢0AâWÚôq½®ÐŽtÎȚñÏ•´žô“5Áj²04ñÞÄüL-Â|_ØMº�÷}·w(DøXšÊõ‡à ÏŽrÁ?Öø// �ú_IÃóu©Êë±ß­'µì¸LÁ~Yu#/Q dZóË9®;ÓÞ@Ja:Xoaúò­­ƒ})ø¢áÚ³qªÿ†Ë©€¹aôŠÏb ;Ó¡©'(V½QåùŸ¾ $uóH�Ó¸ v�d&¨>D’?ÏŽ½qÓ* +MxœwYeÆ¥ýÇm¨•ý Tçn—ö­ü4ñº»%·Xgöþ8ÔIôcÿ…]ºy³ëãï�‘ãl•“¶Ï&ÀÌÕd&ô¦‡ x†ÊGÞB¥ªùÁUÊØn\�áÁ5öE�…ˆWÑÇ’LÚ� ¨‰ñ„kÚ¾hcxšŸù Ÿ?ÂíV„}ŸŽ¼¡ü�OhóŠÄ42À8Œ–݃8;|ºˆÇ 4ì]è"g®Êø +áÑc�7CVªµÒ¡Ëë˜nú· “"T%£�¥©xM"è¶LK¦mœNœÝ¿Ý¬ôZ$¨ÎY�žâœ…t½¯Vk œ +ÇGM²â:Ûj_©XQØ#9ä[AÔ÷þä!ƒÿ³#‘.ƹêH[%v^M·è Ã0ý¸d:K­‰#[¿ ${è;ìs�ªÜËÅtyi¢÷#¼2[šèùÙz~ 寢’$·C>¸d$¿°l‰6´AkVkŸçûmp׫‚B·¿g/¶q[I‚”ÿ„*º�vh›âŠÄ"Æ+lÆ’J›ÅÀ¤¦Ýdü36Y³ät™g¼<�³_Gi¡öfõȳnø úÒ�å¿áïe¿+ç¨0ÿò«ƒ{§ZL»K�än&ömü×{ºË2õ%ô(眪çµRn=¤†{ãÚì×+ŸÕöÒìˆÌËÀhÉ­ +ÂfÍ{[ÑÒîÉóyÏäĬíϬýÿrÿõõkì +E~åí?Êû®ÏÿÅújƒ?¾ì}zþ%ñªÞg¶úéuò$`_DêI;�þÜ3–ŸÆ.|8ú~/¼ZÞ¢ÒwxuÝ$ï¶p¾~þ:ˆŸV—Ï­QÛº•îÏCûÍàê¿a£ð~�þÆÄäþÿôOà˜Zk½‘¿ëå*:(N-£ñ—¢¡,�0”`àQ‡êÃk�( +B€EgíΙC2È"8M;�¥j±±¢Ž›Î×p8õo1ÍâŠ÷È"‹7þjXGÝïño÷¸™>kÆ” ãöpVkle²;7ÝÛQKøhfCþágnZ\’>p:i§‰ ÎÒôwµéÕ�9”ÛÁèGnªÖ4�NMÝ\mÝD*z#@µS¾Rü¥eI.nžœxÌÜäNí• éi&âžÔ�|%ؤQ)}ßq܃¼‹ÞòÉ‚\ùã«Õ.ü�UÕÐS¯”“ƨAVb‘ÓnsMwT·6¸„Âë²U�5Uc 8QÏ™òò±5˜o»ßfœ;j§�!S òz)?Éš°…Ø ±r¸|Дª5Ò�ú¢ eßÖt9¦8ï »š�5vJ‰Ø-(Ú_õýV@³ºýK˜âßÚí �ë3cŸ) c¥EšŽÙK* DÄvÀœ~¿…iRœ` üü·Ÿ‚]‘ÝÝ;SJ—{ú³ãåhÃx 3$Ð-\m&Ô Ö°ÂÍDU.*aV¸Tn‡›Àtƒ+ �•éÛàOe§Â1äN»ßàœØöõ Â-Hhp® ¤€”¾Üç-:ÚJÎd �&d’in¸ ¼éµÈ�²K +WšhyTÒ)%Y‰V'Ì'ã’ Ry<.â¶&$&�–”±XrâŒq{x17#LˆÜJâÏ g+yUš†zzÀ˜l”‡N a%?/’ª¨Õ*�ÕÊT@Õ‚[!ç³Èa +$BjÌXÒ-6­W1¥…çVÚ�¥ùYLò³ÈÜJrs%Ð$%ÛhA¥B2ÎÁcW±„Zö`‘û¼E¤¥ ')£¤ Ôœ +²ƒ~`ÏÁ| (Ðj;„Q÷`ù<�‰NB†Á¢ptòJ’fP€äˆbijW%ÐÝ*õi-Œ>òÚdКk%`ŸÜ�$@!Xd�…çlH4ÙÇAil\#H¢öqb³Lˆ~9B³È}žê4€+)4, ÚÙ F}™NT”°N †•·PF~Þ¤£YäFÙ;B�f‘cˆr/¯<^;Ü(k(^;*[©"wÅçÚ‰"ôÁC �$¢a*»Ï³9¤¦Â¦{Çg@âØXŽ�®…Ï3‘&D`&YJFrj�3)",€œð¦‘}Ħ¼�S�ÉâÁ™ÜmÜÇm—µ4>ÇŒ=lôDy|ÞÇ*\¿À)D^ÁCÏA’ÇÐ0îcC ®Ð¸Ïç}^i¤Ð/Rh¸—HŠâ~ÀšYl‘¥€Ý“Á +"FÑšÉÏCAF—ÒAî©Ö/L$þ‚»¼¨e“ª„ćM!ô0Q-ŸÝ‚’‹y)Éd2œÆÖ AðÂ1ËÇ^% � &Ô +8ùX°ÿXŽË�øÙHXnõÍæ~´lzñÙx$Dë4&µÜ˜+i#ð`jœ€ŸÐS ¬ŒC*M+²SEùy¢¦lL›\鱊r )U k9™ŒpˆZ/™|e +¦¬‰Oh¹ÕKd¢”9ÄÚÒÌw¹«V@9¸Ì˜]Õ +XÁ�GÞ\Ë1 >�KZLJw ‘hJºJ?�>èD91¢<>Öà/�(!߸déb&�£E2Qû&@®oMëa³¡cÕR5SM”“Q�6ÌL”¶ïäʳ`)˜(?Oš`" †{Ñ׉тˆü/¸é¤ 4t0 ²‡E³Á9{"Ù5ùœŒ +.Ô +8k + q¦D¢„$ecÂd "ˆD‰CX¼>G1Œ@”hD¢lYD¢Ü)HÓGQîr«�¨L/  ²;Ö¸åçQ6,G¸8 4¦ØY�•U§êH3ú™pjœ@f §NìP‡k… +͇ +UDJl"˜Lîlž{EøúÆ#3&“Ø7ùy"�¥&“™nåV?ðyŸ÷y?Z¡âóV´Pñ€H0ºË| B3Éx0�SçZxÞÃ@ýåãb€.Ÿ'Ñ ±!ÐÐz”BNm&z�¡+» +Åaû<æó¤mÐÈ&}6¯†@7! ØÑ…LJràÔ�B3Ùyp‰ +áé2! ÷Âá0¸^ÓPÐzœD☙6ÙDO÷Ÿg;U,œÏ(`<«ñópŠÊ¹èD‹‚ïêæw8“?X“-ȃ€ec]#‘1\&rp/ã#óÈÆ?oBåÁ¼Í"ÒM¼j†ø¼ÏË1Ø-–H¨P0�Bnò¹M„ +ÆCòyV7Uý21º0Ì„ÞøˆÈ²mBâ|hN@ÒÉäA[µàR:�4ɃÏ{H +jP!CID1j>T„:F (P1Q£{y˜\—yëÔ<‘ÓÌï +pѵ K€k$‚,˜æŸ§€Ë}¼] lB5¡ú¼ •ˆQeÜV%$L;�£AŽa„è;øæÎã��ˆŽÈèž&V$t4ÈÇ`>o£âàÖ‰²4 g¸0d¾²0«©0˜3™Pé’%dã‘™[ ôŠÛ@¢ƒeÒÌogHû,Ÿ'jT7HÉ®520Ð÷"D£wppNjËdð‹ÍÀÀˆI=D‘CT#¢ÏsåXŸ÷y†PM†Ä‹NŒº4<ÀHçHs¬�yd¨’º™0ºÒés?Ÿ£ SÌÁ"'ÈiÂ6=Î@D`&MáçM¨6•ÑV²•l%[ÉV"™D‰�ß8Ör²è½d2r@?RÁœŠƒ[„B*˜óàvंùy·ñ–3çñ‚ÎÞ„óy-ŽC„ãb½ë�õ®]à ×*’L&y˜ îŸ7 +ª%¡ƒûW!ùFˆ©Yl¶HÔ‰6Ny ÍdGAÛx¨Ã€î‡ù^úr­2þ¦a!£<^‡kÍÃnáÉÖŸ÷y¨Òç-(€�Œ�aðˆ£×0 ”……Ë| t¢E¡¤Aaî,5» ¥UÍ’k`m|Áaÿºš?0$GxL€Ä†h ÀÅcCp}Z"ËçMÆ6™p-"0£�‹òxS(JƱ–“D$À�ÅÅ‘ãkÒzɤçóT¦ó@Ë­Þ±È@ +r‚Ç�ãÀA`ئ2¬ +3oá)Ãʈ˜&'‰pˆ"<#K‚cAÀ‘ãÜáDŠd‡STH9ܨ ä``vÊ,[qUHuŽ`¥Õˆ%*aVbäôŸÊNâ4˜”Øà‹€Ä%?OFcäL !L»Ùƒa§ml®¬$Ö>†�©eØï—fa:ÑÛ&•p¢_­µÃ9ù3{aÂ~ …§ìièRTö$–Dç»…jyG˜k¬k$æ^0ÿ<ÜK!3i:5Œ.¥Ó‡~žÈ¡š%,É…–G.² @¹Äpð>rŸÇº"œ�JŒ\jf$ä`šQN›u8É­ €µò›«Kîq#1"!œe­wä–°×P|dˆAÁA1X3„MìÛ°¡… KÞ$ÕE óöt/–«íéxf*q¦uöt9�â¾>ëý+{R§™Ú¾þWþ�}iµ•öûÍm§ÓYÛz¥Nûï”MÝJÏM)þÔk»z¿{ãíêøÞïw›éÄ]ý=þú¹Ý½�µ·Ý½±Niq×›ëÛvÏ^wõêßîo»:Å÷~×ÚòinêÒiÍßÒóœ˜6Í=ç̶ö»ß[½¥Ïk%mé^, ¾•¿­öo¶·¼Rbù�1µy¶»¬³q@½Ø¯{¥ïýîŤ¿Ó‹-­ÒÊžPßñcœßûÔ;sŵޜ{z¥Ôq–]Ý‹Àmêû”?g[Ï](õ0Hï ½Öç‘t¸Kk â­�L‡¤Ã]ÄÖçe.Ò“øD<âÁ>2@ÖPëà÷ð$2-w¯€ Eaóy¡Z+uØ`i#.+ôÏ«Ár«‡ŒQÞ:‹—¯ÀƒZA]#µŠ´Gè£CeaÍR¤™$¸¸RXQô3“%€8±Ô ˆÀL*,^þ¸U”¯¢Ä]ÈÁ¦vèh�%0âY¼<Â3Þ" RdØTÀ»²7-·zË–y¨F—Ø£Y-Œ—ˆ’cÎÕ ã¨©%½c%ëì¾iàøÌb¢‹Ä¡! F£‚Á£¨‡†ŠfЏ~´ký¢õ¶‡UÀFÕ +ØTë+C­€Õá[¯H†•Úaž�Aˆaþó:(Ì3Ô +ØæC†ZÃ.ò®O)P‘‡4¬î%DIûy¸H�cˆ.Å…Zi”䀅ÉaæS€ø^°‘Ôx +CàÄ\þhc�P+�‰ß``Â,Çe(T+ ¸m&¡X³6`èµølüój6JEÎ(Ýà¤ö�¡w$. 8XX3Êr«XêC >"´ŠòÁx,Ha§õ“šI”�!t Õ„“!3§VÀÛn&‘«ÁP8Ú„ †‚ÁJÅ3¨Åî¤Àí$tµSŽvÂÉN°“©uR�lªSìâÈÏ‹8Qn�;ÙD5‘Žf› ™¨Â‚‰* ‰ÕUÀg©DðY'‘‚%Q) v4�l£:­N&Õçí,¬Ô�M\JB“H*ªÌÊ�jˆÄAt¢œP+ »¢Ê8È +à¤¢Êø‡Â +a<(ÇÁqì2”ƒ‘£ÕPÕ‘ +b]ÈäƒH¡ŸÏÑèJeP´‘5�CƤàY�aëF‡•!Ô/ �Õh $tuÐüòj`~QÐ ‰ O˜p$ GRšI…›‡N”f–löyžÈçá‰WÆ4B‹cŠÒCœ(hˆ ¢p€ +ÇÜIÈ0ßÇÔ7Fâ�Å<”ë@X<D  C3]ߊ ÐÅ‘7úyŸw£|^f +XRF§°Ñ:¿á‰ù¢Ãà˜�QÌoØyÏíbƒ™ó“c60ƒùy aR°ú¼Eù LÐ5УÑ%AD�.n‰ ×Aµt@ +‰ gç@²DÄ&JÀÁ󲺉ÍAb“,Bq8…§rãD@Ù3Q @ˆ(,Žòy%ÏBµ€LÐÁF¹ÌÉa$âr“˜KH¬ªw@eÏø¸.Seëç…Ÿ—kTÎEC@šYFbÈe0Ÿ±Ié^;LD~ò6@…Hž!ó}ßçÉ^·l´\€ gÓåd8‡™Ãë&Ó½dxå<œ "À ·0™|<S@`½É#I¼™«miÍ}ÛÚì}ågÜ·1mÏýßÒûûoÿ÷÷üoڳʞOe[kíÿ¿¼.ûæ¶w¶nù¶ÚoÛò¥Å-Ÿæïë¸å÷mù×i®¹oË·Þ8ãÙ¸³ÏÎø+m\qcoŒ_o,{_ï{7Î}÷µ}ûÞ¶Þ¶±Ä¶1­]i­XÊoLÓÛô3¦ŸKk_¯²knê×/ÅÓûµøÓ¦�ñOÚØ½Ê¦™6vÇ=]ÖÆ•6öÆ/{zc¿Þر¬Ô~¿í+çijo_o;1Íßözn:ûñíé’öOÛókOÇ~û{ºçþY{ºì9óíé6KÚsNûù¦î´§{£Ìý÷ç÷ž³'®²iöǹmþ;iSŒiSé¶)nš›Ê*Û^¿ÔÛVúmgíÚÖZÛÕv�xâ®Õ÷õ‰o_{­­}e_ûz[ù_½­½³ïõ¶ÖûZÿ¶>éKKó7vo”²¯7ö¾µ1Ƴ¯_{ŸöõÜØ;KÚwæY;Ͳ¯ãθ­ß�mÛÙ½1Ï®�;wíì.»ºË®>[~WY[~õ®Õ¿«lÿöÇ]%mÿÚÕý¿«ã¦îýŸÛölÿþ™o–ýí�ël/Ö¹å7nPß>î›_Lûþ7öÙ×½X_ïê}?{ã9{6¦ýžqδe�ííž1né¶ß6µ-�ú¼õºÍMsKÿ®ŽgõvŸ³«Ïv÷bvvukÛ}vuJs{uìýÞÕí�ýÞÔ¥më.gî÷›ïçZc×Î¶Öæv¯•ÎvümßÖŸ´«?îÜÔÞÚ¹g®�eûÅ�1îüøiKŸ·±Åç–}#°÷µ÷ö»÷zìí$žì²ód÷fÞø“ö•}ïlì^¬óýÏ�·|/ÐYNÙþôvö·-¯ßv9>ÎíÞÿýßÿßSÒžýý›Î®ÞÿRRÚÿ^LfoëÞÿ?Û¶?½íï}rͳ­¬íï�_ñlÛþ³­µ.Û¿Rìm=w½U>ýÚµú·ü€Úµâ�µ][¾7ÎÚûlùm]Ò–Oë�}¥ý–ï2wÎîØÎÎîÅrãÆ7–T6vïÓ÷æ:o߯µ­_·µ¶ýL{omë�Óm_Kûö­¹­[+±më^¬­ÏÙ¸-•õ×{3®ùÊÆôiíê÷•Ù~WÿP¯ß·Zì�¸¶uïš-–]=FoÅSvµµm–²ëßÚÖçýÔ¶ž±ç¦î�ó½¯ßÛÔñµµ/µûœMÝ‹Y<ýs_§÷tŸWâžž?”G¨7䑨�S  +%ƒ‘žª~€4("RNX<4$(‘Eã€HCÂ`ÆQÄ�$ˆqŽJëH±ý`Áèwöë+PÂÚžžo„¼û g|ô¨ l“•CA6ã˜ipršMì�Ž(ã•4M³€FkÖ6/úL6Û–òëÏ´–›Ë´hÞä¦nï¶ÑòG‚(*äž­‘{ã*~sIp«IT±ë¢(º `]¹²` °÷ðoZ .b(ñ�¨R¯«¼á¥´ t¶´Dc<ãe§¨ke0e¸!”ãÀù$U +Àƒ¨H¿T_ç;4ÔœU¤ç{1ý_J¨͉ +KžÒ(uqp/?‘ÞšO J½âŠíW>™ Íåb¬+U·H‰Ô�ÛÉ]²EøU§ý&�‘‰½k$âBgI;MöÚ�tX´ÕâÚT>íð’RN?TO¡=i/}�òµÕÞ×èO^FïUA5@-&ΩE¥ä=Ó&¦Wù¥ÑcOú‚J^Ä,D'e©^[1 H,‹,(áŽƒŽ¢s>EÈùQ±xSŒ�]/\/ L^¢æµäj¤ó½ §WU?® †{9VWÅLpE ’EjïEjlý³cdm&–³|Úóx+ij֭ï �7�¦"‚6a‹WIÏ` ÿF¥F$ÖtB]�ÁÒH=\ôG#×èÓÁÇÈÆÄX'(«æ4VK¯ÏH¸o<Ø�:£"!äÔ$…­¶œÌ)$—¹Œî^�tg_›šv�+覵Wtö3¸)Ú¶ä)ª�¥ ÒÌžÉäFè’]µ.¤4Ý.”yL¸t_’yðor—°†ÐÅöõLCU&BaˆßËÄ|Œ�R+ÈÝä�uÉ‘¿z:<–ל;# ÞësqÇ.3@Љ©0„wAg~I_u1zÔU³IÚ*“^�‡´_J(.žo ðþ=AúIDV·£øs$ˆ ¤æíäžÚªÏåflÖ‘«ÑÔ1KÍÌ�ã ×ÞUì‰+Ø™[TIc8ÇǾ䣓C¥¬W„DÉhÅž–ÆÒަ®œ%Ö°fŸ_#üíhÀ7J cãæLL3ÿ’ÛÅGÈ(uŒnF–Øgh-²íñRþ¤Øp)ûÒ�ª$ý•6ÛÍòZ·Ó•ZöZ,ëe{yÿ’�Øið?þ]ËWB©~ AaÐ׳޴ |±ü!¢V‡-'Ü!¡XžÇäð þ’ è%6Z–*´|ÆÑè§-¯‹@ +¢ŠC¯j….¬d’9e»6HŽ8�pò“9ôb­›o-'ºø?àˆ„,àßÃ'H—D¯Å…^ÍP‘Kª"§Åá‰p�Ôk‰³s?x÷=ƒÆfÜî¦bD Ñ 93ùí±f¨äý¿Ïú ›<ã6Q€DšÍ®· ¬.V’RØø3˜“Æá«WÎã.óÝä 0MB¹RY�W¼9Ú@�øtF„K¸½< í»–í‡ž¯J¹)|]*fD‡,ÈÄY˜B•²�{õi‚ë<Ž9>¥�5”´Ñ;IÁãeïbuÌfÇC¤rËg:#'u)l†´�½âni­‡ÝË rF5q +Ï®ÿõûDÄ¢MVLÝ®1 ìí�4o†C!v”y\4CV0<º^,ŒQ}‚ty BmáÄ¿uC«‚ˆZ~7b\€JР5”3€ÕbñÌæÔ¼:ü— +%€¢ÕIÕAÏ× VÝ1dûepŒY캣 +íA�Ĩ4:c͢꣉%±¡ãP¥fÞ¸¼ 9:ìÏ/°©®Fºõ•±éÄH²«ÈðM[©©–mh\쬾�s SF)þUÇï¥Df�K ž^%VF~ €rÿí\Æ„/0]Q}Äþk]�»ŠJiP'“¢º>¤àP¶¬H0žqAc~1‹\¡_Øø¯vhDÀúÑCˆÂ«Gp³ÛúÎ.zõŸàp^gìæÂÏ!q>êÔTuò×–»WÓšÄýÒˆ.Ö¬ëú½§ I»üÔ˾[ÊÕ Ù��È^J`Ó¥AµûÆóé|Pá–ÖŸoÊbiéIŠmãÎÍK¼G^oÊ�(65«÷1’wú;^æØhùê‘øÐû�ûIoÐn8�¦§fk¸a}¯”Ö@$�éµÊ4StÀÞEúe¶ÂÁ�Üázß›nÍŒIë]Û‰ƒ{iµÏ²PM&ûÀ‘:»D¾ŠòÅÜ…éi´Ÿ–>„ûÎj’±Ošr"ß.¿HI_.&}m¡å�sqD<- ÈCþþlhÿ­9CôÓà÷ŸËg§‡Ÿ;Á‰<=ÂSÓ¥|ªÒë¨q¨?f6eÁÀ»_7ðèÎlB¨8'¦Ç5)6½ëRÜN5*‚wÃxQh‹‹KîïA—%3×\³¬;Ú1¢D·Á¡TÅ}tSrRz¿A#ˆ¦òº`2À7÷bJ9ðׯ?”õŠ>î§X—ÔÏCWá5οå‹Å$µ¨3ið<”¨ÐU˜.ƒ%fw) g° ¾1�YvU·ÐBó­´Õ‰õ.& xéž¡´¬Hé��ç�Ñn_0 "¹î¢§âך·Z¯ źßMKë–‘‰v© ¹Õv©C&·éHü¡+•ãòiõ ç¼”ã‰ÅèöC˜¨0Fàþ¡ZPåµôTŠ£þ+•{“G±é6ëÌ*„˜çSQ¹SkÜb‚çyRSë*;BÁgf�]+ m[UäÏô—;gà °‚€j«É»@‚Äë|–1Ïe—À> +ü +ÊÛ ),UŸ¢ +.`ëÎÆBh®35ÑVÚH޲>RÔm†EÒ†U¬O‚INëõû"XÌeŦ•¥aò�8 Y;dg ¤°$# ÝñGBQ޵()Ã2Jø†ÖS¥«ÁPVÏ&ÈgÄl*NºP&A7KÝŠ|,½—Þ)*Q÷rLºÓ.ȹJƒ;ð¤ ?ÒW5öÂ5®ºÜR˜•˜P�Ôb2-•¬L5šáYå=ÄzØê"AÀakº¦Â NRP\NN œb3F{¦P­¢P+®HV©?¬Tõ>%Ú¬nõÜ•^Ð*u†ŒÚALц»Ê(Ô)ÊSZÔ@ ýÿŠL¡J§§œÏ˜"©)Ô_j›œÈãtÚ25…µš{~€cëDûãp¯h +õ·Õy¥¹d¢u|´£ÓiéFzÄ’©ÊCÁê<¯ˆÅ%ãI½Ý1°$ˆ“�d[$¬ÑXTâ*Y|8øtÈ2Îô9 ûF_Þ¦j&)Ù⥔ö/¦É�¤Oª²jNxq¼{‘ÏÕ#ý�tª×6oƒ¼î~§TþÕô}3¨gS¨²y\{ÍO(HƤ¬Ü-`N®ºA.+(™^CÌ +Õ¦™—ìïðj\ô¶24M(iU)Áûö(†Li´oM¶ÞÀ1ÑÇ‘t ¶G†¼Ï+G¿á–ƯSé†eâ-ŽTÔ²*®Œ¤8rzéR‡Ì Å‘éà8’Ö]æBÒIÚ‘3²8r_|z üy±GÒÇ‘Õ÷)ŽÔG6#Z’óãÈöR)=Žìú ‹#%�ç8òð×ÓP¸ó¬[2œ²e®øæÕ¾û….Ü6iÿo¹­Š9fS�D™Éù×�×8pg¥„ÏaÎ$¬Ó ¢³2ík¥0aA;" KþÃ#“£Ìëû<©áchs“´„ =ÚŠùÊEÌ›ØË]üO�å|Âx'u|J™Md�'4)?¿“âÏÄ7è�¨YdC :rŽ'ß;U†)_#nM·4p© gÈg¶ tËOÌÒwc�¼Ô¬¡×nF9×÷+œkÿ`ƒy¹,f$mò0LáíG»ÅWŒ Œâ¤*þîÿ»GÁ¸`o[÷Ûç 9!Ÿ{;¡¯˜¯˜6úç~к[Õ¤hMv).¤~ÉâÎtŠ’C톨2ú”Œ)—©"œÏñI¢š"S5='ëÆÿ×½ñ@-¨ƒ(÷×[ï¥^â‹s@Né7ÒÑJâ=cý”WÿgΚÛWp+¼9+:9ôÍ-‡Ör`@¢äPèr@G7s­Ke·“»»4b‰A„·ÍlÝÂѺ}–’Ç8[œ"ãâ‚y7 ñ²<¼²ŒœÝvî;ZÎ3àZ#Ó‰°ß£�NÄæÇ ’0#xßþŒ„=~÷¶ƒjT?¼Nêot7¼¯'=éèÙ� ªbq÷ ^\¡ü°ýp‰—÷ðNšÙy%êî.¤ +nómÉqÓŸf`eüŸ1ªíáq@ë9ß ×�’”–öf÷Ú8,érµ¶;kÃ홽’¤ŠdA¢8}àµjðNÞþ‰UC¬¾Ì3?^‡µ �Ì8狪´½CPž8©‹€ƒ—2óØ™q" ½‹ã¤ºYÛ ß'u'5‚ +ЪÉFŠoù RŽÁx"¶KAIImo‡£NÑü» ÌÃ=›gI(6šs¡¶µü«& Õ'üŽ]hØ£4º7¤=Fw³6S¬€~L`�Çk,„|YyŸïôבl'¹·¿Õ ÕEª Ä1~¿ykµÅ2[Tb¥J5¢Dm‘²w#C½“�9F‘eßD£)M‹¯¤cßÀk@8©~žÅtlÙ¾”)ÀT¹�‡gã�íN©5d� `[Mh:‡Žl�Ø + ßò‰ÝÚš÷É3Pf:ùD“|úàÂb¢Í4cñ$®ëÈP¶ên¾Yñ$}ç\¦Ù•Wy—ML~$—Þk =^{3�V�y!ÙJã‘̵*ü ix°hÞO¢~ •ײƊHïÌv"Vª%e¢;ÜNÒ›eD½üôA��Í‹†@v]†™Fþ²£ ç[qd1““…�þ…ðÇW&‰ñ|4VùX�è¨ß¹“�ÿè.c¼xÃÏòRÁ¬ø«‹/sƒVêÁœ´ˆ•c2pà…ÑÌ*…91“ó·.à4E ù’sºZ+6·¾tAÂ2}¶–fŒ}7¬²�4"úCÌW{½[hAÜs‹@¯ar¢Ù±ÆžÇ4,”¦(B¼?ǃP„ðûp¼lƒ2ºâ­ÇòŽÙîúöï¿×}-£í°BÌ¢²q ÌÚáƒ�>¦µÛjÕ‹—̓ÂΆo +qƒõ“JÌý›¤¬Å);®T«³ö“ Ø—Úþ2ìy‰)îë{r?”Ÿó»ŠáR—JZ+1iLœ9«”Íç¡,“Š›¢©òhvÏS ÂøØo*+�N…ë4Ò«iQJ®6qu¼ð•·P;¶ºDѨ›ñ‘Ü�ç ¤ga¼&väy< Ë–uÜÍt´¡è“´³ÅúØ·*·U ¯6âÚä‹…ë>òòîëX.÷_¥¹X×r ñ ·‡»“ˆ±l½aPOæ`¿É¼®Ž¢¢�U.‘PÈ×]ˆ /#<ç®õ�¼ JMGÚµn¾³¼Ô&¯ BÍ/C­&)h®ƒM�ð²%lü\‚;)-‚Î}ñßR@9î¶.ƒ(„A^Nà`'~uH{�Òû€VÑÈá‰ê¢£¾•0 îøú  Õa#S]Ö—쯲ÔÄàR|sgÛÃK½ëâë*Šäb4o Ò•´ê1c“µ6‚�AQ‹ªˆ�©Jp’Pgt›í¢vjèRü~k—¶!N£$‚�c³!/°ž´Íׯ–Çž§À%U= rÕÔŠŠøp­apRO=×ϳSY>x?jéÒžõÚ¸¯ÀJO6s®�öÛ>´¼Ë +©0¡{c‘|Xš• +Z?$tú1¡kÄÎsJŸ`Üa©õGþA#Kí�šÉŒ ÝÇ2Oz_�q€ +ŒG"F7s,:ÛÐÿ/‹ý,Á™¾buèìXKGB‹ÆÍ4Ór]Ÿ\®8•aרO8÷Nž-+ÏXhêAeÈ1ûÝŒ ¨_“V1Dt«ê0�XÉÇL»GYjMøÌ^ò6g]Cj•†ƒhx‘—ÁbL·×�¹�ëãîÎXA ´Ï®\Rs2ö³`ïcžIV� +kÖÕR“WÙê§ù&Äp ]ejrStdˆæcT + wÖ�º P$W4Ÿ³ÉfC=LkÈ'5#"OµÓ:î%(ƒè­ ŒV”Añ` ô©‘e=M“ƒgàI®U d¡"È{f´M^ÆÐB)­Í™þ_µßØE “ðë} &½ÎãiWâ9:É0‹À 2Uµ¶/n§f{*“%[#“*_·Ü86„ �@6‰�X؆¶Ó?ß+ƒ9—ÌŽQÝK 1ò¢éeC¡“EÈ>{½üWÒÊ´ ·8™ù-#tD,Ó½‚mºØcêµßt€îû@5ýR˜IÕ_1ý»,á&sïútWœù Ì‘‚„Bþ] /Ë/c˜ôþ]*Xȹñæ×yjû¶k¬gq{s‘ s>c"åýOdë’î8ÖREDdưáà¡°§®yóþ’º–ºˆHÌQ â+ÿz¸ky1”ˆ[MaÐP@žQÿGÜ…·…E¬ŸËÖî–'âæ1ËC¿!­úŽj¯Kí�Ö•f�ß>%¨-âöõ3¯�ŠÁ�´âqfõ”Òޏ«Àø-§¾"d¸òºä—Œ±T»áº}²ÑèýhÛ¥ù ºäÈÛ^!Ê¡ŸúN*q:t*ÇŸù²Õ¤Cÿªõ±óÔ9tòhrýú±­Nš‰–Cgˆ0/(ŒðKÒ×¥[®k‡ÀLz5qt‰üw÷�‚�÷þKÝGxŒfd=S9�.(ËÐøÂÖRûZ+ñ2y\ @;i*%Ì×ö ¼¥„ÙU^ú N #±ìR´ªa@ ÃqÝ©ñU|?š „9éBŒ;Ð7þ”°Ô ì/zà"ZGˆR.~“ã}ÁXOGKE1þ¯ÈšKÔÇk‰r~©†"Á3Øž˜`Ù{ +T +C±\þ ÿÓðÖÚ,¶ ’ìÀL0oÏaóe¶(YÂø%=Ÿ“‚q©ïÜAB1&ß –—0è4¬Øu¦L&bˆhôf z!Ò=g¦20®¾ÎÞe8Ánóqq;;7…!œ`Ý4õNÃ<‘ÜqwdÖà”C®P'u%FáÞoèE''*ÔcB)ežxD€X=´'YGåمƚϮp£3�®Yñ|}�žƒC>t ÿ-:e¯%v[¸ûÛ=±ÓܵÒÖa~\>_²°˜ˆ +áWa|pø½š`‰RMe‰‡v á}„…Üë°a.&bQÊ‘ò†µ•.µLLÄÝ“#•·H<ÌHöËö®ï3mÐžŠ˜ˆ.NάX]Sr?Ñp€¢1Z¨ƒLo©q&èâœ2;òÏŸ9ŠsiýÚ%�—0�òl�ø˜®Gd:­Ïð÷œ)ìåû‚Û?¿ÄÇ|_ÍMq-EX“_3_k9ðàq3=½Õ,ù‚ˆ3ˇÂpÝ Bm}%à‚ˆ4¡ˆwȹã(t1å L‹ûÙÉ"ÿÓ¾ÜôÔ-^êü4,æÌÖK€¾j‡ÅÖÚ¦A:˽>Òg$€aùù¤™åÍ?¶Ú�WЪ«#]¥ÎDTÂD³¶Å)κtƒˆ@®Dn]±×yñ‰@'î÷Ñ9 KÝÒDôÂOÍ7þOçBÎÔ-ñØ®!{O·ä‰öT©[î£2¡í‚ˆn IÝrŸš¥nYH¶‡ÂóF3Têp°ó¸Æ6—˜¦½%€ùáøM_¹+Ú¸J{·–ºWz¹ì "JŸ„—u©[zDËoÀ@8`ê”XytD8‰^) ? wÔâZU¿’>�;e‡Œi§nù6õªðh][O¡þ<ªøtCx3n®Pôû7R% º/1E%ÏCfÔôÓMÖ·G§,¦[‹È›Áô¢ ¾=*"]!ÍOˆm[±R @­év[‹¦­[Kÿþ㸡áyý„ˆ‘Î×%ññÑO&»Øè4¾ÅÑay + +Af™ ø;Ÿô‚B44mÖ PÞOß4•Ôsåº1Õù A# â!ˆÞÿÁOueíACO»ñgËWîOˆ’\SÆ£›™¼?!œí¯0-ùµFä¬c†î‡¸p +t^u>»ÿJÔŸeo]Ô¦×Á„}½fâmÙ�†Qyá1á'„`ÅÃé£DÝÕYUëå'ÂsXà +œª.1ݘç\tfr@R �¸B‰ˆ³0- ú ±�W…fIðŠ Î/cˆbðV�Ds¥eJç'„w½‡úŒ4$8(Ä-3¦Ÿ$O<ϹÎÈÚ,C_ú‚¨Ü-ƒŽ !úòÊû á_/Â,�§SʹäŸè>ßýrgªýàj">]ÆRü ±5K(pœA!Ü œQĆÉ2«ÙBPS\‹¶î(ޏJ’GžëexÙÔ%ŸúÀ-e5w$�³^la"ïê Òz–8ù.{×Ë”Q§+O4µØŠ+1ÝðñÌ[~B¬™$ÀqxA!Ìÿ�¡‰‹ ØŸµl"ÈMy³($Ó%®…ÅÔZs…ÅBTg’Ó‘°“Ò£ú'„³^×@89lB\Vu3�K[ˆe@þ„ØkêN·((m^·$˜Ç®ëþÝ—®�Vœ VX*…awü„�½'µ2'¯mx³b\w†¤‚B˜[R \´[fϨSø¢Å£ü ã'DuKúÄI2Lîþ„ ê ¹‘®uñ &(Ä{–£—]‡”º‚Ÿ•ß ){Ñ€= +yðf/u=œ�qË*"“l&UÆ?!º¶qí8I¡zþ«±[÷ÊêÊ¥?!šjƒsÞǶÔå ø�Ü>ÊN#q©ë¾íþÓ2·Ÿу*CÒëDë8‡XQèvW¢MžŸ’/Wh õI~B¥íæ §§<À m~ÌL•šàxEÀ‰êZÔûw©¥™5�ɾh<6œpýU¶¡y.>Àú×÷æìr&‰ƒ˜Z™U4’Doa[‡+ 0,sþš®ñ ESk¶ÍcÀvR¾D]^?_rÛÑsòÚ'•i!ÜT北ƒ%¼?qLŽÎ½…%‰uz.~skÚÅoÆ~#—cî´;ÌWÝÑ”Ÿ™°�òîs nÐŨ%©jQ�Áuwü““îŒL98<º�3÷ %�Øâ¬zzž@[(ÍM/RN¹®¯Gð·¾ÌßÉpî ›ZËNœ~¦íéi�=–Œâ½éû³Ü +Q3eæ`Íp¢DEGnÙ¿e•=æûÀfJ+§ø\k7×à* cûAè‰yE·Á…_±u[Jåvã#%¥ÖW4–!ÉD²Ì_®ÓY¤Ø@—äF7KY:\VZ(–Óä]‚1a® ‡AìªxàÑWfŸß×I9Ë”[0ß'4ɈÂ}Bnˆ1¼:ÔKzcn5=Ê-ø?°àVmªQ*”[ Úù1·zÓñ—r«¬�YlfÃôk[y˜ªZ¨I¢0· +”w¯V΀ރi˜¢Üêo’¹؆ÀÛ™¡ÜÊ—bnµ«j!PW«Á¥Ý1·Þ§rKQ/ ™[ÒD‹žËB#o Üêþ<øaïHà/%\l¸Büó 쥧ßã®mâT8\Ìu˜4‘ʨ'¦;<#{”(œÞ@55s€$¢!EnùÁd�§uÈ•ÖEÖ�ˆÒ°‰4{hÀMâÐ�:͹[xqþ6© å€nnå#vÖë±läŸ.…ð…% ôî|fð$‡õ) 4Ú£…å×ïv]�k%ÐÇÐ}±ãTË4Ùòbœ@{ªz]*UÖYàÁO Id÷ïr•¬=�fÐW‘— 4°+‰™hÝÖ‘\xÎ�Ú”6â•íÅÎØ>†EUW'ë N’qÈ8z¥ëù™ 6îáøÒ‹ä”µt/Ï�Ì(GIÆ ¨hȘ¶•Œñ)g�cœ@L©|Ÿiì˜2ÀEh¼u§¼‰I.4uøuUöhǤ}†p°cމQ¬?qöY;f¸lÁ€—@D^HÜØ1>ã%e½r�{H[sm�[†¨Eú?Å8Å–5²&ÈõP’œG̨aý‡Pß1ù¦}9óÜ ßDŠÜŒˆÓ@K ºTÚí«€t5Ô wÛAŸ!dmÌæVBn¶„F-‘¡YÕ{"“óß{4­ 㾓q9¨H$±ý§ŒÈlÉ6‚Xt�A©?†˜Š ×jÀ?¸ñÐŽI*O6V9{AÃ�œYàžì9®UMlô�.cVµþ‡ i?28æ@û¹é<ÊÔBÐ8F“’mæws­îJpTÔo (–'§² \šÓ¼uf³èáyÓ=&çáΦ^Í¢>W’†z hNÔ<�Ó .~' ¨AÞ\2M¾'c¸»¡Ð øÁÇzs˜ˆFÛs\‚;ºõ´åC)‚8±öª^]ðk´"ø•´(ÿÓ€kAi¹]H·ö ‡y2Xµ7Ä'•ño¶ÞªåI2 m³­‹I“~ÞJí…˜7äÍ(€9TÙnñX„mXÆÎauç– 1p…FMŠz³,„A Ù`R¦J¢6's!¹†¡±öPMø"ƒAÓLÓbê^„¤Ÿ·Gõ]Òbä—}u°+ˆ{�:[FŠÿ¡@”«øáØ–î~äU¶ýÉD+ºjSÿ€%}sà2N¦€äʲ¯@É#}g_%åÖûʺ3w¬ˆ“ýMpz ä4o¨�ÄN÷S„”¯ôLJ‡Á[)í”2—�hõì«Øè)ÏÌcž­¼ìiÂ@�ó©kŽg”EN1ó„�¦"ÊÏ=3×ß_ÛÛÌB&êŸ�ÀK‘µ|w^ +ª|–*®Å‚¼ò²«üR‹9™†8Þ‡ +µšäaÕÿÁ±[‰kù(þƒÈƽ¸ê\à, XéÕ�ŃC;®vJvEBÙ–ñµY¯†óÊ×ö.ø‘ÍGH¼ß¡|á�]ãa~7»úw†³»<^µ˜“É ö)®Þˆ±v!¸ƒjóBRÃØzT縑Ñú½ SZUº¥ à­ì3ÝÈŒŠG®´Þã@LÖ›æ%Ðz�ÃR +ú1½ÇeB!+§�²€ïE#ö=Žó-NŒÝ[O +ú‡I¶‡¦ýòÈ/âã*•S6zÑÖF��ô ×uv}Âêëæ¨ÊV–_‹êÌóéA”o‰OeŒžQ�]”guÌ{)½Ïš�Î{ËQµuŽ¢â¬‹ãB‰×Ú9>îäßêÈ›FÁÜ{ø�œtK ƒÃU}írTÁTuö§{ª`ããjRÚÀïqÜ©Ó,«[ïq€Éöï5gh{HæµpW9rxïÚ3† ZOZ>–·�æ:Oš©ÊUɧ$V2ìiGïq£Ú´!Ôv¨'Ç_ÑûVŽïó¡=oXû™�UömÀxC³½‘ÎX§Òè9¡—‰n4ɼZW(00ÅóhÆYx£5íKDàÄã?�'”jeÜÝ:Àr.öbeVFá o+ÞyÈÉŸ±N¹²éæ!YýY O¹:;$59ü< Ñ”r,@ÿ ¨îàÊ™{ zÈ%¶”.éÔ)’Sx£�ÞØ{¶L9úO-‰«Í•sG¾I5\VNk±òM³B 2/ä'±¤ê $3x‹—s^?þ5;èU¾éN)“‘o¾¿&v¶�Û äa‰Sep驟ò�xÂÐ(†Oêg/8ìtÄ�–ó`ƒgÂcÙ)at:ÎhŠ%äógR>z´©ÇäÚÈ7*M{F‘ oügMžG«¨f�°¤õ¼kÂYª@.C˜Ô‡‘À!’PÐ1c܇àò¶C»t¢ìSÀe¸„be/ˆ%·ªrÇfåàì§¹¿Ð÷–õÄ\ÑûÈýwíµ�K§œv¬9ÃÓÀ©D_ºŒ[ŽF’szêhø+¼+q 媆…£o^¤úŒ¥^j5`³-}8ë nC[¢Þ{Êå£SêÕ,€³%.$X‡²ã7ÞÛÝÖ¡`¡:h‡xð™C6e÷×å49›F¨±Xø*ÿ¤T±€¶: /¼ûEæv¼Y6ðÈn¦Í“ŒoOËÍü~uG#B¨¢›ófsQ£ðQàšI›oµøÔ£c곓FѼµ_�ô•BNg`ØeáÇJL”y§Í+]¯ ­zye:{¢·lt¶lg7Ÿ¿K�bgTThfôXæ†ÐM�œyŒ�‘™Õé¼´ÆÍ7VT´ù?Ö¶OÈÌÍ•—›?$m~¡°bn~¼½Øðçpm>²¢_ ÅÍGX'm¾�Ô¹ù”om>xàgÁ͇AÚ|“ЗšÃ(pȪió’ææ/ ý/1Ǣ͇�›/œy>ióQCàæ¯"{yY’Òæ“ )n>jø¿Œ6Ÿ”¸ùÛâe¦Í¯À�¥=š›¯Ôæ¿Òrógõ#X›ï‰%mí-›i¥8z¤ýÈÍñA›_Nœ�̃1ͤûfh£‚�”˜�´ò› ²™žžQà¸\Ê’ -*)µ¯�oMûˆj^çþF�)¨édÈ¿�kÎJB�iÂ:þk| нµŸZÖ`<Æ´ïÈü‹[¤nÚ—›[d]¦ýIN}õdÍMHM¿Ï•pO¨¾Æb4�‹ŽÜ§^µ¿*~¶œ& DÁ7óy³[Ͱ5AMTº}i„ÂA +¾‚xç|ñ–”1¯#ø7 d¾_ ”¥ÿ)ò ƒÕsÖ�6®&ñdºŠÊ9ºØÖIôLÜ>ëáà躥]SGÜ5äÑ!£Ié…7Ë÷'d6駃Y—£Ë~6>Ö°Chnîå¨g<À8[rД!7ëàÄ3"0e„Ÿápp.Ô$ó +¦Ð;žÓÁ!LÝoZǘ¢byì"çùµHG8Ÿ³›%–ÚWÌ–Lj:ÞÊh?tˆóÚÚZýy´ŸUãK"´�eX쿱Bû\|4ëŽö{ü×о@ÿ®¾Éæ´¤©…GŒöùˆ�N5°íâ‡ÙFžÝ’åk¡ý5$8ìºÍBhoUóI]äY¯–Xá}7 �ÐXP†KÔ›gö ~¦¡ä´²;åWpT* 1˰¼?J* Ð|°�f–ð¦Ap‡�¤NrÜÑ‹ÿƒ!˜úbñèIg‹r¼ˆ²sr?CšÍ—­žT%1ê…á.üe˜�½åŠ¡¹a÷�¼*:IsU‹Ä¹O©¸—ÿÓLkyA[á�™�‹[¨Lî»·.y‚d&ä§èúÌãíU˜"Ù›‰3;åäeäøY_ÀE•çÌ +©Ü)gGüµèû8Ú[ynðêÈèB®_Àè„Ö‹N¹»Î-űV�rv3f³™‡\¦)MO‚LW�Ö¨Íàˆ¥‡ +òS©…%ACíGñô.�ì™>Âmæáé$˜Žü%1•žÁ�ö~Î{,œ-N�!a`Pƒ#�þvŸÁq>(£ è’üü_Ê38ökp´½|Qζ·#Ý*Ï|0aÂ+^måeÎ>¶Zìšàvs¢¬{,øOž@Á÷}Œýùô¨fc,•,„îÕ—“ÌÅßÁE@M+哎㪽žd’^ ܪhƒ àæ WÒØIÔ2ÝBH^þa¯&�x§#ºá›R¯`ÃaåZÄÔEKÒìQïŽNoq‡œ~¤Ç‡T$ %2 h_¡ëã`S½J@ž�aC‹¦¢Ç?�‡Â.F§ŠC$ÃH$£ñŒ¥Kÿ»×0úT�•ÑE3æn_.¿DF°BݵQœÌ=užç·÷€s„ù�C't ~ÏÚ”ZK Ë¥9ð3d·ËFŠÐdÁ�ìÀ_âóý]Á"_6š’_¡FFOÆp"äȆێø<+Çÿ4B²š‹ÎBçƒ+¬ÿ¦v1Wòþ9:\ò Éë™U#j„>!”Бâ„Û ¶“¼O—¹¿zB„àJ¦B©LOx`ù„ +Ÿ4³>X|BÑ4Ì)îGy®Éä>—ý€Ë/¼ih—µšQª&ñ_þU‹íÛTãgœî1©òD͹ã¢`kÆÌFVfˆßd†�©h6òªQQ©¹«c)NE­1kgÄKæèˆC·ª>=¿Í“�rÿmÊ ô)#n>¤†ñ¤TtÐÚ\H�AÊ 8¾+ZJ2–ª\z›8»¨ú‘$~ânãX8Ýjy_¯üÄ|Jº °ä½õuäž/óxö7Ï–?=²î^oœD´úÊøñ7I²I‹k¸8N ôës“™ê²Î8œa2Ê@L^È(¶é¸‡í&®$&y€Ï¡‰›\}ÿâ.šTaxŠÍƂ֦ˆU#˜üƒ³ÀD€¯õ™duÊSãØÁ«@0GD©|ƒÿ‚¡oÆóÝ;Ü‘ÊÚ:æÐWÛ-5ÓŸ_¸g~Zœá7 ö æ‘èt-n¥ÅDò 3:Pi¶Üžá¶§]u[\iž&Â/Qå–íèà'ÕQÜìh¸Ê•6 J&ÐU±È{Å`¤j‡óZ¾ÿ Hܦ/;œ>ÎÓ¸ÿQ\1x„÷g“/h•p¤”¯œÈÜ‚&¬ÀÎOשv:ø@u¢G|¥„•aj�c³0¿f¹í½‚�ôÕ§Àøvk‚±& #¤�0Ë�âüªíÂ¥´XãÃÕ쫵n“ÒÌrùx6ÍB¦ÿwÆê™|…Íß�Î0:ÒK�1¥É42úÄÀòjh×½¦<¿çg6£3óOž×½±âýw_NÃ¥+ý:èTxoæ¼ÇUÂ:1…`�{„rCÿ!F”[[¤ é�¹ŒY�7æ­}ÚÄþŸ5Þn *FeLd<¹BD}¯p�6õ¯y,>,{!Ûo}oêäÚˆ©#“ÿXk{ù^æöBFHË(vݱ=y™É «4T×·:¡åìCÊó=òf ϰ֮žEÒ¬ò¼Z_AjíVѶ¦<–ñÀüêLÛ蔬àEU¼Ò‚]Ö·œø}üpSÛ�©væ_Ã<”¨H‚ñþ:ÿãv‡ë�rúÿÊ~“9Aï+XéPý£!‰›"³#½z®Š¹\;!£Qþ¯ÿà†eæL†yåߣÿ÷|†pgj ¹âââOw벆�åF�œ‡5�€Ëš‰`’+íDÕ¤o¸ìTm“Wq¬”�_Swõ²:f�¶jJ ´”c6Y>`Ï@Fb“õ¸­X‡€šm¾™4D»ìÙ\Õ’È ý­Û4"€cPþ[KÒa +$Ôi5çµ{ÈΓ߉$ñ¨hz9Ä13K[ÕO&ŵ´U—*«\/¯'RÝKÕh ™™�]¢ÝÇm[bp´ƒ-„Ÿ2ÖæÚï®|™.uŸû �/È |GýµUà‡ËãöÁ*rä:„~¦À€pÌñÎÄ­â�S†b ÊåZÉÆD¡X[¬ìk@‚¬…Æ�Z–Úª'�õqÜÚß`hkÊhÊ££/±I&ÕŠw«£B Ó“™Š¡i­±€RFHH²àûÉÑ€dXiÞöE¬æÏä�/(—õÑì,Š1÷\'NµUãàÝdŸOúrPÈðöž°µ7ˆ¨þ¶å—f‹⤨*cxÛ�7E<#� +—"­®¿IFéTð@bjB_•”ÙhÝ‹Is[žáF«ËøUi~µ‰l´Ž0À“e´Žm¸�V¢¦WQ­­•Lxª#«@qÝwªéðÔ9ª ¶_C÷‘¦5±´f¹¡ô;ð(]xà¼üÞ±ßÚ©\ƒäKºÑ€/Ä«V9ŽòâŽ-ƒ’tRâÈ/€e¬ˆk›I˜¹�*ÚÆ£J–¥+Våü€•Ë? 0ÒQÖÌ™HQ•¿²œÊ'¢ÒexY Ýfsï +û¬O‹Û×á$¥#¡× v¿-ns�üfˆsë]R{‹bÑÀïâT¥ÙèéŽ}.·îO/Ò%¤å n +ÛûÞado¿ä¯À¬°ÇàuÃçxÚ®ó ¥Þ2Ïý wˆó$¦±',Ã$�¡:›Åì 6úÝï\œŽ’^}ÑÆÀ ŒÏ1ö½ÄðÆBo˜xÂifØR *–å 9/±%�2Hþ¸~Qò µA¦4Œ¨)¼{¤áVÑDA�oµ ôÄ ŸÓ”Åäx�œ‡Þ«éÿÇ£Ý�°“°1k„œ,Õ�m´8(M.äe×Á }h/°°—~{AÓ„‚£¬„"u� ô*j\„0²™°LA%ù…r!Ë$³wË(ˆVJlÐß1Hž€->î§ÚlNÏÕ @‹B^3:@¡n] +ŽmƒÑ‚£´~„J=÷}”¶ëkÏ2òß(ïâÌ’Z*}èÚ®íóNãÈ?‡Z@l2Õ"ãÃKÊÛ´p}ÛR�t©Ÿ1sð)½Ö‘_(RöHå�FÊy/­H[VÐðGWN±ªq‡LdjågZƒeöà/ì-JÞ:%�™¾‚�¨Tó÷5¤Ú]Ï(AÔS™×ÎΜ€j®ï ÏæØ¹$û’(e8�ˆå^4N�$Ä}.²9/žì^¿@Z²´ØÁ8Çøz'¢Ž$4#¹)‰…>î?ÿañ×3Ö““&bq†öÉ25]b PSª½çlÈ‘Àj%æ�ÝI¤ý8ÆŠ MX65¼Õ50¿ï±…L:µ‰�Q,Þ­¨ËÈ÷2©ù t~‹9)ñŠ’7áÌ£Dø ‡¯©�ªk@{­�CDfÅ2…ô¨%m`1†ó°îÄ^66‘† endstream endobj 26 0 obj [/Indexed/DeviceRGB 255 30 0 R] endobj 30 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 20 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 23 0 obj <> endobj 5 0 obj <> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 21 0 obj [20 0 R] endobj 33 0 obj <> endobj xref +0 34 +0000000004 65535 f +0000000016 00000 n +0000000159 00000 n +0000024317 00000 n +0000000000 00000 f +0000074309 00000 n +0000000000 00000 f +0000024368 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000074379 00000 n +0000074410 00000 n +0000000000 00000 f +0000074009 00000 n +0000074495 00000 n +0000024725 00000 n +0000074196 00000 n +0000026690 00000 n +0000026863 00000 n +0000073435 00000 n +0000026937 00000 n +0000027081 00000 n +0000028569 00000 n +0000073483 00000 n +0000074080 00000 n +0000074111 00000 n +0000074520 00000 n +trailer <]>> startxref 74726 %%EOF %BeginExifToolUpdate 2 0 obj << /Type /Metadata /Subtype /XML /Length 23006 >> stream + + + + + + application/pdf + + + closedhand + + + + + + Adobe Illustrator + Basic RGB + + + + Adobe PDF library 17.00 + + + + 2025-02-20T09:18:17-08:00 + Adobe Illustrator 29.3 (Macintosh) + 2025-07-10T15:36:57-07:00 + 2025-07-10T15:36:57-07:00 + + + + JPEG + 240 + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA8AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FWLeYvzT/Lny3I0WteY7CzuErztjMrzinjDHyk/4XFWKN/zlF+RSsVPmcVBoaWWoEbe4t6Yqnugf nd+U2vyJFpnmixeaSgjhnc2sjE9AqXAiYn2AxVm4IYAg1B3BHQjFXYq8V/Nn/nKPyf5Knm0nSEGv +YIiUlhifjbQONqTTANVgeqJXwJU4q+ZPN3/ADkj+b3mZ3EmtyaVaNWlppdbRQD29RSZ2H+tIcVe c32pajfy+tfXU13L19SeRpGqad2JPbFVKC4uLeQS28rwyjo8bFWH0jfFWceV/wA8/wA1/LUiHTvM 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 KuxV2KuxV2KuxV2Kv//Z + 256 + + + + + + + + xmp.did:F77F1174072068118DBBC5D7230B739B + uuid:c03e9693-7dd3-e64c-990d-7836fbbdc086 + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + xmp.did:fe459cd0-450c-4751-b1ec-174c6fc3e7bc + + + + converted + from application/pdf to <unknown> + + + saved + + + / + + + xmp.iid:D07F11740720681191099C3B601C4548 + Adobe Illustrator CS4 + 2008-04-17T14:19:10+05:30 + + + converted + from application/pdf to <unknown> + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:FC7F117407206811B628E3BF27C8C41B + Adobe Illustrator CS4 + 2008-05-22T14:51:08-07:00 + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:FD7F117407206811B628E3BF27C8C41B + Adobe Illustrator CS4 + 2008-05-22T15:15:38-07:00 + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 + Adobe Illustrator CS4 + 2008-05-28T17:07:17-07:00 + + + saved + / + xmp.iid:02801174072068119457EEAE3A61196F + Adobe Illustrator CS4 + 2010-02-08T20:57-08:00 + + + saved + / + xmp.iid:fe459cd0-450c-4751-b1ec-174c6fc3e7bc + Adobe Illustrator 29.0 (Macintosh) + 2025-02-20T09:18:15-08:00 + + + + uuid:b621eab4-ca2e-ff41-92db-2604c1bd054e + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + + + False + False + + 0.444444 + Inches + 0.444444 + + 1 + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 33 0 obj << /CreationDate (D:20250220091817-08'00') /Creator (Adobe Illustrator 29.3 \(Macintosh\)) /ModDate (D:20250710153657-07'00') /Producer (Adobe PDF library 17.00) /Title (closedhand) >> endobj xref 0 1 0000000000 65535 f 2 1 0000075578 00000 n 33 1 0000098668 00000 n trailer << /Size 34 /Root 1 0 R /Info 33 0 R /ID [ <3C313BF466454C19A9DF8841C1EC0DA2> ] /Prev 74726 >> %EndExifToolUpdate 75557 startxref 98869 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/info.plist new file mode 100644 index 0000000..a75bd41 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/closedhand/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 16 + hoty + 17 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy.png new file mode 100644 index 0000000..21ecc0b Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/cursor.pdf new file mode 100644 index 0000000..155bd89 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/cursor.pdf @@ -0,0 +1,301 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + cursor_LW09 + + + Adobe Illustrator 29.0 (Macintosh) + 2025-02-14T18:12:47-08:00 + 2025-02-14T18:12:47-08:00 + 2025-02-14T18:12:47-08:00 + + + + 156 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8O/I3/AJyY0/z7fSaFr8EGk+YXdm09Ii3oXMXUIhcs fVQdRX4uo7gKvccVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVflfBPNbzRzwSNFP EweKVCVdXU1VlYbgg7gjFX2n/wA46/8AORUPm+GHyt5pmWLzTEvG0u2oqX6KPuE4H2l/a6juAq99 xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvyrxVUgnmt5o54JGiniYPFKhKurqaqys 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 + + + + xmp.did:f5b1c061-3990-4ab8-a8f5-59f728a6e408 + uuid:7bb0cb28-36e1-ef44-8dfc-d8300f17e73c + uuid:70C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + uuid:139531a1-3205-ac4c-a9ed-f7361dee3cd5 + xmp.did:fe9f085c-f94e-40ca-96fd-cccd0cc2e764 + uuid:70C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + + + + saved + xmp.iid:F77F11740720681197A5F59E002FC1C2 + 2010-01-21T16:23:38-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:f5b1c061-3990-4ab8-a8f5-59f728a6e408 + 2025-02-14T18:12:47-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + Print + Adobe Illustrator + 1 + False + False + + 28.000000 + 40.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>/Shading<>>>/Thumb 11 0 R/TrimBox[0.0 0.0 28.0 40.0]/Type/Page/PieceInfo<>>> endobj 8 0 obj <>stream +H‰LSMO+1 ¼çWøŒ´®��]ï•‚Þ =U÷ê‡-ðÿ%ÆÎ¦TQ3±ãLf¼éáï‘OG¡û‡#¥ÏÔH+]+KéS¤�SÀ–Ôx]°Êû>;çÔq Œ’>÷4æ nik4¸‚à}@ÁáϳÐÛwšÔúOÃ%Ý¿Ðáù]èû�_è”N8!T…2ê_ÿƒFÉÇ×Û•í¡` m¤Í©<¼¤©6‡²·–i*\«Q)¹¶©FqXøFëçm‡Øƒö²ƒÂWê…Žýd/š|ås�·À6°õ{§Ù…`FmWæ™r­òUìuÙaÜ£ãjíZtˆ“]®�sz½ó~^;nA«Ê̹ÙMËŒ‹wQEãkÖ1€¶�ñlnTqf¥…uµktN…—¦{lþ”8;“º¥‚³@°V.ko—hlÏ%ÿ†™ÕÌÝî á9»�=Ö¹x¶µÛ°wÝ*Æ�M*•W[ë¯C{†§½„Þj ¸fd<2\£¬¥;­Öl©Þ0áÔÂózdð9"|üÕ—¹¬Õƒ…-;ì·Ð/5šá›˜q©8½1òø„ÿë)ýÿÿÿÿfÆµË endstream endobj 11 0 obj <>stream +8;Ue`\BY(Bf;1p=?b\3E"TSN&s8N'!!<<'$!%" endstream endobj 12 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.0.0 %%For: (Lance Wilson) () %%Title: (cursor_LW08.pdf) %%CreationDate: 2/14/25 6:12 PM %%Canvassize: 16383 %%BoundingBox: 4 5 23 37 %%HiResBoundingBox: 4 5 23 36.5184066155898 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 186 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 28 40 %AI3_TemplateBox: 13.5 20.5 13.5 20.5 %AI3_TileBox: -274 -336 302 398 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -106.914657366402 63.2126960869364 10.8479854238881 0 8166.95567794119 8205.34158344307 2547 1344 26 0 0 6 45 1 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -106.914657366402 63.2126960869364 10.8479854238881 2547 1344 26 0 0 6 45 1 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-187 -417 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 16 0 obj <>stream +%AI24_ZStandard_Data(µ/ýX*Z5?£< EDÎ ¬ÀÀìH¬S� ¥kBŠ¡ô!ă¸@ ¾àÚ¶m  ¼ëÚN)¥3�4 Õ ’ > +^ +¨_ }߆܋™Bº÷ÄŽQÿ3ÿ÷5Çñ«~n;ÿ{d;õ3*Ø]Ñ.ÌŠêÔÏdŸ'†œ‡! +f_ö” xÌ›®aw–ç/ ξ€YNe›Ç±Ùe\ŽAõJåzJ­;¯¥ «a7æto ³>rQ~É1'û*ö¥‚ÙÌo±›¬þôŸ9Ùü³ŒóK¹ÈT°;×ŸßÆ(u#¡õrÛ¯9X¬è¯ùxÇnÍÀ�M³ž¬~Éõ‹ /å"{Ùïé²½ý€? Çõ'k�úïÿd5ü%¥ slvžË®´aŽŒÁY3ø’à·ð%;µ^+PÖŠë:6³þ­Û²óºÈjøÒe|À̱[£ÜHÖ•6Œ­Ytlá´äu¯×´›M†â`XF'ίëÿ²œN%Yê£]†I:¬e<ã˜g”m¬ÍvÂA¦É6ÏÈx¶�í “mlÀ(ÛX9Â<ÙÆØA¶ÿ+·ÜO‡9²ßb7]ÆH¨ß›úèÁ‹dð1<ÐaôÔŸz.ÇͽžíŒ/0Æká’1ºêƒ²Ž1ÿv&Èæ¯baV“ñŒoŒ6÷·¿.r¾¿~ß#dgïÞÈûÁÑÛbç#ȹ÷ÞÈÇÜà8î°¼‡£îÍwß~{ûÛà·¸Ç]nsŸÝéV7¶9ç�{îñ�ƒ<ä"yÉM~r”§\å»óÞ»ï^ÿ:ØÃ.ö±—ÝìgG{ÚÕ¾=÷Ý{ïùσ>ô˜èG_zÓŸõ©Wýö¸×=ïyÞç�^è‰Þ蕞é�꥞êmÛ GÁTÁò°‡>ôÂ/Ã0Ã1,C3ä¡ +¢  Ž`~ 9¨–ÞçQï½/õêMÐjOÅö”£üÄüÆÄRì\Sô ù¸ÓKCvÔãŸê©Ÿç=¬{iGÇ.r¬«èYbe)‚»TGLEÇsõK?ô;¿süÄ/ô_ê¡ÝÃJÐ{üì¦èuß{Š™_ºÑô¶çjŠž&f–£š  ~žïÜÜæ6±mª¥Z¦eZ¢%Z¢åYž¥Yš¥Y–eY–åXŠ¥X†eX†%X‚åW~¥Wz¥/}ÙË^ò’—»TÇtLÇtDG ÏÑ˱ÇQÅ1Áñ¿ÑýØÇ>òq�ª¨Š©ˆŠ§hŠ¥XŠ¢Š¡ŠŸø‰žèÅ.v‘‹[TÃ4ÄÐð Ͱ ÇP à ¿Ð }ØCîp‡*˜‚(x‚&X‚#(‚!‚èÁrpƒé‡~æW~â'~à÷}Þç?¬ûS½ÔC½Ó3½Ò½Ð½Ïó<ïqo{ªO=êOoúÑ‹>ô ÿ¼ç½ï~{µ§íf/{ÙÇv°óºï¼ï¾»ÊQ~–|¹Ç=/÷îoÛã-œ¢&F›] ÅOC°£ï²3�ƒ£Èwè�!çÞØ?ß=ÈÎÀ‘ïÑû ; ¿pì~Ã>ò1„ìPùØGpGB6F›¥ û˜¥-Û›g_†Þ!£—�ÏzöÐsï‰áG¾=dgÞÇýyaEðã`½ï>ô¼Ñ 9ß~o{÷GÈÎ@o?¾?‘ó.ö/ôžï;Àf³´ež—z˜êí�üëŸÿ¼Ïû¾üÂ/üÄoüʯüÌïüÎýÒOýÔoƒì`=è�ø� ‚"(‚#X‚&h‚'¨ªé¨ŽØ.yÙK_zåW‚eXŠåX–¥Yž%Z¦¥Zn“›ÝôÌÏÍÐÍÑ,MÓü@��póGù®(Á_&(m~)7Ì˼©U%¥”[ªá_ÃñY‚]Õ7K!§ç?€Í´^±~½1ý=õWÍ,ˆ³¯ZÏeé{kÆK¹a<‹ü—E}¾jf3%¯gºváÐüß—goÏûÔsùáx“Eø®€/Ž>ëÛg ÷�Ì ûãuAd÷ìƒxþkö•[Tò^&vš5³-9ž p캪ï9Xì,b®žmÃv¡U°[×ÿóUlëR +/å†e‘¯béPÉ_Ê EžEæj½6íë¾ÌRç—’g5Ûšcõ¿®Zú.冱PìkfÄïûI[Ã_Åj2˜pfzŽßø¤é�ŠgN ÿÖ £Û†‰£ø}·'òÒßãZ¶ }æ{öe^@lª`·…_±¹m˜=ȳÈ€KÓ¬˜=· Óp0€t³¯wïzù5‹Â±ËHµ2DÜ™ÒÓó µÈ"ÿ­]жaŒEÆ€cúu ²�‚ÙÌ"‹Ì±º!cÏ"pìÒó•ÄK¹m؆x=cxs\³sM¿Þ÷’e‘9®Ù?ŸÛ†eâÿ·åãÃѶ#ö¤ËƒYä*a2!ÒA#�“@B3©ik, RÑçVXrÁ�Ké+¨ö†yq$hÉ ›ÞѾµ0Ú<^:a‹æH-$ìAm?Ò:Š' AÂÞ0ÆÁg��ÐQ(¥¤æ�Ï’Ã’1Ðè¥`¬µ�=S°`ojÃZE <µßufq¨È€‘E.„שM*jhóýðB쌀< ÚëÉÔY}6L+D±´`l¾e@ñ"+›8` 7ÌÀ(}öã@;ˆ>Ûq°ýçlD!b¼BòY±^žÍ¼PÙ°ˆëÒI *Zâ2&445 4Í> ¼ SP[VxEý7Bä kp�­$·a%�'#‡‰v÷ëãoáz¢Ý¡† |²4>^·ù#Ìlož7Œ ¢ú +P·¬¡ÕÏ$&ˆuÃB‡u›N ÌÚ,¨TÝxÛØR ô†uL�ºH’YôAÀÊ€©î ‹½D»5/ÐuøXÕ@k[Ý#’ÊBH»†Ép9J½åMº7¬>íN íqi sÓªj šå¤‚Ý0FO´»æ.[@c»ƒ�8á¾§%à6¬£êÃKOeƒ¯ßT0V m%¹—˜ñ%á§ö½ÔD»Iáâ+´Íôš7Ì‘Öq„ã0¼Œ' )NŽÉ²åVëµÄëÂIfß°ÅÇëv¬:ðZ\g2!ŠHlf,±?+$B"ê4�6l"(ð’ED¡1I·äLíwýH.í@܆¡RÑQE‚FŸ¿dÙ Ó'Sn^{Å.\ê'« é:œWõŽ…ó2kíeâ@Y•™TÀÔU)~€ôboèØÜ0�4é¶Ì8µïÝÏÇë¶ÇáeN¢Ω +Lš¸aïKm­ž¡Å¤ CSY$§}V­’"<´ÆF€¡@Pœ¦Q»C«é>Ït¦3"b€PâU—®H;ZPÜÀ`¸å†É“ÇͤéʃˆƒZ´ê;EÂôí2€d4\ú2ç� ɉ¦�ä(“¥ƒð´q \ö¦|”ÞYyK šAKÙ�£ºa ¥<uW© ³çB]K Ý ’j€~à„9ݘ@KiXPæÙ2™(:+ž�œ6fˆóK)©i6ÃÍnƒ>ž ÿ•Ý÷¼”ÈËÌ­á䫚•jþœ÷Àåìþ_Ù­ß—æ `?®e€xÎZE9‹Lâføß�~AM³ªìÎ(ú£x€fÁ¯ŒvSqöéWö²0 +_2šÍV¨�¡ÜW–Ù¬~ÅØ7cÝì£ØWÎâ:kÿ‡³W<`Ž3‡›Á.«úg0ûÊÙ+ði:”AT”³ÍfÿuSÌf*ØÀÒüWdt–ýU�ý™Í>ýW …I0³-ÌÖŸîÉ2;ƒºê{æòòU,gg WfOìÖn›rš»ïüå–ßr]þ5;ø¯<3à쬙ÕÌ»5ýÑŽ5/`ͬ¦åÎ P» O‡úv^c·f=5«õ§O¯wOïâ¾ôëEÁN�Oeï ó¿.üº‡5ÇÔsÙŠgµfOñŒ*ábt;¯îÀoÅó +ñÆsSn ÿöÒÂñYRQNç—’}uNåp~)9W}º¤‚]±fvFÿë® +dþ¸t »Y g㥌SðåcÞ—�?=~ß9Å 0ûžd—ECNñä/¨`vþ*–~_–geVÃn Ç(Võaˆ €ðýþëOüÏ¿eWt+FAh]³oªþ4+·b!ôÌžÀT*PÓ¬–j°k·>Å q +v¿Š•!¬–jF}Ø}S¿í�=CdÈìÛΩÿ†œey–åZäî+`?DÀ�Y–gYž¿wF³§¬ý°›úè"^AfY^Õñ€ê×° i¡fÒBAúGžé%3W½h¡`˜¥iüJÕðw縇(ö=AæËt=pŒ‚Ìoæx%»o +ÒΨ}zÑ�NÅ©Y–!íŒúÞRÃ)£Üf?ýjå"@~·ZY†¼5ý[È[Óÿ}cÔÉMÅ4 9Å û/,`•KÿrŠÚ¸™_Ôê¿,Šæ ^E¯ ª9†´3JŽí® é?Ëò‹†Q(ÒÎ(ˆ €÷ÄÂBÏíüUlË…ÌrÿÂ×­!íŒjÿMTŒ~úBR©¸ýÿ=AX-•<Ël«vO�S¼Ðu—2ë-ÌÂn&ûpÒŒó:ÞtYW².åx>=%‡óŒ{¬™Õ `_™vQô +¥DžÚ~üÆ>²�ýñÓ#ü@ï1~§ö1²»£Ú.B.fbØ]:öÄ ÷{2±—ô%C/¡PVÏå"“�Ð4MÓ€�æà Ù0GöÛõÑO¼\ÎOÙe®ÙÎ1ê{ÜL=—í¯ÙYåjhwfE—þ+:×4Ÿ¤èßxà~5®êÖ Ÿ>j~ÅŸ�r_>@Šþp ·Ÿ…Š_îžêÿ™Y"ôÌ +é’V\Ó/T‰† øm€­Yô¿r‹¥#$õëäÎuÍÎíë®PºþŸÿžXwfp¶f[¶þ­zdÀ¿�áÇocømà°øm¼ÉhF�µî¬Ê à?³2 ³s��—’gªÓOÙ¯Ù7¦]‡*«_1 ì6ã<®_ev)™„v_âÊmÛ²2èY4Ûªc™žßõ¾Z.�Í_fålœ³žÍñ£²vfãS=³Ù(v¯³µÛ¦Y €ʾ€™ó:õ3â(~:•"HýLí¡Pü¼úã¿LýŒÇ;ØkÚEU°;ÀwE¢Ç¢>üË@ý{>ÿ}`�ú™-~¯×|UpùQ¬êý?¯!v_§~¿Þsýyß—z)Y]ÆX \ô¿'ô[ìæeQq†F/ó¯á *FkÖòþÏ"“Ьû²™[Ã,øYñ\Óهݷ~Åp?ïûOÿŠÏ÷ýç·R¹ßÇpçØÒkÅÊr z|¼‡ HϮꉾ�â7†týiºüçX@ÚÕ(]d’š­?j÷uO.íŠh8vUÎð_¹£2Ù}%ƒE$‹B#ø³aðþÀÐè¥&ÚÓñmtÄ3&! +æ…á”K�j¢¦§j 󑆧‹,õ‘*ȇ=(-#QÊ1‰vw´Ç N�éù,Ý&eƒ£§BÃus"TМHç@€[/…Vkp2,¢Eœ7.ÀYE-)¬ܰµ‹¶„Â')Ñ�¤>8? +þ[E„È©™xI$±Š#ZÖßæWq@|æF¬Š4ˆ–ŒR׿EôsóIž +rº( ÈäX÷§­ºDb5.Áv»Ç’ n•Š@òžÑ7{T÷CA5$„À‚v;ª.�¸¨˃8-VßæÝ¸�Îѧ ›Ks‰5Qôó�æÒJj l�çÊX…Ã¥H9\Š”Ã¥Hm‘h$ºÈ¤XÔ=Ç¢9ýw, +�X(tzQ,âû/üýþ^ü…¿[œ§ÅYÉO=1Yö1Yöé™,»Ä~l@ÛB_s"”æÃ´0®á1-Aøî1-Cá1kDøÇW™Ý¢òU§É‘Ù-ŒÉbá#ŽÛQ4Jí"ë1²:†R“ܺ¶ôÚrªÊª#«r«�岃$;Hdªð�¤ôAJÒÙA"C^&µ7D"1(ô`®” žà�܆)l؆m‚â´ +¢D¿Ê�A!ª”牣ä¦SOx °\·ÄŠ8�.*e&h +3�ö:ÝééiDZ�Fž>­�3µIÜa4‚,")Ç"²;ˆã3ðÔÞ0ÂJº\+Y02ðgà©-“d’LZIQÂ@:OˆK‘qŒX´a¡„Æ)üÜNZ-üdÑ?ı·&ËVh8­¡ x[ˆâ½Æ˜„(ÞÈ­õ†p +#³Ÿ#pIí¹´Î¥ÕÏ¥•/"©}0Qôs.Í¥•|xêaà©íBXÉ‚‚��u!¬¤H$‰F§w)RÝ¥H¹)™¤9œ%΢¿g|eƒ+ºžhA ЈÁ€0L–í`˜,›c˜,›a²ì“q²·8+Ùâ¬-Îú5Jìߊû÷€<°…(˜Æ¢ÿ†1:Ê€" Q|'Bðrç_Nñ˜ÖÂó˜fAxL«±a5Z£ ÊeÁ¡¸,héâ¬UtBŸÑÅ¢*�Ì.ú [T�&)5ç„,fQùÎEE‰D#‹äúÚ®¢è ÓÃÖâÚ®jÉÀò~’¤bBcMÁéèA¬q,NWcqš¸] s“D»ß—JrfÒÁ!-}Ãþ�@¤Û×F lš€j@rqG\ ËUdi En¸¾µ÷žš(\"ß*v4 Û±ˆü=ð”‘àx©"ï:û*^³6!0ÐýãˆM`ž^ ë` �u��ÕÀ’¼yF•0­äVo®‘ÙO:6Y#³Ÿ$úDbŒæR‹³rü-"‹Hj÷E$µ&Š>­#ÙØ0��åˆo`=Oxjo7ðÔv!8P„”ïîD9!Å<—"%“d’LZIÑhÃΉ�ò-9»Pýw% +>eƒŸ�EýwÇ¢cQhàVø³zø³’ðg}UL–}î®Äþ½a�ûw‹³~F F¨u"Ø€,“V¿…(>1°zm`щPRÒÈ6pèDv ¢x¦ÅÍ¥•ä0®á_tTÀ¢ÿÆ´˜Å§`�Â#8ƒ½0¼ž|F2ðÔ¾,0Hë†­è„ Ót"”Dº \.tlÒ[$’»Ôè‚ÂuèˆIƼÒÈì ¢ÉÚB“-ÎjQQêó•Ð-*K¬±¨Ö‘ܰY§š…ŽMîA™½Ï"‹ä6¬§¬¢Ý³ÈšEÅ«´V«‰¢FÍDÑÚi¢è/‘Er�¾¶¦*8$·æÐDÑe‘Å-Lf40»«»".^u¦‡µp��妇í üöa þäH$·a*»a®Œ��û‰<€œ©Í9:‹Hj§ +ëHºV’KÎßÔËR‚*±§ +‰‚Ï H>U` ¤ +—ð�ƒ;xÈÁ7ìP ¤žÆãä«_é„”oXª Ÿ)‡$’>u‚åñÈ¥HíXä�?+YùH4RQüˆÍ p +‡x6ì•)Üô°ŽÈÁíèÆ«dÙ[ÂdÙœÐjñ'’CéØ,8MÜnÛ>Ìv%8$×éœ�Ç™’$·a ×ù�×muÁlpô`ÉÆý«nCÿª3;¨]Èd)|ÃÎE»[ ÎeSš‰¢{ÖËÈ"¹“ŽMnÃŽD»[O¥“0lØéÏÒ÷é_s7i¼]#C´‡²QÑ’y6A ®b×)Ì ¹Ò’yÞ0RÕ†>%ÌÍ*Ò +´D’Y�<ŽM`¬"½a$Zr³*Ò!ZâI㢯bi˜ö†98EGtÏ_èQg#24�yÞ°U¸ø +Oš×D¬¦“¨cmŸMJÝý $ñ0âvÐT7„U 4âã�X¨Ü(¨4ÖƒC"Ñòˆ‰qš¸ÝA#�ÊxH‡äÍók4é¶5Ý»¾”cõѤ…ùHNá$·a^C€’pÎDÑ 3«ôšSCÙà‡D¢ÝrpÃ\Jh6 QàAÚéA�…•C-¬iÄ<´“Er“y-ì‘C᫈"ž³k…Vz·¢àéV�âšvõURŸ&|'²á¼30=,¬ùHN`ÈdBÃ$ÚÝ@G ^$ÒŽŠ‚fæÙ€Ã�b‡‚Þ0…�³à�DúÀ§�‘³ˆ�‘Er/˜¿æè™È$LwÔóGÔ±¶]°?^·=C4L¤Nè§bo>¡¤3¯:0Ì�xéÔ#Cb܈>±óŒÐ2{S Y ­Ø9°ÂÁˆ‹ +3j[\pz(Ì[n¸>Ó¯æÒÌò�oÃTGf5ò8G„&Ì —è­"‰ˆ$,�Šm«ÈøxÝÎ�/„¹€–léÕWQ¡à€ì óD»¤qÑA°*R6ÚBÔv +6zà —Å*a§>�¡V7£¯†ä�ÏDÑŸ Û°æKtF »Éi§XÙl~X¸¼F0”¾Þ®§ó¤D/匃¯ïiUj @œJC1àqÓGrÛ#)=ª ` Ü00á#¹�[1;¤K ?n“ª1€ñxJÃcUR‚Óß"RfÂ�¦�3‚ð=Ôp +�ìm˜<)vhL&)¤€Ô &ÒYÕM‚Rl}–2õ‘�ʬ µo +0õº·]óÑ>e­h¡½œ8.¿²¦Ó´xj¸Oy8ø—žp¤ ÊF«¶a-L‚ƒRÏ7 Ò‹ã�Ê‘á,H3Ž‚zMÆ@¢�ŒŽ‰+¾ñᦑ”N…â}Â׬ê/”U1 `åÒ2@�‚ Û° ÓŒ˜‡&y]†VIЛ:§½ô²Avzyz+Ïp<݆iP|†<:•ËbÎðô@uâ¢ÆÀ·afL¯yÃhÄg)U�Pªâé6&Ó÷лnØA;PÆÞvraU™š¦¾P}H7LŸ®Z}•”âAqË€›ð®ÒAS–- ÚOÇZoX7ศuÃÔˆ7Ï Ɇ¬�uôeÇ“ ÓÐ}ž5Åi#�Cƒ šç!>4W +\ŒpÛ_ -á宥ö'e(ýj¢àé4]fÅ5ŽÄ-4 Ne.�¾ +GÆ|ÔÅÚ(’–è…OtPЪ¿‚ïš™’K¢ñ`hî¹P|ŠF«BÊ7l�}Kµñ²JjÙ}eƒ»DiDa!* +ÈÅV‚Cr‘L§½W�Ws®Ÿ®Î «¿‚‡/ènØÈ£€ÔY†%æã(¨ºé ÊÊ–å†d¤}CÌó �T4¥õC£Ï¥˜SÑ\´§g¬éÖÝHø:¥r^s½6CC't ©]È$'¤Ìó†‘ ¡Ví‹G_Ô£o؆ÉFß°„…û¶äÐR‘CS&†FðšÄÐáVM±a¯S«rØBWéLjJ"·lµ´·¼õï:sØtˆ�ÑW…(µÏÆãܰ‡=7ì‹6lÃ6Lõ@ñ�ÕÃ0苵a‹µAQtÑìAL©zI,LÂÙz£J~‡Qýô�ÉÜ`{@#hœˆ¨{à ¡ÌʾP�ú! Àð*¡K·â „‹¦<ÈMwéŒ_Ek ¿—l(µI‚óÄ7̽tœâÎÅp÷L0gdõ¥ùàjhußîJ¢Qˆ´l˜‡…‘TxB]R  ´h­RwyT²&ëŠ" ˆ ¹a1‰Ü0w%Ó]e|–a$zWÎH" +sê@‰éX±ôÔü ˜„sÖ>K9@©»Jæc¤þúÖþÓqsؘLS´”VAK9j8 ‘PE™g¿•�J�¨n™¢ +ž®± C“­Ü5~ ]}h¥/H™þ×^ q±Ýþ6l|WR{ÅüPÔ}Ãè׿7¬ë$�BT1u.¸ÂJMlZÙ0VÁÁæ9ýÝKj·7 !«Ú\ •+—Ké©(ý†m´ª±"M©ªKêe2 ªlØ)BÇ!¢–x‘º³X°Ì s©x2‘ «Tí3Ò8´ù�â´ÉiE÷Ð2²Ë¡ ��Úš AqZ‚âÀúÀÐÝòñ=š²fÏ•\6M«*O‡¶ªß°SQrðZÀTúuA>q—è#9¹QBu¾a RBá J{n©@gâV9“>²+©ÝN¥¹a\OðŽuÏŠÂ+¡›aÙà­ÒâAuŸçÚãuÛEMþ¢*í¶.hÙ•® +w9–Aá•%ôôW© ¨�dL–-ñ@šnrØ‹aÃJ(›žÐÓGr"…v  ªÍ¥'Í–¸â)D•9¡ºg¥Q¼$ÒðBÖ¨Ûq!}Hnq€$ná], õµ9PN’é´G!@¡ý`0ñÐ�ŠðPP™P”‹£¤žàIêœMZZ!H*Ö(¡:ã’9q‡÷AHù o«ÎõATŠ@Űx}J xpA Piú>TM¨pL¥÷ŒÍL–M¶¡ÔÞH“ns´·³–‘T6 e`� ñ¦­ ­A +Q°lšñX\áJ{}JÖ<~ ­!(¬`™ç)%µÛ�jó¦èÊG Õñž °HNÛ§!tà‡F¾.CSxˆÍa6Ú©v‡¶� 8ÆÂ€Ó0mÉ¡©ÞËi•…§mØFÑ=´îAZ½¾V%Cö~'8¸æã KYâTXÞú7¦aòt[E3u†ê5Dñfka²ìÇ'èvJ �îÕ‹nÃÈó„Ù'Pá@k;cÙ+ÒhÝ­u$!šåÃÙÌW"" È�EB¢©‚“U -›º2Š$¼ä†!p^ëæjÌ®ÉÏCÃøò¡mXfaåÐhšf˜ú¡—¢¸´ðM�ɪd|eÓÅœŠ{T·l]2+Wh^½)£$F çn!M·áÑM8CŽ +º-陓2å}PG^ó%Ó3˜PÒsg¡1í Kx¦½‚¢íy9ÖmIHPw%ÕíåMº#ŽÄð:ÞËiãë2´ ÒׯA©gLÓ‰o›ÂU9øKXnØ‚„õ*\‚¦£·fê ³âŸ Û¥P”n­¤¦.ò´q(è S�«×ü ¸ó¼Ú¬{Ö­€ÔMR¶º+J½f×4kBCãD(óŒÂ[»3-„‹\h¸‘¡2 É +±·.þ±ACøyV,>Û\W 89%á8­ #XøH î,•Œµ$ziº5ôº�Õ'5 ó�ÈeAØŒãç¬6&VE•iYaÉ•ù€yõ™ÌÚÐCÁH†Î£–£¾hÄ¥1Šß¢`_qwÙ°Í�_ùi +|"²=ºÎ¬jh%­y1ŠƒâŸ ÜöMGktX“¦vŒÐLýT+'+›Îc 5ú†A6Ü XnÆ�Mž�}špñÊ…àBp!l˜ Á…P0:œ ,?;¹CR.r)R —"µ¯˜–¨„µµ™¨¥BHfd‚   �‰fóáºÖ?6"JDF20".&Œ†âÐ@ ÅqFRF‘ ¨ ’̈X[êl7)f5OÃöI#Â’�_6u\¨PIƃœ¦V³�zìv…üˆ×PÑØåxækTO〷®›s¨fË㜪œùÄ ,âš;ÛÁcš]œ”røÙ¿«m‹ÁžÇö˜˜Ê}ž½–ƒdàõ²n¦ê1•*5Dzòãþu«€ßE�EcRßRÃãêëAÉ÷ïXB¶`ª0Æa8´Ü”¯Ó:‰ÚVC{½6pk¥§õ+$P†¦ç.ìåŸ2f÷÷}ü–6�ï~ÞyàüDÉ0ˆbêC™²|€YKèñ¶ �N�B+‘¾¶i/P ˆ›}z�nÄýÖ\�º¯Kgæ×«ÞÁrЏî‡ÿs‡x`vC°£u2�MÂ×_™„>¦ëú.¦è�(÷–šCrÚ!)iômÈé#IQw¹O×uÂé}šCÓªµ»ÖÁ‚¹8JTQd?áEŒ;\�$ž”û³’ øâ3Ú”:_ßg1Û;Qì{j ž½7Žît‘û×âŠËœ#…oÍ4Ø»ÉBˆ‡ ¼ƒ|n9Êâê–Ž>/±”Ãú›T´ã}&n)Þ̆>IôIsFáQ“‹ ÑeF¡¥Z| l صûŒY°?Ï!ô'}H7i>dB¢r×pa½ÿ?R¬éóÕò?î¸ Œ,ÔéÂÝr 2¹E¢G#I{gð«ð΃¿¦]‰YŠÓôS¶ªnÔ»±zžµï3Ñ@^Ñ p?™<Ѥ@ЦY¶¥âN¸‡t@¤vœSÔWj-4Fß]ú­·¯¬gÊçjDÍà›"ÓêÅI¶ñ¢N;�Ð&z‰õ�쥷Ü*&ÕÞj¯Ãÿ €uo¨ÙÄŸþ +;ê6|?ö‚ ó_ýd[À‡«íh�Ñ—OADIE¦ËÝÀÛ­¥ç-{¸Ùêpw뀽OY‰Ý›øšÙÅú÷(m• ;ý +}@yRZ¾²�V'¯ŒôÀ› ŒìN)É’ú�ˆ€ �xÏ=îMÇ&rG‚‹¹ûuGKL½%1 +A@çÂyñ0èø>©Ûîžd×H+¼Ù‹«?Jö˲»€·äâʳã$ìÊ »—à½è#qrð�âjÆžð†¹Ûù[¢ƒÚAÁ„ÎjÛôè¥KÃÿBÝâhvø´=«¦)ŸUŽ=rЃ&H(Ǩ½R"mOüo¶Dí¬–Æ¤­\�ÖÔ5R[OFÍ[ú6(pƒj[ë’:äsi-!�´]±c¹½·~9aÊÅíC=ü§Æm«µÍ¤rƒÈ(W†SFÉÎ)�ˆs}ÇM]Škç’�1 +O jÛÜnPÎLôŸ[Ég;6o…jÄÓ}÷ã4n½bV4ö8\›±ý([¤Û?¸…4æÈh“Ôû !nfWÛñlj ùäÁ{®á³´èiÌ]¹DæCÆé3 FXwXÄÄ¡Z€(ô)ŽØü�Â’p7‰Uy,êa0{àÙäâÓö·-Û*­g•¯FÃ�¶‡-Ó°Ìa«ˆÚ†~ìPÛRgÏÅs§ÀAŽXÓ™��cž˜›í¡ë¿þ4ñf×ûƒ_35Ò}õ´VÐáìAì…#QˆÒÑÁpC¦‘9®¸c4X‹Ú…}§²ŽlMfJ¶oçÁ«­![]¹†'ÒTŽøvôë:D7Ñ\qàå…o²Äl¢'cøÀ�*³Ø(÷9C²#º˜CÜ�*ӆ޴Mù¿Ñà�Éc>'Ž×¶+"éLf`À”† $«’fÀa‹XseØüàYýDi�?XC?¨µvTõ­k2õ4éÉÖEËû5Ê êl•ÊH¡žâ.{¼ŽZö÷üñŒ}dŽSïþ0¡)œFfC–k†ý[†&,Ëk^Yú¿–û›Ò6”ÆVEoyÐQìjWWƒ™QGy ^«Žõ·ò[p°.]›ÆV ÞäÕ(Chip'û’åèIè!0’Ì)ÓÓ~ÛCÊÑ|{–,M!û¸:�:`v‰D†ýp:òŒ�ÉìiÙj¨ +©Eìí¹b)¥mi;œC�UUUí¢kê‰LfæÒ1šªmwí¾”–Tm^\¥î�%Æ2ž„]!~¡ظî¬ú~¦Æ2+sm©jI°ãtî@uçáÝ&iC¥ÔôÊ(à\û(v/â :`!¢Ð&!ÉAºYäÕ2½ø˜{5Q1Kœ�”ÞüGM[bDÚ�pFP¥»ÃÏ=š?8úÃrRI-H¹Üު׋uÝŒK>m£îk;W +Z~¨Ç„`1¨s¥ª‹‰]QZÂÓ¤ òþnL»®al÷I”M¦] 2Zy]|K�Lë{i²åŠ0;ÝfB;óÞ`o#jÆ©¸©>o£�Ä!®Ž(|¨[’/®ÏÁÅkNd�…k#{຾,}@+"Ø’ž ) [~%Þ¯]ŸžÅYJfyq¯S%Ñ®Í87§]±”w¾Â?¤©8Y£UEêy,k-›À[Å‚´µ&â$káP@Å¿fon½Äé£;DÛò Þj"ÿiÚÿ²ïHWŠI:’¯ z]ﱑü±:t†ç°×;[¼ý3a!-"–~l3Nྠ86ß`Ù®�áÉàß/¼†LWÖØì¸ �Òí1—!X +ÓE†æ^«×…9æQy, † Ô" lR†$fÕ2MQµÌsÚÐ}u¨o!ã3•*)°�Éw¢'/²|n³k¨Õ–¿Í`9­ëPC{'>Ù¾†€™ö_jÓŸôFñ²³¡Nîu«�˜ÄÛþ{Çaáœ|LÄ= dæé $E]‘þȉï +ŸêeN:76ñyâ¦�C jTêtŒö…€iØœ±°ŠŒª,á^6,•8þ24D®¹>«aÕÀéÂЂjÀHOAl1ºh@£¯\"â5$ \0qT�îÝÔGW�@ÂûØ-‚´æ²5®16ñt°°R>.Æ;ÿr[-$ã«�Á†<ά:çå‰ ³PyîV_.ÃKëð”DO]‰émßo�®(‹Š4š@­KƒM^x0Z÷^…þ§½Ùû;f‡Ô›‘ÅÚµH‚ .móô@×RR—@–ã¢ð�Bãºj½íñoc9“ €Zš;Xük ¬$ +Ã^˜Ué8ñ ++±y¥›¼ÿÿý÷ ¶'Íx¬x!Õœ¯\V:@Ð^,�Uõl£Éÿ>¸‰Ñy„‰ô)êœ×¢7Sº±9ÜtWqJ¥Wsºwlj§ '–Ù‘zC°qZÿ‚P o4êŽ*O>˜Ò  Ð7Ý¥ÆÒiÛ˳"`ì5ÃÒ):5ì=‰UIÄoeê1ö à‹ló™°P]”?cP%Š!_´«Û‚N«4, 0k¸’å�Gí×Ýp£GÖ$‘„.xâ4èþ9Z©¦�…³ §b« k»âj�'äuSsG÷ Y†XÀ¶z_Òe}‚oYhô,‰üõš9,Ü­î¨2·‚,¨ †ôr¯,¡ ‘¦˜NZ =x´-âo=dÒùœÓ:£zÒ3T:ó\ÓxŸþUÏÊ +‘ý2U!ûÞ“<éj^åM;wô4NEG"tXš>Ô¬Áõàìs—¯—çcˆ“ZE|WœÛüÞ/oîýN„ÎzU‰g¸®RÜÎùæ8aÏò&Rܘѯ‰Àxÿß}âF=·€8ÅýÃg¤®š*fÂ"ãÈ:„]½ ÅÕ¦ÜôNþàæï0 iþ:' y5‘t�´™,d͡¾‡.e hbŠôîœGá.qèØó¶ÒEø”��›,Ö9݉ý×zNxVéBñû¸èno�û q‘ÐÝà††u^‚tãljï¸Qç„K}/„·c¿é¡ƾ¬s¨.¹)Dƒ²Et‡þ68?ÆÈÏo®ä +ozΈéø‡ât +'‡°ydìçy—ˆýÈþêÉàh§s�«~h$àÅÎÆÔß+oEÈŒ§ ¡ï +]ðå[B·Ò7D#ô ê¥W5ŸYn@è¦Æ‡›¿y"tîÉp‰®çAè”¶q‰„yKÒ�€ÏØÌÍQO€®Ô™öqØçaŽóró2‚˜£� !ìÍŽÌ+�9tÞ[ +éùFåÆôXÐ*¶¾¡�­�ÇÀ°Ui§d!D¾GJ•:5l‘­Ý½xð†Mäq°…ùÃúñ€xÎ>+õ“µøxåc4ƒ·%âFC'3'ã*Zµ‡w—@ð‚õáü ÌÃMïD܉ÎrÌ.Ó7qÄ}!\t5sG‹ÛWÄÍ@Þ|FÜ ÔomuÊjÄÍ9,Õo5ŠÑ�5ýTï�KT(p•ÄDÜ*Ìb·C®óá�gb¡Hð}{þsêLìš—f„>Ü^јØõ»ùIÏa&fU9â3[ Ì8í31Ú*ÌŽéçÒ‹{!h £ÿÆgÚu[ý9ÓtLl©?�¦0éG×_Øw�9ÒM1yŽ®°�º¼7a!ÌZ‹Ip’&?­@¬P侯ø¼¦‰¼SJ9Ã̱#¡¢Rª/.%#|6’vq-{È ·ä[Â,çû�6wÜê¾_@4x²äû®¥SÛø$¢„ýíDUcJÛâ�¡³ëÇ›h¬Ÿ+æÔ ˜¹‘…Ðã* l ‰Ù¡ØØV/Ø0vPâjÓµŒr�q3îÇæpë¸Ñå”Êd¥a‚Ñz¥/’Ø fàKÞOf› FŠÂ6)H<~2Í2ÁFˆRu¦ëÌ �`u5ù2™½©ñé’$µÊ¾.ÁÓ/hämcÆ †â˜ú†Õ©åŒ�v‚!4nÓ+æu“Zñ„núyl�¡..ÓF sÒ;ÃÂU!h¹Av$Ž&lº‚v´8 Yp<‘/üIX6ÖÍœ;‡´=±}bÅûUsãíùKºÌi‹ Ddçë“Êé€6"sÙ]÷ƒ9í]×Ò\‡!}¼~É\,zó˜Rc�‰‡ªö>€ÜÇ2M½åÞýì²´%20Ñ“?Ñ;b?2z;ö·J';Q8p rŒ�lGo�NŽ;°‘±ƒ!Fçq�hG�K3+ÿÊC]P�½êšú‹G!¹´¦}×€çxŒã\JàkÝ%,ašgpÓ,÷Îãã–€LQ/vï[\Šf.yåûòye톰³²^(X¼µ‹»,5Çð§'«kHžÐÛnexýb†²RHëÆc›q}hÜê; ²Ÿu¿Ò׺{õá˜Ò +l óª¸�¿?lõŒh%৆ôãÑisAÿ3ËuʓƘM.`Ÿtky´lK¶ìs%Y«@áíIʾí*1Æg1¹DøÞñ�MÙº’3E"KÛˆ’šmôñ~ýÆøKxM¿ž)àÆ7šÉ…ùªì/Ah[z{kg߉¸|Ï.Rx›–Œv€ˆ îÑЬ”æZŠÒïñ ŠëÚß>œ!Yþ€%G‚#äåa ̪´—îåýpŒ ÍrMWm´\GÚ½ªh·ü‹µí/†W¹M»R˜¦—ÝÙŸt«¡úú§÷îŠͥ›‘)ßwÔ¦™ý­¦Í¥%ì”w/=½òÜQø,‡Ñ +Ú²2ïfÍô°?IC!)sßÒ—Ìr »J5‚5îÄEgmxjð};òFÌ~·°¶ö› zêuýx‹6õ"ç9Í´ +H'¿þD½º©¥œy†ˆ>CµrèRA$ö –��•h©Œ i¦Ò?ו»”PÞT¨s=¹H™E×q'‘— +âðãKâedºìÇaTÅIFðìÇ­âbú”l"ͼ Mÿ6ìõ4»sÍi éôcpRnA¹œDÊe,þÄÒCšüµ&®d60ÐG©ãˆnêÆÊ€ä{Ë¡š"Óµ7ô<„]w&´Œ�zËö;¸ž±RSy—èf ‘ƒY9]ŽÒ¼³nsÝ3sa9:ɳŠbàJrb–Æ Â¦’ß5[ 8ù|"’¶-ÍD0¦�ºz›«�úrµlDUËe騋\Es—„Þð›§¶»�Àãî‘à”eZFO@]öjò8`öÎÒóÇ̱¶ÊÜö¾Ž¯¡�UÆ`(Fü�žÅGe ER1¬¥dÑ£ˆ R1ïE½I“wÄ).ö؎\>âP!òõ9Š�6¡1\Âõ¤Ï>»–(þ#•'³w +†ìj6PF´ÝíT|…,ïvÝs¶.ÚMˆ_¯—ÀŽÀÃ¥Qâp+Ñb—Ýű9Ç ÚØð”f‹·þ?0NÃv#𛳠+ç½Á*#»É®ÜT»2–ï8O.A‰©Ÿ†€¢�üIAšåYŒ,b ¡v4­dη.¥á” ÂIé€×Uä\7žÜþ¡i’ÉËãìë·À­=÷„ýP/ |5ß "nòæ¸Êo`l@¯›!Îaè&ÁJ¢çÈ·–y ;Û £TùÈòm<¾µ–+Ɉ­Å`)H66Ïd<ÒÃ(?$[èò'ÍX “‡’0X™©fg.[$NŒL¯®u–‹‘ݦ÷£¡õ ò®ÞN]t_"—º‚³c…’E'hÊq0Ô*ã—ºnJ×iêª@Rç Edþ,u9M]TàK]x> +Z©nCœºlþÂã®Ô5YƒïLM³6/u=æ^dÛ©+Ø’Û®¥®[îù´Wê$H� ´;Z�èT`Û¹Õl]3©3äãÛ¾y+:ÖõÞ=rSв±p¯÷È‹ãHÚKg9sÅ5ÔbµËïˆ#Á¦Ã­†pÜsT4<0.Ñ¿tÎÝþ(jßýk {²`§0†õ?—N_‹D0;%aiœòb VÑu÷g›�Ú鯕kYº²ãÍÑǯ¸¿{IºI£¶¬)Í2¿¶d’.ôà™±[Ê‚$«ô¯×‘½Ä©5µÊûŸTXì�']á7ºž<øšG=ŸÏN"â½å…èYÂslåÑô¬¼Ní—±·àR«/Q•A™A¤D®µXSvFÅ®<®w|\†¨8û;|IÿO>^ðr’\b‡BrÄö“qeË~µ£� /î€ÁœNɰŸ'¹¬âgЭQ;¯jµcðE”cº–Ðö"ÏšR»§$Œ/q¶gø¨!»v?l w}XjÐï ’%è¯í*R8Ù9ÇßJÇ©/Þ¶'ý;†o +·Å>“Ê5´D:ñô¬æôW/Ç'Ò  Ûs¥&ÿ[é3hü#tÇhpªÐìÔ2¯ÉÉþ™…á¸'j•�)î3h2Yü¶k²® §©Ùv�ó ŠWQÓ/ƒ’c`ú´$ç²V *…û{î½yE†A„ÎÓ>d^=žSv`qîP¨0t×WsEQ#sF¹=W|†ˆ…ü"€®×•ßÀÎE´ÑƒÓ©ª¢Ï8ùì úñÞ˜¯²²¤ ÷Œôð_11.±%b2í:r´mß?®$�K‡{·°(&Ìo—’�a¢²ioÍk} ž§$î+œëçWrRd/á7ù íI”[(ÅÜúbRD:=æÊ1Ê­;;Æ1·ööaB¹õ•sÌ­%²nÌ20›Á´ŸxåÖ¹vYxËÙMŸ¹%§8ýjïý·ûP”[8lbníð~L¡ÜÂaUæÖUUË8qôjøO˜[}“sRæú)·îñܹ߻¡¯;—òa]ñGKÉå6Ó¬B°/ÀÞïad›—"2‘×!H ‘šåᔋÖ”<ûØŠÃÃÐ9°£D>P¤ì¢i–èöæÊ�–”ùUin#h3ë- øðƒºŒ®^ÝB²ó'~’ Ï�ÁA%cw‘7öÚ¾vµXÀñš~Ʋi’’–¨9NÓ±–¦ùÚ+4[„”Ai†­b�õh9t±·“DmÑèù–UâšÂ,»ä’•�@w’T!ƒúdã$аÐýiRß5ù\ U¾’á)�fjL隸@÷º�£–áf¼“šoŸ¯_V¼{$„Á`cɧH#ÒB(4Æ…2Û¸zc:ˆD$àìLtœ±ÿ—$*ÄiŠ( AÛÍ×àƒÊGû>=­¢#úߺʈ˜E¥3G<ð÷Ž€/»6Cn”-´UÄŠçnË¥ù`‘·nnK e½Bç±\KñVöÑÒƈÍ5»(¾j¼îK �äŠëºÔ�aYÞDÅš(ru"ÆWq™ŸIÇ ›t,$¹JÚ +›<¨´DÍúÈú-Y«Õ^ÎS[Þk‘ñçÁ©&K2I;—˜‰Ûãs…¡Í™+Åc�D^[ЏTÐ/1¼*Ü +¼/¼T.rýg0Ba³¥°”`zñ(øâsûíçCEåCY·!û±çGsÄXå[M0òlWâO³T5p4³|L±ü§Y™ÇyE¦â!h##†X¤m££09Ð.|ôÿÝC´êYwÜu i«7Ý@WxCÐ…¾(Ë�&s“»_ЉÕþ:}ù‘¨u´ÄÈsD­fÑ�wOõâ›ÛˆM8δê¢à+Î ONfhÌØTóýL–è@kš�zËØÜ�–csãg)BÐ}6ö<#XR©Íº¸Yv±ŸBÀR0IëaƒhZyŒ†3—”ðîQäðß7óËŒ�tÜÔLáݱW™ë󿙯œ…" ƒÝ^ dr÷öã§RB^î¥í>YñþéæñÖBC ð¾*Ë6£»Ý +Ä"ì`p‚@Á),icŠeÈjŠ—°!¯Mï˜iù~ gF÷a,CQIdÖð†8YD@kÌ©Dëá¤îqÎ× /ÿVS…XúÈR‰¨, që)á§f +ˆ^†,J¥× +|X_a¯¤¾ %vói*kÀÕ-ÀóÄ9uXRcï¡þ–¯"“À(?Ï'à8ïÃôì‚&º>=ŒØ´äkJwëÉÂZæýÇPy hZÕ”Çül'YË=œöiX79-üýÙÂyÿ\f |™¬žQÙö…CU˜1m,ð\m™{å g úarß…·¦èÉÕ +…C˜à^²@1ޤ¡³WïÑ®é’ûÓõ£²"ôæž�–Rƒ!c¼(ãG`JJ«Ë÷H¯d0�¿×¶¾?ò;åº A½² Þq`@‰¥I ¢?4roŠ[äÊ?Aç®K”~‚!]}EO@�†žÅ.‰ÁHÝs+ä-c:Äi‰@k.)#ÒNfl\A/?[õ‚«# ÷*{ìúþþn»�ÒÜ¡¬ŽAkyAŸ àcÔQ(ñu²2ÿk·NÈÊ""oëÁ§:—p +­F\ë¶íGž0&.4¸³ô(9XR?+T¨³e—ñØfªfÌ�Â?¢Îr>ßÂúDV_ô&D�,dQ�•jš]œ@¦†Tß Õ9EÑèÝñâ…Œ:kÉní{ZÍì¢Î÷/³êÙÇ/W蘞[5ÂyD¤ðˆû·`p=©:ßi ñ +@aÔÙsº9ÕyµïgU”ø¯œ>Ô™�°½"¯×f#ßÅ%M·õ{�‚ªNrNAn˜�”hb"üð&œÜ|ÍímØ"~Qpï +]¥˜b:³Ö¿ŒÉX& Ž)ïYœŽb}isæá,Û'€êòèW 묮¾IƒŒÙæ×¢7š\-;¤^à÷“„¹óÈ2 +…y.Æ’Øæ~¼óátVD#964F*?¾Ÿóø &\u94#}ÄÒQaE@ÙÐÜô«½&]ànO±‰Å®@KýÌ>kúBsEùúioá´‚ºâ ÍqëYãšw û€r±¤‡Bs€zÁ~æè™-yi“/d +g÷°þ™µ$4Gz‹vÐϬâ¡Y%€ÝŸÙÉ%4GhïY,,@ l|ð3‹¯Ð,à×g6¬Ë¥„fT±ƒdü™�Xh¶°*á�Cs dõ3ǹМ[¾�ùÌó²\ +Íá—ZíÄgV×5œ¡™W=@ÿŸ™‡f% „ó™[_ó<4G¹�}�¹ÃÏ ž¡Ù~seâ3kskÅš£GÒnÂú3׉Ьk¯ãûgÆò4ü¾½ Íæ¸B1¦uý{^}†f¶m*Š)~ rù3š­o&4ç Ú©…ÐüF5L×°�ñÒBP˜¡ñ5øÌZ¡èÝ Íð¹S Fƒ†fz½ â��[˜šL“�Žtv4õÊF irKc@&Ig£~¦ñ¸»Á8Æ:˜'ãb A~ºq4½x t™ÓÔ¶?3 oéîÊhžÀž´†¬K#°¢!¿C•e<^xk&Š·™ ÑÏûϵ¸ëj'5 gÌæB½«f6cFÕê!Z¤]ëM‰Å-^­ºÈTCÅByƒ 5Sƒ¦î—} +í ¶�j‰iÍdRUQkЛžG&f}:ö– �_ ühÉ8KŒ–2¦“Ý4:Œ.ûÕ”½KB0¾xa·Ns“¥Þ¸³¬­lð aìXn¹™{«£«h@›½{8¨JÝ!Õrkò±´7M¾Å§ÐþN�Aü†Èÿ ®½NiµVN+ŠïÉ"INëX;C3¤?‚,¿Ó²J4µ6“jL#צz‘öP±·—©Yʪ¿G=©…öo Êkôì’pˆ±Hê(Vÿó-ZDšŸiš×¥Ø ¤ô66“‘f·aî®�N±‹ÌòuLóöb8�èÐGœ™Ùø?HsàŸÁ6ͦ�7LjÀ·|Ól˼úIs™¾œˆü&tmCÆúj$¡vL³ðžh®žÇ¥çxŸLsWå·|~ºÀnâ¾N7r3©|X1ühŸ6¯Av³…`œBW@VÆ•ÑKï»<¢YåáèΕó¹é·éf>%u­^™O|„J‡Öz A¹¸ÔÓRìøj ›ÓE¨uFy}„u§ À¢YáFv•ß;ÔëÌDÏ7G-šéE]oÐ,²ˆ©n3wþÉøfÖúÖœ ³xWÞ%�MžÝõÝ’Õ>Xi¢i´ààþ»�Ê´¤-�eU%òwÖªmë…ª *‘üÞå{éº;Þ(w¯´í©ƒ‘”®}vXÇ[†}pêÅLj÷Þ+û¢õŒ#YÍ>Lu¦eÊ»WF�VJã™xÆroñLI¸½¦8&ý¸É‡Ûó‚Á˜K �s´Ïhú®â‚¦ŸÈtÉa”¾dîç†qñЕ_DMu³Åy<¹[“ÄÙt QÅBFƒ°¦ÈÅ ŠÿÓYـÉ'ÿfÚ”úÁü™$þ›Ïv +o76’Ë®u½‘0X;!±(� Kœw‡¯12Û ¯™\RZ2¼ãÌ8%¦ãÎŽ} Ï ¢p4ƒ ”a½f¡æš×Öܯ¹1x–yާ&ßÞ*Xh?W’œ«5á7£?t�çP(2ÉuáÍ`‡ƒÿ§}Ü–ïI÷Û®Ý}îåð1ŸFB…*ßøäøÂ`åW-Cî¯éû˜Î¼®¶è»Üo6;Á/¹xBÆ¥œæeacvèÑÖ•ö9Â@AˆL_|NÕÐÀbWeÿQq¸Ÿ�ÊÂ)KbL×¶tܶ—ûbw*Rؽ§¼bÚWÆàÛl‹÷t0,ܹj¬f›I6› ‚P%±¿Ý™_&ã•Ò•-\ŒC;Ɉ¼^{YáršœñcTÊÀ¬‡Þ˜»,ŸL!º¨øg÷•é¾gú­�dz…ɧ™R›cõÇ…œmî·÷8í`P'„z…¸¶Â|}Ó@D] ¥´“øØV)_ ÝtÖäºÛÉ÷îë5,2©ç¥U­L.oZ5»™fÐËÌ3H�h“Þ\7t´,ˆÎ¸,½ð‹ 5ef‚ú¶/–XQ.ŽžS/÷-eŠ�:vÒÇ•µiÔåu|Oƒ Ä?Q‹q-Þ2"¶äLFÀÖNï[ÝB\è……Ìղߩ‘J¦|Ò©Aƒ¿ô°£Æû×u %¿´ÿJ�‰ Â�tìØ,âsQ¿ t•$žcÂkÉÀWČ˅Ø8䂜?I+\bÏnƒÂ޳,s»Æ«Ìiüvè¯3\†H–�8�Ôó +‘ÃÝÿÝ™×�áÿyðRxàÞÉój=ìÀ þÊIìæ*9 bC ’Wχws–ÑiKºÈŒ�ÆO¦-ù<ð¦–̶ÓÎ�µ³¥¢]TÅÊž;Œ¹m}%JÉ"bs‚‹9™‰3|‹�Lèä¬Ð|…v1 µ?¢1Í‹9š ‰.>99Xë5}5­$\‡³!‡´Œ–Ô°ê�YÌA‡(ËÖÅùèãÉh«ùT­·AáðèðgìêëôbŸ›ŸöŽôs ꓼÌ$Œ›ü¢ úLÇÐÎN_+¤}-)j-„úÌÀešuôus¶»A›ÄÖ è÷½ü!¼óëÇg£hxp@Z­+�û_¿prjQ:bìÃPÝ!Y1 KA;bYžñ:$‰Ð K¿¼ÿ˜È�X[õN!ä�XÄRhKÖ%ü0«7â¼ äˆÉZ*f¡;F g²š3VË ›Ho5/Sƒüa"G<|JÈ…ÃGl|«O‚ú‚>Ïp�/™­ëè°}Ú–ãaV:#&ö!£ÎéBqI]O Ñ&›%A$ �YN|ДÐÄ O+öƒ0§Ù’neLïݦtU vÔ(SÀà™‚ýs¢%Ø©¼#‹0àCk=d¹3…ÌF®ó*½96~4¥aóLÙ÷TÔõáæs–sù‡ˆ(ÃK;î�ÖÆ!íï¯ÆÖ’ ñ¢²šætXÌÙX�Tºãcu¤ÈSëͬ† ÿ�Éß¶xeu(¾eA«¦ršÇÅE*K®„#‹¬Dñž5³Ì‹úe–d Mâ… +tKüý/ÀêعôÇR`óqDšˆp΢˜Ø™Ï�ÄM›‚ÆjðÚX×ÃéÓS4l˜¨�ziúN�¼¨ÂÆRlqÁ™œÃ&ÙNû P«Â9Då mв]óÊÙèMÞAÐMY¿44¹diì‡?>î”Y«TVf¦R…rjxǪ;M’•/ksjŒ8TÙfúÞlöÇ ïxøiY®Xë/´è OVy»NÒÇÚÉ´@JþM5bGÜ|›ÕˆIzIgF­òŒ×B°y`êx¹Ïea… ­a>Ëå?˜ ­R6¨ G”¤ü$å€u˜J‹y!þ<0õ~ó`4Ÿg%¦/ @ƒ2Øû;àåæ� liIKÎRn7t-E!)ˆnäª�8ë ÄB7bÌKâ«ßp¤%B‹<��ž0Œ.Ðå„þ/0[ßü2àKØ8:¾²Ble¥ˈš7m�È“ñÇxaÀè“O H¼ÌbªðøCë!›ê©ôò„A|$`>š’Ÿ¶Îèž9D•BRøÜÛç�çÈ,ŶàÇ<&£¹ˆI^ORöû;Älí�"ô+ýŸ+xýÉBÔ(�«¸F9ÿÅ lG×tR�Ðè©ùP x‡fÈ‹®P«fá':¬€œîLJf#™ƒ¹XŸ ¨jfSðrXŰìý çcˆ|µôI­ƒ53A‹ÌŽ�-71wÀ0%4‘­�³±!Ï=(â(°J°äã¹î·$Œ1WVÍõõê•Ö¨=BÙ~Ș¤RbDõWeJ…� 11V‡§Ç¢ë;7]N Bìý¤µ<�ú ’Ž{rú�MÔŒ™\*ƒ>7‹y‡'c¶{…ùæËbÞ—Âͽ >†ÄFš­*ðNå^7¦K�U0x)îu�¢ÌöáÀ!’ÅÙ2„–: �õó¢ØïÌËø†â–(B?Ç��‚L/z3ÀKä}æSò©83?…l`'�øóÆk<•>2üž‹š%¢ 2(=>™�:L¼a ]¤úaü~R‰?û±Çsîsåg%íYœ.qr}¨0:žÏ†RÈH¿š·fƒcm÷û?ï¦Vq¬Ü–MeF*ßk{(6Z žU#„ö”6ö^i\Ì÷±f}·óìé(G¹ŸâcDcŒ2@´hg�½á9nÇ ‘wz¥+!Ô΂ ©Íù¡ß¼!ö�Õ뚘} ¥+â1Í@Îf³è8mšY‘ÜȈ‹ÚÓ‘ovèlÅ ªþ¢êÒaœ{›“ÊÌ�cÈ*1˜MÇø'^P�' ŠËÙ©cq‘Œ·-i}h²àÄcœvŒ|¤ß6"¸ ‚‰¥bÉøw¯ˆ=Åï䄪Á«´A`Q›o�±?à}Èyãéú«DR);Ú6†�3žÛŸkúÃÃÑlÙME“î®ÓGß%''îw;9_á.’=R:Ä ™ÛOå×àiv{¯2sÒÌͦ¶8·€/½�R¾†D ‹ ßÃúÏŸì ×¶yáýlš?h&î-xØ÷ÐfH^^âöëÎýBâÒ½¼sBô[s¯B�c¡§+£Y G¢òÄ(L2²"eúЃ•0ˆÆ2k¢¼ùX!!xu¦¸IÎÝy.+û8O°4;hià2g fVßs`ºUöpܤ%óDÊvf³ýÐÀÌpT�þ}µ±ÕŒîPéÁú*0e×8pÄNÔP,Çd¥û{ÌO̸NË ìÊ–ë_¨Ï.€KÍñ}øHiò· ý`Iÿ@å�/Wý��ùæTÃælHýð(V&ºõÌEþB’®jŸ—åg$ùp Ê£NŸ¤·ÃÒˆ|ù9óní#*uv¸H$(™O%R г€S�s„ +Mé6uã[­ßΜ�…‡®ˆ{Âüç{tYФq¹EbŸ¬JUÀ?Á'5Ba!Кï²ÍÎÿÒ„Û’ý�êggR}¿ƒÀüÚSBz=jÎ;ø]ï¦:#Äxc©�Id‡í~.{ç中TÜC•8¨V¨0lìA6h`BšØÄk8½è3áP¦{=›¹™Ï©n ÞmÞ|ä¨L4‰]ðq浿3Ù¸$èUÑqæŽ L½`tÈß6®qínB˹Á‡õ{”i&~ø7ŸdR¯e.ÃüÞÄX +‘'Á›¬Ìü>˜øÓ†^IÊNlhé†Ìé_m8¼yFû“5jÍvÖTÒÿp?UÈ �Œº3W¡‡÷E�û�‚V_ÛoôÜÀFFíB4SÔܸö¼ßÞö +�õ +@hQ‚½gT%"fƒý bð\ˆ^ÇzQžèz¦�÷RXÔ`pÜ1ÈRæŽJI´õ�u¼-  ¶#:Ó^†ƒšêݶ)8»‚°‰>îûõÖôMh8ˆÛCuP�ØåŠsSÁ,o¬ií8\Ö·¯Æ°k¾ODGû]�\‘ +j#ËÊ©Ñîô§.e$ºz±µ1ÊMFér¡Ë Aªxq¥ƒ¾cÐ*Œ¿R}¼ò/’Ø5¥)$²’‡P¢µe7*ºöBáï�É +©‚0Â(Ûa¸ÑeqF}3xŠaŸñÅÐÑØä®O†&¹e–¨׿7ƒÕ Àtãõ£8Ü;óõW¢M`¿ÒÚ°7÷ÍLçc.Š\|4Œ”ëlˆ§áYü�“&º¦rQLÌlÌøëæàÐ!_¥+2OBo~…©fõ0—U-`¹´ä�ýij8à‡_!ÝZ(Á?#Äb£C3_¯K„ä‘“HÄ%þ"ÎY'aÅÎÝ0Å«ÌH˜×Iš©9-Áá¶'>1ŒÌ2‰Z¾ê‘Ȇ_H5 nlyñ±x~9�A‹m„ñÅ|Ù2¾5¥YÕ/u{Q$¯©|yìÅx^�s§ãÖÌ[‡ú•\LQÊ@¢©äT—ìšK]Uè8ùsƒÚúo§‘lÀuTµY”h¾.û`ž¢Ø6HòFRå.´ùT»ÙEÅÇrHÓõ’ˆw(po{éŽ�x“4 ,(aH'nëVKhÌV¯`Ò´“vãýgˆçƒ M³á7r�ì nË[bi:"é®÷‰“º(‹"’+­ßúl9B³%a}@27ÅòÞ$â{šZˆ’÷'Œ'$²¡¿»9b©Lc¸-)ÐZ\¸ÁeÂsnzxœqÝ`T{½l;{Ò�|‰VÄEzñ\I†L5Ï4IîÈ­© öña¶‡ð+qG”!1À[»Y{„q.&@±ÐXŒ|ƒ�‹ÙÜ·s””tGyšO_GŽØ½'¦NUÄ„zßí¡C Åë7Ê…¼ÕC¸ï&txÈ-UÇ,ˆâ:îùCG¦Yñ8üEÍåœ@FK»Rbuúàd‹C¹š½¹«UEúh²Ÿ Ç'qú0„íuÁâW­«¥m>›ì„Dë7«¶®ýLùM �nÔwÌl`ÀhØm�ÈOô}i8Gø•M‹ÎسÊH¬(Ç 0L¸Y‡e—Qípà`†®¢PÖ¨\F¤J^«t´n#e°O½œö>`ìÊ�¹;¼¼1T‘«��ùCú•(˜¢ºÐ£(“ÕÈ=ÿói! þ]CsÍHÑ ¤avX˜›ô�r9ÑŒj6}S»FJ•_†n13×<6’<ôr(y––ºïNIvóŽ-Ȇ&ÅZŠÉÏĺxMB™7J²¯‘;åb€S�Ÿ^Â2Ò›FÄyUçgÙFÃú¾û§Ó•­ÐC¥ÖJø{ ñ«YÜ“~âÝɆy˜V×nTŸÅ¬G¨)æã\Ê/În{É‘*SϵÔ(Œ�ÐÙ‰¬†-©d1#—7² ö`‘uq膩ÃnÌ(eÆzNša ã‡‹µì}…�c)g<¯ãÙ¸úXf|C(�s¤%c7�¼Û|£Q�}Ñ…_(øH('oGâÝá`2à^¾Ô‹8!ÓJp{àßÔ0T BD5’çÅWçÎCfÁs%Ìží’˜ICÈWß&,iJ†&’C—'ì:ƒýƒSœHhZi¥/K¹mXîMôMgûì– ¡ty Xmä6›ìã]‘-=£o¢b܃ÑUn=0žÛSïÒñ†ä¢Í¯1ÙŸ™_mH®Sç:ˆàug®×æÝ2ü„(&@ä÷åÿ¼1–þK~kDœüý†œNñ/’\Û?‹‹ƒ9M.°¼Fp(AÄ'èª Ò�g1(¢ñáaá«^P(8=ȱ)!¯D\�®|=â¯ùwzö`S#÷äçGÉBà Ø_›˜ÚÂÈËÊT*¤ €çVDÖ…“Ýy´»ÞÏÑèÔöyâ>ƒâìÓÝBõ¯eŸø€dä¾hÖlÇz�AŒ;ÿ,RQHEc40¦>BeÐTaÎÈRÂÿçþ¿!€°÷®Á=aaâyo3EH¸˜ºD€»º#ÕôRcMÇ7l] Ö œY!DLÒ�Gkòîi¥^¹A¤é þ­ÌÅ’åÓiMô¨yyŠº�×�îæ`|SMûÿÎù_ «�‰‹¶¼µú1Lq§¨§‹® +­Ÿ{í:¢5DÛ˜ +m$F†S�;ɃêñÞ>»·bÝìf3àlYé§!‘‹çÕú�nuÌ ;ʨ$­á­Êð?bSÅŽYRAUo©8›×Ùsf9æñ+†Ü†Çy!«´ÙÞQ5Æ#˜ÏÄm§’¬�»+O„IFsÿó¼Vb~@ô±Ë„¸ñÃYãxº¨Ã8Nt8�¾‰Ïý«Û»ÕÐ¥tÛ ÿ kŠè´‘�ÍRÂC‹ +ã3q˜DYg%{·˜j!¡C«úÃfd»W‰±¨ZÑé ²i4x�CÕ’‡ÐUoF®@�âu­Ó'6E>ÍYîì[á æ`rqžqs + ×ÿÜÏ=�Q`tE…¨Tg/›¡”ÿµ7�™j€ÞÂAàU0ÉÁUØÚ»yÐÅ¿üÒ’܃ۊçN4Ì“/'Ðh€öî€,<É|kåÄÛûF|ìE™yÊëêÙUfñ]IáWóS€Ûi©î`×f/  u?OZwÂ�?¬œ°òÞ3Aá)�m¾2Âo~`ÒÈ�l”ÂÞ"YÍÎ&Òz½ø‰$R�ËWÌFP&Â'7­/ÒW˜¢p¾¦@, IOÂRp &GbL'¡Lå~¡¤>ýE#}ü‚%»^“EA©À­£¹RM¹1Pºä+ý5�£1¨šqÕ¶7ÖÁ™'NˆplfûY7�‚öJdoš|�ö†‚o�©…l¦>:h¤à­!CÄÓ“PøÉÇD� rÀ³ûi8ûµ_ìÍøD_#Qc¦°r+²k m)è 9Æ„5‚ÈáhКö<çÎ ô-ÍÇÂàê õSßã€N2¡íßÚ¿Î6Ñ„Éüå‹—-:mèÈJó)ŠÝ÷=a;Wˆ%•I’çÎl0²ü÷D¼ Ñ?1 ¢ïR�êvDµ,޲��äÀ€´‹ž-lTÁïPhÆsFô‰¨cˆl~•‡~9Há.ìúœKíÚþæxt[g §òÚGà¨bâHíÕê©›˜< á Œ ™„¶è½¹¾ä)M̨Р+”l’xJ(— Ôó„áõØø�¢ÙB�ïÊMmsÿ$ìÿAhÖsц^élýåÙŽS;0õéø£½%ûnþÎÖg‘c1¹éCUÝHãoò„@û ã‚Z^Ði PóT9ÍÚÿJôèÖšD=¥!MÐuàDûᦖ @¬º…÷šùÔCéä'Õ›ù�ÊŸ=Xësú›pÂÇW×—‘�'^ô�­˜ºQ]÷�¡ðE‰uínÄ€L žáoóºš ÌQð_é˜ÈΨTìèäŠÙú„¬š3VFQ�D!M®YY"­�ÉIÀl gk ìÁK[”\Çz²‰òhæ&p¤ýïYÌ´Œû§güÛ>8*S9¾s½U‰5óò1|` siÕˆXê]È ;Þí8+OÈü§Sô®s5µºØ€Ç +–Z˜œæC›=ñ­‚=ó/ëqwTE?>€�ru.-~£<‘ Û`8¸ÃÞ:�èÁi”�â˜ÐäàCÉÁc•ÿ‡%ö´EÜÁ–Q*«­u‚bß©“3ý%fú1¤†LÝÓS°·Þ„ú$%Qî b‘®QE¾м§§àØ`#ï�­rߟDÝ@è{ÄŠd®^�–í¢dÜH� zJô´`�jéCC‰7û‘`¥(¿Á ˆÔ¢�Jê´wóCJÕÈéiAÔµ”9/3lÈLOÁ¬¨QDÕX¢€áBÉ�Ö¸Òaʃ$N³ZzÚRKùÄ`ö�u#ýAíEÿx'ó!à@(pì1À†"s¸bM/Â>䌥a(J�ðPÒu´&n«éG�eõ®Èj>˜ð³2…Oˆšâj¶T +âf©¬Ôºl¬T*5à28t£€€!êÚRnÂÁ@Ÿ› Ô²@¶èc�h#P +ª@6Ë@œÐv´ lãÚ¤ wmG!qcmR›’iSy´)lºXÎ…cy÷3‘>£ åcÝx×å>§Š@�¶•�´îÃŽ4Ã@…8­/}6~bK«äÓŠÔnE H`iȌѨ Î=LcnXÄ»´MO FÛ-ßãPÒ§O¹– (=úÆ©cx‰ÐˆÈ-GfïÚÂÌ䘎$dÃÓ‘D&LÁ/à0ÀY›ã|È0†£Ê€ƒÑ ;�•Ùdãùåo¼žD’/ ÌÃ#ù � !‡Áž,b(Yš~y�ÓSPôJ)})Y�é)è°¤z&/2Û:9u#½8¡`NUÊH¸Pô—qU +¢žÌ±G †6i’’9Ó²Ñ +µw-=EðjѪ$Ñ …�Xåôy<‚§d6|¹ÒÉIÿ,”ô£¡ éédÙ°ÑlOÁvceÛSp4¡X%ñ8¶ws_ZtÝH•Æ„&›V0¸4 39j§&à]—wmÞ•…Þ`àH•"’QC ×szt¶‘P¿§­û Ë�ìÝœc4þ¤áaÖvBÃ�—ÐL…¹Â_/ƒPƒn¢ +ì&Øy·3ù°Ûœ™Ø‰j¶°ûdD§‚…¸Á0”¼kqب¶Iš!s²RJljPßFó{ï~ +ý¿g½ £5ÀÓ…ô.Û©ZòÀu4ïÞTÐé=Næ kDO¥ é"³RD‘·»‚ C~µëg&�ï7/p“ùØÞU@ÚOônhC‘¹Fjt71àÄæô¶"Oùbx×Ü«Ør¦ÓY+ꢫKîj„C€e\>]z¶@qµ´ `HŠjSqjí]ìŽÞµHN)ý‰Z̶CnÕGÙ-�ö}lsSmCä7ˆn“eš‚Ëݻܟ6)è]Ï@Úr©wßcû�ùpêÂ.lÛ/Ý«˜Ka§È0ÆÑS³]4¡‘Y÷À—ÆÇ”’”Ή§I0I—ö.M«~]»„a{ÐÏkM$,Þ�•�w½Kò®w ŸÃ»Þ�ŒÄîUPfUÞ†£uóAÆŸ (®RJ” éÑ�.}S¨0+Í1t›°>‡.5Ær�?ï~pÞõn¢€kIU³Aå"…R*Ö5)R+YÔT� •‹ä‚ò’È’e£‚¢“ag 1Ìê]Úˆ°îµBÃ�˜ ¦Úp]e[ŠVy×»Þð®Á…ÄèS…2[5�J†<dÖ}7ë~¶a·«é-‡Nä[sƒ[Œˆ|èˆTd^(ÊãÁQXЇ® pÐCÌâ)vÞ5p ˆÝ˜Wˆ.µQÀN;”—PiK¹È6ÉlÕ˜d�õò©~}ºuËÔR‡Ô&©³~¥­¦zWgô¡QZÀ“%-àA€9=F$¹3›Ð'J IönÊã¡M2¬t’i_òpÔ*¡…ñj÷w I >£ +ì,šåuŸ)v "vëäÃ.Å™‰�Œ³(<"$±ä̸7ùQSä+ýs +À¬¢™!Z#GõnêÒgk—úPÆ’HEŠ-†$“%-à?PƒÌ¯îëb°××õ�Qv§xŠ]¥dv¼m¿ïÓ +uÇ`e®ß)rÔÚ'(ú!¢dÈŽŠì0ªL£8È ŒÁFýl ‹ÕNû¯ s�÷ëÛŠù­­Xß>8ßçkòî×®¦¼ÀŸ6aŽT +.˜iò.N²â|güiŒ¸© Î8wœqï�Ï×5qÆßÕLbÒú¦èÞõ.É»$¿”¢Ç÷›jXåüä�/þ‰ýSÚ‚Lƒ³ûIMzw$EòÄæ�$O¬l³Ø³B‚„X(„›wÊ×ažØ¬q ÆÐ»b†a¨¿ü�â÷I‰ïC|ÞeI™@dæµ&øÑˆr·I"âC'gº�z +nÓ�4|?–(:ŒPZ‹†-.F £5bÄkÝ|>ìdB£8R�•8 +É+ün¿BZ7¨·íUü|0aæâ i©¨Q´˜é)(Ž%0“hPÈìÈ�Z¨-•¡¦d®y�ЖâÒŽÁ�Ùž‚’í)K=ÚÐÂVÙž‚ÙàóøQÈ~¼�7ÆðaÚæ 8 pïŒYò`K©nÚØ÷@Ð4$ÅÚXtµV`Àrâ ]ší**ÝÂ0+CAÃ�—BÍpÖ{·µ…1Uq8ׄ&KˆŒ&ZÃ.)Vî2™ 0’Éä;Ádpšp8©§ oa ›ÔSá¥`&õ̚ϰIÞ-C=@Ù¡ÒŸ>‡È�Êô¡ž‚¥l!y¾==iíé)ø‘R)˜=¤§§ áDÞc:"ï]N°K 2k‚ž‚y³ +I^…ÜÀÚ:C$ +«°ÁõGãÂùþÁ˜°ß{ Õñ}… § ÈÅï ­‰Ý•ÖgÅArz +ꆨÒL¨0 ª�ÓSp[)NOÁÝq°Zgz +î‰ÈfµÀê1Ã[” ¢€’é)˜°=(º©‘ðZ\‡PWXr2Bz£“¹VAèÃØq¦ž‚#ׂzÆ6)x2Í0¥TWz·´U�d @'‹Õ�T +H¦üt(¤kŠä ^™:ÝéJ"×*‹¼RºÑr|#8\«-À†!9¡Æè�€K“ÜÞ ¡ÈF´hÇMb¼{À…Þ�En9Ѱ°ÄLW9ªÀNb£€�(€+ìpït�a ¤ï?ÉêÚ¬´šC¥ ©4CÒ +t¨Û +Œå]ï²Þ58•O¹$.+SØíØëóîAbØ,YgÍ͸aV“^+‰S‡¼Xw¢‘xžç]V U €æºaVKÃÝXm ³Z¨ ‡Â, n­Û²b/TK Š—{pUå¨ùåfϯǾqÇ&/5?µÖ_žÚìÜüžÍlž]ï7£yìo4›hÙ¿Ÿ[÷ûUá²›š¿Y¾>K=š�Ë/Q”÷Þ5Úõ¸5>ËówÎèÉËmj³Üæ¹ù‰ž}ä¿9Ïg/Ñ\挢gæç�=ÿïÎÏÝ?sæèïÍÍr|}/-ŸZ£›ç³üÌÍs<¯ +wÍfùŸKÔü7sÉë±Ä»ï~žzÜ�ÑÓÌ\?š¿,Ñ2Ÿe/M½?÷q?î7†MToŽî³óGû•áþ&Šž}—=Ñ‘oÜ/êàªðgþ]Ÿc¹ñ™Q]vT›59:rlš¦Îœ—§ÖÏÇrc~c˜?çßÍ~rs—cߘ_Þ'ï¥iîœÍKþºŸ¦Y¢(:òÇeÿÞM®O�Q­sמûÔùËÇ-ͲÔ_žæFG®o £\çœs‰n³Ÿ£ù˜ó/Q½Ë²óó·¾2¼9ï¿M“ŸýÇrã7{™ó›r�ûØoçs'‚»îúª¶Æ'g�{ï|ëÛ[ã¬ñÆåÆèU¡åFo w�óÖ‚O�·Æ¨Æ�ÿóŽ¢(jr>n}UÕ˜kŒr�yiš�çœó÷>ÆðyÁ]㮯 w�O}QSßš Õ¢6 Ï+˜Šƒ°«™„õÚÐ:¸…`½6Ÿµ,ÜŒÑ'ª]¡rœê…{Í* +EËŠ­f(V¡`àuQ(^(Ö­öŠÅ$ +Å …x¹ùeÏ&:ž¿ÎùÔýÍÍÑÏ#Іà¨ÃYY KEfHDDF’¤9C@ Œ2¡d`Ó=A +Å1™D +£@Š�(Œ�†‚BÈÃCl̸Ƚ JG¼®¨ §LnmMoµÂèE¯ØÏ2¤‰„à»0­æÖŠ¢´uP‹åsh÷¡ëd ZâHuÂHL@Gïr£_d5”Õ�u^`‰‘œ‹ºL“º\Ÿ~6™tªMºÄg• ?½ŽP%Æ�Aσs{‘?$àÑã�g—SKzXVk×øMn{?3�Î7×¼û £ÛùOmêú�+)y Íc7p3·nLãøŠà–ä/³®?’ž²*|¬œ7}i‡£Ç=Ńp‘X*NHÁ‰º¡GTE:æFvt<ÛP™„�Ÿ[ZÈ´S7âÌÚ´›O +Ÿ¸™®‘8½ŠÑ(Ö2¨.C‹á ‹y¢ÛÇ&¸!!÷­{Ïõoú7¾G;BEa§ª¦½rL$¡êU®N -l×é8ÂÎ¥‹$—_hô²®)`Ñ‚?(k´ÇD™‚è9!G}HÂ8ÜSD?.°Í”ÞQìzš«àÄœ[ñ¤µ˜Ëõ‡£|餟n8>.œöxénùí´$€\‘ªèwÐ:ŸþLy½®D 3øTÍ€y0�43(kI–)jf J¬¬ïFÌhfÀ­À©¼ö™AÌV3ØÅĈÇQe<ø8“D›~!Á:™ü\~ùkš=øA×”mtò¯éÇŽZ~à¢ðv`òƒüKÕõ“X{ËH<蛽 otàPòƒ@k±nùÁÀb•ü ½”'ø� '?ðxƒh /ˆåS€ðBù!%ž²6Ù•ãËánD®3ø¯Þ┇%± Øchg¾LÇ®øp‰LMvL‚ÎøB=Ií (7ç¾3r¡Šù£4düØM÷õ<�ÎT•2aÑPÍÖ¬üÊœÌá¿}"\`4¡RY�./ÌÛéŠ{ĉgñx¿äCO"Ò¤úcFa^·WÜ{ëüJ>›´úQZ¡¦ n)¹ü3”!}^R¢kÕmû(¨ß« ÁKÂŽ›*|y‘FƒWè%B*F@· ö�Â"¬[^Ðþ¼áWÖâÇ\="€éû$*üÖ®ð¦D®‹�í&—r‘B-²>½oj¥1ói—§(¡§¬‚£÷ò[æ¯Y¤ŽÂ®>­ÉÍ‹úD2ü/Z+! ‹Y”rûÉQ²?…šLÞe=æ/SçA ¦ªÖ�J¼Ñ<»sd�9©ÔÜÌsGÏЋ>÷Üè?у°�Ÿ-�"7sÙcž?Q1îþÚ±”+Ù'qœXeš@¨ó›’ãõ…5^•+ü^|϶CùEèn%ËMÃ5°c +_æ¸Tv?'_sE¬žx`KŽP;ûDŠ5†gÖHŸ°[ƒ„¯ w“¡Õ¬¿6,ïÌk<ø¯o�›¬ 3ô1ÿÚ©ùJ�l�ö¥){º‰4©]š½=¥8§láSùH˼ Y +rŠ–ßäñæ/–I»ÊÚõ^‚;ÅYeDEèKmõÍ5˜r”Ô ÷Þ]¸�¢ï†C +à"¨¬,Ãå¾~J»vý�iÍoǯ ‚Gý‰ÿ…à£QeÃ*ñ‰A|1µÜõ€¬ËßE¦UÔsP2{ìkÇÎbn6*ó*øn7n"Ÿ;¹Û—D `}•)µµM5û~þšÞiþúr™TÚ{ã'ûSl§T~`š»lAm« !Ã|HY¢²QIo9óÅ=;ý±”ðEܲۙc‡I…¸T‡>�vŸ0W·ÍlÝÅ'B€" p„_œŠ~'£î>œdyS¯ƒÚ&˜yû*m«—Ðc/Ihim¡¿ª-ü{N°È�<ÁÉèûÏsâ¬\°t¦y$åî¼ KÙï“–¦eŒ>¢ðªé'”~ÛDbúUÁLÛ>UbV¢o�3ÐÊ DV×¥Xk¢-+d¿Y6�Š£aR¡•Ú¦œ¢õ\˜£Ñ»4½Qd�ß’ ²^Šl]qrE·Ò‚ÞþÛìK·U³å–Ç… í¥Ú?† ÈÜ2Þåý6ýûWú1²–j(uŽÂáÚB8¼ë…“Ùo[¼âüÍNçn~©DœkÖÕÈy¥AÛ�Û>"{�aTÚ¢ãÈ^�Ul(3 "€¥Ä†‡”~g¥&,‘„žôÝl77ß«»5q✀Y.Gb¨‘ü#á�‚ŽÞÊR„ÑRe Ü­Ìe9 ±�ø‚eOA;–hºû¬ðFV¨glvótwÇà݄ީ=LîîÝ{Úïo=鎶DèÅ‹†}Cf‹œî kjÛå$þ-mƒŸ¶ýåv�ëàˆp׉n¶Ì£í»üh0éHç ~´iz¥-µÝ¾m^ IN‡¸ Ô¶bH<©ï‘G†<ªíkàð/:P+ò ízU×¶ü´�Åx`4Ú6E;ªLå좶/â6 ;À—â˜s3º­ +/zÔvÐÞp;šÄ'bÑÜ‚ä"ë6ïÔg€?áÏõã-ݺÁ²GÃ4ÓÇNêÏ—è¡Pâ“¶Å Bgq‘Q6éRª*ï ÖÈó%J+]wÕGÂÙ¡‘>²Us9I;cè´6ˆÃZ0pÀ—CE$6T–8HÙ4|�¥ª.;€zžllê3xe»wly®"”Õ³¨~piÂÄ| Ûl:¶©ó×FQK $¤w~ÎÀ Ã?gÀ‚ä�8šc;$Û2e88‚™†3Oº±ï!_¨ËdÇdî ÒL[³ýlþxŸ#1ß ña"È‹±ç=<ö`÷i˜ó=D†\›6âv ºÃÍàft%¹ÖL@¤+'ñh-�Ô3Zd5ŸkÁ£‘OôŽh ÷ű�UêZf +6L@™÷ÝÍ”'»œ.–O`¡Æ[Cê®Kå£äZîäC�nÖ ¼BÔu3±€8Û<µ´4 øfBà«[#ÔC?| ‰xã>µƒxêžJ€™O]ï¥ë{£.\ +$é‰ÄÓ¬CcW +_ެÎMÈ£ßþÄÐ%(J1jGºæýçþþ"ÓÖÃhûÿC”;÷w§¢“43)M �·FîÔ=¬|W%Ÿˆð›Ö 8í6üO”ó fµè!ªÝm zq1w[AP]8+³Ýn¹Û¹Ùíö…Ìè{t,¶ÁGy�ùýA�¯ÝÒ‹ˆf +ì�žhÿo;X‡­ žÛÏœM"Ï�öÛç?S]öå¨ýo‚¶.ìÿEÚÃÔѪ ­ö-umÇ>Ê«'È]m­®bõW'¨,€Ð¤¿ÎŦLäæð¹9ýOê )ZÍÕÐ%»&`¢gŠ»äÂPŸSú�&êrK„ ïâHûžcÀ ú,‚›lGB{%XX²ÉPÁµšl˜¢f�â•C(¾ÇŠ9lYÆØé˜]Õ± l» ›”·X�£¿+Jp2ÒøÇ‘ž3ýªCýxøsBŠ´ÉKó¨)¼P zTjˆ°5P‘Z ·` §µ€¼­ûˆBà_›É·¶!�ø°=z"ê÷€O²‹}¢·Ž­ì–Á4%SMéª!%Oc^@¿Ž =:WÕ‡ZjžÄ•÷ÒµÒdÝÕ?GÈ[bÅ%ô9ø ê¦ì!ÓeN¿HÓÆs!Þ«%fju8WsΉŽC™´Vïì¾ÁŒnpfÉH¨åË�T½…V©²ÖÂy5/ãO^Mr5oÁiW' çj&×£*JùÐæ›Y š5Èú^ºÏ ̲"ëÕ=Í&=W3Ð�s“ äŸ«‘ÊpL¾<45³dÆPÑ Oúhr¯Ðq6p´ÃYÉn±NJ‘µ’-ÈÍÕ¼xµQ™…wÅñ]�ÎÞíªÊ÷ª”¨~c¡ SéiÕìuVôô‰nÅŽ�ž­Žt¨+ˆlþÐUUU"gU±Il� .eËTõ$QU´Lš}U­@WùëV'Uë×Uþ:T͹‡Á*8••<3±ëí#KÅ1o;¨5ô¢vÕÀ\œÉ¦ŒÂ×°†4¶«vo¹ê0Dè‹c XB»t›O½ð¨ò;íÓ_vÏlQ&î‡$î.}[¶•bD5‚çK˜Š7¢ø­ª é9œ ùU ”v_Gz¢ïÛºä²N€¦(ØX݆çZ-8 þMF_’.%°¼¡p�±a<¹¥ÿ°ŠV‹|µè"iƒ‘‰¨`Ÿ›Æ:³Í¤ØpðæÌ8 +0ÍûÐÀÈûU(—Q܈ãÚO¶L­F1ý4X«MX +§8Á¤ßù�Yž‹Þ�aª~zé +2µihñVÁH>ó@¸´°)Wˆ•�SQ·÷ƒN¦Ãàßâª5¿©zïÎ<¨¹?<(D%Œ®fg'jÆÄÅ7_ħ™ö¦p^ +�Vï\¡öÝ Tÿ2) /˜ù´¶/=)÷ á 45¦ŒÙ“¼•CòÝ‘´áo@ôûe“¾C>B$¯ZáYʱ"Áï邃RŒFG´Æ$¤}~ŠX¹|�NTÌ#l€æd¤>/]X‚›é™¤›`:ZjƒP~»·W2//\‰¤ƒC«l¬9BŽQk¥ç-v#ÄŒƒQi*cøµ;ºUÉUx׿]T¾�­LÎ {)yr$•c¹¬rã@cš„à$у²‚Quƒ"*Ïâ Ôb¹£Vµ™É– +eÏÌþCÙ‚CÃÉ…’8Ò“c™ç’Љ¿¼·*lŠþÌTjT$Ç÷J�RŸÑÁHL.H$ £ñÚêô\‡Ã˜Ú´×÷­ø/µ0Ixð¶¸:±ÉÚ¨¾iHß+´f›±Nâó¶�ãÀ‚¡ ˆ—mÛÆ "š¢¿Œ@ƒÅyÑR&»`Äbô¢u¬¸V©PêFÖ@©AKm!•ùž§ÌÑLâ©15¡ i6ù“`Àô)צkt<ÇelÔ +5´#á* +«B'Øfso3±râ“�”^` +Ó� 6¥Ô^ ÐX"P‰�´w ŒN? œu/0Õ'‚’ÏÈI496"ß` n±¾¶—­m`=´õ 4¦ò<„´'&› }‘J£yÕÒ¯xl¬I§úa�‰´ð¬¨f<v�ÙYò™úÍ8ÝfâÒy�Ÿœxâ¼ÒX’ k*»fÙý$™5cÊ—�€ßЉ¬2†2áÿxH¬BèÀUø…rN {œBøÃ'T¨Ò Î Äv¸Q$$¬ü™Y±d16û˜·öWöXÀN±O¿mà €tM òÜ‘~´¹ðt4�0À ‚•‡®A]ŸT•Dè¢väo£ä.¹rV:`C ÿœÔ%ÿûk'n6zìRî”ââOÍ Êÿ§eþê'�9¿Ê²Ç(SèyÒ5«ë£ë„O»u{»ð7'+Û:óMµâäÍeu´‹õþ8µÓçMžò;-¤à£íçq%qèVE™C6°ôj endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 17 0 R] endobj 17 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 10 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 5 0 obj <> endobj 21 0 obj [/View/Design] endobj 22 0 obj <>>> endobj 9 0 obj <> endobj 6 0 obj [5 0 R] endobj 23 0 obj <> endobj xref +0 24 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000015760 00000 n +0000000000 00000 f +0000053735 00000 n +0000054033 00000 n +0000015811 00000 n +0000016178 00000 n +0000053921 00000 n +0000053249 00000 n +0000016696 00000 n +0000016878 00000 n +0000052675 00000 n +0000016952 00000 n +0000017096 00000 n +0000018556 00000 n +0000052723 00000 n +0000053395 00000 n +0000053515 00000 n +0000053625 00000 n +0000053805 00000 n +0000053836 00000 n +0000054056 00000 n +trailer <]>> startxref 54247 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/info.plist new file mode 100644 index 0000000..0b1395f --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/copy/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 5 + hoty + 5 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grab.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grab.png new file mode 100644 index 0000000..8320d6c Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grab.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grabbing.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grabbing.png new file mode 100644 index 0000000..6c2c042 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/grabbing.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/cursor.pdf new file mode 100644 index 0000000..3dfe8b5 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/cursor.pdf @@ -0,0 +1,1310 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + cursor.03 + + + Adobe Illustrator 29.0 (Macintosh) + 2025-02-21T14:47:43-08:00 + 2025-02-21T14:47:43-08:00 + 2025-02-21T14:47:43-08:00 + + + + 108 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAABsAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq0zKqlmIVVFWY7AAdziry3Uf8AnJ38lNP1KSwl8wCV4m4ST29vcTwAjrxl ijZXHulRirLfK/5m/l/5qITQNfsr+dhUWyShZ6eJgfjL/wALirJsVdirsVdirsVSfzH5y8p+WoBP 5g1e00uNhVPrUyRs/wDqITyf/Yg4q8/k/wCcpvyQS6Fv+n2cVCmZbS7MYr7+lWnyGKvTtL1TTdV0 +DUdMuY7ywukElvcwsHjdT3VhtiqKxV2KuxV5d/zk1f6pZfkp5ik05nSSRYIJ5I68hbzXEccw27M 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 VdirsVf/2Q== + + + + proof:pdf + uuid:65E6390686CF11DBA6E2D887CEACB407 + xmp.did:69f7be03-8070-4554-b0dd-b654983b4b90 + uuid:0b0b0f68-6e3a-c846-862f-093460f538ca + + uuid:02c264e9-f2c2-0d49-a77e-69381607b6cb + xmp.did:8af2f678-c59f-4b49-8482-de7b1900c490 + uuid:65E6390686CF11DBA6E2D887CEACB407 + proof:pdf + + + + + saved + xmp.iid:e366fa7c-ea9c-431f-990e-7fa6c204e218 + 2025-02-21T14:37:04-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + saved + xmp.iid:69f7be03-8070-4554-b0dd-b654983b4b90 + 2025-02-21T14:47:43-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + Web + Adobe Illustrator + 1 + False + False + + 23.000000 + 22.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + White + RGB + PROCESS + 255 + 255 + 255 + + + Black + RGB + PROCESS + 0 + 0 + 0 + + + RGB Red + RGB + PROCESS + 255 + 0 + 0 + + + RGB Yellow + RGB + PROCESS + 255 + 255 + 0 + + + RGB Green + RGB + PROCESS + 0 + 255 + 0 + + + RGB Cyan + RGB + PROCESS + 0 + 255 + 255 + + + RGB Blue + RGB + PROCESS + 0 + 0 + 255 + + + RGB Magenta + RGB + PROCESS + 255 + 0 + 255 + + + R=193 G=39 B=45 + RGB + PROCESS + 193 + 39 + 45 + + + R=237 G=28 B=36 + RGB + PROCESS + 237 + 28 + 36 + + + R=241 G=90 B=36 + RGB + PROCESS + 241 + 90 + 36 + + + R=247 G=147 B=30 + RGB + PROCESS + 247 + 147 + 30 + + + R=251 G=176 B=59 + RGB + PROCESS + 251 + 176 + 59 + + + R=252 G=238 B=33 + RGB + PROCESS + 252 + 238 + 33 + + + R=217 G=224 B=33 + RGB + PROCESS + 217 + 224 + 33 + + + R=140 G=198 B=63 + RGB + PROCESS + 140 + 198 + 63 + + + R=57 G=181 B=74 + RGB + PROCESS + 57 + 181 + 74 + + + R=0 G=146 B=69 + RGB + PROCESS + 0 + 146 + 69 + + + R=0 G=104 B=55 + RGB + PROCESS + 0 + 104 + 55 + + + R=34 G=181 B=115 + RGB + PROCESS + 34 + 181 + 115 + + + R=0 G=169 B=157 + RGB + PROCESS + 0 + 169 + 157 + + + R=41 G=171 B=226 + RGB + PROCESS + 41 + 171 + 226 + + + R=0 G=113 B=188 + RGB + PROCESS + 0 + 113 + 188 + + + R=46 G=49 B=146 + RGB + PROCESS + 46 + 49 + 146 + + + R=27 G=20 B=100 + RGB + PROCESS + 27 + 20 + 100 + + + R=102 G=45 B=145 + RGB + PROCESS + 102 + 45 + 145 + + + R=147 G=39 B=143 + RGB + PROCESS + 147 + 39 + 143 + + + R=158 G=0 B=93 + RGB + PROCESS + 158 + 0 + 93 + + + R=212 G=20 B=90 + RGB + PROCESS + 212 + 20 + 90 + + + R=237 G=30 B=121 + RGB + PROCESS + 237 + 30 + 121 + + + R=199 G=178 B=153 + RGB + PROCESS + 199 + 178 + 153 + + + R=153 G=134 B=117 + RGB + PROCESS + 153 + 134 + 117 + + + R=115 G=99 B=87 + RGB + PROCESS + 115 + 99 + 87 + + + R=83 G=71 B=65 + RGB + PROCESS + 83 + 71 + 65 + + + R=198 G=156 B=109 + RGB + PROCESS + 198 + 156 + 109 + + + R=166 G=124 B=82 + RGB + PROCESS + 166 + 124 + 82 + + + R=140 G=98 B=57 + RGB + PROCESS + 140 + 98 + 57 + + + R=117 G=76 B=36 + RGB + PROCESS + 117 + 76 + 36 + + + R=96 G=56 B=19 + RGB + PROCESS + 96 + 56 + 19 + + + R=66 G=33 B=11 + RGB + PROCESS + 66 + 33 + 11 + + + + + + Grays + 1 + + + + R=0 G=0 B=0 + RGB + PROCESS + 0 + 0 + 0 + + + R=26 G=26 B=26 + RGB + PROCESS + 26 + 26 + 26 + + + R=51 G=51 B=51 + RGB + PROCESS + 51 + 51 + 51 + + + R=77 G=77 B=77 + RGB + PROCESS + 77 + 77 + 77 + + + R=102 G=102 B=102 + RGB + PROCESS + 102 + 102 + 102 + + + R=128 G=128 B=128 + RGB + PROCESS + 128 + 128 + 128 + + + R=153 G=153 B=153 + RGB + PROCESS + 153 + 153 + 153 + + + R=179 G=179 B=179 + RGB + PROCESS + 179 + 179 + 179 + + + R=204 G=204 B=204 + RGB + PROCESS + 204 + 204 + 204 + + + R=230 G=230 B=230 + RGB + PROCESS + 230 + 230 + 230 + + + R=242 G=242 B=242 + RGB + PROCESS + 242 + 242 + 242 + + + + + + Web Color Group + 1 + + + + R=63 G=169 B=245 + RGB + PROCESS + 63 + 169 + 245 + + + R=122 G=201 B=67 + RGB + PROCESS + 122 + 201 + 67 + + + R=255 G=147 B=30 + RGB + PROCESS + 255 + 147 + 30 + + + R=255 G=29 B=37 + RGB + PROCESS + 255 + 29 + 37 + + + R=255 G=123 B=172 + RGB + PROCESS + 255 + 123 + 172 + + + R=189 G=204 B=212 + RGB + PROCESS + 189 + 204 + 212 + + + + + + + Adobe PDF library 17.00 + 21.0.0 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>>>/Thumb 10 0 R/TrimBox[0.0 0.0 23.0 22.0]/Type/Page/PieceInfo<>>> endobj 8 0 obj <>stream +H‰LUKn9 Ü÷)ú–IJ”Äíx‚¬‚ È"0òY8œ¹?0,RzÝxÀ“J²HÕÏŸ_ÎçO/tþóïËy¼tŠœRÏ'þ~?¾�>ñûûóxþø•Οÿïɾ¬¥Ê”“g™¤z¾þ>°�ÿ'*£5 ªý|âRgà &Ú´óõðÉÌe>H©•1�ñ uG~va–bÂçÛµP‹J�S}h…ª¥«�¥á>˜X,ˆL#ªg· jé\ó8ˆ÷B€ +ÛØò¸ÂˆÃ¡’ǧb¸w½¼�ÂfËÍ]³ F)ïÛôkµHMëÎj™µd î­´*×¾ºU¾nk±6Ó÷R‡^¾{™Ì‹™ßõÕ&w棴QWdŠýÞeÅ]jæe�N¼ÒæÖè–T¸®+é‘E-cØ*ÊÓ«d|Á,i¿Õüí†C06j�/¾i T.¥�'?T˜ˆv'•\E-Q¹ì Ùÿ-“8;`WÊæ@)òÉ^éq�F_0›W¤ZBV3~Ó«(8J­f��RÑ‘C²÷$¬ñªc<ÂâÈ–©„ƒªÑ][ +Z¥^@°ÁÉVwDí ê¦rÖ¿ŽÇ—h]B£_ nЫ¡¿+õqõ·óœa–ÁN‹²�Í $¼¿{Oœ£¸§�]©˜!ަ«³c;¯Žå\h±ß¢I ½vAOñ>Þ p_�hØ”¢KÈ";Ò6[§™ñ�ë9Hk½"mo^Ž0(Îo‹“—›òWh¿3Š¬ÊŠ06«÷ýxÜó8ôf´•aòpç7õæ[d!²Ýï‹Ç'mÇ  ·,lœIÒõf·Ã�`gÇòÈ¿ÜJ3( ÷+ëúöˆ2j;m«Nz´š†˜)DÐB«É5ÕÅvú¼7¬³3ö†�Á[1÷T OvÌ»Ö!2’Èf,ÛÈX¢�µ?'„yõü <#ÄÕAéêÚBQÛºBñ*ncŽÐïànÐ7öhðšçç¡Ù‚ˆ<K‹ÎÍ2Œ7Q…B%Âí ¢'Ͷzkf&ÚX™£È%úóÃ'ÿD9þÿÿÿÿͨrB endstream endobj 10 0 obj <>stream +8;Xq'E1I"0!!*'!!!!$!rrW6)%KWa~> endstream endobj 11 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.0.0 %%For: (Lance Wilson) () %%Title: (cursor.02.pdf) %%CreationDate: 2/21/25 2:47 PM %%Canvassize: 16383 %%BoundingBox: 5 -20 14 0 %%HiResBoundingBox: 5.66321159874588 -19.3101707971782 13.3282506618853 -0.689829202823603 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 186 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -2 -21 21 1 %AI3_TemplateBox: 10.5 -10.5 10.5 -10.5 %AI3_TileBox: -368.5 -298 365.5 278 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -36.8686292975099 15.0875825973571 24.2412592594231 0 8187.0540583758 8192.66432798039 2548 1414 26 0 0 6 44 1 1 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -36.8686292975099 15.0875825973571 24.2412592594231 2548 1414 26 0 0 6 44 1 1 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-390 -310 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 15 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXümžÖU 8@O’ Ã0 À°*Š¢*g�´m:¬½Ñ–¯Û-kG…‹íƒÖ�Ò¬ŽŸ¤”RÊ”¬æD)�‡�,æš F x'½�ÏOnÝ©ü<´üÅ!I;ÌÌUߎFZ‚��ÃЕ(Ÿi}ÿ«›³m¬,M†iiêØFG¯#À†800� $TàA$„ ă 8à˜P¡¢G80.8N`… +.D� ¸`áP€ +p€Ž ŽŒ dƒc8°�ãÇô(ÁÑÇ 8AŽ968õÀ�1‚Œ†C 2px•muK§\}XQÒM©òAw%‰GÑ@Ø`ƒL8฀pp`X0€† >€´û[Ey7î½d,L›A;czh^ˆÉàßÏnfýÌLMOÕÂsÝ3Ñ|2=ôÛ Kw‘Œ±žÁÀɹA32Ú�Âf(峯`ÔB—�ͶßõJDY8¿ÞíÔ“—OC«FNIÄrÞwkkîl¿þd7/LcŠjâ 8xŒÄ³¢2, k‚qCÂÆá�þ=ÇH<+ƒîj�g0žxFžD4 —ÆÆ 3جq8,¬î 4ÆÐºßk\�®K0|ìpui Ð0�P‹9´Â0j˜Ì8<d0&{„‘p 2¨d‰±!hê +£}as¾ºKÜâÇc è‰ìÒ¸J£L�°q®¯<LФY ®Œ«Âøùœø¡‰Sšfjó*f-³jyWu­òÌ!¥T_|tso?ÿ]á=”E3{&aë¨g2Ç™½?´³<•$o|){¼-³ÐȆwš9�›…Õž±|é,'ž¡0Ü#'žPŠCYzôCEBCÄc8IÏEÎévüŸøâsð¡w8áBb¦²4þâ™0â˜IG͵eDúLKmé^f5¿4‹±qci5ò~ ,šR�ÂBA”b¨¨¢‡&†¹¶#Ó(äê¼lž7>#kË6vXùßîHG„窙¹ã&Ã"qHd‚lD¼IÆÇÙFŠ=):ÚVzÇvÒüHí wÌUæða;×<*�!Ê¿Õþj…½ŽÝ •µ|»£±¬eŒ 00#a(Œ2ã …Qv…ÁP3ÎÀLS(‹:�Hô …¥8}�X(ˆÁÆ•á…aàÑhFG4ƒá؃¡ÏVäaX$ÐÀ‚! ]M�aT‹CÓ0n$ge,ŒÃ‡3¶0FŸax†]‡³ª±PÆâz +CXZÚÆÆ!Aˆ¡…>ø‰"ª”@Û1‡33=Œ (Hžž•?•κÍGóK �C㊃q©` †)£USÙ½fÔl><Â0üAx„¡À.Æ †AeØ¡‘?(n(¦6ÊÓH †’a?(æŠÅÁÀ©·h Äa âðD/ŒBa„ÇP ~øYñ´Á�ŠT Œá�„”8Cqˆ;¤ƒ-Òc‹ZT¢Æ+ËåÄ͸E§† EÂ8Ü`PˆÃñÈè- Ä 3D¡qVäa Å�«£%ÐʰÀBƒŒ`Ìä—9<2s4ße=ÉF&¯üWNöZ(g½wd:™Cì¶¼»; É2‡ýÊgid§Â¼šÜeÉóÁšrþ/¾dÛÓ­¬ã¥“J~“9NCDWø¹ªcGæÀ)Í_4FUH3¦»¢Iã áÉ}wc#¡PL *»¼¡“â5Ù¡ñÃ%CœqÄ‚a Ì#Œ©©ìòÆ‘P,j†å) ºŒB�P�¯”@Üh´…¡¨âp0°X+2:‹…±˜Åb�@ Q5‡c�ŒÄ!-ˇcŸ…)L‘Æ™•¯Œ� èg^ ‹l�%lÆŒA…qpq‰;Üé|s ig…¨ƒG‹DÂ8€%ÆŒ)rM¡EšGq8¤èÐÅáRñÄÊJ3à§Ô1‡aÁ B@�ãŒH®Ž;:Ócì8~'c”ŒQcŒf�®t4&ÃæcÃÃ"õN|ÌaX€�„D° (,c„/?Z +åq¢ôgÌ–9ŠUf¤R%Î!ÝʽéÑÔ)«–åŸ(Ó*o”4Bh–9Næ8ÍÑ7Ëb¯3åÕñØ™£æÌræëÂ)÷ð‘+ôåY]™#Ó e;lë6r¦¥ ÞgŒ°\¯ÌQ7Gvõ9«Œ±âÊNšÇØq‡Éˆ + 88|L!XV8aôQB�Pè×Ä$Ê0 †ÅbqXnq´ð,‹„¡ð‚†Á Å€ w©ÄPr™¨…ÍÑDC0:®mrÙ|F§ïƒNXá…@� +#¨  *$.H P�à�\€ � \h a‚.P�Á P€0¡�°& Ž�@Â… "ØÀBC  H˜0Bâ‚…Ã ‡\€  +Ø ð� ”€‡… +$`°8(H ! Ç„ +*0¡B… +Ø`‡…†  Dh¸°Á (Ð0!‚„  H@ƒ $L¨Ð N@T˜Ð@ + ,Tð@ƒ"‡Gƒ,�€Ã‚ (HˆÁBŽ\ˆÐ‚DàÀ ,T¸¡á0*x€ÂD0‚ +@AB#˜ � # +.P�`A*@à�Fp¡�T˜PÁ‚806¸@¡A *$0 °pàÀ Àd扦Ðpá„ ®¦õð÷ÇogRæ˜b ÁBà”p̉P��� hÈ‚` $\À0hx€…E .@ `¡á„Ãl�ªãÎGµzd™�ÓäÑTwâ7�4¤´)Áls”\7ßܲ”�¢Þœ†9b=þ1¼ïËK9"ÀqAƒ„ T¨…DàÁtFå .dð€< áÁ + (TH<  !ƒÄìNÁŒya*lÐ0� X€P�B˜ÀpÁÂá�MhÀ Â~AÃ(Ð��xP>.Øà‚ +°Ð0a˜©¢À ‡ + p\P‚ $hHôabGGÞ8Lòˆ$à0™6\€0A4T G}Ô8L€ã‚ B`‚"¨`ÁP¨ AB Ø@渑€ \°A$\¸Ð@�† h°€¸€ƒ㸠!Xà-ààÀ¸ìq�…†h0`0AÂÜz\€ �… + $0<°!ˆaâ(A… 4p@¸@¡!8(@8Aâ¸` &THl°AC„ +$p�Bƒ#ˆPAáÀ�AsäôøÎçÉà ËìݘÓ$ÔÉÅã`§$/ŽL+Ì[kº“ & AsT�1;.0AD$`@a”t=.h@�„ 6€@ +�€ +R°¬ |˜ PÀÇ  ((T�`�0�xÄB… ,Œ BŽ &\�P pX@¡Â$`àhˆ@‚p\`¡ÃÈ}\@¡‚„ ,4\àA.ààÀ�1R>,˜@,T¸ÁÂ… F0aÂŽã .@h°�pàÀ8Fˆ ¨€Á��ŸÖ•­Í»«IEc–ϲVôï�Œ/SzÒ}ÙÙr6ëöV̰&‰EF‡…Ó³ý,»+Öú¦½5:Õ¦™ö¨2Ë»›ÇRêq*y°-Ý=ç¢y6xWj¹)W'Ïd"-TWféÊuçìêÕ2i]{ÍŒøEOí¡î§Ï¸ýåëé*ÉfÕÜû$º±—µÄÞ:¤¾NãD¼šºªÆþ]w=o)fãÉTË“²�žFEöí„X7cÊ�+6®iÒÊhJÄúý'7&œÁ¬'Þ�‘ÚúX�TÖeCf7ùrXœbÏn÷ÂÒVí0Ñn7ÎÈ\w7gV"ßÑ­¼zšÓ½—)®"M-H­ÖåT-ë‘••3çìv¥6‘æÊ~3(ǦÉ~ŸKe©%ûtN,k/ºå²sF²Û°BY�Ù›Ôß`k~J{OêêAjÚ©Šb×Ú)Ñîjö#BlË^å“f¯lϱJfk/u¤ï�¦µ÷̄ޫ™ä^3¼¿^²‘|©X;ýNîíŒåàgNbm b#Ü ‘ÏFS%ºÑ�Ôa}Îô±Ã7ý*û½Ü¬{ÞË–b×l¯¼SKV5û ™ ö­#»sL(›X's–�Ìe§Ë‘f�%†}e!â1Ï­ïÑYuîÞÚRTÊ‘ºÅ¶fÉãäI_ +&þJæG$~K)ö"¹û¯1ñ‘,ôô…^ï$™Ìôð™”òi�Ï{+QìÞb÷ð¥éß-oR÷3DƒoV ¶d¥ßˆµÏcÑa}ø»ï'oíU™÷A“�‹5W^¹·ÅÜ+¢ó~…&æZáo(_6»÷5:!QÕ­$º#Õ¥ªxçÖ�jF\µM �VSÝÓdi51Í褪7$¬bUÌê4J´ßÍåÎöß΄"䕦²Xvf<»;$ņw’uï|„=Ò^Áš$±:Îö´Â2ªÚÏeñÛÚÍÒB‡³ÒÆÓå4Yy'yc±ù¾ö‘›vi{Î\î}¢¥Ø­W„¯m¯r^»²xò•”.ŽàâÜ>×_Ïÿ¥³ŸrÚKCb×+›ю׃ÎäÈ�â ¥ÚB;ešäu~Ôj#{V^({`™¤?ÞDj‰O�ÿ qâ놉’ïa/”úá:¡+8>ÒšVøËžÌô8W=-:‘ñG–WSˆõXáHŽg" ]åùu§ÌøÆoý‚íqy´1{#¿Õ¹¼Úî)’g“•óš-»Iš5>‹m¼�™�îÊa�¾7Å»fçI~=0=™÷#ËÞ2gCdwL2Yš�ÊP +[›<;^^Ñ8¦ ]�¼sÒQõ°ümî¶û!íÄÉÆ»U¡Ü&"$Bë�Ž$¶Vv&¼eÏ¥½Sèê?¥�Ž)u§K´»ç;É;Ññ1ÕYo*¿V•ÊÞ«”ÉK´¾î4KLJ͘˜d~¯n÷‹kxùùWf}K<>ÊØ,vìVeÁ÷¨Ì‘CËæo$²£Ñ¤²îx ·‘ǧ`„ü­Å]¥Úþ.Mb5¬±Áã–ªƒ¯ÌJ¶šFÌÎ^c$¯G¯zI<Ðpd"4'­>Y“ªÕ¬ÞÄk­Žm냦Ry {¬zQÙ[SŽIó@|UÝlP^}¥œwÆj½“gw¤±Ì%袩M¹Ž™´�Ú{f×-Ñ$í£•7ã–˜ü æ�•D­Sk1ù £ÿh4™Ü�¤’³�,öƒ&U7÷’c©—5¾:b]\?�NXϺ¿#Í£T3Y¿rŠ��Â[~‡©VY¯ÙH�ÓYj‡Ÿ6«ùÄj›);lSFu«—�])s½Ê[9Ï&›xƒY™72ö²ÌÖÍ”EiJ3ÝçV÷º«LQIZ­Ý©{¡•¸zÐt¤’.Åy!"Ý‹IBÕç‰å3�’Ï9<ã­WÉéQ¬¼1»¹ÖwªgÉv§û©‡ïÞ\{¸°èJÒ=ÐM2ÞÒ$ŸÞðè áïiGyÑO›e9µWHwX=Ü<¡;\›{7% Y�K“ÌÕK·-ßÉŽ’uãü}Í]â�MþsO»�X/G 8,Àq ‡4\€Ð ‚† <Ø`ð@…'„<Ø`xàÀ°€80<ð*éѲŪ®ÆUòü<þUO¬…è&W:0çRx\]âû,›`©|¬is{ï’,9é„ì¸{‰E 7[ôš2™³ÑE¢'žÄgET¢ç¸w`™™žÍßäÈœhG¾rLw+%xàÀˆp˜líÀ<©éè!]É'hãa†dØ3IVT‰½¯3‡/Á<Îï3çä%›äò¨“¨-§Kåa•HþåO:tÐÔ$ïèoÃ26QîŽsÞý©‘$úHûIÝQì ÑÉuZ–IUcô:WÐ�Hò޳&�&I\>Î¥î8ºkê3M1òñ’åìx•RJ”'VGÚ§Š|ôL’ŽÝ]É‘*ªŸ¹ËéIX2åÃê¤>žÙžnøËö°Öžº‹NŽl ezP�fêwG‚äƒN6©«—§OÚH’�ËZ¥8Ž}“ª:v¥Ñ�w!ó�UiÒ#ëÙW~Ø‹fºQ/wWë‘÷3�Þ’;ž4Š�ëï‰nˆ&-1:*‰¤u$ÕVt¼Wn> +Ëäê(ü¹èéWæ’,X‡ÇFD?s +�—.XG³¨L¯³<Ô”ªƒ~Ùʯ†NN‡]öÒ3�ägÓñ¼ËÒ­åçãU’ó�ż¡W!Iam$è£XíM&}äm’>rnBÄÊÑQIøó�päöY¨Žº"ú.ª\ú¸L”×�ž©ô‹.¡ôñ±Ûq·G}$–~àÀˆp$½bvXVÑ·“$ÓGõ.hÇ-KçWˆ…W8S§ráIºfên‘ ¹†gC…y¯!ò{¢[ªÅSÒñNfÅ͉Ç>µwƒbU3¼«$mû99I4I§»Åèrl�h&ÉÊ„„7±£áIºŽô¬]í"Yá–éwô �chR%º‰F/ó[tTÅ#}„ŠDDçz í¦JA‹¹=Acgò®¨ææ«IíœÍV³gD8ž3y�·æk${tZ5‚çºÖ}×µ¬k¡Q]¯{Ôª¨jd‚¥:iÝî{�O.SЖ-ßç%ër> +‡JVB¶ºÚW2滢Ñ•½å)”ÝaJ}Ø©.×—™ «n¨fOŠ‹ +í¦®%VE9„fwÔ#Dt‰ù0J–Ž›%Jmu¤§Ê÷—®eœÌþÒ¿¤ƒ�Œ§úYDÆÏ}¤=2ä“45Hiª V—”g£b[÷]Qº‚eL³}Æœ¡Ó͘“%BÉ«ËØ‹ ?y(íÔáüxð._0ÑP¦LZÇÝ‹äªö—]]}GCž^^ +V-¯Ü¬#ÓŸ<¬´ç¬÷2,IŸo×’tæ%’¤óÜóá=�eÿïiDÉל\eRwÝü|­h†‰Ru”åýhXÿ©Ž¶ê¿Ïá«ëÜ=ü;Dˆ3ƒ’-¥Ñ Ý«:ZÓbõõ¹úXÆ<2­w’œþÆ~#Ë»ÇìrÒˆî(5M;:º]—Ûqw˜O­k]ÕMØ·vI×l�#IöÊZ³–=Ž]bµjì’Ú±1‰Ýqç,FöÞ˜KZÇ[ÙçøŽ¿©ÉÞ/_iÚñ«ú5ÔéIÝ5eüL™ŸvÓMl#?ÿŽ—0óŽ+²ÌŸ‹2Í—wäŘxNËKÚ�þ4Ê[šMéuK{v.„cãóÕ¥‘�WLû–Ð+§›ÏÄu¸)W›¤q¬&DG™g^·ó­ijÍ·Ó¤ùÖר¡ìɆ>Ò«+å£JG·¹”óA5ã¹Ó• -áa/E½î½T1FSÕ³µÎ*“&§R’êa®WZɸˆbG•Úê#­Ê²RG�²´zQe-Ë&õaß}_¥Õa‰IÙ†ŸsèiƒRx�¦Ý qÄî¤ÄHŒÖ,ªµ¥»ª×I‘zGÌf)¯CêÔÌEI¾cÍ%«tÔ +]ïÓĺÃ÷¡¾Ð¾WÉ“èæìûô$ïÍÕ­¤8sh†‡É3iw&ÇodÔû…•CËsÑBYçƒ'¾£T™æÿhŽÖ¢ù~(WG//å óO¬ÁºI4¼^éš]ÁëÖQ„ؤš&¬¡½ð*i¼ã¦E—b¼ãAO;*W}+¡ÐãÓñØ™ÍLLÂ˦u¬ +Ý‘íÑs½fâÑBwÔ}‰uã)¡;žxy8¶W]Ó. bßã‘s«wèÕºÊáq7>ÖѬrtTceÎx†ðW¬Sºý¥üŽÖóiŸb}ÆÏÁ:^•¼TIv5w—'õlù¶ð¾*ñôz¾2Ok8…¯õÄ3Ø{5Mz”S§#ìÍT�aIjÍ^ºlLì}ìL?êzì½vñçn¶ËY¾j½Ìçе‚e¡fù’ÈŽµCªßW¤ÊÃyù9A"º¥ ÖBy$�9?F¶C¢<Š8¶û˜Q�*Çãž4%¹imKÞÉå�Ee´ünÅ´å;NZ¬bxÍÒjuôölĨN˜igÔ²Ì1G¹zéœÃšœ¼õ\†YtÌ^ÞX˜Ìš³¼½¹g>ÅEA³ ]:RT9¢{ÊõÅDŸ$ɸõ aŃv j¯÷¡ÂÛ~Ò)fakâë¥%–Å™ehIL¡3¬’ª:²‰‰RÆGùÌ�IYŒ2ïrY&7©ó]ÅH˜‚w]zZo9>p`D(’É$JÅ92—œöîgšÂÛÔÉMñú*¼^fŠ'ÇÂ+•ä�Gn#d•¬¹T!¢X™`Ýw¹Ù/±K'É  ÒQ -Í;¡¹LiZzàpœG#Ë8Ù«G!ŸÈ*±„%;Ò‘Õïòfð†/ɲÊ_Ò岿™:;=MŒeYvæÓ<2:ý¬¿·?{ÍL†JxvL4yæ÷©±D;Ö)ç$kÚëÄ"äMùEÌ{¯'dsöF45yg™é{-í÷WêÝID$c‘݈#”\“Õ”šŽÊN’7Du—_,ùÑ•™ýû„i{FHlÉ�éJž›Ì&E>¬”ÙäÙuþªPV•8Ú”÷�]½hFæÇíw&é Œ¡IPâÍKî°LCÇœC,²ã1+”ǡǞV®”Åò¨²ógÊe’GÞ;‚nV~¯’jGªßG#¼™…2)ïW¿Š­·F²­C—Rë>¯œrMžº�ObK¢i+Tû@²úwœË6»Ò‰U©Ÿ¡{Ó%WM_Ó\”ûì÷""tNý^ü`Þ•³Ðž<ʼuzí�€ŸkÇ7–½©^Ñ¥Õ�èö’Í©ív4ëËÆbkžÕ«3b.Š�Ö*¹…¾N‹l»ÑS“’ )³ÅÈYš3ËZÅ"”lŠüL²_Ïk’‡Î>ˆ{&íΪg/Þ„ÌŽs$…έ²iMY#�ívš‰eN#Ê–•éh# þÞ#Y•“ªœt«–P9óÊUX;Š€·š9£Û|©¹ÍÑóS!sZ­®´oÓ\ëFW)™ÈÍK’s. ©l6�™³ÈltæÏ ‘¤Ì7$,ŸêwòòôèF–’©&# ¡ 3Ý4âÐ1=RèJÎôFæ×¥¤*¿¦D.×u;X£ïнi’ÓxéÕƒu[ýŠL¬¶ÝXIÕÍD¤²�ø|�Xm(OÞå4¶†\V5u»B1:£Ë¤;g,ëˆ%ÉòἚݫcrT­Ã»û‘ôoôÉ"!sáXÙ¤ç,Á’®žD×uþ†v[+¬3‚í.éSõÖ�ÔîœUUmycöÒü”õú,5>IkÖWº2#9»V×"ÛSŠÜÌO}ò&DÆÃrë8hbr;æBûŽVu7I^N™�àxl/óɳ86Uó‹bcŒPs.UÌ>ta}>$iT‡Wt�ÑÜO¦N,£äXëé,)ùL9bÌ4ã]w¹äŸJ§óœ–¿ìëCUiU¾¤Üëé,§óº§R:®ª$—.¡Ðn$õ;Ö$öH,]ï4™Ò«2ßø^ÄÊØý G²hÊ~µK³TÓš¹sÁFüÔ(Ì»òLxˆOçÝUO• ÊoI47ø»ûÝ2m¶˜¯guM–$X«æ¹rô³KŽDzÑYèB²lU¦ÝvtÝ.³t2Qâcï‘O£;©'ïèÀ¼yÚÌùx§ºËhXiï·NÞõ=yï5ÅÒ\;ËUÞa³(•Xl³ÇÓZÅ�QÖ [Rƒy%çËß1oyû©ËC4B�ûëõy²«'±ªvU é°âš©ÆéâïgFMñÓßí®õ²^†¦Ut¥›âKdn}Z�«U¯Uª�WK½“82ý]õ9¤š¢§ŒÈ=çÙª%šâ)iÈ2x§œúNÅ{îi&ÚýœxT©)ký>õ£'îäy={#š¡9ÂϽ®nIDbe'u¬„¿^Ù?WU!#©Û'kvY�H|3Gäs‘_f)›Æ�è3uB˜¦:4£!áÉ\%‘O*ÑêVGŬ<®Ž¨ò°éDtó�Ðù|¥)êIæQ4çþÀWý2oáPoirLßai9i6vfuìRñã©‹õÉr¯>x–Ç�='Ô›#¬V þÀÂ¶Ž°*‰°rÆø�xigN”4ãt®ZyV™,”ýa£±]}WVöLãïêK³«¹«¢àÜUñì½û¤ñh:Á¹]uŒðægVoâI›É!¥Ü¾s'7µB¢Úì®ëî|_Tü´‰uh6SæäØdÚÂÊiRf +¯èj +ë=³íL÷”‚ãk!Z¦& +$\€p¡Â4A„"G$X¸@�ЭU!À¦æÊ›G�,·4¬ôyp®êw Ù”Ø–K4"¡™Šì£²«�í¨î±²“òÈvT6¾—VUߎßÙQlY÷¯fäÞ4§ØêsHf®›¼šO‰Mݬ×ÍÖ,W6ˆðšÍ2Ä–éí Ù2›–%^æŽR‘ �vw–G»ëÝkòÎqÒ®:w^Q^ï#Þ1MÌ.É +oÈÖj‰*ï=_ï0ÄK_�i§öChyu”²n¿zU-­®„ì0K{îcT‚vVs5wæ«9£º±6wβéPÚœ¥Í5³÷™§ŒÙ5}$Z¥5µ42bÖ¥�̦ъ(/Å›¢#±µ³'žªÒL•7R„4EÙ|(댦ˆLöt ™TæÅ΋}<ËDVIVYJÓ¥å|ø²Ç} a&~7v³±«‘Ô‡¡ÌXªÎæ4ÂôÕáPÚMŽñZãÃ( oJX3YµëÆÒÉ«©sŠŽõ¹O”èƒlÈY“5ÄqÖWW­�£YýÞ%=›B»âL!•Ì1ÿµ:CIS�<²faÂÈCGú§ª¡émS2UEˆØ+•ÔF!OQ:‹Õ£�m)eVë%•ÚTJG[I„Nºržñ¬Z>­ÊF�Ъêƒ>ˆ†‰&UÖÇE¯cÚdÆ«&_ùIª§1Ì´,:;¾V$ùjó$tœéGB‡å­5úMêÆB/WÏÖ¨Qè üµvifÉþ'»Ù? åÉÄ'"•Mvæ@çYYÝr¤sزãî¡ÔaÄAK)©ã†582Ø;:—µ^ê8Ëà…Ÿ®g™)tÔä°ŽÂæ•afJõ¸¤VòªnÒîŒÓÒXíhtŸ�sùçùÙà ÍϨi±6wæY‰aÖÉ›=¢ž¸š³U‡Æˆu¬$,;Ú°ŽµEÊ«;"J­JN(YGñó*I¬ÃŸ—%ÚÜVJb›WˆVE•Í)[æëH;$Ûk’éßì“Ì"'Z^‡ÙÙ2k™}§9ÙÜS™ +-¥ì2•Ô™²“刳”˜h´e�°öùaVJ‚•EtÔ½%#ìÝ‘Å|fV·ItO2:3þ’ÎŒ5׺›�UÝØáòÕ™qì8«3ÊÜ�s79é´öF×y{ï)9t\�ÌË…•c²«)Þý§÷èÈìv×ÄÛµhrw •´9g…3¶Íª¶£ºÈi3BdD)téLD#Ýs(4dEª$¢ê”ÅmÝ&MèÈŠ§þÄUDó�™W;»çtñvF¡¶—b£6+}ÖÑ•$k5âÓWYªš2ʾ[N=o|ô©ªN<ó|<„DHŸ»rÿ#2É”°¬T¾ñˆ|meZõ±Q¦Äwµñ5yùX¾E'Zö6¤×܂夛9aÞìL.³ªôаƒÕ2ºÍÝó Ÿ“dôk¢Xïæo„d$£ÓQŠ™ÿ“Ñ{OkãléWƤ&ÒYqΊg;4z-E§¼¢— ÓæÃóµ¦+jÒHý �µz¡+ÊZ�¤M +ý°Išéet<ò„Ÿ ¢õ'rÒ‘ÌðwûénRBš"_1Óh\?ÓKÎãÓ4 VSÊ„‡ëeèš»Î7ã»Ì7¡»òeBhsÙ •ÙWr¹ŸJ5N«zÙ�¼¦‹ý¨ÈþQ'I¬¥”ÇxõCÊ1LÄŸ ¯>®³6g¯¦‡Õ±½Â;³ÈwHõéœØ—4*{ñ„UYÛ�š•èUñÎ=G|”üA†ø¬¹>”\YÏ:aŽxþƒÊヨ©U53$d8WBíQÓ˜c/¹ZÖ]›K<Ö1üÝü’c½¼­ çjoÇòÁ¼¥ÎÕWGF¹ëZHVHe÷jMßÔ™5ÿÌÎõ^ò§�%Úâ3}Rí\•ŠÏ»…Šƒõ…j‰ub^õf9øº–Ÿ_Šufpðä|±xƒ?Ù³;,Ë¢A»ÁÓXó°–(T•ƒï´Ä>Xøœÿ^kZuŒN!gmð²ª:·»§Í?R¥<„woþ¤$CYl¥ÞI[lݽKJƒMÃÖPY�­¡šK [w/%ÊŒ�ë—52däJ›ê¦ðnŸÑ>·ì»šTï͉¶q‰•\h½$;ký&M=ùÇI*Äú. KÕ©ýìÌØIR§ðÒå¥F¨”îËT²LRc )¥ˆH‚ó€ @4 …¢Qé°L~²˜DZ4"1Gr!c LìW-XŒ:ÙÃóX{²é­«ú’ÐB§3ÃÃ’·¿ÌŽ“³ÇUâµ_–]|žŒ j±CMþ]Œò�•×a +gû"E+,ôK¾}-¾uƒ�®¾MdUóâ4röé_ÆÒ²,I~œ£m\&ä6A‡ÚÛýµ’k gÉÚŸJö¬ùa“÷Ý>±˜›@þevë«k?›i2în ‹wknp>°tNLCáb¢XžžôY­!r§¡$b§£Ž_Ôk[6qµl›‡ülˆ„�*tð†áµ£EMBx‚µÖSGéG×ãö@_!ù(À¿¡+A÷yÈEQ±{x)G-'ò‰$ãÙïy®H�•��°ö©!zS.Yµ§TÅ­(Ô`z|ÈäšœèšW´“aЪd[:¼oùÊu"øuGŸîð´ÈðˉÍ-Y¶lm·×HõjF㌠—d:�:'™…"ÞÎ ô" +Ì��m0Kˆn»zô}ä° R9h0sÄÌ·ƒÅqBÏÞ·Ÿu4?EÙž»@Ÿì>¶TS‚’ `dղȡs…Ú`±#:€6®ê(Ëm^Æ’ô;®B·  Î4ES^EžãÙê��ܺ³À‹3�%ù)v¾€¶u6l¢ÀêB{5‡ÖÈÜ¥Ê;WU¸ÕPo›Õžä””õÉm!ÊO64OÚ˜�]dyU&Lbœ¼»ÑE%dÁÓɶo:CDnêx‹(wˆ�wÁV-{‡w‹QÓV0ËEÜ™�á¢PY/΋àZ"~J†e� �Ô7dÓ`j�CØ•BM(§3'>*Gh VŸ5&'ð{™¶Ô§“$�ƒ‚Y�qƒAzÉ�Øó›¾Wʵ@ÚžÃ3À‡8qøJÕQI"µ7Ú†Né¥xKMßþ’ª`ËOè–ÉÚ“Ê16tdáçne¼³±sÅF$@ù³B#]JWïm±*ÍØÉ-²³ŠŒ‚]BJÝDˆ+W1.!ÆŒ�z¥Éô=¯!³Ê„ %™йÌP֑޳ž…ƒòÎÛSÌë�’-žr ”,-¹Óþ\˜H« S?VuÅ”5’�R¶3бM%eðÔˆK~ÖxºÌ]gI+”7^þ‰²¼çL¤!H©¬ž°kÙ�Ô°|½_TÊttêˆ6!Nõ�5fs á� kW©hGb×y’d‰ºÒ±Iû¨bé”Õ®'t&+:IÅZçïV�zäh™»f¤"�Àk,8¯á@5§î+@9Ð ÌOi©É}žp¬Ë‘ï rÆ«³ê‰†‘#‰¤Îœ½ÜO>ÐAõ)ŒÜ€›©ñ5 +XÉÿµt܆ÑPÙð'”p $‘` +½«Ûé9 åL&ª<�Œïêl‹rô ïÁ†Ï‡Ô»ºûÂÀºÓ&A8cv>¨ÅíêU L¯K&�vDCwÓõo‘ÌCVWí!Xùû¤÷E°v©0ÂEcN™|X Òbñ˳“ ` ìh`!: ¯q¹ÛQ e~[3á¨ÁK¡2*±ì†Do:ÒvÛ$Bu…ó Œ_ñÞ­Q6zkv‘ö;ÊÑ%~Èí:Ògñ»°~�"Õ²»¥ž¼vÀQ†%}g E¿O!W:ç\)Ó‰Ÿ%Èò둳pE\ìC¦—9`ßþj92“±Ü�(�Råc÷_ö,ó6lˆÒ`àºü»d½>)ø»£…€M=©Ê¼2½êu«wõc0“u¹}ªïtâ5eër”tSú�P^gœ”S³î_Ðд}~˜!»ÊW±ËªÂѤ@”ײ�¯ðVÂ_úü}J7´4ĵ/àÂNþÿñ~À¶¤Ý°jæ8$‚vn$ýZJÝsº^øËÌ·¢(gÙ SÄ=C¾þäÿåR à®Ò„ÖÕ†“®Ü¸JEó´-‘¥ö‹è6°‘…¾ùúD,4Ž\Åwÿoõÿ Á 3Ó -EÒ¼pùo·�½0³z§ŽÕËŸ"Eù #Ç)ƒ\l�A�ÙÜyFdzY&øÅrõ/O{GõÔš¨­í·4þ¬ázùÃ,èR ‚z+��V,vW¶ýçšßÈA)1 +CÄþøt¢ÐTŒ¾¹6N©ô÷ö ­±M²‡xycREº‘ÿX0Àk&AtØä¬ÏNe’øô»Ýs{èçÔ¾“ +åvâ‰!ž1ÃwûÔÑb})cz¿ä[ÖÙŒ:ÀzÀ^a¶E^}LšÎèß%9î5S Ï]çV(JPÆÌ`¯l=oÔ–t*ª¤Ñ°[1ß›±Ð1ûÎìP"îµúÐp[ÊÄ%JÎÓâò° -‹«¼vIÆhÀn:¶ö5®i©°kŒ0E±ÎÂVc.)h+´ioÿ1[!g÷`ƒHj÷ íOY‘Þ&¢ºv ±§Ñ`C H�"Ûåö¥Í­~NdºKßrs&6ÔôÔØéQ÷ôk÷xl@6%¬Z˜ÎMÌW’šL­Âdí”t@ÜO€5³½ “6°ŠŽT?)¬šÏ¢`’Å  <èüYhUÖÚµPð5¯¡>J.b:g�Ú.ÜcÅ­£ò�€½bñùgÅ5öìгpYš&0Ö×9Òíj�æ‰âwa»D½þ&,¸'(FæÇ#f}¥ÎÁä¿§¶7.ÕU›De\Û9| ΃U’ïGûkd7ÿ«”íÙ eޤn‡iãO¹svr4A;…/ûMSAMªÿÑ[ðÄ? £¨'v¯½ÙŸrn1_„YRðb¸ýý£*€›„ÉBõÉ¥* §„$¦Á•!RL$Ó,Ì�9hs>ߊäåhP'*+'—:Ù²[ð>*„Ÿêù!›Lâb»‚»±†ýg•îÍu(®DåöKõ3L29!“Ý•{3¬üt \ ¬n‡Ó„�¬@µ×+#þs xP9¤tmQ_7U¡ ,*Dì™>Q  ¶fé3TÄ-ÿ‹Úf•·Ä*÷µ©ˆµÜé±ýjfaß0UõNJ"æpÞ^¦—˜’!µ ·ùX©K3<öyòåÃ1b×øá×Ö¡±‹s·,¦UÙs9ˆè™” «¶–H(]î;ž3ÝrÀr‚Z0ôÇ3AT8&¦¡G³ÅPGý¦£�–¯jA ½€)<Ï ‹ö"ÿ‡š�öa�ÜÖ€žÖ�z«v@‰áŽjvU +„+TÇ¿ o=@¸ôå¾ÿ΃È6§(!�±](‚³týf>1€Té@ŠÜLô\³~R�ÎÝlš¯x†m*«²�•ÙqÕô¡‘q¨Ìè4ÆåÜÄ_ñT jÀS¤÷ñŒÙò\˜ã[�ÚÝ9Jß f§Pƒÿ6a±È°aö˜¡ãF2³„>Âj56ô!‹í°Ê…* Úº†;â³G°L�ˆäî×1øL)¾˜ÇiÏ›�¼xùŠ8õ·ß[·f¯x»›ÒX¶üç¢Àÿ¤~Aߟ:¹úH› é0´%–CÞÌôFñó‚¨VcXK;~¸˜¾ Ç-?��’»#mÚ–»C§ºŠ…|‡H¬œ«x­’÷N–Öâ¾€ÊÔI +�\‘;1~ÂÕH*°&°Eà+ÄJ^ˆÇHzÃêÇ ¢Õ›¹x:}tžæÞ…K=Oºm›H 7Tº†´Þ±iÍd)¹úS!#Ùˆ¿RÐÜ'‹~c¥‘eM"‘5OFh¥ª<´¨Ti¦¬¡ùj~R‚•ÃÛ¸ª`“Ùü– Æ¤yÅ0ê¶ŒÚOÓtx#s†?ì’È•Q¤Ùc¤è£Hìa �óTql€šjZ±Á"u<.Ô6jœ.YCáÒ¼×§!Ü#ô-¥pº{R�!#BŹôd +w°¸¦Ñì »{•òçZLnj*>5ÿÿy–V¢6bìEÚõÀ*Å�ƒ§Ën@—†›†KyÏ9³——Gÿ§Î}© µáz`_Q�[>&‹ò +0´œWÆÜ\?|8�®ä�ÄŨ[ÐðÙ ¯o¿øÍ— ìµ? ¦þãôŒE€M; !-û¤.WM¾—ÀŸÖǯgÇfR�ë“n N�£OÒËÒû8 +�Â= +§..ÜœMøü Iø�O4n)]ïÝž£“X>èó*OŒ@ºáðKwï.êæ|�݈Ã&à�LÅýÛf‹呸ÑzðäÕÐù ˆý9tuðÄ#|¦ÏRK…‚¨œ( C‰ ­å ›ê¯ítK©·/ŸãIf?�cªÓ"\¥¤¯oÜžbN+é™G—KKõ’ñ(ñ”éDÀ˜ASØïªQ íµw¼0Uç¬<È«±O×M©Ãê4ɧoÝlØ•gõŸéTû`ZÛ2V4RÌ4Ö§ ȧ‘B}gVÓC·Hxaޏ'2Å>§äν¿ÓIéU‹7Ø +ùa•–­-'ê˜Ü¤>�³Æ#õª8ßIïC4}pE1Doª GÂsM>ûéxÞŽ?‘¿?¼2óØÈ¶–©Œý~½éeŸ{±2ÀF Xb?ƒx70X›AŠòÖ2N?ßÍ´1‘“lÁ¸l~dƒ¬'kUKôi¶Ù€,û +w™·—±K^-A êÇŠlÇoö«ð*çpY߯¸Ø° hÙ(z‰ˆ¤ Ý/•B·XýáÝâ,®WUÌÀ‰ÑhŠ#+¬T_*øÞ÷ŸîkÅw›Š€ÜNüÅzU‚7¿æ ÀS¦ŸÊ‘,£é¿˜êÞ@|V@PúM¨“)å<ƒ¸åïÜ7B¥Û©Ì(�ýW‚[ä¿ Úð3€¢\ªn-DJCI™‡í_|ëïÄú‰äúT/eÑí„w9^<Á¬£|º!¼%ó3\6R¿û¸ÞÊ…fÿÙ€pÅÿ=ô=ÓdÏ·ìñR—8öÉÕ¤÷pe¾­µ¥·'>âƒÞ€)….áZÒÉ’K�qNˆ@mÔ¥‚“Ž&‡y½h4¸ÔØ‹z Й>°Ð²%�ƒ4¯»QUG™ÒŸ0nÐ •Wíµ¡2¢¼‹ÏQï‰ åÏ%#ê×?�ô<€²ªO¦Bî9tù”² E#ÛnCÖÜJçC¢çå8oÅ“r)rPnÎÿUñüŸ‡qÕÕ‹ƒ +5Å¥DJZ™øÐ÷åO¹ÝÃÂü"7ºdƇX?q_èò�ÈSÚ¦ªÃ09ñ¢#3à³3ÊÏÌ×_&”¡¹­®¸Hpf�"beŤJD™B¯¥ª¬×ÂDh÷4q}Õ½YIêc™á[`ÓÙÚˆÄ?+1H´Oq£öWuÛÞ|ÎÐçnCæË�JâÝwvžªä©-þ4ú�nJâ¾Á=ÓÉ÷)`³Ào•žÀèXÞÃ6>•©Gl×/Æž†µ`¬êø¢³–#Ú×�²åͶ‘QÈWŒ‰ +/ü£êáÌ_šÊM±ŠÄ9I½Œú‰„äÍkV¨î³È'"»ZáD6¬¼=”œTÉŸ:ý¶zƒ·gC|¿·ý¦„ä#Ƹ¸4æN1ö¸�«AHiî(Þ?�PU±½±iƒ+Ùs꙼m·ÙNƒ ÕèÈPÖ\1¡“•yî•!¤ÅÑ�N‘S‰— ÷"íªï2ÎIôtDAV"Õx¥'B¶Ô‹v¼ìB…ì$gYñù#¿ƒ¬r]mæ/©®÷…vÄXÐ=*^Þ }ð>‰â«@Ž€Ó÷Ç7…¾ðý«¸­U�RDCTœœáF~¯U ¯}2ŽâÊaX]€UùðbPâšÃÎçwb»Íå®S9iWÙ˜æ��‰’²@4é'ÄO‹RSZ‰Ú‡ý¶šþNú‡¼þ¼?¯œñAk¡äAÇtÄÈOJuö)qڰƉ¸z©€¢Ü×»õ¹ nö/¹¾û_ÓIÁYl4žŒo„º ‚ÑÁ�KtE+çîÝQ°CkH¨AÓVð1ß¹]2¸‰ê¨€OÐ}ç­¨"ƒ51F_I;67™J¢g]ÆÄI-G–-žYâ k`|ÛÛx'ñäçød! ï�`¦Õ€d¹Ç» ·§Õ½¥…CÉK–Øø™òæ×yQ”Õ�A½âf ‹jvJ‘“Ë)ŒÅÃQ àÜó‚ªÜY+9�P»k|ZºL¼ó Ep+8a.lˆ�Ð õ4ÓTÂT¤}ñ(·ßj¨Òq(D™�³tì‰ÇÏ*ãN&‹A§C‹ Ê9RÈ%É2ê“%*ÿˆMÁðàV3ÛP¼öЬo¶îâ5ƒ„—�]F’� q+:þ¸hCgµß¸»S¥=EÒ(}¸ò§Eч"nB†|�+ÝhY–³ö`~š‰dátþc˜‹c`;9c¶WÛÓ I4Þ‹uùapDz`û¿tÿÚ+R]ì6¢k}�ÑÑÁ/R˜ë72[ A&Î,@u-õ€¼D'™íã(¯ÞFUÊ|:Œ–Ñ R˜½\VÐ-]ö»„À±Xzk¥'l SzºÎ‰üaïZmS]ãÏ9°`–s‚Θj*‹Þø„´�ç9tÀ +›¼Ù=œXu…:/–yà-]U7oaŒ½hÿµåoj eF—XjtÊW ¨ÏRø–qÉÊh­ÈÝ:Ø`¡Û-_\tp­mý‰Nçðës+œ!K–£à—GžéÍÓ©fç_eæRc#d$<Ú'ÿkÙ¤ˆž8Š>ÜVJ“i×$¿È”6?ó›]p)q‰.SÝÚ¾\KÀ`Ó�` bœêEcJ2Ô• ü4/AS eXÄ ½bvøv²"ØÑCõà|(íÄXyjá#kh“LZ ô'ák¨#ߨf^r€k‹ˆ>Èr³ �ù~‡ÆÉž:ÿ +§‰@CKdÆm —Øíq¿Ù —K„Ím]ð›*E›³É‹Ø^z ø[B‹¡U§�®8³¡ f¹@]ÄáÇa,9šk–‰ +°„ ?=ÌC0l*•“³ç´5QiFá|˜CÑh¹MMä]Nú`°S}ò¯;²2)Üç,¬G*©KHŒ+q¹#»fVºP¥¨#±«%õ#áâ‚‹V¨n¢²--BDܽƒq·D#—a¯úŸÓ —U¶pQxuÁà�êúŠÖMp7šñAù6ˆê)´ÞôÉfPßOÇY"JXøÊ{¡b[ÒRî:x�Á<%L>°VY“6‘`µì•–�E“¦Z°#ªªï‚¦ óyÚ©ª4Ü<ߌ¡+×àg eÒn(þ¸*›=/^Å¢¦×öÆø�lz þt£Ð£Ú(‚+yõÞÇ,М§Å8À�äð$!^ˆg3™OñkQØÙÅïŠ0©'^Ee/zô¡F�ü_4¼FK÷àƒÐ…Èð:G&¿^ƒ2‡ø=AžÑ%ˆ+Q*Ô¢+Éÿ\K¿µgñÚQ ×ÒD\å 0ø³Ì�bø2^NâPš2#€HŸ*ÆLéÁÌÛ:ö²ë³Ñ¹€¸ÐÒbÆzϼï÷�¼i*–¼„�—· JÌ»7A"űëÄ5¸X‚sò+ÝàGCl¦Ø«÷9ÕÆÿg4òp¦+\J­Ü—Ór’&ú…ćGB–8cT¦L}Šš'‹!“@q•moÎå°°€ä6o‡C«Ñ„ð¨×÷¼Dºƒˆñ¹²â”²å?,KfûgO�o'õiÐõØoJ·çèH¸Èk5 žot–ÌíÍ&8 €¶&÷H(XñÒ¸‘”‹¯ù.¼ ©,:G`†Ö;©¡™�ó U[W`68lÒà C$‹#úzôÂ�A�5²‰³/aŸtÕ{žÛƒJ4üÇE<mÁá‡ãóÇið�ó}e +E‡´ˆIW‚Û£’�#}ñà&rÏpäo®Ê®¸PІ­w¯ Ð&rtöòýŒpÝ#Ò' ×ìÀ؉pŸ¥}nÒÞ‹Óµk†$Å|� "È‹}�\ùùtš—¬~»=ÃDZÂáï>î¦Ð»`ÖšV JåF¸Wo"‰£˜ ¢¸œ)f";�Ý–¯ª;K-û�MÀ©_eÂ*Ëœ¿£ÆŽ·5…žú +°�b 5šÛ²L–ð@Ø<Þ}W.ŒPÑ;>”¹–q* àDÙôf9¼P:YMÜ@€½$a‹t¿¦9în-ÇÔÃõziQÿ±³is÷Ìf�À™2f^õdA˜aª3åÀVƘ@;—% †ŽcåžìW§j¢ÏXŸ–XÃKÍ�@B¾€�TÖÈâc×é²îäi%â6÷�ã·p¤ÔüóÏ`÷¥†�u£zÈåÜJ‚ÈЀO¼úÇr�šû2ÓM«h/�$äÛ�­Á–�U#P:­Jâ$P_}›r…�;¢ÉÇpc)´&Ù!{+ΰs‰Ae¯ŠWAÇ ®üt0XÕ®× F\áWvyÌg>ré~Ý®>¤Ä­úà—Þáþ.�,T° K�é/¤>F¯Ïx:©Hݺ–¯`œ¶èШæJ)¸Ïn¡ÀÀ6ÂݧÀþr¾eùÚŸÑ=‡“¯®6@ó–¦0­yLj|;EIã{š}-ØSò3¾:³jCÄÎ2Å +¼·(É¿ûÞœ‰^S¢ÖD�Ÿ"ký©çE!’ae"Þ‚ÿ9]+çÏxc‚AåYÒrÎ�� +Âd?TC0)V½ÝÛyBRÁâ_ЬXsÛŸ:­¡2Ŭ {ËŸ�3Gu‹9E¨B9+*6 Ë@+‰:ÓJj±DÅä•t´NrÍ$#2Úf!Ù_*Ïaý�UÈ•?°¯wDý$p7!xm „ Ý\�'÷¼×EÂާ=�‘Rz}äØ#q—ßí�èm¹ÜÏ3Õîux^cõ¹ƒ]}�~;ÀZI!¬Ë¯ÅH¡á¹ì Rbõ“ÊÀ"�iž'ob8þÞ!¡Å*4¤¦M0õY@–7»(¼,Ñ< ø„‘ØÜTyõªØÞѲÑVøÙÀm{X±[Kºˆê¿â‘k:¾R .ý»Î¾åZÿõЊW4e üɹ�’Ç;û€¦}»yÆ$h“@DõÕ"”¸�‘וñìþ1�ðó·u¨}�<VŽMü•®c'd'áÍ"™PWó/¼ß˹·#¸Õ/üaN¬^qelTžcš.PSûµ »{ÓtRìG³ètú9CUÜRJRÒ*W¶‘=;+èè­ºÌÅkÍËÞãIVÌòÙ[×G6^¸‘g¼{ ª FY\¡æn3Ë5 *mÿ°Ó<áÁ_=j K¼ÖÈ­¦YÄT M¨Ø�Ù##X»‰iŸ€›× +]ϬÿX*snŠ¥ÿÕû¬XÂ~h_eÈ„Ï á•~ê’áÜÈ‘5ð©]Ø�£‹ÁLù3g«¡² $gÅý WMÜ"Oô2µˆ^hS¨�ÞÿxxstHâ“ bÜ)astô5&Ž”~ìÝ£G-‚\ÕãS èe"ÌW&LU§íz/,üT7MÖöF«±r0Á!·wëÝ wmë?8[ZhD-G26S(±NØäÝ ‚ÉØ`à \‚wj!×þVä½X8X–"ɤÊvב• UÑ»pó SÖ§;ÿ¤àa˜ÅçN{õd³E£Žp€¢äçÛcâ8™c¿k“ù¤øÕàšá‚y{h¶Ìlœ3æ-+È?`É/“3ä,‚ìq†9hš¯R»û•ÛߤSMd/êO�×PG0AUÃÂ,^8B‡Lö-©Ï™µïyòÝmŠO8áúD{¥J‰n†í¹ ëɤô„ºyÎ �Ü…WRÛÓÑ)Á©ú¢(*sÛ�ï‰}sÁžˆ�ð%‹÷HHðMݯNÂGĹeÍp¤Øa}:IƒQ ƒ&Ø BkÀ +ìÎÅ<‡Yoc¤ÛÄ b•Æ9éq^b_=$b"!uç7ç]¾é,zÑXQÉ^̪_O=x ­ In©ò9#ûhý^r†O3ÏCœøI +ÓŽA(‡©\§vÝÇd‚�¿,™Ôá_P ¹å/ÿ·fÐtšæ›jWµ]^�˶¹#h4#7,¸Ot×; -78(È›0D®eÇ­ŒŸ|ŽN€ë©O%4í¸,ÁA¹RñÞÔ'âfϺ{o´Å�»›ÛÜþ4‹£gp–p¨H]Yl¥¨@ÎhAtHþ(BÄ|®Låùï-¨<å}‡Ç +fõ0çL°£¦§eõ_0Ç ë÷8!±fQf‚+!‹o-˜¬›" V–<›4Š\1|ê6ûž4<µ¥€c O½ËLXbò´f¢ÉÛ�®&‰hÌ“NXN¼„ÍÜ@ÁKœÌ,·%]VJwòœÏÿUù§èGžÒý6`#€)¥Ák²-ÆKä ¬�Ï\qYÏœ$ÕHÄæ¿~ãÜŠ¾hùÞe§À:{ñ^Ö÷¢áœ…GâɃT®zRwU†uÙ-n×ÏÏæ‰2YOÒ¢¥fµÚ¼hzɈi»x{n7Mâ8˜Ãá™±ŒQ~ùt—8¹j¥qÙ@$Úž· +";0!)ÎQñ£ðç‹N04—V ›Œ¥®¥°H6’·O]Uüü¥"¬#+U +Ë_[ŜчÄLpüª¼Í'’ëM`Ž©—uR™­kg‡¥Ä,¡™Áá?צ²¾õ�hsfx’åùV³Ì«æ$~ç°„ùмoG®è0þ¿Å‚!~ k@4è�uV“Ä9²ƒÆËó�U>·7ˆdj“Á¨éU�]x~²«Ÿ‡ôµI¡Ò›û<ÈYÙîå‘þ38% à*Yø£x[Oœ@–¨ÜœZ$ˆF`Øÿq+K43¡õËY]ÌÐocÃ(º|³.! °Iú ý·OûÖ•`àû +1L“þ—×+ÿ�RmcMºÇëG3äø¢ª Œü‹»Û5™+ÁnyZLT“S-hjRœê!*µ4½ÈìŽ6�^µÏxL¿7䌪`Ÿªöæû÷&aº;WÎ'm žsýoµ�ª­@=�âÅîhrÇI‹®† Î5çQÁÑëýC¯—ææ3£áÖúx±xÝ,Aë…‹¤Ít4p¥bÜB¯Sƒú¬ÀÜQС᫳÷Æ2šŽ@ +.ífa@Ð-òɺê«)w’Ù²Wß\õQô…‚ý““H‡¡6°'Š1¬Å›D¾°“ö†™üc”ÿ`>Ë ¥¥‚#*@EV8(õo"kG˜ÄŽ%¤þtɉk§Û8Zt°`×'ˆ•ØßMRvNÎ"éý@ÁÒ@¥ÂÁ�€NUiE‚™Qd~•!? %¤€z‰#QJEi�,8 XÑÿ)ÜrgŠ�wÅ ®R¸À�d>'9HÔ@fÈXÕŠ“½T‘þWt}¿°+*ºŽÎ^ùò¿’* Ë6pÉL,q›ÇbqÉbèMû|YJÅY²m]´Z$ÜÓb™Z‹i¢!È–ß.È�nCpŸýMñ %¯eg””®¸(­X."Ð…ï1 ÒÔ%2Â]&z¼$/¶l%ź/#wärOŽ4Í•#“d /3 á·ûåƒYIwNa˜aH Ìñ0Q‰·¸ÅЍ;_î2ÿM”/Ø��99¥×ÕHpÄwsÅYþP˜LŒ„¯êE0!Á�„ÔP/q’×}ÉÁì“WÁQƒ;TfüÿÉŒ#Fy�dÜ ~鹿œ«!C ›üî 8A@'>CåR¦€͇†�›%4èX÷LAî ªøí¨Èyψ!!Ä ‘’!“úÒ%æMh´ Ø�D³žÜcáhªu£)Jšœ�PµæÒ¼¼iÂX g Ô`ÙNjô¹TCz«ÑýD+c Ä´5±ÿ¿e×h+m\ü5!6bm�Cdß[1ÙšM»@%ˆ�6T$¿²"B„…ˆÐÙŒê2¾(ã9¬ï¦(Ñò‘ úÂq¯¢`�Kãî‡ýD‘—#{¢È)y!ïc…4�5KjTâW.ˆæòªÄ�„kHCÕ“od2\²´0äb°%òÀ f±äžoa¤®‡x7k+pr/-øëþ512‚Àç˜3&sGÜ 2¥V^g*¶yTQßÃKC�öWn{²8Rvé-c +*¢øHj°Å)X±^þŒì–0I ã0×½Ç3\Œ‹U��2ó#F/2úƒðò1ß[³MÔÊ ~ûö˜:šé]–ÿ§ä‡á÷ÑV³Lì�z ¥äÃK̉OC"ÙNL>Öõ(9ȼ�fJØåÄ a9˱ÒÉà"Ð *ü'J?.iÛÕ$ödj¿jð¤?3ÊPïÍ5ŽÈ2¾* S)ËC–Ï&öW?I È*Õì.u¤=�¨+²^ÌÞI¼ +Û4�D…ù[eç¡VÝ +tq¹BR@å ¤­lC ²ÂQ¨¢æ«í)ŸW°_ �Ø©Íø/"£tZ +ÛÇ=  w �Œ–�d¡0qhê«6|Î@éÀ}Ö�XÏS6�t™9pxÜþ½lQ~g²j }4¿?ÓÆ)° +c…Yhs¨Z#ÝÀ‹>cÅeÉ…Áq„m4™j˜vâ óOËÐÆ› Å²œøkçWïÔ„Ôzÿüâž Ì ¦“Ï1«’X!Í; ™BÒÑ0yÒu$zmÂØP¨ÿb‰B:cHœ!q>„\¶j¦�¼Žöf7•ñ Uüɲ!ÎYRQSõH�É”Ný¾ÕÀì×”9T- ¤ªDz +~_È<7mß*)\�Q5¡¨l8GEÏUŠ,‚G£VØæ1p–`ðºñGtÄüJè\Ø4Ýôœc¦6�$`Cæá‰ša·#?vêYÚo`ð9W‚�):wŸ«Ö€BÉQ£Æçs`SÊ6f›L穬bÀAlŽ©E¡Û—,T4ƒ`N\úxS|Qñ÷QÉ]$^•[éÍXŸN¤&Un6{Ä¿CÙzŇr£|éZõw—ðÚ^ öǦ2Qþ‘¡yaËâª�¶Bxˆ0þmR™Ï.Ñ“äµÑþÀÚYÐjMšf@Ô<0¥èDaBÍ”ÛÀPò凒O+|Š<�ˆ„3ˆ0KwgÿU™¶Îüí1ûÔ�À BŠZ� $ùM÷¬x�ž5pô¸wŒ\‹gÞXQ›Gð^‰ò-¬‚CZd2MHÑ…æ!‡ª±ŽW,먀°S$tØ/“ä¬�h„N·‘ùðA./ã,i8ÎF•O$#›k4‰ÐÁ¥ùEÊ¥8¥ž9'h›Æ<éÜ„iE¤çÔ£¢ Ð Ë"EaÒþD×:�Þ&Bñž�ì–h¼j‰°�\AO0¨a–'Œ#¢$Â$D· +dDF!s-S)¸Cö{ +äåÞ©�· ­�Â¥!%Γ!˸Â/3X˜´…2IY°m…XL ¤P\–yMç„ÞâRõÁÇiá¤"¤8µ¹w ÌãA¦úBÎ|è±ÞíÄ?4DÙG0�ô ȵ€òZ«i!ÜÒë+� "ã€(0ÖÔ†Šd¿h,ÜÂ擆úý¡Ôü)ÖmÁV÷“¶•ú™§-]~aÒòù~ì�N9ó~1õá•1I?¸uÔü‚·“% ªÞWYîë/ ú ÓR>H•ŸBctß$z¬á‰è‰’,xv°ó"ž¦ïH§š&:L}:×3 d ã�Rój.êÆ‰µ«zTóã8�pÚпÁœÄï|ñF znäŽê�„χÀQ¸Z ÄXŒ:jáéÒŠ¢s€2OáТdç)He¤_ÈW¨¬÷þ;l%ûTÏg˱S‘ ¢z$©�…#Ì®-%`g)JODpãÔ“u 7–w'�ër^Ùƒ`2TçɽrcEP;2ÙW걚sÁ³QÐcÒCÚ$8,€ž �.L«yóÀ ôÄøMûse³zߣPX²°y†‰ÐøÙ<É -j?ÁÈ7ÏŠ5' Þ¿yTr‡N¨7Oà[û¹jFÝi£p 8I[© Ü­@ÞÇ�çÙ�EôP®ÓÌ—)p)-këÁ—§«Vw©ê’–õBa;*@€gq0¼™þQííd}`R:R€Eà)JdK“ïèlIôØfpVxG]çÒ·ì¢vaÎ[²Íöv¾èc@kÖÎ7 +Û8˜õZê[Â4¨(B˜¦é~‰”eª*X/Çhµƒú†ì’Æ{6S:…`M˜6¹ˆ@Ï´òŠ'†¦ “cÅ 1û´ú„�Ñ-p¹jòÉjÍ×õ8}î΄¬Yvλ¦Ô¹é¹vAŒo²« ‘ýüƒ5%Ó‚„€`f[em\f‘A�04ýÊlò.ØÐóQ³×_n“3Ì/Äj+��N¾­_TS2)ôË1ÌzeÛAæFã-‘%©NºX·£�3JH3&šrRxÉÌKöÒo‰9'Å,Ê%1²Ä>6 2KºøaZ@s˜‹ƒ41SÁÅ…ù¸S¡Æú3^SÚÌC,¯zöþ3Ò;+kÓ Ì~h@%Œº¨¿ì5õ‵;ã—óeañ^‚sUb«^8¼_6T +±67B]&€,_»ì«Ã°© hZáI5lLÍqoÇ�˜…]Yß)1B€æ Å’ÀP;±M%·RèÚ%ZòŠ ³ ¡£-O¤¹, ºå »<†y ȯù–¿úœ¼�Ñ4Ö¸t Ûš¤„]×G==ñ˜�^õbû±�¨«M‹z ($Übã!ÅÁ]Aú¯£…,õï’ÒB"âdóäoõwA•¼K¸ý·{½V¸�ñQ]EÍökºžIZbÞ(ÊꈢzhÞ4¼ˆŠâ7;-¡F0úgåRäöË+xWŸ‚3S¾éVÅdRÚét�6³ä[µ§Öj^Ñê^a—ˆéˆP�p´VÅèH…MM6•@kâÿf•S¡Ç„v”í™…Ì…ØHÜ?ìDÉmÓ’*O.kÝ\,=†P!š9Ó^W~:M3ß/¨u88ŒüƉ'h”‹ÂTí$Ü0ðízw3Ê:åªü&D»8fN†]´š¿àªöI±S9:MKu||$b�N“'d!lhÇË»xøW¢Ã¬Ð‘ÅzãD5cùWUº­MPK¿ÈÎÝSÊ¿/á¾a!ªüVøÆ¨õQk’Ä.U”þÐô¾ê†+½Ô¾¤õÒO~W–Y6·†9 åIû 8h5Ò¹â€mú×Qzù+>Б kó� +hj¦ªv�tµ€ypo ¸ìFh4‘Ä’âÅ Ý;‹MG’º÷JÏËÃ,8bp†‰(ÎvY±¡Ûb×…Õ„..�3§`åÿKQžÿéƒ$'`í%¼N»á’o)~ ‡kˆ'†b¡´ó7ŠAD€‰Î„DþãÊUÎáέ–,./‰[ó1ín^ÎîGWIL)¿~¬ß(Ÿ]õëÉ�b¼ËVE%_½äì’¾)§?Ùƒ×�ýU®ÐfˆÌDV–àáš1ù·9­®X˜nY‚¶ò[�¨®\Do‹´õœ©ì1“l%/j¦ä|ˆátMšdÔ;Oü£ûTËu¼bëGõŒ>)øÃòSÉrôú­À¿>žÊ1ðmZã|\)4ÔëËÊlQC¿A ñùÑá)j%M<’Z¯–žÞñþrSRórõãÚ/�6s¢±Ëªå‰ò2Z0à§AµHÞÛ(#Aï[ž î¤b—ÿ™¤Gt°ôÒã­"a$ä#µ›m] +¹Kvšõù †\U xÂlÛöØe5É A}àbß%´L±Ep.)¬ù�ݤ-ÂMæŸÌôÕ$‰A^‘HPnü?°êE¢gk“‰M£Eþ”ðh eû^�y%`lÉSUOÕÕ�ý"jI#ûÛÔu‡!ºëõ”œv~Ac1®È†­-ëÞ6_ìM<óÀѸ²0åø^d¾AÔÎ"ö†[±—!zœŒÛÞD«L•u¡Ò1Ú[} 3ĵf!Æß²ú£†3:ne“2oœ¯£OÑïÍÇ0èùMtUùÙo[ESâÓØ°S&‹7é›:IüHîéÉê%"hôB°:~ØŠtè“’«‹X ¦®ä;I©·Åzo@_Ø|Ø´q8§"ˆ¾yWGœa|Žkíõ58iì˜d<–`œËœ¼ !ìtÓt‘ÛR©ðô¢ ¿J51ý ÆéÓÈüF¯ÖS G¦Sù%»ƒx*¥ÃNtÄçTŽŸtâ~Œ“u¼‰i6M³IâDÀxèTÓ¶‡&¤Æ蒙ܗ–ÈL…êõ‹ �ɪ‡²kâéaj¼-yØ býÒ ÷‹ô\—ªWæÍ–Õyì‰Î–è`%\…"œIvé(.�ª¾L­ŒO"1Mšq&ýÐ]±’ö̓Ÿ ‘t—[FÚ§©iÏP:Hìa²§]óGŸ6–[¢ì¯è•7ÄŽŒk%\1ä±L�\º!#f°RŒS[IFÅŠÂîC»J'úص|¡§q�ð�XVíQ–6[òG°k�K$Àfþc›M²w˜Æ\ÐLC=¬"sSAŠ=ã )E½НÃQÀ�øCÑö¯¤²Õƒ1AÌ|ÛÕ§C÷JÒ "Ð8`±ÝëŠ0/ê—1@îQ4³èŸ Oß[³½ýÊ�I‹b¨.û‹Êá•©H`ųwÖðh±�ïö/—¼c—¯pàl"µÜŠ‚ÓJLïX/w?Ê’¶¯tŒpâŸR,‡Í89‘Û�…<ó¬žWF…Í 0‡ZÊé.ĵ'@6 gAB`/[jÓÄœMÄ[ß¼wñ�Ž{z=ƒªÅXªÂÒNDÚ‹ÊÛ´<‡–jëˆÕðG ÓGŽzæÞàåûWýø?ÃêdáÂöH±4&!ð¸iÕ|+e~Å}oóèpku‰[Î>Ö„‘Q¹ídãí6ÿ…ƒ�ö²›ÿ¸[­åÁÓÝÒÃrªb·ñk˜¡×&œ#ÂßÎÈÄUü’¿l®‹ ݶjÝ)Þs8¦µkœžÀßð]*Ëñ*0è�áìõ|�«²÷óë~öŽ©Î z7­¢WY5!¦Íîë¤Eo¨Z´šèM§´Cº�iôN-ðcèÝýhöM˜é_ÚiÕ8S×fo†¹­dÅÊ^¥c¯¸>ñ%ÄÉa¯ÍÓÝ]oLíÌumøšëõoù½•ºï.úU‹°G_¯¸Bu‰œ¿V+!™óUn“ëŽBµ¶’4Göƒ•} I‘ë¾>Æ©ÖëäÀÉ-�Oõ†¹ÆŸ2A—=ï«t¶íSå-Ú¶4lb <‚™ÑUíÒZöÀå +&i×mám4‚ìÖÙqà˜ÍÛÕ LpFuïjÄz@h* ÉÊ*,Ú^ýŠ0;‘n^mtP•r°Ms‚gšÿÄCND9&ÆŽ’:4&Оœ`ÈFìgàs@E^JæŽT¾6Éð Î;E´†!iý^@Äe�Ì…ø[ëšbÏ­„ñÉÞú‡»(Ö[ŽVëIó¿Â¬‚—¡6þKøùYÄñ5—FZ]8×þG+-O„NZ\­ö€/aO¬Œˆ»:¬©¤ä8%à)>:Ê´ò¨˜*G¹ï–ŽRÆ‘¦áBÉV…?\_Ãl õÚi눪&¤/…êÂ�Éž9y†ä„êré9:™¡Íp,Lµ æad_U/ƒKŠ‚öÿ*õSÑnve|…¶[æÑ»ü"—àé“–eŸê2õÏ›_µ�rµp¨ž½ õŽÓà°nqà˜# +­H>‹·’%lS‘(ÿÂÜd¤˜Ž + +ƒ?ãf¢”ИkžwYù§4œZ(�þ`Æz‡Epº48·æô7'†|.€¶ÇË7!²…î@*ü¬€e½Œ¿÷ 0„¹ó�j 0!’(ØÁ�²Bª^=qÉš…¥¾h¿ö”ÜœÒKáñÿÒ*ÜH.W?Äo`ômàúìYíP™;ó6� @gO ×’-6DŒ¸JñOéÍ`X…8òÕ1–ÙvUɨ'¶Ò ND¾aò¬÷ þô�û™ee°eð”¾Q®K^ZC.É€9­ãHÂEú^/;÷Sj+ø­6E�+‰¤Z–Å~ ÒÝ2�-ò-G"Ä¢1i±À)£žÒ�F‚�ž��·x¡ù`U¨@©´²$>D“#e¤$‚�«=³‘þì,là?5·±…Kâk¢PÎ ˆ °¢Ü`Gne*Í[~±Ç.x¡…úqŸK¶r~•ZÏ/ò@±Ä_»áTj} ï!Öz4ÿƒôÊf¨¨²ï›Â´wïìX4ó“ŒSQ Öï;ÒÉ•Ç�éÏ ª µŒÊT.ˆ�'4ŽØÅ4rn ‹ˆz�ið…êóA"^°?”ô¸Y_�Ð+¹m?Ëô{Øà#Ñ•ß]ÿ‹qÏ™Ej¨|°¬+�ÀU@¥W‹uu$0ü‹Ý¦?eÝ8ˆ$',­èe©þ_ñë¬T�ˆ ‰|ÕÆ~ä™öê4ç8$Z¯Yø‚~$CªÀ C}½•ˆ2?�G† C¶ˆD3({¸¿8Ùæ°ÓKú�ºïŽá‡–/Â/Š‘¬¨#°•7ÀeOmÖ-ŠÎLŽH¢½�)5 ¶±¥ÐS„-¿ˆ¥íêÑÔ€fOèÈLèjQg¨·J¤ø6G‰a_Éýõ³¼N[|wçå˾ý¿–O‚ißS±ôïnhÁnÂbuDnPû,B…Ø]!¯ ¡$Íж�²ƒÜ07ôçÜz~ÝîU�Ä^Õ;ò²®�ˆ#p5´VÛ X P'÷þ 6Ää2κÅ:2S¤ [Ãg¸„•Ll:ׇDPM°›à*ÃfòkWúµ’=~ª…1�Dh¥ÀaQ}„¢`ÕNŸëÆ"‰†a–j¸TÃ|Ãþà FV°_xȯÏ^Þ@ +Þåà„©ÐÉ~îó[ZÁ´7ø¦wÙÔ;ö_tHâ–ŒÙ3pZ$ú{‹Ú(çõ1vè#·rÿ�û#.Va_ î‚ûä²€oÊ´ƒ¶ârYVFoMí§y1‚{oÂ1è´Ë10qïZ¬“ãƒm.Ñ&tÃŽ1 «þÜÌ™Ôhµ�<·œ\зÈmJúÀ‘µ^A]JãbÅ•�p,"Y�cÎÒáWzÎ+NHø4D©…IÛ¬”‰.”D«¯(sø�Äå©“X�¡#¡ƒGSs8ì‚“HjË:þtÅÃV áQZÌîŠ+¥û>cT%Òï/ÿG,–m=˜Ôõω" 7=èWsL!5¼†ÍäÎD‚í`´‰Ü] +}ÔofØf¼@$z<“ªfÔz„ B¾Ì„ó]³È#´™Ð4uŒqðß„A,÷³û̘ò^p_ÈÊ&UE$¬oÆ´Š„kâîLÔñ¼n:=ÄëùåùŒàE®MÝó‹Õ‡‹È¿6æ«~° ,cN«>ó|K  ˜«#°T&(9e (ÀúãFƒy‘¡ƒ¡Ë”*ÁîÅ³êÆ¤îGÀ €f}�·È`å¼s´ïÖåòdëŒæϺâ¹ÀN÷ºXÆÂ»`äü³¥Ö‹ßoÆ–÷boš|ÞX*Oþ¼xxcnH¡µCâÐDˆ´ÑÁ§Q õÿp)êæzGùGŽ­+É1`ô`Ïž{P~qÞ—Zã{¯yJ*+…ײԔ- B®ay:ÍXö·×ÂG›S¥`|&áj”êþºßŒYÞK÷ Y<ª +ƒ¾Râ¯dgÇ%Ä+4ÄüÖÁäšæÙvÍÛϼ©¹?óhþ•šJoª»²EÍÿ“›Žì¦¦5€1kwíóò–Vê]¿”Þ+K÷þŒ‘ÄŒô§ª×Œ²jl%rÍŠ‹Éò�)Ì%F�–µ¶;;Bv/PÂÛq½¢ÓñXêH:NÐx8]Wr³ºc»$ç’0AW«Cöð—ê;0Þ5J³6Wˆ«�K±è Š ù„š¢'òóÃâS”ɱ +=�ínè.ˆkÁ츜@+#s;�aŒ¼ÊƒšŽõ™Nb:E¦sÏLÉ÷RRoî¨i)ùÞ�t¿�Û�ÌÃØ›¾5¤CXÚ÷ŽÁHÛ‘‘ŒYnÉm[x§™š¡¦¼œŒØ>”ú� )oÃ.9_ŠbWçvÜð•��!]‹i‰:óÖ4>ò�:4*��ÆÞ÷…PÔÃþŽ˜§{y>å9··F=Ô{ä«È!NÊCî”UÀá„âéλ¡Í]jõ—)Í Þ3>­ ï"9§m6’Fêuˆ»»Ž¢›y +¤bÁÏn‹QRÉÒÚRªïÉ–keõJ¨u7ÇŒeׇ„�0sF�7•«>/ +Šˆa%Ž ®† Gƒt¶%0S3u›ð³W–r‹L° +@ªJÚ¹YBÏ?(G’b¥ 65^˜Y_§‚�~¯“nl¶Cþošý!æêÀÊ }w¯+EòSŽt_8RâùW ‚¹ûÍè[î.÷]Ì=â󱊿m‚ø~}@LOúqÑ›qüf2Ò÷ÛŒ+Ò¢ô#�—£ýöwrj\ñº¶[�wÑýÁûœõmâU«™Ú·ÛÑÜm¬4u·ŽAÆ9–À¸G�бªK¹“˜uÕr* Êõ¹Ð´Ž¡b¾™Ñ••Îx!†C,2éÊŠ÷1ŠE y�åuÖ©Ö¥ræ#™) > Õ�’º )ЗÃáÄÐg,±Mv!'\¾Wo/'‡:¯GòõfCaëѧÓT\I{·ÌíäÔṲ̈‚úOÁ±1K6? +ÅÜJëõ„%’ñÔ�’�§”Ɖåçm wÓS�HYû2�Ô—�ÌŒ�Æ þ¬:}H;ÐÜÕÚÌû{½ò°ŠÊiOøîáLŸóÒh](SþûÝáb/Z•�Ugq2ƒ”ŸAOöGƒQñŽ`º¾›!Š0ëû(õ*3“¸�|¢s2vsš~I¹†Y7È+ƒ)ÂwªŸwöÄ=ìIÆïÑJՆʃjkt6^KhûBªÑôG…é'KT̪TÍ“oªŠ]Ǫ‘*^ª©ªÀ¥¯jùZS��Wµ$U¤ +ºf äaZ�[ áHRù8ÿôÓýöŸ`¢ +b°4ÿ§\ØÁ@’±›n’AvÞúÈг`Ϫ‹a¶·A#(ø½jã¶yhîB\w +Š(¹üü)ö";%Uêiä³ø<=èKÒÅaw—°LÀÔ¢Jï­ÞõX4l'bÅ‚žÌq›CEÑÒk,ꨕ:µÎòVÊø3™á~l4 àAÅ ñw„~UøM³¯ÝÚ‡.Ö÷6-Øó_¹Ö‰¦Ø×ç…p‹è–Qda¿…#ÎwQ1À"Ví*‘Õf‹‘}<„¾ëb²®UF€ZÕÍŸ[qzsE®ËÌÀ–Ý!îÎwýcÑ·£ÔžlåsdÉyOFI 8ƒþ ‰úÈzÒ};„”y„¨Hð±»Äjy‰^€í‚Yt²¿fQ¡/Lu?†G›ˆ;ã²É(i¢¬ƒërÆÍ¥ö#b·ŠxÎ’0/�&Í´z²�mÔ2Q?1)\.Ÿ°gÿp³qŠ“<Ïn±kÚVI@ª½(ï +þu!èFŠò_·ab‚ùW,ødLX|ÈðÄæGÂ%}ï™·ËZW£©åfjÀÁdÐç�XØäLEU9ílà`KˆRgJ1›ÀÎ|S¾0òo.ÆòU"¬Y*µ8¢ö¹«y޼ä޾eü.{ØF[]Ödt¯ ·9ž’·±Ån䳿a^,óFŒ”Ú žªI'M—(˜DPoÓJ¹Ü_à/–P$á‡äXàƒÛ¦+�ÂHTkBae4tBÎ9(7árê­¹±JB°¨;€áýMÀo•æ4|Ì+²iÛ_^H+ˆZVª* +’Á¬h`U&l™qÐ5Wø#šYÍô3\UW’ap"êTS¶Yp²î6G7"éÒân7îGGÛØýÿàèÐáó>¼?z»ê0›"=ø££³Œøõ=�ÿ9¤ƒAëHa-lö#MÚáÐ.g0ˆ9‰¹4 á⇟y9 ";§s“½@á�MžPx†2i€=9[dì÷1 \$³�†>Ú +gÌD>З}v+s¤rWŠ94‘uÊâ6…›4bmûZ@÷:{z¸“¬LÄÌ?u�æ®MÛóÅÄf+  €ý$±…-ÓÄvà+ü“#Ë˜Ž ±”�…r{Ã8¶ 7ð±¤õ€ËWf‚h4A ýJH.ƒO°!Oìö "¬á$š‰¬Ùd‘ÒàÁO%hêá3)äN[„ð(<¬z˜€™øŸ•¾ûùý„¥‰ÕÛ%³£ }rìolsþõÄ•:6é×V5/ñ™Ó¤Žû|sŒ²Áœn\P1¡æ�[øE*;ÊxþEÿo Jî®z Ænê%M—ºšr”üƒKyÍY䟿›.@‹€–Àå°d°ÿèÌwå WZs¿j°«Ú/X¹Ùô÷a"™lù+O¥S ½a‹5Ìç„.qáàŸ,˜{ŠHæTáà›FK0ÏõyBÙÈz’*×Cžöÿ.Óð”þ-ÿ~óý½ÏïcüƒžÔ^lîwt…ˆ= ªOÚj¿ +‹ÀìÇ?Ù§*öQ°OØL†hµgMh®Ð5Øë÷½Z‘¨^:&bCàCW[ª“4N ©ƒËŽ‘Qe “þßoù‹}TÈ­L3^Ð$Æ[;fÅT*õˆf¯ìï,»·Ø@î×°=qøhçÙ„ìŸv±ðrÿƒ|¨hX7Q˜ê§uÃ~ ž9?Gâ�›Úå¯,qŒË[×ì…òù{jlÂ’µ{àD;«Ft:®RH'—Ó{ÏꮨØüµL=¨»'õt  KŽÔ)fêjD)WÇ\¬óõàéðäßb á#ÏF‘þßLìÄ Ýÿû=‹¤Šê,g3ñT¤V…¡âmÀQ}ÔJÎuë¨úˆ +#G hðÖGð›Ô„}�®ŸõŒ_Z೯ûʇÝ^ý|ª~¡¾ïŒCãõ']ºô‰4­OWu©èªÇÙN9Ì„zìo„×O>ËáyÑFî^‡˜X%ÑmUñÚü±wÐ ~«¼â§š‡íuÂÐg�ùBø‡…·ˆ»:ÖØ­�‹E#¥P}+#x/ÿªs�€ó¡jåÎ�Т~Ãñ— *_WrDåVn^³éDš2†ÿxr¢Åî`8³bki-}žÜw‰gþ€ö2†…í­:LAŒöß]ãhð3££8ONÝòôŒáú?G«0yD"@ À0`�-8¯…øÒò(nOÊs1"“ì0 ×Ïç „Û€�@,8½çiàæ¯+~Eîkú4ùX‚÷3G'ÿ:Àé}R@(–¼LÜ&Þ�vÒÆx;7éúQZ1ñËâd#° BvXÕÓÎ9\sQ�|Ôgu Ô ôªr¦¥ïJ·2½ÖÂ¥Ô´ëhë5›ï‹ì¡8tÑeêÑ‚+V_ÐðmJ:ôB¼Œå”¹²HD´È¾’*�X(×WªÊ¥ʶ˜ô&=לμ`PU°ÁZê=4UöhP®Š-I´|NAã C'¬•ÈÌ¿¢,‰§Ç6¥´¦[ª$n$k84ôƒT °~ØmïÄ"vÏ +¡´R6Œ¿Ÿ% Ê׈™“4ÞX¤þaðxn\b=¾zÁâRQŽ…‘Ë4IÞ²E?À„Þøð›% ]h]2ê(èaØ=k‡À:Hs„ Ή + ¤À Á©¹ªPrg&%†Ì¦�ª0«_øhÈåd·>—õu¤ƒÇÊKS6Kmn*<ª‘ˆ©ÐlÄí-½t!Õ “*bˆ‚l,ŸÇxÔ™I»-ÊÅÿVC•œ­ŠUª«Ä¿«ÚŸUyaP_U¹ªj“¨Ê SE©"*ªtUlë©.UN•ÖTô0…¥RR*²¤!‡‰ö ;BQ 8T´’¥½îåõ¯ž‚ Š}M8r*§VÄ]p´ Î�€å¸óÕ” Ì�ÀR“_~äM®aš>¶�psºåÄýÊ ^"·'å±”‰²?žª‘—ýñvË?99&'ެ5Õ! ?ÇñøÁf”Ùû‘ +ö3íú"w7ÃBÌ ÚB‘ʨ×_4‚€'”ŸÓ÷ô�Ý1gwÅv��]T´žc@'”C{_º�(( €…†"ôBŽo šÌA[ö¸ÙÕÇK²ˆÙ·#»Ì�T¶ëàÁjöõ²ƒ=»ÁÓŴϺK³ö,—ç­Pm� isÏ­6=ÔÆ¤Æc³tL„Ÿ}ó l²¯'[�wl¦‰í·6\_�ñº +t�1ÐZ(˜ãb$Xš©Ó ƒÛ+ÔÁU|€cúÀ�«¬[nc»ÖXp®U\eÆ)“ˆ2T¢2m“m’Aº¨£ X”NË9”ù}v4\Á|Í• mWšÖYg +$Эœô™ý |‡’w ÁßÅèóKjsjhŠI¾OÁ"T”Qj•Q}»ú‰¢ŒÁ8Ó¥ar‰{  ÿ/ŽjK´$Å”A#x3ŒÍ2>Ž¥ÍœGUbı7á  *À!ý™oÕ¤«…�JÈ&°giÍUz´À¦ +P(Â2‰¦²ðO§ ËTO $ŒAeÅÐð6Iò“ê«´\�UPÿ2Mz›œi%±€Ï|õ» ©K.ÑC +bkA¢žH¯”ñ·ýÁÒfìô5, Tùé²[šæ�ΓXWÔ¢„²2ÕiÅ%•ÆP9�*)<7j¤ø›Q.Ô(Š€–À¢?ó<†y�gŠžÒàü�®ñ�…ãžÝĈÜç?v>a‰`‚†¸¾æáÖZÃe´@§è®®`zÖNzÄÊ%.^7Q³gÉK7®ÀjZJPxÔŠc‚Ìti¯Ðz­ð.kM]2‰ú[Q—V;ðÃñ0ç7äáô\¬äট�ï +†–°p(1¹& p’õ3$½�¿ ™þ5P‰$bÁŸ˜•(e®º-p„¡~/þmP_KÚ¼”ªž?-ÃÓ!O…ÄC/Í�‚>2ÿ¤Ø½ôNÃ69ƒa”©2Wõ¢V£¢X—°ÅÈ9zõzwí@Œ$×…ï‘„kï+�À¥»óoóÅß4ñ{‘o•å¦1êʾ›Ê³›vÿ«ÒÍøcn¹}Iq÷{{£0‚un›&µM|m1­­$µíð¨� y²ó®Îž‘ÙRg4ÚLöò[Eì¤ð䞤ªY?ª½ï_>½/¾~-o߆e�ž½$ÄAü?ð°ÜƒaE¤ÊG�ÆóaÈ;þ`»-ˆ�—x\1WI+.ÈÁÒKÀ˜Öéi‚É#-‘l JˆšÁ,HV¸Ô]}d,-8yË,QeÌr/òºÎJÊI’ˆ2J­Ž|W¬ü­bjUP 5|p§XXJà¡ÚŒ’~‰S FAæÚÒÚh£žUÌ5%× }“а�Ù€·0wGé*|*æ¿MwÖùÖ¨üìJñ§:€ƒ§Å¯òO@‡®yЬƒ�÷×]Ô:4mà~:Î�Ñ¯Š–¸Š»! X¼eL"4Ih‰ò%ÇþxCGF‘(ÌØÙ;v¤¿adz/«uÔC—€+†‹16F ìàvm¨ð® ¶Ñú.˜ð«Ïaʨe�1ÜCv#E¸éž@ O—³šò% ÂÌÒ¦M%jþ(qé’«Õ46v Â25Kl|ø�ã¢6÷<ÉSò †DÍBòKñ�f6­%lœLà ��Ð)Ìô�ÙßÐíƒôŠ8š (F¹žÂ©¢ºM´ÂØ`eÊ$”<´ÍEðÓ¡Û� Ã…êÈ|ÐIAË$jPX„.<,(7b4 (á/xhã âPoÂvb Z)9в[#š*,Ä?µôªèßPË�ãøÇMÛü·HßI/ßÛ-é·`º.ÌË °ÑyÚ g‡à�.€gœ�@Øfà+Sýi—(¨ˆº´šòÿÎ'ºtûÃ"J™÷•qÁ°-¸¢È0;_¸ ¢%æOöœ]M‹[èÍì%.�‡›—Š£çü:mmvµF !}l�—׆Ž�ûmú÷o=Õ¯ÚŽ§ +îã„FÉM™ûß«Ño˜½?_Ü-�ú@^ïC=6À0ÏÙËïÚË™§ÄOùW@Œ{>|- +iÄ7LÕ A�PÓ90�)—>Õ�pF¼G?)*IìâÌfö0›ÕHà!‘†0*¨Ëü`ÎÚ'!Ö+Ø6wƒ¡®YÒ!ï˜3•ÛçZM­Ö–YÑi†õ§Å¤Oq#12wG¶+ôÖ#ì>ˆ%¡;¬j 0iîAý<²‡õëˆ3Ç›ühR ”é}Ô°Å:O<Émè Š"¢<Òk(–“UÊ´X'e(&�- Íê ¯øÑ[é�ƒ�UíP&Ðb&ßõ`´�âG¯VA‡#YŸbž^÷û@8:Ó„æ`jTó@0c-³¼!^ãÄìG/Ò([ôPZTë»Gaî„s.ö½˜B”¾ +EäjÄQ î?v¹e¾Ã¥Ä‚˾ýºÇµ4®&äêÔm'ž”aÕy>Û}'0å3”ÄÍÚå´P­Lk£I60§Ù¼¿6Y;lâµÛÍ)ž�8!¢’ÈnY5tCìA5œÀícÈHô}Ï·Ùî´^nÝoKOgU€%ã;ÄŸ›§wn7f¤•Õ3ÇMÌ5œ†]^gÀ>ú7õÃ}ƒÖ€Å0i—9 lÙŽÀX!7$ó‚0ÐNzÓ)ýÕûÐÎïUŒÿs°Œ1m1ß6U½ÛG°ÑÇü›M_På�úè¡m££kŒ¸ôöB1ÖðÙÀ)prÏ“É6…Ý¦Û +П2ë²ý@yª7.©¸OZå»FON =œ_¯cÚ±®ÚG¯„x�v\V *ÈÝãe.}Ã3±"®øŽÊ6üÈäÉ૾éLW¯ � ãëàtÓÙßÕ u¹­k4Œ{Dé ++äîLÒË>Zû2u‚E  ÞH’ïªû¤Õ�sLïú(·®i"ÝIëí“!•zô;úð ‹¢‡ò»B�f,–/à X Õh“\½ý��ž(h»5‰ÐÑaô¢R¼÷®Å+ ¤f¶hWÆð ¥�ºz+–þèøè#Q~AH–’†›�A0Ú˜@­’‰3¨÷îÂô®Žf2ÅÁ‘„‰“°Cô´¸fp™±MA(}¹Z£"î¡(*ð0Ô5ë[l•½E¡“œú| }vö:ű÷ +ܺêÛW`M +…ƒÄôÈ;òˆzüH)SJ2IŸßœ¡Š.ÀwcBJ¾Y‡Aš05µrx 檒‘؉f1ü}ÃíûVOÈâU¸‰(íÑx)Æ›˜f_PÅLÐ*èçÄuªÝŽ2Vr›ˆŸOÅngÑN«zÅd†c +±ÙænQª'¦*áÄIXB­Ú á�„ÌdCyL¦J.yLdÒY¬J‚P”KÊL%S(•ü¢‡Õ,X cN*~Øi/ÿÊ—?Œ‹³ïŸ3t�—™xÚì11Ÿ˜Íª"l65’ã!Q‰!ˆD£„  º;á3� ¢»õÙ´>³4ô!¡„>ô¡çe„Vô �B‹‚FL« š F«WIŒò¯¦j”c¦8�MìSâà„92á šR¼ö…Wy»“ì?eò�ê̱üX/Þûb±zžGÊÝMQG£kè©|8œ•ã %×;2}ø’Žht‘îc!�âätðáy †1‚‡ì-ïŽ +Ù˜N>ç%œÄŒÁj¶Yæe¦‡FO…×vq9Ø8‘@†Êb!ÞB oè!Š�kŽÚ‡º›PL³¸¥qíI¥ºH“”UD"á×Xá¢à¸Z%aäªÚÈÕªAHy�³›¤d°EÒD4¢)Ï$��„ᨅBR²'gø[&…2R’•±¥×œêÕÉÚœŽBp2ËÌðªæ5*â̯Œ…!‡æ5Ÿ…áIçJuN1t¤œYl$aŸ�‡F&b‘š¿Œü +"Vxw‰¾­bw4�Ó‡’±†ÄWÝ…éfBÉz6bN}]ïÈ^;ªd®y3ä25(Áù²h”KÝpeBÊäU4Ò+‚#:qØÛHøRãÏýêZ¸B¿…ø•‹f¯]ž�o´pÍ[–Úƒ[9È.šH�Ð^2#Y˜½Ô'e‡Î(³éäQ µHn²äª+f!爿rùk¤©Ë‹­騄¯‰R .ú6âE–.„'¿b&Be½÷ +"£ý"«x|ˆ¤à?“ì;´sI^A(;_3QMQЅ诉Š0™œ~Z˜Œ3ôɦ×%$”ö) +v{=ä±½jpRe¹9�jñk-ç”™Û1bE-‚c(ÚcÈšLƒk2†ŒÈÎ=¨$Óˆ�F¸a�*êÑB\úPp‚&7ƒL÷ÿ,¾`ÎL¼eF~ˆÂi#$D»ƒÚP³‰Ì”L¤óITI·dbG¸èŽBŒE-lšQÕ3N¬öÍ׋ÈȧêÐ`¬(Ç-5ÊŒT|¦D¤ÙŠÓ{§|Ö¸ŒAÓ‹^MIc�Ø@ã…NcgÆíøKeü–ÍúIú‘ò¶ìO’r’ÙDî‚ r4§‘.I5 +µõ! 4~¬i•h!FO8Š}‹Æ·fn2‰”œŸy}«B)QGZJ<º©UÓÓì¯ÒDtk¤TÈf’ktu�@´“H<êt¢")Ë–eÙø'Ó¥ö]ÝÎÿÇ4Ä´È!†ÆS?;#%yˆŠP¡%%E.E'¸Æ +S‘Š))""R}¢‰É$TË =<F%Âá3ô á]¢­Â*¬^aU4âT Ûu»L»ª5 +q é¢X°XˆXˆ`™aÁ-#,†ÂnrDi9„‘p “¶Á!BÐäáB c΄áh�"PŠ@«Íž0]IðÄ”Á 6q¼`�Kh††²ÎÓ8_8Íp) )‰…’0ÂÚ”H$�”TÆ¥ƒK�AÌ—0ˆÅQÒ/uRò WØ« +û^·o³î”B]âÃNùÀW5p†Ó‡›¹ã q’hˆ;—Ê„jkÞÖ¬ % "² "Âò‚ˆˆ‘š`© j=”¸›ºÃ…¡†�ËT8«ÂyžÎ�ιÉÀ`v–M =Q8P Ç0=<|Bm:^R%öãnÛLóMª^[ÕEEž¢‰‰ ¿8µ˜-H›‰iTb1Œ¹Ì1 wa´<;KN5bÙ —±¼ß?+h(^—(êIÅ*¿ÖDr¶HÊ%ÚùŽÙ¿u� ë]Ñɤ•1}BÞ†¶q}ÄßÕÓø‰ +þ-/ru¤ª.}AÖ¢*¯EÑŒ¥jã¡5P¸&FáÖ&ĦK»IZýåÖ}uJbb_ˆ›07rÓåüF6ÿ¬¢!£Xƒ\uÓy"7¾ií‰+…Š/QP*’Jg§ˆDK;“ܱŸÛéûòs©î/»Ô¦ÇÔ•É&8¿Ib"SÿKî(õ£ò¤HùÖL`7,µ ±:g”ÌFrY“�µAäØxQOc*êEña +"—=ò—¢šþt6Ý)Á~FY×Ë(vUúŠ™È°dS5¿æ–šŸ'‰ŸOG +ÏCBr¥æô2-B9ËÆ!Džän »Ù;ý\W¢ápBÌÛÈf©©<Á‰�!\ÙzÏ+reRAµU¸‘1íïE5¿šTˆ²êÊûöÕ*Tå¢ë2›·‰†ñâSü”ëq†òì¨)—GR¹óôj˜?V~øï7ø6¼û–XxïWxþÁ¯—?ñÏ'8¼L¡R®2ÔdáeuL‹<¢dŒ0Œé‘5Ìüwƒá¶íšRo\Yì¨xv„%`á7¹æÕ =T…âT0µ<çLc:±ÆLðÄá~p‚+$¿+gpÉ.ÆöËmü ¡V°¥ž3ȃÙeÝV\šé kG`‹¤<Ó ^½Öäv´|W+ÊEKúà1EÉà $ìP0 }ˆ$HN �ÿ‡!�<äâÇÿþ•h(y{TÁ"‰|"Â’¯B¡ ¿‰Ð„K1B‚B†âŠw±Š%ñô8ýD! +*Phêð"Í0�,ŠØùp‡sè8[–ç¥IJ�  t8OöÃyÒ;L¦áüGvܘ¤r8K +5·¾†×:B¤h¨™RÜ#ÐnŽ^ �Å™IµB4"ši«ð+yµ¨ ·%ಠ…àLƒ~uÈ@’¬9(¤O$Œ0«ƒ�„­t(¡ŸÐJJQj –2+¼§RhËa“œpJ+¼ƒ›u¸£XÖäQ8åü§FFÅs¸ÎЖsv0N(Jô!Ì2L&“˜À@ñC¥œÊx- + c©Ù2~0Ã\æ—Éå#Æc—| à Q8‰ì’L ŸÆ•J(y‰C‰HIDA!,aa:VD¦î¾vÅÃΰQáaéCä3tr_Ú—ê3 ®Œƒû¾4S¥½7o­ìÀD ‡ê´–á–oÎafV +´E\©zÌõ bv A£’P“¡AjÒ®0Ž`;|Æ2r;2Jþ�S¹ÜõY ù¨íþa˜9ÌOA ÓúKô¹? !µ”Lˆaó ;˜MÑ6 v0ä@F�údÊó!C'�#ÐLè°×g;ð”)4Ԇϔ4|„åH]üNøÈIH¦ð)qPÌDÙ;˜{�Ú ô@ÃW¨™â¼ " +5cùhœÍ�H­XÉ�Ä<–„èJÒ;˜“¼Â)|C«I˜UÍâaˆ¦ó˜†¢) +CDD(Šˆ;à94+H‘("”�Тzh|h±>´¤Zâ ­:”C":d°7š‡Ç«Šf�dU+Õ 3—áfÆ.®„Â0L48Ò•CS 0Q±� F¨¶Ý“PTU%»£8 Ó +U1adˆ&ñ!Ä�€0pOÉ@G‹žE`¸Â,> Å…í—*œ‰¡†©¹*;À…Zg„¨<â� #T3¡HyJ-<E-ªˆ9n(„M!\óe†äÛm‘”¬#ÐDŒU¨à5^ >}š�]1E#CM¨Z+yÁßÃ| +jð9 ì. ,_fgBX™R%KN,‡K·‡©Â�}njè_pHÙžTl/X†ˆõŽO¡Ú#Ê™ÃÅ=Q,4ªÀæ›ô‡sÌÚÞ?/ªÓ0µé BÕfªƒ  ×^ºÕúËá¢PTšPóP/;ôE0…´:¿a9 EB ,`àÀ„�CÂH-×݉»¦p.Ρ§ºš1Ru‰Z…7f5Å�ˆøªC\³qŠ(¤‚¶:0°€?à +ŸüJÎ0E ³& 1·¬KK&„à4ÛIf×};!RäóG°S„€• ‚¨ L‚00AÀ4 €º¹DFf¦NåÈ:z?4äû”©(²D):±ŠgP=Ÿ9)ìp³ ¨TT¨%>…N³`@ +…Cb±¬zü€¢v4–@ŠCBA(*«TÈ Íq6–Æ'�µ–há˜Óß +ª¹ÅKWKÂû—'ôJž&ïçe‘.mjÙÆV ¶O¢ÆXÍ(�C³û—�ÕÛ,„C&¨¿>P–£]Ù—÷ÌÖÍ!ãNßwxDAæUä3”�ÏR+ 5‹w/ðf Ö°sѽ5»ò$iÕ|BESìÚœúú{“U“4%ä|W7fAð  ' ñx¯[éˆ œ#06œ]Î6ß*Ðbó–ºø2 :áŽË’U¼tí¬V7uëç¹ÝÀ¥(�$ƒbSŽO Þ$ìwX +ÖA·i„Ë(àrJ'­4¨ÚÝ•3u)JnhíÔeA"KEؾ¿ ”ð‘Þ…Âø¤­GkÀï:>)j¿ † ÎT਴™˜p_’Ví/Í$’ñHý°z�ì£=¨  §*¼†‡ +ÅO2Ï|LP<TM€¥Ìä0?°†5J°o¨³ØÇeFï ­D%IدDÎ^¿9Þ ˆÌ6êdÊ”b×ü:x¬C�ỸÜ8ŽÁìG¢§5Þ—'ÑJ“™ÓóDñDat˜OY‰]¥j7# ÔQ·ë^pNÝ) 0Ð{•6W1—ÊHŒC e—pØIb×${Ý(:%Ù;u2hrÔϳWß–È)# lùºÈí9r2Lý{£;:ÒÄxH€Í[YMÖ†%“~à\ê): �˜Ï%É5ñ]@ìûfº´«ä$?:æ�",ãà !Âý©ðy¼¢c¯lœÀnÞ/6µ«qvìŠ<àz±$",ÆÀ@ÄÎ#z¼'mcö5óZÚ¡CE$¤“u� ›)­€‰�”};:@rA„“F¥Ï±(ݘ©qƒÞ© CrìW†T'‰Ó‚ø%œHú°¥Es•s\ÅØIGW0ì¨z,‚²ÆBz„ÑQX °ÏŒÓUiSjò1M‡Pî1“s〳M¨"qþ0‰ù—Ò»Ç>WÆ{æ)©è@|ÞC$ÒÌ—¾eîˆÙ§=¢Tñ  ,Æ[báÜ žs¡*Œâ}&obÀÛ`3znMûÍò”À„î[ ?KÕ›ºeè·ã�Œpvu'%"åïsˆ¤N.÷D*Ê-�»eóŒ£Hc;)¤ +€¿}Ç€_¸·) +úÚŠe +~R4‰¢N¿i²†¸z‰ëk÷®ËéëÏ·Ášushæ)ˆA%O�Æù0-™{‡�{Î>b†>ŒEÁÊ +6Žª‡,ñ.T VŒ»å;À‰ ‘ß+€~Fª>�ô Y½¢°º©Üý˜ùêoÆX³Ú =!aÀx-Pc[‹2ˆ‚â¡ä“*o4£¸sÃðk€Pøų»sˆO…E +š€Gñ ˜ÕÏïÀZÜì×vé¨[WBÊ”9Wf#”§äí/ª¤¿ctš·öàYÍ4!‹ý�ç³osÜ’Ð0@ Ûêdx:´ºà~˜m8Ú�° ÉßÇHó ;Ýì‰êamD£ä¸>to¤¼TY›®Âý?[; © +´J@7Õwc¸X½¸À¢2–¬òÓýU w×FÃi¼ + +E@|S…EÙO¡”Gÿã¯;Vèí§Í I„»!¬ìC5€ŒªX©mŠá„Ú¥¼ròz=U^Kã#ã§¼oH¥‰'>I]*¥øÃðŸÀ.C~ˆí–ô¬1ý ýb6ÝO”U¨šÜ,o_1rsñ¹ãý  ØVù‰Æ©x «s½Y  v�¨¸Ò‚06�`“Ú€ôjå=:Ð ¡°3é.^ìñ®ùÚgd®à \k‘ŒagR[äå¶â™…’l÷“<ø¦GªŽž¹xY}˜¬M§{.ìƒ5” I•0„S§¥Aˆü M-m@;¼pöÒ(U„]b³Ò4Þ +m™¯O•@¥ÇL•¿˜3* ß㸒‘®¡þ‰þ�Dãb²*·IN¦þìü H2±-YcU +Id¯ÝÛ8‡_˜D`¾ ä߃3Pâ +㘌‰’©íŸÏuŽï´IÛÔ€ŽeÅw�?WêÜáHoÁBÞEÑz~ëÌE”¥Š7C2i¬²‰ciÖó›´X.Ç î e'±ÆZC´¶Í UÝ€M#Ö“¨<¼Ab½äZÜ*dÖØ¦ËöÍ´-%,wţ¿¶!—4¸`èŽ8¨ŠÉ„8½ÎСƒ�xÏ–b›Q+*±eøûÃä0ºO+Í6±b@Ø.¬£x„ÄÊ&^D;¹½’'*j¶5ÚB�rÚAc0^¼ ê„À +RfYjÛº—MÎ^ô›"ò@xéFbó0•‰Ñ…GuŒþ¦fqdÌcªhIð!–FÊKЙ9�”óâVÕ¶qwÞ¥Þ^ƒùÓ¨¤¼â° Êgo"[8GšÈ +àÔCiô_«¯¶Š{~j|†œ(‹+�Wª'î˜�A^°&^à o;Á½‘ûÀ7‰Áä#d�ltr©¬*„Ýn � o¨ŒÅ2Á•lØÒ@eÂ�&T Þ, Ä-³žíÍ"%U¶ÄÔ™ñ>�am7Æ>_nš¸F›ïÁìC¬þ¨AÐ-ËÎ’ª±G+èM‘-Úx=ÇÔ¤áA)È‘ÀJÃq¢sbÕóÅ(®˜âË¡ªZã±Ð&ò—dÜ“Ø(?àe-ÑÞz9õʼ]<•Œ=Í´ÿÿ[Ð�•AÖÐzëgùó]w]¿#~û|—„e‡z§àJ•™£ÈFœ[äßg41‚£Œn«ßy‹5ô޾ +‚ÌÒ×¼¤Z×l¢–E%00õ_ÏÂxù…·6D�Zý·mX£ŸÄ}ƒÿ) ¥Ͷ„òØô'¥3£ µ‡ …vš£0÷xÞˆxUÎ=—ÐëÌ@†”Và/'3e¯Ï¢C3ÝúÕ8�#ßßãêÄUÛÊ~*Å瀤ýÆO•P¤6›Íìn\�”€�6¬9æý&oýÂwœ?OÝ\͉CÝÌ@󶍿h{æd7 ­j˜\_/„ã>ÇUššÔbô†,ÙåݧµÜwùŠP<ä`fjŠ{Üñ3�%qÊáIŽywÇ;4×ô)äÇ¥8·¢×¦V»ÒwñÎPÓDŸ‘ó›O�ûÐÿ®€ “(¨à{¤Gë¸üiÔYž‹xPÑ63Y4�hùu™Gø|ùþ°ˆk¼M&W}rÅfÉG\Ž™h^Ö˜…ð°O´ØÁ/d2v/iÄ7lN™7>àåÇ^@Û+tZf×o›cÔ¨©zRi¿Ònè ×4± X ÂâVµ¹O�í­?¬ éÖ:»¼?_d` +$­NæÌßFmX-…Ùl’;¬"L5sñ~�³^�P.{ÌŠæ”G²8 ÷Nß9¦Þ´Ûû”Ûòס|yïez½&ÜÜ.+ž–·’GBŽ¥•ì %ÆþΟ²¦Ë[½8e²‘†hå˜ûU ÙKʪýàXè[Ô138~ØIÇdWÞAjJÚMŒKÝš,“¾_jšÊ³ýb\}®[� ÷ó•+=þ�÷f{üü'60 &>0¶Ñ•×bÿV2?­8Å'Dµm½ö¹x·Ü+eXgþg_ í®NRøÌÚÏ#DÓ^®élvPŠx0ilÚË)À3ÃÚ„M¦7{߆}1”µZ,å_f¡gÌVˆŒ%�GUO ³½B‡‡ë¯¦ ¢¨ †Ë$­H˜Y¾w7ÄDôó\YÔZû¸^°¢•ëÍÊ…‘ÝZ+þáKXš…P<\^#­!¿ø©ôÑn Î_y,b|„ð«bà´§™¦fBÏÖz¬KÑÞ:8Ví}`ˆÌ뢢Dh·ƒ| +ßòa†»F+ï'¤¥Ü0å›C�Ô!k|½Úë»ù¼UÖ†y—¾J[;Î}nªoȚÊÒ—ýØEpÌΪp?o%k]•éËUb �‡DKïƒuKãT.š¯cSö¼a#ñMUéD”³{'›&+3½ 6KI­0)j¼©ŸëLM£‘“¢˜uO@úõòâ6_-ÏÈà ât>»›‘ã'™�n´ùa"ÿ�øðº¦A¾Äéqœˆ†X¶/`ö:ýº\\S¯Ÿ‚*“—i9_°—¯ã~a0«0z,Em›µZB[:ÊσŸ×¿_ªv�ï +°³á®(o drÀ4ÉË2Ø)‘P[¾õ2c›•IiXŽÖ·Õ¢¹ÝÎ&VœÌŒÒú¬s;*=CŽ´F#¹²r¤;:“ñ7°1©ó±*—xßøð“pqîKKÝ5$¸÷ 5ÚÈëÆ~ ÃÓVŠ¡²Õ¯:§ÍP¯¼ƒ+G(OÃȽ~@Æ_0fP~EôžQ‰*ñÝ!iù|‰L+jEj®ICõ½j]AVü›&˜è š:÷o:c›Ï>7ì`¦.†ØUEBÉóâᘿŎ÷=‰wgXg¸”�azž×,:mR†Ög {Ãt‚H,öLÁ–ôñ.‘ÖC˜c…„ÊüYÔËIüMîØ×úGŠê_ _¸!RP�™müÍà(×á5Î¥&YAL�ÁO»jÐ×ùõ ™¬Ã~×<¢ãÍënl³·uâã®ß:¤^°Á Ãûö&.ÎM¹#V¸<üä‘@BiÛTzÝõ@-áÂŽ×Ù«ä�)7¬/j;Nq>EOZ*|� â±ÃPpáD+Ääì‚M¡÷øÃwÀ´„Ëôô@��Z£ºü&Öbìʰw݀ܰ¢G ×i7$3S¦Xx]¨ÓuØZŸ¡×ÉÞXH¾Â¶�Ø,Þ…lû8Ýщ¢«7[áx‹PKj¨ç¥Gä#9›PŽZ¹ƒ‚H=eZ‚(Ñãö`DÊ5\bR{XØú‹%œ‰Ž6L@B«‡OhEA†å¢Õ-U¢ºÒLç:ú,ê.àõäe{PKø|Ϫ×.ŽR†…* ‹ŽÕM9ÜX[™– †¢Ü ½¯¯æáŒÚ*£Ü´Œ!±�Ì�BÈê×·&ª•´�`äãâW<~‡u LlH_èNeV¤“šŸaDÚr-Œ'OŸµKjêê�¾ÂPwãíʆž¡½Ø)©6xÊwšk“ÌïS\·t“ê±³¸Õ¹È ¶š£7´]•:‹Õ­!XáS®„‚ ï¡’�h=Öß‘ +´†Ó¹)Œäâ‘ðóQpU³ä±±rÈã˧µÂoI; ô0ºC€ øIs¨"]ð¾½xTë4ILŒ�ee%§(=v…b—åÁ�N‰-¦zd�j°aÍÒ˜1Û†äÆ0É]II¶wí&þŠ +û‚ÀÜ|µA¨àÀÚ!dò`¼ªKÖkÃ-œp{Œ(oÃ//òäÔÍ_£XàpMù`#¢ä1›/ø6ÆŽAB‹&m3©ôJ‹¤Þg¤„tñãoäÕ›Tšy�5Vx‘þ>ÆdƉÈdÃ뺔3ÍÄ-+0ÈÇH}}“ «¸s Tá/ÎÄ”8M€[¡lá 2Êw)YxW8v£ãÍ^è.ZðB~ÔKñe 5zêÿ¢†Ã+i6*>�Ókôáiß©NYŸéKZZ¥!�ßm–Ï+ÄbŽ5ԃĎârôÝ^ûFVE–æw½7AÝÉ:ãP ‚† ‰üXTo›&r¦ç �ñ.¹#÷u‰�T€P2Ñv�©yu°vP¿L +Éñ¦/"H'¦ªuhl¾àïE4@™Ûå“©}ئǡ8SfÒ9°±l"ïÇ/¯ó_9¬ ÅsëÆ.50ïÄȼ’êå-üß³Ü;òƒß/®V"°ØZ½ÛRC\²K�».ÔÞ#m%4¨Å¤ôqÞ�TÄ >£vo¯§¿ ˆwi€�¢‘ã7¤ú¬&u¸ݙG쥼y¨[). Ô=NNYRŸ4Š#±éîKCÇeÏ"7ŸejV×õO@‰#_žš&£¯oc²YHÍy¤Zª–�P©å#Œ¡"p7¿K‹:1B½ˆ"î¯M÷VÆrÉR¢üÆüì�S ï™ññ€…¬ˆ+®LŽy?6QVú{ùw›ÖÆá€*$¢Çý:Y�ºdK׺’N²DlÎyD§ÿ L.ξ“ö Ú‹.VïÍI2ƒöœeÌdiu4=Áœ.éï¸íMÀ;À›Ij…¡ÿ�Nÿ¸'ï‘V¥ÿùzšé�À3«›¬1î–¤Wˆ¾,oß§Šè¦CʃTàÕ:,�ÿ!,(Â@Yó.ª�S5²W|³—ðž2,�•Œ;Ãg˜ƒþ-8¼ÂÝ|?Ÿ¥ÿòu÷G½—âÒI ›:}ظ…>Q$pX� fTzãÇòñ˜êò�ô¶ðP‰‘OŸ«š/×TŸQnüxÙ)–°ù… êãÀ‡ÚGäPRl­`E2‚¸óºrè”TÚ0kÐÈÞ(ÕÈ'#ïk†BT{}ŸÒ”Á5¹Ÿ8÷  +á‚|y_'Í¥H¨%( º³s& IôYæ! 8ž„Ìè›uÛ­:UÓI yŸÑ¡š�· ×7í)‹!›5D4Û-´}ß; JÛ¹S‚¢OÍMkÆS–+6H"ÔÂÕé=ÈÓÙ zZ!T}¦l´ž­Ä£L�>�­\ñ[ÿ�f­Ý_ÌX4·üÆt‰(}ñRW÷²èÖAÀJJÔÛÆBšÞ3yS&bÐ(Ô)ºàMc‹:©©cU‘C¸1ÀQ½ç6[mNH7�ÖXw.½Ë–ÔD©õ­rÎ9ž-â“HTp4·Í1tu¿8çÀƒ"(±œéù$ÆôÊê@F—CEžyDCZÚ*pîq¥4ÁÚ¤�²P¯Pªã�iˆð™£—Ý„kí³rBZ”N#’E&¶ç^®«z½Œ&dFþ ­kÕe=ÂTôñ±€�¼*K¢2`ÄÛ2b}†&’zŠ®¨| ¬p“‚¦­ö¯Ã‘p{u×EUj6ÚÄ=%ÏÇrÚí*ÒÿË_Ýv),EÀï�—áÏßæ6¿Î#g§xΣÙÀ á¬¹æŸPá3O«<Ía‹ôieã#Îü¥ã 2È"g膨‘ÊÖRŽŠ¹úç_8²"ö¥Ê?á�—¢ðåÅH‡8É0Ü1 +—Pƒ†Âæv2; ÕºÀµ¯w-ìÉuJ¡‚·4|–ËéÎߪ]5 åÞvIþhžkœK•fÄL*À3~öÑÓ¨4"ÁCúuÐμ$¹«¨Y£¼E‘×Ù[$7Ù�ööèSÑé +ˆyÁpÌR€Òm6,\úÛ +N ƒë YG]ÛÛôA¸ƒ�µÌŒª2˜�ãm͸5—5‹‰*SÓÿ�ÂdÏ`Šþ4ûÍ~û´ T-² +4ñ´Šî™ô ÌJÎsQ=Ä·~¥ã*KÃÆU…ô@rS“qØ£ñé˜b �1ˆ*„K˜O2Ó]žëúPØ&»2'%S6NLCyƒWõÑüJò6ḧƕH—H=ø*õ*p $Ú³–énCJ‘ë0ÒÙBhsúB'ÿ Î³‡€7WÆ(o©7`°nOi^úš`i‰ +Á†y^Á³~�ªè 4ì.|Ý$¢K:í*Šƒ…뉻üÆÑÇn¤o#á3^È‚‡JÂë!TC¬Ömzõ'"}\`ã�È=xx>%G°šÍ/´å{=èü:”fŽê¥¤í˜Ei‰îó t&þ3XÄícI¯ý >A< šÄºÒ"À^ÛE³ÖícLdÚ½ÌG7“á?`L´˜~øä«Å*)éN/žÅykp(Ï#C ¸Wu-ñF‹F)»9QÄ@òóZÝcpS“Yÿ^ÅSÕxƒJë[?ZS½N€Ojµu†0øK@,âYA€â1V�Y7…&ÆÎ›Šž·Á SéÂvζs®xÄ&„`7dãð$"ËøXš›ÄQoµ믂XÛ“Õ( ŽZ;–½¿GN»}ž¹pØN{/™|� ¹á må­Jæ‘íºBP'C×m™˜©Ž—×…‡S bä,“ójE\¤Ál[åK¯R'";»/?eáaäˆ`‡ &óå¨ð€EÑçA¾ü½\ÉhˆúS¡‘ì¿/Té®AÀu÷^¸»d".#šlé¾X¥ÿ …›´Çßzr#Ôx£Q‡apët‚ÚÔžµ¼ŽéoŸFfÑœKr«j๠ó¯A,V<Øt§èTÕxãΜ´6ÆÅê½CsÉ“GdûS¥sUk>õŠÐ–Œß%éð@R†ÔÚÚ*×3.aþä4€MEº³‰¾%é·¬™—¨Õ’…“£.c¶E ‰õrçÅOÈt„v@€1Ü�‡Oê—¢aÐ…S]çàˆÝƱPš öpP~dº"—:™Ã.h®‡Ä—•Þ µuT£©}ØãeœQ‰c–Àå"m áÃÂ'™!�ZpLëY�\j4äVÀ‘æâšcô¯_À¯Ë¸Ec}Ïôâ±Eý~ºÙ’uÅ– ÌäÕ +ã˜&}X†�.#È6x�cÊÞ)gÁ?H6Ÿ*/Ô°°�0•cÏ[çe�z«WªÝ®H€”,øY µµÜÒ�DN Ô�Ä +Üâž2`HHy= +�„~©Amå0£âŠ|é{ÄÆ¤ËóâFÊåŒë[].¶¢ˆlùq :B6‚HA]ÎA+ÞÓnä,±oÚmÙù©\Å^C’êR×�Á\.4¢×MTD„ ¤›–n¨ç¼‹ƒr9ؽlýrY-©wÚGH Óãg‘Q˜ +Š ¹ô =÷ d¨¢ x›E Ç‚š�ÂæÎI¢*$ß°(Â3 üêÎèL¬\] $.KeÎéDª©îüX¼å|K¹ŒwæÖŠÓ¦�6>æ%R%’¹�‚²Q\5|˜¬=Ps(é�ÈC +ÎÈÇè÷²ž=È/$˜ ô/ç³±�ó&Q8ßÏõ{ˆ69àQ¨úæbFAý{ž\¬‘¿= ð¸—c´¾ÒéÝÓ*x»ò†ö‰ŽDR½¾ )áZä‡0òñd…w:ø)FiìƒTÒ€ÃQt¨Eû³sÏúa¯®%‘˜¡Û¹£øè/*ùB¿áýùb¼pµT˜³¶Kýå¹W%Œî?ʤ1ží¥BHÙσƘ}€!_¿�J0Ý[gÎ[;–½qW·BMÆy”«æí‰ÃJTÕ �˜äúN¼"áël,WŒÁI@Óhzì�øÃZ=%×ärf19®Ÿ’ô!b^¨ÄÜRíEµEôùþ¦¤¶fI·u�Œê:ô0D…[#‹xˆ "‰B[ع"l¸A í:ÖQéê½ú?ù˜¤ÆÔ™7¤ª c/N—}As©Û)ß@§c †Nû „°K¬zÑXÿ›;+¤˜»Î?ËxFù€Ém²þŠmhûg{’�MKU«pØ”Óî ¿zµí3(5p™þÁyêü#¯£�®Ð?Ðb�£—0û?í\”ÑD§ºóNòšXZõq¨+A0¿�ôÑp ¸81᪞ñ{¼õóà¾:t†¥ë!)¦ë‰=h6ia ä€V¤ý6N QÈò=tmþ~4áñáéš¼eH3|ªULò7KÉÛAWy Ùæµ@\UÖ¶˜U�“u ½üXëÂ5`ð¦p�S�y¸ð¤È²N¸üéÈ,n°¬ÿȾP°_3á§ÖÇv\Ôú¯«§¥¤Õ5ÏÈ“b–�®?‡¸:\¢Ú]W�È�-®x“»“~i¬«ŸÆßà‚AW˜\Ìúþ—|¸5h>•ͪý¤kPð7ÐÅççàêCÔì-Á*ä#a…ÌU+ ¹Gäç +Èô)¾B`*Õ`z¤va!ù9âˆË‚(=¢ýY8%�@ RKñU ¶@ÞŽ ”[8‚G4áB@Æ\�¬­.'ïB†�eà z‡üBTÝ +wD2a@†LJƒt ÜŽTöbˆÂ1,� Ct¯d�V�2ˆ-ƒpGf0¥#¶<çH¶3$JG?CØçÐ ¹Ž8HÚd™JGz¿Ýç¿jà…sd-¦ªìÚ4èGcC6p„v6ÄlR¬�m�G¼áü!uCŽÏDçú R݈�‚ÖÚpH±QÌÇAy Ò~#<æ©IÕ9¤ÌޤM®ØŽØH‚è�³FŽ2ܪê�C�€¼¡£‘ÎÙ¡õ9u;XÍH‚(ûî@�Ë`â!ˆ-׌<ôCó�Éy�ÒÈPÖÃ˶=D F¾‡œñ0êøP¤_„2©iÄl©E"ä"�ö!Çš·EdÏ–´MÒ šó?@À"·éV$)»Š8!ÙRz"Ä)"‹ îIæD¸–!•dŒÓ_"ÊAÃz"³³'�ÐDÐXˆ\ÿ? ¡QΪ!˜ŠÈ2’"‘ö˜;À#ìA3"†‡åcùb·+-È‘š9Œ!¢%TD­‡ÜtÒ3"å."æ#²ùËfÄS=„°F¤È/¿ºGbvÃbtXÀClõá:äy áQ†DÌ9„tE"WüHÞ�JB‘ ‰‰I$©!G�D +â%®—!(¦DÐ1„T•h‘õÜ+À5È©ó…ÀŽy1?âðƒ¨…táÂBXõ—ˆ…b8LÜ÷‚3LdjBÌ1‘iOH·e"ž yþL¸´ ¶DM¼‹„àbQ#䜛0î4œˆ"BHæD!$Z�HOy'þAtÏHìAXÃ'âí AÏOÔÈAî +‰¤+ƒ"; rï +E4eW<ç¬oQ¢° �A]]=ȸQ€`AÀ)¢§ ñm’"¹ÁJqJ‘ZááR„‚ "ZÈ3™â ‚ÙI9àì` 6å®@€þ)ò1ùÁ¢"É+RŠ@ k*P< xT˜IÖbN¤o­âÂÑ0@_EèûX€DЊ þ�ëÙ +kþ#R\‘©ÌuEÂ>³¼í‹^a‹ü÷+î³?Ä|°ˆ WÄ‹æøã¿Œ…s6¿h?Fª¸~?r+‹¨ö£�f‘²~œzrô#`´È4?¶žÉÈkñ>üà…-òø/µÅV÷áÎ-D¶�ho‘Ž} %\¤Zzãâõ�X.Ò£>Ÿ‹Ðç£yºˆm>ž­ §å#]ZɇÃvq|ð¿‹ÌćòâSø€F/¨½P•_ˆû¸÷(Ò/w€þE¸ÜÃyÆf¯s`¼¨=�.Ù²ÇÛc)ŒN®‡.Æa•ò<<Œ|êñOÄpžýMŒL¥ÇdÅH=^ŒkЃýŒÕó€àœG@# y| d_¥"#då±M2’&[NÆÑjÊHîWF”È#.£ßñxfXd<2jЇ@Æ><<ÌŒ T5#¨ÁÆ7ãbàÁbΈèïÀ¿3Âé;Êà3šëgªxG®B#$»cÄD#ºC†£q=îÀ±¤‘âo¥K#³í¨£ÖÚ‘5b¡‰I�–Ùq Õp‘ùV#FìX<Öˆ'v¨l�;°ƒ�®‘èuÐö5"r‘a#¦u|lm`6b`Ðh#tÕ±6BSÇÃj¢Ž’o#p§c–ãFV™W¡—J1·ŠH‡Š7bZB Ù¸xˆè�`:úÖ¡†¾gÏ‘ø7ox;‡YΑáHls`ÍpdÒYÄ‘:Íñ`Åa§2G+¢ˆs¬Š;B¸¢:r^9ÚåÉ‘6åpå+‚uï•Srìã6.3ýΖ9`8GÊ㸒çá8JAGæÇ΢#äÅ!¥ã£OÓÙŒJîf�&šïEô¥‚Çc«ãi€±¶exúuÈ)Ê ²ÀÉ&îËKÄÑOtdP‰;B ¡Za@hËa í 0¨Ôá䎑v|™1]Ø.µÏ‚’„ŽíÛƒƒù?¦Ãtv¾o19laAÆGסÀ¢Õq +àHM¬òØ Ôü µÖ�vß ÄêÈ™Ñåï÷ƹåôÆjÔáRÞP�€7âÊEêÛ W}ë†Ë¨#ÝÀÃêH{ekâÿ•Æêp27¬Š@n@�†°”ÞñQG·ž‘Û`Ò6¤ ƒmH®6„<§ ‘‚·R âÙ¬:RtÓ:††Ã^¯_cmBc£L@Áwþ°Ç6ØSS”4N˾ÊܺFOÑÇ5ŠœYP[t0ZƒhìÈr_#kÀ;¢_�(´#¶Õ¸h[50<;ÂG5b€±º¦†@hƒx¶#ß=£¶íHMàÈ3ªq;Âí cÓ„X-Õrb/9CgVàŒšú6£âväqÍÀéíˆ+ͨ¿-gÆÝ¡k2#y?Y§3DàŽL‚àœ¼ŒsK¸Œëõ,ãqì•qpk„¯Êð¾0ÎgÊØÃΡ �NƾÜ!c2¤t%£AÞ‘û‘�Ï;²* ÷ꎋ +2xl~Œ>γ¯‡@ƒÁ£=‚+FÜãÁ ÷30˜ÁG ×D� ›5>àÿ‹Úò‘Ø_ÀŸ�”íJÔÇsü‚ûµ/°¹�ŒðC/}a/?Žä .VžéǾ(q?²Û‹©üp½ppü¥ÀÉy•I^X@‰„$ xáM@®» ªD·‹’’)»ÀJ ×E H›º8ŸáYnPÐ…öùâ\0}©x¹(&AB&)È·ã‚„Q\R.ÚjA2Œ1HÔ·è±Ašx‹ÿ:ˆƒnñƒ¤o‹áCHrm¡ ¹:[@2!y‰¾- +9y-ä«ĬEyªZà¼�D¨…­rÀ´ 7C²G Ü4´(óàgQø†$v·†ßíf±Š‡€ù±ÁP4ˇà¹,�"µ×\OQð…K²8¤ˆ8@U�HæÆârI¸XÁD. 2Óa‘'’õ°`‚"ÙaK‘Ô`q’*âXD]‘ÔýŠ£Y$ÅW¹[äS˜B·ˆ+½B½‹|Á+è#áudb$x®($#­qÅÿ͈뭈�FÚŠ¡5ÒÆ6bV+Ü ¡BôÌ +ÇßHY?�Xq_ú«øZ¶«XCŽ˜s«Ùy_× 9"©¬âSì%\rÄ2U!y”*ˆÙ‘¨‚�Do*ªŽ]*}&áõH££âj”¢X¨`Ô#)*‚Ö#9ùp<ÅK«YÁS4ÎÔÙ#Ÿ±ûõˆLa�ȸ ”°Ò²O)dv$À“‚;’-)t c¤X )æ…G®ÓêêQ”ÔÇQŠÊá�þ(Ô°#݊‰‰‚�ND\xv(¾fЧM +ÅçuÄÅ0‚@°#ǦPP¬Hü:"¾ 8ö(@ (ÀΑ¤ã›‚ýe~‚Ôi}‚ĉŸˆ]s$oOjHOPÄ‘¼òDLs$žÀ[G"Ü uÖëÄ`ºa'Þ…G¡N�%7>vdó9‘T²å„XŒ‚‹epB +×›p‡GbÜhõHmBÏGŽ_Èø#9£Hä11 yÊÄx!�†&R@$!:—ŠD‹™ÍHB”‰�d@&‰}1áI¾ÿ�$±a¢|%ÉL í}‰™øôgYy ¢Š$Ÿ.Ù“„Ç-�„Çh€FI,q`)ÁHÌÒO L�T‰^*±�•Dût%§„HÂ0Sm³E +ÁZr%4~Kà_Gúé’,N‚B^’@“0b_ò&&Q, T&A˜HT\�R1qDõ<&¹]í„­#Q¡L‚‰SÌÄ¢HÕ™¤ûÐ$X!¡Ì4¹l5§aBƒY5A$Dl?‚$¯IL>‚6›é‘·I�8$ÞD{af(89�#؈‹aq„�ÊÉݦ¹¸gÏs"ÌF¸5�|ªDшöu’gFÀ�Ä #jð$<Œ8Už˜_D�éIº.bkO‚lÊñÉ—,‚’}jE@ÖO‚¨ˆâ?ID�Ê`ÜCPˆk˜5-˜`‰h�OÒ#¾Êé‚JÎPDão‡"�Cìæg½öçm–óRN‡`zQ2àuÎ( 6Ä9ò:Cøó(ÙŸ1Ht(.w!#%�…8VRäSˆNOJæ 1-¥$”€õ"ªãÂÅVˆG‰ò ÚdJfÀ â Lñº ôdÊ‘ +‚ o "”¦„„ €É”,¢BšRâTä}Ò”·A~�‘LÁz@HÀÀ0ö—/@„B¦T¸ç@rL_Œ $* ÜÁ-æ?HЦdØ¥)Ú›.‹mÊ/‘GQb€ÄMAñrŠ‚µ1X�Svt�ž�O–EÿŒhãÃ{�ðá|iïáj%÷ð‰¦˜Òü‘)/`˜/%jõ@×Rò¦‡†¾”îD'ò÷¥h½Ô;]˜2ÕÉub#� ŒŠ‡ +ÃC�4ðÐï—’Òw _ãh[J>ºCg‡àUçµCãCÎÏh¥œ;¸¼¤?YJ¿T¢óÓ�àËÒ�æ»Ñ²R Ú£”lÏá¾™œ;ÍŒs`%¥d¾>W|'ªQJ¨"‡FJ ú "Ìy:¾Ùíl“‚©â%II°)7m~›ÝŠ I)Ö×Jùq×°yqK9†§—ILÁEz±ä.a2¥1 HS¸ÎÆØÓq(7E½•S;EÚWO¿ýaP÷¶°v®– …Ø•dcÃ}xEFØP¦z%³×0;_‰’kÐñWNÒ@(°dÀà–ðUCvaIÀ±Ì1 tŠ%ài€ÈXÒ™† K�Òp'²iÈ2)¤AoeI.Nþ²x"íР£4°£Y }iœ”gô,™t†ìAKgxd´XÖ }¥%çÌ0åi *fPzj9çeÀ‚µ$fX®%„k~°ee�lÁ[{`2à#[€<2 -èˆ hlKô�¡DÊ/ú‘eÇ�$ß1\u˳�.oI’1�bß’ Ù‚  b0Öp�/1ô—œ„¨�KHƒ�Èå À®rI¢0ð°Êcc +ÃQÌÅ„Áι¼;Ð%¹`ˆ6é’Àd©K³€�eë’æ¸’]ô˜—¶‹òya#^R_€£Ö…_€)tÉxøõ /D€|2/"ð)Ñ‹ðÞ…ÅÕˇ‘ IM»�›ö’\]py/§è0Lf.<ÎxÈ…)ùpáêÙk¿Wâ—{Ý!\¶…Öú%al�ý%j-Ô}£²ý—i᪌ø³P"o³0´¦^__oƒE²P/ &z‚¤Ö`ª—X ã^db ,aAô#L:Àå »W�ñÍuW€Â¿ý\‰` ·n“ÅæÃ(¥ôBÌ“¬@sÄÄ_þ\bÂï« ¡Z´W1Z�h+N´$§Ù‹ M*äÆ˜¢¨ðö#*”ؘ žÂn8&®S%…:l¦Ðæ1±.Dü˜Xï´µöh Ã^RÐ2��B‚"Spþqd¤…œl¢ ,É„;°.™…‚t“¹˜€2‘êO&‹~B””Iñ ×REOè¿•‰'¬Aë„ Yƪx[FhNðí2ðâ„ÈÄ›àûËD‚ã$©©&`f¡ wFfìÃmÍ ÷/áŽf€… mX3Í—pX›qæ²o&®ZŠœ °ÃDNœ¯Z¸™²)AÎxX”PdÏ„< \}&™IPàŸù@Ý@cI� ¸¾Hà¾u(íL~ABÄŠ&Â�€G£ Î#˜©Gs•p‰‘Æ Gú¤©Ø7,�ðŒ�„iÒb„?5MP:¤? !$Œ2}ŸÓLªŢ©§†«ñ%ÂD¡æ8"5YþK�Tˆ@T¹Ìp(,՘ªÑÒYM _!,ÚÕø±æ[„€Ý¬É|[kÒ„Üó1² $èšG�o¼&Ì@`õ51„d` Ü‚aãnQÞÕ`@QYÞûØüèò2òúÁ f#Ä¢9›ÔìƒãÐ&(ô�Ò´¹w|#òûký=€¢m‚í� nói=Àêm’‘0„›@̓ÆqDœ¹ÜøÃƒx´"õ;xS78ÝAÃØMGíà »±a™áM„u0˼I>«7—— è{“ô „¾ S…Âo¾LÄßxV®ÎÁ=EfÕ¸�q4`#@Ò0è„BNà ‚½7ËÜ ´ï7 r€“Þ6ÐQ¥ ÖS&ŒôÀS¤­ÁQ œs�ˆ9É%pÚ¤¨“9 Þ¶' NEƒ·Ç +4�à¼ñ pNðf€á$f}³p2/ƒw ÇPÄõá„[Þ $gÅ™‚ ZœÇàVŒz1pÖ8·‰’Žî0ÀÒÇÉ%9ÒÄ#G»Ãäd-  ‡rÂAÂÊI¬rpœ–#ÒôrôÆœÁ@xæ`1lŽZáùUç$Sè9*»~Ž1``Ä ƒ'?úCƒÑÑëB:ÒýJ'¤_OÓ‰dÀ mOƨ£lê¤VGQëØ¿´îX®Zô½N CbKØ, üÆÀ`P´ì$>;²€�‹ÚA/b;!¬nG` q¸sy(5•;5 +F¦; +y��»óÂ/àå�ä~µâÞ1Ê È÷�¬vð¢ b$xz䂇 �ù-8<Û‚·OÔZ uñÒ€7ž\ÿgŠ?žŒdA4’'¼°åq ¬µ<È_Ai̲+€m7lCAç1È +tŸ~úódè!¼‘3ÕôæÑGOè‘ Ã¥ çÊ =j[1$ÂÝ·)è=ú(Ø¡DÒ T ¾�i±]1nT°:—¯l÷Š >r% *Ø¡¼†b^/ÌØÓ±Y TܨgŸˆ*¨2Q�L«,¸ßÜŒ pI«hk¹¬Õ¡h·(%rJ +ìL�÷¥À¯OÙÞ \?¶Ð¤àžN¸Â/¼x7ɤ€NëÄâ¦hó`R lÅýøÊ{ØL +à kFšM +ìco?Ge·š5)èŸ`ƒ{Ê„‹·5)`HØÔ&@‡œ’`BU–«3)°9Z–lÁ&á[R°ª¬.‡ik¼¤@0�§¤‘8ÿ×½2TIAåôaL—/)€Œò`S÷ë9{”�#*� ´Ííž=�Ž� JB9’¡SM�þ� r¢ * +ûâ”$?L¸îžÄ%üD�Â[…& +’ùoZk+^¤PPÌ!E' +°vH�£€®Öâ¯cë°G©�õsfÖ©œ|bI¾t¢@Ø J?#ÀgÄOœtƒZ¶¿ÔP+Ä +ûå˜`!äVñ…uSòøEAÃøç;='Ku{E¦=?7‡Y²å�@Ô äì;Ï8�uhŽù÷VDœq‚%¨Ë­dцmÄ�'»ãúH¯Ÿ�€˜ÙU v‚1´k|¾';A8Áö@’cê˜"µãÊNËñÇ÷˜¬{' MB\©·<´6ÁãÕKáøÐMS\üÂPÊ“c‚—0¨àäž=�–�àK0¿²ÂQò@*PKÀÔY˜‡ü¨È‘ÎyÙ*cÿ¢Ö…% Ÿø¬‹Â"0�–cå9:ÃO ¡i¸�ú,+IVOD&M‚gBÿ•§ÊŸÃ9%ÀPãlrxH€öý“‘‚8$hg†Ä$ð•¢�`XlDÌË0Ñ%è%s�w°;ÞÞÜi�Žù,aT*hj�€Kì &†¬d�ȶ ¿E@nY<ô”²e¤@ÞÀe|»Ÿ<’¨SŠ$K/ç\@„òa(ç·�‡©~ƒëZX¯¥Ò>–¸46ø 2ÍU%g4•ºO7è�6˜ ir� `Ž +$Ú•zÙ**0-ŽyÔ_ z@ì•3<�)¨Is ]�ßø�»9àw%€è}G"lùõ=�Í$B®døMÜz€jÓù…5pç¡Ã�ƒÈî'¤¡Vn�Œ© þOà1t±ÑM¹Ìf ´ NûLeÃ<>CLî…dÌ|·k6‰==p´ü �Y)JB“´Á¶õ ¬ª÷ÊÍ�ˆâ'Ý­ HàãØYm€v74s�_M6ð`T®æKŒðI:k`ßêÇþTq +khæ4z’ý,ž©u(«hE;)#üS4àÔÔ<€-ž½+\‚:ž“ÄÃ|¿06Þ83p •ƒ‰GT•�¶äâš�ÊA&,‹ÉïêHg2�–2`B[ô–€cÜÙü.Ê2H d‘]•~•<Þ{¶Š‰$°ñª·'GÀÊ‹_7G)}ÐÉeòR÷"À_;ø™<è TTÁºò)ßÒ˜º +�eARú¹§üÈ  (™IÍ—)ã% +Á‰h£l]^“¨ùŠ¥Š�E*x"|À[�Ý(ÇVkÝ øFð�‹íÑ<@ÅÞFý�^…¸¨¦ôý1;³s€¨QìqÊë!X…R¡åÉìþÙ„7@Âc}¬!(5j¬Ig�æ¶€r†‡dP Ⱥ¸f"𪓷˜|¬[®ð‘��f)©ÿÜDZòÉi öùHoúÊ=TV„, Èè�fÜù�,`Õ¬€¤Ñ¾Yxµáaú4?ã$dL¬ßÉ +p­´KÎVmC¨q¡�¨ð£!}�­?¡o.>#½Ÿ)$}Ö¤ÕÙ_4i±ÜèoS8Ö-ÛgçüCÊØÐ VÓ„cÙ z’FM(È0"€1@UÚš€!€¡`Œ‰ëˆ!×)¸ÿÜxq„Æh×0ÁR©ð);€È5׎ + °ãPÈ*�’[ Íøµ°CÍ{“!€ºpˆ“í/2€Ïƒ€´¼Ð¾¨B‰¬Áª¥Q `ê¾»$'7«X(�ÌaL*¢I“¨Ù*�ç4ÙxµÓ)FªfXÖ³ÏÆî “«@aÆ® +õ†ÿR˜`g@2.Äð©€ÐÃØç:¿ÄZ¬y`¿0ºj2™/¾ÐâoÑK3ë¸ûÓ¬Þ2€©UC¥ñ‘D»r|UJ{ç)€N¥¼KUà„uu,¢Æ!™ŒJ!Üà°î!_!@¼±pz®HˆÙ_Ìâa`áÀ°Z5à”Þ,%<jt–àQºŒØl½˜Æ´Ï –é˜YÛ[52жY Ç +èÎú)u?\Æ%ŽøÿC3]]…†ãFÿ¯«DQì¶X $c¸Þÿ˜aÁ¥°NkSÕúUäzÚLÉ;fh4ÿó�›<ƒNç&ñ~¸,åé3wÿ˜UeÖ$û×=6º`«;²—äPö¯á¢z­H‰ýKó™ú¯ä¦@þY3 ÿ…uò’[ŽÑB›Ö²œèY=‡ûЉoe¬˜Q9SEä9áîÄ}œE©$å@{`ð—ôXAäUÄw’,q?ñßtIÑþ~ÓËn_Bmþ•²liŸ1 ŽãNíÚZ ù¾-¿²V©ý´½²´÷Ò|FÄY¸�Újr1�@í#‰�Å[…€Ú'ù$¥�e|�Pû �rÇ“‹DíÛ"jÿ¦‚àÊÑg#‚Úïª=i’ÇpÔ~Çž§(º~?‰üìw ‡¿ñKÑâ³?Ýï̘gAúÙ¯¼$ÓÓ}þ³ï™ߨ¾QÖìïÊþÌ‘"ÝaãŸFe?n”çEÓPÇØ_ôíuL +öµU'•­I1-Ø¿‚Ïâ\âœh‚}ôUW‰‚}/H³Ïqêð,ùkeÁz +öë¹Å¶P5 9°ß”çß8°ïä8æ +]“xýyFVl¨äZßúóì¯0gAâ›õ; ù)Œfýš´Á›ò9e�’YŸT+qz5ëó ¹±ÎM$7ÿ6PŒHÅ+d ^#SýÓM.S}ÃjN@­–”Uê +õTUU€ú¾X‚ú +GÊ+$”áôOÒÏ•\ôtéW_j1›� ZTvIJ¯<JúùzÆZ|Ãÿ^SUå:“ý>å÷ æ&ÛnißW¸»ô=Ëkò=s÷AÔT£RÚÞoáFŠĦFé½Bû÷Ñx>�•Cò~Gã:°UiHÀûö–9 ¬²l÷´ÊvXêÄ?û§l­ûˆÔ†ê@º¯ˆÝÜ¿*�í÷õQ5|)œ¸ïíÈá[ÜC¦;˜¡AKïö¢ûŒmp·}=;. ·äAÙ°«ë91ÛúåÚW £öS´…o©}þ*I7þ”Ú�ÑGµÄÇÕG´+%f¢ç–ôíŸ�QxIE"Ýì·CR;i¢Ê.{‹ê;)4K“ÏIÉþ¢3Û‰c?‹­÷~K‡ižØçfü2újC's¦°ÿÞô/#îSKöø¨B$”äRåëù“],xýãØ¥"BlLÏõÑŽÒ½(+-o½LÛ|c¤–ÕzAE*]'fý +O_ÿÔúÙ—‡õ"ª‘`‡õœòò} PW¯çñ·~ÏÑÕïæ^1Ò&ˆÕ{ž,\ !Šªç„FŽ þÔ£uHû©GÃk~$HB[ê�bŠû²¦ñt�zÙGÇR”›öˆÙÔ1:šOÏ™ÀåV¾(ƒÊœ~#xw6 MT�jzÞª¾<—0=C„pÛÄT˜žúÄ‘‚[ñ„b×}Û.¹svÒ�¬TBßÔJ$'Ïsî”ýa¥g77㈈­äH[+½ô5ñi¾ÜöVz)r£ø&}‡™'½" srªI_í.5¬ÐÅk!eìx , Š f½B6éyl`™OÈãZ£G?©”YjL¤?)ÛN^À +ýUöám!óéW«C¥N¤ïÛûkîRèP‘þJó†D¤w¡þϲa ¦k‡ª™H¿ûöž7cæÉ¶.Dz"^ï�ÊzH¯âk'ï\hãÒS’ÍÔ`’]‡mÑ\>s* Äm>£ä²¨ÛP@ŽÑ7�/{[£˜h…¢§¬ ÈLç8}è œW/E³‚d¡‚CêhÐo …Mow@‰@_é k>È‚ÛÏH.’D ƒ9:纱*Ezž;±�dʰÀó+E÷û 6=ÙyAöØ¡¬9°fùAØ\AƒB¯ãô8oàåözš÷à 2ßüPt­§ûû«ÍG�†ö¬y:g{ oÌj¾DEóúþ¦¿¼Éei.ÉÌc´�n&K óÝÇÐö€_ Âï0O6*-äÙ_|EèegN=ÒÖº|�C{õlÛòâ-Ÿ[‘Ó£Ø;Y^Ðeá oå7O‡¦óëâ„rT~VýÒœQš:¤<±¾§¿[”Ø;Æj„Êß„ãÅÊqp“Gæj¤ÏÁ4õÍ_ž²ºäalÆŽÖæ´$ÏHø‘ÿOà&Ž|޲Æe�[áD~œhi§�g$1Åí„qkòPýÐ!%ô¿¦#*[ظBçŽ�A˜.º\½B�åøðeôx¶øæn4]ª‰Ê—d?E­¦ñ‹Éh\tðXG� ƒàÄ$âÆÆ«ˆ§AÜ�ä)Kê�æQ_÷zÜWü¢˜OЉ€)~ +¬Ò‰¤Û^t”H@JüÜŸ³qŠ\ÄFŒ%¸ ë¹ý�FÝa:ødL@"vöÞZ–�Ð@qø ¡dh£bk‚†¯kÀø‡{©ê´üÂo6n¯ž‡¹;«>bÜqø¡,›ðèeó>¸o�i¤ËbeáÁOôf*.;"3øq1� ¹Iª‚W XÒu=�d\!øÅ°f¶�‹�ohµÖ{ú+¦<ÂC Vî}³øÞ.„¬¿' ÎÅþ;Q°V£°R”…ô÷ჲ’ÞKEå¡Ô3U‹ü~xÜŒšlÎ}W j ñ™ŒLßåê5q‡GA똥ÀwF6(Hž ó +º½sß, +ml]ïÅ•¬'–ÎJï +’ß«ì¢g¾3ÚÎ;¹uBPÞÍ>¥ TnqJ^DåTè�2Þ‡gì6©dðþf4Cbf {÷:|“PŒ~¥åí•nöAži÷-eL zz⯻ö$gk¿îš}â�*áê¾E`ŠN÷Å9îo$¾èÞü rHâê¹Ç(¶®§ +Ǧ¹W¼õ/5Ý¥ÜÊÝz{‚Ûk¹�—ÃxIUu‘B+¥‘q�Ò~’ 3îr½øø“|÷õ¬\ªÄ”B®ÍÁ6µ%„cûƒvýç“–ÚÛÍ&» ˆªÃÅÚíçÖ¹UóP² ”Ü~ö™b~…ÜöÑÐÝÐeÚ.‡)7{ßò´Ý4¬~EöqïÔ‡²J®XJÜ<Øþ !dW�v®c\{4Gb~C¼«½œ·+kpÖnvŒR»–µã3¬ ÊiÏRh4ü¬â¥óv”…d!öZ|Ñ›EôR¡rŒ=‚ösîíçð‡å7Ï®V +óº_w Îî¯Ìà©äPJ—áÌ.2€[”[r^vòà’|RÙ¿šc¥iqž‹Ý€Æ¶¯‹Ñާ�ýlhšÞj½?ãØ�‹Îܸ˜…Û*Ä &8ÊR&öa"´?ì)š!xØ'iWº”õð­°O~Ÿ¶]¿a{aú»dT,$ÅžÀžœß`k•S¿>¦µnÀˆWêÐ÷ø:ï{ªi„yà“£u‚–ùÌ‹pųï:ƒAÊÞT .m¿j4?‹�ÊS¼¹N©²èø•WXÄõ¯ȯ.7Ü­K2„íSʤl�-3Ê>Í-´Í1 Z²Ð:2µïà jq­/ëçÖvlbðÌdŽ±çº„, R�€µø‹Š5XʺèÑMå«_¯Ô§%nx•ÿïv®^™ËÚ“~ªÕ]Ó·’©ÕçOJ€”ü°úÝQ’ÚYõõÈA÷'qÁ!ªžÿÇE!„Û~é„û•í×jIomY ÷µ-æÄò2—pU6ŠšÄ* é²!Þ¬°�öè]ÐC +÷è?Ó5ÈBŽN�DQiô×KF_ÖCõšN€Wô¾„T‚564%ú§ùÚjèÖ/%Õ…Ñ�?Q Æ4é.ÅýÀÏžŒç@ûÝ�©qúæR¡@gø×MXT s“#Sã±LtÑ0~ɉ(màÏå§42ZÏjмÏëgWÑç 9'ñÖcpý÷ü¹iwhb¸.vD²žçË©Ã|ž[•pW%ýfÆó—q;'Ó{çì�0ÑÙá^eç"¥5á­H�I=‘Æ¡‰ �ü—äÜçœ~© YÎÏÜD5½d²òaÆ9™x¦Í;Ví ÎÉ1”­àA»Þ\a?ºonU¹¥q¨÷ð³ßR#•óÍ á—�2ºèáZ7ì²q8ÀæÿK¯˜ieò¸š }³’ºNs *ê¹�¼éÍ­¬?ž–‘gÞ¾� ôã‡dÀœN73'á·àYôªÌQÌ •N™‹+dŽÈT¶ý­™ªs¢4.Á?Sܤ¹ƒ¹”KÖR½|úË%&0Äi_/GtCP²ËyŒIXïg?.§á¿˜Ytic=´åk5GÂzéOZ.þ¾–:\E–Ë6KùœGÝF¿ònç@“¾Uòq'Jä[.LÁ?0 wòÐÀÚ¨\ºR×Ö”ïrUòÐHù�µ:œTõ@Ý8Ñd ~òh~;[ÄÀ§ÉÉJËkrYë»p 5{þ³®ìáJ¾­pj^”—r’‡ŽÊá_w?8#ù‹�\*‰ô@ˆ”Ôš‘¿:tÖ=-õóM‘ÃÁSÕ¦´ ý�»åntÄT…±.½8`J7¤'�ˆ+â›-¿Êm\üõ­_Ý““'ÄÅV:¥püÿ¸†u"aÉÄÅ÷H ,ðï‘\\Ü(�ƒ•~ÅÅY9lb™­F\¼X1ç½vy¯«ÇÇÅ]zà#..É„§ô?jì�‹Þ˜e(�ÜMïqñÉ)ùéÇv:Ùúhq +Û*‚í+¾k}ê+NYyGÄ"!ûŠkUð^kFÅSª˜�!·ªk'ÐùÔðÛÞŸ€1ᥫ2�Cq§=$&:ñÅöü|©TØû˜¸ §ce˜çM”IÅr}Ä]šˆü\ø†vÒ¶q·‹ò/0Ä/A£/'Ò̇ ˆ[— î@7› ˆ&*³ù—ÀöáL”(§§òpcBvÊE�?�¿7n‚ÃG¼c)üVŽ ¥MüV ìå‡mîïpí g^áÄpÆX§Ý>žê¼ ß@‹™Û%•ÊÂo"†�!,ïTø< '’ +_á¶�� +×ÌM‰ž¡^&*áb?0CAÂO$#žQK‰eú |Ó6Ñ &„4X�êÊ{\"fü0é„QÚ²Kú‚ÛL뤾ÃÑØ +Îÿ %Õ¦ÄYQ=œàŽh Ò\´yP×Ù9Ý¥'Ühýd ž�[ +/Ÿ’Yøü[ò¿Ìâ ^š~óØiv¯î^þ­¹Ð!½l€¿œåÛ‘:@8ãc#:gÝþó‡2'ù÷àO:´>a¼)ýý¼ÅyøÀߢ–] (©ë÷±§µ¢?KÀÆåüž¤-&<Ä[ü–€!mñÛ£(c‰�÷ýt‘UÇœ“(rª�}³X«úÍÄΑP}{±1ú±ŸP áyѲ¢‚•rµ$í¨IU÷â¹E§„ù†�…&ó]eœˆ<‘�mZU¼ù¨þøÆ+*ˤ†ú Žu �#M¾ Úð:ß[Q‹»à/4O3¹·C {êFØæ�¤½“/Ù¶šö~éçõ¦�° ëyô÷¹LÓYÓÞMoÐo¤ioE`Ê÷×%I{³ÛIžrIÓÞ3X6/¾„�Liïgû}¬H{g愬M—"íýø*U0�ÓSv¦½íÂ<7‚봷Ȫ…xù•Ü›¶<4@ûŠåÞ‘P¢ó6,¨ÝroÔóŠ�u÷>¥@CæICro n<&æ]v‹Rɽ!¦B?u”Ørï�xŒÛkuƒrïë„Ç4¬H¸7©k„“l‘¬RƒŽõª±hòÞJD‚§¹)–¸·†r{à´½Õ{û¾t%6@ÁDï�~Åê†Þ;â_8³ƒµÎ9¡­÷ÛÙö#](&(ôÞÕ[ÇZïí>H²ž.úòozïĆ®×Fï­J�{u^ÈZã¦Ñ{/6–¼7ø.äµ +âÿHTƒïC�M.;ið ¶] +¦·í|ç¡cÇ^£¨³ÂßÈ¡ÔAŒÁ9ø¾´îš-Ø"½÷]8o:]Ëm‚xG½÷ +ÅÜœF�&ï¬äV•ý;YñÚ}ÝÿÞàÞÓ\öióÞäÛe~òÞHÍe�íEVޏ7`7bÇŠ@¸7ÇDbÞ{d¨E4Eí xãHÍtùÕ‘}Þ[t ’ñ[úæ½GJ¶}êׯŒ+òÞCÞ§*‘÷núgok¯úýƒÎžô_O~ipoæj‚{�±<»„gàÞ®¼b ­œàÞID7€l4Ó{+Š„(Z¿öÞ[ŸÌƒoÿËòþF߈FLß\Ãx;ˆ ®|·Øu¬ºàûÙVwˆÞLkTîÖ¦õÞµ5�1le ǽӳ' Wƒ�2Ùâ)áÂ-‘¼Þ3Z ±éO|ƒ³…JÇ�Ò½‹)t-TÞž%\�÷ R!æ­C|ûzÙ·LPÞàÐ,×@£#hüÇ{˜�æ’sdLïKè– »2 ïK |&]1á�*˜à-Þ¼ûwZûn…ÞoÚÂ]­J’wóÜ[9P¼ÓÝ«†o2»² »w«Î¨S»œö2¥wínK­CëÎîígOM¦SÅîþ2½XT nš”k£,lÆÁgÝKze™_!UÝ‹æ{p/~­¡îTæ>®yé^þÝ çšÆÖ²fÝrLh;º‡ǽÜgÀ$o¡�a±¤b9G„Éànœ1f 69·0¤(Ó$YW/Á4wÈV´À[6sƒ·ŸïU7ø6^¹ùÏ×dœÈHÿˆ“›>¤y­<óë¥ÒˆÜÇhÀ&ä’IyÜMR//†úqw�3î‚´Ý…'`«âÆhª‘¦†W+»·a'X +uÓý²Wìñ=¸®Yt>˜ÊÀ­üEXê°Þëo+þºœ°}[æŠ!xÛÛtøŠ þ59’‚¼$\tv‘!~÷¹ã>l·¿¤ÛGc@µIf’Ûµzd“qÜJ¸}WxLhNbYn{íp‚IBc`Û»TÔW?më´/^Õ‚ TÒz¶]*ƽmY,Û¶h_¶MÅ×ꯨrlÿv&¨™¼\—®°�Î{4…mŸ±pƒÍ}8{î qθéæÚÝIü½ZÝàÂSk» q{˨UÑ· Àam¢¡8¬¶j¬qËhòÔ~îÈÕ:RvÏ6ŒÚÏûBèO +Ö=íVÇ ©ÒÜ�šÓÔÞøXq£Àºž]*‘j׸Òö8ƒB�e÷Œà:\GCèû-ée¨ú%£muJtßçÑ–¢õtÐ>ÄÆnvø³?³”Ðó‡J©G3e7;»•évm|ÆÙWÝu�åò.µ ê}?ú|2Ù2š 2VýÌg™Pdöa’& +¶C C<îFÅVi£eb<«e[ro±z ÌiOЮšËª $?ƺ³j±ƒ·­$‹4ã1Uõ%»gmŒF Ugœ¥8ŠA£8‘�Nð)­ÛQ}Ñtp¡Zö…>õHÉéÖ8FgN +·ë|XWS7ó W†©³– ëÏÅÀR³³4 ó‘¾ÞbOû³qVÈc#õê‰ÆO`n�zO˜ÐXlWDgÔ_»ŒºÕ¬¯�Ó±}Æ>xQeÍ"\EIBdg µéÑK$Ø@›8:¨_ÊÀe·êmBkDþôZÕ¦õá2زóiÉ@ü3ŸnZ[_móâͱå0X­¶2„Γ­;…ãå:=Ò»×LUí8§µu¨‡Ï�Lfv©òÝÊeVZL¡Û`Db6=wOÇ&kz÷ 5á‹­Œ¦•zE?0=÷¢™žŒ¢Cï}Ù~™æî)[ØÍâÉ=L#H1�ò…‰~évˆÞZ™] endstream endobj 16 0 obj <>stream +\—¾Ü«›…{ké ¨Wy¨%¹]‹#<'–þ\|”í¦Ž¬ô¥mW~é)ÄB¥§ó=»~”Ë7è,Æ2ñIëì'PgèqeñÖ¤cÉåÌ&mÑT÷2Mbm +%ZÒïeOÊyVñ×p’¤Ãœ +º <•é,%’Õ–&W“HÃm›Bú–ÃBÚ;ôßÜô?ÏYÅœî[m€¬G?'�ï³,v´·¶ô£œâè}ÿYnžþâ°ÑIEX5}¤HQÇ¢gô2ö clŒVŽÔT.{ѤìÏ&°¡¦Eœ_þ›\è*zË�¬SÞ‰+ugÙoš(ú+¢àò"g¢«öÑ-ƒh-M¡‘ýª +@DËà•*3Ùbsý¡1’|¢ÍÏáÚ¡Ê7¼CCŠN¶ONëÛ‚é#Å%͸�¡ «DšÅ7NQO›#ñ˜o ’Rè²ð +ɺoZš„àËJ�'„¦ýAx·(IvzƒÆØQN´å‚ÖI…!A/âÐ�1`H6Т<Ýw\…#�N„äˆÓã +èrs×Ö ¢ ÕÚ\Cþ9 + `šÝ�†÷ó­ûY£ÓšI5?kB/ŠÝgyŒ¼4ȹÕ@]RŸ=l&ÑÌgµ�ÛÍf^†¢ðY¼T3²Á=`#O€J8‹oï|°^Ï�Ü\!Їéù +�Ãwž}[â‹ëŒ'¤<�9âÅ3í•@ŠéK&<—nqèü·Šðìå,‰ðW Ïg]tÓà2� ;„ç( ›ˆ´B#<ŸUG�¥ÞYÔÎЬ€Ûzç�hD“ÞyxIyÔè�·ÐÛÒ„kpE·zçkzïŒ%îìøžDÑQãÎ˧¤áé˜ãÎÌò�I‰,1?$ñ]Ò—±‰ïƒÝhø%ÛSîÙ¬x%½VlÓ)ܬé“4ޏª› ÕH8o¢¯Î™ßì%³œåw,‚NÁ­g%DZSn,zœGÞýäìÑ,OaÎ@°Šu�SàÕI‡NŒöÚ Z˜N‡ÂAñU§?+D•Ê^çåûÇ×ÎÎmzç†;E|¡’§)ðN¤ë¨Z <ã9 ÷=ÅSp7 åi­ ô>Xa�gQc¦gj,õõlA«»ŠÊ Z©e� îÕ–%ïÚV)…N…¦NÜdÅ©:ZgVôTr‘2Ô :.(Ó¨‚2˜ç–ª“RñÙOUt>©QUÏ·ŒžÆª[uÕ6ŠË°êïgÁ0« BÄiµúOÖÓ¼UÈ)¡ÆÖ¥ °�æÞÂ]õ²¯î´« "�â pý:gˆ><Ñ«Ô3)ò«Ó‚Ѭ*ì¥ÀkX ŠÅêý±®NÖ1oS³j¬ Yñ�ÿäòÕyÇMå°Hº€!˜i…xmW­è°ÛkåáSõr¶F?lýáVÇ׃û6 ­ƒk Á’2®Ý¾àFïäz<ç +¢—�ÌÐAÍu=JÜ®˜AН¯c$ï•×ÂÛægj ÁWz}–CòV$Ô²F¾6±ÍEؤëêí«ðQ’–ýʨDœþ¿N5/XÜŸ`щ`sÅ"W€-FX< ;¾OÝô;º{Ð5lQ=|Ø$–û³ÈË¡ØlÈ r8ûË)�}ç&ʳK2aÓÍöÙ2ã™AËÑR7´›2ÏSÑþâuùF;À쌷“´È£Ôü[Z‹´iÇwÍÿ´°ù_†Ô:š’‚Dµ9ˆ¥Õ>jí&�X¿ø{­/º¶ #_»P”Âö*ÙÇwl§Åñ]¶¥ÚZ'} Šÿ)ŒÍ¬(ÛªÞm常qÛÔ_²ŸÌm]Ý6v2l3HåïÌyût¿·º-Äi˜w³ú.¸»Ü AX%R¸ûzêˆàÛ¥oâÖ¶A 7‘íÝü[à�ÓqKçÿƒŽ3@j‡Üªîn5“ëgæ| ©Üãv8¸ËUs¶”°f.ÒféS£hÇsW?½¼]Œó³€ÒYñI’&] +•›+§;Ãï%®®ŸØ­+ ص%ó…dw—ýñWˆv�)E]ÐvqânÔQP‡ë.Âd+�Þ�!ë4ö›‡ö*2x×=âÑx÷B…¡ÛŒ¼¼¸291GÇLŸkÞ]Èôy]™«=Fò¸‚@½ 7)ùP/:Ë—›oBLÖ›<”0pb¯Ýb{U¬î5˜Ø"Íê¾ÛÚ�ܬ9¾uˆ5y^ßYˆ!Z‰Ì—°U +G5†�•Õ®ªê+a˜÷ûæ1…mWïk¿}hsèÈ€ï\`êº÷8V¿òÓû5­�;[‹cŇÝBVƒË‡§³XØÝ6Ö�ˆ¡Q�ó½�þŒ©ŽûÝ€“8–æÃd×§üKªÏíÌÕîº�½à6ÔñI€Á»´•§¦fÈOØ‚V_öG]¢­ûÀQ âxK©Âô*ó±0+ë“°4P,�|ûÀÒ¤VÀo/uü�ÕÓ§Š£ý�•îÁ>Ãòd@@0Z2|I4NoÌê_ Åû!0çÿyÃÝW‰Á\µ,û…²~SoàÈ뇌ާÚÜÀ¹²Ë’þ.Rx¤sûzº(¡Ž‹f¯ê=Ñî�àˆ8œN 2]àáØ£¦š QN¸žÇd«?ZD@ë_™]óæÔ,Ø™z‘“],J`Hnš•§f’À¢á©´Få x{ÜýŠÉ¤Ú€ÿk%ýoF)guÄ4`�å:´§¼Xó™ÌQFà5Fð�åçØ…ÎÁ¿1{LÐĨàbÒ€…[.Rv#àzt|9s޽˫™{8ö˜Lã#`V˜Ú'‚¶ ¾†ÁÙ[ Úî)@K:Ÿ‰ÅX0¹*Æ{ÆØNGÓ[ îs"à Ø@ -MÃÝÎÁzx80h¬…^h*�3f#à’Þ_pH›3gEºw‡5#àfXû ¸gSaE\±´4úð΀SÏQj Š`“GÉ’F+”˼Y•ÀáŸ1”-ÈYý…`¼ý(�ÓÆl3ËñÈAh•A2¶rò´.µiði¶ô•üO¹¡Yå¸|èü&^ ÕKΣFÛe40²¬Ö ‡7 4ðÉKô;·b#÷ÔŠ…m+²¬4ð»Ù3³¦�:JB£v½®&þ‰E¥À1¡ØþlùÄk�ª +Jê�‘M®”D0¤=pA¦Z'ʿӟ6Áÿ9Õ‡TÙîäÚîYCŸúÀ‚RFB WàFdÉù�?ºo¦>°Avèæ¡¼± �zãÀPÕ`ÿ±¦Tè”DºX 0àœÔ·o}˜¥Ï»§*làÐŽJû«Ôx¤'“f“ê~`T‰Uk°¡S«‚†lSx0ƒåÙÌïʃŽ"ácÂÓ>‚ý'úrAÍÑcÛ­-�Ölâ3XÄŽàP’² Lÿ˜i™@Í6•àÆòÝG¾•`ä–àú#YG› ¸olAíìʘصª›Â=ö‰8aÂýÔh+V|wÅQ…ÉÌ( ¤ŒY8n.½hòÂöŒC½ìÌ ‹î?cX,ØæÍÆpý IzŽ#PfrÛv‡6”l3<#T»±†£4�|Ãk Ã¢ˆN<,‘f¥> O)V·Þ‡�XÿSâ†æ7Ĩ\vUqäÅŠ_«²×Û'ÎTty u±9y&³›ê»*@¶Ý=ÄD«" ûÅCLcæÆ~Kælå™KXÔ°áx »¼þ ÍU…a€ô»¼©«€çbÃik‡¨®qQ[À?›»8ÕD”šàVc\š?¶^ÉfM¸¨UþØ"}Ù'í��§mriÿ„±ìÿØYY“ý?‚µ;¨ýcwï^µ�Õ �­?”'Ùx g–GI²m”šúåNÉ®)ÜÍEì0JvÏ7(ÙÍMÙêžSψÆs£l£4Âãe')ž{Ÿ¼ªQ6ˆa²6ÐÆY£lBE‹]oÃx”­ªå¬Ô¤�€�²kʉ¡ÄC“ì?¥n%)/�Ðâ‰!�ýê t�dëK!+›„¤›dË€T×u´µñ-ÅÚL²;ï(´—jH»M²÷‡€Ë({dÖ;ÈÑTHÊΪ]䩎Êf�Ǹà lxÔr¹ê#{ÅYäT!¸–cªšæ²àÒ­\Q?²÷ÊGhdÿ–èÎ@ö{4÷ Aõ±¿4t½Š&ù±[fýcÇ‹E¥ ±-šÛÓT›‚€ˆó9w›�$ª«b>$ÂÔ£= øþüؘ}¯vbªf� ��ÚùýL ­]frIclÿ±ò2l²íSÐí‘å=žÝ­âÞ­M0ÜKkĦµ—ßs—¹»ž-E÷k¬î¢ Ú}is?q†z÷?bÛ3Þ¯1Œ`=ïb9�Ã4ìûáÓ¶Z™Ýðý&²œú. +m¸óûÌ¿W~0+àç›EŒ+÷äŠOr©å‚ïlÕ ÂGä ¾wnã§ðHlËðÊú));<²91ïkMèM¼Úa*ezW}ñ7EP4¾Õ™qq|€¸u‹U'=~²& cùƒ+Öù/cÇfõ{òÌ)ŸLÙË»÷~Í]¾ñqÛˆy!8kæ¡Áè}?kÞùæuž¯8Fçq.ÔKyÞî/€åç‘Å +úðÏÓÌS^ôâ?ú_„QPzTL¿¹ðÎuúv¨WÎl®©GaÕû�xšqŒF·4Ìz/ú„K/ãˆT;¿ªüð~#,˜Òr Þ”¦±[lçÖ׬é06ˆž%Ê�/äNbœÕqëqèÖÉ^¼IYß*«û¼•õ÷á.ëÝämìn}=v×CÍÚPÊÝõý¡'fëÜõÁ�…ó]_‹ëàïzkެ}w½)¾¢,‡Ãë‡ +œ BJ§Ø#¬Á/‹‚·¯ŸIVîõ‡ùb¼>ÊÀ>7)ÒŠ}ÙkØÕ�””,'ÃÚ7}¶½ã·×©k"&È=®tug÷ +‹÷5‚r½Wí0‰õ=o çþþ¯— |Råë<ø‘¾^i©3üÕœ¹/âcýSXæ¸_ ¾U}_ÍßÈŠq¶ŒüûxòuØßX>j*[Å|«UÒÙ’¢k>ö>s›ÎOßèË+׃v&-m†þ²Éåô½ë?³™¾Š½‰úhtF³Âªÿ`ŒGMë°MÌÏbV¯oû�kÒ,4öó‘úÁœý!‡tsѵÿÅçŽ÷ÍSìbºoü!jyŸæ—€Ù÷5e©Ÿà/†ÎÔðIágIP3‹ß_uùñG¦8.å/­�Úó�28d´‹ó6°Gý~FròJ¿9õ‹a8 !®¡¢ýKÙïqûÃÀ +»ûé‹Zø÷!gSœü}²»ÿÑäoxåüÅ”þN~DÌÖ_vcbz;]ûß¿p$dž‘ÿKýû ÞcÀ¤ýG�^"ñ¿VíÁV†™þ!bú?X3P-€ûŸø‘À Òvñ�¡Þ þ—&B?¶ÿëpÇ÷ ˜¿)M¶Rôwà‚¢ :�¹ ®ßtÿ 1˜ì“È_ºÀæ¥yé»ÚÕNíBóÀjw |óobU:rÉx›_m„ıêƒöñ­à"½mÜ=(I³fîtu¬ +¥¶úJçÉ}F‡/t³"Ú=DDzánjÈU±ƒõ9Ðád¤áZË:¡Óõu#Siµe?—k—°áûV¦ÃDm• ¯çYŸSåÔÚ„>
    Xð04¹U–/,¤1YD¨æö*Y+�ó x>ý5̰a0$=•câb¸â(oáR¯§©©a îbÃh‚ÀålÅ(Àþ0˶ÍËn&Åfõ„H +ÐJŸÅ*mÒrLÇg¯Þ›2‚¤‘i#ý¥¢²§Ð·Ê^;Y¿ …ƒ¯ºm¡UJª–;¯¢DOI_ò㑃b”�J~¢Ý•u``kÈÖôµÔÅ™¡̘X>>Õ™ŒûÞˆ™_Ç[E/‰¬¶A'Œ<›[̛Ẉ�_g`¨(¯­ïT±@5bQÎuîZˆ†÷wå¶ažò¨öûâ&¡«Û“¤F‡G5žIX|õ&È …ó*‰ÜúåfSñš/:JIêQzV7ßn†¿štç‰�Ï×ÚEþoò¤Ñý`>9bêÝðNý!¤Ÿ8½7ÚIzmÐwqÙWÖhÉãHŸÂ«b÷¸ˆ¯.èór•c»t+m#¼k/f±› ¼ w¯É"2å]£ßt˜:iãr¸‰·%E­C­ò¢} +x UiñÈH‚U›lOs�cßËË0ËDÕ“˜ð_›×TÞPþ¦PL’ñÛ™�ß7\7!ã�ú3zE€¢ÅØ�…þ–¡Ô¶Ôù¼W¿šN?û�eìõÁ¾J8¸-kv¹Æ£/J°uV½´…¡{ÀWÿР}l›¡¥R¬?”ÍÜa^–-ÿ1�¡~~ƒÐ í bS+26Ä�p¨®A%f–²=®nW¯V{AYÑ‘W½>˜‚�ËDA“ýAM|†«ïÝ ÖžŸË’ô�IZìTÉjÀk{!#êï¥�î y¦™\þŠÖï|INÍ-áœý­‚÷èÝ´Œåƒ¼¾ü(Á}¨ž�=æâ-à(أ욀竨¶ì Ù¾÷z‡ ¼{ž&OQ\êIÀ"?bqà^pïëOýh‡íðÃïøãΙ»‰â¶{ø™!¶”)%)¥ÜÀ‡Ì9C TD€°E +²!i#T#|kuöÍokãú¤Ÿ¥ ý"gF»¤Õ[;´ùGò¯#ñX yö<¸íK�Íåu‡0®!Bæà§3hÈÂý²ð\­‰7Ó ÂÑ/w].MaœlƒW»¤Õ[NÆAŒ�‘�eßfYæOÍß|ç<”«£§Puæû�D¿Z&°m†ÁK›iúäjÀ7Ï£¨gaÚ6‚ußFЮÎùòõ%$ý…)«óŽ"_Ê$ìU4.i/)¦4*¦rÕ‹JïÉ÷uíœBˆ‘>ÁÞ€ªbGà¡ñC¹*ÞK¥_™<¶šFÐíav{ón˜º³&ï¬Æ1´³uÂwwÑdáYS(øìèÒk9Þ;_¾Û(“ð’ü;‹x/{]®ËW,Kg“ yÒŠ ~ DLë"ËB‡0ïï êÙ8à».Ó·VÃÜ­É>‘´�W±ÏÊÁIsñøœ¡<(~H¾Žã½kBÛY28ë'&ë¢LCE»Û&�Îãxí¾�ãŸgÛ +J<ÒôÍUþÙN§Š7”êâMç�$ÿì¥P±�ÀµñNðù ¬Š=% ÇùÞõœÃ½Sh÷káþLß[�#¾“ì³uÀz¾¯mGœwó,êÙŸC¿ÇÄdþØh%T¯g ß1vjÝålÞºØ�ËÇÀÈø† bœFæÓè÷!!�#Ä¢n»€„Ê^LTå?Bi%ÒÃnÑf¡=åòCZG…hüH¡‡J¤ˆžgQÏ–áS£aôÌè1Ý7Ê,ì2…"v�ï>5: ×ݾÔug?6m;gkgáæœÄ¼9+繜þsiÛŽÅü±qwój!MÁœF»ZHS°ÿXúõÁ¹C÷ÖsÀvvçà}`5|'ÁhcÕЬ½¢œÎ”¨z. ó�!��D£‘Bÿ‚�^‰ÈNµÂÒ;­&ÞŠ|HòÏ&²4<à*¶“HÅõ‚“tWÐy‹ˆ§¬`ÅcW2=´�,ù¾Ñ'áo â²~ðC”æòáI+ðù£>4~­áïÙ÷Ø�,ù>⫀ʯDzxÓ¶y@6¨R¯‹ôéµ�J»E–…¶ÎáÞ¯ù›û2{puÍ ]}s(÷o é¸MFÆï2B¢’¸ÖI™ŠÞGñ/¦î­ã|çº<Œx6� \�É[›oéĘìV.4ë¤PªŠ= ôû‹6;O¢^÷°ÎçÑo� È¿ „¤G +=´¬û8‡v>œ÷yÄ~_Hrðèóð3‘Š €ìN ;Ò§W0®ßxë:Ï"_ÿ‘ì›´sÀuvM¡\mC8×mëº�¡ÜeßúGL×�6÷|è`R'8Hò¯åáÑ7Pù•@߉”±så(åb`rÚœ ì<Šzß'’¯ÊÅeš ü6ƒsçÏû<öÙ>�}öÏäžíãÈWÅBRÈrÐϲõ»îˆ&߀çjÂ8ZæïMþ‰ìM¨b› lß„ëè,œ¼Í¾õ2œD»™ÉõÛ¥bHÖP ;‚�AG� „# Nú+ö´—%iµ/)õM¦á›‰4ñK©˜ìW,2»’(øèóð?àZOBZoé଩RTþ!ËÀ»Pîë„ïn¦QÄ.ñŽXÏÖ +òÉýBà•{K« �Ȩ å¡ñYþy’Þ�йÓ:‚Ò™�‰I¿Tþ>�|_Ư­–ùS£oçj§UÅo!–Ô{ ýK¦‡wL_Z ³w6aþ}%T¯?Àšø“@¿ÿFðîçîý¡ÊÁ»§‘ïç(ÎÁà¡Ñ\ËÆÉeJ«ÞnÁ€×í–ŽPÉóû‰0 ?Í_\ϲuåïœ}ZhßÒ}?¶èò¯K± ¤'0)�¿bO»ƒ £³È ì…,ÿ‘çá¯L=´�Xý”‹Jk'Ý`…em@|'ãçùgC½2úÉ�Ä ¶€xüR,$}ªÇ{÷"ýþÏäŸÇÓ}�E»ÏÓ¸çuÄw?lgó8æýŸÈ¿ïã¸gó(êÙ5…qþ%Ïž_î¾Ã×&Çü­qoÄp*$Ý¥c”»a +k-ÇŽðdG\ÿ—SÿäÊè}ý¬.ú¨×G¯S¸gÓÂ9µ*~'ÕD(òϦ„ó/ohµŽøÎFêôÚR¿fG�„7�c^�˜ï¾9”û4€5„s½(tÐ7­Š}Ò(Ø/0ù§NTv»ÏuAã–íPÚõ,–]’Qzª€É®´úí?”~~(“°/P!Y[ÕÀ¤´�¬¯fdÒZÃ6ƒu½§qïq‚ý�TÅ¿T +¶™Hßj…¥_�âÑMúÙ6‚t¿Pî×Êùo]×R¯ 4éwï$æA€¢ª­`À*wT9 ç| U±} +* éµllÖZ5<高µR(Øç_ìθ0ygóŽxÏ'8±ø- ý†€ÚK¨`Ó·6¿àÙÜñ\]”iø” ¤¹p€ÒN¬‹¶Q§×;­*~&U¯ÍäÁë›<€}ޏîÃä¥qeÙdÉ;� Ǻ 6TÖÊÑ9 E4›ésë1ynsªØ~Zmü3�ouL^ÚÌÞ³—LÃ}‹Èº�ÊzkÇçÌÅãsf�"Ò7�&~! €Xü‰äû>�~ ÔðC}X´�ˆìO®Œ> ôû�"ÿ>�cÞϺüL¥ˆv“iøöY ü:{þèóð/‰‚m¤ÏCH½»èÒÐn2E¼™Jo£ÌÂÛ§±Ïæ ïÙA‘�w&á=D)huÞ?“Þ‡RÏë0Ú}=5® MsØÖg¾mÜšÂ9IôÛ3Xi�»JP|P@ÐT/4g¢ÌÃîóèçqñüâÞ×9Üû3|nýÆ�î]þ­ŠÊUÑ&Ê ¼qëìÂTÆ[ ÔÛ­tû1xku¶ÍæÂÌ�Õ5‡oþLç_êº\»4nÐ% êì³}$ùúÐ%á?úì"�~?Q§ ·ñÊõ™¿¶ZˆÓÏ+Háè§`TÒH,ú;ú&\GÛxåº á\çqìûü;�xµŒŸ=óG÷0öùŸÈ¿Ot9t xcH÷_äÌè9³¹FPN&0­†Ù3£cìÒhC¹O#×Äšr±~pr§^Lö)’H ßTé÷•NÁ~A I?¥Â²ž"aé‰*Nâ]¿×u£ÍB{ ‡f�`„t†`D”öú³thÒL¨‰}‡‘�¦ñÆÍ>“}uSªb×ÚÊ��ÄT¦b‘Y…z Ë¿®¤ŠXs Ù¬)D)¥¨€ì>’|/M®ñÂÑF¦‚ž©±žZAÙ£B4.™†{�]©ôûqó:O¢_ äx÷4úùŸHÀT)XG�€ì€�ÎS(*½�SÅ¢ñO¡¨ìVÃ÷ŽxïßÚyÇ={Él£*~"=T+#dàÏ ß}E`šˆ¤ù½‰.í�ļß©gàUì§^Lv!ÌÁ>3Ø6gãìmVÎ&{±;ÛYÒ°°rŶŒ˜Á !oí••FŧðÎÞAÜûG †?©ló„û¼M!�š ´£B4~#m¢KÂ�D<Û(“ðNÔ»aòÎf:³Æ®;Ó®}žÆ<_c׳jõö…îÞòHâyĸÏL†áKãâ€é~Má�Æ«y"ï<&_ÚôD›ƒ~gQ¯ËªÑ0xi²ÌŸ]HçoÀuô 8Îë0Þõ°]M(WYæ|ï¾�aœÇ9¬û6…sžÆ/®Çà­Õ0sg³ ßZMW¿ÜÙ\ÞåÐ�sÃ:¼Ì}9o­æ\10­›õԋɾ ÅãoÐÂ’)5ì�@”xôW/4ë#m$Ðï¡�%#³{õŒ�z +HD{,g­`Eãha}DjØ•PÁ¾A ËZÂÓ¹ë‡'Í´Šøiáè=¶™È“°cݰì[<:i' ûgàŸ!„“gáæ›ï\ÇQ”óVÅÞjFeçâñ9{MYåVˆ¢:[p’:géФ°:þ¦OÅ[ˆRЦŒ«{ý:WÐ9BÒù*c‘e¡=dx]ÞB“‚6‘¥á?ÚôÚK¢ˆvRèáO +ýþ¨Ž?�ǯ$êµ}ýîCº?ãçVï(âIþÙ:á¼�ó­Ûëýœ/ž=£×æeðÞúÍaÝÿi´—B½]¤NÛ©цrU¼™L¿÷‘æacŸ�Ñ[›_ìζ;‹{5”´„"¦2Rè·gݾ–w·c/w].NØ®&Â4ìX@0g!o³�¨;8ù@_Åà¤s¼yßÇÑï;©2þ,™=kFfW"ET +ÛJ£ß›ÎׯyÈ=;G c×�gÛê™>¸:Æo FïŒ ƒg&˶Í1ykóËÜ—_ò¾œ}»µY¸^³‡&Ë ²É5‡o5ŽØ®¦)|«aònÙEÍ—q³-·¹e/w¶LSøFϲÑ3€q´' _BEôG ‡~‡Q/ûö¹/o]YÆ�­ë8Þu¯\϶un6­ÞféîmL_ÖÎs_òîm à7ûÖ·< Æ J@¥Ò¯�zd è}"û¼Í·ŽÞIÜ«‹ ;OãžßiÄcUôRÅ6“ª×N-´&ÿ<d^÷¹äë=‘z3‚o³#^mÔ饜£_èθ4‚róЦ _"EüA˜~¿†p®ËøÁùLúÕ9ˆz4M \M3èÖwム§¡O@ÂÑ[h²:—9ñÐ5LQ­±f\âÞýñž?Àšè¨¨ìN­�hòÏëˆïlœo�dŸ=tI„ù÷� ÏbŸ 4ég UÚ@‘�6Фß�shçcîÚh™½·N#×ÁwÝæ�®Þ ÷ùžÄ¿ÿÃ(hû0úÝ6v6áÝDé×MÚw‘:ï#ÍC»èÒðÛ}C<Ï“È÷o +í|LžÛ“·&ûHòu+•«†&½ó˜W»Ø½ &��”hÔiø›Zë.(£Û/xà‚ai­!)•‰( mï%£r„#¢ô“Å&Óð�Äùý;ŠzŸðÍ϶yB¸~ã�³sëüÌß[¹3ãÂì¡Éhܲì=öR÷˲sŸ †ïl¾ ×Ñ4^7†ï–_ðþ6;÷µY:›,f��+'ï8êÕ5‡q5 Þæ®M†‘C£aðÎäšÃ¸:G±Îï<æu Ë¿nZ記ì +L8þù:fO�îiÜûEžƒÿ¨Ó›Æ«³o¶œ�³¹.n]›�»·0zft Ÿšów6» Éc.gs™‹—Ìç‘ïï$êõ›ïͩ׃,=NØ®žé“›eÙäšB9ç{×k +ázÍ \ÏçÕ>Œ€?ÈRÐÿHþuœ¯�Ç3“qÄtu( `-ø6ׯÕ2~póËœÙFo�›“˜Giz¤Ðï³hçcøÖh˜=4�F»ºiUì�,ÿ<Ž÷î× Æù?·Z†¯­ÆùâÕFHÎŽ�r»Ž„ÊTm鯝�ûbw¶­ñÂÑ7ß¹ž¾ó8àºîÉׇ0?R¨×ƒñüÌ_-ãçFë8Þõ®b;j„£º¬uíºÎb^·)œó5„ožÆÐ­ë0æÕH¢†Ÿ�ŠÉ¾DŠøkåz ^›,ó÷&×ÎÑ@—~þ@ëb7ð*ÞQÄó9`<¯#Îë=’}5)¸~ÁX# ñØ‹6»ä_ì?�ƒÝÒïiþJ@›H³Ð3•"ÞO­�� +Jº LzÁ Éz©ô{û8þyœ¯�·)œó1zl´Œ^[’ü³xhüN«Š_ˆRÐþyôI�`; +Ä£—Z ùgãxïþúÍwÎë,ÚùG¾¯#¾û9a»Ïã˜÷ƒ(ÿl"MÂïÓè÷s¾wö�·Îß ÒuE<Té÷wóþ xÎç€ñ|P¥ ²ôD›‚)ôð/�~ï&ÔðWPâÑ;­*þŸÆ?»æoÎæQÔ³�Rÿ• ͈E»Ç‘ïÏôµù—·³ZG|g+�zm§UÄ®Qç ÝÓ¸÷ ùnŸE¾ûÆK÷kß�~~§Ïã Úù�ļ/d9è™Hí¦RÄÛgðç âyF=_´Yh'u‚m£ÍBûÒïû<æÝG›^ÛI5Ñ6�*¶‹0 ïÇ>›GÌwÿ4ÚB–€öÐd¡M„9xãxïz ¡\ßYij�(ÿ~QgàDùgã|ï:ηÎÒô³…0¿Ñf¡mäiø…0¿PæŸ}Äih#yzí¢JÃ(òïó(ê aþ8úÙ7‡tößœ$ùw?¡2ÚGž„÷ _›‡±C£_Øî9מּÇý›ïœÏ²ÕÛl›­ªôûB�|èÒÏ#}ÚL¤_³&Ôð7 +-ô5…q=fO�ÂôûQ&?‚�})õûqëè˜?69†OM¦„ë=Ž~5‘f¡/òü8ŠwtÖ­[3(W× ÊÕ3{o½FPÎ× Æõ›Ã»>Ó'Wgál9 wÏ4€pž&°Í˦u˜=3Æm¶1Œó4‚pµ ­uéÖÛÀ7:ÈÐÏðµùD<4Hg&¿¼Ù2ÌšŒ¾ë>‘|¿§qÏ×ÎÕ6‚vuÍ`�ƒˆç‡4uõú΢^ÿ™üó?“]'ñÎËø¹Ñ4�rõfào:w“H ï'WÅ» Êî¤Êø  *~§ÖE_”yøq¼wç‹W'�‚½”ŠÉúéUñ'‰ÚL§á¯ôù½‰. ?ÓiøSµÈ¤¯f`v$"=�ß@ªØ&Ò$üA“�ßç±Ï aqÚ:Šw}G¼ç'ÿ¾‘§ágE¼Ÿ^?T+£]¤Iø¿ŽøÎæiÜóB™v�% ïyÔûA�‚vÎ7¯ÏèÁyœÃ:›GQïÓôÍõ˜»¶Ú&�Îû0úÝJ£^; +£=eBò3(i?¥2ÚIž^;éó{;¥*ÚK¤Eœƒöh¡ "цbMìy~ J?›æ/®Ó ºuG¾Ÿäùµ�<ÿQ§×ÿHöÙ6†r>h2ðC¹*Ú F0ÚJíŸÈ¿_CW× Æy H¿{'œ÷iøà¼M œÝ£ØgqÚI�`ÛfpîgÙ>÷…ΖaðÎd›¯›­³h÷³s¶Ì3\ØÀmî˜�äÞßiÄó2l´Í7ÎÿDö}±]�Æ«w ï:¢�êüû@—~¾§qÏã„ézÌßÙübwË/w]î�!ÝßqÜ«káhA6:»V—qîXØ Ý†Žm~‰CãÊð­Õ4…m~æÏ­ÃÔ©ÑY·››m»¹1yj³Ì_[ýb繼ˡŸ5tÈÆÕ\;4šk9€ñ1 `Ù¶¯ÍçÕF¡…>†Î­žésó8‡t7Påß¿1¤û0sgõ‹]wÆùÖ}G¿�sx×q¼w½FPîï€ùþ�e¡ºüI¡ß�ôyh߀íjù'ŒGç$Þõ KA_”iø›PÃ߉uñ@UüO¬‹ß‰5|#�z=Î!Þ·¬ûG …öVp ”ðF +=´—NÅþ@køh ¦Ñðõ¡ñ;©&ÚGš‡öÓ«ø~ZmüN¬Œ^IlIþH¿ÿ#Ùgç âyœoÝÏñæýžÅ=û²ï¢ü³{ÿ~�"ß'º$üG …¶UD;�‡Gû©5Ñ&Ê ¼{Â~÷�!��Á[«iåjžE¾žƒˆçm +ç<Î×Îë(âùD=[ŒgËèµy<·Ç{÷‰, o(UÅû€i¢�àCãmµ‚òŽú x+y"ÚF›…vÐdàÿ�üA�€·’'â]åBÒnÐBÒi~¡L@;(³ïÏôÅÑ3{pµ�ãž ùwï$æ}E½3hgÛÒy¤NÃ.ÔjãGÂÑ Qv¹.¸6Ëø©u!ÉÀn�äß](gßÒÙ>�ywPåŸ}Žû0vftÖÍÞ¾ÜÙÜqܧ”«_ìl®KwÌ%mKöbwË5†qµÍ¡Ü§)ló7_¹/³×FgázY6Îk_òîm Ø­ÿ`öõšÂ8Ÿ}ë[6_æâF—¹¬Éd0{]®�XŽÆQ¤£cÕäõ&/�›…»·Ù¶¯å]™ÌEmÞÊø±Í5‚tõK]—ë‚Æ-ãu˜÷b²q^ ³×•aöºÜ¬œç¾Üy-L߽ͶÑZŽáFC–Í“Ý Òõ£RÂ3×öaæÎhœCºûçðÿ@ú}¿¸Î³È×—F¿·�8ð×ÒÕ6„u�GÜç“<½·ÔįTúý=�{ž¦ð­Î¾õmîÞâ âÑ>‘|ŸHÓ°#YC€ýô\76ûÖÄ¿dêµ{ù>NxÎó(ê}¡L@ÊUÑ~ReüJ£^[Iló0êy›B»úÆ�Î múÝS&$ÿ‚Ž÷�eàÝ£Øg÷$þ}±ÝƒÇVÃÔ¹Í<�{ž‡qÏÓÆu½7Ú¦pÎIþÙJ¤‡÷Ѧ×ÖQ¼û5…m_qÏaÞHœ…Ý¡ÊAÇ0¯¶9”û5�t>¦N�~�3›_ÞºrÌÝš£‡FÃØ©É:`=äx AÞ@�÷Í_Þ�Cˆ×-º 4cw—@ÁÝ&Qq÷€iâÝ4ŠØÝYijiúæzÍ_]—Ásë5~s½HÒðÆraù»fhÚH�†w� Ü?Ò<´�@m?¸¹Æo®ï æÝ@Ž€÷‘'á-xEúÝGœ†6“é÷>-´�*ÿ~6®ËͺÝ\p]²üK à®‘¥¡�"ßÇ9¤»o¼q¶Ì_ swÓ0}fÛ,œ—_èþVf°mv9“Éø˜… ÜwØð²×-ËÎý²¬]ÍÅÓÕ=”{}G²ÎË¢Õ.iÚ|,Cî;€½à©•õLêÕÙ8{Ë·b`Y¹®ö%®Ëåhcc.mܱìœ×Æü¥qmád›D8šÆ '»¤mÉ8‡ _¼“qȾõ­L ÚçÆ}¡ûÛì['ã\ aÜëÀ?‡.j2Yv®Ë/z÷FÏž¹M悦%si+ãv™˜ [=–u»É²mŸ,{Öç9³ç[gãxïþN"ž-÷Vó<îÕF�^OdiØ“è÷½‘æ¡]ÔYè…4;Îá]±CÓ¾ÔÝe4^7ȰÿXòýžÉ½ZG‘�65ìM¬ˆ?iÔðîqäû=�y7ηîã€çìÂ7O”)x?±.â€é~ Ÿíg—ÑÆÕK§Þ;�G{h’ж ´ó3}rµLßZí’æ·.gÜm¶ÍŒ«#¾³kåzŒÛ³×FÇä¹Í2|p3£žï¡Ìë/sh2ï²6»Ö•eòØú œ—Ás«cðÖè>¶#—VgÕ¾ìÒ�¹.kóV&��ÖQÄó7…w4Oãž÷yä³wónq]WF¯ÍÓü½ÙA”vQåá'Â$´—J¿÷Ð%á¿1¼û5�qߦ�Î×Îu›B:¯Ƴ™H¿7•‰I»¨òЦ|ó6ƒs¿ÈsÐï ê}¼´¿wR'Øî�Ô³qëìD=ûæ;çgúàê?¸ºhó°+�z»C’‚Ý ÈÀç[g˶Í.p½ìŒ‡½›;CèFgÝz×bÐÀ7Løâ[ ø]fVów¦� ³qaöÔ¶Ù¸?ÆÓÆ:p3mXL Û˜Mb×L'¿Ü¡•Åè±i³o7ïc8 ¼Ìë¯Á0då¸bY¼®˜‹Ü,Æ;† \„ |Ìë+‹g“Åô­ieÛ¸2…mÜöYæ�mëòÆÕòƵ0p¦Á¥m¬ƒ‹Z™˜ š<–Mó²n4YÖ�&sYÛvàt‡ ¼ƒ…/NoÐ`³¡ÎÙÒÒªÂbr€¶‡v� ‹«Š©Š ‹‰‹Š‰ê­f¢b²ÒbâÒªbº©¤˜¨˜¨˜~ŽXÍÖ;X`Sƒëc»Ð 'CÍTÅ” *'�mOMëàn*K‹——TWV×�SÕÓZÝWŽœÓ–Ã�ê* +ëjª+ +kª++ëjª‹ªªªË*K+KK몊k +ëŠÎŠCÖÕ•ÕÕ–UÖ•–•–••Õ”ÕU••UWו•Ö–ÖÖVÕVÕVÕVÕVÖV•VÕUWWÕUÖ•×WÖÖÕÖÖÔÕVÕ•UÕÕÕ•ÕÕ–•–UUÖ«-­.+®)ª«--+«©«.«¬««.®+*YAN[Ž…ª¬¬«®.«.«.º¶ [XWS[[UWTZZ[SUW[[VtV˜ªúÕ•×ÕUÕUÕUVWÕ–ÕÕVUÕÖ•ÕW—Ö”ÕÕ×ÕU×”U×”U×–×ÕW×ÕÕUÖVVWוÖ×V–ÖUWUUWV×Ô×ÕU––•••W×VVÕÔÖ–U•–”ÔVÖÖÕÕÕ”ÕÕU×ÕÕÕÖÕVÖTWWW×W××T–VWW×”–V×ÕVWÖ”V—V×ÖÖTV�šŽ747! øÔŒ”¡Þ�Å/“¸�…œðoEÅä(qŽÃax á0\†Ïp~Ãqx ‡á1†Ãð,wá/ü…×ðÃa8 �á3œ†ëpδôô"÷ÄzMÜ�ÅCûâQR 8nÁA•K ᧆØBÖ8ǹñÄ0M¥ÌEêa ià“,兀%û˜0U²É‰äÓÐL/ŽšÞhö€±‰Øc³ÐG ÍÃ-8q°nŠw¤j†s|Ðß@ÝTÔ +*IdÑSD¸H(UlÅ*±?¼e‰‡¤råWÆÈb8€¶nœY†q,†¤-¡^8üQx¹<“À˶p¦'ôÂÄ�øÏá;¼†ÛðŽÃox‚!âNBLü‘ހɉÃi)@!ñs0^–…€¨ðÆÄC2LÈÄaÕ@0†¦àAÃØX "–È¡á%–”~M’TþÅñ¼\B¾‚…þ €YóÅ•´NF˜ž‹<@5w„ÐëᩨƒT´râhäÆOEØÎNÄ ¤™†<^\ÂÞÀ4ì¡ÓPO±WMRÎîÐáׯ:f>Láú1‘Æ14 i¬ÀïȲø„ 8’>õÃÄ¡h�8 7Êòp¡—^Äx?âH=Pœ†àà±›!Khoà¿BþdÔ€Ñ(àBœ‰ÿp#þѸ_âB08ÒþÃ,ðhŽeà¡C£’tL@($,��¸\Ã2É Î¯�ÔK˜É!`Év2öû31Hçæ÷‡ND©ŸŠ:NEa-CG“ð}–xò†)„Š™£•+þ³u‰�§d�ÅÎÈ–šb¨œŽ6>9q`nŠk„àdœ‘šy {è…’ÀŒaŒC‚´~õ¸ ür1”'ð1-*NAKŠGÀ¢â^ZV¼B——à‹ƒUàâö6BvïìÂËÝ[†ÊB1 +ãÂú�e«™c Z§Œ+k‘Cø’@ø¥Š±”›ƒJRh*qaù»ÃóPÉ*§ˆ)n|ãÊ´ã&¼€ë ‰Dl xdǤ_¬“~±[*‡üØú^ö¸¡yÈãÅ'¤�GÍVÔ0w`1Û41…­SÌ#UÓ«ã…&xGM°œà)2 }ÌÐüæ01:YDZ +Ü¡”%Ým Žšíµ •$]¬%K� BJ[¦j,]f$¬¢&⎚a©šˆ=P=!…0N À¯[`ŠÖkÜc’Ê0¢OK][N„‰�wˆ©��h�2"@e~dr€…D¢ø‰˜Äóó“I¨ë:OUÚ0ƒl1S\RÅJ‘B/R@íÙúdnÓÈ÷ô ä))“>ÏTÚ:qTQà ’¥ûY•¶QÐ$€™^,8Ã8Bˆ~Í$â%UU’G©äÊ ‚äBAÒ¿K’øÈ!UîÓÏ%‚Ÿˆ@XGƒlšn15Ñ$ΑH‘3A&=ìµè˜3ŒQ�!ˆÝä`�›t8L 9‘È=‘ˆ�o\€²¼1ÊÔÆ[:Ôã,`~Œ%ìg ³ÇV8˜�§tØ  LS•6NÄ" Ÿá%–Ÿ¯Sä §\™?‚”UÅ–Š‘Žù�Š-¹€ËR U,lLclѳ×Ì$àÏRÜ‹D¡Ý¶0)“C)Ód�E�s„·I" +|Ä*Wê@X‘¡à;aXYÛŒq%ͳD7QW&v§­±y›°±jl(À‡! ļþÑ “[rI”»r‰•[F5ÊVºš®Lâ:M“äm–&ÁëÜB¸)ÞÁºþêÙ8$ò3“ˆ!¥‹,gÞ�ýÆ h逥 nl… \%³g‰*n�†JN/•ìÈ$4b"ó$5Ó°HˆÌÁ!3,•à°T‚ƒÕòHxH/DIïL1¥MU„“;“E$=H©<%±„NVJo&ÜãcÆ::x·h™CKH‰#mbIJË7º‰¤�S¼#µSqÇg¨#�IOOÞâÆK´Ûq�²¯•)ô(d�HOqÒOK"ßOË áÎÇ �œ�>"9{hJÂJé b*ññ�ü°éžÜð‹DŠtc¡øÈ&üMPâ6ŰŸš‡?Jpö€ñéí!C“ÈŒLCØ™…CJ` �YH$„æ÷è'd±¨dl8´„80)½ÒG–»´µÉÝhøˆçç÷ˆè(g¬ gŠ*k•I`göÀrÖiãÊZæŽ+g¤"œÌ™–.áC\ëÿ5†^¹[IF·`!Ë9±á5w8A;Õ,â=…™xÄÈ­–ÀŒz/ +»oIŽ›í ›ëj[À¢*[ÐâÊÅ[¢ãgö€‚&¹CÉY¸Ç�³<&9l5*'î´,*ì¯å„÷¿nü¸$ócØ1Êt=#‡(r")åIå9ÝôþH‘IH†eà–�HlX*Éa ¸„†% —�Gvh1Á).Ré™Ù$°S7ÐTÞ< ¨Âæ¸ãÊÍYÀ”µÕV&{§�I"K)� jêÈrVI$ËÍè#¶;g䯗£À�·(`[8¥I­9äÊÙå�,ÝG(xD+ZhË Ø–G²Üâ(Sºb“)~2öÊÝ'ÖÓ +œ¨é)¯öLk2^}šÿ_YQo Qo€bÖŽ]lñ €DÖtAE Òˆ–_I#‹™'ª’»OGØÉM0,k¦!¬ +LÂ?.‡¹$[ XdH% ‘—ƒBp\ +ÙAé·Öðˆ�ÌÂ#$4¿AX3‡LfR&)Ü„,¢ø©¹d05–oÅ“¸MPÖ@I<�{¬¡ä,/ß5‚âsˆâ¡&‹Uµá˜À°ñ ü¨ë¦ô¨ ­4©9eTYãìa%­Ï �ïÀ€U²,*¨cÆ2:��uŒÅ!`ˆ W#Üû?´rô ‹H¹KE0¡#}erWºÊ$/Ô:Æ)è�ã-ÛÇ%ü2& :ÍÄD‡SÃö+’ã¾S2ãžSãFÓR@m—å-¶b¥g®°’Öé™ä�³QH俣�HÎÇ Œ›a!¢™‡BB`qÕôaíDT‚ÙÙ˜„ÑÔR X“G´½'HhÆMîSÉ#ŠŸ`"¥£’GĤ’GGG—ôeÂn1S4åKÂJé†@ÅMF”·0ì‘[ÞòBnàCS+•ƒRnÐ#“[A­\4+.ü¡ØVˆ�“v^g-�³!¢ìIéÍEÂj&7ùðe' üÝäÄO›¢â‡Uq­·`=å«•}Á +GŸAKj}æ$…=–ˆÚH�½ È³4NNâBM—èm®¨²éD�ùä?éûRH·' +*m£¦LöF)�„E�D‚†…ˆz"9ýdmBG€XmØØ†Ø„œëÒÒJvUDu,ƒR”Âùœ.¦¬uʸ²öEB¥~SÀ—ω�zÎ �z®ƒKF€[³ppé¤ô¨#‰L¹7yTIkL2ÅFTÒÄc¹bêÊhRÚ‰8éÖ +À�"’©�òA)_0« 'ÅŽgäÅ™†Vi(âú•Qn†\gcÚ@-JjÎSÖ"™d±)‡d¹=E<�ÛLA…�VËÝiÊäŽ3ì#uÓûÃÄæ÷‡«ç"LPM$„š+¬¨Uæ8ྼ±ÅlÓD6NT&v��?9}ˆzJQôt}2‡¸J§S"ãþMFÜd±ºžÝGHÎú|Ôèš)IñË–¼þ™Éˆî†äÅwì‘ÄltE¸ÔÔ%|¤#žÐqÒ�¢¦†$…ÝâðgÛhš›�u�\Ó( që5F!†¶Àî`,ßICÊZ' )l�8Ž iÚx¢V©ÊÙÛµ–¦dK|¹RÅ_«‡& –eµƒiy¥'D1�—X½ÿÇRÏž‚!Yw À +í\ŒpÅV¶Ô•6´˜qº:‘û,]’Ç z¤t4 (*“;QOä:e\YËÔQåì[„IÇs⣟a¡A�ýŠBšØŽE´|ÏXØ@QLyýà„n´D”¸ÌTЇÄv¿EŽ|B!Bì6'3zŸ¢¢ÖjY!wX „¬¥Å‡sâ®C"öSrã·5™Ñ;r7Š‹n?aQ£)a¦FE×LI‰›MHŠîݾ 3ÌÚ”ðÇ®€¨Ã ø0kÙœШ¤©t\ÊcW@ÔÝ*3è¼(BèÉØlÏTÚ,‰p;*Ùâ ˆBÃ% „Û€ò™~lÑðc;Å ¹¤ŠÝÈ‹o\BåWÁÒ­B¥«˜äÉwòc.¿Ð~%€„ÖÊȧö äÖÕ2³&,:Þ6Þ�7�w\vÚ”t›”=o‰ ûwdÆÍÇÄÇ_¼AäÌ�È�;pÈŽ[ÏI�OǤ†'dkOöhr¸Ä‡mSyQÏ[PÐnVhø¸&-º‡@pœÝ-‘qSЂ*WX •˶eFoÛR£¾£â£ö“r„†Œ…rK6±bkú¨rö‰"Še,û;-3§)ož‹@0A%ƒ(r¢2±ÓtuG «ÅcÑR3b@Tr€w¤€þå/ùc‹-éãÛ‹ÀZM�2YTp·Œ€r“V m­ šô†,©ý *}¡JêœáÊ*-Ö„Õ—Aqý?vÄ=g$†=øÃÆY8‡�4ðX³À9ºqDL ÉMZ»¶”~ +Œnµ®xr½ລµ¸�kfpÃ!gX@Ä– ÊÑÐÛOF‹6¿ 9î[J +o´RE.µA“�¶ÓªâDZ9oñøœ¬˜¤ƒ6i¢ÎAOã’Þp€‡™íJ�ZPJ’º%sÛØˆönÌ„;©d‹�é#‹™bìÏ×$I½{ƒöLNx.27ʉù_‰1ÛRXÔ5µ­%Æœ'eH½EHmGÅG­'H¿«Â£³ÀÝÅ"cž©°�·PRÌò½ƒ%d0„˜ÑžÀðhKPØô¾ƒ”t•tÝ„„—ò¢«×CÆ™›Ý1'­Þ‚V9̉kÝ•œèh±*lÊŠNK9Q÷')ú…TåOJå [\i®•4Z”jB C¾£(w#ì“ûŽ +�í³O`×L�3pÌpè¨ï®ø¨ñªü¨Ý²ä Ù°QÇ=¹ÑÕ à;t÷ +Œ:ŽŠ �÷$‡ïfyAs`!s @ .�wÜÿ,6…­mB‚Î Eµs¢Ú¿  Ò¤¬ÒÝ"!ÌØ†Œ@ãYí’ź~±&­¬Êj‡°$”î*ò9ËWDô7#*ºÛ)¼'£Ü¯Zån‘6^h€6f¤ÑQ�vf„D÷nRâç)™ÑLÒÃŽ«bç mcN‚ä•ñäMÈ”3Ê$Rº�QªüI$ZlÏOâ4OXY£ì±å+€…€¥L€Él—€¹qJ/y$‹ýg+\¹q¬Vç ›PWmRµ]YB¹^ ¸n-T9¥7DAý`PRVËž 㯚!é³l`vBDi­š4�]ˆS°^ÐⱃUaíbUZ?TO'y½g'®÷‡"Âî^Iáͪ˜øwA +èæ¸aö…À+W'òN†áS+{¡KÓZxBÚÏz|H“p$´cÈrÚï*)üm€Œ™jE¥×²±Y_ɸ¬±l`v +±§ó+­u&¯uwH‰»ŽÇ‹³>4·ÀÚ|N`½@ ù 9¸nØè4.d1¤àvŠí,"¸Ú)&h»ÉŠžÆd…ÝM¢ÂÏOJtßdÄO›¢â¿Y¡ÑobÌ½Š +:í +ŒÞÍÒ¢3€ÄÜÁ3-$äTBа¼Ò¶xØV°Â*Oˆ‚*w •'ĒΪ v UXi +±§3#ªµ¢;yíŠ)aõcP\ý†)¬5˜U�aÊ*MÊé¬åƒ“¦ªQYGHR*S ’*{QI•!1åb€’ZŸ YñõzÈ8[3¢â¶™œø¿ ‹¾¥b‚¦¡”èeZJÌe„¨ÅPBÓbB®§ ¨ë'&º +ˆNaŠ*÷A’у–Öy†òá·=‘áÝ�¼øiP`tß$EïORô²,!ê1( ê MTi>@g FHg®žt–ŒÍZ«¦b ›ù(ê�QÞDÏ ¤ŠÿÔ È�á 韑¬ž•1Yµ)8!­¼¨œ¼¸¤­/ÄšÖ��Þ_DBo­Õ®ZftG^tç’İí,0è¯ÅÝv%†74"ÄF„ ÒÕ‹²ãÏaÁÑñ¬¡ hR3F©â pB«�ƒlÓàƒÛ¦À m9ä[�3·0¸_ãdUH@É ¨H”—^é¤Ö/MD +XC�X¬³|dÒª ~2$¨Ý®ž´” ÇÏõƒS*ä×ÚqÙ“R ¿L ›×�fТqÑzÂ’Rzª€Ç•"ñS娤1@•f+RÂlmÈ ³ LJiK>:§o¦Ò¡É­Ð¤´†j]´‡,oC>knÝ;Aá/µ»vpÖK¦`ûHÔðC‘`¬½œ´r7Xa¥e#îyɯVDÅ-gÆÝ§¨ ' àªåRâ)Sñ°œ«~XÎõýlIŠ/;1QûXŸK¢›)q{%(|íD„¯� ¨Ý˜À°é¤äèzQv|³*0j ¸Êœ„r%\AÝÊQLÔ^ +¯e"¢³òJWˆ¢:S€r:oñøœ¹|xÒ†ˆÊŠŒÎŠˆÊŠ�Î’”ʘœÒ”°ú±Xׯ!–•®‹:Wˆ¢*kù़¸¤Ÿ@(ö%Õ‹JŸ „Ž6× ÐY Ië¿`ä´S`BZo¨âJAa�'Ä¢Ê ZPö®  ó¬§,!ö”û%E•žÀBQ:‚Ò9‚ҹ“Òú jfŵ極MAÝ‘Ù!!�¹z€ÎW1(¿„#¡5„"£sU ËZÔ° DÉw}þ ;>¿öM‚šöƒ¸¢ÍH^»–˜v*“ F�€$­TúýC—„ŸGœwß ÒuŸHÍðð쪨ֶuÝ’6·[ì {KeDÿÒÂ:_8 U;à•îYTÐiؘÍ 1‹ ÷ ¶bXBÐø _ÁjÊKÀ4iáÜsÉ' }^éà”¤ˆ¬ „w&ˆT0$=ƒ“½‰qŠ…¤Úô>’{~)õÐ6âûqÂsÞ&üVûPêy¦UD¢1èÐë$æyŸG¾DF籪¿Â“SúÀÅN4:XmþÑW:.ë(�u+âò ø³~\ÖªœÎ¦ ÎVcêâf˜¼³\× °6Ò‚ˆÎdJ>t NN¬¸ì N8ÚJ¥ßÏÔúýN¯‰_*†d�å#“N`â±?…h¤µxxÊ‚ŒÎZ::é©””ŒÎª°ÒbMX}‘P™ +Çå\…£’ÞÚñ9C`BÊõŠr:+0!Y7±.Ö–¨r5HaM@âÑ?½2þ$Ñp’þ©µ±+0Áut¦R�Ù©RdÖ[8¹.ú#m¢LAÛrï�þ(ŒþÍ¿Øug8µ¹GrÏwån¨âJcáØ¤“H¿ÿ‹gû<úõ#ÐB*£g°"Ò�öžÉ½(Ó¯K­ ì]j„cgRWÍ�ô]@Då®  ³ÔŠHÏ”îK«âzKG¨l¡I«|¡‰*­U£“^:û«‹>ÁÈÎÅdÏÂÁ9cÅÀìU2({ÔÈ~äéŪ¡YOb*OPR:gáàœ©VXz'ÖE[(Ð.Ò$²ìûS)&ý†%ª>‚QÚ§±Ï¾1´«}&û!U‹âZW0‚:/�J¡�ôU(.?– Ë$ΰ}àT|+‰‚´2ÚT+*½‚�>�=‹ýÈÓð`Mü +J<îˆ÷|åŸÖð�dŸ}Zˆ¦óA˜ƒõ“Å€5ÑC�H´¥R@þ*“¶‚�6&á÷iìsjmìP¯Œ_iì›TÅ~A +I"} ùþháN¸‡±ÏEÚ7ƒu/sw¢j¡G0â±ÆêAé™Z¿&0Nκ™i³p¿ì¥îL›³ˆ—#Þ›cðà¶3‚o3R©!Íß}ó�ó‚nuŒÞÚ¬ãx×�Dý‘W3.‡:ë¡ÎÁZHSðgòïjF&�u#³oáÐÄ’‘Ù™L•‹ËúÉ•1'l÷sÂvŠDß «¿P%u~ÁX]þ$Ïï}Äi¨„ãýàFhͤÿ¡ìó5…s´N£]wr]¬’Á)gÍðœ”xôB8ú¨ŽM©ˆö�e¡W +ÛX22;WOú)ÄbÊôë9ŽvsÐf ý¢‘Þú*K ‚*O™¸¬›RÁ§ˆ_JEe=¥Â²^PBÒ#ðÐø‘<½6‘&!’^‰H(‰6‹öëbRéágR{)“Ý��Ððœ·ùÆyœpÝ(ªÜyÉF$õS©ÀÄ‚±YsÝØì +><ÚIšà;Hòïºü»�@ ‹8«XXz%=¨áÇñÞõ™=:úgòÏG…pô D8q2•†í©Š6iâg2ýÞA˜~F°­ŽñK›o¾s¾H“0ÁˆÈ.•"ò;±†ïÅ>Û&�îç â Yz"LCÿ$"Ñgñð”ZAÙ‰2ùþŽ¢ÞÌž\Ÿásë1wj4LÚ C‡ÖaìÐh·ŽžóY7/» qË ¨*ú°%©_ÂS9HóÏ¿Ð�qcøØ¶A›‚´UŒLZŠ…¤Â,œ�6ç¤Tpm„¸F=ô>@ö LTk.ž´¤ßÇùÖý£ÒB?CrH“°ÿPöy$QÃDbW`B²®zqÙŸZí#ÑBAGŸàƒ¤g€BÒSòù©VXº°ù²zɈ´njM¬4ûj¦W°Ç e•.‹õà)@1•­n`ÒN­ŠÿH*}aéÇ0dÔžàC´†buTû'×Ä; +ģϊÑIK�¨ôZÃU-(ÿŠJ¯Ô)¶“DÃ]‰ÈÎÀ„¤"‘X#©zë›Å9Ù&L73½‚ýÖP.йAŠI¿4*Æ¢Á9OXRJoåøœ£@@æˆíê K@?„)ø$ÿº‘æá?Кø”hüZ72û%¥ôW‘Ôúë *}5ƒ“VpB²> *¶�:½4ƒn�sÁ:Ää­ÉÜ&&êÀ7ÎØ~¬è^ˆm•�T}Ô‡ÆO¥³C±6~!ÈA{ç‹w6TùgÖt +îaÞ<Œxö‘¨¡÷RZkH"ÚÕªáI?öÆ>�úý RDmÚ<‰|Ÿ³Ð†zeüW.*¿ÓD(“ï×¾ùšÂ8¿Ƴ…&ÿºP�öëâ/Ò$ÜIÔó;Š|]HS°eö&Õï½@Åã_€"Ò#ðЈó­¢ôH˜á™wׯý>¹Zf®Þ ßuo +ël;4Ú%íkùÍã.€ñ100 ÈÀo¡É)ÍeCTNõòHê!ÑØ‘@Á>'¬W‘ÖS2(i0&i/+´kDXÜv4\ ÍFDü GJ=ԇšLBÀ¸�E½¾¤ +öU8,é KN?… Ÿ*Ť�Tñ_•á[«9­˲}î×ÔkG§œ¤ê­‘L »Žu—Й� +ÌŠcMU€eáˆ(íkúeä´{ )í\78ë*–ÞI5Ñ^* &S°íÓÈwMÚNªŒžëg­Å‚óG}p„ruôK¡aª•ÑŽb�ü‘ ì +Z,z8Ö@š4¥Þœ”º„*®£@PÒ~˜r½ž¬Ê³6&§=‹‡§Ü€&-d)èqÀw]GÏÛÒÕ7Þº^¤IHÔ9è—TÁ^k‡&�!–µ¦ ätæ²A*ƒYõbFTï ?NûÖÄÏm-ç�!, +Ç.뢻F$†ï`äC�ÀÃdïQ ìA‘�·¤ß !ž¢ôë>¥*Þ +H0ÚEš‚÷Žx/BÏÿEôöú±f\zFÀ�ĽßãÈ·$ +¶�8 {û<�%_RiF»AŠÈû uñnòw•<m%Po·3ÐŽÁhWµÈ¬³nxÊV12ë(�ý(Ôëkã|ïÊF¥·dôC"JyþžG½§ÕÄî +Çû(tж9”û.guŸÁƲq^»³¨×¡@8ú¬šµ�ˆÿÇÒ¯Žák“³pv™ËY]s§¶ÍIÌ£u ódK>zH4�^ðB’öLBÜhELÜaO\k FJ?W N$øCéçgß蘿5®§ mU“¦0D´C€õìN¬áûÒ/ç{7dxC}x¬«bXÖ N@2€1IC¥X¬©p\Î’ˆÊP"?©áor w«˜4"¥ò„"¥4 ¦´XÓnAȨ‡°C”~b]´q¼v_f¯�® „û7†t F<ÚX0.=ƒ•ž)Éñž1i?�6Þ<Šz6¨¡ aI( I© •‚‘® ÇÉ2€oÜ÷9Œç�Z;…%«r†,®ó˜“ÖFEÕK8B:[ÅȬ�D,ÖL¬âZ�ŠÈz� +È~5#“NàáÑ’´sñ|¢�dCâZS(‚:kÉàì„”zm×{,( Z Té÷ÃbWý5• O®Ô Ên€TÑFú{#ÍÃO(WËð¹ÕL¦ßî– Lß%£óC½2~¹|×�TÅwÔ‡Æß„¶ƒ*ýl˜¹´šß²öå­+Ïü¹u È¿¿ +¾�< oñ݇±3›³p›mëÜÆ=۪ťŸQi'…Þ4{q÷Ì�›mHgÇÜ­ùlš—o é>ƒ•u†)­ô(©=‘R™ 5±uz=‘&!�d`Rè×κ�Yg€5µÀ~Ò=‘z]†ï�þ�ôûO¬‹¶ÕŠI»É4|Ëà¹ÕÜž·Ù·Ï Òü뀌Ί”ÒM«b×ÇxY† <ƒ/>ö•! gkoÀs5OåÞìséGß(ÒÉH«†=ËG&m`5ÑßÞu@;¿ÃhwÓüµÙ4ƒn©ÓkS©¸ìJ£b¶«gãèptø…2mqÞ÷kãx÷((9�1Hi¥�D ý�ˆßAQÙKËé Veµ_€bZ#‘hm +F…hüQ ¯b`ö®�ýì'í´ªø�*ý²q~�;£eøÚ¼ Ÿ[½¾3SúüÞE’…]žðž=Ix+q‚»N§Š·ÓD»)4ñŽzm¼�pô +¨¬“T½uÖî‹q3±0˜¾{kzØ% ­»~|ÒX16k- 2ÇD è—ZÃ4×�PƒUz ʪ½UÂzk‚ú�Lm¡IÀ®Í¡ÜçYäë–˜Ê`IX{• +Ìþ´Úø�Rm¦Ð0e¡U Nšj…¥_*ý~ ÈÁõaÑÖšÁY[½ÀìD—„;‰yh|þ¬˜}nó ¡�Ç9´»kç>MŸ\s×S§F¿Ä¡Í2}k5Íß›·”û>�}¶Ðå_—†ð­ó9Œ§Á8жy¨‹_iô{ÃԩͼÓ[³šv1«i>¶aŒ[€ á…Ξ³jhÖ°ˆàZh¢*S¹¸¬ ¨*v%Òï_E´¥PHú-šê•Ñ#�zÿTÅï¤Ê(ˆ�;`!!_åðä"¡~i&Vq½€%í•…uÛ›° o'-jn“u'­=ƒ”WÙsN@ÂÑ[ÕÀ¤-¿}ÂÖí—¯\,šó”‹ÊºÁ‹Ì9ÉSìoï:�ØÏG€E•3@i¥¥J`Ö>�~>omžñ›£YcŸÏ²u·.h]ËííÖ�Ör»LŒsˆ€�cMmq1/¯Ï?®‹Û¢ÑÃùÉÄ#‹Çæ<K*WB–SÙ'ÓOîÁôÛZéÔr0@ ®]¥Å†-"¸ +LXÊD™Þú@+cMA‰ëvŒ +ˆú-6Ư[‚ãÓXZÌ¡õºâºÕÆ’ ·F@|¯%¨3•‹Ë:êCd¿ÐD•kâZS0bJKP‚*puœ‡< ç&U±oÀ“~ Z@wkÝîìZÿ5�nf4€n¶¦_AǾ E¤gà²eÎ1~kY¹®&ÏMk3x7ã€ïzL7«foù¼ãZ¸†x< BÀ³2#ÔÃy눩ö +ö3»f�qnYXLž×IÄb]!×m-­ÜªšÜ +Y^·hÝ"¥"ry0÷¶C¤†[/xЪA©A£=�á¿xå&`AÉ= +ýÖW><¹eVJÌoHjx;!2º·’~mˆŠÛŒÈˆîWßõ£”+ŲK‰(÷€q�“˜7ÓÎÉ6^ºYÇoމ̣•RÁõ(¨²×”U®Ö‘N9*…c}TjXÓ€ßf¶zŒ×Âb϶Bž�ý&|'gç¼6Kg—Ý8ÊÉ0�gÚì=ö’×Õæ8ÚÍL0ÊP•ɪ” Å¬”�%HYÝ:�pœ›<(ÒS/0gª›r‚�U92e)&i£OCŸH¿'lW� +ÒC ‚µ ˃ä°-!汤ܤÑ0=¤iH+™†;Të¢ ¥úè¡XTˆÈ^„éåôXïrµ1xkõѦ׮r!iKâù1ð ½£>0Ú>�{vv­+ómXÎaB^!ë‡RjÀ·ªºdã´:•w2Ì_™Ë,‹çÉb +×È–@(n`9-ÛºrJÆV’5CR›a"¶kO^ø²+#h,¢Û«�s‘%Ø?‘pœ»Š€Î_ ´Êp•¿ h•Ǭˆ í&)ü�DÅçá#)•�>½ý@«cM¦äÕ!"n±Øµ“+$}󽓙RÃÞ‹ ê|!ö´kÕè̲ɲ˙VΪÍuŒ�Z¯ù›û:á¼¶«wójL@î‹�'ÓÀÇ0hà´ïe`¼Ø^AÃ.Æa¿pá·¢zÀ8mq@Rœ +ÁGËàóé·�°2UPµT<4¹O'e(‘²V�On…-«²—–V.�tM¡w'pvÀÄtû¨Z)™Ú[T·Ý,ÐxP~ÔsLvô™ + ™BZ©™\±¦Ü±+ êm•´•³×”UîW×y,Jˆ:L +ºSúRyAŠIÍ@Zˆ“P~"á8�~iqž\s8'#(áX‡iy¥¿° ÒS7&i¥Ö0­Ôú¥{0õæl]]æG�ͶÍ<•{³QjáÌS™7Ó|áäì[ãc0pC†¬Ü÷¶dD’±‚µ>›ƒe zpj)$ðªM bRN@b’¦šq93�.Ö PHÒ[F4i#ûÒ+"�!Ë*½ã ó8ð‹jm<\Ü�¤ÒC•…¾'ò�^ B²Î@e•v€$uë# 8#�*ÊeSJж6™’W_õâ²×øÑy;µ^÷oílŸÅ>ÛÆÏÎËø­ÍÙ64í�÷ŽÖ�Ü“9WCw %�?è’À¿*P€áëneþØd<µ2Á¸­Œ œ–×0p¤!|)gwbÀݶœtHމ�Yl1$ Ù}Emë£ ÖÄ,É‹{®sRë—~Á;#sAënéä +¡ýY^Ì +0B»Í¢Bvƒb£Ÿ]™1ßT + »ThÈdYPp)dùPÆU„tKA‹ë¶ +Ç&HSpî™ü›*ÿj$Ò/ýô!rΚá9[`Ò*{-Y• ¥ ù¬1dÁ�cKô PLk#ÐÃnäiè)0 ­$�‘P¿ô‹ßçò{ ŒŸiÃdß¶C�ƒµŠò�¨à¬É'C©pœ…Dç>¶-ÿdaÜ ËÆÍd7ŠvÜ PÂmR±ÖÀÈ­„<”]XÀDÙJ”}@ÅXY–²^·NëŸÊÀ9 ‘n`SöšÒÊý:`u¾›”°Óž¨øU=4åìœM–�ûeF$β´j«thÊB¤ƒÜ©—r· [MˆŠ›C‘Ö® +¶q +ñ¼8ïÞçÝ:Šu]>8ïbÖç˜9¶ÏÈg߀íê¹[v9ãŽeݾ–�…uàXàXàJ> 8â?3¸Ø/K=­g×e�ŒC¶o{´Ã\êd Ù¿î†VÀ1<.Ç–H8’‘j‰>½2�eጠ„äÜ¡J 9!¸œœn½”´—–U9AŒFšA‘µÖ�h£G)ë¼ÐW%u…1r¨�%aíTû’i¸# I/¥Šk¢ÎCšÉuq¶PÅÃö&2¢;+akh¢ZK ‚Ê¥{:k‚ê¯`LÚ@‘}]˜»´:›Vo]Îê2³.VÄù¥½¦´ryûfÞå`o  ‹{9ðÊÆÍd0gܘA5mσz!¹Í0NQÆCú'–Å£Á8œX…!‡`áûÃË #™ÒEWL�[$ÂäîZ‰Ao%Õ"©~e�D>Zçq�[a�Û9'6<ž“�¶²‚®�Àëv‚­[ +|ÐjX!ÛÉñϤÜ�-dù =àR^Je”‹B i¢PBúÈÔ°aö£Ð/-µSހŕÞ.ái&%º?‚Â#'þ*æ10娎þÇÑïÖßÙC™„�ænæ÷–×¢ŠÀ£ž¶x—6OÖcéÇ äþx’]9ù,›³¨˜»P%ûáôŽ­&Ž= +õv”ÝR66Þ!FaœB¬ ¯bZZTǨ`AË&àC™…” ÃBbJv „#É<‰"Ê@4ÊI©àzHT�¾R¢Þcbã¦`€U.N¤Ýö§ÓO®ê¡É¥`@*WiU< ur- 𺵣˜øoCJ qxòÚ“8Ã6Ò%âýDºh–àUŒætŠx¦3˜‡ö¢Öý|Ûr±¯ ¼/.–CÖÎó 2p,ø +ø­!Œ[ØŠÀØÏfŸöåïã7Y>6aB ¢§$”®Æ#6t'CKKC“ÇC:ÈÀQÆA�Û,0¹ +\TÊž j1 `„vï�_©ÊÙ×ÔRn„'¡4XÖž†$Å}/QñÝ€À¸Ç–xèŒ�ÎbJNï +QTe)&iÊ@Y§qo~ú)cÝÝNˆUå2HQY3�†¿„%¦²Ý#„Ù$«õTŠÉŸSh×å~ÖrZ+Æ»[2/—BlêL¦Äƒ{ò¡®¼ãò]ø„. ük«ï@á‹›…ijýŠ©�‡h#�(ðÿÆh³Æ(6à¸îaØIá—ÁÆõî«ÇE!ã  …k˜ÀY;ÆAU@$ד�6B‘îbbºÝf!AòàÑ…Äq 1È�{­‰ Û EâìS9¸5@b‘kO‰1+Æø‘6DÆ�õã“[Äù¥‹@½4Óª"¡I©üàˆ)7¨°ÆA´«‡ o(TG�‡Æß¤ê8™"ÊG§…õäÞ ³—¦}±³¹0vfôŒ ÜŒãÍ«eüÖf.6Æ·¶*ð%]<ð»´²—;51¯]¦”ÂÆ2Æú¸GYØx†Xؘã$`Æ[2Øã€‰�³dp0¾�kü�ƒ@pè*€± cdÆ*È´ª Ž%¨q©ÍBªÅ ÅƒÌA ú�’ÓmPæ ]CX'‘ +ÎUB:µbÞ2”{õÄS‹A\ú ?&E}À¤œ„ºÈ•@ÅU›²Š +ù,I ›Â~�ƒt&šìòxñÒ~÷Ú|ûÖ^Ôì3îUAŒ_)�Àå SZe­Þ†’Â׉ÑMÜ{ø#G—FÒjö³C¡>ÚJ¥‰�ô�›UÄ“»Åb‚Æ�ÅU¶²áÉeBMì:�ÚÔ”„ÒI¦ßÎ#î{™ëÊœ[ö’g¶ýñô“7 €· Ë ¹†cÖPdP/0ɬ¤œŠ‰�iŒQ³è�TÃ1lÊV0?2ÖbÀÌ©âÊZég,àik\‚¦W½ Æ1ÂÒ°1§Eqá¿ X�-Hi•¿øÀ• ÅµÌÖ‡=ÇdGW{"£ÓÅÒ°ÿž f3˜ÆÕ™¼ãn(ÀYÂ>�Á¦‰ñ¯Ý Tb‘¬°É’ž¸„Šïàp@'�Dï˜ ŸÞÌ›ÝØÐæãØØ‡˜à,Üð-5å�-ÝPQäƒÄÖÆ48 ¡ør°9¥Ó0#QC„ñ cc$`ÆC,(!@œ Œ[0"æ¶x`‡<‰†‡#½ìpn3?¨ªÇ°c’@ªÜ‘3bÑêXuƒ’õ–ÌúÂÒŽ6Å…�¼‘�p�Ûæ¡â—1Akɕݔ«~xnû´^ç¬#¢Z¦ŽdZðÀAnüD 86`ûµ‚…f#€�-V•Ó±¤b2©'šdÆ1ÄúÈØÜxJÙàX Wmœ„¬ÃØy DLáÀ+ c v7Ýx²4.D�aLøy2 !Kj†Å}–�Úâ;‡¿ð§œ#NfÅ`F²-l¨upÛ$"Lg@ u6Ӣ‡À•> Âë{.ël$ÕÁ_E“¦°UæòáIÏü¹uþ…Œs]yeåÌÄ(ŒWt`Œ’@Ÿ,¢€Mh-\¼1-Ú8v ȬñŠ [ãü¸ +˜ádÄ[~æd‘¯&¢�ÏL/š™G߯èð5®òu5âå`[Á/Æ6.‡µ±8Ìc4p�‡T›:Ð�òÈCƒn‹3jð­ßRâ<\'†Ïð œnFù0d€Jf_yQÏI<ØU1.ë¹µšw %E®uÉÞ' )n  žÈ}³H¡ËÆ+¶D¼d\ð ¶6²ãà 3Ù–¡&“. 醤†³1•b*Ôkcp¸Ç „iÇd/€!nL1ÀXh‹€«€” +€ü}qÀ×Û2&ÓŽ €AÁ8Ç„˜]0£sxáÜÅÅò§Ë`ÅË®ž¸ÖÑwºùáM4@Ühæ‡÷ðžÕb2д…ÔBç¤q¥ ¬�ÑJ"a±“)=®C¸÷؇PË:ŠŸsµNWÖÀE¢ôÂ#Kº�%\´±-=þ1F6†í€5Æ€J)´jèã&aƒ@€ ¨€ÛEüËPÚH@F_éP6FfaLƒ V°Ù!Ø5Ób�Ë%RÖâ^‹ÇÅ¿ à3ÖaŠói`ÀµR<ŸÛ:ÀÏ4q-“·òâM4>0Üèè%Ò¦P6Þ!fx@“:¯É ®H‹î}%…GCàEG[`Å/K€‡îu€T®˜FÌo +ð÷ªüðd01Gí¨$‹ŠÝä�ô#RƒW ïH ÷m)€öl€0 ã(_Vã�àéõÓÄQ‚ì7B̺.—Í.‡ü ^Zá´z�D>00!¡k<¤BÖxˆWÔXÆ„¤ñ+#“[/䮸åoÀe\Qžâxp²¨!þµ$Ä) q®¡ Þàf(Ëc" 8àâç'��qH1ûX7Qæaç:làdô˜çåïfX‡«¦WG NE¡™žEüþÆ[¶~Ëá�ŸpàŽ“„eÉ€`ìÁ‚“I +Æ!&@© 5nQ!GˆØÁŒ @-†Y8I³p˜@fÙQÌŠ‘aØÆÅ_â«�V2:¥`T2à—mxàÅñ2Hñ°øT?šâ>ü¦†æçLJ×Bal2è¡#¤^!Z6 }Äbþ€Í4äQçG M¯Ž™‡9^dæ`ÑéK©º$�’4Å x»ñdyãʼÆG.$«ðê ò�¦Å_�oW•J®Ÿ+šŠP +Á¸Å„ã^Qc–Æ"a±ŒïŠûM8ÀÃšŠ¸”gŠñáC1>|æ‡#Áñ¤ ®ss3Äyrdð8TÍc,6Å=B-…`©ä4óÈw³‡4ÑרºÏƤŸŒ4N?]—Ðe¢˜²ÖÙŠ„îR·D,VºÜøÊXÛx‹X…q ÆY¼ŒÆ,¸p¤XZ½ÀxÃâŸô—›ây^PüS5qšACÐĹŒ�øÕÏŸò9âR>G|Ê'‰GX2Àµ ž¸ÚÖÄ €·U=ñ HGœÁŽWzéáF722/<Æ@ÎÐÏF +Æ?0Ð�¥”!:�ÒÓÀ1k£(0–¶ì–±†‹N/Ž©‰6‚hNÊ ÄĬ‘¨¸â‰Ù ¸cc*¬Æ8*‚Ò¸…&–U4@­²*ÞpSîEq8+œF�ÄÇ q +CI\‚чP„ÄµŠŠ¸Ñß"*â]DB|·°TÄ)8ñ LMÜK‰‰'À9â>Ù®Ãwø Ó�±q“ ša!D …H1õ©BJˆ�ÒB$WH �L5$¤ӻÃG'ø Ï/Žœ‹7B1!w86¾.i›3ȶÆB¼¬ÆB&�_ä(©Ìz)!gÅ%Ëp:KüŒjˆchâ^FCÌ鈋)8â5•¿­”¸˜“s*â’†ì q¥ ¢ìâ>ü†ëð~“üR}U +P–þA:ZXHé “,¡ƒG° $%³ðÇ L¯�œ_I8Á4„hŠcŒØ”¤aI‰ZÄ.1”›nŒ…ŒÂX‰ãnŽ(neG´IñH°&ž)æÄ½œø\Uo›bâhRL쀿â +x€xoºùánˆxSÍÊñþÄ{øÒ 73ÄÐ q¦› NóÃsxƒ¢¢§1 +‹3 øšß ¬™„@’`Ââø ]Â÷é„Ró{#ç׆�ÔÄHJ 2Ú¸Æe¦�°di½ÃTüÛ8ËX‚± +;N»²ªfT¼(ë“ݰà)Âøˆ…KÇ!ŒŸ‡°:J “<1=$òÕðÓC#WBaŸlÂÙôæHâ ¾QäS,£€MÈ>_‘¸¹� Ó÷¨5NA¡‡ +e׋‰5,î–€Ó50ÀíHü, +I‡ð3Ä!øñ® !.Õ#Ääñ)Ÿ!®§ˆ?Ýñ"!ÞÃ}xßÉò—.³Ãy¸ßqáÙ²¬÷¸`›â©¢‡?ŒŒÑò9h$‹g¡-ž‡?¢hî¨ñ‰Hƒ†(â�¢áI@ÅüØ„„!*yänÑÄ5¶1± ã(_9G!ðNm FFük(ˆ�-qŠˆÏŽøWpÄå° ð6,¼Ž ¿¥ž¸¢#Þ §ˆGÙq¢lß±�¡áÙ,Mwpu K)ו6V€ƒæ!�›‡;rlzsÙ4ôáCÓ›#Æ&â šˆ=P;u�jŠ{xr*êÕüâh±Ù˜£sÓñFçæd ÌÃQìcrš>à–aR¼F€Ä74ñ¯£!NæTÄ·Š8Ù�$þõtÄ% q,!$ŽõsħnŒ¸�˜!ÞÃyjh¸ÍŒ Ÿá4^ x�ŸXÐLôÁùyø#ç!��^76¿5q`Þ¸ÒŒoxÅÔxsÀ¿p BDœAM?ð¢Ã�`vøSÌ_Êòð#îÃxrÙáI/AœÈ¥‡ßð.Ãmø ‡y±B° l V9‚ÊšfxH§&¢�ÔÍI!ˆ›™A 73ƒj&â0ÝüâPñ ÆQ©·¬)â ¢à:>kÈèL”1‚Ó1)£%lmc:$�Y#¸ŒÚWÜ�BÎEÐı|ˆ¸ßá;4\†ËÔðó“Äï U÷xK§âQN0œ^/:¿:ht1"êõ[Š˜#Vô»# ¨w’Î/¢ˆ6Œlž*±kÔ¡Ù™:$ÏòD6Àq®Ô8†˜q¸\—nÅ#TóÂcpø Ïá8œ‡ïpnÃq¸�L–¿¸ðlö…¨(iÆòÏËg ÓL�Eí|dÔðÐH’KA"A2¿><|Z kzx×¹iD°ò‡ã¦âŽÏNÈ�Ÿ–Aœ§Jî8]�Èm²6™ã|ì1™ ÞáA’E4Ã)ÈÆI0dQÑ´¸Üƒ(~aèˆ;Åôp"žÃø §á40æ…¿Ìð.“å/1|†¿ðÎy ¯á8|'Kĵ¦dÛ¼€F(~i�i`à@Ë)†%Íô†Ð4 bbó+„•“1Èd§#,¥§¥°¦#�ÊM° �ˆ3rt‚oÈèôò@êÝáÂц Îï��â$8gˆR’þàrÀ¬aLåk‡XÿÃ0ÅÅ àO3B1œs—,ÏòÞÃÛÄ`ûØ8^`;7ÆBÖÇR8´�µˆAö0ÀÎ,"¥ó°‡’Íï�š^/6½;PhzqÌàÓH±)¾±Êɘãs3G*g"ÖND4<9�~~ùãôÐ.³€&j“C t­Héoc-b +Æ!¾‚œfl"òpÝ ë`ÅôÞÀ±)¶áúù¡‰\$,6Ûøˆöp¼EökÑ +Q¼Àײ¦8ƒ"Äs¸NV†ëðÞã2Ãsø §á0\&Ë9çœgù çœsÎ9çÜ…Ãp^Ãox Çá1|†gù Ÿá7‡ópnģТxœY±1 �ÞØNK?'6,™Ððìlâ> ²c¼£ôÐÈ!�˜„°:6½;Ph~{�Ðüæ(‘ ¦Ñ"ó{C…æ÷FŒMD&6Å7V7q¤r2âøÜ\äѹéx#[Le9u9tÎÛœÖVVSU—›VZ—ÕU•Õ•——[[–ÔÖ–šÕšVšÕU›ÚוZšT›—ÔV–ÔšÕšVWZÚZUÕ–V—Ö.-:¦*®,&¦94,«)*´·»9¯¬65®,+­«ª´¶,©­®*.)+-6,©5*,-)´´¬4ª«ª5m킚–Í �n–Õ/¶5;5¸:¹S‚¶*¬­´¶55-´55).­®.©,-+,)®+4,)-¶,.4¶-µ¨ ä½=TEü@”€_§Ñ®ã„ëêžÊ¾Ù Äã”ôQ§7D£”Ièqð÷@ò%ððhCyhüN­Š_ò�~pĔۉ꿊ÁI'‘z{ÿ”<m IÀD ¸ Ĥg`bÒkJsÕø¬©ZdÒUdÒW12i‘«L±ßÇ1¼ëqä»z±YW±°\QÙŸ^?Ñ¥á?êôV±øqô<Šz9ß»#PC¨WÆ?´)è…2;Siø/HñèŸV?åŸzèóÈ÷iúæ:Î×Î3�†…:ÿ>�$ Pe¡?=ìRí§TG¢ÌA{AˆIŸÕ"ó/iÛÖùœÄ»®DŠø�ZeøÖêšÀºžÖŠüûQ!=©ØÎ Û}¸4šËÛ2® ‹¹k£�@ í""‹< ÿ xÎ#�zý*¢ÿ‰ôû:‹zõMàÝW"ý~¦ÒïÍ#æ»q¼tÿÒï/ù¡T#ûRiIÔðqÚ7`:ocç ¸‚±ddö'UÆ_HWC8W+•&v,�²ŽOÙR9*DåÌ”šØ�:¿ÿhÔÛ‰8 ©ZdÒ[:@e&U±—ù{“]âú˜L¡½³¨×·hhv =Hë*šGš`ûÉÕ±3™&z"KC?¤)èƒ*ë¦TD{©Tì{"õ¼ `›ü¢wscÕd§ÖEOÕ"“æÒ1*S¥È¬•@ÃE›„‡wG …6�?)ôûSùg5Csæò1Ê�@ä”H“Ð7¡†™J—L}ûºt|ÖbHZÿ–ˆ«íµät–*Aù›Pà J@~@FçDDg ±¤s– ̾€eWEü>‘| PHz¯#¦´ƒ£D˜„¿é4ñÇØ¬¨&Ú@“J£†· KÏ…ä‘§¡Ïd_'êôEš„C™„] +…¤Ï*Ó;±†ï›B;¿#Ö3 +-ô<Œ{”€ßÆ�®ž l«ƒ0{‹vŽþéUñG…hüZ12?‚WEû¯£ˆ§ƒ˜÷gúàêE<$jø€€üS,~(ÿè£N¯Ïëyþg-ßÖ&®�Æ’‘Ù«ZPþ-™�ˆsÐL»�Ñ;«qÀvuŽø®ÿXöÕ1vl´�å ÿ�ôû1zjý… ÍNïµcô' áèo¾s•…Þ§±Ï>ÚôÚO¯ŒW/4ëJB¬—5�$„Í=ÂWPRZH}¬OÁþІf !ˆ(}5£sæ²!*k`ÂZg€ÒJ'ÙgÝh—µ¹,ËÖµ;â½=B먒µÔD'ÖÅ“ÈÎ4ªâQ&��ÎÒý­ �4 +ö LPö-6嬟3Ô+#Óhø6Ú,ìþ¢ËB[ŠÄ¤WòF<Ç9Xgéø”-Ä®ÎW/6k©bû¨óû…,}TˆÈž`DäU±-D)ˆÀ•Ñ–à#´Gð1ZS¥¸ùÆ=òY�%Yý?Ɉ[ì ˆ K¿“—V× Âùœo^ŸB!éÁŒ ú @Ji%PÄ_Ä9x]:àÑYK�€¼¡Zghv m¦Òï�úýOĶ‚‹ßÈÓÐó0êu~,–ìggpBÒuzýR¨Øf`‚òé•ñ#¡ø‰>  ƒwË5†p5Ñæ 7âôú'$ë,&ÿ�ÕpÌœ[³×F×ÒÕ8ˆvuNX¯fjýþ,œó”‹H¬‰ÿ@ª¢}•ñ7PAérËÛ™=¸zÉñgå褳ddv¦ÓðŸ l£yW»å[01nÆåfájîÍwÎó<îÕ>�~Ÿ)lû8ò}˜¹3:×Ý +a~3>}‘J„â§9tëU.$í'TF»� +Ê?u‚²'�ÚI ‡wU Ê´®$•.ÂÚmÓ1BíÎ…Š¶¸+жEDø/àÔ +H›«è¬U£“vK*‡E1ÏDDü DNç'VÉšH“ðï(ê% ñè�Rm(WEÛI•ÑK�¨ì ^#ˆpìº!:oÍø¬¥LXv®‘A”v‘çàW:=°¶cxÖR#*{S*Øn"÷%OÄ ô»ø—TÁ^ô¯–\ãʶq•V¿½‹È(�ѹj…¥Gú_ÉȬqÂtFž†F˜Þ¾6Ͻ– SgÖ+ 9­»BJÜv’ö'¨5”=G©ôû‰2ï#A@ÖL¦‰ŸH³ÐHóÐn "ògѸô[3:{Óib$ཱིˆ"ÑÎÂqé£J0zªˆ6R'bФ ¿±Ù«^\ÖN©Žþˆì  &~©”Ý�ÎA ÅÿSÉ÷iÙ¼ÌßZ�®3€ªøŒˆüP­‹9`<�ãÅó6†v5ÏãÞ�WDKÇem%ã²6Àšè‹> {©×?±.ÚP?Ò§ámC8×o¼uD™‡Ašý…îŒËoºŒ×Ü2ÞÉʲl†É»e!KA² §f~”v G¿ÛPÎæYÔ³uÀxöPå -ó‡Öaúº3GÓŽyíppz <@=�7ß9­¡2…ØT¹ƒ‘Õ?¶ÄCŸ‹€°Ë‚°Þ BLúº6ºÈ3ðžZñh7�‚»M«b�d_�b’æº!:G€5�¿†˜z/XÒõê¨zØíQÜëþ8úÙO«�Ÿ‹FgÏr‘i?µ&ÚK¦¾ÉtÑS¥°ôX/:鮟4× Î:�ǤÏÃ[ñ�‡ÆÏUã³Îb±é£>8B¹:z¥ÐðwB]´ŸL!!ÿÄ u"ïd¤ÓÃnÀ5±3¡&ö!(k?L¹œ¨ri%n LN»VϹªLzèrðÛÚÑ5ƒrõ x®ÞYÔóK¥âl[Mó±c6€tvXÓ¢…Aµ7(Ií¨ ö>Fg +@B=áW*ý6XqYK�¨ôD—†Ÿ'Üç‹.½^ŠÄ¤ï±é©RhÖ<‰|_Ï­–Ùk£q¾v^Èðf* 'VFÕºh/(!é£@,þ("mPE3%OÄ; ôðþ�ôûD›�w”F›ªE&͵#TÞÒÑIOµ¨¤´.v L¿Þ#ÙGuÖ^Å�‰4QG|§4jxã€ï:M \ Ãg&gß:™KÚ–ìÅî–sñ¼Îb^Ÿ Tó4…o5'a‡#¨ö”½“ð†zeôD•ƒw ÞZ­³Hw˪Õ.iÚ2^c’ ü¥áìš7ËVokåj¦SÅZBSYN2Â_p‚JW¹¸ìN=Ó(¸ ž²Ü³‰4ï"˯‡ruäÂáIS8BZo½øìH�†·Ì^ —FÓðÁ}C;$oª’öÓiãOâôv‰, ?S¨"VV+6k&Òï]3×aêÔh>8�cx÷‰, ?ƒŽ7V˜ˆÊÎ +îYÚG•`[J„¤ýdÊZhCP:Ó ÂÉ1nÚöç{×�\=%«r-¯s“×&EÕK0BgíÀ옜Òzxv¤NîÍ`\fN­þIô3Ë‚¡éÅŒ¬ÚW,2;޶„%¦ò£³ Ìþóè™JÃU/.%1•µh|ÎxŒÒ_BJ= 5V Ëïä!üƒ*=Q¦`gØnBk:ØJ´9ˆ¸gæd*6cðar¦®†¡3›]Üf­ w˳¸gc½°üS!º5|ÛÀ¹®À„$&«Þ+VUF@’6è‰:}ÔÆÏàD¤W ]ÚQ®�vÑe¡=ãW» Íeœ»!Œs1„½Ì} Ôð+8!Ù‹: =LÞšœ�³·2€mr‘'áç‰ä£còÖæq^ $)è³iÝ-—ÉÄ^æºòL!íâ6kùßÀáE m¦á££!|ó/sÝùe®+¿¸�É;�xþÁ’RnõÕ�͹ȓðÓÆÕ3|p7^:'ÖELÂ)"ý‚‘1}iuöís]Öfù%ésó2|mHž^û(ÓÛõYô»‰( íªb; +Ä£O@âÑ'‰zeþØú �-gßjùÎŒžé³»‡" o%NĮөâ}À4ñn +M¼£\© +°¬“V½=kg‹ñ®XØË§¡ƒŸõ PêÃRk˜ÞÊý’¢:“5aýßȇ.7HëÕúh]šežÝxån$MÃnXÓú+j‡bmü>�IôÛ¡B,ú" NÚKˆ)m`´qëg�õ‚³g’ÚɈ´Ú_@L}U ÊÏtêí +eþ}¦RÄ;B�Ð.AHhGà¡qQÏš üN©Ž>ʤGõþúc·VËÜ­ù@¹Ÿ†;»œ3ãAì³ ùîÀ6Ïé 8½ÁƒâOòôÞ0uj4ï4×Ŭ¦³f½æÀĸ²o¶|5³o°BöŠM•«^\ö("ûSˆÅÐC%bñ`MüqôI›B�ƒ÷‹[—æZ1œæÐ�£‘•å,Úy,—u• Ëš¨“°Çì¡ÉÜÞŠù­i]Ú:ÿÛY6?ƽܡsÇ`êÐæĹ&jµñcÁø¤­^hÖO¯Œ9á»®ëQ)ÿ˜•V�Ë* 5‚ñˆÓÐ.Â$¼…$ ¿‚‹fj�Þ]54}"ù ”&ÚL§áÿ2wÓ2}k^ˆÒÏLGl7¨æ�o"ËÀ»¨²°[¤)Ø-Ú,´•<o¥P°-tùwûHêÙ3|n†®[Ëô­ù É¾®ŽØî†™;›cøºˆßÂ.Pä ÿ©äû0|f²�çଡª¯@¤4ŒçeøÖj;5y§‘�NB=¼’¡Y7¡ŠuÄwöÍáœmã…û ND~2#­¶‘ÑÞ£È÷kíhŸÉ¾Ub±Sx’*�-ñÐ1Y¥—@ˆ€üR#(ÿ– M[�IÛÈÒk'qz»>�|Lí­�ÝêæÍá]¯ ´«yýz’ç×6Ê<œù{ë1zj�&°ÍÏð±ý@¸»fÐí¦ d»kå|¶ÍË\û%Æ»bcH¤†¾‰æºØ}«á‹ç†�õ4öy@FçGR·[<>g MTå KPi&¿¥ ¥ß�äéåIäû;b=:µÎ¿VërFoe×f0ÝçaÔóF¦ƒ>jdçré|ÿ¼5®ËÙ<æ’&‹eçlíMØnö™äë3‚qÜlÜY™ÌŸw)õû‘D 홿¸ïÄÄÒ¢[!‰6öÃLUŒˆ(,©Tjãݳøço¾vµ‘æ¡mõ³'�~wï>”Ä®– K{Éôð¾ ÃýźŽJx+‰zí$ÍïíóØç��@mA¸nŽãy¼³¡< v±bX~¥ÒÂ. !‘Í�m3X×ëþŒŸ[Íí12Þõ문ÒaH\ë$ÌB;;†î­ãxåº�5‚tu‘&á—ZÙ»r|ÒR$&}‘ç �¦ ! pþF\GuÒš¬n½~¬«måB³Fðúعldú¨×FÛȒЬGÌwó,Ú™UúÙ@•~vå_– ΣN¯¯œë0qpòŽâžQ&¡OdÞ}ó�³aèº5 ZC§Ö_ÒÌè—·»Î®õ™s/tpIãjoçj:x;©2z¤N°�ó½ûB“�J¡‰�+G)·ÖÏ…tšüû8_º/³·æmérÀv¶ ÞÛš½Í¶Ùô‹œMw¦-sjmìcHPo +KJi Ì>Ÿu3ÓÂð±i‡@ë,œ4ƒ’>—}ó«¸v±˜@„d=†„ÕöÎÀ¡¦Æ$Å�aJêÑ¥\YOX2JW`rJgp‚Ú7,Qõ_DH?֋̾Àƒ$Îa^‡ruôR+"]Öêmv®ÖÎ ºÍO¬‹6'¦þ‚ÐÛÀê÷ž!dë5‡nÝè“ð/™"þ¥ÒðšôFš‡öÖÄ�ƒhç³pž›¥«µ3ƒmó&¥þB’P;†�ÂôûJ©^¥P°mhçs÷¾¥ �(sËÆÍdJ«ßnÁ\{íæ}þ¿5’õW”Ó¾M²jF¶ÄƒÏÀDµ[prŠ@Äc}@Ul#}zm"ONvìÅîŒK;AÑ iô8sãÑ¢›ÁÉ« Åêø�P?�#à­sXwÙgæÄ¾‰.-1­;)íBB:+�zmE¿Î“¸÷‰0 ½Sk#ηΆ¡Cë2~i=�y÷ÍîÖÛÝY¹šû2×¹1{l\˜>µ­Møí¬),Jk=/áµF^"§ÿéÕ‰uÑ3(!éw¾{vŒžZ¯!„;ÂDüL¢b»'Ï®�ÖA¼;ûe¼kÅø†¯ ìkƒ�㟿àµæÚ*‰þp½™G'‘‚먎 ôÛGë8(é©–³…- ´o°/î¾1ÔÚ`]Ü”¬Ê L<ÖQ%k3&i(Št•ŽË9‚“ÑùID¢?"-Äê±9SX’*W bZI­Áˆ¤~1!¦fŒ�ÞY/8wÂ{v Z�…ó2ŸË:dÓêmÏO¹p´Ã–ˆša02j3­"~™Á¶†ÏLö¡Üó).i©”�è’0†�vA›Ë\Ø:7Ï3PáhoX2Úý*"j+¡‚= _7[×·6ˆq5QæaW`‚ÒiUñuz?‚‹M¾¿ÉâÏÓý»3nŒŸÚç‘n†2ÑH? 2:sñ��PÅ· Ÿ[s·67¡†eþØè—¸4Yç«g+�‚½T ÉÚj‡æ ?ÏãÝï�äëP«‰]ª‘÷‘'áM#×·8dÝj­#^ ¢ñ±ÿÑäë2|m²Ë[ã6wì….­ì&l7ã0ÞÉ<–y4Q(!=e£r6[rÂf ’¢;æÄC·àä”>ðºX�ö'Š]“SùëUš,Ê«›’úœXüD�‚þqŸZAÙ¥L\ö¬˜u—Ðùké§‹´š‘iµ½„œÒU)*íš¿¹ÿòÖ•côÔú�¤`W‚Ñn�Éi}!Ê)½!Ié-�É(}àÃbÍÉ'Ä)XK©¨¬#IåNRJ#y~?Má[MCøæ�2 o ABë +LNë +ONi GFï®  sSkb½ó˜G϶Í;Œ|ô�VÆÚÁ�R®$©G¤ƒ>(3°3¹†{—ÎÚËÊé<õ"Òó8îÕÙ·[+#ØÆ5B¬›<ˆéª–5ƒ’þ(Ôë™TÃ]AŠIZ ìoíj�ð^Í#æ»uÂ{õN¢_� ¬ÉŽ€è�¤Òt|Ö`CRýãõÌìèŠü³_äº5P¥Ÿ'3ÒjËKHô,£Û)–õSÇžŠ8ÓGÇÜ©ÑK¥ßB�Ïþ Fçzeô9a»ƒÇ6ÛÒÕNªâ[�G»IUì} ù¾ËYçòÂ\ÌæmÌ^ÚìÓèç“8½]&RoiÓÐ,¦®­gßü¶æ0®æyÜëJ0Ö +¨¬y"ùhZ›�ûc/ugZ ÊAÚ´óôJ¢ánh÷u¾|=I4Ü•BÁ¶Žx¯× Æu#N¯çÒÁYs’jKRJë±Í>‘|[2.m&R±CÇ6óZKæÂVSPr:SXRJ3­"z±íâ&‹ñ .ð  ð ¼\Ðê1™À79'òNöÁì›oë¸JéHD姌盷tªHç êÑD�‡4„XSn‡+¯=,KkA é téçuë¤p¬›Vi¦ÒÅ%²oÙð¤-ÀŽú +=Lk«—ßÈÒ{+�"þ©”ÿÁ�Ð:Œˆê×I=+‚zƒ=Aõ¢�z­›µ�=)õK7¹†;—Oº‚ÔKFf_: w IÀÏTþ‚”Ò�˜ÞbMï OL=…&¢}ª€É#ÓÃÚh´°F*õÖY98é QXë +MJk'Œµ `›œ¥»·@™~} öÒCP:K¹�ìAš=ÆoM+3è&ÛÊÕ6ŠpµÓÅÞtöŠM »òJƒ]i­!å.x¥üDïŸGÀ3—ÆÕYÔ£3Li�µE\í. 3’žA È[�‡ÈßT*¶�.¿7ƒ”‚Ó™ ‡§Ð¤a_`òOèAZwí謉0 혽6úÆ[×°¨ôhŒÞp„v }Í`œ�áC“kþî:¡Ý=³÷ÖaêÔælšßr[.{yëÊY´.Æíæ;×�&ývñ<Ó �s3d¨9¬ÛNÍÈäZh’:}~;ŸË:ðmXXöîÞê@ÞÑD›†ÝÁ“PùЂF»£öJPx@H¹8…yT*.»"¦ý‚‘Ó²ev&ÒDÿÔÚ“w6ó/6s·&÷Hîy"ËBÛÇÑïgÙ>—ÛZ²,\wÛ#ÙG;…h¤}.ýæ—942—4îçàõŵ¤ºxÔ·�õ€÷± 1~kÜÅ9Y°MÎÖý²šoœ|“(GóšLŒc¸°é3Ü�B}Ó+ãÜÅ„t»a‹+�W¹KÉ(WÁ È„É÷�@ û„%¨²˜“Ö?%Díõ£´æ²áI?€�«b\ÖR'(½Ô ÊnõB³ÆP¤ô“aµ1Aõ TdÖL§á(‹vé÷YþùÌ?z§Q�æ�Ìë2€o[ŸI¿Úªâ7úôöÆ<"LÃŽôîJ¥ßàÑV2=´,ýx*óhÅ;Ú1®~¹;Óê(êÑL¦bÀ8Ù%­“ÁÔ¥muñê¢ÎB„Ù×cúÖæ¾5î�" „Hç$æÑ/tfòK]WÎQ¬óK¨`ÏÅt®‘ŒøqD\t¿?ÂQú¨ÓûkéüNâÞoÀ“¶0µvÐctn:MüB‘�7cž�sh¤yø„�ô]:>ë¥Ò𗱃«iåf¡L@[j„¤Ý ŤÇñÞõ˜»´Úrï@UüR%(?UŠÌzÊE%}zØwójqŸÇ9Ìó0ri4÷Û±lœ÷'òïÆ[×aæØæ¾6osh7YÖGŸßž#Ϋ³mŸŒk7d�tÓ>`"*_¨’:ï8îÕ\KÆ!fïM&ú¬‹@ ŸP0ÎÆ$Êz^ÌfNZø0)æ¥P±Í“È÷œ�ô4“·?âÎê±9#…z}”ÈŽ@$ 4 ècôÒæ¬Û¼�ÙS›�"ÿl¦PÄî�£ŸýR×�]иdp¿ŒwËÀ8™ üÛðrwocþÖ´¼Ã„/Î… ‹s€@ÁE�Ë�æ ' yÎ:�{óŽd�Tê­0ýè—83î Ú $ØYÿ+.j»&;|“ü5V�O.Rè·_ÑȤ3IJÖ]!!ÌaÄ`ã«Q@×ÈûJ†fÝ€e—:AYµ³SbJk8¢ZÅžö °§³ÓªcÂ4ì8_»c§ÆÍÊõíÌ Ý#ÉGË ®q]Ö챬œ'›„›kéælÛ×fåºÚ›ï]téõB•…^‡¯ŽÁK›¹'ãu‡°™Á¶9é1wVæòV“Ñ­méÌÈvûæ¢OÚˆ“°Ï¶Õ.l´6ûV—eéþP§_Í%D”Û¤*ö5�t~îL~�;ãâ€óæ&&ú˜ôÕŒL:'ñ®ç ây. ´„$¨\”4�d_ÏbŸM„YhXõ2bJ{ )­€pô†sõ£^ÿ‰üû?Ž‚~ѯ]~$ÐoÔ‡ÈÞÅCT¶p…Uî:*C�h”ùc£yçŽqn‡1~n\¢ÏÀ�Djè}ýú "]}ƒh7×Ömy&ùd Í?:‡QO†ÉKãÂÔ¥m{,ý¸Q)ë!ëšÃ9Ù…Í.û±ì«©``ÒQ$"i¥Õo?P"‘v�À*Ù6´VK úŠÆ§¼îó3|r5U‹Ë.çEZ7ȉ;i4LÏôÅÍ@–€õ*ØqþÊ>–»`Ô ¬Æçiâ—T«¹Z™W ƒÙK#ËÚÝc.m\8b¼§Œ5?Ónà\ p2/ 4‰qZDr#XAÝnùåVéÐäNÁÐäjíå^Øâa[aw •ï”̸-m5™û2<ƒ„/®F&†Àc§0…u«ä<ÓÊqeüâ¸/vgÜ,Z×ò[+VcX'ø Ø#09å`u¬³s÷–ß[Y<»ŒÆ '‘X_¨²*?@B*'…"vo^·9¤ë;Š|=)\?hrºÍ°Åƒ¼A‹‡YjæŒúíX½ Í9ÁˆÈÎTºXG�€ ºôP »†&ªõöHˆ~'1aÛKVxPBÐ VDúq_]S8G˾É/vhÚl›ˆðoñøœĘT*Eì ZXÖž¤Ê^YRå+&i KÀ:[go]Ø|YÛ'«9œ›sñfÄ:ßcÉGûTöÑ=”}³‘èWÚ$¤�(»�&!´)X…ÒJ­ˆôQé—ÖYÄ«kçh!ÌÁ%²[ÕÀ¤·�xÊ]F@g¯+¬[0,æ.ØP™Gñ¯¿¸¥ÑE™†kD„wã¡¢[�‰)ý3ù×»\!MAžH‡+ h,ž\"NCú@«cý•¨è€2l ÉQLÔbGº�=št‹ñfP\t±)#f V\é¯!ªt ©}{äõ+¢êÀŽÎ\7>몜´ƒ¥\KP·W8@· RLByPüK¨_A·�Ä¢mò+x�üR)"¿ƒ ¢²!¡sÐå`ýR§¦…á3ÛÒÎm�,i Ì¿.Ä9X/¥†;¨÷Heì<�{�û0…/î3€Ñ„Ý䫚s„'¨\«ŸÛŸJAù….M›}³·/töœÆ«¡H0Ö]EBe Y@p#09å"09ÿpr<ýä¢SCÙªÇ&wC†¹¨óåaPˆbH�@a@†B”bŽAk¥1C€08 £Òál~í<@�‡IÈœ!„DDDDDD)I’Ô£g€ÓêBÍ¿gÏïœ +X¤Dȯßd‡#à„¼®t–‰áÛ$kú/ád€:3Ô´åwsRÑóÿ?­áߤ_Á]ä¤ÈI9;4ü2Ê©t±ê?˜œS ›þó]íÈ9txzõq.‰íÈ ]egs²Uêƒ|ŽfvX!͸e‰Ó"kN £œƒ^+§g©TÎÍ%fHñ•ÓE5ãt½Ì›¢<§§ÜÑfÞ95Dµ¥>ëZá^ôÀâôUñ– úú®úè®ÀŠàÝN]–%aœLó}Dº³Õ¶s’!¨iUÝM#÷y&Ø|ÿ•}|\˜eÑâ›"ûÒ®äL±ùœÎ|JŒÓ¿áºZ‘MBt½–›yM-ëö�uA”˜ENV)´»#qº¤43*P¯‡g:â~QtçHöõä‘àö÷�¼?›„†—]°ˆÿ0 ì×–×|/ÇŽãæURý¬¿¯!ßJûÏ÷âÇSüÑqÚ®ž9d?,¹Åok'‹‚¸ k= +`ºX¹ú4? ¾ˆ#ýô¸/ˆÎ�×Éż¶=ÛëËBæù4âJ½çÂW¥æ uÆ.5ïX͹]·ªéš²§Ã»=_úᢈ•Ö²”/ý’ßÃÞwľÓ\\¢7—ç¹Äï$¢Î’Z·2ì5‚ÓEÝ·Ý:vÖÚÏ:ð}œ±Û?ëÒ€]Ì{¾É©y®ë^±ðÑ@—ÍÉÃü?� +AÚ¨]½%ã¼?0�q³ ‡Ãdõ/GÅ=™&o”¼Œ§Ðw 2>Þ¾)å\IÿD‹|Üû~ÖRâÎìgAÏà£r½|ªÃS¯– +«wQ #W¸ú|çÚ ¤ŸÜ� ™g>ÿNïþÔÇy^ßý¾O;¦ívtäêX:|nQþ¬àü˜¼õÚÞÃx�áv€ØÏ‚×É®O~Mãú ù€ Ë;Yâ„?+pŸ ø·n)ÛVøÃ5Ü€°¿c\� ›sÿ´�d~ü|~VÁêL?ÃpýY�†ûÙ�ÂnþÏUVÉ>ØjÓ:Ó.ìë^�ÛëÝáÇ;ï Pš@W8<‡¿5<ý¬ÜßÁ’�t0ö´Ÿõ O–ü¿õîc}öÛÖsÔ‹u^,ÆQ½š¡†ÊÁ?kC™mï¸]`_‹5IÜ00r>Âìy‡½Ó]1ª 1�âü¿…;K™ +Æ’å6Q?+p>ÏS¬kåš%Dã%!p�ÛþVæ"–qä¥ÓJ àÿ³®˜5ûsãÂ÷”Yœ½ïq‹Ô|‡>ë‘�¢ö¼Š…èœ.m&Hø³¦Ÿ«ó/`¿?/ xÓïl¬Þý¬TMì+²šV¥Ç­¬ÿ=þÆ)®²q®,=—s§ü¬¯µñ!«y#�-Is|£Úü:ðeæÖáÀœ}øðÉZiNðÜþqÌÔ£Ÿ:ÀÓìü\Þÿ¾Þ²³œ +ñq(Ã?‘}޶Ž6¥|]›ãótì'”�o¦ ³òCnOTŠÁÄ{ïl^˜Xxö#½úy¹a»E|£ÈÉrÔÇM§kIåè¬÷Ÿ†Ðº3ÈéúR,?�×ñcü�”xEéþõy+[©õ{˜�Œ;?;Rò§�•yám^kú^¼¹ãÿI ]·ó ¼µTe~ürF{^¨ÞÕ¢ÁÇ!'º©ÿ—·{:1›‡\w®=É\÷<ŒªÇw‰¹O¯NÝÙi¤G‘šZb¹•&Î÷%ċƙ0è&Òró€njy¤4ùt�ÌJ¢2³­Óµ+TúG 'É9Sêø éŽ§Au7� Ç»wU·µ¿oÐ/µ·5“'Âq×)|Òq«lŸñÊ3eÙz÷cb«Ïÿ¦>É/^Òú•Nù\×lc6”¶lµ>‚}IabxëU´ç8KPmáÖàƒPÚ°�žnŸØ[3ºÖ«ò|‡à]vâÜê�A: ¯m€§�_�à!õ1‰:÷ºÁz‰ÃåV?I”�„9‡]šè+:hõÝY,�á·«/1¡£ê.âN彸"*kùB � 3Òåëa«)ŒÛ¹ièKÀæðªÑ»Ìn>‘QÅg-!ahÍ}í +l¯}'µ\î<¹_ þ" ƒYó7åÖÕ�ªöauîþúH +ô•"=Ìð仿tÞŠudƒk¤a~õæ'åù¤OLë߬º+DØ-žu�„Âbhø4°Œ&}Qÿ‡.=ÿØ\ôE¸ ódà*×Z̨†ï©t}_rg÷kÎTܪõ;¨ÿKfhb/ÞEÕóöœƒJØìóýÿr®¥çÝe»ZËPb÷XæiõQ8L¥o {!ÚûÜÜÊ¡M@òý“Øt0L¡C2Þ^3;PX)zõöç`øArõÿýÿëÛ‘=²›–É0B×ÔG®Añºn^6­ ¿f™ßû˜¢Ìgsqêò¿ùmKxþ¬ ù²~Å|˜r)mÍÑÂSõ½Ìí˜ »ó2ùµì5 ´Œ¿Õðíßz—ó®Ÿþ•¥öqÚÃÜØfŒúú¨éNxå}kÖ«Ï?Ž·ŸÚ‹«f�Z<“~³ÿæÞGÐß-inËý}„ÌYå�U¨�y5K÷É»í lŒg£7¬ýk ̱ÒaWrC·ïa+¦ÖÆÎ·ÎŶb�¥òÁØ�Z¯[¬÷1Q¾à¬ŸFáPLðBÍà o üuF©ì +xYênM>“X·�P}º•ç™ïî�]ý¿[®ñí!±ïmäÓ ê:�›Ý£ó�lœŸ‘Ÿsf9åȼYŒÿ‚ßZ^aš\8À›‰¿rNô[v¹ÏLUþÞpï|å7àu5¯c¥±oOó�^Ù¨ù‚w|ýqSñ@¬ãa_ȽL‹|Ùü�iùcÐy¹¡Î…_zhRøìãü%Þ…¯Ç¤þ3°I�k£Ø§s̪#4Òž"¶?CNÃE¹ù�-Þm‘'¡óÄmÙ´w{Î(ò”Ê¿FØs +o¼1](�Z§_UžƒüpË1jÿ¦Ž¼#…üD=ó^œÅ®¯á8‹w%ÆŒï…ú\Áx¿ößQ/St/iΙ={ç”T[½Ÿù¹�­Â4möÄ~6úöÓÆ«í�ß(gàâ  Ì³7'y�ØËõgßÃBç·@ïV÷q܈ÐPQqLJGm0$e|’^ŸÛz`Í“áu”Ø×¹|vmdo6M»Úr'¨õ3 ø(Í¿?¶]éÜ+ŠÓ(²~zïc<ë¡nt¡¦VMϪ·KøóiÏ/Âÿ_:øýQðIbþ@T|KǬ'J¹QJ>Ôå±Éq5JëSUƒW@¡ß{~~”÷_7ùä¶¹Ãlö´/zõþܵo(½ø¥ƒwñg:r£¿™¿ +rÈÙ´_âèáÕR%¤—<¼5¹áÙv2¹ì×de{Gm§ÞzçÇâú‰;¡c=4=uÚz»¨sDÿ3ýÑ„î—�ß +úÚbQ ºÛzFM6¨ –‘’üØ^uݸŽ�Ħ‹º–A€ü`x\ñC#ï¨ g»Ý ™æ%`sWÓ¤,†îqãY‹Ê òîŒEMÀÖ_¡š&QD‚:df³}»ü)>þO´çbgUÝ—ÅÊ'¤ð.g…­ÍìÐæÄggtCˆýõ8†{��&¯2goÚ½"ðä‡y¿kÀø#Жršd?dX0$À}õÑy˜ oQgd¾5�™Í>ZB–Ý£ïU,E$�Òq¨µ$`Þƒã�£‚¹ù6Öòf`½Õ´âfAÖ@¼aFvd¿ŒÄ)`×N´i6¤-a‡Š ¹�çÛØÏ!Î)nŽÈÛæu #æ<ï¡UÌØ| ºˆBð’) Ö`ÆX¬(Ð9꫾Er—ÝõPyÓ?§äK*[Úÿëß´kï)i‘¹+ÏÁ\‚]0~� æ"WLnün?JêD6 w äŽ\QÑGì+ÿÕ—Â/AM©‰#>�}®à"²¯ +áQN*3ûõ%þG€ +¨jeøÍÇÀBwœØró�eë!ŒÛgßøˆ'Æað§È@ÅRÎýÓ9¶¯’ÔUÁY Íbw®Ò�!5Õ@ÔjK 0ÒDâØØÿj—z�+�.ÌéóQöb¦�öp’‰Qƒ©'%iÈFˆ}Í¡f[q×|±K›5·0*.“Ûq +¶&ùkhî�w9ðþU«Z/>°ŒAÎâ"5|\iè›/¤h0p÷�R\? ˆ®Ýä/m€ ²q›“3ªâ¥Hº`C‘ý¨×óOšnyä,c]’eýÌÀ9ÀëÜpÄÞ™už6¼ž¨þ´ÉÖÙðÌ ï)v:’ÂX3O°[Mù}J¦+NÞŒ ++�ýº>ýÀ>TQžÅÏÕÒ.ClÕÌä ÂLä  3©j©`Lt S8zÏ�±‡°¥ÃÏè$1âaΔ¼ +_‡:Ë +nO÷ +dE&…6k= >OTçª4wF*,ä†$v]vÏ;º“®à»úf—§âQÇ|¥p/"È{vH¶hï;5‹r…Ö‹í'Nmŵ†“ÂãÀ²ì‰ é ¾q ¼Ñ è \É&rXÌ—7¥qQü™LŸÖ'áçr Æ}K…¬® +ÿ×�Hœè¡É ¹Yäd’ÌÀ3Û”fK±ôcP_ûŸ)¨u9ì›u@”Ýà=y!¸0vU¸ +"Ý?ò²­Yš³'+ÇÿAx¨9îoZ�H¿´`•h�‚ÞòÃ3ö—í3Vøíü¬l#ºH#ïé…•¨Ç0·µ¯>öb±l£�£¹`˜¿ŒI±M™Vr‚wæ è¹`.,ôÓòK w A¹„(Éñ*ñ“(âžµ]Ë5Žmô�+#¶‰‚qÄ1K6®ä·XAQÁ€9gÅ(y‰4ÖghŠƒ~º‚è Ìw£ÕCÖ>dGñõ¡µ°ª^M« €eÀÛ‘&ñ@gØÊÓ(´™êZ„¢rÕ²LÕ­ìYá`cæ—×�dž¬Ú@{±‚^æê`yµ¶p{•êl¶ÏÉfgSç¦Á|®_L}!tsZÉI�,ý »EÕGÎ0Gç‡w4ÏÅÌ„Â͸q—\’4ØÂ¾ql¿À™H¿…,oLGÕUL{Ô9mÚÀ|‡~<îßÎ+!é›[�ÔÓ8ûV"ÒN@�üoJøêÂ{›¢(MÏâ‚ié›cotäÒ¬=ygîí\ê.g±V0b *& �™ÏgŒt]ìÂ�ÈáAp,ëÆqèòc}õ©'7¨ÙÿÑy­µº�¬ïäšíj¥!‹ð!õê|ÄéÚ“<ÅH2ëܤçp#çoaÝVŒÃx\È +nEtQâø(òYô=y~ŠùþŒÎDzQúëµRÿ©_Ü”R‡Z>®Lt­p‰ÔÔ†÷Zeþ‚9òʧ-4|œûÛ¤IMo(ëI›žýœ®¨y2�Õ,k.*‘–ŠxKöç'ž&ˆWƨs#oœƒk…)8³�¶ˆ0ßLbkŽ¡ºãüޤ¸ª ® +|×êU´�ŒN¯"†·NÍ�¨ ňân�/S¤bïÂ%º äl`ä d +z947a41fb1-e009-4cf4-b4a4-ea0df48d8c30d418b7b8-2f861-82a3-7abeb7d7adba80 668.252387d38b4ce-66da-4f53-8c9c-60e4a43907175d631255-5b2c-43a1-9dc3-e25c12f56589534612523713. Q !"<ð|“«ýæê ÀZ�\«ñçyÔì‘“ÛNÕ ÚæD‚o'l`Á ô�:Ëë¤ÜS“†Ðr YÛ�ÀtAº0ÏôñÍ<øå·“õ˜âîî:6îĆŽ5+ÀœS^ÌÐøouà Ñù�…sðßäð’ÆˆÞd � Y?×üÿfàt‚ T§š]5€'É30303Yû¿±%l³Alûåe Œjý¿W‹î’"™äip�ÑÀÀ  þšvHo��È+Œ±¦]ã}à:Ý�œæ¨ÞĶÖ^Èq \§5Xâ2Ø}”4ÅQ‡á] Ó^)wÞ"9—!a[ü C@€Åˆ#2¡0öMc�+v<(w¸•GBcß�òûØCûñlÆu:[,Rõ�\Þp!ÚHÐ^ <‘†ØZÝŒ8jÇ +�·G æ½ÓÖð¨+zŽ Ëôå6cG]T}sÔð(Á�PΑþQ¦Õ×n­®Ý:?G‘H×î�‡ ‰€”�ðÛ3npXÁ>?럔Ñ6—Áè^TÍש$µOU[£Š Fæ}îÙÛ8K­¥JBIÕƒñ)öŽ£"´rÊ6a„7ÊÍBßË#;ç¹Pä8˜aÁZbm¡ù@¾|&«Ä~.ÿôé¬%øiÁXKŒµüÄÚâÓ#Àùiì\«±‚¡Óû� +&ÚÍðëbdòÞ |¯k­µÖ¯µÖYk�6—wl-…p/wrÆ‹¸ ´zëè‰j¥ÿlî Wã¬x¨™ÖÝw�ЉLœvèòkêÞóóNšv�ƒ …zó…ÈWkê`Dô¡ëûÜJó ºÁF7VEšFÓŒíz(–F"vÞŽßÛRD¾wiêÙ] ‚߇~GÇœbz ãܾ½÷Ì�sàDê}@Ž |ç]UΑ~+uxôWïd€¢ìtk& ˜4RtM®5_Í[Siañµµ¼6—Å^%¾÷ÎöÖåš’¯Ò‹“-×–ÇØbMµöóãZTrñ½Û··˜JÓ©ôþbŸÞ«äIðÁe¶„6Hí?þr ›s.R¾ sM&Ñí˜o Ú�¬UP$y7Oä=Åê +åvo.Ç ü: ~�%¹ªŽÚ‚›Ú«ŽHSž ë«?�òÂãÙ  +¢#”;°× +�f@M@¤ãJ;-Tš»wv~ïÜ ·µöÁa�öÅkÿÍíåÝÚ³gÏ.‡ùm”¸ùÎèÁ(f€šò½°—/úÍK,v¶/ŒÂ(J÷K\,i°¹þ“Ʋžz\fülέo mðr>&ŸK±-Io­ HŸhFaFaFaFaFaFaFaFaFaFaFa”äaF‰‰m�Xb‰‚ÄIn1Ö~Y ®OI:æK©µáûeŶ^ŠMBÈÚj ã}šPÆw*i$ŒæÔ;›r�­ùJ¾šË’*=•0ÚƒnɦàrÐEÆ–LªŒðü£{ñ“ÊœZò—ö–k®1—4ÒûUz‹të¡\O-æÖÒ’FŠQ%9ÙòTšK›‹J:¸^„ki$Œæ \¯IçrmºoÿÍ-ë}Ra[ï…è¨C+®R +ÍŒŒ$I*“H`@V"O¥Š$g¦À€Âa,‰ÂcP�@  „A ã(Ž‚&N×M"VhÎ႟ï‘ݧ6.¨¨€C#»B@gwѺJ €"‚ˆ�ËãÀ˜J$u÷9}3Oo<È<\^pž‡˜ß~“mÔ2;r$»³›ÃI ø³ÀÛ1\ +ŝލTšëq„æ)yw®-…žbmšÎÜ›t +£\„¤ÝmžðßÌd@0:ƒFçò\ä1?Š¿åVŒ] ÖÊ +ôwÎØP¶AR£1Ïåµî³ƒ3ÂOy?|øO�îŒ�(dO¤ÄÁl +t«¯Ž­™mé–p‘]*Ys&üG)�œÑLìÿ¯j±`®ÏžGZk£Œ_!eqQ.ß!Tªv¹{V„ë ˜gño¢�úϳ2ìt‹cDX‰†¶/g¾Ðx'Rî%m¬ô¶,ŒNƒ…vŸh¥eII+]:¤\>w°èž 'è˜l¡”óI|$hçÙ"(€ƒš°ÅóIY~™6Ž,¢P +ˆñÏí9G†Ñáåã< ð‚/3 +†:ý͸fíŽÌ0Z1hÜË&ŽÐ·uÆG�Óƒ~¨‰øªFX!H?Q’ÂeƋݡ°ºj™xLðš�³‘ãƒÒÄTð–“è€ñ¤ýQ²q=±gv;ôˆP\ËáRTðfC‰Hf*8ÒHu(—MÚ_Æ U;™ûÚ9ég[’T!ä*bó)ÙBðÅØ/œPK9›Î C˜Ç_‚d=zû,¶S&�Tþù .F�QöµI–]©—Ë-ø"#Ë×et{C¡c«s÷í¶lÀ`�r{â?ÒÖèÛA,YU� Èsýû5pe?f.‡Ÿ¦AÌ¡I—²ê€`³[.®VÍc²;'­+¦œ?€h¿-ädJœÜÄi:e[Ùr w„¥ +©�lc”l{´"t£ã8£ÀOÃÓqµ,:¨qå(Vä�AAÄcò,í/¹ד€Ë ½ò(Páúw¸ì½“ãÂQ\ÑnÌ‚£Tz¿´�®¯·‹Ý‚Ø\­jÝFØ! .`Bö# S¤Õß%…ž)9¤×RW;p´‘_•ÅSQ{ —ºö½‘·¦…ÁR׿8LG…Ü_™› ÆZÑÌjÁ­“£WÅ(šŠsW_Ž" +GZ²A8›¬Ç�ÈÆÕá£ÁŠ->ÃD¶5o8C[o%6åX\P¯Ò¿�[! ï(«=2¥,ÄŠˆü†"2‹aQ@ºÌ[‘". +E:®Æ+¦×"L6û:< ‚n¨¾V¨†�¿à¿ÀÁ*?šô}‚ž²â*E¡T—Ùô ;ã@�dW¢{Ý½Qö´%“š ê`²æüÌæDSÐ4íQxd¤^F> ­À1êz�éÓäC‹�)—-)Š„Ñ\áØ÷-M�::©e+¢¨…šZŒöæúÁ¦V¡·­ß¹C$ö0M*mV-XȃžÎ¨‘ø{Å”H§ÞêlŒ…lTL½�Û^ûj)Ü¡4ಮ‚uf3ía.íÍ !Á~7q’Û@ã¹p aƒ8›ºBP”Ã~‰°¸Ñc�!°]¨’8r¨š4 t|WEtYùO>8¨¦€R/o¬“…Ë2›¸#"–&1È + òDû;/«Cù"Õè.«�wT¬B+�–ÞánHKl”±^ÄÊoþ\ü\NxÃÊÜI©ˆ8u0ñQ´ !ƴLJ7zº 2�(2”€Ê!/.ÎMe–€+çéûçŸ�$²^‚̈ÂI$”1äÂüù¤²Ì}«Fêb€–¶ê?lèŒãdk£}Ü1=Zî|_[•‹7†–¨U¡¿b›8­1Eb­"Ñ=�� +èFèÕ²eVJØ$©ª€æ.â@›­,rLzbçÏ/ ›˜–Pl_€ô¢,’Yš#s�eÌbNQ8™$�KÚAàYsTPÒOHâáŒo‚×/ý€¸šzXЗ,þã)ûæWÀFÿ)Éúú/ë>E¡�­Tõp{‹Í#S˜Û,ªˆ!ÌaÕzPà˜Ç'Û"HeQ¬Ó$ž¨£^lÒ�ŽÇ£n¥íáŠBì”D3KòѤqô]`�Š^Ü‘yE-·" ²{Þfï¶á$J­vΊ_Ð 5�ÞD'aY‚Kêßñz‘ÑÁú ÒÀg<”©J©å„ÆHh‡K€ñɪMê9˜¸Q°iäáʧ׸£™Ç5xisÎÎġʞNª”Ç%�/†V©Ý(ë殮(Ý¡-™_ø‘�mÆùÏg¤nðzƒ®G‹–eP°oMž�˜�Â÷R*tÊ]ãýÄ1L‚”|�úȇ¤œX‡©¢ŠXr»£iaZê´˜ZÅ©O¡Èi„7Üp‘¢ )û¬Â}³úG®Nö§ +@žÓŠ/Ÿââðé©-YõÙÄ™…¶¶%p|d;@NѲ+tÏÂC‹ìQ@Ç:ï‚‹�ÅPM«etL}�,j÷†tfD™}<ç`j˜š@0ÌÚ+2ZÉZÞ2•#‰KÓ,+F…âT=Êà^ö»DÉû¨$¿s;óÂÏ ¢æâp ÕQ†]éÉDÌ%íQ$щ¬ø‘‘FŠ&²X¢–"œí[©PUT Œ ò�§ðh<¾OÖMVÏ^éÅ(±ÙÁ‹Dßñçô;R6ßõ,ÁéêÆU¬€TSÍ ð/ú•©ŸÃîT·ø8GÈ¿¸8Nz�Ü·!/çZEÙ²>˜Í¬c�¤’ÂÑç¹2 +�€Ê¡ƒKNÁ=¤G¢‰¿o2x:2š¨�4Õ�8�ië©Lɵ$ì‡Æh$×¢²žX�¥Æf d~Œ Æš=èÍ>lPN‘2s·m•¦*%|Š– NÈr�ô½††2•³¸•å6JH ¤DFÕ˘É��ÔÐêa1Lô««)ø×P9Š~–yL!”‡qLy2ÏŒÜĉT.ShBG$cSJ æ‘uâwml{Š3ãˆH%©Ãƒ5ò$ÑŠi®‹SÐÆú•reúI©3@íˆE*Ru•ú3da +‰¶!š8ÍØ?"r?eèÛ²=è¡ôm�ïÎÈ�’›ÓG3ÂE&²4iÀ4ÕLj/uSª)Jßf DT¡´Ï‰WÃî 6Úû�V�ˆZi5@%shÁbgälœ�ª@Õ%K-mJÙì_=üfDòÂ"�ƒŽ#á9šƒÔFÒD,S…¸i+kóZO±šqR ÏᢥÑ.ò!Ž1ÇD +ÀfdìæI_‚_ËËån«û/tAe£ÕÅB§YçãqK%+X’\*ý1tÄÒ™\L&E‹ ݘ© ÈšÃvñz”;wz-Zª.¡F–Cí9£¿A½�mþ° L€Ú¯ˆs5@}·ËfY?c´í(‰³3‹Õ2~×Fe¡è¢kª9Qy¤¦ÍâëwØb“"Û¡Õò¸cÍ]8!¿ü�«@^C-¢Þíç$I5Òp,çÚôýrN·Ã¨¦|ŠôcçÂ>§hËW•ë_Ðå“T!Ÿ ¶lX>ë’çötÚ œ6pf§r—L0ÙÊ<7€2 P„y’µ‰[ÙÄžF¨-H©À š�¤”J“4ã8ÆO>˰‰€¥ó£,ªÂž%�À¸¦Ä|RÑp(ZÇIºÓx܇§ ‰-Ö'Þ²&ËpõÎh¢òéÝCRp”õ!aº¤åapºI + ÷sœÍR1ÄÐ ª“Ü9ªÀ[\Å&nöà¨-T™ãNb +ÈŒù‰àº �h�.K,ªo'Â4$˃L <åOà ë9WL¬¸œã�ƒ™+ê9ôu è�ZiâŒeÃý1³‡—&Š2(P ¶„Z^åI¼…wD_|·4ØG|±E‡²>[JÇ*&í#™¶àÎ/™ &Á +�žè…ÚÝZ«‡‹*ñ�>Ã\|‘Õh8÷¦:�tó¤Tþ¡Úa+Õâ™ê?uÝÄvü¥]q¨Û‹ŸU_ä­q5ðósÔ +›í|ÓÀ^3o0¨®iRÿ¨XþîƒÙ su£ö›hèLCÐööq§Ow ÀˆØã +âðµL‰‡Åù1mçS-p9ò à "ô`×ì +–IóÍ­+òLYG Ž�g”ɲ ¤Ï}5f:ýxŒ@©ÍÔZä.†¥Šš¡ Ï0òLpBMϺùQïË,x¿"³�³QòÜÿ ñ÷cë®H£Q¤-€Ú9½á]:Ï0¹Îs2Œ�é2*~u@þÂ!ÒÂ^szr¿ÉbD:]: 'Ëé¸ßTQé¨÷¶M[€¼)èù”Ç‘.§ ­Y ëˆ6|I*ë‚‹D0E¤8€\FDDDDDDDDDD”gµ¸‰��ëô·}ÊjÆHŠAÐoÿ[àŸI)¥”2%½l‹_õ¨(‡u ô¨šJ ñóǯ·Ê‹¥Ï–Ø'žÒ#ÍÔe÷ÄUz¤ïíí_Ɖžˆ×Ÿ²f+Íïפâ¸õ—»Äç½b¯8o¯yEŸǯéÑ?fk«|Ïg~¤Sº¤=~í‹6ÎÔfÚrÖËZKå¼býËV§ù©8nëãË¿_þ•i¤õ^z£[y#ÍyRùÖr\Ö˜o´yʶò½{N™=ÒZŸVœHé×,­Ï,ïw­ÒV'wYïý5L­7Òúý^·Êw,²8‘%²¸Ù/¯SkåÍÞWÞŠ‹×ñËû6O[%Žw^ñÒž÷FŸ5sOÝå¼üºœ1g§UÚ�ôZù‘Þ«âZÎH›R¯îXº»�5Ë÷«:¥DH_¦aà*=K§qæ,§wÅ™-ýÊó½Â°ÌSÚ+Ö:©•ùzi/,û²XöK[aSÚê„e®LVq¬ü˜±_+ÿ²·å¼î”mi´“J�“^Éåt9¯ˆëg,›J¿"îÚ/ïSÌNìxʾVæH«ã–sŠ4Žôm¤Š$镵"åË:%9õœc�—•øFjm­’b`\Lì]+®J|ÿªÒþUaV¥_ûîØ)Vy¯ÛSÅîOÚW§ª[Æ¡»Ç…åW¤ëª8×µYú¼¨½WbŽ­øÎ~§/é;fÿzÏyŠöŠïþØãÛé&J¹øÕ)þOw[�ƒåÞÔÿyÅï¿.¬W‰gÅWüÏ“ëÛ9m||ql·.ñ<åyU!±¯è~Eœ+¬âÄ‹ûJ<+,6V¥¥Wây]?¿ÂNµ«�ØÔ¥�òBÕií)ÿ:QœgÅ·+L>¾"¶OO/)–?¯ãþÜEû†a|E{5þºûwvìWô<9øÂ†¯+Úh#Ž×å�W�Øœ +«8ÑÆs޶âÄ󕯘­¼ùŠó^W´Õ)æ+b[¡�ÇqZ—…²õ,ë•—V;åÍî´_Òkâëûº®LÖ8WX¤-ýŠó±ôœßŸÎy³m,ýñĨ_qÎéò¿:E:³OY¯8{ž¼Œq0çÄÁ8˜ÈY†‰, YGdaÜ"KdU)šUSk¦Òü܉öèÂØD¯7}¾æµ7»›zäO2e:¢6_S«ùš“D¯Z+¾f½¤II0/¶¶gÌDk+Vq*N…UŒƒq0ö~“9Ë|1Vqæ|Ù^aíîî6WXÅ©ÔV,-�÷[Þûc\a'fïŠã4S+çc9+¬%­Õæ)+žO©ìéVöÓDzýO�U{UÌÿª8ç)Ý[:vÝ®°Œ«¬WŹ´¶•tVš§¤N/†e¾(¶_çZyOØTaœŠóé½ÓZ—?åû…ÑÙŠeÎÞÿg÷Æn¿¥ß²£µvþl™AÑMBTÒ|8ªØ¢¦4B3Y›ÍGd‰,‘%²D¥£�ÈY!_”Q¨�ãp£ Ü:•‘5fqA�úÄ ¡ñy³™FS£¦«K¦ìúvz¹VMWuýÈÎJ¢õöˆ4ºl‰”/wK/’-ÕËÖ'ek‘õÐ!²D–À·‹pÇžñ@, ²dHd‰,‘ȪR˜Ž‘nôðÓt qÌ&.Ÿ™sK¯^­•m�ÞûO½æŠ-½·ñ­�ûŠ^-~w{åíkûöìŸþ–^¯÷©¬W´mmßi©´×s~϶âˆë¥ÔÝúû¥Ÿk?ý)«Oë3Ó{»Þž=1¶þ˜öÌ>/®ÕbY/¶¶~S\»Kjïý·³ŸÒùKwš³Ä'|™°éörºO¯Bb+œ¸í#©O0nÆ®°Y�œÖÏý^o×:q•oÿÌ>g¶ßþVv¦sz¦ó§½wNŒßåwÆ]½ýÿq–ןƒe{R¨yCÚ´[y©ãìÞ¹:uøu|Åùùæî®B6Ñ±Šƒ+ _ÑÊ›/›k»ÄWuÂx³‰_�6U©#zlë×D¤q BŒðÓˆ2„FÄ ²*ËéóLN{—´Òç‘´‹Ð£¸ÄŠSa«8Õ¯ +ky¯Šco¥8Si/ìT¥�^¥‰�À+¡¼¯3Ûc•óú†öã8¯Åد_qúýÞ®&bût§^e±#Îí’VêŽg½uÎZi­”ÒYaqÖêÔýßýߘ^±ÿ«Ó¼³çtŸÝM»{N÷Ù}¯ØsºOÛývÖ9kÝÜ<;h•~½ýH?ÚËÞM¦Ø^_‘fëóŠW¤WuŠ^mÛY)­oªôL¯x±ãH¯W¿¢_±ÚZa±^Ñ^W¬ÕD¤ÖÞx£½í­½.–m'­õÝ/­·³m:/Æ�û'•�kÛ|ÿ­WIKœ¶}´0ëDL£õÆ*N´ve¿Nù¯«Â<þ=Eë1Չ͉ÿ—�ÿ'þGûWüÏsNé—ãœ_æ¿*ìªNö¿ôeœn%íã̈=¶�Ôý:õwlíûI±ýº"½¶Â*Û9WŲcöJC¡ÚlbW¦¾¾!mâõ¯Å?uÄÏŽãµWü¿¢Ë®B6±ó۫ѦÂllïëj¿âýZ­ÄWôy9½öŠß9g™ãßjeîØžGŸÕ)Þè³êÄ6UœÜ—æ +‹÷ŠÆÝcî—=±ŠÝ#þ+朥7î—9~¼8ãþëª0üÕ)º_ø«�Ø�訉íUJáÓx¢Î ÃÔFdU µ´} �nÛ8Œ,²ª§/+¶öÿK[ +¤q£¬k‘•~jÏôÿ•^K³ç›¯ß{=[ï¶÷^ú¶1vú˜vͶgÅõgÅ>ëÄØ©ÓëôÒ[ŸâÇÉ;õšßûe㾓N¿·+þÆîuâ{q¥î~o®÷b6ñ^ (Þk#�ÿµZ;eWŒmÏÇö:žÙ×ûØÞj+f½b.&˜M´ÿy~¥óñíú5ÏŸÕZ‹éSK»oÛÇlb‡„¢G +* …ªÓ)…1‰_‰lz¶ìú�­ìHiãž×kµþøV¿óÒy­õž—b@ÑæYñ½µqí›çm:Ý«Séþ²+�¹-ÅÔg¶¸ÖÆÖÞ÷<Û'žn3®øgÎÛ¦ó'�“Þy½éÛùØ1 h­ÓŸØûûV§ÏL=Ó[gÓê3ÛêùVJkîvìÞ=©[ÛÙR;mßëOjïÄS6ÍÕþ[Ì&úÅ€âÄ?eÇ链m‹köìô3­�'¾´«Ó¶3×YÏÛöbÌ&æŒÅêSöÍùk­öÛ⟗öu‹iÓ¿=«ì˜/½î˜M¤Ó1 8}Òùµ6¶˜võYÿúÌø©l[/Îs✽޷ØÞ§y΋q½øécüï?gc:qÆöÎþ·óqßœß+m·6{ÆWLÛ^ûÙ=c6±1 ˆ«Ïú7õyñœ�ûÎlßý±[§´RL'u¯Õ§cÛNßëÓé“úOoб}KÝ~ÎÛÛtÎJi¦ŽÙÄJ1 ø�§ì›1ÆÿÝ·Å?o­])Ξ?×Ú´Vz»³‰ý¹ŸÎLqwvJëÏŒÛíÏj)Å€¢¥×eÓ®M§gÚöoûÓÙÙÞ{gãY©Í²é½õΛ=gŒ³‰Óí?s1¹Õ1›˜­�o-½O}v¾–b¯+•}k¥ÞóvÆïN'þûý™^Y¾½µb6‘vãÜTv¼OkÛŸ×fKßâ:óüvÜtÖ[Óžÿìœ-õwûíÓë´¸ßþmjéÅl¢cÇ€â­óûåÄÝÕÞœå¤íŸ=OkéµÙ1 ØÔïÄÝMk�î=s¶}Ýzu\q�Ý•þõ‰Ýmµž�6­c—s>ÿgÎÿ}ìÓi®˜M´×+îieÇ,ÿÚ|í[[ë_œo¥¶öÄlâ¥Nógy½·ßÿ¶8ËŽÙßÎÝöíôïnÙŠN-®Ôëõ¿ýï–ÎÚgL³}|oÛŽvb6?ïü:ß-öŒ³ýù]1înú·ÓùÙýÚ‹e×o›¿+ÅlbžPœÙ1“þü×¶ìŠiýL¯�÷Þ|ÿñßy=cëYØi!ÙDu,;¾íì¶ý~ŠÛ\ú³ÚþŠíìŠ/žg 8ÖÒjϾõ]b[qc¯�¦} ÿ쎫}ëñ·>­—ö¼µÚ–%í"n@“RÆm&UÖÁ1!…ª*£�†—…J�G”!4VUáB.•™´N�¯!*Ö(€Ç�â§…©Š;ÿÚj½ñ×K©­ÿgï9?gZqÎÖ;··ŒNë”ÒcGh +¶ˆ�#�YÅ%Ÿ'òmjƒa„40EÊP_V*u܈ô�¤OSPYÀOÛˆÚç™´M,ujO´ŽÊdDy_§þo6±"SÙñßâ·3MÞý:e_•%RPa‡à´q'‘0 ‰„Y(â‹+•}Ûvõ‹³ÍÖq_z{úÅ8Ózg•]+K¤xš‚-Ì8í"ûÅ$2ĸMÚ‚Q(¤Ë_¶‚Z×`©ÓPZçÓBí”m‘�í!j'ïáÜ\çÄõ+½MÏ—éýwÿw[?SjmÓj1�}sÛ‰§­Svã™±Woüþ·gÆþ·ZšoµØN*gµõqgz{¶×‰+¶óâ—Ó^Ÿžçcj/ý*;^|ë×KWZñ•Ÿi½sZ÷~ê�k�öZ[¯µÞók¾y¾×Ç™R·_ÿ¾ìܳíœ~»Ê®.¼Z�Ñ1¾_Ÿ×eÇK¿³¿�N½ºÐ(¢–â6Ó>Îøƒ»N—~Z÷yœx) ÂTŤ´�D¸e\"%$i&“'j +6,rÛç)¨-“;¯ë¼-L‘´<—ªb(u·)•*:M�G5*K¤ â[ëink¯ô±cÇmŽÛ>á–*u'ü²Ð%V q«¸pù*¸×F¼/Ä m`¶!e!7ÚÀmã»m!–ºÔES°…$í”Q\"$Zˆ�^'q©ÀÜ3N[£†M*ŠÇŽ/—Ž/7^âO*ʤ¢ˆÂŒûˆlÇŠÁ-ø²Ñ†i\nßF¡‰3VÙqNÙQv¤±'eRQ>¶˜cçXÃŒûÔŽ³Û£O*ʤ’‘r9eFü4‘0Ó0-ÒyL3Ž˜ú6%n#uZ(^‘Ë<Ò—‰pâE!¥¼Œ0ã>Q†¨XÛãeR]‘r)u)ï"Êg¼Dʧ•¾Šøi!Y—MD0õmbUÑm!).„cŽUºÅ[lq•øVDj«²AìÂ*�UÞ‹ëôœek:¢_jëôz­ÓÙý[ÙÕ˜"y&Q¦}špíýb9ã®�èœMgO:gÓÉÉùt7·ûþ¬3_õ/û’VX¾ª´OþçKeáõe›Q–Q¯¬.o½¤;ñÓþêT¯¤O²Vú}\‘è•Õ/|a½3¾¸J—íéc¯NSÎË~Å$õêd1éqÒ¦Ò^Õ©#ŶJ¯HÓ+,ç,iËÿ‹ºtÇèÇlmK›_ÖyÙyUX½òšï_³Ì~9Våÿ”÷ôÒ!†�áû@̪L „'À)‚”©¤06% |ޤvŽPjyò݃M´¹ÈP *x‘µ"Œè‰ÕŸ‰ê �ÀMh4 –ˆvøx—¯´ Ñ›�Äâ +à�g°˜°ØƒôBáâT8!�‡¶*T3…#©LØ” +·³$};KÞŽI†„vI6”«H ±H@�Ë©Œ2SsI¬ŠÂ�b‘,h|$NAR� $‘ERñy‹Ä@Âå’<¥:JTF"°”ŸP�.E,‘ A˜ œñB5S™x`.M=6—$�ˆEÒ¾$VµÑ€qId—&’LPE1!P‘d—ˆ„ úà˜:ÁXü@ijàâȨáÆ×h ¼‰ …E¤áp±åê`Uwbá0½óÆs†w𛌠��ÉÀÒÅ¢;È û á$„‡PÁ7'EˆÀ+| ð´UUB8@zÄÁá}(´ƒü¡øÞ³¹�ñ´¥4ÀÓÔ‡à ( “í›/Áxº¢Q€t%Í• ��FwàóP€Ø�Á¤áû0˜„ñ0™Š$cSZUÄH¦"éÈ—„#I‰„k–¤#árI*‰æóÉÈ¢»$'ð¿ÄBŒM:¸,8‹{Œp,8 PøB|Ó�¹$`MÏ6q - ´·ª„ ùšKÂfbH $:ØDÅ“Ú|Zç@Áf*¤f*  3i¨X˜ •Œ:4@ò£ér… ðôÅzO 4ièT P€l H‡ç

    ¨ud'€×�t©n&/j`*rY×é "˜ER +Œ¤�C¡²¦¼³-F/Œ%MëbÊ[ðyѲÅnËB´Øy±Ë8TLy 4ÔˆòÓé²fQã6Sì²Òm +20všˆ é¶0ÔÀ5‘0j_5Pɘl\mÛi!˜}üËJ]bÐí…ʾŒ‡ÐB²P,0ÙP'¤Û­äñ¹-ëF§”H†fŸÖiÞØ{[˜]„�÷ 5p”ÂpSØA,È>P†jü‚ì…[˜¡NN\øÈ—M„8F¾lâ´}ßBPëx�7A7 ]dhÜ–Q3òy„Ÿæä}o¤ÑB²ÄÿfÚÂN+A”:�#útBï0ÌFÞGÒtx�ÙòM‚äuÞg¤Û¸OC-xÐJ)ŽÔAˆ>��;„F;…h (¤Ûx]†ÊÏÔAŒ¼O?M�öqœG’#�’�t7Bm# y8.‹šv›ç¡>Nã8�t@ã¶‘7qñ´Ò¶qiñÓòåBðC¡JòC¡üãH(T®î¶µ�ì´Ý¥`û:qÁ(–´n3i�‰òC¡äÈCÀi%ïTB¡$‚]Èj¥˜É‘‡@~ÜÈ‚ µq&YúH"òC¡dé#‰„|^§mß_‘òi\æ" +$*ã>M�'KÉ3}(n eé#iÝÆ™´’9…¼ìp GÏÔmZH†ê�ôÉ‘SÈ—�¸’ ;“/ q¨ð¥@v&-ì6y"m#“Æe!Z—¡Nɹ°óHÍÍ“G’ êÓJ™(ATG"�²ô‘B$j€Ï#mI¢ØLÞ‡’'’üËÚì–ã�ˆÐ8Y$”סJ•ma—IÔˆò@‰z§‘º”é$O¤®Ë$ø•¾Iª„ò$j€•�Âm$GpäËN$¯£�)i2y%MãFr䂺\b·E¯‹Bƒò€ÙÆiâv{Ð8ÔÆq02*ÀÍÆ…ÛD8PY‡’¶ +|M|/u™ÖmXÄy¢{fØ¥óõ†…Ÿ¦¤…Ù²ML"¡é4Ð$2p)”vÁe#�¡¼ LàT§³ßJì Ì<}Ú¶òŽJ]ÊÛ�6Î0�$�óm¤a|™‚“‚)’åÀ/S ;„‰‚°ãNdaÖÑ8Ô)€¡†¡q£lû2ž…Y) µSY"ë`"²*¢n"µ…JaÄ»QÒ4ncÒ°­Ó¨~íý9€vˆÁq©„f¤eKê‘¥‘²OhҰФa¤­£q£,C;e\Fò0°ñiaAò:aöÀiWŠÁqg¦<Çiœl㲸…]fB³ M†3®!Ý&€¶mPPhÒ0û�€íóŒZ·qaÊû<Îã„ +Côœ¦@Ãâ‚pã²”E 鶋Фañä‘6.+e(;=(7T)$†)o„äu#¥NãFQ 3ηRtßÀøi¨ sƒ±´}!q©Ó¾ vÙÆ ¡yüô«È}Ñcó¬ÕfáVòÄp-#j +>ŸxZÿ¶Ïµøä…¡·¡¸ZBŒáÆm †j4n”]BÒÖ™D†ÎÛB´/ q¨“GЍ�#uIÃ@+uZ8€‡ã4Žõ‰?Ïã>õŠmÒ0R—qÙ(*¸¾Òm"àÖe¡IÃü^‘vÛ‡ú4^Ô|(Sl”—¡u +EB¶ Qiû@4ßj ö…â§uZfÜçÀ)µ•´‰P›¨Ã*LUÄ ¡é‰òBQ ÉR!]†ET*Ô0¢;„&Ó> Êû8 Äk�}6¹‰TëE"u¾2’Ó‹^Ó_”þȺ�“ MèÓ¸Ô…Èš(}™7 +?ÍÄã_"«ó¶p½Ð…—Ái¾/"+S0@¢Ü0ŠjzÏØï?þœ»ïÅÕ�NKÿ¾Ënì´þß�qb61¿7mÿÏ{ÍOm®·ÿÝ/½3㉩çŸoýÖÆN-¶ÞNÚ8Ò8&Ñéc6ñ)}ÌÅä1›Ø-;Z›?{Åo+n;Ûm{¾Ôëýœ)î (ÒþLi¥ôN[=¾ÞÕig·9Mä²yxyùx�÷�y‘ŽÍ[ù°Á'û‘{PÏÇåáÙ0àñÐâᙞJ¨Y•‡J}§À[•‚‡ª`J\ê¢Ðï³*Ìe� ø¾  ž +¬•D4 !#Ãû“�ÒARßÄ`&ÒA0XYÈă~ŸUØKécÐáIX +"5´`�A«* P€CipHEâ²ápHrÉȰ‡ÏC ãq2<¡LÆçÃA@þxR¥ƒŽ(Ûà@"™ï @$P }uLÏ[ƒŠ Z™ �·*�€š‘q0¡±`0lΓñ. Nº›¨QÇæ=D›ç\ÉG Ì(Á‚äX•CªÔ±ù Ž@™èÉÉÂ'êè˜"Nd�yeަŒ ÁdI�`By€2”��Ž€Ǜ° Á¦â‰\| sƒ9²*‹Ç’©X<–ùÉ`™÷£’cªX˜,˜ÚóÊ „@™ŠA†´–�‰²xd* Q¦µç㢣‰\¬êÀÀÄ$LÏEÂ3i¨x +¸†Å-a…‚(S™ ð€Ç=(Ž�Uupº<$ÈÜëH�`j«ò6@«ê0@«b˜°d* Óª:2LÂ*�‹¦QpËÂÁvR¢‡¶@:¤ñ0G™Jô6#Ìv±¬Ñ B …‹S©,O&S±˜˜6 +Þ)Ê…ƒŽ&r±:šÈezoA£àœ ¥>!„2ޤBtƒe“ð ‘G2èm&„R£PPkD”ú$˜ +í ¢”¢°ªË5,nð‰ >É {`@r`­ê "üd�yÐÑÆeIJª{ñpàÓò1ðð°*”‡ƒ‚H¥Ðà*¥  ,ƒ0� à@R6ÁÁžT% «úð1ÌNÀ�­°›O|×ÇÇÀ…Ž\MD*x‘§ˆš©$̃LÅ�^!LÂ[•Á×—=§Œ0Ûå`b"ð}©Ì¥:ù,®Ñ@y�'!äàQ.ÅE2¢aj�ê°Ñ x|CáHê……‚ÔBa2 ·©d”&¨ÌA áÂÏ8 B©:< &˜ +ÐÒœ™ú$@¡AæÓ£�+”9ÊTRøà¢ø>‹°ÃÀ5>ÌÒB& š7Òu||X(¬…‘Mƒ¢’hk`ƒe øÈ°à|Ø�£âÙ4\=Q€ZJ¤M6@Ìǃ‚¨”qpaV•?z£; vbƒÈ�4|>ØÇ”0°ªT £+,¨RâAã*¬ +“<0œ2€¸'¬7()ë�\( °¶*ÔE(u£Ô“èA´8$€ƒŸ)¹¬j[€4D4 #”‘á}ZäA¿¯¡âjØ�…ħ'R6ÁAÍ>'†•jU m“@©î‘I?nƒ`eü(’ßgU ¦Ë¥È¸>.!%�*Z°ª‹ÑÆ�ï€g¤Qpt3('$„2|E(uBX­Éa UQ"ždàÓ&(‘p`1ïÔVu1±UX ¨�h±Éø´�lbÀ쀆þ´U�HX +“�Ô7QAb¨tPèFw-2Vµ± Æ¡4( +ŽÊåãI.ÞZÕÃ&ä€é 4 œš¨ÄsÈSMZ§͈ó0p$‘‰Ä‚U3$ë€eT,vND0GñHFRHqA +d”B¡"Ú +à9”¢¾Dïñ®Q~§ô§ι˩Z‰@­ǹ¼Ò…[J3&Æ©þ¸„u/€»‰*“Ô¨ì"1îN^$ÔïÔÝ-ÁŽcКé=`ÌS·¤7æˆd…üx;/ I¸ÁÙ`cD ,'äÚ×h'„·ŽñM{¼>y:zØõí6g—(ãç'…ª\^Q¼KáÆÅ¨EÅTÁ!pl[Ú`5±.4Í�.!y\ü!¿”½›Éi yAY¨rœçÝ]\áÓt!0æÊï®I3æAâiÜ|@·›æ^îf?5à�IÚÁ7²sQ³�š0ñx÷Öòö°WŽj:›eÊ"¨—–Úx´8NÑŒw‘Ê*ñîÝM)tïæÊÍïú|¼2¾»„ê²½óFczw…%ÝÃdòÆ.Wž‹:k+õdS]YÕ¡CG&a_(42æfQ�æñ¿Í�âDRuHq’½ÙGzŽ�b} yŒ ‘¯Æ�7²”`h8uŸ �nÂp¬ÃÈÃè0 ˜;røÆ›T‰ñ[CœÈÙ¿e`úZ`hvZTOP׿­Ôýʉ±ë†Ypr&‘°xùQNÄ“¶åCp{Ÿç¹öaÅß+^>,§Èk9ëÌÀnò•–žfcLIñ¾ÎÐQŠ}ŒõÝ‚úœ²ÃŃ[Ø¥Õ°¹ÅO¥êíQ­ÐÞYzˆWÎÀXçpLy¼U;¥÷ü‰L¥�…9eh N±Vàþuœ¨0e y�~d^âxuTul ²�mv•^wtéS¼˜B‹‚^Ý3k”í_@åk Îl/�@‘¶œ¤ñ9†y� �ÍyWu�Ì�3« Íÿ=@<­ÒfºH‘Ë;!q3£ô>�ö\Û�$±0ÕïN‹ï¯]1‹*ô4^¯ÓþBë·w¿+P³%Kê�ï®Nñf›/¯“‚»>¬«p jún¹5P‹?›øÚ<à�ZEµ?°¼÷ýB•roꯗùkÚl\þ{ïõ­-¥µï†÷„kî•B:¡‚�^%YþæQ}Á»�\Œ?¢Ù­{kÀÙ+k28"’Ohꥧ�Îú‚(„ˆð‰_âÄRvÍ�þ xÄ��ˆ’À „kMRôcPüÒ`ß(Žˆ ¾&ÉÚåU¦s»«õ0^}ôºîÓèz™íþõ÷|QR:ôDš¾”6±#¨HÅ 6 ]Ì•KÀŠ[&†vv6ó©�ÙÏä™­¡(X¢êý!ðž’ .å~!—b¯åÑ-Ø�ŒF|ÅŸéè^¶ôHg¾>g[Õ”¿VLµ\üXhºÉý}t5ýÂOf.ENf°Ä«ge>|Rƒ]?ý£ûV†Ó#ÏÕ£�ìÑ¥_is¦ÞG7%uDŸÅÁ–ì:E +Æ×ëè"\ùRÁ¤ºkÄ„'Liö endstream endobj 17 0 obj <>stream +X€mÚÔ½v{cLQ¯ß0ÊÉHÇ»È/zÖ‘zÖk£¸"°ZÅü¥‚-q€ÛE­¸ai~_Í<ºJdØLL¢˜²d(Ã4b¢›]ñsíµLÁˆé%£SŒr‹É æ&,œb´è»AŠH6bÿ_²Á–7–yGË“mÐPq/#*æ¼à§4±··…|­òtM¦´¯&û8@@¿ g¼Äú�I+ƒh�©q3W8û<ºÂ�짪2^¿oÀüŸ†3ë'¶ +(”DUŒô/ïOi§†MPšˆ¾hYÁ»xxGß™9‰‘·çãc=œÑµøU‘Ét„CFBA3o¢61N¦äç`@3G®ò8yæÃÙ©¹‚éö)y·¼8 3]ý¸Æ×«±É»¤¯tE2@!¦›Æ1Kjˆ›KÄŠ˜®¾x?Büpæ¢J÷‡�Çt—E?ŒÿqÉtí4(û‡4¶JE>LJË ²K´aJ 3­ ‰?Êß>»Ñc ŽÑ ¬÷ Ëò¹ +pfQÿs$4ߨQøìÉ7*ƒ¾ç%´2>UÞS„P�濸2\Ïa¤4Uj8Ðá‰ue4ÿÑÖY"ºPh˜èÓfÎŒÔ<)j©Ø;Ž™˜¬4KI]éÛ%ó ƒ¶|AŽº¨Ÿ“Ö&Û½L¤CWãfú}ù+CŸ³3`ŠÕu?+ÇsgBS°W̉ �Ð/Lúc㋺èž“!–èëž|¨}ÄÕGÂ]ŠàWÀª_ü«¢Û˜oPaXÒïæÏ$IO- Â’ºõ‚Rù¶ý~åuÒó¤Ô�¼Râ˜+kÐ$�3ƒÀ¥A.‘Kàòü/Љƒïiä±Jd—bÁ×¼-ÅÉ}:ÚõÔärƒ`[SQO¤¨ ·†mÆÒÄrsÌLG¢ë`5ñ¿�/î0‰Ò€E…¡;ÊјŽP¹—|ÿ] Œy†O&îŠr ªÝ/ö,ë"£í'3¡ž»%å%�^ƒ¤mV{;ã‰òtªQí4eéõºU¨jF¯Aï Ûw–â�†|³Ãa›+>yÒÄËì·‡ƒípr7þåˆé)J鉴¿ˆn社v|÷"£«æ/ðç´û±®í”õõ|ãg¶êÊøœ³¿R¨‘/Ò™ÙSGk2|7üë®çJÛ;R„êzcôJ `ß÷ÞWNfnD(£­p+RZL>n:â<µ�›A–¤{,0Nt‡[²–Ú‹°†ªè¿èLÍøäÀ ûˆ{oÖÿ_tºúMä à…#açH+Ù# r>¢,Ÿ�÷xOá!¨¿ž yH6ާ�H°“rbåÐß‹çngµjJÖÄ�t÷"œÃÛwÊhí]Ñ%­dbbäQ¹ì¾üÉ© ë«IÞ}ufó]{ïÝÏDcs>;Û´m½%–Œä5 éÈ»î+%‡,%�¹ˆÀ8ß~1 }r”WYó®1r$ O¡ŒÃÆ\F~Þî–j#¢™an騜 ÔÀ>MÝÎ °�Fg¬äJlMÄ{Ø|ƒ ÜYN y]tUñàQ�H4-(:Ž\ÝjÞbŠQÂশnÕÁ/,dQø+á™MF�Îf‹o2j�èºU©/:kÉWÀòØ�•w¼¹ÛSTëÃå2Àu1°ÛœEuð�{C×0:ÛçË»¬°ªa“,–Ä­”ÖAç÷MNÁ:Ùìf´% +yÖÖ'U ~rcYè]È€ +üSÀ%æ'§Ì‰×\í>0¯8˦,Mf�±ö‡ ¿)=IÄK�Š[0éÍíGqI ±OP/B*˜1hzn,½f7kˆU-V&Z5ͧǧ�Å�ÒtW`’¨ â×êÓ^+È|M¥ð;ÔéõÊJßLÁ¶!Effze�´Å9Ekyøî|ß´.x÷ÌÉiÙ Eº2°M"~ç‚—ŠÒKzØK“f¨”øgö•ˆnêá_\q\·Û<ü©áUÅ´åˆE]V~øð‡iæñÉ5Ÿˆeð8ÙêO|œóñ!»¢MòÏqtð)©Õ�oâéa}ª*—SABgfÝe0Ž¼ÈøV‡"×÷!TÔBZǧNüTL�ËÃ7â­™EC!熇Q +{Åü*Ü“tÄߌrª¿Ò¢kÑE€ÿþHZé°žgZ+Cº8ÎÄ[D¥Ç-¨†£` £ý´ŠÖV’jyý§@´âCÏ¢–ÿpëÃtI¨³)½dÃCšv*aFâb¹C$ðÒKÀÜ n~D*ð?f>ÌN:0ü×gIx-¶$l\£öÙ¯Æ áµñ Ã5ˆxŸVq$�X;&¶üš'Àq»ä$ƒ|½Õm~¸5�W8V‚Ê˯Á¿Ld˜azʧ ±J—yOþÃÀ8>Bö¯¾ MÅ3å–BjÜ2Ðô�b»5™~*Ï«y.¡�ù©ЀJ<›Æ<<Ž à]#óšC�®#æ<†ÜYä  NRQ±×¨`367á <Šôõ|²XK§ Oô¯ýi‘[æLi&+@ìtnšuADj°š�»±~‘×ÑO¹0p0li¹Šn¡½_â¯FeaƒöŠõê¾GŘ55¯÷Ëoa¤¢c ü§e%Ƚ '$Ѐ Á8SxN.£µ¾j%HV-Þ¸ƒéÑ#[qCØFf|SmHãOÐz±!’1R®eÆâÓÁ¡QKÜkÈ¢j’-X¼žb“u31ü_Mòäö­âÊÛ�!ªg¼º]F*eµœî€v‚á퇕°ò˜50p$Ÿ¯i“Wü÷PçÎ(¬Å@ö~ã8\È|•¬30/«V`x¨Sgp¤Iš.;aÂ)ÃñvÇôáÚAã4· ·háŒKâ„uî¸Õ!©ïÄ5ÂAž/…~ÈRHÌ‚�a¡kg�Gs˜ab^lÉ6œr“lŒ®iÜ1~Îî<>À¿�Òæ¡ô’Õ­ò‚vš4�{óRÓ.±Ñ˜—¢› œ�.yƒUT¿':oV{##$KÚ}LÙ•œ­n~�SG�B&â0Nú}I¤(+Ÿ(qdM© ¿¢"<®Ì¢ÛŹ”ªíC¶qU-òÜ/*¤é�[¸æ.ΚØ×E ßnû}ûäf&¼f¤¤fîïÒ‡�žF�8¹2¬Àh`ËT^aúц«ç;ñsVþ/{l£‘}Nƒ™Þ9=ÁL—ÔØú2žD9¨`‚jDû…sî0™ÆW^¬6îü›ò̘Øß·­"¯ÅÙàç�ŽÑ~³<,'¡kJá{m´s3y: [ÈõÒ³a«Î~ÐÂ8¸|Ç-½Q?縌]²�W6s¬×ñfô±iŽlÅÃ(¶ÌwÔ¥ÒuÈNIÙ AÛXJc };¼�QêúyÁ7Ä#_ $êyAØŸñÞô¢ìŠÿbÑ5?úƒ–0[²¡á-ge>†|ù�Ø×àm’¶+vïñØšPÄb}âd.å>]¸­ýw>•MÃzä Uÿ³É0é%„E¼c‚sãþZÚ%qú2ø½Hêá'óI¸l|?¹ì†»cïÈ£sbÖ�Ũ�CÖ3êyÀ©»ã”áÍŠœB À—)AÓ«àü·µP�ŠÖ2u¸4ðϪN(<õ俇7M0³f9Þ䯅FöNÔmg‰1E83$5"R´8ÈKv÷&¿<ëxl5PDLò†¢yd³­‹†½6ûÞè7Æ®/ì.&ºæF“šßsÅú%Ýj#�²¦?‹NãÞq²Bc® 7ïAâoKY#ï#Ó_ÝÑz7fqÏK´ ~âÞÔAÜ´³ÿ£»¸·ûÚç÷‡ž™^U[x’™^Y:³ÑìRÆDƒ‰n"àô¤ß±Ó6þ&±£—œ!JÚE£ê8¿A;÷­®=~f;ÿÍü(Ë Öß }t5!~œœ„“c ìpKÞƒTT×>ùl…ÿ‚à�ßaçÆ¬Ò íÙSøLkéC¸`íúç³nj)„æt¨PªL¨¸Þ•ÀÓèŸä�­p¨è.x +Ø’šZì�’àdLU™¸vÈtSB°nýøÔ¢Ú6Ö¢¬ÄŽ•pý‡ ÐÞº­U+¬;À…“�y)ÌË&Ï?NvM8r«�¿uá£`4uD¡”æ ³Ú˜nn'¿,@¼4n2ã>âËÕ<†áQíižºÛ.�§¤ÏÓø�}‘‹…<öBá¦i𤤙òþè¦1´¯$¥ëNÞË‹†ÚB¦¥„‡å!TF O‰((£d„ ux^ð‹Õ:�Þf‚àÑÈ8ÏJbA‘\«¦À?�äqÌ3ºß �¨d>ŒJàOJrp×JpVZ2àNÊÙ~£{CõD�´™HX¥¢cÌø©zºY\g)ÃÒ›ªÎžõ‰U+«›`x’mRˆ 8õ0úà=ò‘j£ˆ/z0Ån½K³±K>²#SelˉފrÕ°ãá±M‡çÇêôÓ&ö‹•ê©eàù“o4 OGñ»�$â²6Ä–‹aØß]ÞÅ›V\�(A¢¨h™'À–¹ªU H,FÔ…cŸaÝ7^fH¤ õXKé‰=œ–ª· +Ç]˜:%¦‹“$s4„òr%ÍNt }�ê¬ÐcUÐ,@Ý�ëžûõØŸתJÈS«`r=Š¢Äº‹0".•ë +Y°ëP4µð÷˜)~ç³$Ê Bš1óPÑáö¥TÁyÀC \*ŸYA�Qk^È�NrxÌ›u¹‰ É€0½¢Šw�þö,ÙNŠ#ïäÄ»ÌR�y=¦Ùž¯µã?íÙFuHÀe‰ˆ:9Í8Z=}Ó«ÐÖ ÏŒÓ_0ºCQ�v5œX?Ú.;è,p‹–m3uT‰•6{)FKwS¤9ßóõdŸ^1 +Ų7>ëÄ‘”RÔ}Ã*Œ =vÙºõ+pÆU$aùT&FŠ«9}©N™ƒŽº¯èð˜9lNtÚÈ#ÜYI^}ãð,†'0ÜÁAå• +ãàöË _±R �åÝsî¸.~dšöPórü8E pùFAMQx6¯î(Vž˜1&–¬æªùTÏ—4`á[ŸãÛëbÊ8•úBòJ“ŠÛ"—²µ¡Z0d¸¸7ÄQßRO,C4« ÜF¤öŠÍ…Ýd)dÍÔǸWº¼smÈ&([ñå-ðÇ»�ò¾iHxÃdØ$;`Ì^xö@$¹¬ ¬�±Í �BZè•ØåáÓ‰©?­JÕÊ!á« ‚ö'ÁlQ–HD ")úhec*j\á™Æb£Q�–÷�ÓÍOÁIÔ„4Yã®/ ­Ÿo2¥I6’]"_ã×o�¤œ!­º´E–ì(Mt)+ÙñÉ#²¨« õ×>Š:HE�!Æçw†�¡|"@és›SªAÔ\u> n᯻²’ØbÀyt��ŽúžÆ°¤&±Ãe�¸óa¹æYÛ-�MæoÚD Æj�@ÒGB¡’ÕXMÞ'Ë¿› qæfh⸡'ê]·6‰£C8!8¡B’”!>#Úü1°›a¢¤ƒÎBÚ¥Ó „´ Ōˡ �›àe½!7‡V +¾ñ&ÿ¡ÔûTÞÕݤÈcÁ ŒÀf²^Úwõ™°Í�®'É?„ÜïÌ +~³ð¹ÍtB†¸5ZxéÍœgþÿmþŸq· ìò ¹¦-FÚŸu‡èÔ�?i#’ÐðŽlq¹V‰È�PBô¼HIªm«AÒøG¾Gr¶¼S™yÛ + ý¦Å0Gï´ ¥X�¶‰þV.Á÷dnƒ�Ž ^Zü½®Ô¡5d6z }¹ÛcLR(“¦/ˆ±žTÿc =†¼ò¥>¸ñ'²¶¬Š8N„†î5ƒTlëh$ÅüY[¸-“l-'%䯒ûËR»ë-*�Diq™ã~—e4 â-‚Q…ÌÙ,á¢fK âæán rÛ²Ñ8Á³‚ÃïGºDãá–DXr#EOQù‰ÌÊtª¬÷‹?� +„0;›7òQ¢fÃÙ¯´!±½Œï¯Çyé0ö¸É��’L#Yûp—ïÓÄ¿ØxTUæï°áÏìvGü2“*±“h¶ Oárn=Ô}Jõ8Å[µ§Ìføƒ}ÐÑ.f�!h§â;.³Ñj… Üø§9{Q�µ«5=_ÿ}ðV``ù<ŽÉ`RœÑ“É3ÀáT¥‡Ø‡ƒi\î÷ÝTòÑïËCLA좙þ9ÐÏD<ž€‚6r"À53‡,×Ùà9Ê·äðÖm5ñ³F-Yy7j$D9HŒË-Á1w1©‰�+dAŒÿôð4éTàm"×EÔÈêW ÷ ÄÚt¥�Q´¡—¶B&èÿÓ‚+ìШ% ™š¹} ­¶Ó!Ì=~×>³ +k8;Â=ÂF|晵A™BRåKuÃdîcÆ8Äqú!q“IÐ@Ý…­Ë‘Ûé¨DR3G¯k<��ÑMÒa#ų5Ç7H•º4üÛ}ý¯��-ì�æñfÎÍ™sh}ØêaÞ,±jcŸ+_éÀu·£=×˼Š�Ù]ÛØË|tþKƒH`ù¦ËƒmcŽE4C/ NT>DŽÀbÜ—ººJ¾ŸÿSºÁ׆ôëö8~Ž&Å ŠäR[56Z‡‚NWÄ`‡×4¤1HuuœØõ±Ñsoy¦  +Z8ªP"3m©˜Þö¤³‰÷—Q%¥åy+›„/íCµ'!˜ e)nȤšˆ<_¶ ¾ç£ Øž:‹4€Ç.¦Åv¡tÌ\�âÛ?c@ÿ±�o:Äõ7?�¡7dTßnPS‡‘xe�7<ËE,8òħÇsža‘¢Ä›¯¯ˆâÓ½×mÍ �3xÉ“ÊÆ»‰D= 8õaÐ� Ȇ5�Vð¹*u¨uÓ&q+œ8Ý9( O[è1Y®OA£Ï©�åjW584ÃF¼¢"V¯‰Œå5·}e;ÞôIO[óE +0o8žd’EøÈ É#‘EŒˆaZ!g­r–ͧ¨ tf7¾‰¡´}cçmŸ]ͳ¾Ÿ4è‡@ñå⨠+ß‘æ¦8ø+M`ï‚æ¶7yV>ß¿ìœWÜq¿C]{‡¾¼á;ʶØ.‹‚fNè‡y‡ΰðªÂÍÃ+IÔn~¼©ˆmuÓq6çãhFŒÍ¶–ß*´a‘DÓü�¼=,rHÖ¤¤-F[ €ú­àèp·Be˜›ꉜ{�‰k,¿d�?ŒÃJ¢¶/q»Ò:E¤æDÌcœþîlîλk-楂ÎD1¨ÊÆ�.<ÄŠTw1tÊq"b¢–=xíP¤rb™™€¿dß^‘�”0~-ôÒÖÂrK‰°KQéápá°}ÛC£Wâ¨cä­©»f4lV¼/q‰žˆ¦ô¬ƒ+M¼K…Ö°gþ‹¡F.VWÛ¶>³ ÝþÉå `™ó*°�G¢Iã° $yPll{C"Ôª�ÄTª•ƒH<%_�²ø‰uÍÐÞ]ƒ´µv¡Âlr„ vŒË÷Êm5ýë®ê¿šÒÃþL|çÖ±‡Ó‡Æ%(/Ú¸(ÀÆÆoS\ +×ÁMKѧ*¯Ökæ˜ð…¢/˜ñ©‚ýHp•ÖêÞ•«®É²ˆ-]�ŸT Õ/ÙG=Ðì*ñ·9€àÝÄé; U‚Ú±�y¼4ºO Þ3èÿg�ÅÒnÄõ«`‰ÕÜ<ðå­EÍ6E~FûKo º b±å ôÄÌ“�.¸P®ÍCd‰Ô2¹-nÈ}ˬ.P^]Œc]±=Ó¥Ï~êXÃΗ YØë\ÏÕ±�”UmS •©b°¶º%Ý/F´á…V^ï$I*¦ùÉ!Q¾r¾Jm�’‘N±ô†vBøcŸ½*ÒcU.À?MSQRb¸†ØGK(ã,Xt‰Œ­9G|Ob=¨�öì#Kñ0 Ï CAu¢qZ›§èV�¸¼I³EàHÒý–*¯”ݵãý¢;p)Ð�§¨hM&d,öÇ€|° êW\|°”•)¤‡‰äNf4㉒’Ùoã‘¿ëB3)·DS…ISãÖÔO¸7ï7Ã�ãÂ¬ŠŸ^öDŽdFS¼D?ïA„í:†\ì’x”ÈÄ6(DÄ\¾u•-ÍÂfõ&ÂvÊ] q¹W2þUÀ Î ‡Û8Ý‹Ÿº[RcÚ{k£jiéÒ¢9ú ¤&Æ*¤íæÑy3©¦}'ãOñeoæqœph-ÈsqJ⧬ßW× +¾?ÄV³ü{gJFÿ�5� 1\ÄÇ”%­|mñyÙ¥Åúõ¬Y*Èl¯ *ˆ—'ó/ú´ë3¼Ã`Œ 5¦3h…ÝÄI¬RÔ£uÿm@ÕWå~ GØq¤‡ +šÛ¦uX³NZq«.iÛ›o>þÒ6�”b°‡Êá�°�§AFË' Öéè­HáéÏ—Àš¨>JAgÚhêÄÕcMÿ$‰ÈP ¯‘ …�0 L„ÊZÀ 'úVJ°&~ƒCŒ`ú§YG±t +‘“Ïm•Ä sAOÿʇ¬iÁ¨ÐK5—û¨™#pyjŸ§¥•LhLÔ�ì ¶Ž¼miG"× ü†¢Ì™ŠòHý4|Ä&nq2fç31öIs¨E¹­pþÏŽZ AKÊrpFãß ‰ú>äÇgí²‚CÕîÞENØkÚCF”÷QÐ3)u&2“Þ”h®Äq½ þo42ò»Hõ¨]évB•ƒ€(±duŠ «ÁªÕFÔ3šFr¼ Šq)nr®ý7ÞilŠü[¯=†±GþÕ{¨œhðÔ9åZ5  §eS=Ç›´ººÌ„ó'Q‚9¹�É!¥^v°?  Ð;4¡ôÜýòÿF¢³Ñ-z½jþæ8 +‚N™WêX™´ð.gôÖ±-X-´îÛ ×c.×ã% +5#{ÍÓ2ü$)š›ÜèåÒM’Rùû¶ÌRÿY!ËZ‘ÀæŒ<ÙÄÉa÷Š.1¼�ñÞÝŒ£Fêá¤Æ¼4‡ž LÁŸ»Ÿ¡÷?KÉçê(¡J¬o]禋3Û¤ÀMeÛL9ê@á’O·«•¾‹Ô›ýß’‰ôÝñ¹é¸#Þ³ »~ +qÀ�I@4à0pmæÆÖSE¨sOµ’ǽß,´#ΚWöß°™BkÄê™L+�,œë�HÓOú&CüZzæQ2P|¾Xvi0?tÈ^õÙ'bê ˆ[ãí »I\ù ¦þ#.òS5‡HâtÃÜOʉUê ":w‹ÆŽ …¶ ¶VÏ®ÏÓ†äiÈë�Oé®KžÖjÇÔ]ëïÜ3­%XÌôuh�H-`¢îª1;aÚŠvœ�Çkü/M��ñ]—Py¯hý©/Ë0!h¢ä46‹6¦gdü¦#äKE;¶Aú…Ó‘ðÑqvç¡âñÚ†|í�)ö«-KR½µ­® :…qå_¶“è� ” l%�Ñ<ÈbhE?<µ •Ç0ùЦµJ“Da™íË}úÿ‚¬KÂ:Ì…Àæ ®[®¸ˆL *U­Ý; žC™Ÿþn°“2«bàD{¡fW¿wtûsÈ;ؤÞ™`“o{-GíýxlB¯Y°Ü—~ÿËk�ÙøáhÁcå¯ñ5žwc¾2ƒšº‰ âw©¥ò»‚Õ‘âÓ§ ÊHÔÀ=«ØAZœŽ>ãØóÕToIÈÁûµÄpz"Ø=‰Ò9Ê«%—dCñëDƒä÷Á$w”±)V.œßªÕŸ�ŒáÆú”Ïh6?ôF)ã8¾<Ô™ŠøL-=¢‹Üku:†ƒ €¤’l+#»™ïŠ¤Ôž»¶¸4�ýHší@­Â3„¤hVoTŠ)¤!f‘�6ôJÄ<–®0^w¶8ÉCQÈðÁHÏ!Ñí+“LêåÈ…ÁúBiàÞ•Xú$•ðÀdÄKÙ¦¢…RÃ5�ç¢ é²¦RÄÆù]®hï‰ãôGŽíXöèÀ[lšÒV’‘xî¿Õ?Ù'=°ïÇñÿ$,î_㯱)c’ÿ-ÞÚßx-âsl@ÇV&¤ã�/ÇÊwÌOãÆnXø�uv#¡T»Áÿže"õQÔÜbi>“˜Wù�ýàëÏ2§ŒHð/÷Á_»nTy*Í9Ó'Êœ1ž ,WO­+¶R¯ÿn6^ +΀6;žNn„2ö5þ'jLs{„IÞq#lÛuÝ÷ƒjDJäÒK%ººSii´‡É%Ò÷H?¦8«1h7sô´ +ê×-ų¯YQý¼s…giƒþ½@9XP`WÚ€¼Ù¡‚é²/¾÷�!‹¤fÈd��×£s²QWØÌ|~’ŽÆµÌf4 ë^•b ñ÷›BÅÖúOÚò‹­æBÉ_8¯áañ(+ ª%Õ§†ý8!h¡¤ºÒÆ»]L=9ÿ;¥+"`»ùRüC¤Ì½ôÕ*8ëÝÕ*¥Ê²oûÄhÉÊŽq0¢ºÀ¤ã¤›«ÄBO(á‘·‹äM¥!#%¨ô„n'ÌŠ=X[ÄwŃèå÷¯#j²>ÏóPÌÃr2�Æþ þïP)­Wœ‹G,ÕèŒï«…H ´‹Ë‘u¡{Þ‚aÿwéª9†;ÑÑò–ºý[ +'È׃¡ÄáÐl¸°äÉ™ëi #ž+R¥ ~`©ÃÉhC«Z|¡|;º ðõÏ„™ü ­0Ñ|QcO±’q—Vɰ¶¬9ƒV¡tæ{Nyw;O…艵 Æ£1h¶½óÜžôÞ¶Ì31=Çý¼.úÞbÐ’).š~u´ëBmegª`]zË\¡Å>–]×à§óÐ4%¥Üwî.x¢Ø¬¬qiWé×eá­ Lr”57Â…S v† ûòžÌ7Y‚`æà/…]½nÄVßM2Z.£Ž*ó3“C6´ÃN,´Ä|"5;l%´£»íi�¤hOP–ŽK Ì¼È¢ÏæMð€¬›¦nï +"Hd“^,B^̉·Úm*QÞfÀ™±å)”Q":«2í» +ŽÙJrÀ@ªu¶ɰŽ` ¶}pç/(´tƒ jX:Ä¡ïÒêÎ8&¹Þm¥e{µãè‚çyôœú4‚PÓ^ó¥&ß÷"¬ç çns”8ôQhÊQc ++kÑ|!“÷‰Ç›…çcu’�+4˜�üMÊ÷ +�‡T[A¤ã…»ÿÈj¨oêJâùú—zMÅßBïIæX”öªE°)´4ô²ÚØI@Äú¢u)�ë}�ÿ…�™âŒm'O…( >áŠÀ ¯-¬_S ÿ­ˆÇÖ¸ç xµ|yöýFa “ïS‘í¼&Ò.oáu`ì|†eM¸ï/—ŸF2)9ÎôZbºlÓ baQhd©dØf¬ÀˆàQÂå^ô2'ƒAV®ª¬¯ÀõœwOb–mN7Mžh=ÊòŠKÉèÞO­iZг“Ú.g(}â�ž./ê Ò0Üæ!ŸM2ô€�T>MɈP‰0@[è8¢PˆÝ©P¶?2«Ö¸¯m|RDU ÔZcŒ¬™ˆÐqzÆ£–ÆûHγît]ÇOÛösB¢£ÙqG[—_8*äIÞ,À¤C ýþeÐ/]Ô£à"�rkÐâ´lG phGÌO݂ٙfÚÌ,`O‰ +B³1´x,¡Jká…û€x'‰Ç8àÙ¢@È=`ƒ|×â´`¥-¸rÒ ä!¯÷>Õ–2¸m›É\Ô¥y¦ÛRøHHÃÌXÞþY„³—}O>ÖQ�'Ð}ñD3âI _{§!I>VʤyU¦bÓ½°$X5`f +`\ÂݯË>¯­m \>C9¦Y]{¹êïa®HœÙâMíPò�Ûéïõ¸ˆ.7Au°·4ô+w{v'Ÿž‘IPx°»S„>„Ü]sO 8§ö+r Ÿ×õâex +�vp$àFÉ'§ë ®mÀzÞÒõÁe[�†?JÐ¼æ †„¿8P€ëÂj’-4a¥Î—&‘"B †�,á$l¬8^vµ{:™n™RR ±X+`Õ°"�·ðòéÖ´\8nMj€ÙOÛÚù‚�ÈW�ĉ‹^Hä·샕ùo3¯5~ Žâ+­ë@ SMß~ýUn2Öä|óºPA+´/LjXnÊå78¬œX–¿ÌG¿8÷!•¢Ö¸šQ\¢Ž‡_OX[-q¶ýèRЭÁ¦z,~ú™D>µ²èŒL$„ûûª�¡êbÃ:”}«…Xý‹.Ëm¼èXùøR ˆ©SôL©Ö„ÂÉgÓlÁ@z†Ý!�l½ª­[ AP¾ÄÇÆL£R‹FIÝhtÊ(²ôÉO8h™Ð¡ˆc"�°XYœÒ(!/•Ïr;û�`æ›BÌÀÌ·´D:úüÆòmP‚ŠlÎ.Pê,4.z5zI±{¦1êš±¿$ê¢çZ>Pª +‰Ç…M!Œ%ŒÙ„ˆEÔ�¿ žeÑ+‘70A1=Ô[bþÄ¿&ô«‡Ÿ¦j—{Õož,p”w>Ž¢ 3Ø3³ÜO¾Uª<œå@¼ì¨œÚq‚Ö 0‚¯Œ!ÃLÇfçÓùÉ–¿qŨñü`ÐQw:Ð.m%¸®EÎÀÓùú_5bOïÿ ŸD5}ÑéàFº¸yè‚ ™¦¬~ h{k�SBöŠ‹÷3h¿„q4�d×Lõ,—TÄ%ÒvªV*+攃¶{ �Ö=þ< ¦j°¬D¤0TvÐЄR[#OÞq£-”ï?}i\žý­ r5½o´p8ºUm–¢<ã&[ÚBÅ•¨çaB‘¾2`0cOìÞ8Õ‚‰[q‰J9ý/,>ø®YÉu¯õÅÆxÎP‚nCˆàYûCÒ#‘ÆKÉHH�˜îÙèN_¹d<=ó¥%ʱ»Ê¡[Ðö4w€€Õ/î²ÒË™Çîq§Û2c1øí> +ÑÑŒ±�±?))*€¥¹È6CwÔA¤MŸ«ö‚ªx{¢Ã"$qS{EêG/   þ}c¥Ñ(íÉA’¤¸žPY¬§fÁ¿.žÖòs�zqŒ/‹�ÆÑ­ïa¥ìÁ aö;ÿsMÀ—*>ßþ¥¦ÿí4ÒQ|Kʧ<¸^Äb¼i†8*ää{Ì¢¶¯ªgåk®Þÿpð]€=C{Ù½¼.TõN”‡k áÜظ,y¼wÉ4•�CoË-·ÒXÀf·üf¾ñsu}�Õ‹4ŒEv½8í’zDM4¨ç¹ 7™C‰|µV˜ “¿Åºä~/È_Š^†N,À#þ°z†äÈÍó)–ú!XŒ‚�Ñöu–Êm”žáátTüæpª2þ(›ŠaLÞè«@Õ¼><ÉÚaµa 6¾S+”«�E�§Á„™äˆ61¼C+øV•œ†Ëx^�¸zcL¦8æA”®(Á +(Ì�…®È^ ldV$ŸÓ9Ç$‘†LˆXL☠Œ-X`Å2UvÑßÊÔ.2ÒÐŽÅF³Ò +Ú‰ýg‘—lĬgšFÓdv\ÝB³¤8ö¥f×êý�>ÝJ ÏÜs’}˜ L°vÐZß%!´p¦j½F$}y +302j�ù‚†Ü%­›¦M¬ÐÑ•¦dY]�à@(ÃÁ1+v˜EêƒÕ«(®€G|³2`)á� ÔÁÄ¢ø +Ø{ácªAº(ð©SÜâ_äÈü„£pz°%H„ Çž”%Ã&~Â9Ÿ£šÜ†¯�íx:ŠDZ¾®IÈ!¹CXNCUüÒTÜ‘@Hnpt(DjÇúI{7h/o–Û;�übÉÇ!5¿ ßGâžHý&Œ’~_KfÄ©Etø©[}­=çñ’Î’ÛŒ·)+†n(Èâô\¯:<¡«A(ß +3†âpÀfŠª‚y{‹KZ6¦øewXv>?æ¯vö^ Õ1‘Ä)F_¥>8û/à†Z…¾¬k|,és@32¶i½Ô¦Áq9„iÃA³2�45ºr§L8D™?EéÛtÄg‚ßujÆ|�8¡@£Í眴Ïn^ÌCEÕ.«‡�ä n�Fq·íÓy„ÏWÙ~jGÖ S `"gÄÇ÷OË�íÖ%…Ówã"ÍVc=Š%�Žý8ø–UÓpµV¾ORÖZa¹< +dhXt¨¦ü}4øTb™xäXW:ÚØ8òµ˜<öã”�tÛÂ!ë['-ŸÃh6pìrQOú𩡤�ŸŒ/æCúB ^1?³H%ð�Э¸H� ?¨)ˆ&ÁÜe:fï£"æ3\°hcƒSû§ÍêF4&Nó9'ë4EÊ£%¹×щÐ’hâLQ”F¤š‰;Grš§­ÿ¥Æ½a(™»Ã¦HºÙà Ì7Sal˜J]R†©s¶uÎV]]@zI©«�öÏö©1vëtéÓ^lé¬?ó·vÐ §qè„­}NxºŽßh"/ã;ª¦ü[Ì@uŽ¢,q—ÔäÏNHºc'´^¯ÂiE©{6m©!P²S÷‡,ÍãØ™%á‘•<‡òù7øSoŸ¥÷¢°KK¾j{>¬æ†Ÿ#Ê ƒÛ¹/xÍ@~:ÀKä×!“>ÐIˆ? ì`XX†kŽ«Èi>颯£Ä"ÞN˜´§F©Ð¾Ä;^1&R'É +Ø®ŽŒß6®N]Á*x¬ä1„ÑINþà¾æôÙ‘‚‰…û±¾„§€Uv»Xþ´NºÓ³V�6�´©æh&Š»Ú�¨ñìûxfÂÑÖ·Ûš�fÞ@øšpªgl7J¤„pU¥ÐÚ¢¥)M%G»È ÝjLúëU‚JI»j3§Le}Jî)³Q®U´©óo<÷ĆQ þ›Ã)œ‚ÝkO7½ý¸üme*ò0h¬åÕ(Q'ï%[7!D„Ð\@ó“Ð[ú�’]ÿ-ÄD]•}7Ñy?l\ ïѼS}Z-¬¡fi8eÓ �z>8!J#)€”asŠ„^拳�Óh&æCA‡…:†ãôKÕv«Äq~…â.Ê•©ÂWä´1’ÀnX Â"}ü)žÚ¿Ö{J ùôÓ/²Hø�*÷CKkUkB»ÆÔ”l¾\.X™p,úVZtX +kf~ì<¡CÅmDŒ�‘ïštg$]ÊFhMÓÀ0ÈŒ¯ÒClÿ_“W�mý¸@yÿÉ TÿñB¯Ž\¸vÉŠÏvÔƒÖó¶±ÀËýa'5̹~ WQq0.Q,¸`7ì'i{Ì¢7Ú÷�ßïp-/-¹-ïÓó¬c*!v +¸ë –îì�g‹�Y°í"”õñk�O<Øóœ�   ¾¯L�I£œÈÞ%÷ó¬ò­S·\»Þ A@ñê³õ�ð 5i´]ôžhYú[C�4Ñ[\Ú3–›",qYÙbü=�|9ÜíêNÙ7ë†Ãu6ßj½l2Ðì� AïB’Q™dŸZX,HÕëî²3œˆÒÄðãÙWéÏ™!Ö§K+ÍpÕ;@fÂÃÕÿ’i/aüJaõD”»ÏÛPfÓ`³º FS¼«÷üd˜ØŸJÿ|*~™—„bUƒ~Tì=ó±é'¯ûœß y© È[·nÒþkÀ*>ÒÒI£˜0)˜õE@KÐHË…D¢vL'[Ý0%O6~vwÁåK½ Ïj^1ìÔQۛť™øù«Ã•¬ûGáÂ-•¯¥…4Þ´Ó0¡ôÕû@£¤Ïj^ÄNÖ[¬ñ°pTÚod©}é AdÔ�Áú,¦Æ�H2;å#éaô±ü#xí·ï¢Áߺ} àgÏÝÀðÕ/Z–¹Ì³˜çQŒHXÓƒ-ñu–Q)¹‹Ïޤ© V¿Î¦,->ÎFÎ~k�MRUˆ¤¤bŽ“‘jÙ¯Û²ðÉTKµª°(“ÛøºC-£€r2ïë 0ÿu"©¬ +•'zbš‚†Ä=×EGϼèè X¬è!dfèyj6ÑCÔžgä£ç0€B¯C¶Bï &z_§X˜B/ãJ‰ž+„Þ¹0…^'Do „>ÉZ˜±¡›‹ƒzXÞj�•b¨‚c…O٧ᔳ›•Õ‚e¹¸Ib¿Îô¹Ü¬.dÞ~]Ë;@MÐer¶JãD ¾nñu¡ÁH±¡ACS¿®P¢£Ê™b9��dF©FªÀDÔÞM±IÊÁL!“L&5ŠI+E<-Š=˜ _WJ1´ÓFRˆÎ4aI˜|݉±É%sš¤^Æ š®<7’QesYå(Üøxt•DòÐôÔƒvÎçÔØÏ„„¯!%®�5¹ü×y¹Sædù<â_$•í Vø²´v¢$�óŒ¶UYC"þºŠ—¢÷»!0@ûu„±õ‹ÔÛ8ΖAVÖ¯8¨üŠÁ¤WG3\ˆ$ÌÂ’ûDJèØØþj ŠâäÝB7Œ‚Àtó@𠌘²Ä§˜²å3—C(8+Þ™²³�S*J uX.™ª=4u‚úæ’ÚÁ--T*Õ0–�ðë\#~K?0Iíp3À5r©@‚vKõ ½¥ GU!†ªÆf +Q åÄKÅœN–zVº¥~Ý­u*µ1>a Äi + +¡×ÀÚÉzÕO¢AÚЦä<çyY�%EçDá¡9tJ‘ÉcXÎc�b¿îå)kj‹*TÂiê¥,›éc:auDÅMaÆréIHÓXÇs©ÚáR-#Ký:3R-õÄ-G¨à‘X�s91¼O#’¦”Ù窛„Í\pŠZèˆ!êWÒ^4ƒ‡¸iªX |)î4…5˜#ü,xäR0œ¤R ð’å8å¥@!ø:˜¦ö"æ ÓûÀKë¨d'ÂÆ%Û)Ûf@�µØK±˜É>Êa4€hhTÉP†,¨â<ƒ aatþÂ(V9Z)»…:£™3º‰Æ7– �á¡7Ž¢á㟬YÂkÀœ´è­@| ì:kŽ>Ó§¤±-Øè×Mf†U¨RpfœoÀÊF¬â^¸×dò"ˆÂŽ"ˆÂ.°š¦.7M]nšºü¢«…½©‹íàr¹�*£ámsD‘F!Ãê'¶ƒË�(!%D›V°Zº(º„•Ý^Uv{UEi.HŽbÈU˜:Y½>—»ð¹˜¤ÔêU©Õ«jjšÏÓÔ4 ¨Ñ(6¨¡¹šÚ¥›efáÚ:âÞ¯Ë,,pq¿.³f(¥Eq3 ŒSÀâ(@� ‡C¸�RÊ"Rà9ÀXý: B˜"I,áfâÜc0¢XzÊxŠ£¿Žb@¡P,Å€A¡ä,èʈe©‚²ôl!‡Zp™&`Œ§Ó;hÏ,¸¥Š�…ô±½x)D*ñ‚o%”]!ºS»¥BT¹´bƒ„Í ½b‡Û€¤Ã]­TæX‹áf*ჶ ûGR•K†Gšö†5` O¿¿¥ Dß\r¢ˆ^†l…Þ &–zfô8›¦_7J±bè—¸$®g‹P¬fòqÐD#!TâP(Ö×@/ÒVH MM$N­Ý2�P«öÆÞ0ˆÆ©·$'÷Æ*•H¥{c‘X-‘xÑ€Uä!‘‹†¸hŒ†‡ÕjXq8†U6<Ìv`;¸ŒHchxX­•j¥Z©Vª•.¦ˆ4™ˆB�&¢‰>(ã' Êø‰ìöª¡F’;Í.æÀÀÀÂB…©_Aäz FDS!ššæû‚ÈÕÔt)ëÍu;ÙW'›aÙ¨]¾“Íp$Q—Ü=0_\8*Oƒ�‹¤&Š\*SM0¢m†õµQâ[f‰Œu;ÙÅÄ,kMÀ° +!fYÁm–5Ý*L-p-j¦¦#ŠÜLÅ�¸aCL q¤„Rà‘;Y‘œÀêÉ;VÚ° +b²†6g† +Ì‹\ÔŠ[舛øJÒ +k(#Ñ>àAÁò4Y+ŒÆ•ç'U% šçÔ ….§ ée1Qr“O›hq蔜¥L½Dj>;��ƒÞr5Nùu!ÐLÜ„Mvâ2 Ð4e|y(Q‹Z;#M\Ý`½j^Àq§b±€<¤LJ"•„1çë쟲.F%3¬§l†Õ&.yÊf!ªŽóëP`+߀‚6å2„ŒrM («²Õ”ÍÒ”ÍðZZ)S6C½à¨à;ÊfHåe3O,3¬£l–£l†åD±ãhG(˜ ›!çØŠå¢JeU=A6Ãúq™* ˆÜŠÀM§Ë ñÁe d­$ô°`@+ù&Xëƒ2HIÈqF@+@�ÍpÄ#hÓ¦3¼ P ”Í� DZ_‚²>dl=�#66¢%‚²’! ”Íð†"˜ÿN¶Œ˜z"0Oº0‚Øa- +�l† ›äò¯É&¤&~êz(Òbn" ++žæi4b4ÌÆbᪧÑHƒbH¢Jøu M6N¬j À”Eõx ®øº�Æ3—Õ‚(lØÈ ÎeUò ÂÔ1v;YÑ…IÙQF*k·ÉZ•ÙËSÖGUy�Ũ–$ö�9M¾ÎBtK’{Ø!(€�ŽdT)Y¸‡®ÁI}ίûº½QåÒçë81“ÀâxmLŽS'ÆS³FüÑÏ%[ÿu Ú… 㔈Ox)¯b'ž@ëQ�Åå1Z´fìai$|݉~Ý×�tÂ#üº¯ûº�¢½Ãj\ D¢—Sd =I ñEØA Vx-'“ƒ¦© €*¿®v@ð99‹f/¾k«µõ0Ñ+b’p¯ëU¿NtD¾®QIÝà^ŠoLRðë¾Î0‚¤é¦1¨‡gNr¯ÉNiÅ6B%è�i$þk0/;³äN™H\·†ƒ$nçó˜¡1»Âg'!üÔ˜Œf»BM¸|Ý#±4N¢£ÒÈ46ö† JšGZÈ·’´½N;6ù:ÜKñ©IBŠÔ4ð& …h[ÑLïf *`¥€Z +²”*Lµ‰²ÉQ +ÐF(¢¿îã!qD�4@,:+z²zÝÔ=�³¹š%S'ÞúT1úŸ�—W� „JÍC õ ­”ýºÅ~YBce3¬ÕP ïën¹ï.Êî‚D@ó)_'2n…¡pÑGÖ)­8j°óëN8‹‰¢hÐD%©¬”Àz\*ÑzšFc_£µÂ7!4N)J˜‰KSx²j€TÐ{À¹�¬£äZÔ̯3 +ÄG!\þë¾îë¾ذ~„¬Pâ“¢#òugŒÔ0` UYoÀÚ¯[¸NíàS§Ž‚ðq;”_»’€$p54hCKé L-¦õ”ÍÐNt‹e1‚¾Æ +AŠe;Ù íFc¾vj£vé�¨Ë „Ãæò�˜b¬0‚øš/5_w0b<$ŽHr¥D3 ^_4`5C‡³áf83üJQTH(xœÌ´ÉÌ™Ì ­Ì“!ÀCÂph™¡Í±l¬ë&c™Ò˜íŪ±X1‘Â;¸ÙÃÁdÊ•L/5}ݬ$+ÅJ&Tú*±Jfh¿®–*‘@,ûàbÓ”²h¥™ÈS à^–vPj•8˜ê-”°!-y´�I³M"Æíõ!ÙRÔA.–¦¾îT"Y·“E¡\¦ Ⱥ©#Æøº˜AJ&rQÓ®¬¶Ñ kIš•1¢ŽæAåmG4Cð€KL“ð¾î�ËXÓ¡àËâ�@ˆ<ÂDéà¯Ì†W PBlB X¿�ø˜o1J$‰I� 8¹€ŒŽôÀÚ&¹|ÝD +Lë*5¢¨ù&âk²©šUñšÄSbP—'mqÏMRE$‰=�4è׉g2ß¾n«d¦¤²�èsÊX:ñΔ•ÑjœrA÷ª³ñ~ê@BŠ^ƒ¯ûº¯{„I LÕÒBN²’ËZPì\ÖÅ+ÈŒKe3$¸2-‰ +3T¥fÔ‚åé{Ž*Ù¡[®[y\“Ž~•4ù¬@´>q.PìLj5Îöл@«qʲ²Âû"™<õð6ñÃ®àŒš�„¶¡â�ªÅ×}ãë*¶K舉Î3¦ÄW�ðËà+«6ÐÌeú´�_—’P +�À8eÅK‰Ÿp…‹°}ÝÆ•½«�‚DE>=N…|-ÄÐÍCµ°9†*Tp¨õ œ‘øiÅ~�æ~ã#šlmn„qa ¼!2ͨPI�ƒ}N‡´YÂ×}]Õ.K% >—/6Ç+�€†?Uá`%î×5Æ)I©Gã\ÈŒ.oŒ õHƒï&N‰ÖXˆÕ¶Êªîë¾Îüºj‘™¡7 &z$¹©ÙDïqP0FˆëÅ6°š€ÜÄÍ  VBA•¨·[0TÛyë·b�‘øä¨±‰ºÌ×}Ý×�'(z$Žè¥c+ô423¨Œž•0@Ó= mD ØÆË¢™ÐC¿î¢U¡ò`)cïhY.ªGè­�YOûu‹¯›Lj§¯CàÒòô|V9 +ÅRÈ£Ø*G©4Íä0BùºSülçDá%î…b}âè …µÔjœ’”‘ SAñ�ÕÓ£bCÎíd[_÷u”¯ûº¯»0" ++J1)M„œãëÌ|è–ÛQIO;C/ɨA¡%‡Ïmõ“›-âTmž–ø:åÈ1‚ί3_VÁeeµa…:Uÿƒç uq:ÀLN?QÄQIXD +—ÙÊl˜hêd<11 +g ¯w?gšÖ8%”ÀúSq‚6³€ºüˆs#@yPïà›¤¥ú•#ÀÃ�Çã´ÆÄV~ŽÆäÈššÆ <=H+âë@Á"„œãcLì€C‡÷¬�­Ï”Æ�’QùDçìÃXt&"È'xù8è×ͼ+« +¯K3KFYABŒìÒa[I^EX%<ÑIx ±zd+ô@= Ù +½ ®6¡€D« …WN„—n +b`䣇³iz�‘2�ó:•™áÄK¹&—·xˆÕËh%WJôÄfaàJ‰ÞG¶B &z6‚šbg*3ôÃñ�Ž´á¢³Â—YBe.@�õ_ÇAø@燇6jC™ZM›×+µÐ\³G'”�€[8ù0*Lµ—ê¹t²’áò_×Éf8ùt�K$Si� ¥NjdDÃʵ K$‰­¹´d�ä¹t“œä²Ž’KQv{-R«W]UF5£Œg @–ñò”uÆI” WNYTÙ kÈ�Þ¯kéS6Ã^2ußR‰Û?ŽÊÂ1Œ¢í0A†E„˱ €³.\Y¿îW¸².ο|EáZ$\Yù�+H<›| D½zá³qT–u]2Jf +kIC2ñ ÂTìº+VYiV ›Å2`U«, X¢‡UÖŽ[aê +¯J‡”h-Á“Jeu P^ŠÓráÄ3`ߨ¾‘.Ý €+K�b†ÐHϹÞÝùý�õÆ:ã¼s&w·}ãÌ5绿½U¿Ö:_Í«ý×öëΟsÖú¿wüúV‹ùWüºg½÷ÕÚ^ηÅý;·¼ÛŠŸßšu׺_l­å_3·Úf}qî÷«Ö×^˳޸âZ7ç¼ÞþûmÆùóͺkå¼s}\/ÉsÞ˜_Kî€þºóþÛæl/Éû­Ï·Õ[»ùo{íw½q'uçZó'y¾:àv�-îõòÛs¯ÛnRè\óßÜÉ�y¬5©o�ëßο÷ß9[~7×;ëþØb‹÷Ŷc~+¶w×˱¾_ñ¶÷ÿ+ιöÏŸ1ÿ¾ëWþd¯ÕêÛ«%uým3®=s~;çZgËuÿÜ÷½–×¾É\oç½çŒ­Îwc]mýÛ!Û·úïíšÄï·Õv»™ìz±îã\mÅû³þnñ%ì˜oÍó}òâͯշ¿þûWNÚ°¸Û}-Öo­wí�o}wÕd;¶Ûn/ïöâý{×Üñ¿&Ÿw»¿rŒ1'ëX�u¾߬ɞõÖ¶~þüäóþµ“<à-~{ñã�/çz?ÉsÆ¿¿âúõw¶ã[±í–ó]m¶8k|{¯Oî×ý»Æ·W�ëæ[ËÉ:üƸV�¿W‹Wžs%7®ëÖµö'uÀÕxWÛïÕ½b}ñÖ•_ûµg~;®8o2ç¿][žy¾[×|û÷\¯¾Ýv-­9×UïÜIý:׫ùc½óãßoóçúÿ3ïüî¬qíup‹«½–ÔäîZû~Özw¾÷Õ|ßjs¯µ­6w¾kÕ?'÷�9gÝ7¶$ûZk2`ý¶êË{íYÛŒ{îZ½^›ïÞÕâý¼ê×<ãm-ÞüÖûùíþLê€}õÞ8W|w¾w~÷Í�Ô7_l;ΗÜ–?ßÿ_;îýõ­üë}\íÕ•ã{­Ý×Ê÷¾“=@ç¯5s’¿¾»gÜûî¶çüüÉþ›wÜ¿kl¼1¿ÝfûXߪɷÝrnùΗì?þëýø{çÝZ²ó×|sËëÆ¤ý¯ºk�û­·÷¾É¾¿sÛñÕšä?özŸ¿ÕÜ~¿¶U5Ï7ïÊÉýŸs¾6“{ï»{µ7ÛKÞœ¯­¤®÷¿ë¬»Þ¤ý®ÐmïW¾-ÿKêçß\/Æ[ãú¿ÿÞkI�9¾“¯µ¶Ûæ^uîßí}¬óÿþßÚfÎ3ç$æÝÞÞmæ–äz÷NV{·Þ»k®·ýÛ{~�1nñn¹ÖñÆ•´Ï-ß™¼c¾ööž5ÍoÏ6/àÿÇûk߸jÛ@ +¨Ý§*h@íf›ðkPjpÍ*ß×¹f•Ôg„¸ã‡bý×m4æ;› h¹„祬¤as; +²Ž¸'˨Éf8†eL!þ×M' +V'�X}ìT$š¡ o`dAÊñ̶EVñ€aõ5ÊøÅçƒÛA6Ã…æb†ÃêÁ”¥\ȸµÜ']ÃÅn'ûØØ�#«¢8 ¡-É`âAD÷´¢$®�#qq�MÜò$�û®$1ñF*àr¨ì×™H *”KÙ�BÊÒ,Ë IS6Cò4¥le3Ì6µ+(ƒÅ"l�ÅÓ¢XÅŽ²’ ÅŽd®\�F¨…²TSbŒ)effF€s ( +†£ñ ‡îíÈî\Ü(MiˆZ’ƒýf)ƒ]ET°Íbú" ªmu‡ÕœX5Çî ª‹%ë [›ûä ^ +ƒsU'× ‹®¥uSuŒšrÍB þ·uc,”ÌOÝ‘½“g)L¼c&Ô+Ç®¤¿Z ëGq„[�?jÞ´øk¶Ïaib4 V5'£TNcwEOt3ÈKßéøåíolŸùí¼ÏœHSÜÇ,ÊÔBuäåt…æmœðàð×–€$„Ø!Ê¡¬øD¬�Z<3íý)ý’æ*JÏAMþ9C£TÓHyž:‰Yô®è™ÃsÎŽÇ-Qt@,²äà«Ân¼@YP]ñÍ(“)62gœ<”êÈd@-Ö^UO 53Yï1‡C–\Tš×µyÉHVvd¦Ôí�Wï:øì1;Ž%yýž£x�K9Al,ÑÙëè—¬×ön¦{,Ošìò\ó§¦ß©Æ ý^Á.ôl‘™¸Â®=é\fåÌRê¿¶öG¹Ëz*lð‰D®©6A3ÙUø‰Ù׈îÔöÒŽ°ùçSg­‹ÚÙ–¹—˜ÐhKÒ2^y ¼šÃR^E¸‰Í¨˜9§P&¢¢ízÞ¯ílž¸5Šch怦‹­Åª¢4¦s2yW‰Sj°-¢Gø¦V ÔYÖ6ë1eñr­:ðZpÕûÌ!²56oÿïÀ†z©»k@"Y`/Ö$ÂËb.ÁÊ­Õjj½VgÁ•?ø¹¡Ø yARPì�!‰»ÊúCÂh„éÝQ´7U¬ýu�TïÉÀؾ±,`ì…ú–KÀwÛzÇ™ýÂ_/�k04lÕ�~øo›a猦\éwO}XX·�m«üz¬À;ƒ ÍƒRñ/DnÙÜ>CláŠÇ¡áu¤Ù‰ô2%ºÓ&.,K6sbÑDù…vÚìåñ³¯à§Dq±¿hGÚP¥Mx¡U®€No}¼6Óf‘wZO·šÁ©Ø(çºå»&Í/žË”‰éAåCg­gi¿~ÍÙ ñ×ɇή_M>g7˜Jšð#v6uWç0âÏBHÊB«àG†iTaÔ[ަÐxo~[ºR C‹—œ–™n�¶¶J¹‘†2×E+�¿ŒªeÊ.JG²�=g’…/£/W‡â´Ëon.À'åZm((Ä•ÃUÚ5Ó]Ûl=”‡{réj Ôm¨$c‚– EA ltvÒ^áÞžBa[|åâ0%1�+€…o‚^WZ#ºÒni�ñ}¢èEšB«šs~6O«�ÂŽDý¦ ­º +­yIÖrX5Ó$Ï»3k1IM÷§V4SKHOZˆ±ÉR¡CÇ¢Gÿ£+BCàÉ6FÙSÐTÔ¡/_V°BC³´„’‘i*—NY»gM×–ËzÝ7Ü4°,Z”°r_6œrSn/«—~EÔ€�5”6ÓÊ%D~¬\§¯8Jeg>Ë’˜­†ÉùÐmŸ©®ºª[ÃÂ(¿5å«é5îϽ„u¤À¹ÖÄPÑq˜ø�÷tw¨L‹\V—SÓíPÌëÆ=½ñ8\£%Êû;¹7Ï¥èèhçPÿÀ�jö²ö„ë�s‘%¤’׳áTyH�öT1YûVKœæ¡d“±|•¨ôUõ „p/À´jN8ÕHñ7PžR—´„H%'ûL¬B™XÍvNBxÕÏg +»e0s;=w°ó¡Þ­šLeÚ`+¼‡öæ3[” +FΉ—VÊ=8ÿÌ÷´&—é?Þ c²eGˆæ;ÿRÿµÓÒä$«lJYîV¼™úxf44/„æ ÛdVÝõYÌ4ª!/%¬¶Ø Ë¢VkŽé¶¤IwuJ’ ^ºÍùõ3ñ@1~³�ÝP�<^(2 +k'QAEì¦g{ÁøùŽÛc‹ˆN@·|/VùÎ(¹ºþ2i 0;g7WÔë�î Â7áÌ… “Ê8Ñ÷ܹj9¬¼—žö“�q=aàÿ62’pI¸ÖUºh)sçÓô+/T/Þº(¼µE’rE&¦ˆ p©‰ÿ C¥È³Ð t¸~Î\±›8ïUfž7kar‘¯¸zmBÁ(;2…O ó'üèìs˜8á“ÖÓßÿ×Z¶ù.%4„–IÝ@ÉëÕ` b±ñeûÄ!¯Z_P>à9ŠÐQåÈ,%­¢Q(.†jÄ(¤C£Í~©S1 +Vü‹XÄp^mâ=H–‹°Í%Á÷á«ôx5Ï}»¦Œ{é›%]Æ�+ÇŒ»b$2fØ„ ,pOx^ríJpຠù”çãðÉï-àÅb‘ZÞ…ûU~ù4ÍÇsQ` QÓUNÁªêMƒ»ocÊÏm>änÕ­]p€ÔŲ¯|C¶ÇAâZ§]{|Aë»îd”BêîP‘8µM'`äìîÊÀ�«õ%ÖÙ›"f"_� õG¦OàßGò×:« ¼íD+»*²s¦p²�¥‹Ô\Bÿœ)3yTQfL•� ì$[Ì!}ö丣bag°Î(–ä<¸ ~ÍÊY8iÀlÿ¬8Ô(xz€røªR†çdpœs$�*ALŸym#ÖbŠÛkšú†“�3¯£ó˵ªœ¸¨Lc•k •e9¼›©7¿l:#јõpüs² ‚\ncõž�ÎY°Ü.fÙ¿±Û;&vpC‚àÂuÍÀ•Ü\Ã9Ž qaÍXÓÜGÅrW,'ÍF‚l/zÜ\¦˜C  *iRã×ðÛkÁÅD‘Û+ÍÉ®¢ã¼ö°Ö¿”¬E(no}÷ +Ál¯L(N8Ä$N;#kÉ_bh¸D€Wó�\êTÐo‚h+Ÿù å4J¿qV‡ÛXµÖ¹ U1›ùj\l ºX˜aÆ.·@ÌÅ½Ò )�;¤‚L,©”4y^W—ÅEVj¡*˸Y_þªˆ·š¸R$’:úîÖ +XþFÓ$iÆY| úf*dè…w’Äê²TõË×EµFÃÎkhnÛã_7µô„t¶”-ÄŒF¼hZß·‹í”·^}}£D]¢KÊXÀR�:C½C{n=Y”B¥fi…×öˆçž-95µáLÍ `ÍÌY}¤MÍÛ� -Í„êÃ5ok÷.øÛHÍkËÌÛ„Éš—yÑ�'ö3ïÀ\óNŸæ˜y%øÇJÍ¿w¡=óšsÍÛè¨3ïkQÑæÃWp3/¶·{Èš·B5Üœy“³æ}¹EÃ^‹Ô¼¶Î¼|sRqÊPz�2¼Ç²/Q¦GÝW²2•°z7_è—Ô:” ë'ÌÝ­w°ý>Ðê$þ׿«DÄ“a†Ìã@SÃ�¨¶Õ‚ý€€·°Õ‰Dá´¦‘÷žÉ#Óô6ji'‡C3¢+¨S¾ÝO +rbÃ&Ÿ_ å-L•J J 4¦ ™êQ9ÀŒ.ÔÒë V›´C•ììû+7Úÿ^e°ùh¡+÷Ãî€)Eä%©º°îðùN“ÖŸš Ú��UÔ;_òÙrgÀ˜÷_³…€ñ¾6÷_­!´yПg)š‘»–¢½·ô÷C¥0dMf«Ú¤í/ÇwBEHÂZM¨ÍšÛàƒ¨2Ñã¸WC…%ë4¬}q k´Ý°ö£�þÁwD¤&Û +oØE²¾‘°��‘Ï!Ö�"´F¾æ€–¾$fe)w±¾Ù>?«ÂP7ÐîfÎùÅÌç°x!�/±iÅÿñn@ ,íò�KW_Ò„g½LÚÅ%­–OùÜæ—{<�9À÷Cóy7V4ß7Šù¤Œ2á..1K� T|bäæ«>ž]èÝ(¼5��F¥”‘“y¾QÓ¬åºW> ¹º[–ÒêwˆtNotzFü�ÍŠ‹»íMd;(kòK2­…VÝi©½È'q외»shÉ fÝ&´Ÿ²|•–U_� ™§”Až<6ÚÏ´[úIB]QÙw· ›tJœ)Z„´"¥êÏ ¤»)Øýyq!åIÛênEv•�K-iÀ»»q=(óhØ@HuØ¥FÈeµ›î†ïëJ»ÛHªÐÔ¬òÑãªo­©Mq³h»Š~¤ÂÑP4H�Ôo3¹Xe*•|¾Çm¡T¯L°_nf/(P¯ØN`_ÛÕå¢f!ž +å™ q°§c)îxº 9´ýÒnæ³�hÚž›ÛjåÜ}�hðUmÇèpŸijxÁQ2dý +Î_mK³ž³•«¸ÛeQB¼§ ŸÄm¯ÇŒüé…ø#Œ4cÖVVl4ðÕÜÎ"ØQW¡l¾ÏqÒ�ÑHíÃg›dÅ9 õk âà§å öèÀȯ"(•F<¥Án‹ ûDsôd²x*‚báf\®ÎÈ"“ ":æ"(‘ñYDM3bFA©ª�8جÃF�XÐ6,­Xž€ÍË�<«<ÏÁë¶ó®òOí$,±�Óö¤VQ“FæL¾›ä5E¢ à®RÁ¶wfÛ_L'ïк e1ž°˜'ã+ˆ»/âe–çÅý<ÑÞEyŽ­‚razlL­[0 +ÿ0gš]Ež¨hè‡Fã`D�ì"“-ß4±þ @¯ƒ£çx §Z¬?$�«Ô€"˜‡Aj‚'sÀ Ô2ÙTç[“ã­°ßÓ£öɽUˆ€cú`…‡(ÕÂ-ëƒðÈÅaL¼’�Ý–‹‚n«\tí*¯+X˜Ôè{sá:é§»Ž$¶ÏgWbÛšbÁ.x�9`ý\æ¯ÓùŠZo=×S C°ðe'ƒé‰k·Bs¨SÐʉ`ÖïC�¾ÔÚq¢;¸²û´Š˜µÇš…‰oÈyƒŒWåOù]³ÚïþsõWenw¿{šÅùlI&7÷äXgǃ�ºK›ƒàfôb_m­Î£ÀŒÆŒò¢ý™bµ÷oŽÊ`(o²;Ì$¨GM^&’•(úÑ+³‰Þ$ê'£œÇÆ*uÙ:_Ù ¢.mcvcoÁÎ3´VoY)s4Ï0@ïÕªqû‰üÈB�¿qT-ªÐ³³�mö»M‘²\kÏ„9i�º4H&Â2…M1Ñ¥M¥êñІ³S¥Ý~IüíÕ{‰røŸI)Dà}"ÂÅÂas]¥îIü­D�ëljYÁ‰¬¢gñ=áèu`<£žº�ëæ¹u€½ÄëÇèu_ÞM6ÐÞÒë Lt§^‡Ü8±8â«ÉûE]‡œn”ÒZÑH ÕÆ\ùã½ûþü/í„< ýETÏ£Áâ¹1©Ñvk $êâ +ñÂÚMÛ4­ ]ß©Ìt cz1>ú”vÃ{ú=XËb”ÌzWê`Q0¯--BÖE.^>U@GAZT‡1ü;Ý_³‰mhJ¹ÍëÅJËþk@=`Í×)xÁõé,Ø”VŽþd¨LÓ!+ ÐJY{V¡É|4ù'§pÖw¿'ÏÖî<ŠB³¨þºhu¶RIO¥^¯a÷r¸‚1ÏÐ;gWîIÙ’y4Á¶ìCˆ¯‹'s²4p�]XÙ(VHäŸ2÷Ó] ñíðŸ’+I3çM˧þ6ñA>›zûnÃöRƵÖãÆg¹•*=z!}3¤Žª\MºøÏ^ Câo2°ÅxZI¦?‰Ž­qC6g¾§}­«CNYRÜ’@�¿°ª8 ™£{ÖØÃg¨ýY€«U l¡åÑäB[ Ý“vþ'>î’uŒYÍÍÆåž¢ŸÈŒåXÖ™1á‰Ûàæ#tT ϸK¯~E:ä �ê¼Ü›0ÂÕ/Û�äAînsÎŒ&~©2T¬R=Œ)‡ÙÍ¿M�†,“êˆPT¸W½£ß‰(ߦ"'.A�¸5ÛiÃFþIxû6:D³¿ÙO[NKuzrFZ­}Œ*øJØËEA¸(pŠ{DˆYu·ÉGÈ·‚v!üÒŒŽF•Àû¾ ïýr±–\<ÉÐmåZQo |öA� �†b³Ã™”FšjºvÁüía¤+Î¥œW–¯#øZ È8HCC«›P P B{ùdžj�ÿ%KÜäÇñÖ}ñ¦æ†y¡»¤%_Ê›¾øD 0Qcº«ÇF> ¶ËïÑb²žßéæ¾5z°q7¿ Àw–ž°*`*b<̯–Äï:­¬Qc!‚Æ€AÇküÀFŠ_G˜­ÈÛ¨‡k`çÓ10¥Ò”è—"øî‚÷z-"[5ª¶Í7Žÿ¸*e¾ø›íÿ† 7Ú�˜©@�×µ™NN"- zcÚ(\òiêÖá¶Š+>‹û8âîÙ©& úŸ#«©Ø³u­µX‘ V-/zÆ”u½RÍ$l=ÏU¨ÕÕ mê= ÙWuüÕ/ö¸ÈÚeáÙEò¸º¡®©ùøpS0Ëød²qmo¾9ôù¸Ðréš©÷ïfa}ÆœžüX�çƒû\‡²©ñW4]&Éž8Áqèá«_Æk�ýÞņ©e•{ì‹ú1g!úÐ4‹è4Åàî¤G Ì{šOt0µÔ{p/u#¥J;,4ï_ƒv"²«??ªÖ�ÏVšÕ$`"+ê#&kڊ³ÕÞ¦�¿ü'ª‡QùK� ¶›“ø\ºÂJwG>A¨±n>Ê,VDºl4ÃýB5Éî7GÃûÙbLf‹€A”%”Ä9¦?pÖ¡ŠÆ¦TKÉ +fuŠEëŸB¡sß70@[·A‚ ¯7øÕ>,›ªµ�甆8èÿŸ‚ìDåĨ ö=œN]DÓÒâŠ~Y€ìâEÈ+A>-7 ú½Ã‚ð ¾{séœP9�zLÕa­õ&FÈ@&ž¡hL8/zÒ2=•GTø¨8iÁ!ñçð�»©=±r'�“fÞïÔ¨¸1Aò!ufȈ¢ãëJ‰-oÝ NMÐà:Ðú… +s°ô0ß fí”A'kƒèËÁ�l þ´ûZñ€‘@êúÎgrJN³SÍoÁPuð×ëCeùÓŸ’sû$ËëRÄ^Ï8Àë ל®&nÜLoUcc îª fOÒÃ.µ‡’i³Q&ãÂ+‹¢Ì‡O³�ÿ@Òh„1 ~m”�Ƶ"ö‘ò£ß‰ç©FÂ$¥äêÚ8§"™›>wGèŽ|óÂh/�nÂ]PÊ#R¯…“šò/p*“&¬FáM-0FõǯÕ3Ó÷uÎo«Pî {ÞÔþáhÅ…¡ƒž`1¦âÌtPè‘WBØäãGo§@HÑ%“ ¢=~ô1Ïr€pl[ùVvLp•|å u�~�•ÕZ ¬Å `3î*Ιà]óE×/ eUÈ4¥�ëåh­)CÝ4ÝàÒ�¤IýßFt²L«Àé/�Pò�HwãsH‹—‹ËŸ˜áq) –g/Xd­’”’ŠPX‹„(ãš�!áî§äK Ïÿ¾t‡ÏPMh#¹´'h�¹z€ÌÞP®ÅÊÄ„�È £è'ézy pSz”�¸‚OŽI +�Ä«Ìì³Ê@G�6 E›eÑqç>ññž7+óo'oâŠõ„Jw¶$+לs*Ž�UÓÓ�0•ÚXÂãÂʬ29K»¯–«’)Né[QúýÏgC[BôŒ„ A°«ˆÃûþÆj’šh˜‹„1‘CZò�B¼ðQÁmL¾¿µ‰ýÍ-ª¹Å:X”Á•.‰„3¯¬0¼Ã,æþgSQ€i°Žîe’©˜cšï8ÕßO¶Àð(…þe*¼š ö´|ä³vlÏá‘ù ™-‘sq‚eún‰YSO­•k¬Ÿ}•±=I:3Õ¯ÿ?2ËÄ˱LTäŠ.¦ð+¡MX1Åàf”+±ªw1|€)x±1·®De¿žàö‘­§�  "„§„/Ø –Ï ÛΘEb�Ùbª¡drk0ÈL“kïQ³J¬pãœ'$ªË´cjós-4-IJ™bU°&û¬Š[|fx�¢›ŒÀ…òëÌö¦Ò_Æ_®^8ÑÕy�‘½ä¹ê©µzY°Ì²^%×ÝKÌNµOBÿ¿ Èèq!%H®"BLߌ…+¯ã8s„µ¥Úu0ÇÐÛ‘ +Tß(£‡Ó–.vkéæ0ôgC•û‡ò “…Ã,uIÜ”[´$Š3"#…Ãêúö#ѳ-þj)ÏÞ(ÜÊoûÓÍ‹‡/KËMvs} aE*sš \Ü? !Rö�‹.<ˆº¸·Jáf\XŠ¿…üDH%qk›ÝWÿ3;Þ¤]&§(�ä”Úp}@èÊ©FAމ’b뮚�Åó¿5i”'�‹üà¢4éÍuù;œ…pV Ùæ“¸â¦ýS·Û?üðt?øþá’‘QÄÜXËøj?¼‘xî m^E0ÕÍT‰YùÓïÎG¯j†¤~–iÔ­Þ±èñÀ$1ï K«;ÑN¤Íëë:”8§ÔVºp1µ—1L3·Kì9³h­ÄtGZR;"K€"‹Ú‹vjˆâj´ ADF­ CF1r£ˆhO¶žõ~ëCR +Â[ÄèÙ*ü¶"ïsÝ™¹ëí)¿*b³q%>Ñt<݇äÚ�wò! +,�œ°&–2ö¬¦aA;Þîîå%¶U+B¾<{8lîpKÅ:ã9 Þi›ÚØŠmšïÊ7fÖó$÷ØuãÉ·ÿ6^’Ï<¡ ôhŽXYv>™ùر{Aéq›ãfÑ�ìFŠM~ìvX°Ó’/óÀ³Ÿ¯ ™ç»±·Âq“Z½'©ìäcɾHÖ1ôX'‚€¬’\±ˆh…ÚŽõÑÑêoíâ GGÍ�¬ù¶R³Ö“gü¼¢µfJ`Œ�…�AO$Î�ÁZ b$k^ÛC®ú¢¯(ÑWKZl„,øàÄ¢Hq“Î5±¹ ÂáS¼«³’¬:’Q| F¤oíøZ—…Tœñ¬Ô=û+»ú�z-šöd 9ô2bÛ¸p¦¸Ìè©%#n›É`ì+Å!­{ ×áH…¦¡Û§r‰«OÕþ&îÚ..Åß“«ˆ[ìnfÄ&©ŸÁä []‘47IiM]ÕY‹û®X›S#i¼IÊç\šlSòÉ%—‹òtýÛmT{ïqÚ·�ò“±ôÔ²ÌÒ>dCÞšÒue¦.AÌîžúF’[Fëz¡0½œgwü¶�¨ŽŠU"VG±_ –_¯sŽ|�£zÄGhÄ_´ä�5ÚE¾Á ŸáºF�öeë+¼P!}q�ÞŠ¥mik˜âÅbTK:>&v¯£ÓT[”«ä©~kÅ`¬Ë]÷(K–×gŒå�kÆw\m +ü¤JäæZ¼Î}¨{‰pwVE1¯ŒÎò†8‡{ëÓ9FNæM“@É•,©Ò«éÓÀ’B¦ô~{²ôr=FÄ@•îÆfÒ× ÓüÉ�0ÌïO5Ø" ?Ÿi /ÊuÔo4�a�ÈH82kOkÛ(©ÓÞU­=`³mgàÇ �È 2}ÿ�û;ÿ‘Ÿõ*ùZIÒÚ¬=- [(de{�X‡ +X?™.VÔZÏ¢4C,¸ùWT\5:å<£ +¶ˆ:6�¯ý�6ìtÜ�‰ÚÆ]æŠkP^óÍ7 DAÚÙzd)bžÕú�å÷Åû1§TGσp3¹ðØq 8µ�pÈÎ1ŽƒlE‘@féà#%#ÖSÏØÏ&�4,AóüÁ©kó�a)ÿ~Ÿ[×�âÙ²EÎ_·q7üwþU—áE?v§1“íë±¢×™lcsϪaûÕ/G +!}Ú‚BïÔsõP$‰Àp3ØQ¦O&3"ª«O«’CTx%Q‡Ç;ÔoÉD´yØ¢f{Õ ]^¨µµ_&¯R¿ˆüÆHW1ˆýr§&uîÆV„V“žcU—â÷Ú0„mŸŠÛäsºW¨Uý7Ü¥¾mŽÒ²§¬}1+^>ÌØjyØŠ³_^ÅØ‹÷¯Ë)ÞT#•„’Îs©+§‹-·b)3*ÚPGêͬA¬¶\±6´hý–§õ„P7(a �îÍ¥Ü:Z„ºâT}Œß„™Ã”¼‘ÚÊHÈêŸ.•qs™€œêð´ +ƒ{$@ÝG71ÊR±H¨WNrab!ã‹Ní¶h.ô§`~¹ÌMà·»$«ªSÜÇætSéqÄ|êÄTÌÚ^•o9£²Ë_I*ÄMúñùN1GuÞ‰iß•!ø(‘EjMž(©òSù9r-Kãº�Þ~aCÒ2—ҼʺûŶ‚±$R¥YÑóËÖ¥_�éŽ:œËߪ˜ƒ:vËDÔ:bñŠ’"çxÄÒæ¬^ñÇ|°ÇBÃmqq$ˆœ¼ÛË w°\~NèŒX²HÀ.YB%È{Å™ X°Ë7@s|ÜÒ:Íì=Pl¯ÐWÓ,шL£�3Oâ«ËÇŒ§½ïb�£—\õ$)õjx k¯xPÍoáë×ÌØ±e²2 ˆÛ¡ØïǣшL==zðš67O\9È-ï˜Ç‘NWÝ,ÐxR�.‘0þàs–¾(ˆí^�'½-y¸Ù¼ïkg6žd?<|漤À±ÿÿXÁž¬úqW¹ M…�'K×q…—�åI,ùñÔ•: š¸|É&{R’ùùóïí“�üÀÉ¥_oþd? z|*Éýšz+�Ó,;Î-J®ÿVê±D¬Ú?=¾hGЕæpÍy]­Ð½&0–cbXyu¿ØžÒM]³BÊRÄÙûr™œÏg†º@rfÇ�X÷Wuõö�! êª|bØ,tÜÉ‹Sñr7iÇ–A¥-£PߥÃR×ÎUOQ][ͰÏ?ZõxEfÞ�wôþ’2e&1 5Fjã‹.õMï/Á™ìáDto¨.«>=²mAÜ(ãÕR–+µÎ¢çé“BŠ‹g„W�¯òg§Ç*H¦ö�6ö>³m·vNꢕX/ªú)å‰KÈ%O”Œ»,®¥ŽKZþï+n ,ˆ€™‘ƒH€æ¯Z”LK®+á¬m™Ò�‚3¦¹Z¤ÁR�ÛûÚîù¸µsVˆTØ«o!µ-n;]™¨¿~%EòõZñ¿ÿÚ +Q†mëd~ùäü‡#¯¸ñQu—�µT¨îuê%õÇ&()ap£ S–ú—¤MŠSHZùÞiâãtÄ‘=¹TYWH‚û%OŽæJ(µW´�’ÄžçR{5…š%Y'§ `y˜èö•å¬Ì�3“�—@¿¢üòx‹ˆx–@Ü W+µùüÞSx™ïä¦Ä·�E,åÄé-ªŠm¬mSÌ0£9c|@�"™ªŸ OMµ‚î[FTlü= ¢c!‚¸­Ì¾Œè¿T={‚¶XHò_͹ËÇÔ§L‹SãÙz„†F-³; Nn}Ö÷ÑÍMjÒó;Ã+mnšŠÜ³Ø’+Ä¿ªÓ¿2žÍY»ÒJÌM9f,õ.Ñÿ>ÜH�¨²K3¹)\„Ó?Æøûêß·Ruÿps“ÆJ|RE†�CW/’�ãtå!ü+Îß$ÁQsá�«&þ½ò�ô¯â-õ +­ït³µ.››T,cAÀ¿ÿ=Cñžúàß„¢ Kg!rÍjdÕ^ÿBWÚA…Ù)Ô‘Tã€í»ª®²œC‡¯1ø7 5%uµe\²ã߸ÐËÛ4÷ը켘i@HåLÌû;ÍðØ-jÄ¿³-˵ë_…9ã_ÙÜ;-¿öº1Zt¿Á¶y0ÿ߫ۖ âëB 2]aA»��wÜ�ão0GØ]¥žñ†Û2À”Êe“ÝJËÀ~¨¤uåÕô„”ó­€�x ¥ÅÛe„J[ï)'†Ä,„! +¸NÎ��Öcó¤Áòþ”µ]½Î6Ã;c?„ýÞ»î‡!¸,yii‰²Ï¾K‡Qƒ)BÒÜ]šZ©( JÊx¹I«ª±7fĨÝfeâb¦ƒÎÄöØçÀ}{ŒÞC’ÌÆd.~-¯ºf:Êî+Áþ¦ÛÈ°Þ çežŸ©|§?ò*Œ¢•–W£�6Ïñ;€�ÍVùÆré›ÓåIÊäëÈ­®“ym®Äy¦˜êâ±$gTr—+žþš+QÆ2_}FÆiµ^ŸG&mâ³WµIµiZ¢¥J¨cOr\Z%/†³B¨ó]º¤ÅÄQD1‹ +¾Í4‡¹Iµ†6ð¾�­%ˆDÔÃ�&�aKü„ É÷=4„ä�ÈZÖ†¢ËMߪMî8�î +ÕQ³½Ÿ¼“ïÁÙ�‚Oh}5µÙuXf4¶ïh±¦Ú'ôpè�õòá Z=/ØÌü +õª”\±�J“K½ònÊB½½_ä–™•ƒz—êð'Ö€8^³‰Å¬‚Ž•zŸy%�êá³â…–ä&|yx@ŒÛ�H1·Ôg+ üd}¦Ë犉=û­ € ÛäýN)Ý‚›HZ‚�ÎbÒß�±Ø7ÒJÞõó·sæ·ˆ™Íàã��î9qÑ\-lT†y½šG"&¹ Ä­—Ïj04Ì"tžÕšâ.E?±!\¦žÄIº©~ˆ·x€qK+´r²]9>;Afþ¸¦°�æ*0âI&6©Ø£òžÊõ¥,ú>²W~¯¤à‹°=zWpUÙ(èÝÅq69“:8Ï\t{EbÂÍo§ËõkÊñ»W^º,†b#Tñú»�j5±U' ¯ê02©iL“-gÐÎI¾£ã‘…Ï!®ŸØ5�Ðb8‹hµ_½È +AHÌU/•F߯Ùû)4,ø³ G‚ï$áp$áÁb>(fEÿß¹zI©ö¼µ23ø8´=ÝjW¯à:¥a(Úªw�’„™Ë #šüT(.« +É«ªWùö¼z÷œÁz¶éþ«ÞÈÙh7’GÕ[Ì»¸½½z“ÃÄjv1ß(W©dNþ&s>¯}wDӢﺯ­ì:­†ÁXC]ÉáRqïS¯ãìVÏ©‚)µÅóQÜ_W•@×4©BZ*‹2):_”ÚÛšJ¼CAEÔo²™Ýµïµï’¡uмI_s¨1ñÛ S +Zv“§%ýüqÇÛüéÈ"äRR.Äðy¡Bx +òö`cdw\ÝôÖ&�è?�ñ—Š ã†Ð�“wIzÄwý¿»xT_7doD<º‘¯ ~!ŒÇšý-éð³`ô¾ÆÂÓä·¬pOY�¦ý÷¶×|FLôCE /i>P M£c/ßû#ç¥ðX› -é†ñІõÉË0~Ô +"ƒ; endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 18 0 R] endobj 18 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 5 0 obj <> endobj 19 0 obj [/View/Design] endobj 20 0 obj <>>> endobj 9 0 obj <> endobj 6 0 obj [5 0 R] endobj 21 0 obj <> endobj xref +0 22 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000039117 00000 n +0000000000 00000 f +0000209333 00000 n +0000209631 00000 n +0000039168 00000 n +0000039523 00000 n +0000209519 00000 n +0000040399 00000 n +0000040568 00000 n +0000208759 00000 n +0000040642 00000 n +0000040847 00000 n +0000042360 00000 n +0000107948 00000 n +0000173536 00000 n +0000208807 00000 n +0000209403 00000 n +0000209434 00000 n +0000209654 00000 n +trailer <]>> startxref 209866 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/info.plist new file mode 100644 index 0000000..02504a1 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/ibeamhorizontal/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 0.0 + delay + 0.0 + frames + 1 + hotx + 12 + hoty + 11 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.0 + + shadowoffsetx + 0.0 + shadowoffsety + 0.0 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/link.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/link.png new file mode 100644 index 0000000..62b6c88 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/link.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/cursor.pdf new file mode 100644 index 0000000..e956911 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/cursor.pdf @@ -0,0 +1,449 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + makealias.cursor.solarium.08 + + + Adobe Illustrator 29.0 (Macintosh) + 2025-02-21T12:03:21-08:00 + 2025-02-21T12:03:21-08:00 + 2025-02-21T12:03:21-08:00 + + + + 176 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACwAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq+Ufzc/wCcttcg1260byGsENlZSGKTWJkE0kzoaMYUf92sddgSCW67 Yq88/wChqfzt/wCr3F/0h2n/AFSwot3/AENT+dv/AFe4v+kO0/6pYrbv+hqfzt/6vcX/AEh2n/VL Fbd/0NT+dv8A1e4v+kO0/wCqWK27/oan87f+r3F/0h2n/VLFbd/0NT+dv/V7i/6Q7T/qlitu/wCh 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 + + + + xmp.did:6a145c89-ad46-4f06-bcf8-71d31b799cc6 + uuid:375c472f-e1a2-f445-99f2-349f6921d54a + uuid:72C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + uuid:cce022a6-fdb4-8147-a84c-c62bfd7807c6 + xmp.did:fcbc93cf-0a5c-4e0c-a836-a3817c0f51d7 + uuid:72C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + + + + saved + xmp.iid:FD7F1174072068119457DA40D67C4B16 + 2010-01-19T19:18:13-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:6a145c89-ad46-4f06-bcf8-71d31b799cc6 + 2025-02-21T12:03:21-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + Print + Adobe Illustrator + 1 + False + False + + 16.000000 + 21.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>>>/Thumb 10 0 R/TrimBox[0.0 0.0 16.0 21.0]/Type/Page/PieceInfo<>>> endobj 8 0 obj <>stream +H‰ä”Mn1 …÷:/04I‰”´�tQA�E`äð$@ÒE®ß§Ñ4uΠøI¤È'|¸=Òáæ(tõãHé- ™’-XÞÒozÅÖø)�Óáç½ÐÓŸôš{•µ4§`‘’éô²¿¤EX+<¬Ö + K�¥ ÷J§´(›¢»D8·îÿ °Fž�Q£n�šu=£nÈíðq™s4„u Z“p/�;fEÉ„ãV÷êèÄ R°B+šõq™Y¥)ö”ÓÝ.\èW2ú ï ú9Ý_è>_HVÅæ¤HS‹ ѱ´™5-•­M‹¥Æ ,ζ»§¤,¹ï´‚ºøNÆ! ¾6ßýÊYr&!sÔ™°½ó�ÐÃŒåbz\gQûf·8ѯ¢ ƒŒMT×Þ¿ŠÂ³L»tš0:ª£¨j5O¼«á}ëlQØ›OÀÀ°›~úe& Àp`×� CæôԌ忨oð ™×7ø3ºKÿÿÿÿš Þ‰ endstream endobj 10 0 obj <>stream +8;Yc,?sis7!!*'!!!!$!rrW6~> endstream endobj 11 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.0.0 %%For: (Lance Wilson) () %%Title: (makealias.cursor.solarium.07.pdf) %%CreationDate: 2/21/25 12:03 PM %%Canvassize: 16383 %%BoundingBox: 4 5 14 19 %%HiResBoundingBox: 4.48347394452321 5.00428367770655 14 19 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 186 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_Cropmarks: 0 0 16 21 %AI3_TemplateBox: 7.5 10.5 7.5 10.5 %AI3_TileBox: -280 -345.5 296 388.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -98.1714310706448 81.849781724949 9.09047222228367 0 8200.28906939152 8191.48864648237 2548 1414 26 0 0 6 44 1 0 0 0 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -98.1714310706448 81.849781724949 9.09047222228367 2548 1414 26 0 0 6 44 1 0 0 0 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-992 -990 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 15 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXd'Ê�9 EDÎ ¬ÀÀ,À:Õ»Pº&¤ØILƒ>èÃhÁµmÛ@x×u·”Ô?�˜€Óf ä í 5ý¾n塿[õœ¦æõÛ1oµšUÿÇ(ÏõbÑßÛ³ k³¬™Ô~áÕà[FGŽ6À�i8V;žL&ýÈøMuºo½þnЯܡ šWɯ [´Ž†Õz¿í×rϘOûÖú¶åYUÕsês`Ë]£ª¿5 ¾$´‡ ×/ˆ‚Êß`e0@šÞ{pì¤hšØ[˜äH†¢ÈG/Ž]ôÌÖ­‚𨟪cs'Ç]€•ýåYV}WjŽ;Œú�úðšo;–ò»~˜lù�à°åø5À{¿ë�é×k;Ü1\ß÷[«b¸•zØ÷ïüõÂõ+ ¿÷«zïÿºÍW€üU³ÜøªYŽ__5c,—Ð÷Þ�Õ·Àò‡—¢ÖÉ‘ôàÿæôÏ݉ãXKA]‰˜%£?õ¶bx¯¾…,ŰÇ_c³Ç_Õà[~Çô^}Ki–âmÃ+K†ø0¨ ݰûÑ·XðŸÈ3àzžøïšëÛÖ¾ ÇwlN½ô·W« ç^}ËŸïªQЄöpÙ龜ç¿*ÕK�àLÛL«@K»c³+5Ë®£´¿ñlê8ö‚m­þôKk&·5\³´)ù×/mËo}ûîKz1£äÿkV­u­žã9õj¦ŠâøÞ|�öÔý¾ínÅîɱ|Í÷=§a z³Mò~ï΀ŽalàÀ¾¿m£?F½w=Ó°ß�‚ׄö�g˜õkm€Ó¯9¥ÑpœRÉsêwø*™òïØ8þêØÁR+IÞ9÷<–õ<ÇíßoüņÆWßòSò¿(M@£æ,nÙ°ü‚îÕ·ˆaIš^ï$iß2\Óõ0k_@M¯4Þ)(={î æ˜TpíŠ^MRóf/µûÛ¿Öhõ/½b°ê_F‰–ý/b×ä¾_Àõ¿í—£Ý1úŽe4“‚rÒ1zÖhŸõÆXòkÑ´Þ)(úþ¥çZ}à­kt@ýÊ3|§`‡ö™¸ì½ßÕTɬ)ô¡¿mØ’j²”&Ëì�Ƶ ¥ù÷ýãW£’Ù‡¶úë§e�/S…´®õŒÒx¦Òxi¤]4Þ5´®h\«h<âÙ@ÆÑxæÊhüÇô î|Cû¯óiŠÒÇÞÕ_G‰Ì¡ÉÌòÀ—Ù?pwî5¹ç=ô×z"S$2•Ìzšâk¥b³GûõWÕ­þ¬W~/šJf×4³SžÙ©‰Ë:©‰Ó8ïµq}Ù;=)†�›×ÂîC³{NŽfÈKßͱw Ín’£Ç5“�¦ÉI/vOš!éñl”Õ©‰Ózvf#+²! ²ží,gÛ•]×U]Ó]͵\Éu\Å5\ÁÕ¯}åk«²êªªjª¢ª©–jFª£*ª¡ +ª^í*WÛ,k32ì¥IŠfæ[” ;[’$™qrEɰg¥X‚|Eɰg#ÈÁ°«æò%þ¢ª9¢¤™�¦h†i)–¾-ÉL4Gp\E5#Ó²ÍÒR4ÇlEÉ´<³6eS6]S5MS45S3-S2S1 Ó0SŸö”§-Ú¢,º¢*š¢(Š¢&Z¢$:¢™ˆŠhˆ‚¨G;ÊQ޶&k®¦j¦fj¢¦i–&iŽæhŠfh‚¦7»ÙMn¶%[®¥ZªeZ¢¥Y–%Y’åXŠe–` –¾ì%/[’%Yr%U2%QÒ$M²$Ir$E2$C$=ÙIN¶c;²ã:ªc:¢#:šc9’ã8Š£8†cŽ~ì#ùØŠ¬¸Šª˜Š©ˆŠ¦XФ8Š£(Š¡Š^ìb¹Ø†l¸†j¨†iˆ†fX†dH†c(†a†>Ì|ØC¶ ²à +ª` +¢  š` ’àŠ`† z°ƒl}ëY¿zÕ§õ¨7}éI?zÑ‹>ô ÷¾ûŒ{îÛÎöµ«=íiG»ÙËNö±�]ìa»ï½÷Î{ËY¾r•«<å(7yÉINò‘‹<ä ÷ÜóÎ9ϲQ¦J5¯q-S°4Õ½²üIhŽ[þ°ê­]9Õz£!v4ŧßVGSɱ™~Íê¿áXG«¿J†W­ûÕ„î/¿±æ–á×R¿ò°ÅVÉ?Nµ–øN}Ú® +nÑoÍ‚ãøUï½k´u¿9c£`K+u¿t´z¾a«ÉšÏR±Z<Ïžxž=ZËŽÕ©Vÿû~Sÿ¶t~œ‚ïúÕ¼l8žQ¯zŽ¿™}Õóê¯ M¡ýú�[ ¿^BS°d8õÖ-¡)îÔ?@e4Õ\ÏwêƒÙ¼’)tl®]fÅb�©Äd,¾e¸ÖÈ3ÆDÇîßaÍñ\k8.³où¿^³ª’YŽË:�ó‹jòò¿ï7n}ØK±�¤iz“{³w^z*¸vM$7͆æM³á�a\g>ëÕp¤‰ªoRɬÿ~åúß1j"{ï] Cm½ö°ke(z�}ŽáX–¡×Í^j^ì&hŽÜ,½Ç¹/5®yï=r“{¦f†fèÉ^’fXz½ÔÊ09É;v²{¥ÙÐÍùÓï”ËB-ôŽ›e`ZÁ¦[þ·<«&fýÔDv»þ^Ë+†)ïX<ÛŸsVýzÞ¸õš#þªùbjŽ¿©ÎgÕ¯ÅzÍaß°ü©ãp†�»F¿g”èšc@tQ9.ãšÃfÉð}ÿÎg½/Љ¤ \¦9>ëµ?&�‚rÙXvÍQÔ+†QÅp,5ùNA»v¿¯zn ·&‘‚r™+õÆ©&ÀÇ_¤½·üYïE“ߪæ°ë9žUÛþ©¹ÖÜòÅRó*Žœ$É,}ȹ'j݃^ C$C° =ûsà Çef×®‰Z¨9˜S– «äØœr\–àØ5ÇlÛ¯ùU9.»h€€Üá»&ú¯ûÏkŽ¿«<Ê•ŠöHî½bpýƳíÕ³]ÇRžýÂñû]ï+¡9~|ÃŽË M!Ïv h?%¿–„æ¨ç–{¦×ò Ûõ™J +Êq÷B¯)8‰z¾ßú¶cqLÑ4G=ßï¯UŽË4î���šUh££Ù¸Œ á9—bºÎNµç´ã²ã â¯ +G²9¸ÌtxB8ñ\cõYÄ ~;?6'‚aÙ�ºNG„<º%A÷ÔãéÚ�ºæ²“¥úˆ +Tª·´ ìÇÃÒ +…ÐZR¸¥Íe"ûAvu[ÚûŠÌ„wKÔ±8q.ch oðœß*Ø¡ ¦TluÍe-2ñ ¨vÝÑàžP ÏÅu0«–û‘éʆÂè3cÚrïm ¶¡†\+½ �,ÜQápPuÇI�‚À_á"°²€ÞFÖu,ù8B./_ìÆ£HBÑíÏ{UijC€…³ã2ð’I=º†‚ð„ÚeŠÕ,]ôÂá â�þatBm:\¸Ì@ÀY›ÊYÞA‹±yZŒMdV›ê:»Í°xÅL^#@Iu…G¡ {`X=lÄâ|ˆ–’ê°È£‘Ð^ìÑÚ=(eJ=y¸,ôÉ€�„Ã`a¹€§®xìŠgÇ~OçZW‰ð+¢´Ùê7M8‡ò¨Þs¸-ý²9À•åò ˜Û¼»ó\Œ¢“¯ GCãÝíÇØsÊe¡òqZ¡nbÌ%.œNøq#´ @¥Þ±N[Éeq¬}¹ b›EÅÖºÎnë´›„%5¶F@±e¼T·]ZÏØnÛ×µm¹K èQ …ßTR-xá˜D ,[úV(ð(—ÅmÂíò‡æ| ÐÀó„XI”|ˆC +v6ÊÀJ`¹tl,­ÿZXŒgWžÄ³‹TN“�´C�A¢p#~Ó'¨§'èF.˜-— ŒTEÜŸä^Ô`÷ù^,÷ˆÚ‚µ#—js'(!©ë ‚ð®rv›i=.©LŒ�aO[§õŒm¤216ÎKuÛä ÅØ`º¬4DéEIç€sA×WÚ"ó05ªo7J¢®a¤ðÓ{Ç®@:.»ØÞ7 +uÁ»éNö¡“'WÌï(õ�¼r@bù*%õÔfR¨;{©ÊÆT…•ËHayg�R_Ý…f7ju‘•Â~V’W[°Î4\ƒ •ËœQê³½Ðìæ5Sr@VbÄ7^'ΠëC/P%"kæ€9¥$O%`=iB 0íÏã2º#ž]Bù¸¿ðƶ†.Œ­ãˆu›·:)¶ÜblfF± ¸În㠾ƙ€Š­5r �wlBé>þ©Ì.‰â•)~Vp*üµ¦.Éí%˜OaóVç²Lƒ¢éÁfõ®FˆH7žÄ³Sq�€œÛSC à5Œ%X¦à�abž’ÎAÅÏS&ºVñìVÑAÅ—îã +éÈ“xv\ÆÐ¾jNýU,)µƒ~šCËî¾§w +úc¾ãØå x;ô¯ê¯‰ÿ°†ûÖýÒðD€¹%wÔ»]5 í[: ×)û¯ž,À,»ä˜fëYûvL‹_y•)šýj­TÌÖRpLÓ¯vÇæo¬½°öSoLkó­©þ—µØ< ž5¬ÉðËúšÁm¿mýªä÷ϡé·öÔ(å³^�6JÀô«²dø†Ul÷v ¿2êkyþýÖ_þ£§s‹ŸáûåÜòÜÞßFÅ:�2à­]Ï·?~À[»,†ï—~õp@wÕï¥þ®ú½¼àÚ£vø¶ÿ:Ëó%„c[ÃñüöŒ¢O]õ,À]£¯¹ngúYï‹â=¼‚où«(*yVMíªñ�‚Þ/j®S¨,À¼xk·Ãÿ5×­Ô,Ï—7¶Q]2ן0ùªXœ’)¦vÕôNAYß6±dXÀ|™W25Wæo×_À¯ãxNy¨ùÀCÍ,ù­?ëuÉoŒ¢a—í¡æƒ8~Sðª¡Ú-í{žé:þq<§êo’ñm×4­òjšîuœ¢iS,{ùg½/Ø«iÚ‹dMÓõ׫6¥©¾ ¯þšÀ«iÚCÍñWÍ/M{ñmË,Øþ*5 ì×CÍ©7Fyuœr x¥PÏ-ŽWsË«iÚSÕ©«žoùõ'Ü6«þñÛ[<ú�ë/`öTuj^Õ4|{ª:õe8^}•çz±¼ÇoøFÍóJ†?ë¥y�ª=׋U¿¨XåÝòªHÅô]£b¶wË«˰÷JÁ(ϦW?~Y_~éלêñ-Ç_À�Áלòlºþª·e{6-§R¶§ªS,� ¾ë/@žSpœòèàÕ\ÓÞ+åùÆ8š}TYŠ–º;1§è™ßßölú…oùý6=ÿn `Û¿¦é˜íÑÜo¼òlÚ¶cÔ+ÿ”[©æ—÷JÉòëÙµªNÄTôìÑ.ï2w…ßg§±U@´±q™å ÅØl{#h*f’],Ë �Òyôl@Ø*‚Ò®5«”.Ø£Û«)‡Ù®Çj×›ÄåĹìÀYœxKF€8'Æpù¤Tj¹„5[Ò–;�Hn¸ÛÌVtÜñ{Ï·P…hØHæõüvˆ/(—զ•%œÏ []#9õŸù¸‰±|3µ,ìDa›Ëg+V7"p]·0—cæ‚Ë[OËÏo¹$L=º8“úí▛ƩëUæTÜò2ÀÎÄ¥3;PÊR x´ œûæ?6X׈D‡«oIAG¯�æÅe™Qt èT“)¡pM Øås?1¼iuVtï€`Æ4; …9¹$,‹ÊEš`–ÎØ [aéÈ.n-t ŽÑ@Dø8-º)nÊF(0Œ" ³üÄ›? +—µìnQñB\ãÛԬņڗ˜b”@�ܤožCªs.#J;<ŒÞã¶ðíAÄäå‡ù¼[²‘pÙvú&]• oOg�£!gg£ ÝÜ‚‘`$‰Ë`$‰ T@Þ®~ô·’Ø‚!V bÅ1SA±šAŸ�Üá2¹#wäŽ'k*•Ñ q¶T@>‘J¬Ò#”{ÝÊ‹gÛWE<' +Ž/]mƒ5  <4€NB ¶S0*îW?4~¶k]ô•ƒ ‹¾ªˆK÷Õak›Ñ& ¿b/U�ª˜”“²æº€Æ-Söm¼œ‘Ë\ââÃd?>Þ=R; è–$‡z�„Í£äÜ2d?Æ[ä@·(cR½˜ÛÒöØ�Lˆ5€FóOJ°“b¾(dy( +¢0‚N —‹›K°M¢÷g¸Âè9“RËY-I–Òà1Ülyà%”>c�´Æ Ë (-AäâP‰–ˆ‰¹nàKU5å¥jËïOÒ PöáOO]€¶:hô)Þã èýuñh$\\¸ ²c¾| K0�¸Cm£%±=q…ÄCÙ%/2…RO]qåÚ(×{ꊫB©Wm”�â²ÚT›\„WÕP¨6¹ç…ð„0 áE0`ˆ†X1`ˆ�B +-šAì\vç²?ŸAŸ�"û|T4ƒºÿŸÿƒÏÿà󗿥yiܳsCN®:N®†§ 7½?ظO¼5ŽÈ¦"V^˜i+¯î0€¬¼Xù\¦lˆ¦Pê',pÂòöJý$R9M&=¤�¿È¹açíL—¯Dî³s]•íªº¶}Ûám;—ðvš!¢¢“5hÐ Û±lÍ�Ÿ )´¬8÷â YGµ]ôƒæì¸Ì€Ë¸ŒË*^ªÛ$/SïŠÉó[G*¼ºIL ¹˜2@õJæ’D (èÙ,XßOH7žH‹·Ãͧ‚6J%D!ÐF¹žºâ¢® +y ÇŠ‘pðÏcˆ„¾â\#¹'Œ#¹'AˆÐW¡¯8-¢E´È=A‚HU=bê3ˆË>‡Mƒ.ºÊ©v‹.ºê²ÿ§{?%NޏtÛÆ¹O7äÁz " —�ô¶qDÆX¥W^¦c•Žè°òªz„6  ]é‘{MD¸l¾twÉså.ùÌ.ùÌSoŸ7—™&Ö„59ø“ïþÔ +¥>¦ +¥ž£K× Â<Šî,CÄ؆ˆ‘ØÎ±¬Áýýº®„á¥Én+°\6v§B©L¾ç²Edü~±i:0&F‰‹Á¢ú,q}® +,`Å;àŒšÂe6ʽ¹lÔ„R¯†Æ„cÅk“[›\°6¹=áXñáÕÚT›Ü³Aè«¡¯8Œäž #¹'�B*C¬< ±‚!V´èRPMÝeP!¢‹ŽøüAåIxB +…§8M8CqšðNqšpÅiÂU…ú~þÒ¸çKã¾4n'´0½Ÿ#Lïçô÷‰d›Ëþ\¦Ø8"ò7ŽÈ8@`¬Ò#`å•ÁÊ«’pÀÊkÁe÷z¯‰å€� llB½YvÉ×k"2a™B©ýƒÏ',oŸ‘»k>.›°@ßA„�@¦ë켫r?á)ç½KWå¶&ÂÛ=Šfˆfï´ÎBã×Qf¾0(l‘@Aào–;ÈAÅãX{v\6ZÑHuœÏe¿�)mU S‚0‰M -8{é–¡^’¨[¾ö#B/`¢ë½_A (Ñ-7¤K‰3Ü‚²Ç#ð²*JŒX +QÕ»%…Q@ª7H†`{QSz›@]“b#¬0) +—› —ðŠÂºN™*ýP=ž¹å ÝJ¢ÐÀ¿8†Âø©Z‚HŽbúS(Œai $Eèi”$[a1ŸøÑy§XÍeEQ8M¸ª%…Z�ÛEV.‹¶Féét‘µSù…• ò¥jw­ˆ bP³–ôþ$P[°’«ÑŠŒ D\Vý|‰jÐåJSG-ØåÛ\,T·°ÈXR*è@.+¸Ø%ÿ?O]Ù(÷änJ½jÏ©+”zUd£DŠPmziÜŽ“Å„#áXqŸp¬¸áC!×<\v!¼�€€€€Àð oHè+B_q.넾â0c%±�êÚ­$6 aˆ-¢E´È=A!.S'‰íü¡~ŸûsÉçó!tÐEW½Ëþ.ûóÏeÏ —-<¡Nî¸rÇåŽ{Ê7&9M¸Ê?Óû9—5Lïç/�Û %ä¶qd4-rAî.¸ $6Ž{‚4— 6Ž~{" §òêj“{v˜ic•5Dà²?¯¼•Ä@�TžÃz¤’Å*ý†ˆ\&"ô§(D.—µì—]6ŽÈ�MD({N l"’¹ ÑÙQî5é6¶ãDg¡)”zˆ²Ï{bŸ/�;aEî�4VòÖd¾LX®yrYì¼ÙmbÏi×…RïëÒuv\æÙ¡âuéªKDÌäJ +-ÂÌ á  +‚ð±Òuv視¬EhÎÎ-ÔÂÓ¥«K¤ŒŠY�z˜‡9 ÝÜúRÎ;éÂÛSλ1€œX!€(Ë8;.k_.ƒYïìQçÈSW¼cl2 ÇŠ³®yÂHîÙ±Oó¹·‚4CtP|Lïç¬Á¡@-È(ØD¤cGýÃèŒþat.+ÜËY4Ôî0à‚®]b;—±´Jb»Ì�6ê› oŸC0ÄŠÏ ŽÜqOIçqaœ(†^Ë@�tk†Ãe1 ºè)çe8 +ðg/b¦ ç§ ×|Ü ˆ:»ÕžSþ8N¬pØAsv›�ºh¨ìyv\¶¹tØ ?Þ¤‹¾Ž\ó\Ößú¸õ·¾Ô{T úœè¢s™:B¨øë ¡ðH„ØVÄdQèv‰ì–È þ\C‰B&‘ˆ$:S¢Ë„¿D„Z#Úæ—¹4-Í S#†…ýk”ÆÀ¤¡I"�Hsv~‹c­û‹J!Rm*ˆJ!ÎëAziÜÐad‡Û‹IF¢´f¿y M<Fà-ذ¼, TÖÂbô�Fgaô‘Ê€í ‡#‘PqOJ}"D²À@ý$ž箢¬ž��´ninÊŠ"3-~rBV ý d–ã ð~k£àd}üåT¼ P8»Î#žèê\>p¤ùÍÇ 0†ˆ.ú—Ñ|¼ÎÞ^Z¼–(ü¥ŸÄöEá4áŒVóq“DóñØö‰€�ã~ÀkΉù6%è#Q'¤ 87u‘Îê集¿2�;…RT2\Æe\v1+�íÊMr°'\€àä9 »ïÑìl¡vÆÅ|\ưPýT©ŒÞ0< +*”R½E.ã2ÒrŠÕ\fÄ Ú +|V·9¥ ÿÄ.—�î7¶*8ÇÉE%öhB¡ J0_¢ÓS�—)“ÏXQVÏ1'Ÿ&Þ™Ë|�N¹\Ö:º.1\Fàn\.ÛB>@¸ìbûºÞ4^ªÛ2¡ cóF†ÄÆi”� ¶ ×ê™m]qÅ\¸ ¶—`¾n¡¶újJ&Ý36ÈŠDÑ{¾y q™ƒ5Ù�ƒgDðº?¢óû ¥ÊaÑPŒ6XM ~d³ÛŽÄv.;xc´]Ä.S‹~"ºè0ë08øxPÒ‚{ù:hÎÎañv#ïöKdKå²û#:#˜-—…ˆ§­i™�VÄ.²¶˜M +•pš�bD)ë¹—ªò¦Òê‡-J&àÉ×aÌ£…T©£1}ùÜqqò��«Â; +ñäG»ä"U‚>5d¤®¹ì<ø¼6«O4|âΞ˸Œž(<—&T™kblåê¤Ø2�²±=›®tÐbl.#8ÀH kV'80.Ž"¸Iw¹Sïuël¡n¦€ùJ Tމ«‹†Êe+Í«rÙq—q«‘ê&é ÝŸË*kÌÅe wAxPz)ãdÅ“B¥¤ª8³=Å‚Ùv<æ”òQUXë|p´œË¼�Å}c«ÀÝèp:O0Ãpí._g·ˆ8�R09$‚RG¹ì€ºPP4±ó{G�Ñ9�ÊHu¸ ©.ÀÛí9ìž«ô9'\ÆqU’^ºM-�€ç­ž`{™< \=¨ âº+i5 [¨eàë|mƒ£ð +Ðä�LÚOL_‰Ó„7~æãlF€å.XB:.;UT…£Fƒ‚½qË„·D!—¿\óô¶IGÃ¥ñ£4œ�Éã\YDG³Û�”¹�„%§r”â“ËHšX™!¨DÕÕ™& !Chf`F‚�ŠFãÙºÆ=8&JFJ20",(�FâÐ8 ÅqFRF‘ TNIfÄŸ³Ó¸æâ¢´ÿOÌÏÀŽŒJ0¾�’¦+~“„Û¥u8€%� hôá „×A÷àÌî‘pIÔ<Ë-ü�ØÌ�^l8:Æ]bí¿7¥•>À®ÍL@, W˜Õ’qD¢â�ð)=¿‹Ù¿æ·(+ñcy|ÇD¸AAÃQ4›ä½F™›Úµ²ØwØÂ7›«XNCJ'G#Ð7bylL¯$ߢd_œ‡Io*ö%åõG¹Ì�ƒä5@.TÔ×n‡7Q9¢¬ÚßÅ£1Ãazò£nDmÑalgc}ŠûI/-v,Xí…]¬½ êÆ•�¨IEXê×R+;¡ž:d,ñú`G�NR@ƒ’@ƒ È0ãäBúœ·'ÇÔ‚•²h2 ·r–Ì`·rÓ¹0”�¦Ã•6ƒ\Ì«6ÌtÅHâ²MÆŸa¿yÑÛ'’\Ò³\3!¦6�L³ˆ{‘;® jÇ1œú”V‰S© ïê.-ªx è«48P¿$ž j¨„a;a®Š°$Ÿ'“ +R³½á©È¾É�ð?ul@þؾF1üKYÿ +²$ɹK¢û¤'èÜ�'.žÝÆŸF1�㨓¿ŸÒ‘I$ÞÜ#- -°˜®¼``î UPÝÖî M�òL©(;?‘/'(îWÈÿ 6`�±ŽÍ)Eåc�®­FÐß!ìØÌ4ÿ”Åô䎑ŒÀ`þljõùO3¤á’ØuÊi‚~SRn À‰RYÝší +9l.*©{r­­ð‘�ZâÜ›“]›D]¥É„3oMù¡¢D þFl¼Ð9›‰²í��Zä[E׳³EzzÎÐ1#“ÚÈ½Š¢GöÃÆ¡*ëq³¤™¡ôÃÑKF{øB=šÝ %M =ñÿÌÏsЦ¯>ߨ#п¾U«:_1ÏÖ†F÷ï'ÙªÔ³Úâb)IÜ Â6[Ù)ë©ìYÍB¤®ŽP�×£ÑäÓ�Zë%°¦)ÓR¡áa~í¨~ÿº%¤§qí�C#PÑL·K[ ‚ÞõÂÁ­•;߇В4šž«È—ã©„’ÞyðÚPÄŒ�ØÅoúü9¶að‹Á]n’cý‚Y�H\ÓHZ�ø5+>ÈÈú"­ Ä6ãë6†9*OXóætŸ?æ5˜y{ìH*åôäpÝú¹s¦tB¹vÈÚ?8£.Q_“9 _¿enO×éYL‰7¢”:º8vá´mTÒplHùF’ÐrßÕ;Êô>mž¡±>mÄ>p°òVç�Ê;ˆ°ÌOxãF– ‰GäN_K^Üúa¦™R÷Ó÷R"=ðNçú^3µüí�w"âþ‘ÅeÛ‘Bäg‹ªí]y ÷!dï …[Æ5q#J÷ÎcXÊ6�þ'•­(x_(n)lf_Ÿ~ð¤©Qˆÿä¬ (}‚`Q¸\-Tc[½vï‡YÁ³§±ô“f¶MZ[ÈÀ篿ý6\ø˜þ‡Î¬ÝûGüý­;ΨȳªpwU5Ù²H4ØHRì í(C¼ÔA?h"â+¦Q~Ø·Yñ�f2çùãxÐ7¡?Ò)±»Zª?Z_&^ëŒÀJ¢E|gîÂdáŸé4ªç"ôÕG¡œqx•Ä“Øé±„³‡‘éÏçHmïL±í±"„ž¿åú®´�@™†™[˜§íþ±õ*Øâu&Å ž“DÍy;sÄô­,øªïy þyBæ`†ø£s8Þ ´?êm–8#Þ­Ë£it€>&ÁbŠ ý{oÈ®+ÒÍñvä˜X9jÕ#'ÏKVÚy`œk"û—\óŽ„MŽ;b|Ò›ä‘8ú…�3Ùx�hÞo&Á�Â,ÝDû¼6Ù(\lθ!š‡XwGZ.ÃThðèÏgÄx=»@$§Éà+LIt�tUÒœ´'–ñã‚Í-ã a²Ÿ¨úé!Wý ªõ7Ñ·vàÖÓ]øOo·üýÖÊ ‰2=¤ƒd´ÑA“¸œ�=o§-»Øü±ÆN¨cá)¼#óA–³Àþ+uCŸ—e§üû“þ üý§ÕvW„ËÇÃ[¾h€ô“ÕÒ�靖C±×¦ÄzíüVrXdSÐ*¡mrg”ëö*¸!û¾Vz:Æ‹ î­”áçE¿]ß�Z'߯,ËØ�=³ÿžFÝ‹ ˜=Ðá·®=s=ågëúZ„�¬\‹””,hs¡bÕG?�”4xqõ¡ƒ—Jk¿Qy«FídN²l …ÃOhCÒƒöT±¸Ò6JÚ0Æ1h5ÐUm×µËë�M&³tÄUÕö\»LJV›Ô\eú¬ cL'‘Ý2‚´�²î„‚>bLƎʹ¶PÐ�`ç|.ÈuÀ»QiǦê•‹À9G!/¨Œt�„†-M’KÐYæ”W&z¡k�æÕf9g )Íô¿ðˆÅH_Ú­@¡Ü�=÷Ø7ÒR# Ö1¡ò„ áÇ|ðþö^„Øzæµeµ�a»62z±¯­Ôžý í„æb8å*U“»â´¤8I£âþ…™–,ÃÐí“ÐpŸÖ�dd“º˜ž>ú®‡ ÒÊk¨+Ú¢t£ íñž»~ÔbMÍ¥úµmGÿtHñÁ�mȸNX$–½f–\·Ù³š´ÑYºÚ“`#ôì@¯·üæy¿¶b÷ì»t‘ä ^ïJbzmCxN ÇRáó…wÈÈi`ɺ~�êõƒ¬4AÔŠ+´Ÿ=�‹ÄBpPÓÿŽ›¹A;Ý�»9„¼U`ýS-ëĨVL:"_Çùº²ÇBcÅÑYca7ÂØjñzÎÔ#B>‚˜ÀØ(™DsA.,»Áƒ>+O¦Œ_à5’ãê 0ö;(¨ÔJ7X²ºP‰�¬wµ¼žwL¿òæ¨ )‹E‚oR¢ 9–˜Úª¿}AµIwÚb|¥ÔYÞèþu•аÄD�*¢*'v°||kèÔ† ¾�<œLÑuH݈­Ù¾À r*-5nO*¶°ò³‚HKVÿu´N¯á /½'rZ¸s|ìøŽr*ø d¾®èê³� îõ&õ +oá%ý•+GçÄ¡�5¨¸¥Ý[”* +¬^š*B¸iÃ%NaJDògÕ~®ê”x]C þ‚Fº¼‹G£qˆ¾H�ˆGM$ ÇʨšnÔGg�@�öyA%ô²åé2šç² tãŽ�G½,mHÉØÇ�µÌ`³2+ì¼ÿÅ´S^ž{’ö³œa®qx.ÑÓ~b„Û÷zü¥p‘ÈýÖº4hÑä 3~ï×xð?}Í´ßÕ¨Í_rD®š8‘*ë/½ +þ kù9€¹gÜÀQ©Oa쪵Þ^Ïo[ž1/ …D,3¨™Ewfƒ>NˆµKæyOòÿ÷cúI[ÍV<¯ê—€Ë…(cÃFy,‘ú³Ng>’bþAr=çËß›)W[‡›N§è^^z5çê“›ž<µÇ–ÉìÄÅ>åØ8§_pÞlðF·î¢òN‡)m耾颋Šß^²�™–Néß°§!v�•qƒôt@Ydá„¥ÕEø3þUâä¢]ݾZ…dA¹‘k°+a^µ¸^Q�›°´ÆxâwÁØzµp“P±šiÕé2�[½fìb^VƒJ*¯{ÝÍM: �Z·Õ™HO¢èé$0eÁNË»òWJæ Pá{�º³ÖÜ@fÁËÒñ½²Ϥ»5Ý€€ô¸h—]H‘çIW9‡x�¤w#P©DöÞxy#ý«Òœ•D*öË5Ñ{O)陼ª‚vntcœÊò_š©YCu°7ssÑKÇ VEä{œ{å2NÞÜ蛜Ÿ9ʪBa´rbRÜ<úÍ£nÂâår¤¸Q¡_/�Áû¿%ãÄ�bîy9Å=ŸgÖš*fŒEÆ*¿ˆ®ö é–l~½ãHQçS•Ú ,„·c¿é©&Œç¬óÀ_r{)ƒ={ �öfp-ŒÈ¡K/_Ž/|kÎðiÍ•¤Ž ¡mdNœ×•ˆ7j/¬è‰ï€uGÄT?$àÉôÆÔ»WªFHÕ¡o +]üË®B'Ê« ¢ì#tKÔKW5wšIz@èÓ�Ÿ›"ôìÈp‹^ø@È3i±ñ— ó{|8=À¸Ï8 +Ìí[=KÏ3‰äèÉ÷eÂ|õåÔ2Zc`Nk‚›7­� ±�9ݼ! +Uó�ÉÍô±� ¶¦gB¶¦�éÃj§þB”„ùf}[”ªs4ÊY‘­É½ø] Û;åb_æAú±zx¯Ÿ5.Å<Ö +ëÊc5ÏcMÄm(aÜ3£ÅUD ·¬7£� ‚õiåçùýuq§Ÿei\Öß„×wO¸PÒÌ‚8þ.NÔˆ[‡üð™@/´ßÚ²uq w}X½ªöÕ×kò½ 1.­P PÈq³T˜6„'>\iÎÄâ*>Rƒ¯`ùO¥31S^1úšö +j1±âß-%ÔŒ™X­re^<”†š‰-W˜4§�!-MLÌ7A¯Œþl>{Á¶:øLacbMþ\¹Âl]›~a�hì }*ÅÄ!];svüÑ¥òÞ,…0D“êII~‚:d…(÷5@âÓ¬5�àHÄ�RÂÈf÷Ž„ +�ÖÞöàÅ!îöGpJXõ;dTD¹ÁÝF8_z”0•Ä­Šû½£ÙÂÿ­ïZ¹¸Æß€†5'*}RÚ+L¹gï�cb1·Ö ÿ�tDxqb�JØÅGm_Á¦Ü\ˆæMû7N°½5G›};Ç­³Gg++ä'»› V®ç,|ÉÐN0¿/y}Žc&; +Û-!ñ†“!dž<Õ©JggàëÕäêd‚„<èètIBEöµ&O“�–Yo œ`þŽl0A-I¦X'˜¹qëñ0ƒ1�(O»æF�ìJ'êø‡¤IñQsôfv',ltßÁ´¢s-HAVç¤ÍʈV¨kÆÆ^•åúÅ©øi/M�ç\ç\ŠÿŠí’…”0M7èÀ—{²ñ*@jê±;Ø%.¥3e¤|_Hcÿ‘)íʶŒXo!/Þ +=„E^ÞbhéYú5ÝO¸ÈŽ<ó1sV)Uõ‘ñæ½8‘ñwô�6à§¼À×sò½š5¦g¶a5+®¼¿>æ?ê%PnMúqUtz· O0ˀÓæÌb G¼OZ¼¼³¶l %[݉¹Ö*«ð¦ñ1¥Kt•À¸ÏYŒ¹JÍÑñžM“]I¤‘åïm=fcšä~èý†,úË$Óo“€:sãÇDJøÄÁ­$� ôMײ}agì$›}Ï.!¼MÇÁvέQ‡IsIdÛBìW ëL.Ót”bö)Àdé†^ƒ³`c"Q2÷t—7 ` µÝŒF9Ör-Úz Z^Cº”W´ 6�…Ú®C¯ÜƒLP[ÓË^æí»ÞøãD¨Äé½h1£D:«X8æ;jJfÛ»ÅæBÎ]ƒ)ÅKO¯,R’Ã%`àž�“s¼fZjÿÀKŠ$ÎÒWß8v¤á4îT@g“{êá}Cñ"f�ÅR[ãZ¿/+¶S/gÏiÛV‘{ò³ *ôÍyFûgÈ3Tî†."±&bÄÐX)žÖàm›ö�ç¹–¾K´¥Œ +>kèÛ‹D*º8”©pÙ�ïsˆF¦|zn¨x’"$è ùþsÞ*Êé«AIø>ÒÞ:4 úïÖ!�ë5[„>Ì€놧ó$meZÆ8ÌßÓ¤§5“Ì}/ÈŽHk7&T$_XÙC¿ì¿±6LÏ™d׉ñÆøò¶ŒGÃÉ3¸jnÚ%�Ì…€œèè(§Ý¢†Y³î¬³„î_\è4z€­¢¼»†&Kãza£ó»åVè'_9YD¦ÝÒðŒ>…çP×>ÅÓë£#\]¬]Õš�Gwð–CüÂê: 1 1 ®mA?ã  .·SƒŠºlž´ uMLѲ%á!²*¥vW°1º=’.=YË´ P—¿¼�Æ%ÂôüÉ,&­a„Û:>à5°A§—¡6Š<ÄJáQñPkˆ»T¬¾D ú²ñ¨8»8{ÒÄŽØ”ŠóÌæ¬#G@\T§f®â•Mh£kÞ¡bF@=÷Ùg*b�â ®òÀÿΊÉ�¥ÄNŠËîð°zˆùƒ{øí圅W6Oñù ÓÇž·;©Å38{ZÇ[ë¢^#kÈÚz»‰ÍKëõb«#)Ÿ8vJ4zq §*Ÿq�3ÅL{4¼BcñÿkÄ•Þn§ä–<ÂsƼ(Te4g²+²Q®Œæ;NTKX#õËP\®‘°I³ÎÅ(ñ@&Ô6Òþqî|Û§¶åÐNa•áu1ϵúÉ7šBÊX*„ºjýLßÚbÏš>D[�ß©½ä&•Q@E�­ïÍ2Äm°ƒI‚&�õÈGAËè¿öJ*U¢³£²‚‹oª%=ßAYk±Î$uÂ3fQÄ9ìi”ï’úºäPAé ”ÌC`gH@M†Ù­ËŠsC«[y–¥d7‡»”h½�¼ë¶SWt_ru—º,úX¶EÉNv„µª­R^¥ë‹º¨ ©CKQ–ºÊRWk* J](ŒU©úhN]üBáVêšLƒ÷§æ8&%”º°wGàé©k»%Rm©K²î¶W�äH1¦!´sX*|wŽÉlÉÕÌÉ´„Ûù¼ :D½å:ÕMAÖ¹±¶r/5=l«ãy‚Òy{5¿Ê›ÚUùµÀ‘à®pËœp` såp7чkøânï¹oß+ku²è¤P½Ú?—Z»W �biúå…VÑñÏ6XBÓÝÅ5º + +ͬk â.ëV»( ª³e.Z2dÚ\ëe"qùƒÇÙz•Á¨híQlôs×ÔR)1(–…øèAÙã3Ž?Thºß89ycèêõ> µz 7vÈ„D’¬•ÝÓóü:³¤YÆž´¥zX¢ŠÒ1ƒBˆúkñ±.-µ¾x\�øèÁ8*ˆÓïöò¥’ý#iëe–¼Ä±Õå˜í“1a˂Ӿp…[¸‘9•š’³žgCÅÏì £¡6pÕBÅ` jPީ֡}vž¥¦v™JIø¿q¶m¸Y-tºd~:d]~}Ù5bçˆÔž¥†ô×P)"ßQ�y~ ˆÂ˜7>ßÅ!��ÞáOÊÞÿÅ vÊ-¶d¯·­ÌÑïW�ÆgÙ{i ¶ÁR0þïô9\ü«Õ�ó÷pªiv +ÞäìöÌâÜøÝiÜJ\Ê‘ÏøÛ�k}E™X&¿0ÎIÙ +5˜ÌX¦Yi;W4÷ dk”¿¼æ)ðëbÍ‹’]‹1â¶�Px2ä\§ï>¦#AXž땟Þ(Èi…wÔ/îöœ­,™¼ÿvRYƒC ³RR3!ëçó ÿUäS*ƒ;0<ñd“ó•V’P•Ù¿öÜߌ— ]á>li=".;´8w,T)t³Rs%X3xV°fféÌ®IÄDÙ[ß±ÈßÚŽy�WwAÄLôiQܨ¾,ꎖ֘YO;rfÝq\)€[M·< º‹Åk¦¤\‰ŒÌâ"Ä…×5ÒÀÎ"šyÍéÒ¨"ü8•ÃÕñæ™ï±Ò¡ …é¡\�cþ¦tKLvÚ<Ú,ìì$°¯»´H¹U:—¤�¨øûR‚÷6MV!û�î÷�i›ÎQïë a>Ë¢”£,h<ïÛŠÌ…ÞsàžD£e¢‰ò¢[?ÌoíóÍiÍ·ýæµZ@]85„®ŽÞÂ/æo’-Ç€Uc$˜Œ­‹7¶Ë}Í•_ 4ð]¦©O-Qèg*sXvòµÑl)Іm¯N  Ðý·Ã˜ÇF#å-ûÖ tÌ5fwÉ> 6/�¦$©CgÉÎM S û ¦¾6‰³@³p%Q]ј°ˆf�®rï—qì +(>ŸnŸãÞ§ýSìö˜l`ãÜSÄ!2whÆí�Û¶ÎiÇÔNõCKpNâÏ”!N2siiE”UAûSr®_$ +*»ú}�L2D»Œ¾u×JÌrô™Ò-]ù÷�/Ð6¨/ÜÎÈ’{ÄúÏ%N>|åì`e᡹••ôŠÑŽâ»¬lJÿ«Û´jQ,²ñÕ"®šÉÃZj«; eÙúŠ™Sä|€±âÅ?k@}›t'° sÕß hõ<¨8VÍ6ö±y-©ª¶8äßTl¶¼RÆŸƒ/Z �äp]´Jb涇õ€.{=W~�m‚! î>h¼?@™hê§gdS%…m e I–ìe¾æW”µèÛ"¸˜T°ï’µÛÁi�ˆ)À”ÓÉÞo/-š÷¯M".ƒ«ç*µî¾¤¨r “ŒOã–·®haaxƒîëì­mž|²êlß«3hsD†®ôÈÒãj˜ítýÀmÿˆÄ«H&Ü3ïS: ²:z�)è¸Wi¦åKÓ+¸$°&Ûv’å©L§¬)cE¯d®—y$Pjf’Ãa �2UOäòÐæ%š8ÁQ‘._¢ÓPïÓÅ€8AÑ“ÄóS;°ú˨0!pèz$¥€´—«+¸…7�Ÿ-áêøÃý¤�Ýs¾ãî0V +r(3¨ÆYÞÓ§kð3v„)}�Š=ÿ/[7feIØz@R�­Ö-›QUëÞŠñ‘J� a2ÿ²¼ÀXÕÏêœ{˨h3~3n£‘PgÅ�À·^ëcî/zQg¤ +E?¨Î´5ð9'�£ µÁVuƸ؋¼ø.F�í Kû^O³PçáË,*Dbâ7·+¤x˜¾¤€*p^*),sSP0ºBŸR�4°zÃnÔyNO“êlÑ÷¬JqEW~Ô¹$lX�WÚlRw)gfU�Âõƒ ÀÇÔõ 7ŽÐF4y~X'á2t›üöÅ"~Qîõ‡Á•RiH±á%�E¶L6– !ŽQåz”�² 5óC–Ýœ¢ðèׇU¡Øß„Ó £…l©j‰”Mnú:¤˜DÂa”fëè < ×¼¾,‡&a»IXå�’&C…šÖ[$HP¼à ‡¹+e™Æx"[IL{¿¸;fG:SÑ’¡W[ÜoèÔ$°êœ:4Ç}ІS½2üchVß«Ñ&SEÙ·'¬‰et®˜Iñ™uÖÈ…渒þÿ}oy·Ò¸̇f¢¬ç£:u mŸ�å‚�$C3 õNÏB”8„dSI‘ZZ Íà”™ÚK�mïåòÐ F\Næì}€ý̉A¶TÍ&±ËŠÈ­œûaÁô3 �МØ-º2?³‡f•ëö™y�Ðl·ýüb�Òm\‚F�ÌϬ‚B³y€]>snuWkàBhÞ뀮Ÿy……fY»¼S54ëÀ±ŸÙŠ…fÙò•ûgŽÇrý©Ð³Å× Í¿êéÚNÿÌGš)“€öϬŒ8ÿÐÜ‹˜|Ì\?3šåÍUuŸ9ž[ë�¡y=’êÃ0ÑÏŒBs©öºR~æ,~höô|fºböÐ|þWãU×ÿË‹Oh޽ÍT1ùÄñ?s¡Ù hB½‘¨�)4+Q£Úõñ×T¨N3DW£ŠÏLJ¢žÐ ÙœlÀ¸64v7·wÖm‹´ÎÐÜ«iw$ÜVS“AÙÊJ“a“c28Lé4�¾än7aÜùÃt2˳ˆ^!ªÛŠÒ«/=—i›:væÇ“H.Ý�Íì1Ô|ºÈŽ•Îƒï0³Œ|ï5Î !Ä/sÑ3¼ÿ.-®è¤m´i,л°ÌÆ�³S=(à!_zÓ�¸%he*Ÿ�+~—7.¨™”¡éײÑÅkKhÕÌFÊÚ}íÒÁcÉrdÔgJ`Çnòø n9ZæÞ²¤%#i‹ Ì“6r£ dI™2ã’©�wÕÄ­ o®÷ÁY+ë •RÇ v¸˜°lf‰ê@t4ÄYÍž +›S¥ú¯sz,¯M£±¥ºS + &wÿÜj¯gZ•ëýˆâ¹dGVŽbÞE^Áž-×[Ŧ8àw ¬’¿u¤Úš‘¬.Á«˜=Ëô”Õù¨wÌÂä[ ù5Šï±!Ó°ŠÏ*çOšÅ˜æŒ)ž¤¸�íÚH3×@îNH„SçŽ<‡¨ÓlÕbܨtÕ#V˜8j<¥¤9éß6ÍÔ�¿Ç‹À×…i¾å¼c0Ióå¾"A&tˆ¶•Æz’îBئ™Að>i®"Ç¥œàÅLóóó{?ÿ`7t_˹:>¬"ýMGóB5˜¥ÚÞ×ãG LAk€å¸n>:¼¢YÞå豕#̹él5¼ÓmÊ ê‚ï3Ãò‘Å-�@†ÈV0UïÄ¥XüjÛ{§ C &Iñ’ë΃…CåFÎV>;xÖ…¢Ï+�ZœÒû²ÞNr RÝÖîÀ&“�ÌØõ-é f­|ØðÑîá1ÐSPû×Òd"ÒÍâXÄñ»íÂx%/Že«Nä‹gÕäõB=ª•+'¢^ÕX»Òµ{¼w/…í±Àý”›XW¶ 09õû)˜5¦W +Ô™#³šO ˜öLÃP¯Œ¯@ÇóíŒbÁŒ’îqMZ¦zrÓC·¯1æ3—„;§hŸÛÀ]!š<£&o�.³Õ(û +³ŸyþâÑFv +Ù•*׿=¬Ûÿ€ùT¢µY5«[�úßjP³9‘6‰:Fð-ö6:^rùö„ë%Ãò$ŒnµÂ+ã©;E¤¡S!÷8Ê‘³}ÕÌ V~K ÔÍ[yãnS nð¢x† z‚x W ^ÿy¼²Åï�fâܘü›ÇSêÒ<>©É›1ïDmÏl-@ªu? fx  ¬Dä£�6b˜€8÷¾ÀÈ|f~¹¨Ki­ðFÚ)™H‡±vpZx~EŒ¼T­ o7˜µžk¶N„æ~ó¬")v´4ù1­ÂnS±Ó’¤º­�ïý~ê…BÆ“EÞ€êÿðóݧqù»·àpKéó‰‡'¿¸™8^Êöå3OŽ[Ê(W,àç~fß·uÅá +K–NÎý`³Cøî�p\‚é´À–siçvýp†´f„Nû‚0©z +,[U†«·õù}Y ^ËN±IÇ�°ÝÔ±Áu·¹ …è{Ê<¦2úfKížNÁB“«î×l˜¨ÄeÁX³ýQ°84PÒŸÛýã²&}"(]%ÇbÌa'ý×+ÀËÜ>§É?Š¥T:„ÃÂe0É’ª�¼Òõ}5µÑ‹,1Q�Üæøx^’CÊû}8Öö€Ú�4Äê®Ä6_Ê ¸¨‹Œvg�Ý6¥Ç+èO瘼CòXÝ}›½^W‘Iz©¼ÑÊnKj¤@[~¾ zÈ›Z?Ž!×™–Ò‹—c®$¢Ð$¨q{ŒÔ*Ê”ÑSïåqSQ|ˆ‚�µzðiñ6]6ô¢ü…ïé¦`ýÓ Ì[fKËøÀÚÑz«¨‰²°z(S¶™@)”ÒŸ¯ÀšïÌà{P��¡xÂÿšm.ë�öîb?ƒüðaï{‘¿cëÒoƒTé)ã¼ñ.øà„=ƒdw1Ô%ùÙ‚¡jZ”õ—ø=ÙWØU(Ưk¼03joáêëÎØ¦"3ÇßhÐíäps½!‰ëáá¼yB6«ÊEäÃpãÁCHlû‰~±M\ +_ôçã|ÝèTªsÊÇ9 @¦]иƒ®Ì*©Û�uË¡^”Z8Eê! FÛ_NÈ!ÅkŸ]Ž9Íú’J ¥Ä·7™Îg¶j‹?™JV`ž¨óÑþibZà.š×£,¦¼x89hÇjÕ|_IØRöæÒ +åÉÓª³³̓Žã&;ÄÖq–ç‹Æ-ð•Vó±´vIáü ÎìÔW{±O l^÷¢ê#ULT¨r`Æ/ðëôm%†-;½W�wûä¨] 5?ƒznVBïÍÚÝíÏ ¬�Ö èw‰€€ðÌ­_fIÙÙá©^ìn¦ú5ÁDéòh„�µC©bµXDÈ-ó •Â$êSøø&§ XÅ9âáꕈ45bK-‰,ׇ…�¬ÂD|¥›ñ°Ü¦3âAÉ¢2ÐRvµ0Ø´ôv}ù½c–wĽ„l>7ÇW ÊÕW`ø tîøØo�oOÙÛgàò‡m6⿇ŒÁæÜ"E"ô s’nI$‡q�LJÞ•AP“bÇ,s(¤S"¢ ’øC +"½ˆÙÀ”ÇÈs¦›hÕFjÍw(¢5¸îŒz!¤È5G¥÷ߌÀ±ôôؼçœA0¿Î" +ÿÒG= ·ÚSûi«¡]În¼óV3{é›lìJç}¬6Ñc\«Qàÿ›1oµ|Ê+T²åzÕW€<çb¨ ï4YÄ9?ÝÜ}×ݧ]6 Õ(£ûô:Up ÏW`ÿQ ?É 6v>:a¯ O&'½‚ÏN´5þ�ù?ÒÊ1Zñ9�„áh„o:íìëC3ö{@–·èV£¼Ì +Ç/ugfOŠÑØÒò¾Å|½ÈGwrã�5¿¾±þec;G(0j®Na÷HÌŽxGT(HâÝ›�¹¾Ô)÷ÞQ³pÇæ®XËŸÅ)á½"\F$ŸUªU¢’¨²µëñÞÐ%¨ìÜóµtîUÇfò-#Í€BÜü}f\&ïÁG‚*ç mð¹až -¶ê]û„ÎÚF}ú¾�"{¦0‘±DL'8s¼J –»Ófj‰2Ç®œÜ6€n×x6&ù ,S6•wŠó>Ù’ûqŽV¥ÃwÖ«uÌL„¨zÅž‡ª‚lgÿ€÷UÆöšÃ©8ˆl"E^súÉ;ÌÀ¶,;û÷×\²†Ç«¼öÉ-DÜd¬ á{‚u‹ØDÞ|jµ�IÑYþQK…¼Z¸¾ØüÒ0K½\rYÓà`¼˜Ïº¤ ¦!_Ša›ÄS|4P~}9po¸õbF÷>OGÀâÑ<±çÍä’¸ ÜÀHv„¡x¾ù3­lÖЪ©uà]‹±„4$oJ7Š €ØüIbèÐ x‡’ õ÷ÀiA“gS65Œ)-º¼ŽÑϳë›tf~©F NV|Wv#�€1¦VónZ'8\1~ $öÜ+�_6œU¨øxWÈd½ô2€0r Þƒå‡Pš\3gjRH^¦¸O´ñ2gz jí”·0v‘ò:áÛ²Ÿi� o¾½nR„�~íäâGˆ×PXØ%C]¯™@po±„íðÚ5 õp´˜'*åÞ©<”˾dõ|¦+t~|Ÿb$Ï0 Slá—$ê”°‡ã‡Ö�»ßg|¹ï…µ°utgÈ#i?�¥BÌx¾„†qkD7–>õ +…(D[~= Ã�–Äú©ÎJ³~)s£×kd¢‡r쇵$‰JL•þ@˜²(ý2šM �ê­ê±#�†üƑӀ"žô�¬u>ûÒÊÃ.ÔØ·5$“À³Â÷fbÞéÒ|sï&²y?ž÷|8â^Ä”¡¿ÙªÂ¡QÅ‘f¹GÇŒ£qƒqó}¨Y,¸ÉôQýPqR‰àq‰X”ü®[Z(F²Ø‹ íX£4§Gnæ‰èzÿH•øMæ ¬ ?¤’V�ÿÜq°æz1a|Œ¸Ç†E" \ª÷Œ„°‹U? “€QA*‘gW{èGæ}�óc=¡Ö¥Z½�Æòç(xŒì'¡3JЩÉG¥í`òÑØYÅJû/ÌÔÆÈÛŽføékºÓbó‹áå#âËhæÆ.¥ÅbëÝ×{ÛPÿÎ9jþTY ~ +ó(üË7{|5ήô�,ˆú S¯¤~Q ^ßl×å^Áæ«àÉ>î×­Êåpi”.x¼JÄE*r³DÛÜ|Hb™ ŠË�ÓñÖüðlEŒ×þ‚¢öÓ!>ÀJœ—J3KŸl4• §?»ûc-¨çA¸×e>Ùñ÷-Îü�¶G¼MÇ2ÙDs zìX‚CF�üTÄ�"&b„¡ÿbFh€¯Tí8pïjvuýY'ý7â äÂxºý•òÇ£�€Ú–�?àÉ´6þókùB÷Ïi:›É‰ë§É}¼‹{*±—×Þ€ëÆÿ‚¾ëþ°Â9 Û[óVa-±Ð@–± G¶±"7,m3ªJ©‘dtÆÊ¼{d &7«QúXºacÁŠ=Øéò玴—MüV�,ÿ´tvÙã>ÜÕo×êM8Žl—O¢ÛE¶×lP)m\Kdxûùë³^·ô\}2LÖ¸#b§ÙPÕËd +ñ½¤ÌäÕ»Óeÿ�…"ðE¿_º¼]‡Q”`›�¬–“¬T¹‡fT�a¾×šã®¿~LçWq‰ü""WÚ¬2²ä4ÈEû,Ãö²ía¥0#–ràKÇãe´bÖM¥+…â²Ò‹¤4ÖI5Ë'5Æ·þ”¼håÇѹ�t°ž”­Ù0*1¦ƒ6ªëËMû +&¡‚á 6Ê +„rD +Ø’h ¬Ä ‘RKàÒYgCxÆçÅz£ UýP¨ª +èÕ>< +»AªR_¥Ò8D/ˆ8&®oC^‘P,!Ít6†žq½qÜê+Àü´K lù80˜L‹D9½è£êPzMËá÷È+s¤23äVMdÚx£ÆV§¯ÛÿT/ƒ-°¢U‹Súh«€^2:${=Eˆ9ÈÈŽOà½øeQ“>N9‰²—eN–\¿ ²‘iÓ‡X19°ê'4ö' �zÁÇ 2‡µátf~£´muµÍ$ù :¨‚>�#\Vd`šj†©úˆCd¿{€‡phQj  ØÕÂX/ Òh| �óÑ�#À;Áp6;¡$ 0>“Y"_FæÑ}4ç20éÎñ¨ð.Õ?ª‚:, Ü6],·°×ŠkmZ¿‹deÂ�Ígµ:Qît>P" ¤fKÉJc€@�àh‰|FÉ—÷VÊýÈ¡ìÍDV#¦�íÆºY޹LEæ“~X~y–­Ê&ÃÒ#Ðx£>7}âx(º¹V{¬@�aÖqfæÅb0zKÔø‰xØ €–JM9¶·Ù/>ЮӤ2aÖóôÕçH ™)éA ¡ãÇ#þ��ƒŸ@�=÷=EGÉ�ÁÚjšëXîìLZ`ëƒ\ù%êe�ä(8^å´ƒYøœç^á|Ü€ C·Õ{~§Ô† ÏoòITÍ4�!K2Ŭói4Ï1Z¡Œ�Ï�Φdú7£G<�zþA\‰õQ©r€3D¦��©lÙ ¸Šh�MšÎÁ pwR¼Æ\¿yÝyî'F|b¿¹ä²ßKUׂÌí…µßüj©Ð§½z»àó±îÒHÉ €(°o€¢ÃÙYù”êÏŒ…ÿÃÒ™x¦SË,3‚GÀȘ ç0€�‹å+iÿî’Èq.Ã£Š fO Ÿâd¨8w¦Zû-Ɔ)j·Á“™4¤-oÊ‚e,e›Æ­Éq6‚“€z³ë§ö Uòv7 ž“c!ã{þ�[Tó¸FiÇ}{!Ê=`è>Âm`7ÁÒD¢Lî·È0x=ÃTNžxÌR¥ îªfŠ9K¢œ¬©Ïá Ÿ²ACz\Þ{$ø—mý–ÔŸvÉúJE©Ïs´QÔP&š¸'†+sZ�c1D'~¸¬£nŒ;u–"’.º> "±‡ +²jªBq§Ä# LÒÒag'»qiÅq¡GWH ¡é<¢j=ÖJ¼ÂÑ¡Q{NÄ ‡Á˜Øµg¶‚«1 >KE¦¾‘¾•œç¿~-{0³�ý­Má��W3È„I8Z¨…Ïœ’ôÐ%¤—ÁëK›™á6è +¡ˆaøêï?Ö.‹):$Úñ'†ÂÜl½s¡ÕpÅÞŒ±)ŠÙñïãJDAÓ=�’g?¨Åøzº$V3Ò�²¬§ö¸2°[’¡ôØ›Øî€Vãi¤lT±&zlÐ7‰ü÷E�®œ ò/Fù„¹ïEslé^¿EN@³hÊ“¢¢E— SDöÕÑ/W‚#æõ8¿êm„qò£�¶f‚¥ŸŸæÍEu’~úªñù¶— 2ÌšîA’IÅ3ó‘Ò(¤*y¯dé^‹n—4KÜš]t>qÀ|šÁë–Iž¤¨£HÇ2ð»<¸GÊúÒ+ÔNkLÅ�,ðt¢“@6ãHÞˆ/oö¥M’ÍŠw½±m‹Þá#]üFú!¸£yò{}9gNä@Ð`٘‰6À©Œÿ +ßÄË ˜$[,=7ß>©K†Pp ƒ6À�ˆ‰ =˜ŒÕ´þªŸ¾¹ŽwÆÓFE-¬çêÔ ¤`«¢ñ*Æ^¹š5~}ô—ftnq\Ùœó‘*ÔèÙ5(9<ŸaÎí‘°-‡¿ðuþ¦¹@�¨b%Ã:Ói•;äÓPB‚úO£“ÈyQn;*«bö¯54wºÌ Á jŠš‚¹‘Ï ä ›c&e„*IÄy²»«Â?Çèe¤€?šî§Ø§¬«ï%È¥ÅõÐVs1]¢"¸rm%7�A{^£: KÎNùú¥Éw¦…”€ ì´ÞÖußû#ÑÄ™åsÎRÇ5j ôëZ]7xµ µý ÅåÜÿ‹T$×÷Æ ÙLZ´B�_ÿßè. ‹8>=LUø; +Je£fh˜-AËÈÿÐí0þJÿO<ˆäè@=iÃñ‚óã¬è¨ðä8u‹¸%@žiEö Ú®ˆ¹`4R3û¥þ蜢 +lÞܦ”ËB[9“ }k9Š”Úwÿ6�6UÛF“ÌÍTÀΘ½)aÿûþ@Øó¼œ°!¥ôÏ`&]¸ÒºÒÎF#û(Æ•¸7¿UwŒ\{ý°E×éÃk�êZìO8K€ùΆOy“+Ì.@ÖTމl%[¯ó‡ÄÐG(°e¤%íj°ï?ä]Gé_ ƒæÛجâ¬(£î4QÍõþà¦þ®f»çá !ô{d±ƒ¬“ù(€X—ÒÌz«(@¤¶•bÚ+·…Ï"¬$„Å›ÌÍ=îxc¡tv¡M/ѳ_2nŒ‰\T]<§ +ër"@;hrY2Æ8Q;ëpsvÆ#‚=pƒÇd.¯þÑŽï­Ï ­EÜ-Ô„\2J“:³U†2µ#¸�bK’Ù{ +¹'š0جÍFÞKÅÛÆÇ�]8 ë{«  ÝF�¹ë÷!‘�aûñòåÆaW¨’~»KKéM™H"x·.mKZUû‘£6í´ëß—&óFß…élžËNÂóëe…“Í¥›.ûw_DÀÑeÛù»MðÓ>2­ƒ¾—¦Àµøw2S©™ ÊfùÁð@D~½òÓ<�{4ö—¾—¼Ææƒ“ â~�| ƒïoT>j›Xß”'hzé \&í0©Ï„Ž4€nà¾rÑ»m 24Þ{Þ0\ëŠ"Ìÿ!5ÄZ×[�º�˜Ào¬[Áë,o\Ap£ËvV:i°øÓü¢"b]«¿W™ÿ·{wæ�¢f€L�+qRø²\U‘ëµå¢>…Dâzµ²ä´±¤ngLsçÅ‚›!ÆŽóˆxv§¬‚Q©f”â_‡`kÚ h—mz5mþFnT¾êµ*:VCDt"*g݉LéŽ$ù˜hw<¡’sºÂÅýûˆákDÛe“;vhá‰àüd˜£t†Ä•þrg>:¿GÁ]æ¨Æª~Ћs\u´­DñÈÜ�¤ê!Ar6ódkÅæ Ò6ˆ1h£°¬¿d-åÚo=×íîn^/æTýøŠÉ9íF"×ÁLŸ×c S±aÔDÜ;(ž`�|~7þ‘þÁó‰Ô¤Pˆ…â¤)%nZÓ)T»X{ýÌ®z¬(‚lW½^­€eÙXÖÙY${‘i0Bp1·ÄøçjõXu^^ŵW ð¡ðÔ_ü£!ƒ5*LÖº²Ä¸ÛN¶$‹s"ð{>Ux5ðÈ^—ß4ì©!‘Œ>Ÿãä\é{\IìÆ—�=Úº‡ÄxÜ@™Z7òßÔmzï}ߤŠdiG�×?Ätê=rÛÈnUÀ¥ `ée˜û¿ñ¤Ìb¿D– +埜ô)‡ÎWìÞ@Þn^¿íÜ¢×�<ÄwÊ;¢¤¾¾¹¨d߯¼éÏ!ƒÐ’òòã Ï"çŸ}#´Ýîªb†o£a¼ |brÙô@PAÀêÂcZb,zZ±.C¹¦¡Ý¸up*üs -a¤€š»åètb!�>ËК*ü•Ø?ìXé4áŒ?ŒiX_-#G^¼è;{"br–ºØêI„#ãóöÙÊånCð_Ë,î;àkC*Œ£%4hA,øù…ÆlŽõ=èó](x7N;½új³uÿ¦jq°þýMl)ô +9ôÿ-è…<ý‚"…>˜KìÌ +½çÜv½åŠ&5:( DD\ÀœB»Jàâ\\ƒ++ +‘˜H”™™IÛí¬k&ÇËqŠ—ãA²²«)Îô9$è{eÒÛÀãÓG!•èÂj òšO¸r âü)²ª>g}hކ6PÁ4*Û(SM<¶�j"JÜZˆoQ$�Ü¢H6cÄG,_ÄGZªæs +Ð|û³Y>½Ð0\ +ß¼òðÅÅ_e€z0¸¸rÁà>‡¤hNŸ²‘‡OQ…++LˆÝž\±4Å4|QL»øRZ¨âÛ%²£ñ ;× /7nõQ†”lñl2 CÔ^lb”LñÒÇi³‹G9Â1〱ßD« Ñ*H´ +­‚D«`Æa;�Zù�R'Ä·Fì|˜ÈD 2Kö‡qØ5M¸ ÅÇ~�¾)ñØR.‚ ™5ZáÐ’³]x¡‚ ðB/àv“˜{`2`2¬©ji!R~Öƒ³u“5Kí¢!ÄJÖ<•nšdIí‚57†²K7‘Àš vác4ÓfWŸ,b¶–�’ iAE«È,KÔY°–Å@øž�ͽ� L¢Žz`:&|ž ¨D².ˆ F"Âß Tî¶uZÄ�|æý©’a�B³ùÂKÇ•‡U­¬1m.*nu‚W=•|^òBPÀ4ÁÇáSL2œ@jd©˜¨P¸¾øâ~ŒJKô"]þXøÇèQ¹‘ ±¨J²IÍ*ÂsëH–Òˆí!<•XMÒ@⌻“IKµÀãÂ_|/0´Y´,£Eú bZ)E^_4¾/}ìB‰Ú�!òåÓcA Ò$L7<«J{) Ó(¢Eø–T¾Ð'ñÅWº„„”ˆè˜>¡—;Ü^+�ŒCy¨¤™@¾áVš­D={2)aPrH|m‡O'’jfµ áZ¡b½}áĸÝ2®/QLJiÅ�ÿM¬tƒØ@&‚ŸëƒVÅ 3ÕþMXI9­'•] ߞؙ, !*= P¿MC„™€]•(1ãF +EJ’ñÅ +%{^#K!í‹Õ•_Ô˜åµ!1ÃÓš�¤µ×ÈÀñýxµYfJxøêG‚C�‡ùÑ�…€ªtƒ,jWŠA•p‘Ñã  åÄN©~æI1ËtðŠä¦ò‰fsI„v!Ão�i¶’@mHkqe¾/O¨L/Vøâ.†¯ªÙB/{¤AkSÄ7"ÁãÛz¥jÐ`m׺ÑpmëöêZ¯T­…Ku-¤Ú×½µd©[G-ו¯ë®º~f�ugr­;®ïªó¹ÿS—æižÝÌ%×¼”ý“ç¬û7î�—{üÝiêîì™ký·ižå6Gß}SçÜó¹»þ},uçKŸ·ÿfÏgÏôWVêN›_÷¼MîÒ4OýËÜÏüï¿ëqë…ºÑ�×s]wÕióügWþ¾u§;?»®¯¬ë¦Ö]×wÕ}³,»©»®ÿ6õææ÷å¹G®¯¬;uçÏî;?{™5ïãÖwåKÝ¿6Kÿ÷©Çß�ºÛ¼Ÿ[›¥î¦ææØ»­}6y÷ºìž�¥îø×e©óß�g¯Ç~e]Y~Ýýío€Žw¯ÍnvÓo­ÿ×§æeß'µ¾túÆjj§oî¶Ô._Õ]ýÙÿ6ÏÒ<½/ùXv¿Ü9ÿÿ¹ÿÞëñwåÏýsskmöïÇò®:s÷üwÿüä¦ïãï̽³ö<çÓôÝ�eÇMžOÿuij}òñìÌÒë¾Ï’›[û>–ï¼—ç6³É÷9fÝmnš÷ýóïgÍ+ëzÿ¦Ïú·î̬ïÚiÿ}îç>}î~ôºûæßçξôzÿóôþô¹Ÿ�û‘ëô<Ÿæß\—z›¾÷œÍ2�[ÿ“ŸÞsÓŸÿë1ë®5?y.;ßçiަïLž?ÏͳԦÞýÌ'7}ÉÏÑßU§õižÿ4Ïýuîãï:ï&÷\Ÿþûß½©Ëoþó,óø»ÿ}YšÙï²süf׿i–~ûm–çøo€ß�çצ×&ïÞìz,w~µj÷o¡._µË÷„ïwSO‹îÓ§NÑ=&Ë%DžðÅAÔ.ß™¥ût‡¸*Kî¼ß�¹uw–¬ä¤õE z|©�‚|Ó�hŒGA%¢�c–ÌƒÓ ¥¿•ýßæ`ußlAÉŠö„º2P QC)�E�ƒŠ�€4àBd8®®\òÒÃ>0dZ­ƒwò(8"pdFôL+‹¶T�“@ðmº¨¨²Å‘Ù€ \â /y´‡i§Å®‡L`ôù 7R zTÕ„I.À²*?ꯙU©c-¤´¨@´hª ­ÙAJ�ž)ú—j�+m 9vø¤tø€èp£J…Š‘w¨tD1MÍ€  ƒ EDr±` ,"BBB0.".. Ebq8$‹�X†q,Kb(ˆ©vHLûÇ{WÇ5jëò"âÝ*S×|—+7°>�7WÅ:úçîzžÓü%„(Ù&7— yýEÕl%1Ž=ÃÐÁæ³ �¤$#Ÿ��àã ÷b<¬>MmñôœJ,ší½hìo„(Þ¼¸yù>hr¶âtÛõ¨ýBìÙ_õ•ë#�««ÒÕÝ ôÖöì|ægÔ�¶0ùOèüòüóÒ·¯$ê_çõñÌØ7({rî�uCÜPpv#�ïâ~ˆ‚­;½¤þeß©š~„}G4ãô�µ4Ór0Íkô–Ëڰ産 +­´³Ð½…À fWùV,œWü¸ÖR'sDðw$YíV™Õ‘øiÞ�„©‘ûÖÿö§ÿ•Oú]ICõ/f ˆ68¡c‡@®ÊËIÊOEŽùþ�WY½ÊO«jn–ª�MƒÁ²CØdY#Ú°õ µ Fº†Ÿ?�øOPÙÄâÞÅÚ'N7²��|ðkèè;Ø…ÞŽªëòí±ˆÊ.ƒB`õµðÈ/ùsžÇ‘cwZ¼îFïŒõ¡âRS˜ÐÀ®,øÜÿyÝ=÷+û9êåR;X [,gÒ«¿8½ÖÆ"_æÿ—wÖ%Æ}ñ×+ocôÅg¨¯gB �göoÃÍ¢r&ÅÇÕÎ tr/¬‰2ÞîêIÁR~†ÕݱW),M€ˆ¹¹÷º€õX‘,F#Ÿ¦a‡!±©L›Ê§pWŠG9N@Ìl””hüûÞ»;?ód»¯ý\ûîzhé�?•é2ôŠÈ ºæqUù'/@¯ Ê':F§ê)ó²Ä['°g%€‚Ý ³—©úcàÅ`G€ÔÍÞl.:(Ým×ät‘×Ë»Ų̂­±N©o·„—Êâ)ª68JÁä8/ß–$ÖzKâž·­îŒËº:éü`‰ÚŒšnŸìH®§k0}¦:VÐvs—Ÿ dèïn¾¦Ùh¤0Шe›ÍüìóU;Û¹„ +âÇ•YXÑÐáå$‰MîÜiWD¾¦Aõ�ºÃDŒs î+O$©±à3„v=SQÒp‘TN:'4;èÁëí­Ré™*ä]®Ce“Ôý™]]ê·‘ ÃΜÉw‘�e4Ç^™T‘€´ÃóºGÉc«áþâ IÌú³÷Þ Ù–|®|&“€*1V`?&>g@_+ ZÕ)”hÙõ‹�Xõÿót2ƒˆ¹œÂrF‚QcÁš–Ø%ϸ!aç?«Dˆ3ˆ% ¿Jt‹šéü²I�h¾˜à°v•Êú-J@<Æ{Ä& 2�R& ¢R +…2s"œDSŒ¤}€RòæF�ÄNlUqœú‹ +è9"Á&`®Õ>A¤ÍÆ•�Y"áßÞ´e*´’2˜FlÓòTa�óFõ«‡ãûù¬gþžå©ÔžêéO¥gv28*¿fïà?wËŠ ªyÛ>­n© òy!§V�DH“Jƒ‡Ÿ¹b§b›6_5}ß>ÍGM7n�a›¥PûXºðnÁa—E:.‡}Zô·Êí‡Ù^Bèp5*Ix�೓æÅôû•êŲ¬@ðœqj÷çc>ÞÄA¨0gĦ;¯cŸÒw¨¢…ü¸>~*þœ¸ËaåÕ¦gf}FY@�OÝ©hs[�)ƒÍkÇÞŒØÈXà­åК~«�ÈúŒ²˜0aà±´š3�°9¨í×Â#«¸“�ÔØÚNBŠ;ùû~EÚN:‹;‰Eý<¢íäjp'áe­ÚN®âN¢Ì¼K)>d�]2=ôËÄÈhJ“déŽV¸Ç¾8̳îK‚‡;$`™}Id1û’ ù’ó|_²äIùåK²´H&m_’x³Ù÷LÆÅ GÅ#ÀdN�$g¸úŸz“t•‚Iµör50£“…G50¹!“øJ7&é¨`ê900IR &÷†]X L¾<Ϙ‚ÉŽúÖŸ>ýLÿɨZfÒŠZ"Ð1—P:ÿÈ襰õì#Èñ•±ž÷@$fdx6¸°d—¡M”–_®ÎW)µÍx”Ñ›\ùwW„ýìoÓ»#©l|ö +våv,ðý|—Ü1î#m�OWp3–»l¤ò¾v•¾OC¤®¤½KþßaŽQe³•Vö¯š×¬¯¡Ë�ÐÜÓæê†É&�«§iÈ’koW`i‚³ K+ãï¾–�¸Õi÷ó\fŠ&�ÁÉ-5²"Â9P*œj1ˆ¶ê%γ ŽñÌö¤”ŸÓO“Før¸�ð1OzÜú¤dßM‰wã˜ùàá‡ùëý"ûG¬D殎5\®v Kn§¶˜“•˜IŸ~Ù�¦ª õ,#ª»ùÐëVôêXÔ_ýk…Ð?†žh'¤M¡Š»‹ZÞƒêµéÂ,iÌò.1~f(µ[2\DV“"‹!,N¤'Š¼Ñ‚°çÀ q‰ùç€$òÈM�¹®Ámú§ÖÍtnú†ó°·éè5ô5‘‰Búrãg>¦Ïj“¼áý8\‹îމ†pðær³°H õëv&_ðƒŒ_Ç´9X^Ü �¼�À,?¢Ä ¿,æyñàmàFr£ˆª0’wÌ}©¦€ÂG"-Ý�„7e’!a6K1¨0q>¢»Ñ�7mWã<£MMwß„77×bvÔ"»ôÃ¥ÿâòÍ‘Øs·h‚&Qqq]ÍâIk�ÆCÔÓwºIMÀÝ3ò,Í íÕ�ü¤9FÚ^ +7Ú?nÉPüó–fáiû–ZDÑYUf� °JÏáM¡=jók—ËwÉKº˜�ilPú·W4J¦'DšÉ\g]µ¿E1mãã6ÍH_@¤SßzXÛŠbÒv÷9U¶ØèÔ­ëÅ·Iud·—‘  .ŒÚ–Åí·;®ÍRþ�«‹Ðù ¯>zcÄm‚H-ÂÇ™¤K½- ïØÅüã2áf‹yÿ±Ç@ƒ²'@»üàÍê�ìvì.ëG4roCD])Õš†û�SÄŽ(k">áÆ-æ©-; „å4Z"( §Þ‡fgf$«IÉtá¾p¤ˆ3@G޶§|ò-ÿ¸ÅtYm’¤Ki÷,� u‹Ž¥°Í±ü„“ù‚ñÍ0…=¾‚{óìAØÚ´¸5ÇasÂnÅÄ4X[8ß¡31³™Ø‘‚�Õq„x[Á­†g[®«íå`G˜ÉŠëâfÜGÇ“,•^r‹Ìžüx>»Þ6ŽH‘o‘ïVø¿öŒ8œ�Q£‰vÉž!ª;2¾ $ +d4r­ÎGºsºœƒ™~Îá‹&óxT[^/—kqE;Rb…§_ó0è•v~ÍPßȵ#=ØYh¾,E‘Œ))DìÎBìö‘ûBp i†«*oµ¸šaÄхмÍÔ;6ã(iôõP¸cQöþó=td!ÔJH™y×–ÏýÏìý]i{3ÇN€.^ ‡ë”[K�P¤©£ìw=¨dËü¦!!,Jщc#¾Ë›«'sm”A?[lÃî×–3­0Iò¤ßDœ†RE1V Z~£‚iq¡d:¶íÎ}³�xHð½q‚{üß,®Cáÿ¶¶Ý7¶{' �ðá+Vå:4•PR„¢Ø—®kžS[�g å3²ž–�éÃKnwF�[ŠÕ´1 'ÕŠ¨Ú´IGñæ×ñBÓ=6|xĪ:x�˜T|Ù×3.¼#ó*çšè§GSÂ=Í9)öqì^ì6¸{ê²–+ gi—rxwyäÝ^¡¬øô³‰�A œ'N·}q— Њה2á_²C÷^ÿóÎ3@!$È Öé ] ]yΔdg½m½¦ÒO$>¬mò>´k»Ÿ[ÛñÈ3cØ`Ö®ÌI2€Àdp$`�´ +U¦Å*sº±Š�¸l›Ìª ÑJ‹ƒ¹¹‹-Láã`‚ÅË‚7ì{E˜Õ¨¨ƒý•‰ý»Agb–Âm;âÃ~¡Ž�ŠÚ 1K^L¿×ÂÊ‚U馠±o£Û{v7ù ,_’û�Né=Ëu‡4ƒ bç˜uZ‹ju ‹Áœ‹Bæ¬àpáÝòsVZpŸçÉà­6q 1p® +éñBç€ôd±ó/PHz‹'÷¶Ò’•S’Rë¡%á/pÆt¶>ï ~…}×Ìã& 'ö`â1á®�äšÞéq=˜À‰KÑas>3hVè׉zeÜFœ ’ÍV=ĉ‚�ζ[e¶^œBSÕ¢ñÇ-µd°î^s¢"û�ùj™»Ÿ·Ôƒ™ëc@UФ Ù±‡Ón±ÈµªmóÔ¦¯ã¢Kb$ÞSÓ.äÌ…¨T–LŸAü€bqBUŠ ýî÷� Š!$/»k[B>±M6–eÌ8Ïl08i Øÿ-Ùÿ”‡˜Zǹ +(ƒÒDE–)ê�í=e­S¬°»,¾œ®šC`{·;_ÒMî¸-c|WŠé|öK + ƒ>§– C‰ÃJ0ÛC¸Õ? ¡QU=ÖÎì×¢ °ªñ•FКZ‚ÀvÃü‡`4;A`ðL‡À¤Õ³EÙ$4½FòX¨�Qã`l¶ˆ¥bö>»´’ÆÐYÔ|`[„í§O|.`}.?bs% éœÑéòãhöÚa1ì*»’íX‡´•^HÞ�¡asP-­åæ˜äNXD™!0ìR]FÈyc- ¶4V¥,¢ÍêÄRA¯©Ç~]P�ƒ‘y@ÔÕYz©ÍÆù½ô6  M^D¿kdÕŽ6£ZPÖœŽDVzJEÖ\«^êÅù{ý”žXÁ¨H÷Vñ=YHÄu>è¯nJGJÿåÝ/¬ó#‰S§Ôës6´Î‹$�Wª_¿ÐUÔ¹½·ÎùÞ‡†i»BÛfo“ï,¹‘^ÐFÛª÷kÙH¶�lžìW’ÄmR7xžH+V<Óu:·t²ÂõS¹ð¸‘Ù"Bqpã"ù•^4Ä`Î|° �T\“¯Û"ô �ši¿Æ0Ð墸ÚÄš3faŸ¿�Hhè¹d§…ØSïà€Ð$@ÿ„ňæP~ÿÌC’ªåÐ8Ü�]Ì#ñÂ&î’0÷§Xÿô.òíb¯Åš;0/ñó¾Ô0H‚ž*6Ÿ ÌakÊD¶F õ#ÕðÃÀV53JéF˜�ñÒ\\Z@1üøB|söq‚•qû&w¾R´­ê†Š°W‰«Ä…tÇn*xCÝ(ŒÈ>q™(J8 +ÁæTÑ-Œ/zžÃþÉ$¤h"÷Ut:L´ÿÔWôÎ3ä‰BJÁ0KÖ�¿è w¿ô‡ú¿½Ï�XÍÂÅpI¬Àj.~½³�ε‘dV7—JCåÛø?-z�Ðec2„2=E>z'cÆ+@§“—${ ]¢ÝâãÕFŸºF˜ÆúgåçL–‚»s©Ï�àvnÿZø[T2ó€ÊС(gÎsÂâ`ˆãÉœè¿ô,-Ï3‹4¾ìOæ(£Öä¸L“›t0Sp\‹?Ls‹1ii•eïŠk‘”‚•(|e¹Úƒ‹9÷ó’ 7‹ñ”‘OhX…ö[Ð' >LÌY=·FŽ×á:ÐÆC©çÍÆ×°pÇ0Tˆª±�R�R\j½ó'þT„:÷¸0t�°ç®Á€É�²\ tó" µþå�–Q"¶o‹–ÙHCïož•íÿ ¶Œh¢L+õd ¨b? “‚UõÊ“ó�ëáýßvØm0Wͤ_ºÂÛ�,ê÷[;k!&6Ê�¢‡XÎÛE(Žð(�‚X¢9K¦]H,nÕÙ×rº²^�Z°�0»¶c#Í ‹¦HŽÌfñRkYæìŽ;­€(é9¢„��9§|ù¨y°Aï�er•ôö7LJóûáÓª›çÛÊ“iTóÙꪭ¢ó³#ëëͶV UÙ>¿CĬTá¯ü1ô�Ó~»ú‡ â[/F©¼,{ý,‚ÝTk²ü¸«9ú™ZòÇ­¸�¨«àilýÝÖ\˜zY[ntâŽÛú¶X/�‚å9Q&½/ù•äQ´—õ+*{°gøÕÿ{›Ûwúb;‘>ÿ+” ‚&%"ñ2…¦ưº¡Ë…{¤tZQ +kh¤†Ø1³16Þ 3ËjB¥ª’gƒ†VÅV‘Ûf� äÎ.±ÀÄ.wn¡ñnîCãqÉž¬'vOSÜ‚Òá£äŽðMþÊ¥—¨ð¥˜g9 $Ég/ËÛ +ª§…_mx¡Ò#“œçIFô²�Ñz å=&¹´€ð«ýK玚kì^2�eÝç—PysaVxoý›Šèbðqº(TCžQÅ2ù²ßqÕp½+î‰ñ +ÞNpÉÍ”C‹nK½4FÁÕ�ÊG²àãpP°VàšÇ†ê"ÀKá‹ÐŠºœ•úσ»ÔLñ*�t}ÑåXÊ! à±}WÔÅ‚M<5„U,PXš¨ J]Ì=*#žÂª”¤jð_ƒ@aœT¤ÖÇ&)n÷J›÷±EMÀ pôyKÅŒžG ¿)fs.r/„L³�¥¸üeì#6”ÅlÝBqÛú|nî Å_×âe)b1Ìœˆ ,f£BñÝý7—óÕ™¯¸FÒ�(þÊΫ‚œåå3±7óÙ’2'Á$Xdu9÷;„‰'¶†ÓF +ÿgJYnÀ3OGkíøh^Ű}žY1�DÒÿR4»bÙdlX‘Dàx‚‰1FA‚8^û +q 1à൘.ƒ„¶�Z}_t7u<œYxE÷»GjÙ¹íøxÀ›ÒÕMSŒ�Búiç +¬Ušsjâ\ Þ^u&ÈËáKç&¿9Û (i¯}�ÿ²óÚ�“Üz,kÊC¸l…°öj\?²ì£#*â�60*ïC†ÐøŒíñNaWùÉ0 b€vw,Œí;5Ø Ü>Û'S¼RÜ y-Žzq˜Ïð+~¼�EyiføR×E’ÿÍîÞº>±eÀS겈æ#`²PâReBÍ¿`Å-á¦à]êŠùjþš@J]¹Ï£ 0Åœ±i;¯Ã¥ÐÝÿfú¥¿T2³“µJ]lðS¹F²î®å˜vE¬%t5ë&w-–*‹ÌÇ^ Õ-ò¥Òkyq��îZô},}‡×I¦Ý ¶Œu×rää8^ˬÜù�ÂgðZè9Úñ•×"ÝîZè&ÝÚÄÛ;ó^·ž\›ã¹”^¬ê {$ÆÜüŒOu=l¥F‹À¸:psé¸|Kþ†îú[uá2|Ì]³¥¸MÐÔÛ˜,šíËÍ“¨¡$Ž›?ZíìvÝüo$‰x�Û&ö¸†¯e +�Ñ`“pcÚÐäo;娟 A-)…|À{±D¾rs¦î(é,�Â;n5hü¶Å÷Õqó›!6AÇáè^/“�› 6_ñЬš“Å«ãh�›ÏqÉ™|謗u߬�دf-†'Ë©¶5˜­Úä’t�º¿K³%`]T:²]*úFtû0Á¿Ð). +ä0~a¶[j°rëŒ!-¼U)ø¡Ä‘ºÌ`pÉèG$‘Ó»FŸ_SL<ì^Ïscñ#¢~õÊ=ÌéK¨ªä +Ÿ ¸[£E�Œ+©ä'~óÊI)=èX7/ú“‰Ž—QëYá|«“ÀUÜÀ`óuþB¸K'¬>³“üÅ«¸}__Ç®p‚ ýü”ÈKfGåY@Ì‹iå�¶ð“ÃÕ‹8JTtž•—›‹y h(®ó$ÛãA}Y‹5’œ¿´ÇÒDÖQ‰ýÃîw& ä2+¿&­el?Î�!üµÍL»É­{ŒÝ&‡Gæë‡�xò S¨!š™G ù[κg>ÛÁâ5a�EZ³¸Ü››X 7»3·0åÖÄaÔÆE³Ìë<Á¯3B¯9©�[P:¥Âô|÷w B¸†µqŠ**Qž4‚Ú8W¯NK—%“7úe²ªž†ámœÔ›·©�¾Ð#csµq‘á»,/ѵʂƒÚ¸âG[†*hª�q:2Ž›ã-ƒÒL2+kãÒ<¿Åf¨}�ÄÆs©›À©6®=]ͺ§Bmr±Å3gØn±Œ/ ô.Û¢-¢äO}Nö +.ØÝØC¡7Õƒ l�=wÐV÷uòÕš�gy£Ù1÷(ºjz‰fmÜV ˜›b¥@l¢Á‰ +DŸ²zy'â]E³#”j2J +„^‰ô\SýþÛm1&¤R§Ý“qW¿‹ÑSç_n‚­XO–èdµqšW1SFÁÖ\mœ±c#�ÖÆ1eü6Ž8r–.ÃQmœ°Úc›W~yi“,º6Ngá�‘UmœN·§ìkã*VâÿNõ‹Z±Ší!¹ÜKÊ+¯rcEË UÖ ÞcýZ“ÕÕâ$îb)ä± +ˆ3.c~®WhþP<¯^?صq›Sê÷5íµqƒ·“@4¾µÅNHI“©á§µqî 6‘BDzŽû|%D’U�t<ÿ›ˆ}ì\ãM K£Êá”u Ïƒf´‡£¶×Ò hÍ3®mSvÕÉK ÔÆ�í®¢$OË}[÷·hÅ |1ÑÜòŧñXN-•¾ß±6®êPrƦ4î}Ü™ +íi3'Èîe©ÖÆí +ti6>ÉžFjY¸õYøm\¨ôaT»ß ú!UÖ°±,uÂÿT…ÿ$¦‹Âþ&À%©6Ž �º�’æ šfµqù�\G+TÑòjãÄy¶úX^®–^—ï¢ztÞÆ‘ùN¸„$3–W‰..Feb ¿½³,Ì�Ä·qòï5Jm~¤ÇQ3/·exmœ�££NŒðÜ9*Ú’nãä'*`È@wJ3² ­|e6.KÞ1éDÎÁ"·¼�O<ÙQ6rKtª “+°]î‰Å ’“ +.vªó‹=­á2gªIcäK–‰aãJ¤¢3ΖLÃ�ð¬ë.„«/’®Q‡aR\ÝËö ó2 ¿§¥N’³’¸gþ—[û•€8¸Äù±WRd#�Søs{1QÞxƸIŽmÖµb©Ç†˜YÏL#I¦¿ž€óòéfÓÀjŒ'®¸xÍXwi'ÇüÐÌ uÆF´äÖÜœU�Á†¸4lS!#0,¿ÜyJÈ Ä݈"“óaÚqÂäÚŽ(küa˜./:¾%8êÌP@uß¡ÝÖò™èã�‰ù³X$çÞ5�FP¦VW†×X’=)»yÅ<1LoYmÕYÕ'ìD¨3u-'¬KÍ>Fœƒ2ôtOâã0 â ŸgÙ*êÌ&òñG#’9¹‚ؽKÒÙˆ�wUç=­¼UBšù]¤$R¢C­‡¥L�7ºÈâü‰…øÏÐÔ³Wfdøû>|„ðjbôòø &W•M£E]2Šàfˆ¬Rš§E©àl%k+8-šsü*ÔôžìWŒY¥8¤\k˜ÎF¹Ïò›X8›}š¼ÔᯠÔ’ñ pöq“Œ…‚×?þ½¿C"vЧjÙ£T[T*B]¶Hï šïäÆ�^�PùUI�HCs“«X +nA¤ |Þõ‹G*4¿o,2¾‡ãÇINYÌ¥ïœÄ�2Kݯ ¬Š<>ó¤c,‘Ьö�à1ÞU::sl8XeÜÐÜÐÝfMÙÉÃúÌãrú–óM¨í÷Ã÷Ï,Ÿ‘Ð ¨¹Rú™£“Ö€Ð\-ØÃÛÇY± æs…f�¡8 +þÌ‚âRm;1*ä^%ôø×\Y¦ÄÌYÁñϱ,w·…yÜ«GšŠ¥‡y£$�ê�aYì¢U4}=‚i±Ù\Îâ[sê1‰I7ñ†O1êγóÎ?âݾŒ‡Ec¿€<®iï'¾‰P<®È¸²£wÈ +øJ¶ŠkíÅ\¤4ÐFAH1w�¿C„ƒs—K1²öÂ?ªçR¸°”.yœšÖ²¯…xÅQ*Äã“nQý�ÇñâV<ŽÉ³z^‰³)õ‹»_×Ge#†K8g‡ð‰8ÃÞ t)×麬âBv„0})ŠèZÃ{/,ÉTœd\™àz ÑÝGŽáËÞ?·ÐÛ kÛäÓÏšÅRrn ÑÍ~e¥CÒÐ�uñcgÙ#œØðóà ›k Bø]½_RúÇ.!zgà„w‰ôGWyó!ÛÉÀ5vŸÙ”/^¥´­äþ2XçJy]à$É®¯ÉÀQß‘»Ru¼eàˆ2Ku¥T"Kâ8uìw–\¬¾î±ïTÈÀáçþFð¬š-²Ö0çW~~u…ª5¸Ÿ œ´w2¯Ížný†^à¨$I€Ò1ôÃçö÷ÉÃúˆ wµ&çágèj$²W8Aߘy¦¬ðdˆ†ZC~Ìã±Ú×°¹)¸–Þ:gâÿÙ’OŽ+C,œ¯è¥…ÃËSˆ&cÐ\]¬és–º» HqgvO™ËœÎ‹º²‚Ö½^–´p¼G¿8Ÿ–Ú›H\8·ãQZ8…|ðcÞO´pH®·)ùfFwœ€  W“Œ g7<8£…süˆ¹29Ж7DCÌ/žÛH­„ä\eEâZTˆ¹¿ÏóT€Dzô¢…C1'åY*Äœº„˜ç�˜ÈÏ´pjÿ&þ'ŒÖÍ,ÓÂáרŒdļ$Z8GÌ·dè;¤£1�&Ä|ï#æ�LûÛóÕЈùþK>SË[+¾Ê-ψ9´|BÌ!P [kIóß?bž‰;!yÄÜ@ÇfnÒ0|då®ë‰|ÎM0�'¸|=RѪܸ2šGK¢(úx8u�j4ñ¦Ê�Æ>$2Ÿ«roÿµÒàâ-=ࢭÊUŸµñŸ}q¥ÊñÑò§#÷âÆWúé:ò%L]ÑFŽxD¹|…n>„SÍ7:—µL7W8Ÿs6W©æ;̱Ç;®ÚOòROºæ�e<,0ù¾|%ªýÒ1ñ Ì)ÙWù«Ãs#gVíÃÎH/ÃHWPí;´‹×:°U¯Ty¬ó™ìôv xºØ> ŸÕ¶)ªö»^§ç]ÚË ŠªOæ{·ä“ÝBÏXÌ‚Ú ( 4 ´³�©ù3"Þ{Íù(` +·ŽÏÇ÷b;C½™wß•]NÛš$ðã™!Näº$Ÿ*|1Ó½Ž;…2tcû¡ Îv“Žá0®ŠY}ÉŽUG[–Qüý嬩œÍd…ØŒò§ß'©¬ -òâ€Wc7û;L®J˜ùÅ5O�´m**ó"YCÚ‘¡Í+ÚX¡¢8(¬,ÚKá‚(�Nµd|¬(á¯\Ž~ôs» 5/3€T6í‚Qü{9E]ÐçvÁTÛ+R›7Û ˜gÝü{ +£üËR—½Ó§ÐßÐâSú^È/hQ +¦ÄP5¸ÕÿBœm©lÿ4h.�åÊíp,Ùƒ™@¡¦!Á8smN8êŸùŒ){ÊgØáu‚,âQ®Iâ�ï¯JÍ®ÔÎRBVv;¥d%࣠–`R/Ý1‡s$÷„¨3î�Ê­Éëì÷ãú~ôs)Çl»z¹) vÒ¹ãžiQBqSs¾L|\B´¯YÐ\T¶¿5w±8’óÌEÒ$€=SFZ-ÂýkÞôrpšy‡Ì>{¯Ð"+NeKj}H×onBBvâc^² +8D‚1ÄË—šC¸aâJ¯Ö$¡5óÊ:Ruî†ð¿.c”a#'®|гééï,d¿ôUœQµ¤Ê‚XScaC9¦ôaFc¿í¾y*¡ECóª!ÊÁ— ´Ã)²¡Øfó…=Pœ9š@˱U~€¹@ˆµæ©Kµ¡Ü™_Nø¢ƒ5ž åa±9ùiIP’ßZaøH3Þ|ty©¹¡\6BLÞHrc†rTäÇmN½ŒkPoËÅé·¬À1š¤LM}÷çiË +žD(©ªtÿ¸? +†r¢Fж@qInÚq¢œ¡ŽíÏ…ÂÚ�ó[^@�p…h.Ú¤ÙƒB8.>[§ü'�åïôí÷z@ÝœiŠW®>ÓåÇüô\§üB¶ôªùÐê”_®ó˜ÿÌ‹ò'Ú:ê3[O42Dùu·ñtÊWçiÝÐâä‡Ú™*ùÄcTÕ"—c 7[,ó÷žÖJãì›*ÆqêìÙn 5è� +O¢T@OÚ–ëÐgiµEà."ÀþLÃèÈh{B:¬Tj3EªÜU9Òùs|úx-�1Ãð~r:_– (w£5«Tôߨ»Á0ú;¤¸pC+N+UFHõÈ?gbjLJ‚*^¥aÚÝbvF˜Åº£„ô"µÍ�ÜÓ¾A³{F¥XèOf,\S[tÁ›C…wÙV�Ãð@®;àÄeJ>ƒÜa˜wäþ½ ­Y¿ÞR¬ÃPÌι†üš1YqɆ†‹A ÑÖ)V1®–÷–×VnM�–>‡!ˆ9àzpx;Ã�m[u¡aíûÎñ^÷4: ‡#ƒC ­ycî[ìKztàR‰ÃDÖWè7™‹w­†,e?üà•œãuãfª#æÏ°Ï`+ìúˆ2S…nPMé³®Ýl|¡+dPM¬saCbSƺ1][($·úÆuFµs½øØ9Zm£anö…¹{A¦g°ÞoðA�oüC1óA¢²3L½Ä f[u4ßJ÷¤2Óó"CvjÌÊå­qK>±µÁëcýî!Õ’ÁìôB@¾¸¢D®í÷ë@aé1Õ�¿�q&÷qVïµô™Çÿ¢’usi[0!‘L¿æàó›ä1Z\æìú·óÉ22/·)—¡%Þ¶rþ¸±XF³Ärª¤H$/:X¹G/¦�ƒœ Ô™ì_Ï;õT endstream endobj 12 0 obj [/Indexed/DeviceRGB 255 16 0 R] endobj 16 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 5 0 obj <> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 9 0 obj <> endobj 6 0 obj [5 0 R] endobj 19 0 obj <> endobj xref +0 20 +0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000013420 00000 n +0000000000 00000 f +0000058170 00000 n +0000058468 00000 n +0000013471 00000 n +0000013820 00000 n +0000058356 00000 n +0000014274 00000 n +0000014438 00000 n +0000057596 00000 n +0000014512 00000 n +0000014656 00000 n +0000016153 00000 n +0000057644 00000 n +0000058240 00000 n +0000058271 00000 n +0000058491 00000 n +trailer <]>> startxref 58699 %%EOF %BeginExifToolUpdate 19 0 obj << /CreationDate (D:20250221120321-08'00') /Creator (Adobe Illustrator 29.0 \(Macintosh\)) /ModDate (D:20250221120321-08'00') /Producer (Adobe PDF library 17.00) /Title (makealias.cursor) >> endobj 2 0 obj << /Type /Metadata /Subtype /XML /Length 12954 >> stream + + + + + + application/pdf + + + makealias.cursor + + + + + + Adobe Illustrator + Print + + + + Adobe PDF library 17.00 + + + + 2025-02-21T12:03:21-08:00 + Adobe Illustrator 29.0 (Macintosh) + 2025-02-21T12:03:21-08:00 + 2025-02-21T12:03:21-08:00 + + + + JPEG + 256 + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACwAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq+Ufzc/wCcttcg1260byGsENlZSGKTWJkE0kzoaMYUf92sddgSCW67 Yq88/wChqfzt/wCr3F/0h2n/AFSwot3/AENT+dv/AFe4v+kO0/6pYrbv+hqfzt/6vcX/AEh2n/VL Fbd/0NT+dv8A1e4v+kO0/wCqWK27/oan87f+r3F/0h2n/VLFbd/0NT+dv/V7i/6Q7T/qlitu/wCh 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 + 176 + + + + + + + + xmp.did:fcbc93cf-0a5c-4e0c-a836-a3817c0f51d7 + uuid:cce022a6-fdb4-8147-a84c-c62bfd7807c6 + uuid:72C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + xmp.did:6a145c89-ad46-4f06-bcf8-71d31b799cc6 + + + + saved + / + xmp.iid:FD7F1174072068119457DA40D67C4B16 + Adobe Illustrator CS4 + 2010-01-19T19:18:13-08:00 + + + saved + / + xmp.iid:6a145c89-ad46-4f06-bcf8-71d31b799cc6 + Adobe Illustrator 29.0 (Macintosh) + 2025-02-21T12:03:21-08:00 + + + + uuid:375c472f-e1a2-f445-99f2-349f6921d54a + uuid:72C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + + + False + False + + 21.000000 + Pixels + 16.000000 + + 1 + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj xref 0 1 0000000000 65535 f 2 1 0000059478 00000 n 19 1 0000059271 00000 n trailer << /Size 20 /Root 1 0 R /Info 19 0 R /ID [ <5485954DA18A465BAA195531AF2912AB> ] /Prev 58699 >> %EndExifToolUpdate 59250 startxref 72516 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/info.plist new file mode 100644 index 0000000..b176b72 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/makealias/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 11 + hoty + 3 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/cursor.pdf new file mode 100644 index 0000000..cc5cdf8 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/cursor.pdf @@ -0,0 +1,324 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 24 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + cursor_02 + + + Adobe Illustrator 29.0 (Macintosh) + 2025-02-21T11:59:46-08:00 + 2025-02-21T12:00:45-08:00 + 2025-02-21T12:00:45-08:00 + + + + 156 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAACcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq8O/I3/AJyY0/z7fSaFr8EGk+YXdm09Ii3oXMXUIhcs fVQdRX4uo7gKvccVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVflfBPNbzRzwSNFP EweKVCVdXU1VlYbgg7gjFX2n/wA46/8AORUPm+GHyt5pmWLzTEvG0u2oqX6KPuE4H2l/a6juAq99 xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvyrxVUgnmt5o54JGiniYPFKhKurqaqys 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 + + + + xmp.did:7f3d5bed-82d2-42b9-aee0-a3bcd7429602 + uuid:392329cd-86b3-8749-b924-8a1ba3957bb5 + uuid:70C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + uuid:038f801c-7008-804c-9eab-b1f447909d06 + xmp.did:3459bb4a-8f3f-47c3-ba12-0cc23b48b20c + uuid:70C03EEF36D1DE11A836E19ECBB62C21 + proof:pdf + + + + + saved + xmp.iid:F77F11740720681197A5F59E002FC1C2 + 2010-01-21T16:23:38-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:7f3d5bed-82d2-42b9-aee0-a3bcd7429602 + 2025-02-21T11:59:46-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + Print + Adobe Illustrator + 1 + False + False + + 28.000000 + 40.000000 + Pixels + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>/Shading<>>>/Thumb 29 0 R/TrimBox[0.0 0.0 28.0 40.0]/Type/Page/PieceInfo<>>> endobj 26 0 obj <>stream +H‰TTËn1 ¼ë+øK“zr¯qƒž‚ÂÈ¡¹m|° $ù Ci_ÁÂ"‡’FÑàÓ¯3�^ÎBO?Î>B!Íô@˜YÒz©Ð5ôpj<7dq™GÄÌ5Œxï±/ã(cìˆ÷°n+´ru‚ßô +N?_…Þ¿‚Ф6~²2<ÂÓ�^oB_7z~£K¸`‡PŠX‡ðù§Ó(ù÷ù¾±} +>¥ÂE´Pª‹çôú#'K4gÑ®1§JBid\m†Åž™ëlº†Ä­è‚Í âèLš8goW8JΜfgq}º¦¸ÃÈj¶µ \£ Y°°ÖäÕR2ùXz?×ðHÏÑî¡MJ™g›óÞ¡;*l0üÞsål \G†c”5�N³öÖ¬e7LØÕ¸.Б¡Ïà +¤±$äê ±Eç@û¥ë—ÜÍðIŒ8T<&=4²ÝÛÞ®~vÚÞÈ¡.àÆ9ã*" V-`Œðq$ÒáÛØáRýØñdÕãòïLÇCÖ“‡dè“> M‰æ>stream +8;Ue`\BY(Bf<7,>#D,DF!!!$!rr<$!s8N0$01#oU~> endstream endobj 30 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.0.0 %%For: (Lance Wilson) () %%Title: (cursor_02.pdf) %%CreationDate: 2/21/25 12:00 PM %%Canvassize: 16383 %%BoundingBox: 4 5 23 37 %%HiResBoundingBox: 4 5 23 36.5184066155898 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 186 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 28 40 %AI3_TemplateBox: 13.5 20.5 13.5 20.5 %AI3_TileBox: -274 -336 302 398 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -156.634528880188 124.30134120245 6.06031481485578 0 8193.05622181306 8194.70630110853 2548 1414 26 0 0 6 44 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -156.634528880188 124.30134120245 6.06031481485578 2548 1414 26 0 0 6 44 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-187 -417 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 34 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXÜ#z)¡; EDÎ ¬ÀÀìH¬S� ¥kBŠ‘Ä4bŒÁ?\ _pmÛ6ÐÞum§”Ô?�˜€Ór  +8 +týiÚü¯©­çX€êÕ'7]d8vUÎð_¹Ÿ2Ù}O(8>}> +¶üêû~Tä~ÌF±ëþç8~×/À­Û÷ƒ�l§>æŸàömM™€Ç¼U°»¢]¸ Õ©�ÉÀo9Eº†ÝYž¿€8ûf9•mn1åøS¯Tn‡„rgö#Ŭ“|ÌêOÿy“Í?¡õrQ?s°XÑ?ò ŽÝº €;ÿšn;Yý’ëAFZ̽½ü’ãMöUíK·˜,ãÜbšíŸM9žÑHõëÓ¿‡¶,²7ŽÏÔy#5òÔö$Hv²}l�›"~4¡d»û ÕÅEÇÜ,2ÞE>f£ÈGÖÜf´¯L»é"«a‹÷[­f‘©`w®=Ÿ\äe ž¡æ66Õ³¹à_¶IæÈŽÝÚ¥ãÍ"#mX'þ¼¿SÃn¼yÛßñ²��}@;Ïæ€¹…c·>¹�Ì#mX[·)‰‚UÒ׿^Ó.†<7Øiƒa™6¿®ÿÛnP°ÉR?õ2,âa(QÆ3ŽuDÙÆPÙN8È2ÙæÙϲ�]²� e3EX'ÛX+"Èöå–ëñ0Gö[­ÆË õûjS?=X`�  †<Œþï€ÚSÏ&¹ù׳�ñÆX`(Xí2†·:½âOæ1æ�š ²ù«Z¸Íd|cô¹Á ö‘ó vüø&»�}¼$ï[ Éo��“!çÞ$'ŰÛ¹C’ÜbyÉOÜ›ï¾ýþ6¸Ã-îq“ÛÜçFwºÕ½nlsÎ;÷üã ¹ÈGNr“Ÿå)WùÊwç½wß¿ö°‹}ìd7ûÙÑžvµ¯}{î»÷þó ½è±Ñ“Þô§G}êU¿úýñ¯þû>ð ?ñ?ò3¿óC¿ôS¿õÛ ;èÁÁÁ$Aìéú­àç?¬jOÉ>r¬§˜iŽ!¶¦$J¢äéÉqÇ y*’â(b#~!W¿3Cÿq´Ÿã×}ï*v‚êNÍpƒ|USôÄN“Å3L+±QÅPÅOôb¹¸Å5TÃ4DÃ34C2Ã0üBö�‡;TÁ³ù×u{ú5=Àóß“[Ïí¦E»olj ðÈñûÀjkŽS?]dŒìÏí»2d·íC»§vþd‹ŒQŸþ‚‰ Cý¸s\Ÿ~h�Å)Ø"¿â™…]ÕëÝ�F ¦‚Ývç kHò«þUüÆófÛ0º†«£(XÝ6Ì“éöΠ¤ÿºnßµ|y(’d'w'9ß{ìv¶9Ê�Y’È¿G&Žü�]•;|U»ÙľQŸ„‚Õ~ÝÂó¯_“$òï˰gÿx6~`Ï<8nη·Ø}$³p{>òÞCpwžäc¶³QÁñããÇýwfà×wçŸçÛw_çÙ8ò=Žc?v!È仡ø™€´¹Åܰ/û:¤V‘�R.©† Ç( vUÿ$‰œžÿ€ÓziÆúõÆôïÔ_5·Þ¾k=›$ðý¨8CZÌ ãä¿íÉóUs‹!}=ƒÐµ ƒæÿ¾:{Ÿ§žÍÇš 2Àwü‘ôYß> ½dŸØ¯û»Ý3°óü×í+·þ‡ä¿lì4kn[r<3àØuU¿s°Øäd;Û†í B«`·®¿ç«Ú–…$ZÌ Ë _ÕÒ ’·˜Ž<ƒÌßÔziP¯û:I�[LžÕmkŽ×ÿº+ ´˜Æ:µï™ ¿ïem U›ÉàvšAè9~c”¦ÿ)ž75ü[¯Sœn6’#ò0ÜßÈÁ.¤Ç­l&úÌ÷ ̾ €øTÁ. +~Åç¶a~ô!Ï ?.M·àÝ6,³!À +°7¤ó ìï^Ï ¿nS8v)”ÜõMšcz~�俵ûÙ6Œ±ÈpL¿nAöOp‹Yd�9^wGö Ç.=ÿi´˜Û†íî룳˜ãº�kúõ¾–,ƒÌqÝþÝ6,Û�|SŒ2ž�¶;2<Ÿ·1å a. #6zuvT(6a»€0Ã<�Úˆ¹èx'mBq +6zà –Å*a§>�¡^5¢¿Šƒ¤‹Z”6æ�‹tAÀ€F�„MÂ(Ũ¥�A¨,JEŸ["É?,¤¯ RØæG’ %/hºGûÖ‚Hóxé„="l˜#µ�°E„ŽRQ,Y°°ö†1@ƒ„ŽI-3„Oˆ’Œ�N&›€­ -ª†[SXRbà©ý²3‹KC†‹r!¼PUH"@YA›Ç臀ß8bcä�ÐfM%Îʳa*X"ˆ;ŸÃà@ó+ŠWIÑ�½aɳÚ!äÙŽƒí=`Ã:ÅxðŠˆgÅzt4óeà . G-  h ™ÐÈìÔ`,Ð25ø6LaE±ÄC8²è¿ –�¸xŒZƒLˆ-¹ #}:YL v´�0þ®'P›#V1„M•†çó6ˆ˜-`ðÍó†PT_ñé´ú˜„ÁnÈàÀîš�Y[å”⤚o#[«�Þ0ÎùY7Â(2‡<ˆCH8×½añ—@íÌ+tÀv5ЙÆ^·h´²T¯¡02BnRoY£î «Ñj«�Šö°4RĹiŽu5Ї ÝòRÑn£'P»æ,[@k½Í(á~§à6Œ£êãSMfƒ³ÿT0V �-¹×ˆñ�ÀwŠp T_kµGââ+´­ôš7Ì¡Ö1„Û0¾…Ë' )ÐM©²åÊk‰—…�ξa ÏçíXu൸Æ`@/�ØNPHj?$VH€ÆZúl˜DPà# ˆBC¢n�Mí—KNõ>܆¥†RÑSE‚F£ŸTÙŸ’cj^{Å.Lêh«�ñ8›wõ›M…ó2‹ífâ0Y™U Ô×Î(~„ôbkèøÜ°o$ñ¶Ì@5ðÝ™ŽçóvÇñaL¡Ω +JÚ¸aïkm±ž¡Å# C[Y%§yV�¢"<´†F€¡t'NˬݡÕtŸgS�ß…Ÿï¼ÊÒ©ÙÁÙÊÁ‰ ×Ü0Ybâø)~2žyqðC‹^½§HœÞ£YÒL†S_çüÓC#,¹±–ÜäRªpžþ:‚eï 8霕¯˜Ÿ9¬˜ø@®6PVLTQ{”º±0{äµÔý­©N˜UM)¬˜†Ådž+‰¢³bIÉi$Æw6B‘šƒ®,4ÏÚÚŠäжîÄi•…•Cs}d‡Ð˜^Q¾V&F 98+>qüйÁ;'^C& +‡ ¹f¦àcí^ÂH¸ ËÐ�þ8 T}½šp%:ÁÅëÕ½öà䕺q€‚ñ. hi%8™lÜ�¨úBÒ ·DÝ\upòfî#¹ƒ7I-*(E1`­i,»³w ÔÝèœ<ºûH.N  ’8é�VAi;ä9Á P‹IJ�ДN„-P;B¥@ Ò^·a²,¹ÅHâížÙ-ešòâ´.Ubh+wåÐH C`•œÖQxMRñ mv$\‡p¾žá¼R…8çpN\�â€MTáqÙ«ñêŒkâ6 ^¦Ã +Ç�b…sè‹„ K`É¡¶/ãµô0h…áèÇÓ/ *dIñ$P»,L>V +–\:J ¶"ÃyÛ3…&œXK«ð?œ[ÌÿÊný¾2_@뱘?5ÿÍûànv_Õ­ìVˆW°­×t³È".†Ëî|¢ÚÁÄ0 ~e´›Š³O¿²·…SØ’Ñm¶:½èìä¾²Üfõ+оYëfÿÔ¾r×ê8{Åæ8s¸춪ŸÁq·¯œ½âŸ¦AY—­én3ºÍþë¦2¸ÍT°+ ¥3ø¯Èè,û«:ûs›}ú¯>‹“ðÝ�éÔt»Î- +nkϧúYnçÏlZ¾ªÝd WnQìÖ.Jå�~Ý6µ^«Ï¯ÛùÃ?üð�é±[·�Ž×úÓ¦—‡[´3ûù4¨hgV»nÝÊ-þ ହÍÌ¿€5·™–;PîÖôOc8Î|îKo:ŸÿºŸì'kލg³Ïkl2¿ªmYzwSn ”Ç(iM7�[̺5ÅóÉ„ˆÓíÌrwà·âyuŠá8óµ/Ê‚Ýwþò€ÊG½Þl!­é†s‹©ú4I»âLœ‚-¦øzþþü¾ñ©3Å �)^PÁíüU- n_“ì²èÎ/¼o›™Y »«:ŽåùýïŸæ/¾5=Ë2ª›e™ÏïI–Ipä<Ü_Õ¶Ün–åг,Ï_€;§ÙS†ú°›úéb€n–åÎ/¼·P²Ü½5 «\ú£:S¼`¢ÛÎ/œÚ×ÔÍï‰5 u +À¯d÷MÅ«n–å5ŸVª9®áïÎ]PÓªù¿-_ èäö�¿€¸Cͧ85ËnÝ¡æÓ‡Ý7õQ½Ûµ[›â…8»_ÕÊ{>Í«¥š[Ó‹êj8Åœ^¹žM/º«áÔ¯a·k�L-§þÛª>ÜÊ­øÄß~¿€ÿúV|êhyþ¨vEw´ ŸNt‡šOªNÀ\Ï_ŸÜ÷ÔÉpSñ,w­S×aHòU-ÙÉvèE|’ã]º£åÖ­áöÓrükw5MÿY–_t' nßTGËôkjá‚_)TÜêZ'n;zFÍ‹JŽ;³Ü¶j×Ô™âõÿ{žâôÓ¯.•ŠQÿ¿¦ŽÕRÉžçÒ1ìf1œ‘“nÝ×ÌÜ6ÃN€ÿÊî‹z>§'¾íÉÃhçô¿îª@na�ÅÌ: +na“y6jÆyM·˜:Öx™—ER ”•Ð4MÓPæà�Ù0GöQñé§àh± ÓËÜÓ“ãÚ“eé\ÓpŒ¢æøô;.¦žMÔ¯ÛYåfY„vç6d1áÏ�¢ð€ûÕ€äªF¹tÓ?ͯØsr_>@Šþp £>ë¿Ü5}ÏÜ +hÅ5ý:õ=·H4œX€ÐðÛ@[·éåVKCÔ/“;×u;£^wuŠÐõ÷ü×Ôºs+€·u‹jëߪÉVüQ1üø¨~[8,>*Ö`2"¯­=©�qaÐAžq1»À¯·<àS{Þ÷µZLÖâUÁæ?µk�úð«SsrÓÿšÚÏoµš·=Å:µÌ¿†-§8­ÛÊû=‹,"Žàçyß�úWŒ¾ïGéÖ}ÛÌ­á6æÇõËÌ,æ"‹°è¶5¿ñésß…jåÐÇ2ݹ2Ê;TYýŠY§fý×”ýº}cÚE½¯–Kgó—[9#7�¡ÜY• 8Ánençº÷±|½&øÿY5g<›ã7>µ z åøóذlÉ2SëµúdY ”‹jg¶­ð?Ù0ó·¦gwyñ×u|~£ïä’bÝÖžµûº&—vCþ@˜ Á…P :˜ -G=ÙKTr)R —"µ/’Á’ŠC ìÙ0Ø{`ÏGôZ(Ôám4Ä3$ ÉåuáK�jc¦«kë–F§�¬õ¡*ȇ-0+¢�Ê1 Ôîi�›Ó3j6xºIÌOQE†ó愨 7Î�&·^ +-”ʨŒ•qÞ¸À†OtÄ|´�pÃØÚ +`„DG@]}€z<ÈŽ4#ù6‘„.ÁŽ":ÖàæÙq`|æF¼Žô‡ŽˆT×!$eôžSóGŸª3Y‡0Tr°ÔXMµ—`;„½SIX·jE} ŒŽˆèšM®û¡°@áA;„UHXVÈÕA˜+PónÜ€w¢è©;Ñu×…˜j¤—ŸwñàP4ÃrDûqþR™M?@–�–ÄÏà2ù]‚Â8x½°XT~l¥3Ñ }D�šÚ´‰¥MlïÐÔF‰ÎŽÒ&Ú´a3i&±$ŠŽ¢"ÑLbËŒ¡-ø\C«p¸)‡K‘r¸© +‰By‡ºçX4Ç¢ÿŽC �PŠC\cÿ…¿ÿÂß‹¿ðwkÓÚ´6lé©%¥ÊF!¥ÊF¿Re“Ú� hhâë d¹€—ÖÅE"ü¥Å!?Àý¥e€ üÅc‘ÿI¢³WT¾¢êt):{er)U*\´q½‰6©]eÍ"HV¿Lê’cYÍ¢¸umW‘¡]9ÖÐrÙ1’£RUxÈŽ‘ú© +êì• „“Ú»‹D ŠÄ&=˜)fƒ'6%·a +¶avéNœFA˜)H90(Bó5ñ” Ôxkƒrâ‰ï#šì–XñÇ¡ÑC$Œ„ K"¦ÓÇC=m‰F‹‘ÈÓ&¶CS{ÄD¢nI9�íuÐÀS{Ã\léBp!°e�ÈÀSœ�§¶<’Gòˆ-C ÃE;—"âqhÃ@ mc68º¡ôj68Ê¢?ˆkÿn-J•­Èp2ø6ÐÄ{�!M¼�8hâ7ÌÈ2 _~i‘ï_®ài] |"“O_ø¤N“ ‹3\�Ð7ÌR'ôƒ‹NèX·,<*�.ë #U*ªŠªRRè¥Îzi%:û %:»á%�¬Ò»ºIæªc¤*$ÔÇH !¨Ü1RU…ú÷4M+ +D+‹œf@G6,äJ±ä{¨ËÞ°MÏ ¿)eKï\²£ˆ�¢ÉŽ-™È ÈöÞS dGB&a;Xƒ‘¿>“2¯5ô™>hgG‹ÃaÖ$ºƒ›±Óæáº•ÑàÀa7ù` íè›çé‡ðó‰×íåÕ�0úz«ƒ8„j5ŒFßÁ+ƒ‡°+0«�ñ} íz è�p]é5o؆qPJ•�ZDë†å&醽Úcüx¸Iê¹üCZpñN”³Ò�„$Q˜UÌY{Oh5HÅÔAJ”9[ê¶ôE#¡Ä4‡ÑYØôQ0´œñ:s‹á®I;Fì eè„ñ^‡¦h[nõæ�¥ã“%:;:¢M#†h&µ6,·Áಀ¤v_@R[A¢è"K–� ËZ^PPPP€ø†ö3ð”�§ö†qOmB�#EPùöДKTìs)RòHÉ#¶ ‰6 m”*ßÔÕS@ �Ác68ÚYôgÑ{,:�6¬ñq°‡…=¬‡=l {Ø¥TÙèöHíßö µ·6¬G´`ˆ‚ Èòˆõhâ¬×ÈD-ý€¼ad`ן‰ï\ZÜLbKîâ"þuIE,úïK+qY ðÉ%ÑA1À'ìuáµܰ‘�§¶e�1b7lE'lX†™$ÔÅIJ`¡ãÓ .&û•œ¥NŽCCJ2ö‘Dggx]ÖºlmØŠjRœ¯„^QUâLEŒ冽ÊZÕ*t|r�‘èì}Y%·a]m¨=�¬yT¼H,å°’(º�ÌHý ™$ŠþY%Çé,jÃVŦäØÃ ’(º<²¸Åé¸�gwuDÂÅ+ïì´ž1´üì´„ßÀ‹Á›ª£ä6lm7Ì…1´q7•šÚœƒC`°€¤¶ªÀ’¥ �-95ÑmþîR/;F ˆÔþ­*$3AxU�1 .&œzÀAîà ß°CM€ v”K °ž¥T¾aª‚Œ"¨vŒJÚäUˆ–Ç"—"µãPö°%ÅÉ8ÊÌ'4ñ¢3À'\JÐÙ°Ælð³Ó: ×£/Reo‰Reo@lÅ›J.¥ã³À$q½m/Û•Ø”‡ƒ6¨Z–܆q2œç=Ÿ·×…³ÁÓ–,‡ô¯¼-ý+ïìÔB.cˆÙà†(P»•ØXöÄ‘‘(z‡€µ�¬’Céøä6láH vëÒ¡p� #!ÝðUúFýkö$�¢k%ˆîL4*:2Ïg¨€Cv,à<…9,Y:2ÏVªP ЛB s$ÃŽ´‰`V¢oJìHoØˆŽˆÜ¼Ž4ˆŽø¹èìhB¥½aŽ�DѽóWZÄÑŒ M`ž7l%.¾Â�f– lÉòX›G“Zw? E<Œ8„� <×ݵ«�Fx>+•”{pH$PRb˜$®wȤ0¾ãŒ¾y~‰$ÞVÀcÆ{Ù÷`²`¬@ÚëZ°äþPræ3§÷ØHÝ0³H¯Y5˜ ~H$PûÁAn˜I‰Ì†! +:©CC;©£[X9´ÏÂÊ¡�ÈËCCY%§!:˜×Â9@Jâ7»Vh¦w) +�¥'žA­@ŠêÕ„ç@4œ{g§…3`ÉÉ ¹Lh—j7RÑ‚�´ƒ¢ �y6àpŸTÆGÆ¡ 7LAÜ,6£Ð�>ðjƒä*cƒd•Ü æ¯yv$òèÒõì y¬mhFÏçíÃEEÏ�&p�Ô ÝDBìÍ'˜4æ•AÆ©-œZdH�šqævžšfk +´ŠÁ¥r,1E â£Â|ÚØ7Ô| +ó–.°$ùÀ«„™4³<ܰU@Á�Y‰>¾ ¥ óÁBÄ5~ìX" ‹‡âEF »VÉi¦CHÑl~X¸¼F0˜¾ÞnÇë¤Æ7eŒƒ³¯ief >JC1à +ñXr»1ý© `Àܰ0,9�c/[¤I On™Òš1”oMÞŽ»…,»‚éÀ´E&o{ “·‡Re?LmAÁ׎¼} ½Œné.yeI?_AYÙ‘äŒFb8"váSV�VA­—> J˜‘·[]µ‡’ã>`Éy–'ãùƒ�×m¼�p9@³Á=‚�·gCËGL§¿Ñ$q½ó#¨¼q(U¶cÝx›DÙxû¥�&žwXo¿è„Î!ˆÎÞptVÁ�² + «À LUá=Kéí ›€ Îþ@%(¢å$%C,ɺ­ì„‚‚m½½a¤‹uRk(õa°ä Hjs°ä8—"µ+`É5þ‚Ôþíu‹½ë‰ð]©R9¸ìËx–¤G9V,]mE”qh(o>´É˜"4Mw2p8í¢ðš7¦-e•œRxíÓ0´Ä‚“Ú­;qD9”¯æ.[õnÇ[œ¼¸t:¦á±…(*�éïÐ#áÂÒ +Aø.f8EFþ6L–˜� C 2¥s$N>«äá°«†s +?ªA¶ÀŠ©zÈå^ ÒZ‹7,ý”zÍ�Q=ãÑÏÚ¦;q�(ãкÄBë<ƇæJ… ÑFõWCKx¹k©íIL¿’(t¼Œ‡YqmqÍ…ÌgC™I�²‘/`ÿx±&‚¨$zÁ“ø´ê¯à»nEgÄ’h<š‹.¢Ñ+‡ ò [h_sm¼,Òjz Ùà®� +QX}L„Fgò±•Ø”ÓéïUðÕœë'ˆ+tÃê¯àâË@®&ú&Ÿu–a‡y¹Iºj8'“²e‡©�jß݉¨JF@Àô ~hô™o(š ‘v�3» _§VÎk®×Âfdè„¡r¹'ó¼aå¨ÅIûâÑ5Æè¶ar…Ñ7lQáErhªBÈ¡�©C#xŒ-bàp +‡¦Ø°—)�E9l≯4&µ¤�k¶P•´·>öïsÐxˆ�ÑYE(µÑÆݰԦE7ì‡6lÃ6Lõ8q¡ÕÃ.鋵a ¶1QôÐüu§£T½"•Ã%EuäZ‚rõtMéÜ!ê�BÒ8Y÷†u Û¾R�ú! °ø( ‹·â KÆDJ�gá� EC~7[Pj—¨‰o˜ »é*0Åž«=àÞ‘\PëIóÁÕÐê¾]¶L!PYÙ°ë¡ð„š´t]Ú ´©»|ú1Y–MRÄ@¤Ü°xTn˜»’i�²ÀЉ +½l c " +…YuœF•¤TºzzÒK:k`ŘÔã9 T�l�*©9hJç)VÌ £„aÅ$3›ˆ¨šÌ³ßL¥CV×TS…Ž×XÐ ÊIƒXî"=]_šé R¥„ÿõWw®ÖÛà†‘/[jïø€ŠºoýÚü†y}ÔQ„(%ÏSXj©U)Ö*8øbÃ:¦¿;iõö†!dUC› Bseàr*}(¦ß°�V5VaIÕ>5iµHB” û!…Èâx7j‰W©¡9‹ëÜ0÷«JÙ0 +…áÐ<¢ŒC›'N`•œ†Qx #»šÀAÑЬݡ�݉Ó(݉ ëCwÍÇïd̺EYN`Ù2f¼ª:^ŠR™ø†¡ +’ƒ×%Ó³ ²‰»B`ÉÉ Ò©ó K”‘ g€LP膕 +4&n™ó,=ÒêmµA•Æõ÷Z¥(¼ú)š Þ2+_§¨û<×�ÏÛnzò7]i·eIMÏtQ¸»©¨ +èÇ$¥¨‡ ¸T�H %ãPªìÈ÷Éx’ÈÀ^�F:•ZÕ”¢r�©”Ó9"©6›~4WbŠK¤QæÄꢔú3ñGàY"oÇõ!p(¹Å¡K0&ÜÂ!²Tëks¤\ÓéoBpJûÁ@Ò¡9©ñ¥# "0i5Á’:—:]JZ!D(Ö �:Â1qÇçAPù o+ÏvëD€bX¼<æ%<°¤‹…ÈÇ,�`º&P6'œÒ{�Ææ¥Ê.Q ÔÞFos�´·³†‰P6ìd`¡ ñ¦­ (µS´­ŠéT\âJ{yLÖLþ­»V°N• ÒêíGë´ù Sxfƒ#Ò¿òxOLX%§íîÄiø¡•¯ËÐãCsœ ††®Ý¡iºÇXpÚErhë÷reaÀi¦Qx­wR‡V³¯•É�¿ß >žñtDSÎ|6ÖÇþ}i”:ÞFÑJ�±úDeMüÙZ”*ûñ ¼­¨›õ£„Û°5]¶)T8ÐÚÆTöj$bw‹%ËN«x6ÛùFF„�Bé©DÊTUp²ª¡%DxÓD—Rv"HÂ[nÂæÅnŽ ¾ìºô<´‹7Ú†aV�¦iF©{°ŠÍ +ל, +ÆS4^¼IœxG`uÍ–ÃrEæÕÍ�bà@FbzöTuž„û0ä¡ Q#=oR§| jÈk¶$bzLzæ,2¥½a‰N£´W°"´;/»+ 릨亽¬Q7ä! À�ç{9�|]†&¹t�m�:æ,™ø¶)\”ƒ·ˆæ†-DÚ�"À%d6"HDH4.".&�FâÐ@ ÅqFRF‘ ©œ’숒1.‹<. ’±¡€ÚÈÙÀþ6dB>ñk€�4ÏnQ,mÊY¨ —�RJ»>º#‡Tû½…6¯ aôç—DO4D5€¸AÓ‚L¼FÏM÷áIo|ÔuýÕLÁòxR5f~¸!Œ¸•vý˜Æc'r~yµ?°˜Øy¬Ši¡ç!Ãpº¡AÖUä§R1€V� +î¯ñÕÕþ¯hXl@ê�ix|~=hÍ}ÿÎ%äu§»{ð�C‹oPóDsÓA[ Rìõ“­½€o¹@™šž+a/?ÖQË ï›à¿´¡€j�óáë%ãùÐ˰S ,ÁŠ–³¯¡×y™”:QkV¼œgm#°phöòý'sôx¬¹þuŸ‹ Ì;\ܹÙ¤ÙsÝIîsÇLl"÷O°ã=°#áÓ©L‚®é:MShŒ(„á&8-�”4ânêF’Šær_—»òÒûzC%´5ÁÁê³ \BTª&‚Ùü„û÷šŒ$>,wó%|qÈ [Ô”Zqß�Œâ�`Ú÷j‰³ÕÏíÔÞýƒ­—Ó"…ìf‹äí]‚ÓC@ÙAx¶Ì q—²ˆ°”Aÿ&ÕÚÇx·>kæ€>yð¤§Qèøäœ�è‚ÐQXs-M,¶3íþ¬,HÄs�\ðI;Ô&Ý+dÈïý6\XÏÿÇÝ¿ÃýCÏêÿÇóŽ+òˆÇ…*#¸».£ÙA¶X$œ5’D;P )˜í×DMÌ”ÇM¿Žª +„¾{‹¡7áYoð^>�Ü�a÷3ÕíR¬<Ë�*w:¤g�Úµ‰4¼Ôº`抩߃Ûm¦éCáÂsÌ ™3GÙ&à�a1B¸Ç®�þÊ,„ʃ‡üGT|µhcÍ]]ND +™ÚÏxaU°H}Fµ$Q˜Î82û!kK¢4$ñXRëaJ-�g·Ð¦-h {lçW‘gV¸º m#£a'a›…µ5,ì +¶ºgº•å9¹ L€AŽXæ±Ç0gž°Øô˜�þôî÷f§ûƒ@³H3Òzõд.£ÃÜqìJ=Dàèw¸!SßHÈçÛ1 ¬Åwa'ZŠG¶&3%ÛÎyìËN‘Q¼\“‹6ÇÙÓdy›ª 8Äú…°=ÙKœ(ö„.à¦Ì,îï}n�¬\ì!n´ÊCQ‚GÚƒüÛŠà¡À”σÄkl‘|&³'0åÝ¢Wéœà¸ElþÆ_6lfz.„,¢J Ç$wèGÐZY}k«E=í[ôdë¢ñ~ä…± +�íd„µÐO\õÆ®~–½pþVc?·Dðþ' Š#�ÍC–úa¡²¡mei+¼†þ‡úþÒj{Wy÷cûñ­úk€”yµ_©tÔ,�×¢bÝÌüf/¬ûoS|•Xh²L”¥’�}•ô$ZÔŒqG;Épiw¿ýÃ!J¾Í/K# [Ù_NF]E +˜‹x]³ç:³tëúN윸­ÅçŸ,øà b§;3ÍiÀq%Z‡fÞþ_ò ¹F e6µìøÚ„ÿ6‡"vmðb=E[Ÿ´=/ÇÛê«Umʵ%×ÓMÆ鈅ª½_[`J¡]ík¹Jæ‡é cdžÄ—�¡ U¸îHƒ¾MÆÀ鹿 +¤š`o{n´º À»Wi¥tüJÀ9±QÄ¡¬ÑtB¼]M&®,ýåu4½p4ùjµÌJX›” +û÷þ>fÌ•ƒ8C*p +wïœ{Tœ?z„!´X©œ!H•¸>éëE�-¿:[>mÞ×V +æ~¼4Q¿ rÅ*�Ò®8-‘4i x=Lû®aÜû$4ÅÖ¤}L2º¶.Š¥XÖG�´b5„0Ý:B;p¥Á–2ª€S3XýEŒV‹#Rhø Ž6dh¸&U¤¯ÁÍ\ éÙÁÒXRí<Ø*x6 £¼|0z¿+u=;§tFåE^'J¢¡6 ?§Ýf)ä|E0¤xø²V¥ŠDëAÖL›ÀgÅj´Þ'H±õè’PpÿüÑÜÖ‰SCw@ƒ9äA¼õ¤ýÓÏGfß‘N“´#_Û{]âc…±ªÓ™—°“Û±x¦3 B$DÌÓØ4œtMA–Ý`†UŸUNfË/”* Y­:å†UQ¥�Ñ— ^HÁ�,‡; ½ŽtLn僞 ¥E:mR–†œNÌJÕ+r\¸ÚósÚ~…«ƒoù +• Ó`i� ó{¢N^´|ê›k°×5¿ÍÎ9­ëPƒû.>Ù>˾™¶+µéOz£ø²d„POþ:‘N3ڛν·¾°ì>FƒOiÌô²¿®H1ïÄw„Oó2Ç�G|61WHo£*õK@»0lX«@YUŽp¯>OœbŒ1‘ßÞ‚Õ¾ê àtChA³h¤ ¶M4 žÑWvñº’.™8ªF§þ댣³G ¡‚†ìAbsÙ\‡~ÚØC©[£�~>’‘CǶc°c�3kÛ{ÄÄ+Í<÷$ºÇÂxæ0\¢§X‰oß}ÅW„£"í*]ëR­Eóá4˜ó½Ÿä‚ÿéÛlÅõÓáu×HŽ€ö…öN$‘—¶=еÔÀŘå¸høN¡ó?�±ÞÇòÛz΄T –!‡Tå{‰Â¡fW:N„žK,lé&Ýíÿ=„ìI‹Ï®ÚzÔeE?% ù œñ�« Àaû �0þŽÜu�+�ó×fJ—V‡›î]œÒÝ9é՜Ƃ›ÚIÆ ev„æÞ6N›_Ú÷à�vîDåESCú¦ ÕXšA{y¡ØýógL:Eÿ {)±zQ¬Œx ©£ª‘m%,l1œv‰ÂˆäGíêö…@Ô*2íèN°¹®Äxó¨ÅuE5Üx•šÆ'¸ïï¶·…CÂZ­qQL/Ó]lõ9a[5h7yݦÜQ+4¦a¸1ÏVÏ”ô&Ew'! ‹ã* ’¿î0ÇÔ 3ê®LÌ �^ï�ëÊR,Ý“éôÒwGÛ +x!…¥û“>�9÷3ï#½'€J æ»Æ+¨Ð¿zÿ¬èœì;-ì÷ˆ¤ßÉ«a·s‡ãTjŠðÚ¤ée q«ñ7·z)?†N)®È1ŹÍ~ÁáæÍ½ßDè™ZU†b•âvß¼ê&Ì^^°÷IýêýþmC�¸?à†§¸ðŒ”jGÅL/2NT÷ÍջÃt\ýˆ›‚Žäêüß­!Í–qi¯–’îñ›[9TÈôÐÃÑ€S�ƒÞÝY�Q¸W�ÍŒUºò*“Ø:'šØ‡!ƒDAßÏ2Bp Ý=[ç¾I\äº ܰ[ç%’nœÍìW êœp©ŸÀ…ð6ê›j ,ëÜæ%·ø2ØL·¨ Ã=ƒ-haþr¢ÈãÁ3áÂHÏ™r#]æC*JáæbÝóä'5Õ°…]z*|¦ïtrªÅ<ÏÚ˜FÑ+X"„�­ t…Îõ²²€Ð·Á·‚Xû½«zIEÍf + + ô�Æ3óžÝ/^FÈ‘L¢eŒo©ú…mÙ:z/Îß°™M,ìIa>q?þ�·ÀÙ¥bg-˜RùWsÚ‰¸GÆỂ¸:žpÓ=â! `ý4?ãöpÛ;·„Yu€ëþ�,qÃkÍŒˆ|qªq³Ê ŸÑõBô­µ]~�¸™‡å0 ²\�Y2°&ø‚êöq©eADÄí…9kaÌÂu>òL,4â|NÈÎ?ûç%,¡O´W–ûõÝPÒ˜‰ÙUNRfƒfI¸™U…Y8ýPz¡bb šfô_ð™nm«f[÷çÁU˜Üѵö½1Ð)&?ÓµÃn@í�+ïM;„YB1©Ÿ¤ä'¤+Hq_/m>ÿXRGbQ”VÂ0 ;¦©”°qÓƒÏÀÕŸ·¤„ݽƒŠ’‹[BK˜»óuP¶·Žïšæ?!|×¢Œ)ÿ™PÂ>:Q‚ŠÒûc(ŠÙæñÞ*ÖmÅ\”P·ÜÈzþˆ›€¬Ä|(þbËlœæ Õ´—Ï VQƒ¬ÈcuÝ:ïèô²‚n²º1Á:y±/åÄêsÿ�çàÍ›Fa_T%þ;!L°„álutÆJ�`SM7™i”a/'IÔ̾†óôÒh¹ÏmáªÌÜ˜Š†»ÔšFŠw‚™7û S7橉ðñjžø3¦¡îÌF8BÒ›´p˜Xsƒ8e I0ð‚´Ü7‰sšH'îÉ)kHM†Ú>±5±âosãbøË¬Ìé@ D6çkÏÊi6 ½Lê±ìþZKÅœž¼kÝY‡u_¿ÄɽsLy¨f6‰‡V{Ÿ-zcYàDï/ï.TÙÖ’$ïÉGBô® ±º]ûQyOtì0 +Ç!¢7ÍNŽM°Ñ±ƒ1Dç´ i¤Î³˜•!桎p»½ +�ýÅoAØ[Ó~«ýg/°æ\²ÿ½î’ ”0gPÈ–{åâÃH€”§¨g»rš¸äffÑò}•fÿ·,í²€^oÉ-Þ�À‡E]–™chéI95ÛN(m7r grjŠZ³êg�wuã‚çÐ kåו¬,Xó +€ßOµ20ùÆßEÄu[&0+\Û8T˜Ê“½w.C†lVQ°R¨_Ý<>•ÿÛ3CؾJmëøÿ¦ÏŠñÏÖ�SQ³ÓGÐ&g’gÖžŒ—8Ý^‰BÖôŒ—ýèéWÄÆ2Óñ³÷LÎËî,ÔxËŒ MñÊIßÀv�ÇÌpõò×g�·,†¦6SÔÅZ�$ݱÂ3Œ!‡áz¢îõò:UËøµªù™ö‰ØO«d²`•âÎâœ�“Éâ·ßÉÚ"1EHÍæZ9Ÿ‘]ErLR´¢�IÎÈZÙNUª \üÚ³…MØ2:ã}�Æõ˜¸ìˆÄé`¡RÐMaÍk íŒ46\ñ?~ò eŸú"ëoȃª63LË7Ç%øb×�Ÿ\c:<¹Š03àÆñ¾·fly²Y0<1så>>–ú‹�‹^WDÂÑFN§¢Š¾ãT'±Ç[õ|~eƒ2Ü-ÒÃpÅÅü»Ø–(å´»æh+³Ð’@>ÖRaÜÕ]Zzz*ˆÊ@yKï!�FyÒW@�Ÿ_v¤l�½T É'Ô'¢Ü¢”¹µ‰‰AA”2·(7Ê­Evæ`n}¶—Ý„r‹¨�­1·†íœâÊá7xÁ´âåV¬v™î–Q•skŽTÝÕjž—øo^”[­çen�y(ü†»Pn‰rÍÜŠxUëA©ôj5x"Ž™[~ws+ú(·îyîÜ5ÞÐ×5—à¿0©­ø­¤ä mf¬ µ.äí÷´Ò6ß)wסË‚˜e›”ë­è<+ØŠ›ß#s ˜DVR$`Ñ WÑ};Ì…�Vó•i…kûf, Ì¨‡Úš®†nA§ç�‚’�dÑâ©>cSà7vr_ÿ€‰Á·ÀùŒjÓd•–(0–¹9Öù|­[4ÛjÊ@ñÃö°f–htOÛ!ÊшЖ/qaM—]bŸÒœ@«„Tá�A[²Ð&ЭÑ=5©ç6a,ÐÞ»’÷”@+5¦ò`\ Õ|»Ëøa¿oÆ·ÏfoEfU,ö¶¸`cÖSéB¨ãü#m zÚ1�_"B` L4Ï8ðKRDâyéEµA›‡3®…•Ïü}’¶¢G˜ß:È"1KÜ3®62Œ2á÷M_}6|¸AÊb_ÄÞæÒg=i¥ÛÁ>7ÍÜ„b{…T‘Ù‹âMö½¦ÿ$ÄþNŽ(~Ûx*Ë-|êŽ6YžyÅ:9«FŒ•â^÷š Þ›TX¸uÕí ³š<¨x¥fû(1-‘­ö¨óŒ+öµ¼w’ñ[ƒß¬ÆB2�.ú”˜+¶Çê +iÍâ�+ôcYBžè¬¢�qPq^®}UPx›¾ð\`ŸŠgƒ¢Hአ†ñ*øÅ×î¶UHCÀ4†²î©ìG¹�ìß±J„š`ä/Ä®<¦egÉg0^fùÌb}óì2Ïb±æà´G ðÚ¤‚££J8Ð�ÔæÝ3¶êYw°å@·ª7¹GWiBÐÆ¾÷hË�îê&Ö_R¸>‹ßuúÒ‘ ÑheÈsp­æÒ�ŽRO1Æ7¶å0‰|°ÕÖÂÏ«_~ ÛV#jtØîæ-w¦ºè@›˜�ed�í£ðçÑ è6V#ÀĨ›UYvžæ€µ2IߘhÞXŒÆ™K¶óîµp¯ïäË)„tÁÔ̫݉ñë†ðÿ¦W *ЫÝ^ 2>ï V†A©ãW/å�‚zŸŽñÞðÒx[§AFðÞƒY6£ÞnN² Þ‚ч½”¡‘4)%•²�⥼!FÓ;™i§?`�‚¿ûb,¦$dˆ +s¿ œŸ‘!‡e}*‰{d^÷HðµÖ¿U B,'ÒQ"D hËÀŽ…p‹3³£—K/õ¦kêûÙËgß܉�GÏyMÆê6oÆ <=õ,Ô˜™ÐM¼åÆ$Z„aÎ'²öQ¬öO�:=]múÈK¥²Œåfa)sÿa¸6P) -æÇ|»]ÖîN3û¡€ƒœu?Z¶ÌÞ?ÅØ·L,UÏ Py¸ûª*�˜zxê¶ ºr$‡¡95&¸¯à[ËñäÅ +â!{z¯ar‰ >¤Q7 W+m$õ±ûSñ#?E˜pÏw—ÒO‘ñ©‹›ïHà•¥¤Ëb¯¨ Ãl[wÍ'�R Œ ^IºÐq + „ƒIÞbhTb +ž� Ag—ñw�tMŽn) jºT‚2'‰ûP1qVˆ–¡.D�"LÔ(Kʃ´gfì+n /ªŸ!Õåê4‡ûà»Ê~wü0­2{(ã¥ÇpqyªO¦ð‘vd„x�h1ÿ'¶Îg彑ØúDS�5Ô­·a]ëœKå‘XÊ ZÍ,Á(‡¢ëg* uÎ÷2æ·)¦+Q˜ý¨3ÌÏ·°·¡Ò­ Qç˜ +…#TgÂðÈp!e„¨: ´ëEÃ/~A£ÎÌñ†}oE³pÔ9ïeæÖð[צo~@�{Þ“örOQ0D»«Î¢xeuÖD—LuöÚ÷®Ë+Æ+Ÿ…:C'lÈ+Îl\uIæ1«‚}ýD£à¯ƒBÞ ·bˆE4= +?ì +'»~Û^û‚Å/6ïa¸‹R‰¡ø–Àî\f–•ÇÌk=‹Ø£0šÜž¹4{t°Ç=ú)ƒÃo¬oz�ñB¶µÙM®Á)óFB?I3Ç:î$< ;\7”CwžÝ„ãò¶®É]¡Öå-ªMˆ/ ÷9anTX¤rb¼ÌÅÏ$¹Ÿ”s?�u”˜�‹” ÷ë2¦Ê¤âQDšéžÞqn­,Éšåújþ�iF£‘äöPxbéÕSŒŸùy��¾Ð\!ý_è- VÀª„Ø¡ÏzV÷OƒðÉ@.&bFh¤Þþ,”Šû3•0ܲðÐŒA]P{e°ñÒvÏ£< ÍiÄå1ž½O²Ï eKÎÙä;Y±ÎÊ–fòÍI ̓Ú~ å ÔÆ +…(fšÛäý™‡ÕmZã¡yU¬QŽ?3 š»\§ö@xÞÐÌb?3x ÍöË·�ÏÜ*Ë¥¡Ðœ~«ÕÀ~桯ášËêiÝfü™Ësh¦“@žŸù¤س¡™Å8pLÎ~æ- Í!šëÓŸÙò­-Ú¡™:’r„�ÍÏ,B󯽼?süßpusmh¦œã”ÄŒÛõ›y)šåµyJLü�˜îÏl~hîDMèÇáo'†fj ]a!ãû +5j†4×À÷™'C‘OšÓr§8ÍÅdSþ;Ëo!ך�;Mï™Ojz'(›¯Òô‰ÆLM†INeý Gã‹îF0cþ°Næ@–º +·ºuzùå%þ²¼©sa~ `ÞÐÝ’£™„]UÍEܱ¢ôŽËH#ñ~ÞÌÉC¨è‘[ZÀZÔo+€_¿åRìÓÕî‰ND v ÷ŠÖa¬ë®Í�x®|;zÖ ‚žGµ°§—ÐzÕÈäRÝ€ßU�Ô³B˜�ê›Cx˜5ª<1Š?À†]þc\%£ö¥Én¤5Ë1>ù»½+½ ÷¥käñžÜ=X¶ç£8*t`ݧ2²¢©/$˜ê8f¯d¿õgPËjÞ ˜‹™éU¼2°³‚‹ç¬ Ȳš’‘m5e®L”6›fn2L1—â:goŸ› »Â£Ž7X:s¢Q¶ä°Ÿé¹‹‡}¦uJo+~¯ÍzØ«ÿ!óIÕµÙ-IÓ õåjôÎæ="½ÉóBðZì7:" ry÷ ÓËÁ"IªÂ#ăpŠ–‡~ݾuì³óª× T†*ÕÍØðxún) 9{¢ AèF 7ÔÿOçeß{dâª5`û› RJª¹M±conw +Ó^ln¬ÖiI\fÈD ,BüF¡öqŽ ¾{�©9L0rKéÏáÃðÃ)„ÒvdZxÊÄ G3º gÌ_•k¶"·æVêYÊ1viò�VQD"Ë31òÝ­©Ÿ�Bƒ–„BÌ$ïÑ7ø�ßø탽|«º÷|8Rës©ÃBRÌ™8Dºõò³CŽ6) õ�çþ ï½u–bp�–Šæþ¨Ù™ù^€Çg\æ4—,ÌÎgý�Ü´_ †„�õ%¶TM¬+*GxWæSÈR£�KÇa;ìØöZ·!è÷”%&…2&ºfqO)‚ÁUËn¶ QÙ²¡Ù,¬ÄY()ñí®íe}>*]¾ébÈ´“RÐõŠëËÞ¢Óä|?ø¥ì ÷æ�ÚËÂÈȃŠêZ±êûQÿÚ˜EK ÒÍ$¶¹ÿ|Œ^É�íýèOÒ%9t1ÄÐ×!ÌWŽ ŒÔŰ³Ýj�µ’¢ï•éLç'ÞÑ屸¾@¸^u%““¼åŠñåý¬U_Ð Ðì?JͽM ¿G ìÖ™q¥×f˜ÒQt±½Wê/Ê’èñïå|ij|�ÂÎÔzøWšæe ¢à{<‹`Cýs¼7ì-Š`K�‰a,ÎÚa¾u'‰s³°^�W6ëÙêB))¯€­/dð¿� +;?<Ä¿D°º��߀XïÁ�_<\F€]4NãX1¦ÁXܲšh>±ÖžR8¨à×™]}§'ö›Ã¦ôp}£ÄD…õ±—1æ9¿L…¾}bª²“ +‘¯íˆZÐg˜KÍè–±Yïxºeo©g ïsýØN”c HãñLàºëWl.,,”ˆÀù0Xw*†ÄÅrÇ‹¸Í3e÷$Qaaõçö¿ 5oÀ‹ÖW®…Òˆ]³DÝç:z˜Ò�8v»=â…ÏÃø€�$à�ZÃÕöaSß›ûrERú0ûî#d“ð™=>T¢¾ŠÂ‚ƒÇWcë +ôÌnŸ?u=L+Kˆ„!MŠÝàÌ� €÷‰ï2¤ù‡j§ô)  Õè `ü™öÿÁ³£5{©¯#G®…ÖÉçº3Z…,"ç`•¾ö4~÷Òfó¥ˆ,¸Tpùpí9Ë8üE¾—Æó€»cãÚ×TcaɼñèYÍärý°h»±ùW:ËcyúO�1¤ýY�üÿ/v½Í~àq´PkË}®&xtÎÅiVxúdeÔòÆÜÌ +²•xÍK‡UÓŒîÁu(Ü}8_Ûþ&?øù‰Ú=ìæé¿‚шœgyn<‹æsaVî·b�B¤‡¡ÿ÷;ìÛÀ1ô‹”·£¢Ü•%Œ_’gA)„'‚Ò·¸üÂ᜸—G»¹J+¸šÒýeô;!(ÀÃ\ º©)†Ìx·«ÊLÜ[<³ïØOŸöðÞG3–Ž�#1HžeUÂ8A"dITž%ˆ ¢. [²!'%âåâ$”ãˆø*Û¹åcÁ­ù)#� +¸Þü}VˆLº‚G‚ßk…†ª“gÃê mÝ×ö)®=6,:Œú”|ƒFæYaÐÁ²†Îè™¶h´"§µÔôs޳ò^m€£] úl ÏAà¦Ì�;Ú/YÜíG&>ƒ”>µ¬�*zf!¥†Ãtx"ªòJ�¥¯¥ ëÖ|¹8à±å½<úÃod¢oY,jôgú•^Uy‚Od‚�ÉX€”ó­Jb÷Þ|³ÕøIÚ^gÁ¢–ò¢®�yÿaº|¹ç²ùƒÃD$c>åò ˜À¸R9l +¡ ;Ê üžä€ý0e‹9ÂáyÍftó„§=¯= /ÐB ¢°S¥…Ä;Í?¨mn°–»öm0@x- +òH!y¨nðšaþÏ<ˆa¨¿—%Ñrß�µ¥Ó”<Na¬æòY‡_¿ ˜aؤvóK1Êpk¾²< ɨç4om©“„’Â`Äg�¼p™5ªpëǼ…ÐÔËg)$ +CòHX?¦-?¤Æ$ˆ8s(^…Ȥ©ù5~:óžn�ƒLXÆY^pÎJö·ìÝÐÚ+§"!â—�\üòz—³Q+x ¾ÉÿùõmGQ×P°^¾@?`hPù4΂¡\\«®À—pX!:­Æ×+#9 +ójq$.€Õ¤Rs~a”û]ÀÇLûΓZGkf‚™}ZNcΜa4 [Ãbcã{P¸R@pd9õ™!¼ËIv±ª¬ÊëÃô7ÒZ#=pd�~\’¤Ä8ì/u)²ï •Ä4UM~[kІm¼:¥8!”ýI!xÄ-óå+Ývå��ªbg¢ó ôl⬌5ï•DŸ/Pò¾…íeS6tÓun¶@œ9lÊý㘆|0ª¹Ý�5 ÛÞ�#?Z7e¤•?< +Ÿ�E¥ïl–1«dv”M>Š0½ÐÍx*‹÷ÜŽøCgþ×´�¦}ÀûçØ¢ñýÈvW.‚–ˆ~Ì ÷ø>2(v>óF΀¤wQõÃw[ažIåðœôÞÜÌÜ×—Ÿ@wÏaºÀìõ™ÀNg¯{²h…–®<@ö,›Ìf1’Ú´´�Ü&K%.2Ó‘¯j躃:ý©,DU§Ã¬3³K*c±YXU"—ÿ'PÍI T–ɲÓÐB|YÖ6W8z}^²KÑmì¸|îǸ +‹vÆx�‰�¹—£TÀëëAàs;m�¥oÄ›�ñ´ú+AH2o|mE7.;gµž©k:0Á1aÙU€ +òYߎ®·Þ�“WèL;–¿á ÉîSÛ*„ÚÂpQñnŸøž2¥€è m‹/(½Li#Ù¾ÇÉ÷ÏØ G¿9èÙ�yÐö'V.xÙ÷$Í`^>çÿëù…”«{*vNQ·Þ± +ÂU…~\FZOmPïSZžŽbTb +£k®€:RÇ`‹eÿc¥e¬Ý[þ`'Ì6wb»,¹:tµÄ:héØeKèmTŸ¨ú=¤ÙǹÁ¢_{^ÊI³Ñ}<Ði]èÝ?å�µ@¼géX}OSôfñÚ@§ Ää?ð»xnà +Nyú4ï*×õü¯Rö`ƒ’ð>ا¤Bû„:´ä‚±uåM%¿�7�#ú|¬¡”J S Ñ8kDûMîaEWÙÍ�òå…¸ `c¨Å,ACøÒ£¿¼Ömͬ¡•º cr�‡”¼ÔÓ¨nÅIÁÇãôÂÂÔÝc³ýñ!k¶Ó6ÈL·÷à9ÈÁLº e~µÜ®ØK¨¿0Í í´L(ß\1†m»£•q[Â>²­w¡‡WNÈ»ÍÉó1oÀ”¨GÉÂy»IúaO-õvªsa@,‚pJ’�Dj ˆ5Ùo²Gà}÷Ž�{Y R¡Ù2À†ÉÊ€UY PÑé/V0Se”×+«ÛüD¿g ¨½¿‰ƒAóD#S–sþÐÓ·“�›GƒìLgáóÐ G‡Àm¿ÇìMd9Óyè[¿'½fb•KóIæõZæ’íïM,K!ò!˜HÉÊÜ�g?-镤ìdž–þÉ<ú« Gšgú=ÙšEÑfÍÓæCègiÐîŠÑ+¼>¨Ï�Û�-f¨Ì +tàˆ‰_?IŠ.Ö* +¦eØwܘÙY Œ>•zA]4V©Ç6ç¿EÔÍ+ƒŒe™ž~dòçef›=¨ ]¥xJÏÕr‹ ÇçŽSÄ(é`=#ʹ–&ËØ,ãäBmÕ•+8â½D’VŽÎ/�1³xÚeC¬ND輆×àȃ ÂnÈÚ¢4~Þ;nSÏÓÂBÖáЙŸv:Fk“µÊ#ü±¼F>3žûyŽ +úïø—aý ÕÏä Xv«ÊVv¨W‘°@€w8Õr²‰‡Š7aÖœ®;É»MsÑÄ'Î[®-Ľ µÜ˜zX�5• ÞÕF³ïïS�|t\~M~‰%J° ®£HkW 1ƒ:Fh*+è$õ¬Ì"‘½Io²Ùû_X¢cª'xÜ%õ%…F‚‚øSª7ß(ÛûD ²ó´V­‰ž¨Ý¢¢-}àW8½G.�èÚ€¾CCIQ DN¿VïWš² ^ñÑPL·´j— ú©¶×m5¯±DHE sQÙc" eÍ›ÄMwsgn8<:QOÆd\S<œ»tÛ9ÚÌ‘©®AÅÂÙ‚‚Ï·ûí¾�, irLL¨˜?¨eä~Ñðeˆˆá©BëSKÿ°5~ÖQò|[qÊø&Æ‚CÛråöOº+È㛤Åǘ—!vfi÷Kx”â´‡ºù ­»/aÿ~p‚íqA{ݳtKG[ÚøâÈ+¤_ñV¬;èšIH½áwz˜oodܪh!ŽúÝ'fŒxÔMåÂå´ÄÜQîGdncÒ¤c©Ž¶¢�¯ìqqÁÀI±ÁÐ&÷¨)ïDÑöÃû´!ÿ„Ôªþ7+ÃøVûÕ3µ›ú5ãHž×¡œX/7¿{ck_,$27ûÈʪ‰¯çø†8sËøapðôPE½jvn�YìâqNtI7L|k`ž $–tè¢òŸ²Û*ËjêOôȉ׽ôSvú ÷( ¨ñfvº#gN´”U›”³žÒ$�hП£I¡ âfä¿ÏZñ�=mæAF?3|Ýè0ø¬ÚŸ…Œõ‚t¡"Aò^]�Ë"ncD³—‡0©…0_ÀÀ<‡>ž—Gìå§>ÜsâÒ¿éD"¼H¶­Ât|nDqŽà9„n²øñ.u'„±aô 7šJœô{™µFÃ}Qr/˜0 à«5*¨= ⟖-ž<ëùÎdcWÙ w%‡_�Uüg«ºƒ­)^@óªvžàºîŸ|°æ9aï+üøN‚4öG¼Üß¼•Æ„fMð(W£ôÙà%ë5f«Í·«-â—�”ä_þ/ƒ’�Gñçmei:œŸÀF®… +`(ˆr   _r¢}€ +16Ìé8t'¯}»¾~Ò°¿Tz™GÙÙ×W�i¦ŒfH5iª×G5õ5ìàØDœ%„“¯™^X; àf5%ÕßeIÒQ¦>:h¤à¥�ÇÀ�=P�9>ÂéáÂÁ#@P††ŒQ£��»3*ÈÈ1"Eà^bî%!'E é̉VVòN…DþÁ”=œMã…Ÿ[ >ñ)ˆò*Ð0â ûkÞ÷trNû7ÀÙñGM¼0YOñ¶EŸÆWú«V”SPY_ûD €&l—¨'Aá#Õ:ÜÈMÉ&"Ô!XõnØîãÜÙQÝ´ß~G7†—XÝ;mÑ"£7£*Šh™èéíI¼@ü !ñ°õÐi×À®^oa6_PIhP!¼0ÏQl'EK»ç *V¿~pèÄþô_VaŒ?Øs›½¿¢Æ¾Ü»ÌdeÈh£ a&éu'øºxMÒgcUnvý›P]“ÆäZ™ ¯„š’�tA¿ð9Ü „©)iÏ­à'ªÞ1û[öFËèí피ØÖˆÞÉz¥/Ž]2�»�¼‰=‚î~ 9²ìÀå˜ØÂ¤jëIÈYÅ�­ßD²^K.£�3û›-}PA +êi¸ƒB½DGG§Z¢=éiœ€‡ 'àŸaI€Ó-T Ð§Œ +$xõ Ñ©ÞìïUþ³ÁZ Óß„þ9¦X\ߎL+ñ¢ïlˆ ã5 îz­ E})Ö5‡p#f2i)xF¿Ýäja\À¤#618£Rq­“WÌæ“?5÷ �"«`“Š˜\³²VZ“S$€M gÖÆ(å—*¹Åç$ÝÑÛÿÞHrÓ³Ÿ¡÷¿žñ·i|(b¤Rzçr z8´-ÖLÍ?%.8õÀ´Ÿ=i½Žøêå�£+6©ÛÅh4Ðø•h¼ÕêÀjYãX^aB +=ç6“ÞZÜ?ÃþÑÊÿeýžd�eZýf|"Û«Á#ãàù†=2 Þ3Õ¥w5 +Ò ÏÁÓÒÁù*_K÷h—¸!† ¬¿*³ªµÉÄøÑ>î@apþ�ï·¢±) ~ÞÖýßô@.¹Í8Ž}NŸ‰ÕªE7* $jÜ`Þü©«A­× •] +$rVˆDn®�m1/ÇK¬¯›“rŸƒ•‰~\ô@h¿°à‚eC~TäG€‰q +w¡9è@BÃbÙ*³•Ì QC‹¿ž¸µ@Iç ,—c�R¼Ù'¸õ‚%Üìä,x4WX>†%B;xäú:IÒó/†e–ÂWêFz…„v1 0 Äìq=ÄfŸ ÙJ„X‚H€” +¦í <Á‘Î(Ü/åp‘"d× …K`@ᄹɫÀ›¼6ó”Þ„[ÂÆXNp ÁoÀ€ÂŸ©X).i’J®u#½@æoS”DBÁU`“ +©@ÂAcÙ…š 2B‘½ª ‘Ië’ór!¹Í"U],Œ°ÈGÒ�N)`Õ8�Bßé“3}fúq™6hŸà^x꣔ro›lŽjò—ÑäAûGG:yÐk•ûþ„ÐŒ¾W¬H&ºÑgik€·ß‚}’û<ܤôõ�âÀ~,X1ÊïC°""1ÂHÅIUØ«÷%¥jôìó bZ +ƒž�!:äfŸàeÐ,¢j,YÀ Ê�±\ǸÂaÊ“,N²bö¹))Ü“€À!'X7Ò' ;ÁØŸÞäM$ �<ÔPä W©éÅWˆ”±8Œ+@–M@·Õ�ô õª˜rBš0´2…�^ (º~âhµÔ âd©Û«dkÕX©TŠ u�èF†œ¨³•r2î% +ÝZ"KTK‰B&QÂ,At‚*‘&½1‘6غYçÕiuNЫ5Éã°¸±:©NÉÔ¡%xUÔ)t:X®…cy5” "…:–ᦻ.÷9‚(b³QÈYJGCß Fž…/}5}JK«‘äÃŒT¶!,4 �Å!¯†£j€8÷/Ž™_¯Î:û4`IéÆ|‘褟r6‹6 pÂ;N�€·�ŠkSàÈëÕAx‚—Ï +ÓðÅ3�‚žà� Ð)"Íy~„Ä ÁCÀAnë¦HÇëÌß4 *¬Uòì€haòez Ú€W[^­y5zu@GBH B€2rf!jÓœ"�"u, ßÏЬpcŽÎÀõjî‘0~ÅáiP[e¦!3#…äÕ +Í$B,º‰*°«<`çÕOåÃ.{db‡@«…Ý{(:xH� CÊ·‰¤V97d.VJaXcâÛh~ïÕÐaÿ÷©W_3¨`Ê�^M;¦DpÝÌ«7ˆèôžg£p9¢§Â‡³±A-"‚—»CMC~4ëe¦�ï;.°sÉ^eHlŸèÕ°†"/�äènbÀ)½gµ!€J—€WÍŒŠ¶ÄÝ|>èÒØ� ænÈÄcx]Üå-,k 4¤¬ hÈ ¤Á Y°W ¯:xC9¥ð‡àÀø`Ú>dV}–l3̾‡u^�š1ùŽ¢ëܶàîöj÷§Î zDpvˆÜéÕ¼BäMœº° m¶į̈xKaÇØŒ#ˆVË`ƒcƒf‚/�¯)))œOÒ`’-ìÕV=Šv Dõ� ],0^…•�W½JòªWßë^% $ˆÝCD—uùn¶!šO2~¥£4ÄR²lH‡láC¥Ag�„ñE· +ëï(CIîçÕΫ^]p6Âé r“C)ÛœÉFiÐ +  *7¹e&5p1$L"œyƒ€iP¯Î hF/3 ©‘^�®`CÒ…Œ«¼êU¯xõ Cjðéb‘¡œÈeC& 6h¾�4G‘m¨é1‰Ïämf×7AðAP‘wUÀhx,‘ˆ‡�éL#ТˆxE.v^=xˆÝxWŠî¬YÀn@1;”—PaL¹¸5Š å˜b4ó©�$:4Ç ¥‰MÒýÊ âU|{÷‚YÀ“å, R 9EH*2o:£_”(׫)hVÙ°zec{JäA»Œ …Ë–¿sP.hU`‡Á,¯ %H±#°C+v)�LìbžÆaà# +ænÆÜ¹CáÞX磚S€Í I°0z ^Me¶ íR!ËXBP‘â‚å’å,à?‘ƒ¼®îë`/××m‚Qv\äbw)„�¶Ù¾/´â˜ÛX°• •2,¸2 † źÑ\0…Áp¡‘ˆ½U¡ª"vGlYþóÍUÛùÍ&îÛÜ}4ñóÝ1íß ½hû‹›X´u!b±½]Ä5É_U6ÿ®ªmwUÙm5¶ÛöÞ1׿—ûš}äØ>¾—ãýfÖýïØmþ³Ûüø†Z]i¨Å5!{+jo5yµ�³¡¦†ý°É2ìäb�Ñ„H“WqÔÞ*ËØ[EMeìµwÛk÷~ËÛnÚk±­+Å„q=°½êU’WI�)-"¿oÄêÞ'|ñOéŸN(Ñ8tšŸÄ¤WGR$Oé Iò”Æ:�,;,H Æb¸y5 |†á)½œj ½*†a†ø»ß(~Űø>ÅçÕ”Œ LdžÍC„Ám"‚$„‡âC%§gº%ì̦i<E~,Yp81 0Fh ²ØH à×̳(\h'J+•™åq )åq�P\áw{Tb¨Ì6rûQFÅPHvá])¾€qÖa‘ š‹›}‚âX7 ‡…¼��+¡…s9�“¼4OÖNÜùA nºOðC¦ûGcÉ‚ÇZ?dHºOð„"Ÿ¦ŸÞã Ñ1¸ÀWhÖùÚ«ã¥DÒGB:6ØQÌ8$êhlí ðº‹ná´»¨°í A3 Y0i1 9Íz¯Új! ÂHpt�É’âö… ‘KFŠuw GÞ ¥Rù88‘ˆN�&íÔ D&íT€D'xIû/çCd’WËÑpxMò¨ô§¿#r¤2ýhŸ`kP^gÐ>Áƒö ~¤Ô ^ Ú'HJ<“™�É{Uä’ˆ¼¸`Ÿàí¬F×!G€.ðÉÂ:tp;âÈx¾�TÒï½äñý¥`Ÿ ¨Åï6Sš <*ŒùåAzö b‡¨ÂMÈ0ªÐ³OpRž}‚ùóH1ÞìÌ1½�CŠÇ�^°l–Í>ÁE-bÁ ‰3!¦•ñ%%+£d;6yiNŒgÚ'8*p6Ñ>CXçO&™¦”êJ¯–2Dé¼z¥±º‘ÃJ²)C )ĪŒ&9‰Wž�îô%„›¸Rرðøþfx´ÐZ@MCzB¬Á·‚�&#)˜½:êIGÄàÇ�j¼šÀ…^•MnwáÀ°ÄM€V9ªÀŽR³µÂ¡xžçUÖŠ€YëfY¶îƲ-XÖŠÆÂ¡, ¨ÛBµ±`.”­@3[_ž56¹iv=î‹q¨cn¾Ù¯~ÍoçÛñý7MÞ»æ×Ì8�猟wÌ_M¹Ùgå‚¡ »(2ƒq˹V¨��%³Í$  +§b}b9• +�DxÏ››ã +5S3ö{6µý|Ë^36ߎ7Çw“çËKŽ?c±Ùûµúî]곺o½o·[—z—gÌÍ<šØ`Qªê_W•‰K^n­3ïss—wwsgÍõXþg¬s×÷u¹ñ1®1[êçg½w‰ï»Õ¸Nîß¿¿ª,·œ[œ;ßÏ7/3Σ‰-·÷m//Ö&Ö8—¼/®1{ßj<±8·¨,ÔvÝÍ¿]›û>w¶ÛšºÄšcŒ¿äØÜÚü}Íkò�ó›Ÿûw¶¹_³—û7Ïxÿ¸«Ê–ÛÄúÍò1/ñh¾-¿ì]ï½qßxÌØò’¾·s]f›e6yÖ¼sSëÏZ_¾Ë~Ë{{çWó3®0»ïÞšçýö7¿W÷ÏY›åø¸fl/ßrŒ{Ö——µÉG^Uv›ýšåÿ-»ùoÞRÆcióΛs<æ·�›Wãï÷˲———»4qþ»ÇüvW˜5;κg¾õ÷]cv¿Ù;ß¹Ì�÷Qg»+J¡ªì_ýó±Ì–ߎËݱ‰»©û¨­išøj]rŒ_�e¶ºÂ¬~­››k3—ãÎVW•Í\ïÒ4ó½æ5θ|žŸ—_ŽÿV[Î÷í¼ßR÷ÍGüö¿ùÏ7.ó5Ç]a¶ól>îåó�ùøoË{_ç›K­¹9–5c÷Ûmò²ÿý¥æ�k¼M3¿.u.{ç½[^êÇ››fÙ{õÛrÿÞ¦ÆߎG�­Æwãçj\a¶k|ï½eÏææ£ùVë/;Îe¹5çcÆ5f³Öû³ij¾,³}s—÷¾ù\ã»Ç]Q!³Òb(ªÓ¹ðRÍ`’t%£°\�ÙgCáX®Ne[¡rÊ…sÉ." 'cIŒ‡-¨ÃiUÍJFhHDDF’$C@  ÅäQ™`d²=�ˆ¥1¡@ +£H ¢(Š�ˆ‚‚2†9†Ø˜qHrt™·)Rï$ìHkœ†0Ýðˆk +A¯½.^nÖL &ªÓŸSiØ‚³í);<¸¬WÁGdbÝ5ÎERΠ×9üGìÜŽ„S©þKp§ˆ§OjFøLð%´²"Ä0ïE�(H4㣌×D3Qj6h±SÃh òíÊÒAÑs}ÍryKC4"ö�Ð͇Ä&w Ú5÷Ù®Nš„®Êñ9Án¹ížkràÎ#·SÁ +죓Ed~§Ê×Ú…ÕZ¤±LÚ˜¶þ€°ð“ü,eŒX]E}(¿9Ç”&�eq÷Uí)“¤€ƒo‘¡¥Ó€D•žÙz½¾…N V#|\ÈH•©¹Ó ”#§mÿ +æ–²AÑt+ôV¦c›}¦%èТh¶pÆè0¢^ÔTºÈõ'çìKü[|ç6šF×Þ‰4.>Ú£ayX²<�p.ºLûuå óœ ›]”~§WÓtq"ž%a•ñ6;ÖꉥŒ•[Êûôp¾àña¹ZM¡GÏ¯Š Ç… dªA•ÌgÌÕÈm6·C8Fò´v<ºK�[ î)!c@¬ª—xÐÇ÷†F<ŒòuN—X"âøèÀ¿ÐC¼ßÔó¬ø›ùÀØF«ÐêT¤ ¯%[©BÆ—¡(ˆzYï[\ˆä»é…Ã.ËF})`e@<LÔ Zz΢xÐj"6À` +ãsaNÆz¹A ây3çÅÄGˆÉz1Q×É—»¢œ‹-ŠË„+–Ƕ€Ñý#É^€Ü4¡èØÞ +‰†é^*AgðCÍ |0ë03°3k�.“ÍÌÀÏX30êF¼{fpJZ3ˆ§òÉÎ èXÍ€~#ÐG”àëL~€6ýÔ?ˆa>€àò˜_SÀÃMÙ“ð¦ŸR�å´?À”&?(ZªÄŸjVûµü`¦ÄS{³h² ƒUH~@Y‹˜M‰–€~BÉ@¥Ì? DòRŽ7 ” Xç,?xøÁ ”„SbÐk“¦Ç!Rs¸@‘+’M“ðС’.Q„I¢rÍBZó²¥JT«‘¸½ +š 8+Ï"8°€ÚDZDt1×<œW,~ØJ ’²òi-Šå¿ÿ™œHŠP'ÊXÇ©ÎT(”Ba¥Ö�0´ÒxșЅ�cZ”»´¹æ:$‘‰|ËbRæÈö6"½srá]ÀɼâÖ‡ÏMÖëyée1P„¥å÷X ÉÆÿ¦‰|oßÑ“�²�„PƲÂ? ±ê{q!ží7KŒŸfPw&,5¾çcqíHb1öâðÕÆùÒ�DŒ¡.O$Þ¤É œ¢Kk¿·)©jîcâöåj;‘;ÛËDµÜŠq‚˜÷¯>Hc�z4ž@þ5ð÷bþf?/>±�'ÌÛìL›�k³Yi, œ °ÎÀ}YRŽœ8þ$‡êT¾4B�T.¯>Ì{O—N&þŠËi”¼jtó¤þÐåå æ]½âžåÄã<Þ6ùÐå%‘ƒ›Ô}ö>˜w†÷Ó:ø¶MÚ8J{þ¨)Ø„”}Z ,{oed4|ûƒ€«¸ìÝ šºsAù.¨@enò{µl1!^wÂKËŠð +>Ká ©$T(�lƒñC"¹½!§a?t‹:öä�çÈ¡]ˆ[€�Ç6[®(‹z_Æ]Ýжñû÷—ÎWÓ¶$^bÉĨ$/fYý˜PÑT‹tèiH„t�<Ú¾÷{ 7x×ù8ÂÏY¤‘lð!£Ñ�òèêƒý‹ªÏЦ´&føQqñ›\��|k…+¼€’ëÎe»…K¤PIY_$›Úďѥ@I–Ðàh±ü¨ÒlSGhÒð8ŽÎÖT‹f‹: ÙÙ­)­ S\”Õ õzÞQ²}jYÞ].F;¼ìƒ`U�{K<$Åyv‰H·~Ü ~šƒ0èÏÆô#·Ø¶GUž&wóJ,Ž•ŒŸ8|[Yh Äù5ÉñJÈB2¸ËO~ïÕ3‚-Ìü�»[‹Ár›3á–ÅC„œ££rUçä®�”8+ <°÷‹ÑÎvN±šáÀ‚®©v‹¶ð5çãnÄ5·ãO‘@Â;ƒ2Ê·°BhP¿&qí0¤R¨@uÐ¥5"­¼î7êÓÂ甈‡Í ´Œß�±DNÝ�ñ=ïaÄ2…±«Ñ¨%ˆ÷gk#ª«/}KßôA(?³Æfß»m”5ö0¾ÊV——Êêý.”;õø)ãà ˜åLÐCvü¥�Ð0ù_¸†Uæ1L�U >Wáç_ËÓPìRþί¾i…AØ‚�à ÝÚq,æÎ 2Šþ¶qû„¿#7®$Ó–a­žR.Ô6ì{c‰p÷N÷ß÷2“I‘Ø!&±ÿŽïÔ†æ{¢¹µ�Ê¢Ô‡´U��*é–/îÙéK _Ä­»Î?L*“¥Šö�Û}!æê|mf½/>w”AâãT <êþ' <Á³&0jõLÛ»Ò6¶ƒˆzÉË�Ö‹¨Úа3Ú.üñ8™þÓÔŸ•ȗΤˆYî:—±ºAfŒ´ˆÞ´ (á· OHp*ú· GÓ!#$±í“³<ûÖä­ÿˆ™«ÿú)M¾�ñ<ËMTgÏ!Å«ÔîíIp1ßBcʵKüè�(E¦²-ÑŠÈ$¢Èx€Š“¬(‚–|Bà¹e—˜»[1Any$ZÚ^Qóg>EÆnÃþõûcÓ¿Ù�Õ´T¤Õ‹8 &¡kW•àmq2;#x;ûèÎofº»'™JXˆf´ŠÔgQŒ~”Í#¶î±e@Å:Þë ‹m&á5°”8¶� +é¬ðÂòÃÐS˜›àmssÔÝ=• Îù +Ìä‰"GŒ;Šæè0Q–“EKÛQJänÎ^–àH0‰ +aæžB¯Û±âÒÝ›áÝJ¡~µì¾én�áÝa½c4L^î~lïÙÞÜ>éë- ˆÐ/Z€Ì>qt§8jÛ_H 7Úþ³%á›Ëí]qáÿB@Ô…ÛìïÑv£~4�tܱ9?Z‚< ½Â–ÚfßžW‚&'2‹|nO±­0OÂ÷ÈŠ#CŠÖöH8ÔŽÕûÏbÊM€Fu½¬ÚnyP#G1<0®…¶»mGSùQÔ6SÜ~mÇù~)-�Ûà¡KUxî ¶Ÿö†Û[e„Ov–¿!JÖ iÞYþ4Â�Ëã%˜øu#³W 4#ÇVê�Η¨Õ¡-ñ „ÅÙI±1vž:ùÈ;?$쥆µð® +�‘Avh„lm.[ÖΨˆÖ*=,× + +翉1…¥RvŸGt©ò‚Ÿ'J™úèpAÙä[™¯õì>Ïî)êb„a‹ÛŽ%ù&Âè%jg‚Ö]9b…aØÂ™Ë›¼³ æ� Ɇ�¶œÁLÿ™'M�íA8�n²OÝò‡ãiæðcåt(‚#´nPa"ÄÅày .{°ñô¤Ä¨!'×q;bÝ +ÕÍPe3ª]k%¸›Z �#õAí2X䚟" 6ò&ÚQ´M‡lâ R{•Z�Y$ 8IÝÍ€%‹ëSd¡lÖ�+Ô¥À—´¹v|òÛ£Û1 ¼´�úHì¸\•6¯-Ý®ŽŒ¾™^ÿêÖŠz¨jóˆ§sŸZO=³J€ãSÏÜ{¹ûÞ��ËŠÉnQâ¾4«ÍØÕ�æ€S!BŽúí{VQâRHF­‚ÇÞÿÛ? m¹JÛ?oHUç~Ë;Q’R)¥:¥qhÔšº€:ÁK*Ùÿ ¿h°.ái/rÁßD9o0:«E!Tí%bPäI:·€ºÅY©­ÐížË°}~»ÝÇ|!+}ŒÅö:Êß½,P p ½XÑÜþ¹ í×ÖÁ=ÆÊøs#Hæ| ä™w|&˜ù×e=j¿VÐæ…ýY¤Ý7LpX=ÕjOQ×¶Ö±ßíxâ€ùÕžÐU|ÿÐqâp2 4ú«P¹X +£R¬\“1‹>÷pÄŽ‰Ž!Eš^·áîîz·cɸ ´ý¹‰ÐÏKÍgi|pãäEÒÐ(ÆÐì�°�ò„ŽR¦Þx|Ô@ç€4hþ E/D�è˜e•ô¼Sõ2a!<0¡Ú¾<2²´½=ÖŽÇ|l,_ï:Ñ22S¹tWÝ‹.a€@çI3½ ït" AîÕ0W'ø±¾#Ï­…t1€nÝvODñÕo‚sðÌ©q½¢RI·$íÜkpQ€¯p9 @ã À™%}œ¤+º dü}˜Ò§æº^S0 ’DtÝ|«Yª©guFNHYÁºüYïר¥óìQ«É5NNá¯ê#w¶�ŠÝ^ñ�¨¹.|É!œø ÿã.]`¨WPzw“É+¹Ê_Â?E»¸Ì¾§:`äžEKæ&ûn>¯Ì–l\›ªÉÞT4[§s(`þ!ÛX© Ûj»zÌ6á ;`ƵIíã6DöçÁö»¢O7ÿ¸Ìsv–ê0ïHHÁ>y qT .49C&*µ"l5¯HmK +È%. ^bs£�/ª�Á­mí@„ÝŽUõ;aÓ~çb'Ñ[o+»=>MѪ©‹kÈ�ä9Í ›æá2ô³s�úP#퓼ÿ@žVšluýÏÛ¾%­q)Ÿ„nŠ“]æ¬\hÚK%ˆïÕüEª7àjÅM +üC‚hôÎÞ7˜j‚ÎlC‚`1£Ü]þp$ã{g•rÆ.«aµýΫ‘«é68õÊá¤{®VòzdD)½•tÓ‹h,º¬ï@ë3.�¬p½Ú£M3ÏÕ„5$èIÐÌÕJ1" _žL _™Á/ÍÀ©>êëýúë ìçp.Ùí¥E\�RD”É–¬¹š½'fá£q¼ Ìü“ŒvÕÒ{lL›¨÷»PÐQõ´f¡uÖf€€xʼnðš­äCÐumÙœ6ºªªŸU•%¹%ƒ¸TsPÕãÜEUYÓ2õ4öUå]=8¼Ê9vR=òºÊÃCÕƒ{@Y3U’gB‹þöÉR˜7Ûjù­]µæ?‚C¾)H0D}tXõîÛU­w¹ª¢5vCYv'ðÌb›w_xdòw¢S�àžÂ L‹É î.™½lk͈6Èç³þ(bD]±*vÒ“ÙLSk© ínØ ˆEßEuÉÿ†MBas©^m=GZÐþ7±öuÞtÙóF”k\›6€.…X�VM +òù¡ ìHÓ&å£â¼‰áë82“bO�Ð�3»·i`ƼÛC©Ÿð®ôï?Ù‹·�õS¡(¬RÜ„ÕÜŠ gOhýN!Æòö\]Ã7NWˆµMÃεŠ-Í3²Ú%‡Mj§<‘*Ðz{3NÂ} #ø o³0ˆá¢Ý~µ¢ï]©$xª öiά`²pqOŇéE¨{S]^Jx@«†Y¡0·¯TÚ7©Ö//´9†þ/÷| ÏšX)cb o�-ùœIJß§ ýî„iÿ­9B¬ãË»‹ØøC’Èô»V þTûq›ºÒyËfå:†ÅŸ×ÉÆ< h2ÒÈ¥;ÊAq2�.3lè&Ɉ–(¶A|¾ÝÞ+ +—7jWb•á0r‚M'GŒ`ãQéy­¸Ñžqë€Aj*[xíoUXÌ¿­�Tͬ`Ž—x•¹uÀʵB3p¸&©ûwÉI²Z>åtãÕÊ| Ø`ùŒ@ªÊÎd} êõg2ø@³Ê +–dDI™’(£hê1ÝL„D*6MU³ù̯Ï�#ÿ.¥ÈHϼ÷$Äô°¨:]Þñ1¦Ãí-L+$£–j)T¼"�E–‚‹X$xm<ðˆDBW­š¯Ãg¬‡+}h†Œ°´–Áb‘Â0v‹pB¬ÑÂ'wmci¨ˆ83“¢ƒŒcIü¢]¬|·(Å+™�×§äCKšr1ÌÈ£ÌÑ"võM‰í†@›ë¨Дë5H�é2&1¢½ ÕH–‹ÂrÃÉ l.o&Сz',xiØå ‚0§š¢X€Y �¡§•C¨Äw‰>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 28 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 24 0 obj <> endobj 39 0 obj [/View/Design] endobj 40 0 obj <>>> endobj 27 0 obj <> endobj 5 0 obj <> endobj 21 0 obj [/View/Design] endobj 22 0 obj <>>> endobj 25 0 obj [24 0 R] endobj 41 0 obj <> endobj xref +0 42 +0000000004 65535 f +0000000016 00000 n +0000000159 00000 n +0000015696 00000 n +0000000000 00000 f +0000054183 00000 n +0000000000 00000 f +0000015747 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000054253 00000 n +0000054284 00000 n +0000000000 00000 f +0000053883 00000 n +0000054369 00000 n +0000016117 00000 n +0000054070 00000 n +0000053377 00000 n +0000016667 00000 n +0000016847 00000 n +0000052803 00000 n +0000016921 00000 n +0000017065 00000 n +0000018522 00000 n +0000052851 00000 n +0000053523 00000 n +0000053643 00000 n +0000053763 00000 n +0000053954 00000 n +0000053985 00000 n +0000054394 00000 n +trailer <<297950A0A6D547F38832BF77D56E8824>]>> startxref 54583 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/info.plist new file mode 100644 index 0000000..0b1395f --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/notallowed/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 5 + hoty + 5 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/cursor.pdf new file mode 100644 index 0000000..c2825ca --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/cursor.pdf @@ -0,0 +1,627 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 20 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + openhand.cursor.solarium.02 + + + Adobe Illustrator 29.3 (Macintosh) + 2025-02-20T09:25:37-08:00 + 2025-07-10T15:39:03-07:00 + 2025-07-10T15:39:03-07:00 + + + + 228 + 256 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADkAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FWK/mP+ZPln8v/AC8+ta7MQpJjs7SPea4lpURxr+tjsO+KvjH8w/8AnJz8zPNtzLHZ 3z+XtIJIisdOdo5OJ/37cDjK5p1pxX/JxV5Rc3VzdTNNcyvPM+7SSMXYn3LVOKphonmnzNoMyz6L qt3psqkENazyQ1I8QhAPyOKvof8AKH/nL3U4Lu30f8wytzYvRE16JOM0XYG4jjHGRPFlUMP8rFX1 rb3EFxBHcW8iywTKskUqEMrIwqrKRsQQdsVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX 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 + + + + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + xmp.did:e03ed205-609d-4e56-b982-2098b2888f20 + uuid:b5af39cb-38de-5348-9b33-3337f260a015 + proof:pdf + + + + converted + from application/pdf to <unknown> + + + saved + xmp.iid:D07F11740720681191099C3B601C4548 + 2008-04-17T14:19:10+05:30 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/pdf to <unknown> + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FC7F117407206811B628E3BF27C8C41B + 2008-05-22T14:51:08-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FD7F117407206811B628E3BF27C8C41B + 2008-05-22T15:15:38-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 + 2008-05-28T17:07:17-07:00 + Adobe Illustrator CS4 + + + / + + + + + saved + xmp.iid:01801174072068119457EEAE3A61196F + 2010-02-08T20:38:51-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:e03ed205-609d-4e56-b982-2098b2888f20 + 2025-02-20T09:25:36-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + + uuid:4bf8121c-2cf2-b840-890b-91acafa933e7 + xmp.did:906b3a2c-8a21-4be6-adea-fbf679e97908 + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + Basic RGB + Adobe Illustrator + 1 + False + False + + 0.444444 + 0.444444 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>>>/Thumb 24 0 R/TrimBox[0.0 0.0 32.0 32.0]/Type/Page/PieceInfo<>>> endobj 22 0 obj <>stream +H‰\WKŽd¹ Üç)Þòµ(Q¹uÏÀ«�axá4ìÙT˜ñýG•Y£ºQ/J”Äo�úö·ï×·ß¾·ë/¿|¿<Ú5:ÿ=ñÿÏ=þyýçaþüýñí¯ÿh×ïÿ}üØðƒ?¯{„ŵîh{]?~>ø÷Ÿ�g»s |>íÞ±¯vÛŠëÙï9À3¯�ç¸{NÀ€(@⻇çõô{.»ú݆QpÞ6W® `�y�{ú¾žënë‚ôÔ�gô+ï¾üúx<ã6€«Í‹ '@Ò¸¸›åeíî@Ú)<'D÷½p;Ð']ke%Û›p ¶§ÐT'½¿d×½w|Y]uköEäKk1�l7á [i˜I‡iN›cêÜÞ6e&Î šyÐP‡{ PNö»Å h]`R°E¯}Í:á<ç·›¾qOE&üËZÀÉ›žÆ÷æ§Y/±íºw¸–Œ÷vxK+àcÖ½'ùí�ô¥€;€v¸‰� –ŒŒÚéðší]«a«”ÞBû(=R0¤@”d”npêAõ°/«ÊêT‚V÷­EÉ~o-y,æïjº¡Ã~f3œ+b+€vûd†Ñ'„#%¼÷¸à;cYtäô€!‰Vy)A}PTØúdR^÷3žÈ¦E¡�¦Â8u…Bâ6ØÑ`@×™Ó$)èp2®³Qª¬€škK0a0Œ0jm”ÇüÜ’í‘(G‹`n|�<‡ð6ø‰ mb%Êó ø6^ß?ã6_ŸK½ÔH ÂCJ  +˜Yƒ(G¯«*¿m�©º@zÔZû=¦"É”ÇÊv2gèDo´²;ó9Ç +G¨]ÂMe»ccµ}_¤!-xçm¸y8'×%hÚ¾7Õ/@¹ûs-è©!*€EµÉè5@ÔqB�µ‚DLÇÙ‹-meÂÙŽ}wO]»z$ò&"ƒ8¯“/Y>¹Ç¿$´2qýr)aؽà覟�?þþ¨o4‚/ „ê>®€ ˆÄ» ß:™>HŽ0‚‰`i<U€K¥"“cÉ1€ÈA2 Tâš‹,©S¹ê³ò‹VŽÄÒäWGÖ" ;¿G«Ã�UȪ@’i­ƒó¬Ø ‘ ¬ü‹Ó¤_+:gî ³yª4)r@“€$VSwcG(’mªo|Wy6c,sªŽÉÈ ˜@ZY§âÇd “t÷¯!òMU¿ëžé%¸:‰™ „%N}¶Ä–Ħս�Aíê¬Òu)‡.iE¡CYRÚ2£ÛÑ£U¶O²-»¶ÒGSÅU‰«š-iëF%=³Jù%ëH‰ç1c«;ÝIvf»**„\YßD? Õ´jOu6Q®]ØO@Ûgùö¥ãQÛF5DÜ ÀžQÝ‘œÝkÅ^|Îø0%"y™Ã¹¹¹BRW‹hòèªÈØB«Õ?Aš½eO–Ê£'oõ(31(Ɉ�†™‡¦–gï`ɺ¢ +4éb¯9žÝo$ÙÜû½Šã}¼w’Þì˹øx߉ï5ßúTÚJ’FF LX}üt9¾iÓòõÎ.6l§Ý4nÄÌã_6öìŸÎa¾}ЇœÍŽGЍ™ +ìdº€ `3΋}œÔÎ8GÏ’&æëjDÄ«xÒX9`Ê¡ôàõ'áɺ¨Á­•¬’{k–"ÊòŠŠgiNUŠÛµ¸+c]Ãaôº£É,Ú¶:•Mý–d“²d¯£=¼Üvé¾QÀ³ +˜tªÃÌ#“­gŸ‰³¥H[ºôEßC€ž* ¹5ÆçÓ€.å|<¢ÆRŒ¿�k¼…ƒ1ìB›¤BT1E“Lw‚Ü9X~Ò¬(�Á‹ ™U�œMáf ÊV`gWØZb^‡˜ã):Õ’ù¤“BtòÅ'�t’ƒ’m—¤‰‚C/÷m?å*Å )�0Ô,â“_h#óõPnBjËžá^Ö*ŸföëPRQDK�(eIú䯪*�qÃú«Œ*J£ÌY­Îø¬ÖX½•Ù¦“СRYí‡CQ̰ÄõfJ¦œÅŠâÚ�K2èCörÈEv‘X'ÓvÙ¸Õe…œñª1BØÞ®î¢è¨¢Ã±¡@g=7€7Úbêr¢‰Æ™J"¦Lj²,ÙFÈÂa¬ç"ÈBŽÈÅ+E,´ÊtBnqÍyfªåä]i�Ê·¬ǯI#¦ÀS¤ÄÃWZ#NKú¨,ßWK‰‰’‹“+»²œT^oتYµiùŒ+«¬ÎO°!‡-MÃçz»²J•O†"²¢�W79 8êØ�CÌ+“QOKÄþ²Â¼¸\|¢a�l,4CíãõÜíõ¬">«7°ð.4+K0õOõŠAçò�©#9#ð�ÙÕª3eGÑ) heÍC\¼L²mç)�õž£>ÄâìXÿ�ß�ñ`×/¶“1ÁV\�C�ÀQ=f�É~ª¯�õ8ôƒ^�±�:#}þZES÷Ú ×ó‘V/Æn§ÿ³lõh“,3†y£ñêì£Nâ #½+ÞÔQ¸U“ðvžxY½Ug[ͬõdeõW§÷¹ÎHTQ^Q£\ÍìÏ3¾½:«kØ„9± „‚±¢­ÕèKpg¾:}Ó8Ccœ“,ùŒã™2‡ƒs½.xð]  ©EE õhšGYÐÓ4F*3ùŠ ÐI�Ñ®– ‡¨N¬¦ë©Ž=ôd¯!>çZµ²ë1 «™SõP„ô4=÷%¦«W£'¸ ç &Ô�� +N%ïñT��‚ï–cÓ°:T÷Ö4òÞí¼1Üõq£OXg Çeò´Lç”›¯yÝ5¼'{«& CR³"G”ƒjŸ«¨Å¡-ŒÎWâ¯'Ö¯¿}¿ðëÿÿÿÿ— +²2 endstream endobj 24 0 obj <>stream +8;Xq'^i5hFMLi]gzs8N'!!<<'$!%;4Y$N~> endstream endobj 25 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.3.0 %%For: (Roxane Gataud) () %%Title: (cursor.pdf) %%CreationDate: 7/10/25 15:39 %%Canvassize: 16383 %%BoundingBox: 7 6 24 25 %%HiResBoundingBox: 7.79084889481692 6.2265625 23.7777963033532 24.33251953125 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 146 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 32 32 %AI3_TemplateBox: 15.5 16.5 15.5 16.5 %AI3_TileBox: -272 -340 304 394 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -441.96721945693 365.883638958079 1.87331710196483 0 8153.34246344519 8074.85859114418 1698 986 26 0 0 6 59 0 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -441.96721945693 365.883638958079 1.87331710196483 1698 986 26 0 0 6 59 0 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-596 -380 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 29 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXÜ.*EG¦$�D¤ùïñ1·Œ=à@A ¨ª"0ÄlLu½¾‡ +€ å x +ˆ +1\c,Ñg×-f½1ýZò˜�Ç2š9A[x|ÑÌ úz1ZÞjk ×*™þ|Z¢¤½b2_ù*¶”f)¶Xr,¡ëä»–üX­Îs¬úØUß9žwæ9ÖNPBcÑò�w>-ѽî™ñÊó«É9ýŽ�yŽUP@œk1-Ïy¬^ÅÕkgÈ‘üà*¶¤±=Àã5ßK1Çå•EËÄ2¨—aÞ‘é'_ÅPÇ|[üg�ƪ·ÍW±E ]²Ã_­2^Eqô¸Ë7K ¢ãûµqú½ó›Sq|³èZÎß9ö’qíŽí×ÖL8¾µ¯Ýõ\«4ø~ëT~¿šYþð‹ñœÒâü�k\fiy¬v©jÚ¥Áš÷”£Õy Õ&(BsÀ¯�ÐFÐ…¿¯ž×6.Ïo¿çZz² ƒÈo.ì– ˆ=ÍÃt­Š;aIz’´k�Iâ9-ßö¨µ8Àãñm—d÷`Xªèw~SZÆçø{w�ӵ̊oM@<Û¯Z¥Ùò¬Òîx¥u?AÚ\×é§ù8€œ¿sÜ»ÈÐú€¸‚ç1Ž£ñœzó»¶°_®’W„æˆó7ï ÈåYNɸ ºëznY´ÜÂeúi¢è¿÷É¿åV@ Ó“œž|ZÕy^§-–ÌùaXjßôå‰ËZ"§ã\;ϱš¯bË –o÷Äe9-ךù�9ŸFz°ÔÀo–¦éyÑ$Ü/]˹Jnh߉ËÞü]M˜fOáŽË–T“©4Y€(¥‰ó<ž_ L³m¯Ÿ–9¾ i^óG¤õ Öz‰@»hÝkh^+кFÑz6@¤õ q´ž½¢ŒÖãÙ~É�/[hñëÅ|Z¢”ϱw¯ˆ¬¡ÑÔtåËðx�wò5»¿Ö5�Ȉ ¦YOK|-U¬öh_âŽá;£Ý1ë¥ß‹Óìšfxê{†§'.ë¤'NëÝk]ÔFÍk_ëâ/½ïâ'ÅÐwÓëZèhúßÉÑ {ù½9z‚¡éMrôºföÑ4;ùEÿI3$½ždwzâ´0ëÝ÷ßÁv±��ìe7;ÚÓ®öµ³½íY÷ÞúЋ~ô¤/½éQŸzÕ¯žõ­ïßÿÿÁ~ñ�Ÿüå7?úÓ¯þõ³¿ýôàA0EpI0+ADÁTÁdÁ졆a(†cH†eh†h˜†j¸†l؆]ôâA1EqI±MSQW‘[1ë£ÿŽá(ŽãHŽåhŽè˜Žê¸ŽìØŽ�ôä'A2$Er$I²$M%SR%W’%[²—¾ü%X†¥XŽ%Yfei–h™–j¹–lÙ–Ýôæ7A34Es4I³4M5SS5W“5[³£ý(ˆ†¨ˆŽ(‰–¨‰¢hŠªèŠ²h‹f=õéOÁ4LÅtLÉ´LÍMÓTM×”MÛ´«^ý*¨†ª¨Ž*©–ª©¢jªªêª²j«öÕ¯×p×q%׬\Í]ÓU]ו]Ûµ³žý,Ȇ¬ÈŽ,É–¬É¢lʪìʲlËöÖ·¿Û°Û±%Û²5[´M[µ][¶mÛ‘Ù�YÏv¶]Ùu]Õ5]ÑÕ\Ëu\Å5 Wpõk_YuUU5UQÕTIuTCõ«]eÓ5MS3%S1SŸ¶èЦ¨‰Žhˆ~´£¬©š¦Iš¢ šÝdKµÌÌ’,Å,{É’*i’$)’ éÉv\Çt4GrGpôc‹†"¸†êŠ,˜­`:‚bûÙò“Ÿõk†’} Áï³-¿oMvUIÑ›�%3–Ç¿†^lÃV Á0û!ûWó—>û«Šf(ZŽmͬ]MÕTÍ4˲,Ëlô+™‰­ÈŠ«¨Šª)–" Šl¸þ0CG0ôêOËðƒÿ³Y*²}Eǰƒ¾÷3kÙUM³5K2ÓQ ÁïÓžö4ëi‹¶(‹²èŠ®èŠª¨Š¦hЦ(Š¢(Ššh‰–(‰’(‰ŽèˆŠ¨ˆ†hˆ‚(ˆ~ô£õhG[“5Y“5W3[MÕLMÔDMÓ,ÍÒ$ÍÑMÑ MÐüæ7½ÙͶlK¶\KµLK´D˲$K²K±˰Ë_þÒ—½lI–ÌVR%S%M²$Ir$E2$Aò“žìd'Û‘×QÓͱÉqÃÿèÇ>²â*¦"*–b)Ž¢(†"(f_ìb²áªa¢a’áŠa‚¡{Ø‚,¸‚*˜‚&X‚$8‚"‚ øÁ¶ŸýëO?úÑo~ò�_üYøÁïÿý·~õªW}êQoúÒ“~ô¡=è¿÷¾û¶³]íiG»ÙÍ^v²�]ìb;Ø÷½gA§Ú׺–%X¿^šþ ´FNÇ2üÞ.�jžÁ;Z"¶ßVGƒéXm¿j5ÎåXG»c˜–W­üÕˆò˜~gMN˯å~éwŽÈ¦ã9ÕZä\Ûø«ä–ýÞ,yž_5¿ÑüF[ù«¡3w�Ë0«Ñ<%[ZB£kyEO´–*ˆY0«Íuí™ëÚ£µðØ�jwœç¯*Îñ�xVÉùýj^¸<ש׀Ž]Ïqš}Ýõ*^ZB‹ïwn¶üz-Á¢eÕ{{4„–ÈUqA*£Áqò]窄Èê=±cõíÒ2+6kN%&cÑrNË·†®1';–ÇV=×·†ã2<§ã׫Vašå¸¬sñz¿¨§OÇyþÎí})ú‘4Íoöozß{éu­{X¾ÝÙK�¡�¦ÈhÐ2K¾31ëÕp$± áøÓ,qþÒwœÏè‰ô”˼)jãøµ±4µÒ½Vú0ôÞK±ôB²—šéÅ0Çð‡ Š¾Ôº–áhúîI‚déyÍ${)š%8‚eé‰#¨�æ(†¦ÿähz> Z#–Aµ‡ŽíÌ©{-ü�œu +pZɧœŽsºVO´ÌŠÓéñ;ðZ^1L™Çæ�9y̺_�ç6¿Ñ“8Çp}1'(—y­ϯª³î×r +ÿÍeúsÇsŒÓ{vò�é£5ˆåqh‚ZØA­‡ Cûäg̲è�^=ÑÇù;Û¯ØóA탸ë~_v}'Jt-ˬ˜C€èZ#u9—u­�³h9ÏãNÌz_“9A¹LkĬÿœÀ ÊecèµÆ§^1 <˱ôôýõZþ¾îº�g¹=‰”Ë\ªwN5êyŽGÚ›Ó1ë½hô;@Õø]ϵŠã±ª¾59¿bªzõ hzñƒ ~íƒ"vp4I’$=ðkâÅñoÔ¾9ú24Ë2,»IzxÌ‘%—‰_ ¿6j¤ÖP§,Z†éX�r\–àèµF€ŒãoúU9.3Á†è5ñݤֈów¥k9±‚mï®ñ;¦Bh�xÎeÇe „–€coþºZL¿jBkÜu zæ×t-ãw :•”ã²î…_Kpw�¿wŽÇæy¢i�»ÎßøV9.Óº2âT £ŒŽfã¼ô-9 +†ÚqYפDœ€ @z„ˆ¤ä2?:8…@mœ‡Ç¦Œ[¼´ ¸PÎ %%þy\–S'ò»¸Ÿ^1SÂAÈ,¾î%"á0%ÎeŠ‚ÆÆïo˜øQúW‚'Y°ˆY“ðKl„,¦Ä¹ìæ<~#6�ºUpßÜ&`±| ÇCñ $eL˜›8}Éâ¨Ó½:tVÉeš�Ñä -9¾‘O+Ý(Ü‘2³(IYŒ�—‡¥pCº”n.#Í.é # +µ”ð38B¸%ÎeˆËš(Ý"ÜϹtKÃV²pÒ]‡¸s)�ú¹ìkK|² ÝÜ1� 8<´I4T +F>Ëß…ñµŠ2ØT|'Õš ©'¤¸ qù(Ó#^±¢ðü}Úºw+LG�ê\æèZ +{ÐeeìbÔ°&DM¦!�Ž�©›$Êan¸$¶&/¸ R¥ +LTB(T[A<Á ðÃ&!�[ô2À¹ÌôX t¹Dº†à@ ¡ÆÀ¯:—m_Š @ŒŒTÐB̆LËç2Æ7Àýd Þ�a´œ¨OÜ|ð>¶¨K¸¬õab�œwIàZ:y¬Â‘ —­*•Dgâé!âñt� ¼ï°º–¡; ^:"cípÙ]{^eàP�­Z,Š#Ÿt2s¦›&ªLgÂûæ²”‰½”„±táqç(~¯^\VƒT(ØÒmÒ÷’†$ÌÕ}ÜÁñ@�vK¢è„_͉¥sÙ9À¦P…G|0bé�NÇAåÆí­‘óy©É!ÂpA¨…Û_v~a¤È5ç"g¸†Í‘”Ú^z$nº@ñÏs­é¦ÒvL‚CF8�éfÛG³+b@ˆ`ŒFFÛñˆîíH mž¥à^'üzûaÙ¾q›`»f$_Rgw«”¤#bñ<;»¢6 + —¡0¡½he"EëB +ŠÖá 9ÏÆì踌ö¸“8…¢à¡b·Ÿ¾NøuÊCâè> â<|s醗 xêjgæñôÆ —ߌ•‰_€9hú²]ÿQ–G7¢RÎ+yQÄóкH¬w­³+ž�M e [7 ·²n  +¯Â>N`¾TbEYÙLXK�‡8¸¬S�´¼I7;YÄ„5±b‰ˆ„‚’ôÂÈDüÎø(¥·!`¾ìþDj†€÷‘×v½­ºq‡ÕJ·C©š1âˆÞÏQ_­ïƒC�p™Ë5Wkš{  cSñp“P7‘•†­³Þ CÕmOÕmelOÕmªëì¶¼7›¢ã²Oí ž‚Öbë0JÆ–ÿû&¸D_§ITáUôÑzFíÀÚH7 +êÖ HÊ7+ +Æ^ ©Çyß\–r"ô¾¤šÈ¥±j"ÝF€F]…ø.¯¾|tn¡.{ÎtLw³<— ¬, Gf†�ÄqÃö}(Ûí6‹è²ØPàìrÖÅÆš@‹�¼Éµ°À§Å6lºm  µØ¸¬î�ƒ‚¤¹ '×ÂV�0‰íÁz c¶EæaØT§Å–iÿb#>Æö]ÑP’þ¢ˆg‡ ä_DB<­ +%he•|¢�b¹¬këŠn.¨4Uš]ú=ï[�O’îD6‘„bÔ�‚-F*C +Ò�¥çØå#\V- °H>8 Á/}-¶LAk±5%cã´[k-6u–[ì’[kä<ºßØ„ÿÒ}],a½¬¯úšø…‡p Jo(·y”-Ïeyæ"£õ>ÎØ4ýV݈Ïî`ˆ¬[C`à5Œ%X¦`AAbž‘Žî'* ]«xvëÈ÷Ã¥ûú—A:%ž—-´®Uñ*–“‰ÚA?­¡e¹€Øãýuäøkiå¯ÍŠñ‹–Ô—x–[!û¥;´l�éW«Wô$USü<×*/UôwNÙ² ¯cüŽÄ·—ª æ×KÕ1‹~ï˜õÊ«†j9-ÇxÌ{©º Óò¼Šá[e¿ó˜S/ç|«äx¿å˜õÚ©œ®U½^ÝvjŽij‡Û«U ÇñœÊåV�Tã¿öA¯!î÷2à�m\^½Œ×œÚ3Ç0WÅsÜAñ +A±ì!šcizb+‡eð`'ESìÞ+}kÀ€T¬ºcuG%Ï€Ó5 Ç.U={9•Ç�û °xÕ9S}~¿N8m@hàôüðæïÏöëÅy,%ßyþÞð,·T<�;ñœzåû àßü…ß<~½÷�~¹ù c¸¦1\ÓóK£D½þÈIQkijƒãBç<ž¥/±M!°Š +RƒN8ÕL@`>s0à\-Åíh¸tv”�ˆ3(6Ö@ Äe‘•‰‘d$°Ì8äÿ¾sNøõÛ@pDyŠÝ ÚÇnGMÂï�½ï{ƒ¸ úA¢zrN}%2™zf�*õÄg1Ð F¨Ç&PŸóê«þé yâé\f‚—NoÅs¦³V/K?a&–Î07n·ÈuÛ×M¥í FÛ¿–íµKöt#ŽC 3a§£C ÞÖ’˜ªð‡ÍБ¸í~5žŽË:¡Ò£�ü‹È‚½7qi”^p(=ÿ˜8ßA$À³Àäúít`P�E@®-½_Ðb1cœùºíQ’ËÌ¡òL:� —… ¡P(*ă׫áÀ¯~àa$—pÈì‘{ªöȵG]J0>ß…sÏF1À]õqAÜã‚Ø‹ âÞÁTì +GyQñþº¨‚JD ¶K, pÿG ‰Í…5 $Ní�ªðs¬í�UøÁᎠ +�`Œ^ '²) IÙUð{(b÷ßÎÎ�`X¸#ôè–¡î3Ýãé⎓D·L�J·ãbÂKKºå×€ÖÒý%Ü᱉€ni9c¤»»Ûÿàpd"¾[~´¡@õÂm0‰M E"â8º]w,¸¨èsq„ĬÚþ_'HgÆ´íÞÛD¶"Q´D—Ãvß@ÅîÍ(œ ˆDK¼dTŽŽs�bwÊy%†‚i=•³.¶Öuv›?|ŒÍaR,‹”X„ÁÂ>÷ŒÀ"­‚EAô-¬¿`P¹|]ç$F^‰ƒvêç2 ࡇ/´|žúyê +ÄSîh$ⲑ¨ñ”ë=u•¸O®ˆ£‡�h¬BDcÕ�U‰<ßa¤nàWÝÙ#{äžöÈ�Dªªz°ÃJê] rkP ú¨\Ì‚*¼ªºð¸':ºCwèÝé:�Ž¡‹ $]}ãþ2NïKSi R…‚Ëb˜Y)fŒQ|ÅC@Ê‹RñÛ,€8Å2ø™ÃüÌ=Hî=~æ$*¿ï Ó¥~vãÇỦÇá§œw¡yþ¥ý©ú§N.cM¬ÇšX›!±dM‘Øýµá ùëJ €4% Q÷‹�§n ãØ¡ê‡ùª /¢p HbMÈ( ŸOß@‰´P˜vù`�TŒTP,êWXŽÊ#p ‰õ)žú¢ªðß»ðøsáq¯A®'ÁXtŠÄé=œÞ¸WìûÄ} [Å®$6� +ù�€›¤VìŒQ(/ +3 £x")/ +¢QAÊK£xHþ …–UŸ$D.›´ðÒw­-1 rĤ Á" /…—¾(au äãçw¥˜(ý^¤‘?.ó" $ß gþÁöUdÞ^ŒXËšF$Öo ÖÄ*Nëgà²UÁe\Æe\Vâ2.ã²?¢A€¨Æ >l ù¨Ë�i"x*£ E>[¨<1q¾Í¢0F¸läyHtqj¿Þ�"—�<•á©+ÑX�‡¯zˆÆªß'W$‰D¢SG4D .‹ 0Œ¥¯WO¢Á;ð«�h‘@Ù+‰õ}%±þóÖ•Äzõ°í‘=rí‘{‚¸ìã2�Ë.<À㨸«ˆ…î0qzc0qzãøÒ¸'—uDQGä¡$]}i\�{VF.«pX± ˆÆ6 ¡«ôÜ)¯.¤¼(é(¯Q é(^ /ýIA¢…—~Êy'1™¬ÞPñ3§;î)aIX(ÓG}oú¨ƒEég7÷ì$wéúwéú÷wa.#´‡?0]©ÇÁ°¹¥kãÂNæó8|»t�ì§`ª},Èš„‚’¬Š•@±à-ªðŠØç2.«/‹¿ bí �’P…O_Ø)±ëÂïŸÆ± 46�Å&ÀeÒ„dºË5…;\k¤Ð’£ûÉaaé–%vCp‘nù;­SéöŸK¸t¸ÃlüAø1”_bB¢«6}ÊW‘æ¶´�J›—Íî{‘3œ¤ñ®�ß�îÂp+¶>7ÄÛ�i¢VLÈF�@¥í¾  Œ#xQô¶î“ä�ŠÝœQXoœ¢%z»E‰°%šqyù\õãO†ÆŸ[ÇZl!κؼ£¢ØNŒ’±Y\g·qY§ µØÈ±å¥ôg + ©ò�¦ÙXʯŒ›â£�Ó·-&ÎG:�dT” +}"ßÁ�‚ŠSûu{Ôá©‘È5ÏÎ0¥ŸË¢±@4ï/ƒ7» ^¯^¯w¼—Á;ð«#¹$÷ Á,ƒ·s¹l;¬@.³Gî �D Ñ„ÄzØaհêw.<îÙ£«[ßç1¨Â«  �kP kÐG”Q…?pÙ÷ pW="‘Gäšg"á1]B�H $]õ§7î\öÒ¸{¾4îÙ)(IWñ:=P’~·M’UBî³mӨ؉ÇR±Î `ÊyÁŠ­Ø¸Ì5 H'ÂÌÈe`Œâ!]ÆP˜yñ€  o@¡¼ ƒF)//_.ƒ‘ܳ›D:¿…·©Âç+ÒmÔDvèòÒŸL9^úÙ¤ A ñÒç2ö=À}RÀÀÏÖø'ï$J?ÇRq@ +Qa�N2p‰Ò/Sg'ùn¥væ‹pÑX‰`‡Uwa×<]Äýszãî +®Çá(æ@ú]‘zl¦ëK…×»0—¹x�v_t—.XˆÚd¸O’nøh4»³ý!|ÎË!p°´œÄeº¼|F)²@ÂÙ�˜ÏìèšÇá ˜á¡b7;@>‘zÈá¢I„÷= +�ðë‹AþÂ:8nI¢V=ä_Dãv�5fØ¥§ÓAÖ%&¬!Ê—ª\æ]«ç!%…ƒ~:-ø  H„eZuCM¸ ƒìòÅ^×OÊÖ'Bè@MOwÛ‘X�Ú8!˜<Übn8x}‹`”ÞìWo"Dbg¾ŽùÌŽbQkÄóU„" +.sÕ°˜ÂK¿¸°7á}½³L®GÄ™¯“é+ñ§V´üÁlkÑ0z�å6˜&CIBƒ +f;�î¯Ú�Õ’æ_¤ô(˜íiñ´™’RR >ç}w—Y3¬�@Ø@ä/Ï÷…ˆ*¼"¢Ù>Ðä9î×q/ýu¡T ˆ<»#žÝ×°]¯HÇÀˆgÇðL®Ç(®)ª \æ3ç×{-@Y»j/|E<;H%%öor~Æy>"rÚœºðŠ +Šî ;ó³CT8÷IijðL®÷`fŒHijë QúI —u 1Š_÷DÜCôž¿ÌhÐ äϸ¾Þ¹Dµ&qè„_Ÿ9”¤{¼Î¦’1ÿ"š{N¤”Kbu¦ÔXωrbàá ªäŠØ“ëeƒÂõµ¯/_%BýVÕºúGm4ºhØ ÊàE $öP¢ +ÿP’þ™ÝTܰB�8µ(�èP’>6Rq_ù×A¶me·r™:¡ÚM².ߗijC„Fg×KâÙõLÂz%ñä@Ý1%ÌËuæ? ¸¾nÂ\*¶àZQȦ�ú}@<»o@uÏn|9Ø ‰gW‡DÏ.QJ�]}!ñì>u³~FHEBÖz@Óèë\æ=âÙu <ÀÊ…Xe•%7.hr1}X6\&ÐJ?U;Û¤²ZV* ª`ysÊqD ‰Ïeñì!#ñ ÷IÒ „³?ÕF<»rQù—AsvßF<;ÿ`¨|zYœ ² ò\¶Øˆgçu¬ÔF<;�‘x�Ïl’HAâ=8d-0â™B|\F<;,u=Kµ¿˜4-—5Ø^ÐýÄç2.Å.ce·:Y> —q˜íñlšoõµ#ª�vãG3 ßòí¦"F2“H =Éúòedœå¹,¢x?ñÆÈ×Aò6ô¥ cbPl"Hg4Ô;Á8 à{¿^zlxÛ¼3Ú*fשEûIbá}o§ÖTðñ $rÒ‹ÑÙ5,;Aè%⟋KdKÍãƒ�Áé( t­‘óHl²Š8� Ê™Ævº�Ÿ[ÎÝA t†³.6.ë�‰æ´{A±Î~�øca�Ó·`—� �T-UÁP \ÖeX½ 0‹¡ò�Jç2.Û^§sqY=:¹ŒËú·=ÿ"P;°zQ‚V ù±tÒÛñ1Ñý±’57l(¥Xå2Sæ¤QCêÄ|[CÀ&&‹*`1¥|Z àÀÏÂ_<®ruØûuÎ"üD.Cq—™üŠËBî™qY?�®Î{'—ap�Kôõj[l‹ûNlÑe±Á ÊØNel�ö/¶n-¶F áy¶Ø—1: +?šM¬dùT繇Ìù&ŽÊSD-M„ãn”#o` hN„=›—™3—qÿ¹¬`³—�T¨—M­*Ø Ø†Õºá2 +—.KÑ�•z£8Þzj‘ÅIõKÊ/J.û×ÙmÝSuiC36.;g9±™%c[¤ŠÄ‰$[GtYl7CÕm×Ùm–ÃÇØ:,‰±ýT‘À´±¥žªÛ"žªÛÌLbó~Í|@bCÏe9=ý˜ÈÅ|�AåqïË(¡¦O1V` ñìl.©«žà²ÿiU¬Ðç,ø¬:—qÙk³~ü@z+—‘èƒ+UU›ËDyÜ7ëv£ ¦¹o.Ý’:@‘ÛÐʪ·p@8ûqv\¶™ÐÛ4 sÉ ‡ü“Lª=­*Ø ÁØF¤PØ^§Ž€±~—…ëošk}(Q\ÛRD“Ié5+ä÷ÉhÞØZ0¥f1“*ݬÃö¬"Ô(AC­7¶öO½@¹Œ"v�µÅlTh¤Û 3JCìï^ªJT–£ò|L|N‹z¿å -ï’'�¾nûòmò�L§$Tï8ƒøw#aŸ\öCxŒM‰õ/Tz‡\Åe½äž¢‰ÑƸÅÚ9,!Õú9œ¥à2œðxM oGD5p}}ôø:«8}N.ƒy-D 2@Ä:(e$˜¬ˆ‡q êƒÑ‹zÙ!± ÂÙ!(I?9©øÃÀÕƒº®»’ÖBÅÁeÃé€pÙ�p¥rÌ6"Kƒ`wijKœÚÇ*|a�[Ÿ_ þ{e5bŠ•~ºbg70- ‡Áå5õóÚâòk²¢ +‹xY#a9.Š#âKù© xÞúC§-IüïÔ~]-ÕÜÖÀ¬wx_Ö‘ÀÈÖë ®ÛŒwäA[rÇrNÏ®D%(Iw„žËw$·Ô/ô‰'aàq¯‡ÒÆÁ7«µ®Ô"ÀÊ ÉâÔ¶2#ŠÝ<ù©�<* H Â;}Ïî„?«Î�_g¼Tˆp�ÃÝ¡—rÙâdÅ¥¤Âœ‚Ùž"Ál;ƒJ Þ³Špâ4ÔXkCCÀ ÒT`” ‘q” æESj�,È‚;€"ÛDöž¢ 1—åŒÍ¦/D¥Ã`š�ºJ JÇ7PÓ N ÃCôNwàÌÑŒHD|Ųç8á ž 5g4)Lª‚ËH‘Ô礨VmO+iÛ*ÃÛ\–ÖísˆÇ6iõÊ%J 5õ97�Z±µH‘o„N^Ä\¶��Î[ÆÙÔjž,Ø$öÑ¿á°rãQ­Ä—µV’¸ß�úò% )¸nB¨¿qÞ�îÌàõ_I¾7ƤàmGb}�ÁB2XR,9´Äñb0ÃǤƒ:¬4wË«;—Îì@*Ë@ÂÑ*t®«`Bf¤#7¬ðiuB?ÇK‡vq+!Ô)4FÓhðqZtãÀÒC‚ËZ´Xs|àŠZ¿ÀÎ_VÞ¹|ŸÏÖD(ÞG]É�‚(k€˜v¨Õ婦(¥BÈŒ€Œ6# �È&ãá<Ç@4$@BF20(0*�EÂÀ0 …q Gb¡œDI–Ã}[åš¶c“’[y€¡;LO×9£#=ã +�ÇÕØt™^’èŠ�“ú‹>�×Ù¬¯›¶7O¦ +z�rLÏ\_£:Nx…€s¬zœ‚� +Õ‚ªðè›tS}ôɵJÀŸíYOöÊïÁòà¯Òáô:­"ûÇÄ0âwe“·ÇG?läï¥?F5<1œEê}í:9GóñNÈ$jjoQ‡aÏ)”°s†Ã@Âð<§‰³~žwq£êN"9ÊV „adi«EËÀÕãƒ;ˆŒéYظs¦¼-KZØH)žæ¾D­ÊVÕÌZ$:Ù7s,�Ðaø­½lÑ jkÒ9ç5ì¼îIèýP&ÉG[´„–®]gW1Õ�Pç‚eÚKW᜘f€aw^ÊDbý�6‹#–¸�œ58ý6�FAœ+Øc� Ë«¹î俨`�¿�Б1R×;ÀÅõt²ÇÛœñ7™½¥ËËÔîÐ+Gç®�öQI½Q�)â‰i‡Ì¤y�Sù§sô�ÿ/£r‰p}й¦|M9ðÑÇÔU¥Ý&o\xOjwLå $1„¸;Ø1n¾S*ÆH‰‰Ð‡ºó�;µ ok™$’ÝNQ£Jk•ËýþE¸ DR`¶ð�¦±@Ò~…i³äKd{ˆZ*T¸õ?ävߛۙÃP“fv¹ÃÄh_³HJ  +½± .”Ã’ã(C=ÿj(º§IßÕ“î.ˆ7ÿ…çÎp¡Áüÿ›[ö�Ç01+¼ãQŸOh$ó¾ÚÉçóP¤åÐ ›Û¾h•wÏbFÊ‘.–¼íFªuCîn®½+oÌç_A²½—Új½M4¤ÒKÇâêN¯&,÷€O<¿C²Œù�Æ´ßRÏçŽmLDvÚ¡8ýþW�O©î+9A-ïs÷)�J üF7·K9™ÈŸ¶¹bŠŒqMÐ A<–u§ iÝW˜¸¨€ÌÚ´W­¢i d?Öî ÕðîTwÏãÂ["½ú>=¶V¯ö�ônv³=ä«��î~ÞÎt÷bB½‘…v7Æ¡e“ß�'4ôt÷|x«:ÈÆt/:-øQ˜îÞU0kzIä w²ëcƒQ[ò=*|ÚŸO¦»¿ ïï“¢ÞÝ´ìòrîîMqÅ6–@ÃÚ´¸XÖ…â꙯=ÛSô¯¹êt7ÏÀ[Aºä=hi£¨íFÅ€Hèq³F�fð¯íuý+Òåv3Ù­JÚ^ÈøWεþŸwk²Wåml síšµ=ˆ·d!I¨í9·ÕŒõÂÁ±H—jÆr•BÛ¸z5œòP PÛ(¹�½Œ®×\€ß)äòû¸Å‰Èm;Óv¯:œ~äÈ%Amcåvd£WQ7†©muŸ4«€cgâ“Dd‹hóîC6ô¦çÑåþh:47|":ÉuÙײïÓ:üuÄ:<ñ‚_ó-½«a´´nxÖ"R䍬ýjqGÜ9éè}|7öØ­3Ú‘ ½²Ø˜n1’fܾ‹�e¢ã¦8ºé’‰¡eÚ¤JT-Ì’.Ïî�üaõnŸÄ�ÄÖ¡<{mG’¦Õß’òëíIˆRÂö�Ì,Ô¿ÙßÂbÁîÔúæY^æ‰I€HOæ*Wëó„ì�ƒâ�É–ó¿Ç×ÐA[�ÅU>7â¥óÝ­uïæ­Íwõôê¸[L7"{»‚ùíJŠð‹bçüúðQ +:ÈÑA$;Çþ¯eWÔ¼=æ„'Eœ=žéì�ï�ɇ:°ÿc«K_Á¸]?¥æ¯õ‡ È(´šd(9 +ôÎ)ª?êP;líŽ"õKùÔ±eög +¿…j×VkVñdP¿-œTò󨲆ƒþö3á¶dC ËÛ,áoê° ²muT#†Ùé[×ÑAìh’$@*¶À±L±z`cúÀ„ê¢Ù@„ÍqÂ4êî(®ýPû 9ØX–gB}Ù¯à…ïK@xÈ� +,ãÁ }þøxê]ÇuSmôÉ-_¬vWÁíqi!¨„òx­šX�™P,G¥/ S®Š¨ô÷?6çF\¢ØÎœ©{änŸe98A�«À9¬çåÃ0ï²Òì˜÷è'däEóÀ>2 ïŠ÷ü_/¿O)~Ç£÷KH~çǺ¿ÛNð¸?ú©á +•n$ �Ûw%Ç²à šÌZô"¤‘îÚ6Óίª¶< (\ûÚרÀ”Åð‘­ä�wÒ°YZ±ïŸ×Oáisƒ­^vé-½«d¶uÎÃ.2Þ)_JÚŠÝSm�©\Ý®Š£ Q[J�æ×Ì–Öük˜Eü¨×î ×;^»÷,€ }]HÄfÉ”ÁX´üõÊ÷掀ÎX^�±)*k“0‚}¢&XXΠ$YGSÜd>óF¦†œpˆ˜ûÝ‹sz_ËxŠ{»É2OPÉÌ�âMqoÂôÞ&~Ûø÷O°-‚u5¾L!à2’Kqï+ÂC§²œ5-ôå1;::î•Ü-ƒþæ nÞ è‹ä ½¡È¥>~üb¡8€À#u*Ëü*vg‹4.R÷Qwîo�o^¿„n¡Ò;«IC‰¹MŽ ÖykðMéözÙ”:,†©s£ÚYLÖ9*ïƒ�ÔÊCx›½¹méÎ�?¦Ã¹Èr­ÄSñ¡þ…žyF&† á"—§042‰›žüªÁà“ËÂ!:“ð|Q4È–Cùë@,é˜V£V@`²S+åÊðKÐ<µNT·Xq)Ì!B'§QQ�ª¿h! ôp°îO Ÿ3*)B_yþ„”l>~¡G³œÝÄ¥ªÑQðÞ'e€yüj°XÀ|‚3ã¼Ä=a>9¡¥‹�¹}'X½}Âl`˜¬^dky›ûÁ§˜ïï7Ï�0ÿÊO@ª¡A†ÙšëÉ’‹ÌY°ã"æ)]ÿ•ÈîTdëp²Ã óõ(áÍLÓ�IlT˜Š¸'® §œÄgdŒ¸§ÃÐ÷Õ²½þk®=Üz÷ƒaÄíÙ·¨ŒHáV¹Ê0DÜ›ë!¦ º)ãÂ{e"n6:ÈÑÑ$øÇðøp±"îàÈ}1 +µ÷îÜ`#�•»ïùLQD¤ËޏÁÂή㴾j¾F·Æò]ÖF}‰ÇÎX„�ÇG­7Âx™‰…úx!ÝW:‹@É;`3cLWމí*u&fŸùºN”žè:fbPÌXapjL ŒáÒʧkìs¿C”hß +¢75Õtºv\ä¾Îb»‰]…a(Gw.j“{öuž%ŒWVŠG"iÊ\R*ìdÅßïHÜÓ�ÔB}�7;Ú+-¸ JÅóC }R„x1±„E,cûI~ÞÀ/áúâ›éñŽ2Lò€˜E'² +u÷SõyDW»ù�*jI}JìóüÔLþ¨?† ¶V®×,³û! °èïvÈößq‚qèÚ…óf‚‘6NÒ²}¦é§• ƺu,ë$ˆïA-D/S1Íö¹óÜ%ÊSƒ:ˆ§v‚•Ú×Ñw&qiÛ6öjíË c‚9Å"²QýöüÂx*FkБ£ä�~møR1õÈ]H9�l +{çÑ'vŠÀÅ¢Þ½Ö›:±ÏSÛ½é4-�0е=Oªæ‰mbŒ6�ÌiPËo^öpÀP=©B·èK!z3(ǬÚ�m½-jÊÚœÌOú%wÇšð³\Jôv� ìÝ@¡F6³øšœã¼3z'}§A“Ù£÷äV8`,‰xó‡e½¯ì³Nìé·Ù½‘üáÀG Þr¢ ÃkˆÞ�v +NHõPÇ�Dï6jýuc¶_>¤ØÿÈju†y+•,€Ëj. pµðtíûZ×UvíHÐva 1UAvfGbaæØÊ³,³ç0Ûñ¦( ­/öYN¾ÓáT Ã2Ç0ÓÇáVXª<QhY-óÜŽâÓqó}ªö®‚ý¶ÈD)µèƒR2«xIO!iGÊÏw¥þQ®®Ä~ÿƒºA%PÛÑÛêÙªqϾ>¼Ý¥¤Êõ>Å·-¢að%V9]Ó|ø*Ä’ý°SŽ5†”>1 “Qä|Åûªá5 í>MèkwurˆÓ/Ç€‹¶ó…6ˆ²;QGnHÖ0Þö#^¤â½V U®Î{ ¸&ê’ˆB­PÒ£ƒ¦K�-ª‘×:2 Ýcý³^³§ºðUÔUÖ/”§ ®�;š¾UÚà.ŸHÈÌ„# êÚì’@+¨ YÊ¡NJáÚªê°ÄŽƒí¨«ô¬þ•ž ëd¢.V{Þ˜® zd¶’pó~,™ÞV³|c¥BÕ½·†&^WyÏh1sž.‡blK¶v8Î%PB„5šÌ«=êØß8Ã�´T¶é7�‚ˆçDq8I€™8g³ùÔqÞçúx>9aóÁãö®48˜äMˆÍ¾~WLäݘ¥J ³w«é{Å>oþ×”3$·Ü(6¯Û¥z‡<¤d:Ñö”Æ#vR%Å™;±ɽ“*àeÝX—]Ú·óñŸµ –¦ÿŒS bg9à<~É^ÿ‰Äñ3òn*<|¾Å›}¿þéJ*tºy«Ì”:œ ÅïjÝ×ÂóÁ®r”#Ça’W•…BcÀë�,"º±DD/|„S}¾†àÿjÁ*�ÈøˆJ&YT:È.Ù]D¡ƒV<Ÿ¬µŸ\ñ—©Ò h?œ¡s +>'¯.¡C�Ÿ�¨ú 5>A?=Ûìýýtœ…ɹLWIV}%…þ²XàvXÊðLψÐd2høR«¿¿åi• >îe]×ò �—?ørÃïDÇŽh§äüŽ8Ó\1,_QÀ9~j,ц´G#=½˜ò帗­Ý óÆÜ$i³‹ý]E®ÙKÈk'ÐŒqeÌvà·ÌvX›yGr�LQ¶î”[| E®Ò(xRá*·è» Y}CÌ-i­jj¢ÜB‡¹…¨�±{ÍA�Q.F‹)·˜v\Õ”o(\ªšÊ­M;ìЙ[­Ö�yÉ7,«*·Ö}­ÐKœ–¦ª%Un‰ú÷‰O©ÜjæÎl¨`¢V¹ufGXÒ:­ÜŠõˆ¹UðØ�¶y˜rËÌ­bÞþ³ñ)·¸õûLQ´d†_ÙFßæD©œ +{Í`EMŽS¬‹´™Ú,2.1eUÑë¨RÞN„9•ö!p½fªCÒ¢Íb-6êÜêŽñ�ù "–P ¬ŠŒW_oÁ³w°üF¿Ù +»�âQ Ë&×µ¡¾31*AL M¤¼ —ѫ ·éb>¶!'bJq²`äXÞ*À“¶]|;×_È�@_¢ÿÏ`}{½·5ÕîÒ’ý,ÐûÌ,µº%iÿ$ÐPwÒúÔØc3Ó 4â�h¬ëá['– ôœŽ,þ¶¤Ò!Ii :Øø–ÑYÄ_ãÕ |fs›ªhÙŸ›õ•T‡­›Á´‡×�¯6öbV*nÚ”!b'ГÉ"c®Ñ\k<FË“eT®1xRŠ +¦ƒ¢Õœéþ Y3$©nx·uű?2ÕŨš`“ #ÝhÐT"ÏÃ?‹’ê[9¿ÉÖƒú ˆ;]ˆBes’÷$188�8ªØvDLúï±ÞQl²ll-O¯89B­îr´$ˆUM_@ÁåBËîî¯.bµŠ�ï-£ ç*zPLñOûúa÷“ø.ç¿ÝJÛyˆzñ”ÒG&‡ô`i+zt´_º¼ºšÒØ+gbÑ�M)ä-óê/4tîÊIÈ.ACª^æ@7ùÆ%#rÈdÖ˜� >»™€J´Ò‘öÀŒ÷ÞªôpD|NU8ü7–Õ“­ˆzm¼TÚqм ôØrz:jiQÒ=ë’µ3>S Ý­b)æÙ„êúôGÑn߬€˜@ŒküËé<®_Æ&A3 +hµEï¨ìF¦‹Q†@3Ë!Eä$Y»g•Ňc´¢Kµq»:U´bM¨ï{‚ùÚž{T@1íö#dhûÉÿë×ì'gÕq®q‹›Ÿ™3mxÇ}ýž7jÍÞ6û¨Æ4_†ñ8ÆÃÖ‹°Ð•°DÎ0Å�0Ìq@ë4½d¥ó®y¿åh6 h†þV³eèeÔ2È-�ch¥ç¤…RÏ»Nz 6iu +h`i†™ÂçãeVzê? 8åz“ÏG¥ü´ò%Œ`xÚW<«§üyxŠ”§Çʬ“Ù +ìàôïàÊÄÂG¢Â ù€ |è Å!ß7xæ)eX{ÖÛÊLÖ~ª„Ax ¬µ&«ØjS1+5à 08##³-R7ª§‡eÏ;±�±�;$œ›D9.Bð¨ç ‰z…þ3fž#»ˆGŸêßÙE‹Çóí÷‚AìBŽÎøc;>,&«ˆ÷ %‚"§y©)ÄðÞŒ,yæ½ß u�€€²4¬�öŠð+݇�ó¾çÏu——fv… Î†‰VÊ 9ôX@:¯B¬{G† ñ¡~¦.Ô9äfhaÕ9¦é®ƒ�€ð,p};ß]�Ž:_üESd“/‘Xi‰Z¨³×ù$à ¡Èblæ@uNô�ƒi-¢Îèµ»Ì uÅ×ôW¤ˆ9Æ2ôCÔy±föXŒ,Թ奶«a(Pg¨]\ây#jÔ9ŨBKâ¿èðê eåŸõ3 +1¨àÁ½Ót8Ûãlà™+'0æÏ'� qø\ÜxþÂõ>Ë+&#¾¾ë&N�„̶Ç;lšñ”viìaáͤËÍQ^xÆ‹fw’½‘„WÉù„|⛄àQ™" &Êò¯Ò¼±ß”chy[ÞêÉW6ŽYã™a-\nʼn“V– ±0 CðÌ‚Ÿ™ÔSúÖ�ÀJcù~R +<žÞ J˜�ëÓ`Ÿ÷3“ÍY×°ê2¸_ ?ó~…æÐí”wsžV„K„füV:¯d8,¯?³ùÖy+¡Y“;x +ŒšZ¤Þ¢¥AÖ&íæZC¬iò]D‰;dÈ¢vhN¡÷þ̇lý,Xš!­˜!ËÅÏL<ÄU…f—uoß…ägN´¡ª#µ§š5ùÌè8š?Ÿ!;öb¥•ýÿšŸñ™-+JhV ð}�ÐLîg.ÏEh~¨£ö»LDzÜÕ Íé.7½Œ¹þABs8Ÿù5ô:ehî éÜéTBó§Ï\�òB³˜‹Ïìc¾©Ð|¬æZËŸ™NCsNr.¼¨s¾‡æ”ÏŒM(ŠB3ï—ò™ªáØŒC36Ÿßï3—DŸÔÐüZ÷³ ÍÏœª¦s úÕcç�W9—Ë>#0&pÖ  ã©…¦¬¼C3TÛ�NV±þgî"bÙPÁU[�Ää·+Òô…�¢íN±rïAà[¿HU1µ áüÖ)uçîÓŽðyC~Û¿CNYg)ÐÌò"qÀš÷�ÄhÒÑ >ȺKˆîU^›1¹®Œ-Ý3(Û_âÌû�Œ£m¢¬û‡ö Dõ¸�?‚D´¼d5)àÄN*†[š¨h‘¿_¯�ëþÒçÁAS!~Ì&I.Å’Ü›É@r®¾rC%¹Ì&ÙÏ¥»uÚ­×i +Cé`à0ZŒ'¤e«žÔ´ +Hóó— Üù &�¢�EÇ–zˆ…Yº?ª4^•ZÖ«ƒ[“•çË4˜áí5ÌêÓø\ñn¨Ù¼b¤÷ãA«~j¿PŸÞ«€Ùƒ…âr–æÝkÀFáDÚ–¡Å ÃòáN¢þß|"g_ã¶|. ã2È +†ÖfÅÆøuó±RqÁöÔˆxbù(FÁ4¯L†BÒl'¦ô™6Í=‹(ö„…éÎ ²s¡¹æaö dËîœ6iÒ§�'L³È‘ˆúd±)#Ó,ePª›ù2È Í ·xÓì^Ay¦”¥t¾iðõdc{³"Ó1ÍK×&X"$ÍÔ7”ÙiR¹e…ÖÜ8Â#Ô�D|K%ÈPS7Gm–v‚d÷Y™)·h8¢@z쯱i2n½éTº¥wQ;ÓüÜ9ÕÚœ¥˜æ&’B½ú„�çC�Y4îUƒÈ2%r™…+Œ!ÒJÏNƒÕéÌ.{Ó�¬|!5ÈÉ)Cº¤ÙWˆ…Rb8Cç#|3RñŠOç5"¤Vlž–|R¶÷#¡‡\ÞAî¹Ñg"[AT±›•õº}˜»kÍ,i©Wš‚ëfl†M4Öà~ å¦™(2ÅÒ\ýÕ¾[ý¹4z!ñè!¥’.Gâ3—Ï¥R¨Y`Ù¥Nþ—#/ 5#Ç žRù½.% žlƒn¡”é�ñb¡�”Šˆ�M­±<Œé¬0ä1Û.S˜aU®žŸD¾ÓÛíõöc±ÞH’C1ìì¡{ÆXž= 0E+V©"5ø°:Š|^œ­œ»ÏÇ­+ÄûÚmŽó, úÍ%æmðå,z!D‡®æÜR xÞ´EÔùt8-p-Wl$x‹ŒG›b..Þyf™ï`Íš•¿Øu8ÚØØ‹!Û§¯:îúÿb~àØ¢ˆg«²`¿ÅÜÿz‰Mj©Œû&Él„Ó¾É0Ä �5´‰¼5 &°" ºB‹=³¯Ïx4Ë™:+÷û&®1ÄZiOê“C�)RŽMXn7¨r Õd*‘«^!(ÉfC^°Ú%§="Áë&4"ŸÐÜ( +¸Åð¶�ñ\ 1m û¤^£ß^–E§„ a&çóÏW ÷ùߢ2ÞØUâ�±Ï4-þeØM%XÝôYÆ–^wÎâÊbêH¦16Uã¡‘¹¶'‚‚¿ÿ,ì{‘œ +úR™V ×E3ÈŠ�. ‘×W(gÄ¥DŽ´lÅ¿?بcÁ–õIö¡/shã'—ˆ® ‘¬«¹Y!ˆ�ôÚ¡…5†–ÂE¬˜Ø9• ¬lFäÙ4‰?}u¼þ�L$‡(7³½V4›áx¶9þ‘ö“ˆ–ФþNDúž%þg Añ2P¤÷ÄÓN×â½½@h'ÿÆÀcæ>·M:ê=— Ì�f¬[› šúmó Ô�ß�YF(3�d|‰å�o]�ô5ÕÚæŽnl#\b�<̨|�–_ãh4‘ÁŸB°pÏ›ùÕ¾ÿF!P_+¥HwƲ©W¼™Öš±·+ú«®ƒöæ5(Ѱ‹NŸÏ±€·›Ep V! Epb¦½u÷Z�\“ë¼¶ÏJ‘îuQfÝ%ËÀo®$R_̓hã�ùƒÜ•LëªêÌÆCÊw�’´Ÿ§ +’²)¥ó•¼=œ…ú…q AÞ¼( ñ$©´�ö�Ó6œ5&z*T¬æ  4¾t-púÙåU·X[hl­Qn~òÍU8¯ +ÛýlÅ`NµV__{ÅdvŠ«5hfoô›�~ì¨íc ‚ð²WºÔq^š ++<“_³n‰ï;çkÅ—Bàÿ["ë÷M›Þoð]ÆH»¾±HÄŽªGÀI“Ú—¦‡9U"(:>ƒÆ’ùåçü”~‹8mÉÈe:·2ÞOÄBñº2–·žœ{Öè"6a ÿ» ëÛPDBÓË=¹XÉ^i] Ðy|ç]¼ùáhI3‹¸t'fh±Œ:þÊ3³¾ø!î)Òú†"f�ñ>_Õý|¥bdoúà¸Í ªFôÕÈË4%“»˜Î^0‰æ4•³ÚRéMÉ„!⽪ñþˆš¾ŒŠm° *wwR$ÿGK÷[©Âp³Gñr-�²èsá=hÇòáÈŸ73Ìqi#Ù‰‘4ÖÁÝA€>ŽõF¾ÄñKásöÍ]ƒÜPσºÄ™û…’,5¼¬ä„”Ÿ“ƒo—½jÈZW@  Y.ði: éDÁù€Ùð27¿�5™P4�»ê6Õ•MÈ`ò�ü2«jx~Fï¯l‘)^#!½ïSÙ_â'‡-g£¤tzf2v‚•!D׉û?`„ƒuÜBøœÖä8Â:× k_ZI€Pˆ·Ë:y(Ñÿe˜ðHÒl<'ÈJ³øï^ðùâ)%$õñ\¼î0~ksÀð�ƺ(\9ÏÕŠ4†1}Šw¼ŸG‘§¾!ûß½iî²à3)í0½såÍà;6wÅOfçüÚg1Ë”†÷T­‘…Ý æ8Lb™wÿÒrò×ò¦’E9]ÞÖ÷eg�éízÄ ÆÌ`ï»d—í‚õ7³Ì½A +Ò°$‚±ÑÙ›ûÑ’ïæx N�Z™<CºýdŒÿÑ—w*Fqë2v€ëâÆN;VÔf“0™CtçÕÇ9ˆ°gòßìÇŸy¬SÔê�©ÃÜ Ä_­Q¥ÿiÃSÄw?š�ws[ƒŒužâ�^Ÿªw-8«Y¬2 ¿û³!Ê,�~Æm4Y-ËbC^ü_`ëuT±_Ø€œ§$”/V©è8øUæ/�y[@x¼læ-Sš¤>U½j¼(å*n»kµÌÉœRÊâ0fŽŸ˜lÛÏÀlÞ(òN/Ë•^ðµ@1 ¿m‰Ý¶[Ö$‰£ÁÖ±|À™¶— C·I¬D-z€ÚÐAD&JÔ†+±áˆÉ%“Äýb´5˜�§çWAo¼<�7¼0•õä× êé/î‚d-‘åU‘¿¤ 0:›ÖÎ< +-qÆhâ¹”¯êB3…1�és› &—qÔîŽ/íŒ~ÕBŒHE¸9u`ù¼i*¢Ìt¿ToÞ™¾^&àùzG/Ò†‹¯Èþ×c€ÅÀ}Œ'dÃ{™6å2¯µÅu8Ôd5pÛx5Ù)O§yÈåÅ�O|¿Ó°�ƒ¦2½¬š-ƹá¬"7Ë𥵤ô1ÌôX'bc6îg¶ ZU ‡ +Ľ¸ý­h΢,™$‰Aá–ÙiÇ« 8Lv†f›ÿ~‚5\¤NãÔ²UE1 õgõ|]"o„¨=ª#âªo†ýè-rú:Œåó—r¾‚ÅqL ³ç£e�N´f;6Þͳ +ç[:êœó‰Ð±�{Z²+Í)Ê“iHÓÝ!öÏc”m3a^5ÖÞ#:ŸlÿÚ&3ÎxB›š&n2+ºšÉ [5`Y äî£'Ž\û»ÆýU¯Zàè«’d!y¢ üL4S…@<ˆ³Në ¯¨F%uÓ�0Kõ‘xkóX�7`´qtxK†E̘ùÈÕ3Ì -¿øù€Ùê6Ù¯éÙÿìE¦Rû¸G–Èc¤M@@éu¾ïj ?VðA|oîãÜLÄ^�²}aå‰×˜¼‚]!:y(x£”s8@>L§¥úk2°É0œ4º‹­²¶ÎHþ}g؇ASò¿Æ[-™ËÞ@–�äÇñ}9"ªhÄŵìaÈÍŽXMñCO¥ø�;=4  ;S—kÔqýþÕlW„àjWà§l¦…!Ú´g§÷Ș¨ú1RE4<‹ã(–SÊþG¿XX¥ìÖ?C‚�Õë@®€šÌò„2+ìšè0A<‡ÙNÖV½]˜HëÞ59— xMn ³(Í­´Ù 2SÉ•« +NfrP¥“w£y€Å&äÓ##fÄ�jù’WðkÝ`ô´™žÙV“t 0o³q?ãbªx~øûKx2ç” ¤-Ò8ü +èi™Y¥Vc«çx Ñ𽢜.H";=¼uµ¯ÐÓx6èS¥N™ùÐ; ýEj ¯t;:Q=±Åi¼¯�¢ ŠCvÄß:4>à0h~¸�x§ùÔÉ!s÷ ~5Ñþ¿'ã–ÜâBóCVôïœ2ÿ + 7j¾+6å+ žtœ‡œª`eµ¨@„*£l9 ‘8»\ÿE÷QIÓ’ËW%¿ú’8½W¾ÝŸ¾-bôüÿÚýU^âüÊV†|o’›À5R¼v& ƒl6ƒïüeôß-AdR¥ý>îPCˆ8t¢2`Œ ¤Ž{µ»œ—&{¯‰�Ô?qAym»9¯Õ +ü”à^ Z1!N'âÞÚ’Ø%xRIФ/’‰AŽI_v‰�ÇÆÇŠžÃìëe’¶>¶ –-XÎl•=ŠU( ÃÄäç€{ÖŸ„·S¬Ðˆ¾“Qasi¯9¤ƒ",¢!ìß¾vX¦—ÒürU÷8­•½ç‡Äδ\1©÷(� Ê¿¶èÔ£ä4d‰µ¹ËFÙ�ßÃJO}L­Ó÷_PÇ„’›ÄR“À)y¼/¤©:¸æú| +Ìmq2öœ�**å‹ øïIìOI§¯âô%"OÁÛ«•µ2.õQ¯Œ;»'üÎ!^Äkʼn‘¿¤sbÁcß +iïR&ö¾jYõŒ;¶TÆBXû½{­€FÏ L]f;ª1Ø.CÜ}Nõ®ÑŸ÷þe�hÃ%e–�[óÜ5‡úÕ2c ©¿T¢Ù? rïèöN”0�›*kß$_ôQ÷ÛáëÀ…a¸B׊‘ãKÿêr] Ð5wzñ#'”¨³¯ÓÔaV§Uí4$ž‚�!œu¶Í2¹¹„�r10o®g™ânO‘T!'ø{8>kéjí�=xÄÊ‚9mÊ5?ýeù‰7rtN3rÇl Jt|ÒÆ9=¼¬áR§|­Ìç‘…C·š•ùÊTÜrØ“äæìUCî½y’#ž´�G2-¯2ë]•sDÙT +‹¿ SFœÔ€úíÌòkñÕ¶)åF�+°ƒbÓ|ÚŠçÇ*Pªd~¨:ÅÎéèx»�“´c[:œÛ'FÝ['Š“Oœf¶ÛxF½òã"å$�¼G[>evàN èÒÀŒBCÜ¿Ä8Él,¾ä»²‡-ax§ânÌãs Æoe'¨$.QÀ9]¤á 4%×tÝ¢=¶™™úÉ3&öm¡dó>¢øÄÔç_Zƒ1ù‚™Gšiñ6„§dÔBñPR‘9ò“–,&¼xpô(P?àu㜒–“It­S˜q¿0@± +Ž7Ã>ÌnbYGõ—¨/q£²£‘òe°Ñ½Ýç7FÉNñ:´\“ïìʄԋzí„MnùÚgÃ_°©£þ¦ S¤¬�jºÑÇ3ΘþlÈLNió?ÀRÁÀ²_“Ù|l$éîs%$q) ƒN¶�PòÜC2®;¬cn‘jS™ÉÊÚÔm¶âXÂ.?ÚÿàÑÃí!ëíÇNĥϙäjŠòëÃÎwd°F™U ôX VeX)¶(uSIÝÂ0ÍÞ•">ö‡uhZÌ�8*Í\73Js\ݽç�]6F=3£Ü,^é†"Ìë±2¡�#†Mˆ«‹€ï€öÑ +:ï~u¶O"€ ¦J‚7d¦‹K_ù¼deŒàP�ɬÌÇùX–침Dòv�à˜Ÿ89–pm/$Pò:!Ρ™Z‰ÏX›Mj8�JÞ�~àŸ^þî�‹´ï88�ÚÔÁÃ}e¦mJµ„¤q�EC—8ždB)s"�ØN#æAÂç¶Òò<ÈV·�liB;BgߺĤ=k�øÒ’Žõ„)¬`µÂªføçôÆ”ÁˆHY%€�Ý(ƒ/A;›ñš#…kpËbnôµRÙB˜Êuæê Ìù–œ³Ä,ßÖe£n&&;ÿYŽýxw3ºË€…CC;Çøí.?¡Í`€ª»æk-aŠÃÏ}Á`c85Ûš)x?Ó´9ÿ|¢óÛþ‹û<}€�À_1Í:¯>¹Ñ#çë,^>HüÝ‘pŽsÛ¸@ÏOèIÕED&S{²e„[ØA'8±V¯—>Ëß&¿dËOß1¡[šš¼:ÆSÉ_? cAyü áÒW€ý'œ#[´íìy¯Xq‡XσŽxp$˜¨ ‡E‚ kLÅ&`]C<ëQª¿¬«ìsxGlÌ b†�Tß„Hií̾a±5cÙöeáe¯Lç4À¢}¤ƒ[=×ò5+uKÕ!Œ­§˜ï›åÐpˆïç Ÿ3j׉9ë¹`*q�ûûÇ—%×t±¸™?¶„ÏþãFwtÀá!ÿÁÿXGPˆO¦�ö€™Q üDº‹ˆýL°=À_ò¯Tó +;×¾ƒ¢ÉX/XÿL0…‚ˆôH1—ÀL,”[` )Eì . �§Z±é”GÏÌÎ B°Œ +µko +€@­y+Ñ–€‚fÜüYDW—¼$PFv½úVVΘìRBþÏìÿEaÿU£~BþŠ)¬™x¤ˆh¼sÔ9º}|™¢«$jirwÁ½Ø7\*h1”~)! Ø�žhŠø¼¡­žûØçtƒ ЇUݸ«YLwk‘’�1¼Ø_ñÂæ¬c=œoœÝ³ns™k/jp ö»Šª¢ûRôö{8õ¥dlyWQ9¬""[Œ™…¦ Ô¾¨Åž("…vësø?bÅÚÁ¬j×Ñw›Ë%+6€”/msˆ‹E�Ó? ‰L’p°o’z"©":ˆ‹°DÎÐG�?�¾h# 8ͶnÜJ1vléZdã^Št†¶?vË|ò,ìU3E/pnÛõ.d×8 ód<Èb`˜´Ë=þf6÷ ‹kQáÅ+øK_�ó$ÎC•á®Ðê�c‰²bŒu'ë� ‹�GÆëw¬»°á˜Yº}¨æÙ $§æð†‘ªXÙ-±"áÆÃ7Š~Â}E ½½¬Ë¶ÅƒÖ:¢uÿÛ†àë†)çNûžˆ#9§–8êâ¼æà3ËñŠXEšßø�¿BuLÞÂ_€…t;£}žßQ²–?7õâ…H¡R¶ÉoŒp³sÞŸûæì!þ6ÿÆÆ �„{Ë;Zoñ«"¶|’µÏ¼)lþØÆoà- N�'þ°ìõ·¯àgõ�Þ� +´ïod™J¨pËŒ«À”ë"Mw¤¾ ©™f/šQÕ8h½ÓÕ ×Ú�3Pœz¹½±‚×ðž {îç)�\ @õÔ�Õ>ªÉe0™šþ�z˜pø“@¹¡!E2j@ƒ,2’ábìÞ +Ê +á(Á“¢zN˜1!wY¦¹u¶¥Uà…k�,”aê_l#P6Ü´kbÿ°‹hÌ|y6Ì­&_j[þ,‘ûS*wü$É–&–ì“äí�°f¤¿íˆ�²P³&HÊ�„¦v”$Ù  ÿÀ¨kwˆl-z¨B2Qˆœ dEö‹p,Do}ˆ�‡H.¯¡Ç|DÃB÷$!Çjé¶(iBÃpïeôÊFSYöÄ?A߯G–“µÏßQå9‡‹ ïÖ¤VÐE@K�Êt¨®ƒÓõ“3Ñî%Æ¢´5ϯ¤B 8ûq U¥çoÔ �ïj�/@8ÁÇÔÜÕרæ-ÞþŽû²[_#ß\­Gz'Œ÷5�‚SZ�ÿ$^BH«3Âh9¼èAÓyð‘øqÁÕ¬�³À{“îàà\Š€¦X¥¸ÛI¬Å€~4ö*ÇäY<5ë뢩iJì­>XâÍÊ%§ü.D—è’�¿uý¿.7mý±Cß@Üyúð>BLTÉÞñ߀�ƒÞ�ËÊÓò¯2ËKÿÜß8ªZcËP/BLò„ûœ&ðÁ(ýËD¨S,ó•_š‡G¿ÍNû0+ÂU\½íz¿&þQû¿µKA#;tð7xη-I Gƒ˜y³F5¥ÚúC†0Ø“Š€{Ž[‹ÇÏQá"¡.RŸøÎ¿¨Šxí\”j«û³6ŠƒðŸ~¿ÕŽ-ȼõOrMï„é·^N-v†rìSµuìÝ|êµáR* $�jÛ`ÞüçŠ�Í3«ªŠvÄ#Êp�Wew·íLi•1XDÆSx09^Ÿ¤2¬y5³ŠrÀœnN �5A¯¡ª)KÔre&Ÿ•‚½¸O"‡900M„KÆš&ˆt•ÊZˆ)%:¸ÒîÂP’P4$�z IÓã(À”&©Š½D #Û¢„pKP`4R*m³ØM( —=Hä@/Ñp�&Dõ ”Fó¡štD;èîÐÁ¨¡¶CH•ЋDp>'³Ÿ‰IaÓ÷™—TK3«]»ŠpB–Ry\ + �%ØÍÛ$r¹žY�b -~C’h…d€Lä^—�­nd " h3„&‘½j$(K£{`ÑÌ +cœP££…JØ”™ —�°(„ãÀ XÀï¡Ñ$r“lW^h¯˜M]¸âÌ‚&ª@XÒX«ÆHÒ,‹FÁ(#wÅl~àkWft·HjŒ�±à[ì1£Ÿb÷ ýnºh!En- Ë./Ð;‘L”€Yh9$™™ÂfTI=P>Y…yÐ +— ~R/]\VB%—0Q8 ÙHQ ÀÍwCº%YˆF *™8gi±ˆd•TM“Â�·¶€Þ�’ÈA¶8nT'#Ê™ ù@¯d0‚|=gŒoA†_‡‘ +?˜x ÓІGlp Õ™.æ›ÅW¡Í$Ž:•’$¤ ç3[<+ÜÞ¢ðyYV,™(² dÍ�Én*:‡CI)(”zG+f2Ý4 š@Ö€ÊÏX¸Rá8NŠÀÄPÒÿ$™’T21×cG6V™I0 Êr#‘,þ˵IxiYø8 ©ð«hþñÅD6È¡@R"($ŒìSI�t + +�ê`þ£$hOf! +î$zæÝ8èåF–�Éó 3;KIÃ8¾Ø‰DvK%! ™)Ú›À£$â `Ñ5¾‡Z€ÆWg.¼ðj|£–…†`ÈÇi•ßX–âË¡ˆ›†å“ð¸m²QÀH€q$Ã2=Ð" PÙ8npª‚yyh´Rs›ÙHÞ#@ Àó±7@.¼„¯Í|R…�`€6&)R6ª“°Ž $f�ÈëùÜøy!Œ�iÁ• èlhl‰Kí2'+<¨“0¿¬(­… zU„´0 nˆVzLÂÔèY˜�˜$€¡ÔFdaŽp’ŠÃ•áUœå}mæ*·ª“�q@NÂ~(f3¢ +4\¢S-4êð Œ9cLñ²,NWàùÜh¢@b™ÅJ!¡"K<`4,… Bô*%eÁ0 +ª"PБô +Êâì@ªP\>Ó+6¦f¯ÿÔ©ñJعÞóàúNÕIØ””ëMuV†wÁ™o©v˜ÒæA¯"È0ÏIaÞT'aK6˜˜j³]ã_¯B}£Tƒ1cÝ +h$MlI@ + r¢Ï z¢B+Ì"¶ñ +uÒÚè#†”«R2„�lŠê$ü‹•y‹êd"ª“⸘ƒ^([±ÕIø»™ Á‘êé „‡tPg2$ Nz€¥µ0´ë”F‹É€Br¬�€‰ó1Û¸R;Ùhâ,ˆ´2Îa˜ÈIxq@.–¤Q|OÒ(>Ü©æ¢RÉD��9LhÐŒå5+=�Õ½S’™�YAf‚^È`zÍÔŒa€AP€^–U_L™_mL + Aœ;œ¦3½aƒL';x$ñ ufÉνȥF›8£Í‰Ñf$êÌëdgîN1–c=nÔ—²/ óÑ@x|›–…_ +‚!_*w _CîË2çylê$i4è9'ÇÊñ¢fñ�ÞªÑ8­�j,ˆ 5ÆF˜Í=è°Õ"!Å`1V Æâоc9è5Ø è1Š™ˆá  +ô|÷5„K?’C¢Y›ƒ†¥,s�/#À …6<>!‚j·å0µ„�C_»ï?Aïq=¯] zšÒ%A½,ôI¤JÛaœ÷ÃʼþÀ z7ðà#:r‰’ S_¡04ÞrºÄ¼D`E”Éê»}*$ÓDFÖã–úä>„pú<¾V 0¾„ˆËP ¾òÀ<|*#…éÜŽBH�¨�Ud^fJ�Ûu¦@jåú¤~©zDÀÄ z»šÀk3AoåH0¨Ý$¶O‰³‘�9àéôwi÷ÐÓQÄà€!ŠÐÜ�€(‘h§r^‡QdNîfጮ“å7 �n²aØ<ù¤í�š`DèÀ䡽½o‡†j@÷s�¡,:2Ï8è:ÓVQ`^Gš€Ä�4x% éF�¢,>=�„ gû(V´äÈ=(‹\#Q�rÛl ŸÇ"z­b„P%�œŠf9Üà’Íq¨Î?tå¨$ÖÀiA: ¹²¿‚NDÇú2æ˜ eUržI aaŽHwJ(2O[ V–_�g‚Lß&%0kY‘@í. È@ò €%1HÒš8GD}I\e�Š*‰5­‡§á4®\•#p ˆÀ#‰'VyIlÊ”e΃Ú=ia«RÁ¦Á3‘ Ì�^‚ã°h`ÍBB§�hšûHHþƒTTe)ÂÕYyH(•ƒb¡0žÌk~V%ÄuEØ W‹¡EqF€À9€^ÌQ‡ä!ÇšxõXp·ÝñýÙÿ”Î\ÛýÛÝó´@ýë´¶»wéñRjû/�=úˆ­íÏMÝ}´ÙsSÛoë­ý^ûÝ“ÝkÇ~ì>öã¦n³¥ýn3ÆMý>í÷™›bœ¿Ÿ~¿{žê=º{¿{}ÞüµçÓ¾ÓÎK{bZo¥Ö{º'›ÖöõΙRzû:µ—NÛÙ“Õ1Ó±s�÷öuÚ¹o޳'›·¯Óûuvö\ûÞù·ñçû–öõññØØ“Íqöõ§–6¶ãÍô¶õqüú�'õq¬Ûoìyðû�Û|­Íslì]¦¿µ´ÝŸöôJ�ÎÇÕŽ·g¦³v¾yÖowOf1¦¸q@}ÇwN<·{@}[½q¿÷õlñlêž, ¾�£µ“ömê¸Ö›G<ú×\{tìŸÇ±«{õÞ‰ÛÔKs¥Ø1m›«ÐÑ À)`z•€é¹@�@WV\ wD0’.S ˜žÍÐð†óÌ€Yf@­€ßò ˜à•4À<3[½™-ãr=Ыa)н± Ћ�—ÇbÙdFdwÚEÄlµXªlˆ ÅR±Xiñ­r/ �JìP_¹³éj¨\ª¤¡"b¨“ …º­P2Ôg3A5–e¢DÝB§Õ®¦k¸E\ ´Ð$üT«Œ…"\­Uh>*ôµl¥Ð÷°k@±bä ÅZ…HÐkP,ÕjÍR—†Gb´T9ŸÏ¥ù/y¥š1:qFŒ“pŠ=Ye<Ü<&!d²Êøƒ“°!0n…ÀN”È}ÃcÅ™#ƒ‰X´é JFÏçF\øReRã@ÖœFÖå!*ØàM‰©¡Ç‚<äŒåXÑ�!…ì„ç¡–(«5 ÃÃê$„„ž‡«f­Œ3"c6{œˆSјQSOdžô¥Š²yHª˜pǦN‡"´©“°]0Ú„eL³VþIï !ˆÓö© +ñ((án¿ã†7.*à4¾œÀF +'H±ÁA/7A*z´8¿»u$¡‚¾ê¿üU'áL ¨P™eÕIXC²3oÎ¥ ü¼4Ÿ¤t & ‡¦¤«£ƒN6s˜Nœ Š“>[:YŸtâTôEµÀøÁ‚ ± —…F‹f!ÀˆÏë]ôk}ŒÎj�ÁâcÞª©j§š8! µ‡Àk3Ç…ÅÄy{Nž|+&ªbó§HЉó�ƒ�0×Cãü„猃Q -(g½N#{>7^l ˜g�èDæ‰ÃÂÆQÀD $õò Ä +„T¤�8E„�8K„̱çs#ŽIˆMÈe29(!q6v9Ö7V'Ë;ŠÙlÙz\È–CBŠó9¤”å!Éeæ¡dz�;É:Øf²&G!-Œž…¹©“ˆ,ÌpS'a±X˜›Js`¸`´)NŽÝB.�8 üâðÇ0Œ%Dá×Yˆc¾ÒB„|#¨ ñ)À ‰tƆtš4ôvØHÉ!´D� Ë'!Pá`¶ +®¡êÌÊ# �×'ÿ¾6Ÿp=èM.¦ÏË‚º +I'""5 ‘Ì*dRгuSÉÐÈEeÓ¤0ºïæ°pÔfé³ûTF2……BÌçðSÙ)">â×�5TBVªˆ¤~Ð[@tNÐËb)  OŠ TP0RV‰E‰R"áÇHnñॠXBvæÁä³U<-ÆxÃÃ#(Ê2�Þ'w ÁC€ÆGQä6ŒÓª>P8  +�@­\¯‹˜4Tv‹W‚Xæ 2?ÀA|*‰Ê'@eñRÈÜ1Pž!‚ èÑ`¸Ür´ò¦ËÑJ† GÓÁh€å¼’öV*Ð`!ô �g:4Ö›�HÉá-x²¾ÙûzíÛwlÜø;»»§7nŒqãìÉè÷ýÎ×3þ¾ž=Ù÷í|sÎm={|ÛútïB½émwêM}6õ÷¦Ž©×œû½©7¥î=ºÿì¯îÓ¿ß©÷?½ýÞÿï¹ý¿©¿ç©{—qlëc�nGÏÞÖÝÛ:vÛãìÑk¥³­Ï®þm½«{ƶ^kWÛuß›¾më~s[ÇmqÛoë[oÛv¶õ®´¯w­c_ïZG;Ûz_ÏÔÛºuÚ»?nìuöwöïÿÎþ×Îöû³Ïëýÿc®·ÿØþ6wõŒ»zW϶«gïêµ³wíÜuÄ]½«ÏžßÕ{~WÿïêtlÏ6ßöÏù¿?ãÎþ×÷Úùö?íìø½³O|û}´=�¶çùDcà^®àÕ[ðd¶-õ‘¶uë�ëm[ûâÆ¶ý{:öœyùŠóA$ÞDzBÃì—®æW¦Ž�E–UvR4Š‹”†Ž*ö�Š÷× ô˜)GÒDQŒPÏÎ?lmÓ†¶@{4¡>bøôêè­zÂû†S�s@ÂÁ­»Ä›K2‰¦÷2Ù§ ]M¶F_ðü_£ÁHéö?ÄEH›-üE—ðU=àøÀ°óæ™Õ¦"›*‹Ú$|‹º¹±âES�]y2ki›Úµø“€’9äå#‹¼8¶²en\ÎrÝöˆ«HAˆÏ¦R:ýhDЃԪ$íSUÞyÜfUiÆÔ§³q¨mO�ßB“†r#~ýæN�¢Š¹ºòcu�e‘fÍHš‰ÉÿD%Ãtœž¨°fªµÌ䢨ÊÓørïH¯}xÚVÆük}´_ gÙË)ô7vA´ ÅWèAÉ®«xºÑœã�+v²‚ˆFèY$Øm“‡†áTä¼ZB,ì©3îµPçÉQ®ß–u0¡Bf–7ɸ­\ç…+Ed>jSy¹DXk´½,¬€ûCƒI¯Ì-Æ7ØØä¾°\š‚øË  +[r€Ð™Ä%@+¸ !Øàñ—/³¬È;6`C]cîð^Žæ€i4EFÿȃS@ЪlJ—Z~¾³«Ëp…ºð˜=Rçs*bcÙ—´Ú—î<ÃfÃu_9 å_)$Ϧ~ï8GÛˆ…LÔð‡± +,÷ëëK®} … lÐüaìXíC–îoÛuùŽPž¸†>¬£ß.ŠS=³gQŠÏ€ƒé�c{\lÀöV›�KYOˆªrÃr°ð(âWøk�Nšvy/–Ìatºh…–™z¶Ã²"¼"a&'­µ¿ç¼DÞôKø.*@ÎåCÀa4åH1ÈVAe�¹ÿB$rË‚¶ß ò?4áý÷ØóЦƒ/GM)£MüWÀ|)+Œ,�à0ìAvëÏIÕ¥WN5ð°¡) "(ò=¾ù�ðŠ4{ŽÈx­ ÷j‹´*ø$ù˜žËîÁè:4ŠλL™…l´Ú äm$±¼UÊÁ&z=é&õðýbýNOÚø +—|w‘ +Bkü5d=âxаšé¦ºQ>-D²~žJÝlêB«¹é«pZÎo«_ÙÅ£¾ Ñ…aWìþ< z³àØPžAÈj0ÜÚ]‚Ð!ŸÝúŠrÕ俀Õ~kl:—¼ê÷ �Ç÷»§ÐBL8At0·‚ߢåƒÓlG<:µ�ŒmXøî¼VX¦ ª?ÅÓâ�ìýŽÖBè!/×VH$߅µ5G,Iœ@î…}ûqgÞä¸ÄJŽùn¯ßX„È®¬í,n$E ‚”c~F>Þ½�Â4çy%XœKUu³x¢1šèûÝK.¼"—K÷™yâš[<�hŸ©M�ó鱺]›åÒW Г¢ŠSqfðò\ˆ±À©?l üBü‡ßï±}7B]0D’¬°T#¾jNÐñ†(S ŠÅ(@òÑä>²6?8딹CÕ^hÛ‡’ûúùmâ�Â(Êõ#Ô4øä)±’n¨Ë:U#ŵ5Ï3[³ø� h;w÷¡Jð�Ïe® BÙwm®Hmpä³íQf9s]þ \@¸í¬€îè—ËøÍŸ ²ç´F'�_‘]Y(š¶ŒÍ—/«€®ÿ%þ˜$#=0+[žU]åz‰Ó8sõŸ†—èÍ(ì1|9IRü¶9¤Ëþ·N A©Ž‡$û O"!í­ávÃÍí¬4*É“ËÕ4iWÎÜpj(6ÜPÌű‚!áB$u¬NãbÁ³)6<%¿T6 +âý›çjúKêàɦfµWé'P²éRù` +Žƒ­j1Ù HLàº* ÷¶Úz›t�¦,Ž,ü!28ÓE°jÂå V«®–í‚�¨³^£rµO\¡&§ªŒD ö'pª¼Vu£B¨+Ã^G�gÁœGm~‹æÀZR¬ï£1€XNhU¶y–2Ä�ÅV.µ]Mµ*¨%e~:i+“s�žß›àýr>[ù¯¬¶’®õÒõI)¯ÉkŶ‘•2L3i’Rk»o«�}–Ô¡ðl¡ÚýSìâ..š¿F#ÊJ¤ô,C1VÁa,¢q³ç®þÖ²QlçïYþ¸½Ü‹üõ˜8°~ýCQÊ™äàEw7½¬,A-‚¼LÈS AozëíOÉç¦õÏÚ¬7¿ºnŽ Sè½w¨-»ú›*<˜¾Ãš]4OÍ^�ÿÿδóÒŽô‘={Ù›žœAu0÷ü6]{¬~›únݦßÁtÜ‚ôu›Êý6•,ó&t›–«H×ÔÈs_,?þ‚ØßºM¹öýnë“ú¤nS-"�¢KÆÒÑm*èžË +�ã�ôÛtìÍ÷mšØm:3ØË©ïÌÁ°�w³QxÚw›æ +¼W¤¸¸nS¯oÓì÷[¼>¾MµúnÓ²M Ý~žÂ’nÓ@oÅ•ݦ!S#£§Û4„[äkCªxbµn:FÊP·×ü»2›ÍÛ%/ç­o,_©MR…˜Å¢3,Ž–¯Ü„íCáÔ½â_ù‘º4¯Ra!àYç›JAå:¬g?|Údбåð9Å«”¬i�Ù+› $V”U‘:s*2<áП‘‚²¨Qº’"‘@Œ§zÄ€6¶ä¶�÷P +…%‡SÔŠT,i¾c�(;:Ù×Z™-_»ÀHsPWT,§æÍt¹ Ú' ûÄ�TXÒš! smëp¸¶ˆQÉ$ΉTCx-+4„'ô°~Ps«d�½2r\°5ûÞʜ۾Z©Ò¸u=&•_¾ë¸ýv’©Æo²º´^�°ÌûÁÊ>odgBüºÑêŸ.&ÂgÃû-,}©^-o>&:[6�‘ +©¦kQx÷0-¥fR�lÐÇL�Qž&s¾f*™œ»Á„IïIý_q‹§‚<÷�@$ƒýoÏqE6ó¥þyÂòt\��´±�ŠJÔ©  ï55À9ù›ûØ7„rßhJÖ[x©¬ØmÑôñáp/YÈÓéëæT¥u<ñ¶ni6©«‡<ÕÁHĀܿårF +dØs §°aÆÑ3÷ž“.ÈGÐÖ"1ðvü;d1ndÎ h<ºÿjö3}9¬Â̈́ƫ“hI{F[­È7OzYxQ7`ÎA鑞ZZþló°!¯#!q&OSÅ�À’RÐÇ—©0~ìøß   �x™¨îV)œ\Y0°Lì’ïrÿf•ØpëÏŸ§*ID’f´@Ã�¦¤0lŒ/@]ï²pJ®[*Ë,$¶”HqÛb[+ v�YO–énË* Ðë¥-®¨¸kãe¹žeR)ÉT­ŽÇgO¡eÁ�.Éöw * æp.ˢ벘ÞJ,©É' TÕÚ ŸcÁ9/Æå‰7-ìj‹°»,¶Ž+1 µU))}S;_)­óÑ>Ëù®�Ä5P)W+Nª\ä+Šo¹½$§ƒ�ÈýÞµÊIùŸ‰Ý¬lhd’Ãûn»P£„8v&‰ÐzI&Èìÿu Åkaœ3*¡ FŸS£(Ä¥˜«Vô´Í¨òü!( z5hôÖK+ýàQ�“!´?„j­ÚÒÕ;>–¡«Fwä»M1å°V|t#I¡ÃzžW�ó¨¾E“´·I,OŸ•˜“I8AárÞ/îO:ËÊ’Íñœƒ‚Ê⺑T”™Ñ†B�QÑ7z:ê´[Rm"�Öê½ÇÌ&j[��' +K²ý¤Zgo&A‹ÑR-ØDU�1J7PÏ Æ»ºJ2'd‹…&4VÕÊïñ»¿åFЯMiB¯–×zÅ3ÕW‹Nõ–H8Üè(= +2JÁ†2§F÷ <Íb ”`‰ò­Û‹Áº#:üQ Wô^�tÛ]¶mªÿD ^vk¿»ÔøÒüÍ_óÃQœ¸˜—˜@c©$Ä-ú±9C”¢]=~fŒ½âäN¸\&ùA + ‹}BVGÌÈÑ�ÿuÁ×[¸_Ò¤!ò¤ùñtÞ„AFüà:W=ºë +‹ü?Aºð\®=²W›«L zP¡ƒ:£ÃZöšÎÐÝrbúQ]ì£oŸ”I&_Ó½† :KW\ÛØÜkº*{_\hëB:˜9úï§(P‚û‰q0B’ÄÂ|>ŽŒyaÙ ¾ÆŠ<æó4Œgó†‘Sd'Ò“Äåp£8ñžz|´ ¥e6\cz‰ÑÊ!¿ß8C+[b¢ˆ/­)_Ó³]{ ÷Û,âk:ñˆY$>JbÉp/_¥M` ŠL�Ç4yX?yô¯s÷®Î]ù‡ð^ á‘µÊi†Iw£-Xû¹ èî¥ð5M†!ÌÝõö² Ež™héc sÓ�~ À|]¥Êë-ÊÍ�‡ +½t‡÷6+H8EJ‚Vw×>~ƒP‡ü:‡‡n+¼Õçn4ˆ¾Ês•êìzáM«ñx@Jõöc—|„åd…)µˆìüøÖÍ)oÈ�2·ñ €*º{ÔE”&îC{ù!u}4$ßÛÕ¶Ü–PLû4Êë‚ÿÇ-4ô`{$ùÞŒWÐqĬ%ìÕ�G¯n| éj0NÞæ™Õ‡°\� wKV~$Á6z¸}åû”ŒE´ä«ž’^€^á+Â…#ãU-'BƤú“åpçìÖ|ÎÇÓÿå“’¯î¿Oh3)™¼] P‚ŒxoY�¶ÇRPÜÌJðÎ ”cóh­vGö•‚Rõ„/1”>n[ù?¼^k¡«Çƒ©.ÅŒ¦ÿhf3Ô¿6ñz¤Gœ`EŸÇ§âkÆ…Áœ0v/‡˜cݦ;«¹'#7áñMßçè;I‘9?9Ñ�Ì0¨F[â!¢â ÂÄèÜAF=áž{K’œP‡'½ô&FzÖØvMzÖ + ÓñqØ~™kaØÊ…ð´´ŽŸ“ï£<[kQ�H€¿°æíZyèŠ&ì…)C™fœ#Ó0üÁ´O½:À«ô=¶NÍh¦àê!st"*תøu‘ÉF“uU[ �D h9Ó*<ΑE‰Œ-‰²VrFàHCG–x¾ª‹ãˆéÈ’¬I‘×9¦úv¥–̹ÊòT£;Gö ¹¦ÕSøfÖÞÇòT©‰}ì°xf”´œBG<ëj” îåšÜ„è‰ÃÈæz ‚Y³bPC…jþl ·“Ú¦°Dš=vIJ÷!ŽýðPýo©¨¾Þ¿í�kBz“r¥WJˆj¥Òµ÷²¤.“ÿJÞµ:Â~�¤mr¹‹pH·~5¨9˜Ì½}p!e$©Ô¡…OÝf#˜2è£qmÕ‡än“Þ¢„Õy”óìûßø[·ßJ+ƒF¿«R•»S¶7a•JgG˜·88ÄXÀDZÑ31.ïÔ……À…2ç¾�êrHÂXe”Ü7øýé¾TSيźè\ީƱöVlL@ýùGx¸:N)+‚Ô¤óI -v@êfß�Æ '×óLh.ûWet�(³µ®Fþ´ÕÒ†+Ö€S D@pŽÎ·¤#^»b±V»¾yƒ¤{ »NÀÅÔ†,£ýWKK+¯ÎÖJ¸=QqôãGÌOxÁ®¹‰À¶6¥úœ{¬48Ëó%ç6åî«´†Ö‘ÝÔ=e–�Ùòø«o(½uЊX,@òÇŸüš¥ ƒ‘à@\ºDkx‹»'íüLñˆùCF:?Õ¨Ò{Hª­ˆÎÏîàÒÅi G" dm%�ÂèkŸ#íJ~ój‰Ò'˜2VÄ�/ÆQ´å’ßL™òmÜvÁܰt‹Á`6þ§…¥ý6†%Õ-_¼Í;ešÚ3^gjܽ¶…ûì¶ ÐÃÜUçe‡;­ãzÝ©ÛL‡È³ÖZ>û~J)hÐæöÞKÁ´Mm´¿í¸}¤¨£"iÕyÞ +ݪ�áÓ=Y6g€ìF‰³òÇÝ�Ð!–ƒùî”ÙjÒÙùËv»I +=‚¥²²¾Yù3˜C}ui-›¬è® v´c‘=±Š¥³¾¬1 Û‘>t3"N,V±TSG1ƒ¹OÙJ€tæÌ`xíMf$Av¯$"8'³2{f¶ Ë $yÆÍ‘�y¯KWÑêÍ3[¸Ë &v')Þ½‘@�íWÑšŽBƒn’Híõ¿.?©H2Ø߷ÃÕËsÌέ²Ty��ÈL²Qýf bö`D‡¤›G«´ :ÕL€AÏŽ 7>&Åo• ®/Ó]Ùb¶¼‡½{9`‚+Ãñ9ßHê=L c¢â�(ìÉ`Ã<ͪUUý"˜aRwÊ$§~Ï«}¾Ðsm�oÀ€9LïMj·ú¢c‘Æx>à÷ ˜Dè™.`X”‹ ©¤º@ÉÏ ˜Òÿeò2Ô\U¡KoÀ`OØ«ŸO70.™Êkuι1cÕnÀ.GX3z�nÀÞ×––¼ãÞ6߀ Ÿ°ÁBMŽ—œ‡7`zÃ[„¥déßó¯a:žš¨ -•ì–÷ªYÖ,½oÕöºW5+•N©Ò°;*sÇŠ^¯lw Ò±ÄÒ[qgØcÃ0vVïFRD$¥/ÚÕÏ‘�«`�lÏŽÖÀ®„\yÔ4ƒ­Bñ5aäÝ×b‘s –kàKñéÉ#”kXPólõÅ.Ÿ\ì‚e2 k–¶z„�NœCÙC^÷sèUøA�º{ izþ=pe¶¥FA ¦kÒ‡:,ñvè‘\(æp,&}f‹D˜=ÃÉ¥¾(Â¬Ôø¡ù:�t)êm{Æý²¼CïÞCŸtÂxõ<a(«‰°°m‚ÝæYƒÛàOÝÆ¡^ +>F9V\Äý=„9úµHæ[îÅyaÜ›tÎlfUEu + AIï �R F€ó>ö'-¾y¹‘qƒÑæ1˜ðÃCÓ¸ +e°&OòG?ÿdáÄps˜Ó_›5ÝJÜ: +÷4^¯>e®üb9¼;˜øn�S�Ø C-t‘ëü·‰E�a뼋¸j›ŒuuÒÙÄvÇÁýÖ]ødÃÛš”ú­sŠ&‰¿39û¯¼ç�u.°Knx æAÒ‹£21 f~ òî÷n´�”…û͸"=Ós³•ÂÞ÷Á™j{‡½Â�e|ÑËOOåÆäZè• ¤ow„Ч +ýÔËË¡w¶wƒ ¢Bè΢ò-¶g:W}oAÄ%Ú;òi�áØô|Ÿ[Ó�Xfá¿£[Ö)Ì{yæÀ|vVDZgRÌ¡. …³'ÌÑ^¦+£ßæFYjÖ»cdh 0ÿÌ;èС¼_K@%ÛVlmD'![—ó �"[{Ö£I‰²TYª‘‰"[›÷â‰ñ–&bæ˜÷c©YŒVJ%⮳(ÿ,�À¦W>ÚÇþnSN‰¸ÚÂídìJøˆÛºÎ~±·üq„7ó“äáò‰¸1³¬U.Š*2EÜšÍ\.:�䝨ßJ~Àrø8CîëêÊw¦åÀ­ëuÄ­|AEj\JÞ¹ÂeÁþˆ{×£Œs´…ëZ×7ûÃ^d‚„U×ćxñžv)Œ°µ|¤ß`L%ŘXËþ«0"~;ò4ó;„™U +#hä– IÛaÄ•Da„sf€˜s„©Gar5Ø)—5¹‚ptž®½¤ +ù2³¼wí3öJì‚#Æâ�$\¼—ûZ +Ãç½5ðáH ¡”°³Š�9¬)_W.¡êoÌ(ažíðˆzP�8—@ S)n ¼ßü(aRU”Ò÷ßWJ˜-8BÔµ2ùB„#tS,ÝÇ�±Þ£ èÜH14 +,kÑI b¥›ô…B¼Ü´gt‚}­Ûló±dÜ:¬èÉÛ�,Ù<ÙÈ™`šž“ y1ùì{$ɧgm2Á®°Y%D'§A­ïš[¨4t7N°g+:šŒ†@äœ�l©ÅÜÓâé²êÚÝé"öBÆ ¦mLJ%WcÙW)>u‚µjê’.QêlöO%öGŽîCΆ67w"à„P7±9Ùa;�Øqyðœ“áè@ÖÒÈ$dA}"•¯Õ“hBÚôÕXËò „«c;`Ïd +…x¢Olˆ­€~ÁÅœn±�Ñ”¾Gàö}IÑûŒð#̼^ÃSš×„y“CVð>kƒî±¼ÝÑÛ±¹e„nù½åŠº@nIoK|òû½]y+è¶·¤¿�¦£7ÜÔ1úƒµàS°ßôK¾ÎEo]œœòh¾ƒIª¢·|©?"Ô}%zg êâ17aÒ)Á3t§Óyås>!Ï<!Š1¼°#Óð¤¸øgò¬|_¨÷GîÚÙŸÅ‚Ôpg­3su ‹ãX" &Rí¶¦Ä ùÚUá ¬²Î¤Rh{%ãÆY|»£æÊ›3å´ûfŠ+˜±ûý\ýf7àY`1¯’¢a•g~¤p®Hîû’§Zú §™åÌ�ç cxvú¤…ï¹3Øê÷3jëN êmßïnÙWéâròÁ¤ÏH"öa‹,,€q +!ô^‰¬B#kuÚwÅË«æüIí?5k¹›æwµÂ¼qM‘qÿöaÐ�ß]]Ùùä,þ+Wã ”ëI5k0Ñxòv æsÞ†ªé!^3Á‡­£ÝnÛ-‚Ú¤[8 @g’ÐÍÅ)'4C€Xa„T±-çh±š4�kMàtÝè.CÞZò¤ nÔåoVÌ­£FËŽ—Þ7½ú]Ñ6ÐKGmï³íNP($‰#üÉ®Žš*‡oÓQQ!RX:œÅƒ†¤Fqka\¯œe~Ä|ë#õëֈߠ¬ Ç=�¨-½äŒü+û;jxµÃ�}(§k¯ÄQã^» òÓ=\m*½tb��jôJ* w×ÖdAÀkS¯ÓîO>jy‡Á¸aÖd>b¬ÙLŽºìµÖuÝÎ�¬Jc%�éiuhN +mbŽáÖnæ·«ƒ›eÑ +PÍУðÞ¤¶èÂPš³ÈGÚle<á¼#QzA�ííÑ frõ{ÔøQJBCmÁôpáÚÅGéƒé™ÄÇû”p¶ ]al³$Ù‰Òd2|åÄWÂÏ‹ù'³…†þ@ ¾{î`ÝX’ü R§ ?ÉðPûgÄn®"ÁPÖ~œ$Æ7à–«‹FúcÖ.eÈìÒfqlêCd •Ö… +jäκ\ê>]5S4ëZE7ûJzØI àvÖÖ ¼=pò--"œ~`?ŽÞß•‰Â[¨k*tÈå\ûþÙáfÔ¥ «µ�ÅnÆš¬¢|[(¨Œ±x¡ô$L/3¼’Rt¥Bƒë;§|úTqù99v²P�/k“ä +óñV\5Ê8õnfj—ûÞ��¹ni‹w"6(44}�l°$á'Ž�ÈóKªž¼´îT٨İ÷$ExMß[@ A®¨X‹^¦ù ϵ<“—óÖ¬bj}ÛAmbå3ºjqÜÎ�‡n; y˜mšýÃëø'—� *f[·˜Rèb!¥®…¼+Ä©ëþ—öºÔ5Ðd‹¬Ø 0ޱZÅ¥ÔegæwúŸæ´ÔE¹ÔE! -u™Ï×WêBä›^˜S×R~¡+uM”wá2`c¨ÔåbwÐ"`"§.?ZBµ¥®áŸFðÿƒhŒ¸Í¾¼ñ0¦°ÛîZbÉš€æZÜÔPõO¨Qk¶m:Â:šÍµh÷ZtlÁ\Ë=éή»·ówíÏærÌ£ÁY°ªÀòóý—VÜ÷_Åc�Óí–ß)z©š½òËd-ãƒ7*FW£Wpÿº]ê%öuM�¥ba‹I„²ÍmÑð¶9ÍÉ]92 ±—Pi”šÞ®ÄI¯¥¶m.d‚g‘¾IÁ?ÞÜ6/óR‚Æ¿Ê6çÕºg¥GÖ–ŽãquÇGÙDóNŒö¥ú²ÐÜ ö-*Ì6'Ê›zÛæ¨ãrH³ÍÔæuR� Œˆ4ÞBÔï´%ÐGíY�ÁÞvÜ]6Ø6ïjÈU¿Þ›H]¶ƒ¹êô¬ãü 6J=, �¨†™ØLøõÁéxHϨ\’6½‹í˜ŸouÎÉІ qj6õ'U# +¥$/<¨Ùµ;æ6$ñÎä:d@X’{Å ¡”´#óã;ÿ¿�SÄX¦ÔjãOÛôXñÏÖ`÷1h4Š9`�YÕœhvº´vß2d5;å[ ‘ƒÃÝ�L 6|Æo~·$„Í'”a�:È ¾AД˜œ)ºiÀ·1=´(pÝ=ÚåÙj[Ü[¨e�0ýŸUû lXæå'±’QðÈCj°°¸Ër]˜>º÷ž¬Í¢b<½SÙçA âÅôùYKe)–|ìÓ—ÿ«ó×/’‹Õg˜ßüs YR�‹À+Ãùc¡âj ü5Wkåy©ÐèÜ�”Œ@Dz1BeI5]¶úÖËßr‡,÷Ì3ù1îâ3Å9føŸM�ºãc]§8ÛÂ+L13g­‡kÎÊÞ¸…rËã^ ‰#µi…ŠX[† €۬ ¤*"—álð^ÍpÌ�éâøAnÊe³ ŠÞ~–Pçï´2WËp�ÑQ× ÷“lêp# Úß¿ç"dµK¾Y†ÃôÍ5iF—zØ»‚]†+4)ë]¹âÚV0UDR¿ã²žBëÙ?6&ºÑÞ›á Ê-+‰¶.íå~åV}Ú°²h†«%˜ö”[¡‰3h3LøòóWªjØ gRнZ5ÿ–þ­á•["°Üè÷6à ‹ÞO£r«­”’h†;SÕ:,¹¯VK–r‹›Í ±uÒRËpJ©³›áìr!!�ùÈ…rëË ­CÁ¢aü +J \,%½l3¥BÖ:1rC�Ȳ›ÅÅ­q‹{¿ª `fÝr͘~�{žÄGîâ®5cÒ7r}¦¥^aÏFß´*ËZÂzÆ·ëÇ)‹-,æÏ~5.´›º×÷¼L¹i¢/ÅmG&©Ö¸ˆgÔ€·–öK c,]_4c_ðªš&hßQ§v²¿5.Š- ຒ”wi, Âã[kÆh!Õ=v[ãÊ]‰˜ +>:(QÀm¢5N¾3´ìHöa«q|Î}ZTn:9.k²—Ί=ü!÷`�ÿ"r­Æ¹‹µt&ˆœ> ˜ +1Á L(�ÐÒ'5Ì™¼WãÐåýµÆÍ�v»mAÔ¶Æ}ûû\�+Q"Š. ™mѶ:®j�ƒê %u²�Ö¸B¿Œ(«qœùîÖW6—ÄW㞟x,,cüj�›}�Eæ )nhGŽÛ«qŒ$0a×øŸÕ¸dúü*Nuk\`ëNB÷8ãi�c¥ÈÙ¬ÆqÂuz¶ÆM´I »¾ìB× ¤M�RÔe¦µ¯Æi¥f—\4[2Wã@»ð¨=Æn�{7 ¸üå]µê–°vê�MQ#"c¢{,«qœ[ãºM¶ •’A–�×L<-ϸ]~Œ>Â]À* šôg�v+Û“Ç[NZãÿa­³Û|øHrÇ*Þêyè1£½wêhIÐfkz±v3÷LÕ ̲­qc�bËû÷³•ÙÌé'†êNè W*ÃÚý„ éKXVã¸î¦è�†ˆAD¬0¾Ü"Gb,ôÚ@Jg�L –”5§^™¨<¬lå@“ʼnHh9KÊ�\j[ãrs¦­9ДEŠÄ§*ˆ ˆ)@Ú(WßZi'G¨PƒÖßë¬ç"áÂ`mº¯‡HÛÀ>ι¿ÿu�Èpt¨lÍ­ëÚ´¶vAØÁàW,\šÀ�êöJø@à\´sý2�ÌgxŠQ(Å5ÉCÆ®‘@�ÍÝÕ®¡2/Œ ìs×H°¯ÛÐߨë±k´†æÝS»¦¦ ŠDGó£3ÄVwXf¬ÜØ5‡ñ6ÇÐuÍÁ²n�˜CT.5ìÍPvå‰ÝZâ†åâ}JSøçìèz´<ÿÕ†Ù,&À0ªÎ¾ n¡'ac“Ãòå‘?³w(£kîkÖm``BýÜ ¡Î9ÜÒ4“Qç Ü^ŸìÈV ˜ŠC²ù´¡V_ªE§ªó£‡s~�Äȹ²‚�º¤Xâ�JC)Õ¹ç3Jˆ:gïk‚âˆü*ê|Mwÿò CšMD�³1D‚jÌE•à +á”ïf’JÕŒPFàNPªó%nü½uŽ-3Ó÷^eh�UÎêŒu©#¯“Nú‡výn˜Ð5›uGÀ›ðCtK‰0ÜÎ-dÜuw$…�³¾º6ýCÛ20WnÒ?<‰Ufþ/¦�þáŠï&Ä~Ö7™›±'ã…ÓfZ0GŒžf6Z…f#ijðJ¢’²¢ÙL !l(Ô@nQi‹úîq“?“MªÇ“7“eûdÔÚ¨"›„Çøt’c4eŒû ñ™Ó-X¸C³å `þÜãL,NÃ…ÇP<â¿¢ÿJ\«Æõ«£¥�~æ9k4´B3»¼ ÿsÎ=Nqi×ñÐþ™¿ÞuU~v`ÃeíS‰x÷8 „ÿX`ÍÃæ£såÛéæ‹Ü{ÃŠŠ‡ægî»çNÑÕûнöé¡Ã:¡9¨˜Ù·ÃjøÚ>F@Ân#á·â.îÕŒ{M¤8™åfí‡ÍÞ~°p=n£€ìgFšiôöƒ ~¶öÃ]1^Ý~ø+`÷?³Ï…æ”¶‚ÚcýÜ~ð½˜Ëý3/ñ&·:/ß·×~p!‡×®ôtûa5 ó.µºÆ Í=g·s­ª»ÿ™­.4‡·Î<÷3{‡æü—ß~ @­SÉÏLü’&z}ß~û᥉B¢k?Üpk¥‡f9V¸ýpÛ\Åð.ÜãÚøœ¦ ö¾îq�Ð×C3½ø÷ाmy…V;eS;.ƒeÓ”ïvM—c]ÈY³•ç¹mšc?Ò— ckÈúÌyC©Ú¡Ùå7WŽ�p¶rókÇ-ÄêØ®SìN�KÞòßñ¢Ê+ +±öïÅË�É$†ò˾è=:3ÛtÚ vÃ3_ +kÇý•Qº!6¤ýSÚ’»mÖcO ¿°ŠŠNmÛ¼$`QáBBûþžÙÁµã¸uŒªÎXÓCÊÔy¯‡„öݰú‚¹ð”wî ÎcŸþcv�ís´žg½"ë—¹üÄ‹1ìÿÉ]ã]³JÿßÜëÇ,>+>:£Ôºi&ñOx¬K;N\¯Pð¸í¼ckÅd¡ƒýÅ€.¬Ù´ã/Çöc‚ÜÚ¤t&‡u ´·?º(ûøP³šq׎ ¯ûŸe÷pžs?-æÍR;n'¿Ð +cÖœ±<„Õ=U¾‚Y_>ž!Õ’»¹Tg}�£ØáŒá±çìxtÚ±¼–Våèä ”Îz�ëxµãìÇȘõ�NÜN|œs²†±¼Io• ׊CêÕ¹VSjÇõ6“3Æe5C»àÖ×ï•1y˜Y»ÄZCµÄ¨™Ö6—«�}Òà÷ú( +íFZW1(’©‹Ìåv±dJ²¯Xq:/§£Ç¶Å×®ñÝ–Â ²—~[iWy„Â!ñ"MR8° oeôƒñå––·ˆO�¹pÇ”‹([–È`g7:ý$­—ÿnYõÌ +…óï‘:.GžaÎô`íL•ÂáÁy �¨¨Î0wõ`Í sŽÚ1ãIÿëÕ…¹Ï°Î§e˜‹`”P¬ ój´Ó¡pp‰�N6@Õ*pÀf˜3ŒÖ+ªLWŠêf(K”ÂÉ^€K¿@L3ÌfvÒ8ÀL&(Ü/9¾_6…£FnO5ÃÜsøFÊ¿+ŸanFÙ§‘Z¦5@át²ÿJlŸ Ì0ÜKìVõIqc<:Ã(‰­Òþ9'ÓÔÎ0¿_˜ã½ peÂF›˜刧±„C*jmÍD×Ο0ðàä?-™»�UçƒCÝŸ¦K±?xSäƒS•N6Só7›ÁÔJ�HŸk|˜$°ùàtÎhq‡[Çõ  fÛŸÕmŠÈyp$Z£Láð~ȃCV{‹Öw +6™ÞUM1{fØÃ± H³¡ÎôµCeóÁ”œ-í«bn9®å5€Ídä§} ×$³Ò¾É4�ï\¥ýº´k²)%•V ܘX÷^vÚùûKù.7 iiý +È'QnaýÁDáU[²KÄÂ,ò˜îO]ù#FB·øS·$|bO�WË6×Ô{VÛÞ¿&{rb/z– d~²"It�5^ô}¼üct/ITPn*PKÈ}ÉãqÃèž›m·oÁåè^`|¸um •+ÿðƒ¡P Ù Ž±Œ™ÁuÃ{ I÷Õ\�¥Wòˆ3Œ(óÜ=“—Ö´¯¶¿6’rp7ÞÛop¦4rY·H\J³±Ù _ ÛkéÇÌ è Ž§ÿß_2^T›`æ[wݸËÔì9d�™ñÂûÁ�™OÑŽÛŽªÕÜñv eºŠögåj‰í[Kèè΋BQº©Ò@û¨¸î¥S×+è5h?D †ÚF0¤TCè/Ç`x#ìØ/‚¡|%Ã?õF %:pƒa’Ó.‘`HœÁÐ,¦Å +%ªÁp+$²r¸ S]õC¶ï †"Sj€ †`øâÀ`nµFN$&Ô`¨HiÆ'f k\­A ÃÏ,h0T»â�`Dç;Ý¡¥.Êq® a�gy=ÞZX ÁœØw¾ÄU/Ðá‹Úȸ��ô/_ùÉ(Þ)0M»Í¸"'¾Û`!5Š ëîc=¯l+×*þy3ÕÙzÈ�1w%Ñò z-í.[ߘÕw'|v-Û‚œN ÂzIÊÊxÑþô³sJx�v´Ù¡í©¼ @ÂeŒÃ2¶!Ä$>-w»�«¤Ï踾ÎK8Âlñéà€Â¬ë˜·c@3ÞÀ†Ü|׌Ea2îèŽþ+Ä{:î¨>æ•ÔêôÊ Á(AãP¿9jµ("Z–P'­5A.!-¥=v…L^¡ z-1.šY°,Y;ÃhW«ÑR˜šUüÒ¢4@=p!Jr +¥œÖ±ËîÔeB@]½ ¢„ ±š~Å€•Åÿ–b¼Ê�ŠUì¶…ˆDê“cȶøÝýkX1`Íõ÷ýÒÉ×Ðôeœè‹aâÀ‡œ„ø #EøV ÿ‘ü/·‹0±Ç þBM…ïçÏ´B"gŒ¡Í¦k‘צ–‹é{hÈ£æ¡óÛNíD6¸›Lò46K3SƒŸ£dÙM%ƒ^«™VÜ¡�ž†*KaPÒŸd,Û�© ÐNä\À ŸA•¶<ó½F h\Ä{�i{Çn°0Æbl0ÍZÂrcMþL#¸°ŸùÕ.#¦l°m2Óeúg]Y!ÕÓ—Æ6œ +3HÌ' endstream endobj 26 0 obj [/Indexed/DeviceRGB 255 30 0 R] endobj 30 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 20 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 23 0 obj <> endobj 5 0 obj <> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 21 0 obj [20 0 R] endobj 33 0 obj <> endobj xref +0 34 +0000000004 65535 f +0000000016 00000 n +0000000159 00000 n +0000026702 00000 n +0000000000 00000 f +0000078624 00000 n +0000000000 00000 f +0000026753 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000078694 00000 n +0000078725 00000 n +0000000000 00000 f +0000078324 00000 n +0000078810 00000 n +0000027111 00000 n +0000078511 00000 n +0000029338 00000 n +0000029511 00000 n +0000077750 00000 n +0000029585 00000 n +0000029729 00000 n +0000031212 00000 n +0000077798 00000 n +0000078395 00000 n +0000078426 00000 n +0000078835 00000 n +trailer <<1B7B75F63A244310B76F0104019C8925>]>> startxref 79042 %%EOF %BeginExifToolUpdate 2 0 obj << /Type /Metadata /Subtype /XML /Length 25388 >> stream + + + + + + application/pdf + + + openhand + + + + + + Adobe Illustrator + Basic RGB + + + + Adobe PDF library 17.00 + + + + 2025-02-20T09:25:37-08:00 + Adobe Illustrator 29.3 (Macintosh) + 2025-07-10T15:39:03-07:00 + 2025-07-10T15:39:03-07:00 + + + + JPEG + 256 + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADkAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FWK/mP+ZPln8v/AC8+ta7MQpJjs7SPea4lpURxr+tjsO+KvjH8w/8AnJz8zPNtzLHZ 3z+XtIJIisdOdo5OJ/37cDjK5p1pxX/JxV5Rc3VzdTNNcyvPM+7SSMXYn3LVOKphonmnzNoMyz6L qt3psqkENazyQ1I8QhAPyOKvof8AKH/nL3U4Lu30f8wytzYvRE16JOM0XYG4jjHGRPFlUMP8rFX1 rb3EFxBHcW8iywTKskUqEMrIwqrKRsQQdsVX4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX 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 + 228 + + + + + + + + xmp.did:906b3a2c-8a21-4be6-adea-fbf679e97908 + uuid:4bf8121c-2cf2-b840-890b-91acafa933e7 + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + xmp.did:e03ed205-609d-4e56-b982-2098b2888f20 + + + + converted + from application/pdf to <unknown> + + + saved + + + / + + + xmp.iid:D07F11740720681191099C3B601C4548 + Adobe Illustrator CS4 + 2008-04-17T14:19:10+05:30 + + + converted + from application/pdf to <unknown> + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:FC7F117407206811B628E3BF27C8C41B + Adobe Illustrator CS4 + 2008-05-22T14:51:08-07:00 + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:FD7F117407206811B628E3BF27C8C41B + Adobe Illustrator CS4 + 2008-05-22T15:15:38-07:00 + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + + + / + + + xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 + Adobe Illustrator CS4 + 2008-05-28T17:07:17-07:00 + + + saved + / + xmp.iid:01801174072068119457EEAE3A61196F + Adobe Illustrator CS4 + 2010-02-08T20:38:51-08:00 + + + saved + / + xmp.iid:e03ed205-609d-4e56-b982-2098b2888f20 + Adobe Illustrator 29.0 (Macintosh) + 2025-02-20T09:25:36-08:00 + + + + uuid:b5af39cb-38de-5348-9b33-3337f260a015 + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + + + False + False + + 0.444444 + Inches + 0.444444 + + 1 + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 33 0 obj << /CreationDate (D:20250220092537-08'00') /Creator (Adobe Illustrator 29.3 \(Macintosh\)) /ModDate (D:20250710153903-07'00') /Producer (Adobe PDF library 17.00) /Title (openhand) >> endobj xref 0 1 0000000000 65535 f 2 1 0000079894 00000 n 33 1 0000105366 00000 n trailer << /Size 34 /Root 1 0 R /Info 33 0 R /ID [ <124E5CF21A0142F38919DD3055450758> <1c7B75F63A244310B76F0104019C8925> ] /Prev 79042 >> %EndExifToolUpdate 79873 startxref 105565 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/info.plist new file mode 100644 index 0000000..a75bd41 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/openhand/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 16 + hoty + 17 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointer.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointer.png new file mode 100644 index 0000000..f30c267 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointer.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/cursor.pdf b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/cursor.pdf new file mode 100644 index 0000000..52d715e --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/cursor.pdf @@ -0,0 +1,450 @@ +%PDF-1.6 %âãÏÓ +1 0 obj <>/OCGs[5 0 R 20 0 R 34 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + application/pdf + + + cursor_LW05 + + + Adobe Illustrator 29.3 (Macintosh) + 2025-02-13T21:41:44-08:00 + 2025-07-10T15:38:37-07:00 + 2025-07-10T15:38:37-07:00 + + + + 200 + 256 + JPEG + /9j/4AAQSkZJRgABAgEAAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAAAAAAAEA AQAAAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADIAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq8 y/Oj89vLn5aWCxOo1HzFdIWstKRuNF6erO2/COvTarHYdyFXxx51/Pf80fN9xI2o63Pa2bk8dNsG a1tlU/slYyGkH/GRmOKsBd3d2d2LOxJZiakk9STirI/K/wCZPnzytNHLoGu3liI6UgSVmgNOgaB+ UTD5rir6v/Iv/nKGz833cHlvzakWneYZfgs72P4La7fsnFifTlPYV4selDRcVfQGKuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpV5r8x2Plry1qev329rpltJcyICAX9NSQi1/ac0Ue5 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 + + + + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + xmp.did:655df5ea-d042-47e5-ad3d-27bcfc097806 + uuid:8f825713-f92a-2b4e-8d8e-0eb057dbf57f + proof:pdf + + + + converted + from application/pdf to <unknown> + + + saved + xmp.iid:D07F11740720681191099C3B601C4548 + 2008-04-17T14:19:10+05:30 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/pdf to <unknown> + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FC7F117407206811B628E3BF27C8C41B + 2008-05-22T14:51:08-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:FD7F117407206811B628E3BF27C8C41B + 2008-05-22T15:15:38-07:00 + Adobe Illustrator CS4 + + + / + + + + + converted + from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator + + + saved + xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 + 2008-05-28T17:07:17-07:00 + Adobe Illustrator CS4 + + + / + + + + + saved + xmp.iid:FB7F117407206811A613F6814015D6CD + 2010-02-09T18:34:43-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:655df5ea-d042-47e5-ad3d-27bcfc097806 + 2025-02-13T21:41:44-08:00 + Adobe Illustrator 29.0 (Macintosh) + / + + + + + uuid:83424cb0-cd48-e547-a27d-d9d737400bc2 + xmp.did:6aa21658-8d9f-47ea-82c9-0124b86f36c4 + uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 + proof:pdf + + Basic RGB + Adobe Illustrator + 1 + False + False + + 0.444444 + 0.444444 + Inches + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + Adobe PDF library 17.00 + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 7 0 obj <>/Properties<>>>/Thumb 38 0 R/TrimBox[0.0 0.0 32.0 32.0]/Type/Page/PieceInfo<>>> endobj 36 0 obj <>stream +H‰ìVKŽ7 Ý÷)ê£%‘·™YA�EÐH¼™1`çþ@Þ#UÕ“d×ðÍWüˆ¢ø{ýííxýòV�Ÿ~~;nßoõè�/øÿã¯ÛŸÇ7|â¿_o¯¿þQ�¯ÿܾŸä+Ý—³4Ÿí¸„ðÇMJÕE‰â¿¥µ£•ÉOÅLŽû­àJmÇ(2HÏ1A«9DÕB£¸ëÑËP9´´ºÀÞ7­e¶©D³tœô¾Ñ‚M…D]¤gÐ\cŽï+,[%R83J³zÚÂYKú¦é$Ñ*6,ŸHq™‰z€² zõ¼,®Ò„¶ÆOfÝÛ&)$Ë.FÅ…S¡:Mµ²lÅ díƒOš.… �ÔR{‡‡ìÕï@ôÁ¨0ú3ô†o Û”Œ|Ýô¯¸.$Åd�g’2Z'`(Gè¥6‡‰VY´ŠWáÅg(µ M5td2Rj|{f hq$ˆ÷MÞo8ÀíbØô­€K�¦jsíC@·µO:Ý +) ÁYÝàå{í�ì: ÷E¶Ê ˆP!¶¼BÑôx©Eð@- nz¢ûí…n}æN<05aÈ-Ž˜f)K숽¹`ƒs/ð Wñ‰Ç-¨† VÆÇb€¾#=FdÏŠÌä‹_¼Ù졵Ú'{þù(�JØN$ ƒ)(Š¡Ã[äò ò¦�è¸� 'Ò¾0Ã:± !wŒÐœpˆ�¸QÈ2íO.Ê£û¥‰Â™ŸÌ¢¨ª\‡!²§C¥») ;hVï8âŒßa¥ÇŠ Q¶T£w†>ÂŽXÎ3F´Ï™4ÄкmÚIrÔ F¨H_)§�r�ÑFêäuëSÈÑŒ6üîL]Þ îÂS`²/CAønÖÚwÊ-™žOX +­ äÌÆ¤laʨ“`¤`‚–ŽœPRNYÀ¾�À ò+o¦Q—¸ûˆì@çíÑñ%²Xý†`àù ¥fÅ4ŒV_�$eàrØD�Ô] è L8õqb(:Ú„"1ìÑŽ¸¤3ÂĈœŒP*›œEðTØt=3ˆc"û �¸ɮТe¯:Dùd鮸bBó+’ñ²ùÝ·ù„ …gEÏŒêš(B#¾2Î*Ñ„'ÓÁí¾/|žìG»'ŽÚ<:AÀ‹²ÖÙãÛŽ‚µèÞ,7 ‘Hf öbx–yƒ¼Œ—­=ª21}#3µ0#¹Ñc“µ�£.V÷๟µ§ !ªqùÊ[Lv&H�ö°¢ù6ÂÝÈ’ÖÝLÈœ­#Q$“èƒË…b\ŠèŽHø‡Y$‡�óLιÜÙ(�ÍNMŒl^3[µQ� ++ Ð@ý­ÈÇÖç‰8<qÝ’«§;øÐ!¨+'h wÔA ¥Ÿ= +G¥LrÅ´V Ÿå,5Ñ~ÎwÅÌ»x1²aĹ”H -‹Ç>³n-qš(�íl Ó°\ÚÁòŠÜÕÆ-L5Ú‘2éШ$‡Fg›ë9°eÓLr )"� õ¾Z¨ó›O.<ޱ�Œ,Ü=» Ÿˆ[¢ÄRI/[ϰï}¨yLéé±oÔGÃøO;¹ßþ¾ý~.°ÜkŸûìsŸ}î³Ï}ö¹Ï>÷ÙÿkŸåÀùåËÛ�Ÿÿÿÿÿ +‡K© endstream endobj 38 0 obj <>stream +8;Xp,*>JPS!!*'!!!!$!rrW7A8.BP~> endstream endobj 39 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 24.0 %%AI8_CreatorVersion: 29.3.0 %%For: (Roxane Gataud) () %%Title: (cursor.pdf) %%CreationDate: 7/10/25 15:38 %%Canvassize: 16383 %%BoundingBox: 8 6 23 26 %%HiResBoundingBox: 8.09783214889103 6.23919362180823 22.63734643932 25.0008173382066 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 14.0 %AI12_BuildNumber: 146 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 0 32 32 %AI3_TemplateBox: 15.5 16.5 15.5 16.5 %AI3_TileBox: -272 -340 304 394 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 0 %AI24_LargeCanvasScale: 1 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI17_Begin_Content_if_version_gt:24 4 %AI10_OpenToVie: -1459.65288549252 1529.05279865477 0.562792566466053 0 8112.06562040815 7453.65537266629 1698 986 26 0 0 6 59 1 0 0 1 1 0 1 1 0 1 %AI17_Alternate_Content %AI9_OpenToView: -1459.65288549252 1529.05279865477 0.562792566466053 1698 986 26 0 0 6 59 1 0 0 1 1 0 1 1 0 1 %AI17_End_Versioned_Content %AI5_OpenViewLayers: 7 %AI17_Begin_Content_if_version_gt:24 4 %AI17_Alternate_Content %AI17_End_Versioned_Content %%PageOrigin:-290 -380 %AI7_GridSettings: 1 1 1 1 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 43 0 obj <>stream +%AI24_ZStandard_Data(µ/ýXl%5£&�D†ùïñ¥29h³oY* Hgtæ–‰úïT%ôÔŸ‰À¨ 2 +] +™J†ëÛãe Þñ®ô +ŽÝ ¾eWôÄñO?ÿξ Ç÷kNý Ê¥5£8ú/õ/è§|zÖ9Þ6¬ªd€‡8 ÞXuîÔ¿„¡x§þ¥{1VÉçG¹ì�ú—lG2¿�Jizø…¡Øíì…kU6%ÿÚ¥mÙ­oÿŠOÿ×*y†o7~µ`;«?íÒYùþ:óY=Ç3*{kw>ݵ›•¤}øãSöo7žmX•ݯ™…šeVöf½SÎN6߯3£œŠ RÚ\Z‘‰Ëv[÷LÛpìÖñŒ;˜~¿à�üD÷ð?›¬¿òŒú�û8Òó§í[†kºþæì¨¿ýkšyÿ@%»±{Ê8êÛnÍ»-ϰê×™€Ó­•ÑpŒÊêŸÊx§œý€o7þœ‡ŽŒøûþ¶}þøäÞõL X½«Š òo÷ö ¸á®ç9fU2¼²aÙ eaØ}çGÑ®aVÀeÊ-S¼Œ·æûžÑ• +îx$3_v²´a�lqËÿ°ÆñOïÔ¿”^¸nKvËð¼‰Ýßñ²±döù’,Ë®‡åXÚ°Gæ•6̽]µ|åµzÐß6|A7jƒaˆN›ß?v7¯¼öS”ñГ½óÐ�!ØyÙñ ì,»ç£X‚|;ž‘¾—bïß–½Ų䣻Kpì8ÖéY?¸ã—›úªAÏ8æŠ2ÏK0ôã×?�ÉŽgáçI2ä#(޽ƒ^$ŰûòãdÉ¿Ž�åÈE C;Øñ¬äâØC²üÀ‘‡£ØqL“ñ˜nÁÎyðyNDQ¡¾€ÕÃøûjä`ý6H‘ÅóŒzÇÙ‚Ç1ÌÆ1ÌÞðë•çÔßµ»ñ2 ’e¬‘-–A²ÔW=ìuDÇÞŒd˜Œ÷ €¬g Ï*Lj2ž=<¬‘½ÿ­gÔïÜsÆËÙ€Ú•gøFÁª‡5jMì?k®o +¶]”…roO|‚m8äekdÞ"“aw•*°GVÿ;†Yïô°Fö[nÆËÜã +ÎÖ«-å2“gùT`�L`–-fÿxÀí¹ë³äžwÐg<ë +l¡À^yí²…·B½æOæ-êÿÖš¬þ*Wv1Ù+¯*ŠÙhÆ{Çl´´a´´eœ÷Œ‡™È1¬FK[b&†aXI²�ûî½ÇÒOÅ0’,IŒ£©~ô¡ýèI_úÓ£>õª_=ëù×?ÿ}ø…Ÿø�ù•ßù¡–~ê·~ëÇ~ì ?CPG�KðQ0UpY�‡=ôá‚aŠá’až!¦¡®!r±‹^Ä>CQG‘KñQ1UqY‘�}ôã7‚c8†£8Ž#9–ã9¢c:ªã:²#';éÉ�É�É‘$É’ÄN•\I–äe/}ù•`–b9–dY–g‰–i©–kÉ–üì§?¿<ÃS<Ç“<ËóÁE¶ÈäNÉ”l…º]¾ê]³xž?ñ<²•ýªÑ¬þ÷í¢þmðüßµ»iÙp<ŸZ<ôÿòÚªçÔWÙ"ûµ³ v;E¶PÉ0Ê­?™"[ܨŸpÒdï®çõC +lNÉú5×­ «^ñ¦Df0• ß2\oä9S¢_÷÷¨æx®7Û†Ù·ü[­9}åuÛ0¦ã“–¼üïÛ�Yv2ìâX–¾ä¾ì�s²ãï/\·¥‘“Ÿ#ã¥wó_ù�"ø�ŸØyŸ}žäd÷âWöòó�˜}¼—$ vÿ‘cÉ;ûwàɶa¢Ï>Ÿ‰™=̨J†_ù5£Û†}ä'öìñ€mÛ »é¶aä÷{z�woÌÿvUy†©—îêÙ®_(Eöøñ ¶ [(²Åûro·Í¾ì +˜;ŠìQÏìו>{È3l×?T")ç¶a¼}¶è(êùvëÛ~Å1%Ëõ|»¿N· Ëx÷9þi~O‡g£mÜÒÞ7âP…xÅ n½d…žJ€Àhî—ùžTž—á²a¤(âiçÒ@<4@+R’Òœ.‰”_܆& ¹7± +m¯Û0FÉjŒægŸ›¸µqPP߆٧Öä^äåë^ ‹×*ˆ—HXÐüÏ…À·q ùtB¥÷³a­ÒéµPކb 0;…‚#ù8%Ï#^nÎŽ£~`ÃÐŽë +m¯ ÙÓçåÏê³‘È ”†¿XÌyÑ\¯c"t~2'\z«õÒpÆ>ð†óø†‰oƒ†#åÖÓÉè‹ïdfìå>¯‚6µ“Ôv(Ï¡Xù†Áè½Ðb¼Ð·ÔÐV„PC#S¦…æéPœF:H‡FA54°®‡ÖÂ3À¹ur^J¶Î`û+%ãmXÛ¢O�€/]µ9 Ÿ"~‘°`loƒOÇåñ×å= œE9¨sà +Xl�ÚΚ®¯× Ž|àa)ÑÞx ^EDÕ 2&”Ô¥«'M&¡íu´'49ÅhÀãŽP‡öIX54î Z(âqhšéj9­¢(à4w’QýT]½r€@?Æ[øK£ –Ȭ¢í¯„ƒÇã°Ÿâ»K+Ÿ6*8’¯óíåg6xOœ ý`LhŠt€ò8²¡d-âäL·'Ù°›‘P_fSà'‚™Í|CÉfj¿¢#XyãXyƒ®=BS +  +¸þ¼6°rd€ò6Œ5˜œV^¾®Â29MTVZÚ¡8ÍÒÿ¦‰žCãœv²¾¡�8²CkÙ¾®íËM^¾ÎӢĒÃ(Auާ«¾mè7)dX|Ãæ•¹:énÁx µ –�¶Ò%ñôóh‹JpÁpë ­¿j`ˆ&GšB“‹TLÎá³Á„ŠÊMOÆ„ŽN\D•pºq²êÜ0idâ©î2xSÈ\9§"0q»Kî3b T�|P¯“89 ŠH]O>e8R.Òr :ÚBht„pêªÖQ}ï oWħ±^á�…ŸØ3Êm×@¼¼U Mθ=‰Œ|Ø4"NNKÁ9ñD…”`=‰ËxÛf]§¿4á4‡\õDä>Fhµ‘08òiðT–d ›1ÞuÀ’PÂH²a$ƈûûÀÛà*À‚>šS#µ©´ñÎÉÂk©~÷* ¤._§²LNû|§C«t(NSYßÐ,o©¡Q +N;9Pœöœ¶aŒQÞ4O3€Ð +P¥†¦a}C#%<‡æœ!z´Ù‰Ò¶[Þ»Â!¶ÂQPoôñ._$�n;_˜&|uHþ@Õ–æ¼ Mn1ðxc¡ihvùN‡–¢€­ò��}¼8ÍN9„ÖH9„Öh±mMX5´² ³Ð> ^h+±3ÀùGôÎãÜ÷I˜|ÂÕpŸa… ð.Éx›:±êfw£ó›ÿhuŽDW8ÑšÜË?‚qfM�‚–X ’‰~ ‡IiJ<ˆ—›&Md©¡É©#ÄËÎãÞ)áFShrÖÈþ;£¾’Jê9½ì‘a·€ÿé�rBnÛ½¬n—V}»¤’á3ÆEy~ ¯hWöÈðå•ÝlNÉ”Ó\éq<£ºÓœÀÝøDÃ,{þvýüº;Í ±Û�愯’Ýú«ÜìÌnþö«;Í «/Ãqê¿5ŠvãúˆO®üïî­Qn›×ðW¹ôé–gŸS5}Š€w6�JÍïÿñé†ïӜбZ*ÕÙ´«úrgÓñÛÝr +ÕãΦO/»»åTG €O�MwUG pá[vëÿº+»³éoßßîlúõÒs]w´Yvo7Nu6½ +ÿwn½ô)ë%£b:@§ªçU÷cewo�ê�wˆbÙÅt¥dhÛ±´P½kšö]ìâÛîu¾ÝiN¨iºþàZÍœ²÷Ëp꫊;î¾ÊmÁ]MÓdà4'Ðt|Û«{îZö¿e¸k¡Z7|²ÝSwšæUõ¼¢á8Õ½5ê–?\ÏÝ[ûq¦mÊ�O]Ï­®…BɯTg×o�¢çŽÐÕ4ÝÕ4�êh4£:ZÀ¿áôËîh7ª£ðž0¯~LÃwüÂü®ç§ê¿‰¿xÃ}z³êFÓnºúO ¾ òðívnyfïoŸ^žnÝÚ1ìʧÖkõù·[ù·¾]º5§?ŽgTf ¨ÝWvojVAšvë�ç.ÊY2|é|8tú·í²4\£ì¯v2³Ì’_™ §æìÛ¯,veYÛ_•)™íf+ÔËÎPpLÓnv¿ænœ¹pöQnLgó�½ÿËÙkPÏYÎdØU©dø†ßŸÉs&»1�½æß¶AYǪÙÍl7û1œÊd7SÉp×Îä¿ ³³7û«;ûµ›}û¯>õÙU¿óþ£sJ¦|•»±Yµ‹©¿|§þe€ ßöW Xµ‹iÁõÇw|–g ¨’a1¬?œ‚où¿”WžÓNàÖíížæuÒóg>�Ý{ŠW àØþ1œšëM‰U7þÇðGdÕ3w}¶æšu_y†mû×tkN¸uÛaËoÍõ +5Ë3F`VC– Çõ§LþûŠQ2¥Äª›Þ)§çÑ®ìé°=Ëp6ËYÙ)g&r�íÂñ™Á·|ŠžîÙ¬YG½ñ£éd~LÃqšQÎÌwÊé©õmËs +_îú|ÿíÖ*£È 6\»!Ê)ÿV‘AÜ_Ÿô\§âØÉLU +”EòüÂott7õ‚7 ½£ôݿܣ�sÓ}濞)j3À�iV;lÏ�ùÿÎw£~ü=§M e—ä¥{X~a®î@€�,?±�Ÿ»8vd_ pú¨ú5{PpÜHÙ_žå÷³PsÜáÓý=µ Ñšoû…ò»v”l¡ð°å¸%À½]õÇt˵ ÷ë×÷íÖo ¯PûþžŸ\¸vt÷v_÷þ­»tÈÿ�eÇg9n 0(þ;g.‘GÏ›ì«Ü—Jv/÷‹¾_š¬¤œ+ûc²’r¶ÜLv³™úßË /[d­ü~Œ�âNý Y’áJÿ‰<×óÄ¿æ4ŽÚm¬þøä~TJýo™bÿ–›‰]Ô|AÍêíNâïQd�n]Ÿ^}{âøÅRN–"ðôI}KR¤ZÐlG5z¡.ùpCÚ�&P`à´¼t´îç3³ü£|«s0ˆôÃrïe £h;-ˆ—¸°RBþ8$šAü2 Â9:Ó«Þ,À„Á4á3á_–$Ú´\D}!4Iª!ú ¨F¥Âs’¹snRÅS4Æ›7èFB­6’û=+å¨ðDÙ¹$™¹(Ž(ÅïûÔz]jŸÒ--°DèÈ>µ¦c$B} $< $D"Gh áźÔÖ¥ºÔš]ñ ø\¤6„…B!‘�DZ{šHñD"Å?z”&8ädt�(eÙŸeβ?ÿBmú8=MxŸÏG´Xt‹Æ‚±0MøÂ4á©ûqZ›Ö#Ú°ÏB{ß«Ò#•VÅU¾J |¾¯Òª(‡¯ÒzUzä�P( ¼¤J"Ô—DèDÙ"·9QuÌ@Â7&U[šžd‘¬Ú·o¡d™)É29O“,“sù¦àöÂw2¹ c]—?õÕûèÆÈ\VÇh½£uñªW TVõªƒMlTƒ kÉ »�À Û°ÎÜ0ñü04(ÃäïóKñC‹å>ƒ¶á¾öõ^ÛÛ§U ϰaRÜã1G‰õ¸}jGi—¦Â.ýR‘H$jKÓá"¹H.’‹Ôš†SÁíéV*¸…žâ�…‰îÜSI«JZÓDе=jG­b¸)îANFo@NFO¿/Ôš cÃÒÖÆ"jœGß@‘ï³ÐŠ(òq mà@‘ÏÂïOä«´J®òð½*=RiU,½²!:K�T*­îþ­ÉQü­Rü­ú £$ ( OI¸Uö�¯UEÄ›w:ñæÄ›v‹PˆÜŸ†ÉõÏDåýDÅhý†±ì†Ñtc´"¬•´ö�nŒVÇè[£”´v¹1ò³êç ›9,‹´~*qrJj,«Î ë2oçì¬6 êy³�ÏbRx/ixN+3wiŠÛ'ûÄÕ¥N]J «Ó@§¢ºHø4�)¸=%@ˆ¿àö,ôözªúç"µ—‚ÛS®-¸=±øN W"µa W"õ5\‰§G­ +…j +i�1�9Ô.ˆ94‡Z““=ÆÂç?ásÅOø¼µi[›ÖôˆLžnö4MxÊ•ÜÏ=¢ÅŠ|¦q ½�"ß§qç±8�ˆ¶�"߆ݛG$¹®òðõÇá둯Ò*‡¯ƒÝª"â"µ&G™Á[åË> xJ‚#R1•D¨G;UiÒEØ+Dn“S¼ÌÛF¡ÞeÞíú Ÿ·oû² %Kq€=–Z²|û¶¥ÙJìålÑ@“,ȺŸËŸ>ÖeW†IZ;K ýŒØ¨~FlLNÝ^—“Ñ“Û0C�2^%5³OFOE p4àñ1&ì̓c  È­ÂbB¶Þ‚t1!K�O>Ô[Ø´¨ÓávÄ–„´¤]²! î6H=_Hz¤˜P³�Ô¢%E6D¼ÃíkÉÏBƤzÃf–´?6D#Z\rY‰À ù**»ö ò�@Uw¢$ bÈÔhy¨µ{ÃJ#Ð v&,ç*¶@�‹Îx0ˆ^²|Ãlá$HGå8…-Œ «s8)6l½çר $üá3Ä›‰³xhš¢:4Ý0–ßž¤X ÔÑù°ëÆü°’CÉ–ÜPÜ®47G¢ð‡¢ý¤ÑŸÏÁãi�ƒ(A®S§Y­?5…v~ŽÕQñfSF·C´\Æ„¦‰J"Ô§ãÅ9|ö©5íSkŸü롾K]Ú)�â‘â¡�„O¿®.µ"‘¨.µŠGŠ×¥¶ÄѸHŽBO9 +=å(ô”‹D jKsÃDv§àzŠs…žâôˆµ!‘"­=½5¤µ»)þÑ£Ö¤G­¹as¨õhÃs,›cÙËæX6DzçPk‚D È%9�e/XöÇø ŸwÛÒTÑ@¼<ña­MkzD‘GÔ™&<µg”+¹ŸoXj�xy¢ä~n¡-X¸�"š…F,8Ë–A‘ã<,öŒj8�ÈKb¢EWyø°Q¡§x¥UÙ0ï*ß«Ò#Î#ÂU,}5¿J«bé¬â±ÊÃGI(µ&GùVö�G;n"±i탵ßꆰìÏ) ‹å>0¬ŠHJ!X‘UkMŽbÏhw²¼A—¦øDÅy@�Ûæ=AF¨G;îÅÒ#Üäà¡…Èmr¦­D¨ïLló6¹z4Ñu‰Éž¶µi7ùP²LnÃÚWÑÑT"·Éµ3¦áÛwò�L®µgÔp $¼M²Ú—ó@÷çûÔš ën˪ˆp¬A5z£ƒ}à /QÁÝ0Öe`8�wu€›WW'‰ƒÛé†*r'±0‰\‰ŸC­É­öŒ~÷ +Ñm>§’ÖŽ°´˜O(ò�H«c$÷ÆÚX+B[šõ¯<ĆÕÒú­ L¥,@}�â‘r‘ZdÃØ”Ñg¶­æŒØ0PÉýœa(xNFG;®–à`ôuàU +�$|3�ð‰W‰R²N°·ma…#6&·aÆ«4áÂ4áP[š,Õ129՞юúWÞ†¡öŒÒ'£Ï˜Æ¶šæç=¾º‰—o˜jЖ¦‚XÄmýbMnÃ8˜ŽôxKašð“t2 ¾ +Ô¥ ÷6$DxhÖÐ bd˜�žT[òdC$vo×A½a Ù’+ÇÀ[Ò{V¥ƒº{­� )¾nXKz‡¡% lH܆¬Á·¤_Ä,y!5†MÀÅÀšmB~öàíû®þ±a C Ú#“š· ÛXØžÀl†+mK%½D—Á ~g uiâ6¬3ŠÛY؉Ï`² uåŽÍ@ˆ·›^õZ8}q€½ ;xÀ—hÀã ™Äx¨R¥#Z•ò“�5lØÈy<,YZÊ29mó–Úka Ð>o©¡yB � £6´±0 rRŸ�„íl*üUàé<ÝZ6’Ó=¨^†AÏóòù!ßo˜—@ Ÿ´vt‘ja§ÚàF\. ÈÇZæ„ ù•Ú„}i\æ"å�ô|H؈‚À<2˜Á ‰Š%@8‰×4< Çyú½ê‡&P×ö¥µWÍ5�U§9.r fûN7�O>826÷°ë…&Pà�bÄü˜þ\˜�çYDàº~ ^¾:$ZÁ‘!m…„P«Tƒì˜"ÞávÄSÚ’vhC Ô® ©ë Ó¼/V&t‡@y„cKvN¡ƒú@ötfåÆÃÀ®%í ËTüA=J _K&›G+qPËñrkFð¡›%�"Õ ‚01D|K>¯mØÙ _ù'̹"$ +BC\<'µ™ ¯l!„crÛ†)DŸ©@¼\"Z\Š�€‹SâlYK\BëzÃDnÓâ >Äât÷×(X U” Òdßb !uÉ,>š¾a I‘axÁ}–J•D`§�‹¤ ‰§‰!´ˆ\<âå&!HC +�‹ä£Cލ-Í„„¬z \OuLXPä;…¡É‘¿² **@ýÉ»¬�ôà*NÒÚäÉèˆåñxs„ªEàuà'_Êð $|Ã`špG¨àö†JZ{£sòx«C¼Ü½œ¡ ‹P †êË‹·Aùüœ´e\¥&t¦��ÈA^gäñÔ AÈÕ°â*M->¤ÓŒ =etŽ2òø¢;,:ùùD�Û¯}àû‰w6ï.�¿”�ÇáÉè\º)owÂÓ„{Pëñ»U>.<�kZïÒz|Ãl‹ÀIÚÅ£åÓãk^" ß�<ÖÎx<Š—(@Óã(M" °œQhå¼®ëÒÆ$4¹F¡§8cšƒeEbzÓ„Û¤ÐtLÞ(‰PŽÞb°(±¤ÖÁíR¢(/_Wv(N#qd‡fÆðBC@xmÃ6ßéÐ ,³à:šˆ#JX5´{Àè7û} )Õ#.gç‡ ÷µ4΂¸ DÒͯ¡B _¡±7lÀ4a©Ý4ÁÄ›Éa鑃ʆ6¬UÙ0Dÿ¤$��¬”Æ7¨uF$�Ë£WäñdôÖ9»Ä­B s2ê$B“ç’%ÆZMîŠXD“î•X�§ó¶a5Aès® +`nµ v`™œ¦¡] í¢šÆA:4H�Ãi™Åi´«¡qE§UÞRCcÁ˜Ó$ŠNËtÔFÂÆ²‘€R0â‹P®–’I·¿éÏ »dP–ÄPŽ�+”ãyx˜.ÝF¡  Ô†Qúõ¾Äz|e”@¦ÇyD6lA¹œºÃ#ºç©áuàQÄËä +%ç1E7fà"Ëi_æÖY�B“K7¦ ßlÕªð¬]Âu×KgâWÚËs²êòCìÄØ©$9ÁBÓ”6lØ¢ÄzÜÑBm_Â;œÓªZ}~v’RimêtjiE‚H%”çV’La¨²’�•U›sӄ˘m4²¸ÞÕÚ"AX÷�Ö^ËÛÊëØˆ€¤ xyΊh@Q �ÏYB™Üõ¤¦ßcà 4"¥r^¬ˆ¥zCÁ@]«òör5q ÙÖ±9)õªŸó" Òœ†I£ÄŽêÉ,q‰!I�`áTr"d–�Ö~PÿÊsLNa0Mx7�LNÑQ& +vÃ^[Cå oƒ�±=¬‚h�UÖ†[õôN—¤Ã›ÉJBH?gIM¿ɵ>$‡ÃÂ?Ï|A)b‰<ž0i ­Q× m"Â4´÷;šù�ÍÃú††(p8­“ð�…–a}CC;§m˜¤CqâÍÙ “ŸXx(14âÕÙ ¶Ï€R2Þgq€ê›«xtXøB«Â'¾K +L ¡20�pvYò-a¿¤]Ïïøi•¸å´ˆ`½Z>˜Ÿ‚�AQHˆ&iƲã=ûÉ9Ø4Xƒ$•”ƒw6#¸-ïЄ—íËDh—RƒÓ6ŒÆœVÆðÂ`À Ÿæ!± t(™W_õõÇXý™)ùH:c<„«a¿‹Ù¹_ãñ +�¡•sF`]k%Öãr€[]&„[‰��VFsw@�+ÈÒ«ÉýUsŽL]oØAÀÄ]/âàƒÓò <³\åXXþp$¬ÜKXWŽ>bwIX54[42p$ÛcDõ†aáJzêz(ðPÝeÒp_ªy¤¸W*Ú�Cyù:ÈL²k/¡P~6§ÐÞ°“ˆ`°)¤]+JS]wbË+¨ËQ ÊrIâàB.•×$\§…<�ùI3h`X½ŠAj[ÅwHD2ZF”%õæK.Yùó†‰âËÒùTpqR_r…™ÿYˆÏ±:¨ l/¡Vw–NÄbHØ…£Áˆå +;. 1��á&1½\†ïuIšˆ¾\†3£špÔ…&-‡‚Ú0Ny›leU m€ò4YÁ;Љ92œ¶3&�‘c µþ´Ü'PRC(/ÃèP�ÞDB|n˜ ê�þš+œhš7¡ÉÀ(LˆNìè^—DŽ)¸½àöSp»£�)¸=,ô”‹ä"¹Hôˆ…&ñ*A@ ŽáïOø\öÈÙó9ca¡-߆!* +¥À`Qb RF�_¬mÞ_¡}7¬t±Pk<ðøŒØ¨~ÃTƒ…Ë«3bcÊ\üb�‘Aúð›QÈð ò}eÈ�%CÚ +M€-0;ù‰:‰P�gKÚ® ‰Ð ×G^ÔÞ§(�°%9$ o´d� ¾–Ĩ‹ƒ²˜H¨Duµ±LSJ…ÐŒŒ6 � +&ÃáÎÇ€?4"BBH0."0(ŽFâÐ8 ÅaGr…ÑȤ’ΈëR‡–‡¡m9Ì 4ÃxRó{‡§ÇJ¾è-‹¤òmC8}g¶yËg„nø»6ë–(⪭àXš˜E†!à±Â#´ +6Òö蟪f5'A¦NMåÖ«gm÷§™È}p`·•gû—ŸÃqÕx¶‹¾ŽkkÑ\ë'~Ðtø†‘`1íôBÖü 1²2:jküÖ?µLŠí;ù`)q—²´ðŽ�cu èH*O:‹B0ËTiuGt�0 ¹Ì'(²Æö¸�m,�Z ÝNQZñÄç£âóÌl¿ÁéÈ€Ä`÷ä� �®‹ÚFn¿0ˆ˜QÉ^„ó8s–©9’ÄJ¹é]ˆÀý­)Á¾ÏcOú¾˜,ß½1u' +Øß«ñ¸ ø¤p{¶˜¼8‚òCÞÕ{£:Ù²ÄÄe—ªW7Æ­ÅÂrfä‹�AhÜ‚?2*fŽë“Ë{ÒØKîÌ€ TG¡œ +}i :'ß}»‡> ˜ë™ïlñI·Õ¤],¤%†ðÀÏJM¡ó?²ïQ³få-åö�“4ïüyDsòpŒs-ÛAæ×FR~gpRááCz'f-˜~F‡ÝÍTuàß]âÐ[ &-lCˆÙíÆf¢M‚”Œ³Ü¯âœÅâœ”Ú �"~2f¬Ñ˜M»ÔGo³­ÄF†Ã¶¤"CX‘E^œ #èlãm•Ì,p©#/ñÿÄR’½$UßÛ+˜?³H†tTdA¡îZƒöócÚð‚BXíó0ÜÔˆ¹‡Ó'¼ „\Tz¾’fÂÝÝ~ù£¯kKxûûh×*)>°ød9ýdq7‚ÀðÖÌÿbU]¨[¹ÂÛ"7²o^ŒLên„¨<68 ÁÝÜÓ±CKš’„#À[¾˜� qjånGv#3…·ŸÅuù¥šòŒZ\s{WˆìÆœ»¥ámÝ?«ÇøžôÉ '�Ã/¼ÏÎÝTŠ$� +A{Éu(O ôkHÛiŽË‘•Ûàâ‰íUlhÕ¬tÖöÅÕ4gtxÿW­öþ‡yz¥{Ú–ðo²%Ž´=¯ üâv¡­_okºzGvåJj®íßâˆYåŠÐ\Ôö­vs{òK*îëõ‰ë âv1´-'�ÛÍdñdÿMrÁ”·GŸ-Æì¸-ÅúÎE¥…w%j{‹Û7µ6Ù–Îd_]PjîÏmA 4aª86LšWˆºwóCV.ŽOj–Ýã¼5«)ÇN{¸(?RÎÄ=LÎƆ�)·¾uVò88$ ƒw]G†½E�0w¡|¡™\~†9G¸§Tk… ‹ãè(—„V$/Y:ìaÀÂhž@½¶¶ÈÂØvS�´±ŽFG>Á9µT¸¢Ò°„°=!mÛ=?Û í�QJ3»[X]òÔ.ãYÏ«ÀR^ãÉ_R0OØ¹í¡¾�–=7Áp›`¤0Ø,|ˆ4 z¬.FYz(#r’É5Øås±Ç¤qHŸ"a»ÄƒWeG¾g}FÆMMN"Œ'C&ÛsëÇddUʵ8#Fæ¶#+ѬL4âÐÕQñì%»A€qm…�˜ÑžOpƒ¸v¬Øã÷}þŸ¬­.–B]¸�·"Ð?ʽ©&µ(ÜáuO²JS©úÍö.^ ‚%:‰±‹)R ²‡±8¤™È ÛRèØ ·rëÇÝ$Ë>Šáé® Ýh‘½8W™x�Ì…`¼Óìñª^‰ë»À2,;{þ{c¿)–"’:L‡E˜ÚÅé䳤 ¸ýþsj[1(þ1™'µðÄ�”žÒØÖÉã˜èµ‘¾J;ï©'ëÀ!Ǧï“]“(ûzžÈžAÁ…`3zéÛ )Ú÷m³YŠÂ­²§¿äÁuÿÆlžc"xsuý릹žôº>“I™6ù5¬$mŠõý`WѤHc]®aáy®OBc’È3DŸ™¡Qß1,ûBäð¬Kí£ôYRh?qÆ6iïiX«�¨v¤Ëèµ—îò]:nÍá·4¥†«m©«LòÁÔI°¹’éÂfx¶Fý¦D‚ +ïríÈß:wüìóŽ�T7;½;¤´?RZ~e¶png"¾•Exnr)Ù¸]¦roÓ½£ƒ/zµ§�pkJǃÅ%Yv½)j³ƒâÜIÛù“„»•!lò§¸ÂpLfêO×�¾ý WöR=‹ÐîEÐMG® ²mª5 Ìkû~J¯m¹øaÉ›Å� 3z·%ûC~l��$�.ûÛ´~«Eù•ëŠ +clmÙ•™w‘œf·n&-FMòŠjW·£Íó<ØʳXƒŒ6Ç6:€C®Ùx�[,ƒk½ báhkñ¬~@7¸|®¿ßŒ¥�âY¡0–‡T^;RÛ´Ó:o‚1UA€,Û|Ñ!•M—•µ?¦ˆëÉžý¼MàgÅÉÚMÀH£ ¹}ü¦¾:Cο£ ‡É/½¿Mw,é*×´¸Þ“ôrÇ]‹•¶ÎžÃÞ—±=ÅÃ?Cët6DZCp’\A0˜ŒÁÌ à}}2&ã„?$Uê`Ò·ïp,t¼;dÈxžk÷Ü{�¼Žùðß!‡·H�¾×mHÍ£B¹ÀH!&ReÚ¾^ê *oœw—JÞŽ¥I²càÔI"'“ºò"¶†Gj[ô6ϪUMÀr")Å·‰2�jzÙ'ˆú ê¤!Yàœ ÝWÐHáuú¸@ ¤‹šìè¶Ô*á/¤hlê{ÑÕˆoî?[wrÒϽ"ù©$V¼Õ¨a™š°JÃøö"Ÿ+«NÛ«²d#àZ0ôoê§Û3Ëh\æ‹£³F¨IÖÓ à(¿kÌ�5Lw´vtZ?™ù¨c˜GûÚ'¡ÿ šSÎ0K-›Ašý�#ÁzŒQË¿_¨óÅ~…«‚@¢mCIu+²J•˜Ž{î¹À¶{_bÙ</ÐaÒ¨^r%ÙôUz+ÒÝÿkÅþç&7 Ñ–q€NÈÐ ꢛ§í^hä¡ýX Q‰žK7Ñœ½6¨y~OL_ +£e\ð„q¾Ô逸¨E³™€§6(ÿ{Eá§W0‡ÀÍ/%ÖýLî¿ç6‘Äî´…\cUPmAIô|½AÂ…É[ª¢¯æ�¡f>¦åQçÚÑw€±,ÿa:zûøó=Ùj3E§æpsó–.Ác9:ƒp‚t¹Êמš#Eç=ì\—^2;½ùDZbÅw݈ÁR¹.h–Ž0ÊFÿ÷ +4Ðè»Ù°òùÆEîe MdF™m€G†%Ê:X˜x®X–Z>£]½þ'”2hV¥(�ð4ùzLô „¯Ó¶"1nxé꯭>ô‘H.NÕ©!“_ q^ˆÉV?uYä^÷–½d²‚Ž×MúXš é7̆�Qñ $2È“�s©â9”�¯Û��~ÜïE“À˜qÄzà€�,”°2ˆã¦7Ù—¥ =Ž…µ5¨–É7LwÒñï[‡ŽwÙ…ÚƒÉó~·µü!�‘`içþù;oDˆpšž3Yƒï`xíͽ/QÀâÍ-qL玞½¤ûÖÐcmkú«Þv¹0ZÓ¤…y%ª„�£x–Jq;óoóß"“dILlùúá…B#�xtýÉ«ýÏòg£©!MrEws³à÷¦¾ë¾Ê¥ò +^׺« QZr»u躚½b{‚~H"µñ²o!'ç½3BÅíyYçwÛãhcðd÷qÖù~ÇE¦…�Xç6~&M"¬úÝ,9RÏtŠ«Díec+2«Š:ï‡Öùf†ìºòþY¬sø'˜­Àá#ðŒ1À +O@‰ËMö ÎÊÉóëÐeúÍÙ@†ŸÉ0)@‘HqÜÑûÔl=À_„É[ãyææÁ$å`…¿3òV€Ú`ýøÂUzÐ +Ýøå´ ¡:dÇV?2x‹õ5¼Xd5í{Cf�%SWB�? ~õ}þ+%^˜3Û“�yV¬Î�ú“Ÿé Ì3?¸Ò„¹™Ñ2z˜+pØzi¼&`îxdk�žðÖˆõ‘TQ¿Àü3c¢ÅâÎÞ®F¡óÄqæ9LÂ\=;.'`ž¸‡­ÊTÄ9Éö³LmWq£ž9^Jå˜7 M_ÄMÈ7§¢•*sá­–ï®[”Ëû»-➯ ù7d�'âæ‡‹èfTÅ|ˈ¸Mê sÑQÐuÜGÜ-KµÆˆ»Þ£I–rn^g‰ \Ðá ÎÄð:>þ_BÏĶFŽðMæ]L¬’™˜{ƒµ3¹�ÏJ"ßËîÙåH¸¿"ÛÚ©0�q™iZI´d­Ò95ò Íxvbð ¤ ¤÷ +¶ÆaˆåQçÌSs‹óŸRîØ]g7é�¯+·÷g$À@ÎvUn3ôr°¶_F[ +dPQáŠo§”0ûÇd=•ì]ž¸öëãve‘'úùÆŽ¥�'¼ÝÊ!†CØ–ÜnÀ®„WuOE"µM#\·yœ �$(ŸH.�i<á4�›J¤&´:¡à"håŒ\ýh¹^ü6DòÆ[Y-˜NG2ð¸»ÕÁ5½œ·„Ü5óÕ^2E£ò½baÅ‘áÒdêªN)y�E9çÄ`Qã•IQ¢ŸÊƒ×ˆ´ye¤¦™v¨P=­r•¼GV”T'n—åÂ믤!�é,qˆ(‰g§%¿ƒÀ‡/8[µµïH)Œ!é–%¦^å%¿(l—ºåLY6C9—c%Q¤Ñô§=ºMzkfð¥†v*¯×•¤î­kìãÂ9jÒ‘¨�kÿ£äéŽyÌ·9bÏá³P;4„¡ÞÊ->zÓ.œ¬�niíšG]‡¼ ::²>f1|Ù­Îë|\Yb )¬¦©àa½Œ‡1�(�/X¨i“µa?"Xƒ¸-GÛÁ\ƒ‹x,|ŽáÌw!T ëWãôîjhBº/^x?ïJ6g'õ(@Æ$_2YGwK`ÐÏOQ©ª8­$.¨k‘b%öQŸFrÊ5‚PÞ¬‚ ×â*JÔMLÛ™üG"ÕiŸ©*05ˆ#>CÂeÜÆ,¨KbÜ&·u‘ó%v ,e v×NjÌÂåܨ‹Ê2ÔûÍ]IÒ@]ø>n8Ø¿Ž|:›Äm0CŽÊ³²Ûò¡´U<@"=7«é}âé8x ^/#/?âV\j OšàêÁúÜ +Åíæ±Ù&g,$ ØK( +ÍkÓýr…«:ÍhŽà‘ZÀc™¬ÞĬÓ[K�~㸙®ìó6”bQ+st9#`N×ÎPñ=‹‡È˜:# +S(‚â Ëúþ­qrH “åWéäÕŠÓ$G‘Õ¤ á}ÑèLŠä!¾-VmÙÏõ[ÿT6þɯŒB}jÌÐ Ñå+äížÕGd¯€9Ù&Ì’€r°ïð¶ B�•£eV,ÇìËìobƒó#æ[ ]Ë6r� È^|¦\±’O9×ÐëmÒwÞ}¸´á7Õ ²%«:=ÕK<~À ‰¢,^‰(Ì¢�R0.æ’ƒ,n’ç¼Gµá£´õM0Ó~«bÄïs0ãkÚ8`Ò$ç0êÑx%kñe:¨·ÎØŽ¼¹v©4“g(U—»-ÛŽÝy¥HQ† †qS�oh&/)*ËÝ“™ˆ]†Qê*ì©kìK J]FÚü§å|Î/•º¼Ä1µ,Qc­.©Ôå‹·Ý~¬N8u5‘¬ÿ\¥.Ëš—ÊÖ˜“¤(›DJG}Hý©«ü/”J]9®PccÖ=½ìSx©Ë™{véöó·AÑ¢èì|Y7Ãk[ðϵBÏßvîê– óT 3Ô u‘A4ôÙ‡fãñxGb€í{Ÿ _E�Ág÷#`3ZàŽW»B#`3ÒÉE;ûÜüRRb ÏzÕT€ U�Y¡‚kñ×eÝèHhœÓí¸n�]õÑC³pùJ÷>ï÷ÈpËclÅ‹;öÖ{Ë:Љãc4õ5ÞÂ:8pó6€œŽwIŠèÿsH‘%óƒ<)U¹ÐêšÊô_p/ñYÕÔ&ÅÉÉœ¼ÇK=û#7T!úš5]¯2³Í*ü�‘0¬‰¹FݯH;\@’ÄÊû;R#c7Ìö�“\ŸpZñÐ…Wv³Êl�kñQPùËtá<®–í*/YBµËΠ�ÉÅè�Ü"s‚> +Сšä›SÄä'|‹BëÚ.ôÑ™…Ñq�£„üL“L?kL:2±n�¨&g m’RÈÓˆ|bþQÓ9¬Å¸‡‡º\®¦6èm �˜Ù(ϳqøüàÁ6îI¯þr¦'G½˜çÿFåu`ÆÔëÞãX#²ÓKñîOˆ†¥¦ + O®,Þ€žž5†o$ÊJk­Š‰L�¶GÖèo/K¢<ÿq{3_H¥†ùò4"!b<ûîþoæ�¢ï*q*™ë¢Òz#½ìØ$\øŠªfÀ+j ÷2_G¬Á�Yƒ-ÈüÅòw(Tà?‘�0––ÖÃÁp›š*ƒj˜Ã‡Ð?¯Œv>$ër¦>¹´ª2Iñ,Ï2îøb2i“¬Ã’€øåKÃÈÅ’mKèþÓ4K| ƒ,7¦!¥ÅàÔ½™‹Í}ÿNõo$2 +4\�0ʸìL¡Á@ÃþÕ…ï˜r�ß”O•”î…Gfú IKX,Õ=É�?ü-Ê2ǃÚ×_Œ{ÁRÍ„ZHšVk Vüe ƒ]¿Æ«s¦tÕþ[áE õÕLc17!þ<+ÝE 'ê¦v×5„äx~UtUC&¿RÃŒ {^:>€¦ ¯L(˜¼ÉÀÊœ¿åعã¦ÀÃ¥¯p.[�[]PRÆ“F±¥ ¯‹Ÿò޲Ύ´x53Ã�D¢Kܧ¯°¤Q(Vlõ?Ók×'ü–¢ÜŠ(sË" +[*·äöésÇ?›rËÕŽåÌ­í%íE¹Õb‡ˆ™[Æ zÁtq”˜[aŠrË:€ådhgn%wŠ÷«Urúo�Mô=s«Wr7˜>“í̭ɛު¾Z- +•[A˰¡�]UR53·$Ž @Tnâü[Ì¥sÎ:"8âÁjóè<ôüaäz»Á Mr+ 6C{‡>Êïs‚Ó…DhF»ïßIÚ>ò®Ù|�M;åh½âþ—„ L¿lø1¤o–f iE“K™§›fEd0ýÝ gÀoA2|ÜÇä¤i 4ìñÃÚñŒJ�%|cʪ:]ã!þ¤5I Û7}m)o=à}‰&{ºêà¢x†ƒš’vÉ+…Tª(¶c³šLl¨{羑c�¿’ Y­©“8e’%åzÿ¶´¶[^ÄÔ¡˜ÓëÍðªd«Hç% ¶ŒD­¶mZlÌcRhvil3¦Ç݉~:W! ×Ë€†ˆ¯D‹ùèÎ7-ê“"¨R“Bkòûl…sÂ_2³C”³ÀUf%‚¸ás†[¹�8× D´!ª-s¸FäÓ鑊 À«ˆf^ß\b òiü4@0)ùqJ˜Š9“œulúO"�{VÉJñWããB[èSËYp¶ÝâYÊP¡÷lR&›=1²Š…¨SºÏÍë"»!dQL:;¨ÐÊ¹ÜØäq):c_�ÃâÃWñ‘ì?0ÝÆì +;º¼ñfn“º:¿.b’˜åmÏl°,Ÿz„í¯Ð;8A°’ÓA…¾†"b²¼-‹þŒ;’–øsri:êÞòO¬úZ7eƒ÷?.s%ú‡�ß C¦¨9 ‘ªf£ýUÍ©¿h–!x/'Ï"K™AÄ�6J+‚.èO½Ù¼ì@›«ó碣8ÐÇ…/@FB‹Q:ºHÊ4l°ZoQnæ$𦛖7RP©é0ÐA³\æt´>BÜý›þ,= ·Ò“,’`ñ�ñ9Ðê#©JØGÖ€À¥Õ�†¯É!èÆg\¶��¥ E8Ðñ…Ø4>ŽAËh<˜b·q‹»ž«ðÛ?0`š-db‰†•…µ{m#Þ+Ç‹7ð¾Ý_�œšÇ.e3Õ+Ð;Ð^Cs­¡�#©jÅ}&ý(ýî�Üjx;ƒÇº97Ukß#1jÚ»>1i*¼÷¢ )ùšE¤Øssß½&šÈeÚq³ât5†:öhE\8�y‹G t”?ÊWDÀ‡Åû±ª1E‡ ~OÌ¿ýãŽoK'Û«ó†ö!r43‡ µÛs÷ƒ`k²¢ä�wý¥ñ  Á�µ¯¹ñv]½–3ù[~Æ:¤çÇïV˜Ö;íZ=+¢´e~¢<¥U´Ü&;„ü2@eNthù»Ìî\³�½ñYBk°Û�†“%9åÀÌû-mÙU¨ +;¤hîË*€‡ëþ„3®Chèxe¯ÿËã¼éº°‹ÉüN^PËpÒÇ.íQiHem<ßGßx�ÝŸ’í°ñžH¹ç +m“¥µÏ0$«J‰wôb‹ÀådO*ßãÜ+kÛ{^j6œ&£k.uxhv/Zˈ�ù$4Š{¹çÝŽêk’Ë ïžJ€ó±·üœ’íx�i�Áßb•vùŠî(\Y\«,_ØIb9TQ5}DL�Îàze‹ 9W·x»è— ¸Ú'¹ ÞxR~Dœ•èˆ +¶sâ♃±¥ë½³H3�$û°kžYD*IWu»l†ÐJp*Š|¶Žb_êBÏ +Œ½nc,Ô²~&~§î%Ô{B„Ý8/�{ WªÎ–´Ø‹~S Î­Š¥Tç]ÒÆPg6D]咱Ǖ`Âq^ôËA�ûï(i�OèêÜõy£~dT�[ î°uÖ¯T¦Ï¥.˜óJÈT´= ³rþ€/(Ïfœ.sRµµ¥Hï§È,P¨ˆTäBÐ!À.C´eÀáˇúüfÂÂj‡2,®áV_Ζâã$`ôÂË+óiRåJR¤eHw#]êAþ#4«0Ʋ? „€cžibÊ#^ò~dÝ9VŽÞùM7E·= GÕýØ�3ìs?ã¯íË]–r�ýÌ ! Ôùu ¶ˆë¦BŽfÇg-‘à:'!sîê�}˜lBð©f–›&þ Ã´"í1©a̯B±F�¬†ž[fÖwEZ‰ïæcºsôÞÀs’yÝëöðÏìáÀxpÒhbl¿Ý±Î’{ëh…°cŒêV¨¹ó§dpÁÝþ¯f˜á +hyÅÄF+'$-<¦Í õ¡4Ù#‹wQÀJß +cùK£ E> Ó%ƒE2ZŒs^øG^õ[h†ã2ÞÙ±=ÀáF[GÞ‚ªÊàu€”ÞR[~Ôz»ÆV Ï ¸Õ ½óí˜loË+#Zµ¢šÂ}Åû#%$ºWLV×Póã€Õ°y‹�Rú„`_52 ƒ‘ƒ™IZà1¬kE¢‘›²ÍÆ3ˆàñÆ +ÜksÄ=,f6V׿^ædøg3"�9c+”ú];Ƀ`U„ÖPW³®Æ©Ø÷Ôv‚à3Ž’?[‹®º± +dåÔz÷‘n#áuAbÇ"’ˆÅ ¹H$áxÿK„Jkèñ›�GÂÇ¥.ÉõÊÒf³]�KÁ^¹SëB'ºkxË?„ ÑŒÍ|®Õ?“\P¶#‰ç3juç +þJÝ9º†ä�¡PÌó\ßèµ5=Q„ÙŒÖØc´ÉCmrœ‰�ï˜lÓó=[ÈóW589Þ•q²‹w¦J”Ìl–­ç4]QÐb·«).1’Á‰Ü°Sø'x*zgrK|­sø˜¹?q‰‘ "jùòP0À¼é½k¥mø¡k£�scK0>-ï™ ½OotÓ/«^|MÙx•B;1<Ää¹¶ Y-~O1úÖUÙnTT³€Ðš Ì‚E"ÍN/‹íô0ÏqÚóB*•‡�¸E§�&çûK)‚–6²¾ÁÖ©¦›©öø_xˆWEŸ'°b¹æ¶™öOÐÆrµ~îÖºß,ÆiR*.AQ…µðdg¾�аP¯‹•ÐÇúJÓ9Aä`[¥„¯LYIR.n¢|þ3°5 òv´ _dmdµ—¸Ö�H˜Îˆnɉ 1®Í•Á@l¥!]±³C­ú…M'ö~nylÅ!ÖÄ·O<Ò3ô¦+l¶YŒçåÓ?S«�KesVé¡eÕê>r3î&üƒƒñÖn9¦�ðøõÍ�Ï_¿°¼N Yyã8t\ü³o�XãŒ:.�åà4ž�KýåÑq1ƒË&yY°¸5-×á®Ø$�;²©¶P2äþ-·˜ g3-tؑد§>[‡ø÷·aÆSïì%ΰôBh$öªF:õªfÍÈ’�Ù\5mþ“˜—Ž@Sœ"%¶Pàl–¹e  Ô!9㬄<È1 â]J˜‹r¡I³$ñÅ"'fjÜ}H¾âÜ_g‹pbé €ôIÆ °¡Á‹'Ô\ƒB5¼Ršcs :Kã�n)”pŒð® Ã’sAQ?ƒ ³õì׸7á +c#P…BÑåæÚÍwîÙëk,*"åq^ÔoûX¸ü”ñ™Ä,(×Í2 !qz¼@Ìf÷T�÷—KaI˜_„�Ø.Z½¼¼ÉáP†ñÖ\âp ›GA©þùüýa¼sƒLËôÏl’8�n!ºü/‡ÃK?2¹$fEM†$�'I=¨ú�ԛÄ‘ÍD­×½ +kþy‘¾A-%qÍ_Õgv~^ä�Äô TÇX‹N? lÌ»ße¸ZÁgŠžŽ”ÛûðÒ1Ö?�.¼^bõV5gÍuÑ ’*WÌ.2Ð9ÿ­¡[’öÈ€!f.¥‰®EÒ³f߆õV’÷§R»[Ü`ƒiø×SHø~Æ#ùÞ“ž—ÃŽÊ +ŒæÒŽ$$•@KégèÏ›âF~é2 ó�VL®LÙg¼Íš·4ÿ¡É|Se±] ¦’÷�%ù²Ã74Ï–ÇáIHæôÔüÐ_ø·›9~°üç¡ ³t*ª÷´¸9æô¯�üu³a¥‹†Œƒ)/dÓŠÐÙd#¯…V0åq¸“CV¡o;m³& d£i�ªz©”’8�¹�3}U‡¥i +ÀpÄÅ3ï +ÄaoxPÙ.“è•4 õMZ§ȾLÌì|±ç0·ÌC±Þ ·u8m¥ÔÍŠ^ ø‚â˜ÓLž´9žnÂÉÍ)6Ö±ÜÖ(•\oT|eJ•ÆšÂ~%ÈhQCaÈŒ'l·#[¸j3˜¬é™`ãÉw�[˜P|l3ûkóÈF­¤Ë1RáØ@XOf“ýccd´üBЊ¼ç½Ò¡‘æ:ËS{´{³U„#yrD„‹qõ1Ë5v¯uŸLañ²Wu�Ÿ"ŒÍÄË¡\,S)º$Ì´jÎ~õNÏN„Hrz�K;ÊÊ»‚>'_À²LCËœÅý„-ÿ¯>€òr˹O(|»D¾ãhÁhëG_"¡î§y_k€€]|æÇ&a,—Á³—œº�•Ÿd·çoºÈ;Mu1ôø08ÂÃ:裆YBÁlP� +Ò¸v1 3+†kÊXã a«7ÅŸõÃpÐöÆÓ,Õ|`àí3ü²‡Æ›evè0Ç&üDµ~¼^-1LÍøù误Gˆ¬�@±BDhM÷Õà’y/~J¨Z48(•Ú3ó^^ §ˆwF›&QwCïf‹è i™£b—¯NÄçÛ¹³# ímó™?ôÇÖã±a õSZ¨ç¨|z &§®Ñ¦ÞKOØO-c "'ÆðÄ×ÎÌÈ„—äl®Ý�ƒ«H6Wz„š�Ò™úIð[;Ôÿ ð5Zî,�Èò#z›²�`BÖárð°g4[€RMÑÙŠ0ä°��‘@µƒö¶1ª{�rðç${8Ñè ‚¸{Ûg�Yo3i‹ãTÏ«Pd•½¸Mˆ< ®Høö=J†¦?�Ná ÇsáŒ3Ž'…ùÀV¥ .�âg¤]‚˘Ô¢ö¯ÝŽUÔ ¥ìÈQ?\×T' +äW/}Dâ[»¬ÂÙz:óÊØûÅd§7´ÔÞÂ0þY'¨¢¸æ`è±JÕ/î w*7o|Q¢|OEž‚öy-Æí¶¹´žŒUxÙÒX•c‚k €_&ÙÄ2Ž9~ôá.X½íE™¦×‰Ç´L‘Ð^¸ðƬë}` ê‚9ø}€Ë_f¢²Žz2àò%à��³‰kh çe�-÷tÑj@å<¹¦�ü¹w ¾WþÕ—+òÌ通Gå‘�°Ò%âø2Ú‰UJ!û*‡1 ~æE?Û t¹ìYígÒRížö«xSqªJØýƒUh;NiC’ŸÕŸI~ÎvòÌèì#ì+Wÿ©è—�ù:«’ô(ÄrÑ×¼aF|ÌXž껂“ ¼û”Ź۾ºæ¿5Ò�„â”÷ÿÛ�;ÃJàÝBÚÖ©?ìpXÎ2lÚÚz[èéJõûÎ;þ%<}oÒÜ9Ø[ć= …!˜9˜Æ£¶‡£$!tˆ0z�±þß ¾’jš¿2cúš~—&ø�2ƒFºhÁèÕ¤°Þú¾Ïp&_oŽ´±‡À9ÿeR�hÓÆÿÖ$›©%›@‹&î{ùáN�ÓJß}}0Á@’ï¼Z†n„ÎÆ¬ ™EŽÂc„!fà~ef_‚�ÿ|¥ç¤Ò~Tü´¶ÙŠ�ί�M>D/˘�>?Wœê× ú}ÆrŒÍšŸ5Þ‚ß*�ÈeÈáP ¯àЧx? 8�Н€ä6比±¢Y]Ò!$‘fJì äøF iﱺÏa„Ὦȹ5—o/ŒÜößú>t^âkÛx? S÷Ø:ô:�§Á±^?¶|ݸ]fš4˾UJ î"·m¹© 7¤g÷òebª3zCNâžÕš8Œ=]§Ê&¹?cÛ5µ#ñ�ÀµŸÞÜ#¥ÈNJí¡•u§K³W(�­§sÒ˜x�9Éð�1 c!/ð×·í fë|6êçt_É̸›JÉ©ë®w#e°ØÑ£°)m”LE€­}‰;jêÉ,¸M@òC›6I“ù˜¥ýÄ ¦øð3FddFõ#JÆ¢" ÆAsÌaè¤~æQ¬©]ÇÑüE¿Ã¥$ÀþŒ°íX½±A%¾o—È—e*!�¹¹­�õA±†}Ætý:GÖN©kñÚ�¾%MC‹¹m!oÐ#-ÑR.�7ˆ³ðt·¬$UnŒê=–ßÅýÎ(™J²P̦]¤‘ÎQÆ2YÙ ZV�.MÅÉ7áÌ@ç žgë]-ù±ï,�ò,@,yJqÞó‹ˆ,�ðæwÇrÝŒ²™†A‰©MÈ ,/Œ”á²,ÿsxTÆ?$¦\[æ�ÌnNÄ^/„é>�ÄèÛY›i—a”·�®\©"Ä_·³?�Yæ}m]‹kÊBê~—Ûì>-G†³ASV~Œ*Cf)D†àìö]–h!IñW>¨õ]÷F‰Âr'v¾22ÞÀ¯¬ðÓu 3£';'¸ÅECº´Ó=ÙNýO'1K#ùø˜� Á˜Þw"’°‡‘Wþ¦òÓ�ÉEJ…|ÇÂéw–fÚnmŒÔ"µT¾ a†.Â0ì ä·ÀŸKxn}mø�.º·Úœ›e\µÉQK‘i Ÿ‡Lžô�b×Ѱ^@”X ¯wqʹŒ&´þà¹ÔÂ\)©›G-kf0«"~UùU"äA+L.ÜC joÒüÖIê ½"xò‘wŦ……bɦÍKe„[æƒ6•ŒÃ/V²S@éd¶=Nº%‚ÎhÁþÈfÆËÅ5€{ç`à”F¦ÀüZ[F¨p+Ù°x@=YwB ¿Ç—¹Þ‡Ùp¸�ŽHaù™Ýû&ÖjÚÒL¯ž‘йœÕk˜-þ'ÍC½U#ì¨\¦gv�@ P0“ ø’�u?U87bIÿ7…I\˜Ø»¥x?ýÕ#Ô–Ÿ9O׸;ÂÍ;¢íŘÕ0QF\2ûL;`XI©0˜Á±ÓB�Ó4†×r#í_Õ�æuÀ°Ž5�é !¶H$û)麚¹)vŒ¸{ƯF4ÂyÖ.–¹*"¡¸€ߟ ®(‘Ô^´_�­\ØÁšöÛè¸ñ˜V27J�ße<.°~'Á‰¢È¥ýFlØÓ<°Ï 4_ã°zlŠÄ“ic’€Û�gœ�%ĺ9B¼¥ˆVÂëâž®Ôb$F«|–¤êÐÖ;j#b1ÝÇô)ˉHX Â‘šØƒW–v:ãݽTÉR×ÅèÚ;Ê¥²U 0¥éšÝM`Ýû]ä„@üà6b¿·üZÄÈ"ÄW£Æ›¬^v+q²â{/PÛ²_9“±{׸¿b€°6C[³‡[âNG€~3ðí°~ ñòz û»Ä™@ZKL%Kncw¦X§ÅŠ0>¥Æþ¸h.ò‰hµ$³lÏ•êåv”áYè–ô[.¤�Ÿ&'¸¸¸�¾z¤s0•äIÐIçSN×o�“®(m*§Ã”“jú·ä­Árþ$¦2@„˜hÅv6@bz¹zh4b?’¡<”s=ô8µm–¢¦‡ããL�ô¦Fí\}Ü(°Þb=ÇG-ŽæÞH’qƒ{oœ í_ž=ô» VVuTw–(z&þÌœƒ<äÖgΉ­y8Û\È7ïò/óI®¯I¼»1ý- žý¯¹Ÿu@Â|Š´€ Ü~¦ìsl P†°ñ-º™ 7Àßñ¯‰ÚƒÿÁœÜ¶H~¼àüרÛRx9;GB¾b²¬Í‚Êߊ8 +Œ�}jüâ9(�ë*•岛–]fùÌ Ž±,À¯š€¬ê[�&…qûË"Z\@ôc²,vË‚}ñºBJ€ÿþPÿŸz7ŽB�ºJ7wRøDOñn°©=1ŒŠ@kñ0 eú�ÀÈ•–.:_ëHA�Ú�ДÛÒò7žMmè‹£f-ì�ÙsQͯ»c9S·]Y©C§mðLí7•9…óê³"V6 +rh­xÏË(}1XI¨¡t +†íß=Ño  3ÿ³¾÷ËXáËcE_Ví—W4�‚/b°ÄЇ ]É ÈE„QÎsR…µG.AyZóU…Äo¯ìòÜZIAÏmÑqY‡°pÊ8!€Áöæç†ïJµÕ@VÙfÑ0ñÿnçì€Їӄgª(•N|ù›×ko—Cj{à,¬¶ØbnÓï {¡�©‰7Bªó—gÄ+ŠæTýœF�Ò±oÔcýze*2´<­×?Ž'Å1Úiÿ’o>Q¢36­Ê=¨To– JKÇ–ô÷ñàË5ÿæÄ¦j?ÈJìñõ”xgB„” ¬l�*C +LŒ„ØÒ´‚ܛᾃ7Ô:í ñzE§)âÑ´Šð¿9çÁ5�“6õO{4¸"B�Tàbþÿh×[qS´�í šDÎs]Ý¥q=¡E¨¨ÜÎ9Z1&Ø�x+´Ü@¼Ïúyý°=É¿9ñÖöi›¢@œKºh/yqÏB˜\QY t…]?RªOCF€f@ùdö9X’Jõ²‚@ókKñÇ•õFÐÆ:éªè÷!Ò³QòIï»ex†£ˆ˜½mÆxÅd#W0_¼ƒ¤Ì-·S·ôβˀ†b$¾�·¥j4‚3¬sJ— +?Ò»p‹aFò50W�fßDa ÞŽûo¢´è½ž^nWœï"¶l±Â¬`Ì–Ð0˜a{g¯Í7쀕þù.kÃ]Û— +{ Óºxe+•]ç—4c‹ê~k')‡áê@©9SMu….ꃃ_RŸZæ*æƒr; Oš|᪶\\‘�×õ(º“Q<ú`�'«Þ “õ—™ÿqòˆØ��ÖA�·m ÊýxdQL'4KˆÀ¤�¥Ó„ÅfÍð&T÷ÖÜ�±çdÛi{fGh’¾Â“Uö¬ò81ã‹"‡´!ÿŠ£þF$?¼ž-wQÎIŽÄ-¡‰æÕ¹EWNƒ†©l'Ó Ê“,£•Gc9¬ì0U¿Ê7·C—…�’™á¬ÎÏÞûcx3^c’ì2TÉÃFì`y‹ÞÑz©ùK'Ö>ÃïÛ`E¯ + +Óýž�ýÆ-I tó e'èŒ-8ºÃPüò!xp$1z³3ŽFâ,ö&Õ`'£/%™‘é�2Gº95#ÖÔ'ú? +mJeÿ÷Q�<�Ší‡>W~~õ øi|ŒzSæW’<ü\ïxÛhׄÜ3ÄÎ&ñús7˜¢Ž}â­Ý».}YCôðöÈ›¦égʳ=6º¸þ‚§Œso�½fy|éïåÙ7óH`ôvY×÷?}>ž˜ý«µ�-¿§ûCtÔòÛb}´Åß™öþ8�Ðø­w7ÛÙ?Æúæ¶±{�:ŠŸt¾³å^ãˆ,½ßã·©7ŒìÛÉÉn'|›‘o¦íšïL[í3¿ã°“û?RVÔ8èÿ0÷þú� ô[ü°?€(q J]H¸þv)wà9Œ?µ£Æ¼‚îùµä!Q†hÌ cœhÝ2"Ì@;i‡î>mbs p�¢@æJ5{PãÅ¿h8ŽpÆ¿ÆTWW€¶A¼ñ;[g]z/¶º^Òô^Ó00…CV=RA ‘P£‚ÙQ8ùZ¬C“µóù¹`p{€²àM¥Ñ.œWiÞÕ‰“õ ʵ2nFW¯ ¾ŸÅ3u²>L5“ ]XŸ ÃׯHÓw©TêPt~äÁê_¼ÅnÈ·Èžñ·Éy¨F¦Vxç{:X4!k&æß�~Ä@n�ÉRÖ]öáZUdÅiFïèœÇÿC`@(º6¶$Ú´ðŽqÚ…¶Ôâ+JùzÀÛ‡÷©ßÑëßD÷t +’f? ~k:A�Ä€ùp4¢·c³VªgŽN/Ýv–ØqÀåÈ× ÏÓ¯¼ÚWõŸôü|e÷iA„µI ÙPXãû-äþBŽCî/�¿µKz ?ègœí?!Íì”·ZB¦h+ DD­À|ýšËä59�Âòo‡õ‚°ånY)YÊ +B^‡×Œ—c¯ž„ :€rõG�Å£…D÷ƒy, ‚å—êÃQPÂÁ tÀmYÌi¨\ôÄÃ4 `P±#Œ°iÐX`[¶’§ËI5!³èPfr%ªÖœ¼”Âô�bÐb èÖX)¤%€I0qeš^GZ¯×Å ¤& + +©B€cÕá°±�ĘÄFK2&žqÀz�ôƒ‹ VšÒG +^ìè4ÂxYÀ +Lž3@€‘ÚF�)qb/ +X�*ÆQ#€‹—ĈèL”ËÇÅÛ²…,Úár8™R.‘ÔpJcã±xM˜°.J(•Eã„¡•BÚp_"’e2²Q`¹V«þé R€iìEH™6!0 ý MG*/D® +”"9@cá+VˆÓp!?, ©1 P¨Ã')Ôt0b½@8Є@ X(™ˆ}<&¶.l´dPÂ0¡#‹VÆÃG„€ÇˆeÂ�Bâ‚©°0¹H –§cbE†Ø–`Xº± LD¨ÆjG¸žåÚRñs€0½èl�‰ÂCˆÂ¡C©(À2#Ó  Š ¥A?+ˆ¼ P8I� +‹K¢¤$®É8Ò"íF–Ô ¾^[æÐñpY$˜4B}¸J•ƒ�QƧad#mt<€Lp›"¢Ø–]¨ +^†‘:4Ä¢‰€kˆ`)ì2+U€@Ô’�‚(öqqE#ÀN0�åX (±×Ç]˜ æÃáFQ¶ŒØ X€Kì"ÂÑ”JlËH<,šBr•-E@²ª ~ã“!±e)”E“¼àBбÊ„”ôB�ƒGjI|8ÓRhðP\¥ÑRä ¢s�ïxÍÂB®Ç¢6 :QðÒéXTlÙ×(0…G‡=( …Ï'!äi/àù´¸eY5t'Ì¥ažx¶lËN/’SãQe°À¥³±&:¡‰Æˆ_ +Swâ¨A�"¨ôin›ÝRˆžœ<,6Qà˜º×@gc·ìƒ[³Ÿ ‚Ž !4ÚÞ(¹\/ Ǫ Óh�öÊŸqû@à>'�GÁ@«Ã¨S%1X™œÃ9ôí_P#Ybe�+ H †Á—§Ó…�ÅØ2ŽÁ9w25‹ap×}X4�U‡~,Pj _XêPLë @·é¸É… C#4Ö"½ÓËú…aÄឦ¡&ÜB€ÆbX"‘…€=.ÊqÑNbÄ’“t6­�åB³aH|<"•n P¥Ü¢ Q\Áp)ĶN¨|J'OÆã…$lćB‘Á°"Ž‚ ®Ha2 b,.…°^…s¸×©`9…s8÷`–&Ä+‹ˆQ! ‡ +T€øQ8‡{$+h(œÃ�pÄ0œa¡¢DT`.Òc‚(N| 8˜@·*áœNb`B :+ÌÔ„¶ˆ~ÃÎá$¢¡ãDkQ±ñà@ÚPþÄ�÷àŽtáXx`óàn³%-îa[µÖäŽK‘¤&ïLÎá” d´1m¼Õˆ3i”FkúPØhÇ�ÇãX”¦µ}4†ŒÕ0xtVjqÁ0ØâÀ·@ïÔ"` @!4ÉÁ ƒM4:Õp�X¼Iu:âr¸PŒ8ŸÌæ#’9é:SªhÈH`x¤ButZ"Hò´:#Ï£À*[iY*8Ê{$§–Kc$ Rž^îhAçAË¥¿£% 8-t@\:áhA;ŽÈÈFdaË^  Â|›Žw*00>¥‘F ”bq ¸AÙü–]Ö»OÜØ²w°ÙX‚�ØÐl Çy´2Ûªµ ÒvœC �vK‘¤¢ i»Îé”@�Ñn™æ­.¨ÑfJ#“„‘I¿,21�4 +€­ÂÀfõS¢ÙîÀC³r¥Y“�Fìµe\I³[ÆmÍfN&fD5—‹f·L;«ŽKš AÇ–ñÁdÄ^[Ù6@Àà 1`^³bƒJŒG2¶Ì¨ƒƒ­;\ѝF0@c/,T ¯W¨#¡¤\q�b�pÁ�œ42�̇óAFìÙ¶ì#B¤0"Í�8èL&J"4ºŠ iØQJ´]Âëõqm $l”VÍ “6¯×Ç5ÊÀìrBÙ¨P60_…JíÙPXsaCqH5h(` [X„ÏH€Æ6d8 @Ø…s8�ÖfœÃ5ÉänEÒŠFBP¥£0ê4€ ±˜Ï“19‡sðx0€Ñ$a´ + ÎáZ®Zâpx@2>¤ Éá:†Ei–�;à`$Åq)á0˜&z!T0Ð�&À;Iè4ïÓ¡”Ž…-œ‰¥CE*'‡!9‡ã\¸,¤w9éôO.}©ÜD£$"s© H `4AŒ£,X.&Œ¨ <ý‚!€¸‚ÕÀ#¢²x'„ƒbN³ £Mˆî⣉ðpΈÔ0VsLxxÕàé.CÂN:ݲÊ Ò—‡‡s çÀ‚AG¶u€BH"1Ä©¸=N¸…‹Ð>�ŒÇ“Ù'�AÒÎâÄ 'ŸJt9tê\)’„äÀÔ•FÚ‚aðF4â:£PmBk!d4ƒgË<4ËànÕ4kÁ± +íƒUðN·¬yÊa49ïã�nHšï4•É9Üci¸T#D�ÐêžÌf\�Ž4T:ƒ�!HÏåcHge‚I'´¡xZä02u¥�ÜØ-K QTºdãy¬€ÑÒ±d8“‰ÎpÎØ çp +Qàé�ˆáιтJ«Ò [C†¨!`3! 8˜ŒhâÄa'«qÒ饳£ÕÕÉFê$Š€l& ÌjÊŠ[ÍÒÚˆH +¤Ó äh�V§$¬09¼jY´4Õê´CµZPC€‚‘Ø”ªS�„ËÒ�~>ü–-`fFIÅ p8®-N]uêtÀ$•Ð9œ:}9hì—¿u ËˆN�²((2�S§1 + +¡1 1ê4 ƒ1©Îh*úF+Íg´:­Ö�Ó)`|8œ-S8!@uÀR‡n6Kåݻè é8š-‰ 9±X"ŽßDáASÀC÷ Ê„¥ÛP ÉC©,I ªS�rcK^­Ý²!$—’¤< :Ë˳±#H§@‚¸”»(0y. \×0•À-Û2N¨ :#¢ +Ð …¤„"âñÃÉÓ � ªÒˆvÀHé�H’†.ãê„tB(4kŠyHgË,4¡ H%PqP*è†REÁEÄDßd¡:  :΢â:vò¤á“v .£¥ðò´�+£…�¯¥„„i˜ JAH ¥S�‘..èTJD\ tì!qq><S§©Hlì�HÉhMD6¤Exiår^Ý2Í–Áœä ::�)#¡2²8ш�0º©$5†%&ÞDgË"4¦NðMt* »‘ ÇD@|°aO�‰‰+N[Ò4Àøô6¸g1p¡@˜tÄ‹Pd°i3Ñ× ið �4x> +S'byyì ·ò‰h×T@³­Ò3xË$:Jêe¡‰�„¶ì"�0Ò cSô*á,{Ãq°« RÒÚ-áØlìK•Òq¨œ”¶/£>¡¸¶Ø2Ì–ñ–m7KCÙ2Œ>4 ÄëÀÓ¤ŒÉh$B Jq² !,&Y(žÞ²W�†N5ñ<,Hé¡|tœ4>šÝ2’F‘>”ÁÉÆÀ`kI|"¦ é¨8 ž“MD7Ð yº$äyŒ�Bi”ñ¥ròtÈH¨«œð–mÙ#Qq¶¬CâPBhã³e/Š“< ']'bc>âØ‡fÀ*€83°;±‚è& +X¨ɶyè¼FXd±ØzË: +ª-01‘˜hÌ�-Û²-ƒ ¼7Á4Œ†‘jÐP^›R‰‰†b `ÉlYĤ<4+*Y�Và5ÂbÏêÓZ‡î˜:Š +ÆÆ¬J£]ˆ�B: +$‹w.q˶l˶,ÃGQMBCùˆXC1½ s±dTHû¡X°Ø494„!Ú ™$NOjuáRè#ºçaÊà-[�d"tk�T)•ê}:¸ÔçBСoËL.(R&–ŽTêäÉìçsa¸�¥�cØPÝ†Ì +¡›¡ð(„Þ²f(‰•Ì�†-,‚o‰Eò`’)cż+Έq¤8ö Ý¡ˆdÐÈpª’‹&ƒ· ¤Qíæž‡=°Ì©“°$ ÝEAB pF¼¡hBk^ +°–…vLQ¢b‰ Œ$�£`º·ŒäÑü&,¼ñˆcä:°p„ÆÉˆc$âV‰Fõ2> δelÙ2‰±àQ,t ŸI°V¯P)á¤ëDLˆ*@²Ã¢C’üC1�Àˆ'0; +šm¢3² ;HÒÐq¢6�¸†X‰¸Þ2 §z©+Å]:.Ê‚Õ�…S™-£ Ø2 +ÍN 2ÜHÄ(bÄÅ:$ý(KÃ¥.ei¸DN#ÊC3”\¶Và†Á¡  è‚@Y©&]. $Ü +­ B¡Uh… …VÈ"“�eD*'‘ˆÎC%À€¤ŸŽ½ºƒLìEá `&�„h‰\·ŠœQǃå Ñš(h=l+�&@F+q‰»x‰P°‚×kôì!Èdè–1„ëC–z0=†bðzmÙGe´&:�M ZD~¢€” +–ôÈÂzPm ¬Ø«20Ký> Í àC£š ' "CTýâf m3˜G“0ëÈ6²®ÏŸ�Uþ„Ûë°UýEí[ÝunÏøž�eŒü›õI-ÎèS²ÆŽúp®Â•¡?©Åßÿ¨ïÿÒ¹õY!Ô]?jÃí·œmh¬ªsò›kœÞQ»þ[Ö$”ú<ã:Ç¡7Ë~ÌZT¹*_òû„oKÚ«Œõ›£ÎÇÙG“%ï>kï?8çîû?_Ù;Ý—çÏ_\�µUu§K]ø˜³ M²d8ÿ%ä‡pÙç[Övª„Òw¶ó?¹ÚŒÏPN…Pý-kqî”1²Üå%äUÿ)gÚ.„Ð¥zóºsKö–­OYÛ^î¸2þ:|¿ÚjdnÝo…óÍÕú]¥û·®Æé’£|s³ m¶®n\ÞÖù~5è­Íýì­>{ΗÂõ©R¾Æ•ÎùÍ…±ãþ;”<ßo¶ÛöÔuï®eÔ¹o®¶³%|]æ~~¿šC9[W.Ü•:£þûT}¿ÙG›WÎø-!Tï~o8W[¶T^^]9›?*û.”ÊÆõa»ËøæjSnÿ”+Ÿá“›mh;›átŸòß\ͧºŒ¾ºo÷䟭ۯ }®ÃýqaT÷Ÿ»¬î/n¶1¡úGõØBŽåÃß§¬Åwuø²¥÷|¾ZœÿR™%¯/„ðçä‡*KÚœ3F_¾>Í>=ÿUö~”>ŸÐÙ[.œPûùÏŽ�#œr>È +£:w„Ðãƒ;BŸ°§2ä7Û€S.Ëî)Ê׫ɟS6d)¿ùõjÍÒY¥”úý²æ“á\æèÌÿx³ íáKíu(9ªFV†JŸryN—¿²Æ‘2|�ûx5Ÿs7nŒ/¡,iîS†³Î}ÍÙG‹²£ÿäÕÛÕù;Æé2d¹ãª>Þ�ýËú+å„òdž3>O�ÿ½ý:#KßçTæùoWkÙP~te�Üýùíp[ʧ›mhþ3¶K†ú;Ÿ\MÆ}ù¡Bö§«¹nŒ ỜúïüQÂ…PòÓmÈ.]—Õç|3ÛPåìØ:áÇ75�Q²{Ëß÷+92O�Îoj>'{Ã99º¾_MN–ÿ¥êÿÏW¸>å“«í|¨Qöäeéïµç”Þq½ÛŸ\-jk»òJéÎï5_éóçNéqŸÜØ 9J8áÎø«ëÞsÊŽþâúK†SJeèŸßgŒñekësäW›¬Ï,UvüÞ÷ZäöæÙßP÷ÅÕú?Êm¨cÜ÷¿®rô�ì“'«œpBž­% ¶Ë]}(£þóÕdœQJ�ÏÎï³�ö�§k³ÔU~»Údé¼þ2ºÿ¿©ýúÎ]†’§û›šì·]Jퟮ&—þ?ü¸Üï5ɾóÏ—“ßn¶¡Aø ½jÿÃ'µ}çŒ:¿¯6Uµ~ÿ»Çµ×ŽËR¾^�“õ{YBý7YŸsJž¬ûE ˜GÓÎb™Xæòhš ¥iæÑ4cmêäåa©†Y–F �P'!�¦ÙHIìvÉZ%M5uM5wÖžW›RSmµŒc$ÄÚݲ-Û²-ë$œ³eÒ¼t”ÄLZ#0�VÅëÃÄÕªhµ8Ü„…Â1å¥Z�¨@T°•KÕRq8N±T*’ Õ†ª�¤[&¢‚¯WÀKErJ]Ä@N''“Â@Æuj�V¬‡ãÕÅi¥:QV#'JȈû8q�R©‹ †*u±e�“ðZqT|0­~Yd>2ËI§&§Ýã\„–#i8܆sZ6i8FÀIR%ör0¨¨À4 +�`ðztàÒºXb,á2,Bp`Š(B©ˆŒ�æÁ€ô¤šR¤´ÍP¬-CeXkcm¥em¬-ë`m¬�µ±6ÖÆÚXk+±6ÖÆÚXkcm¬�µe"¬Í¤)kcmY,cm¬-¢2Š”†¹h3Ce¨LÖ‘mtC]÷)uyŸGŽÓ7öv|R[ç–Ï®ýª.ßÝ]µU»_WNWØ ûµ£œqÎø»PF¹-§„útµåžÚáüØÜ2N–úíÒ]›ãÂþ§ºÞÛñ•·ýá*¿©ñîüf‡ºÏ/ÎWù.#œ2²„Ï?#CÙÝ¡òdéúÚ+WwB©ñ[*ôÙs÷M-N�ªsöÏùñÝUòÿ” }�uB¹�n¿\(÷WûMmödŽpýÛ—¥²äfýywyßßÌ6¸çO#Ü�R¾©mÿò„rö.?¹ZïœSªl¹]Îgßgþ_}í§¾F¸½0F� å\Í>ÔÖU ¥¶ü׫¹Ã…!Cþ¸Ñ{z”uÂÙ2Fe—½söz„½Ó%;ËË1²7|½ë‘aKíWFÙÜ]²G)ãò>ÞŽpŸ#ï„0NÙÍËðñjpªä(ãÊí׳]}¡œþxµÝæÈ#{7”�§êjÃV½Ïõå¡NÿÇ×!?Gf×ÈPNù:r”/åd©S²óÏ×›}äB¸í6·¾nÿzG9õµì¸»üÌQJ匑§÷ëå] =Jµýõfð%ï·ÜUYnû| êŒSö|ÍÚ”°•álè¼>|¹ãê¿f-Bef¥œ�lãkÖ¶îÃùe?¸Ú³k„ ½ûá:ü^ùñ�_söù]•sƆ:ÿG† +>U*ì}éúÇuè*™}zÏ—.U!Œí“烫1„‘[yúÊU(¡Ký—ü/¥*ËŸÏþ}îs'»Ün(÷JŸ?ŸöªÃ]†Û×çFÞ¸ÿPãÏå(e”Ñ]²îÜõ�ª±¤q3Œþ<¹»ßgøÊ2ò¿èÊ‘e¯Ç(ÿE�ϱ½#”r¾(u¾û¶”Ú½rå„Î�ÞÞÓã?·dÞ�ñ}ÿù>Ü%Üøo›7ºþt¹2F•‘»�cœßPò\W)ÿWrÜæ�[ÒžÙJõ¹_„.þô8]ß½c»ÂåròTía/Œòaû*Ãù~!|ŸýqÊ^ø~_z”¿3Æ÷«ÍåUÉNÞ…q}åŒñßo3Ü~^§Ãmøp¥BÕÖ~¸¯:ŸÙcGF¸5¶Æ’ÖrÎÉýdöùØãò›ÝáT9eÇȰy[þΕ±ßáTž UF?Îv}¹ð]î\ÿ•ë­ÞÊ©yœÏ¾ú”,®?_ v¿OŸovdÕïרÑ÷yÝgkÔŽ]N–3vÔè²Æ�úÓá„ò÷Kô]~ÉSå|ž}Úg«ÊîÝ姬µäïÿéУ®œî;e„c”°çNèþúÜ8u£êïöCuf‡ðÅÕžWêû÷FÈoYkè=·õÅÕÖùºŒj|�³u.„ÏKZïœú¶tÌ>ZÔo]È“�õµ2„ û]§dåߨñ-kë°%G9_B¹jÇÖžåvÇùojsùý'T)ãœÏs—=B¨oj¯-cŒ-›¡ëò¯dèpÎ~¯ñJW}�ð{¾ e÷OÕ—>ŸÔ<òŒ¾®Rê¾Ô•ëOj¼—›½£ì÷eŒ {£GÑ îl~^Èrò“ÚäWþ–بt¸S-�bcš0lc(  ¤Â¹<•ý€B.F<>..$("Œ#¡0$Â`ÇQ‡¢$%™•Ò™˜øšý%D*¡{°Ä[š.qå&H�Lèè#†&òâÄ&ªWpb·¢ÒóÄ…p]ï¹Úº ²ß¯˜‡‡PK�Y÷s8ªeVXg‹OŽæâ·“S¡r69±½ù•L¦;”KžT²Ô„×I®Qa"’%Y<ò«µ_ ‘uè¢ù*Ó͉|í™Y²+ +‡ÙÆJ!ûƒ\ K6™ªÊJHÂøÇ¥3»íÑÇ1ÑŒz�Ý«0äñMê#ßñðÉꯤh]¤o‘Érlþ0ÇýÄHÄñ¥ÖÍxãMJµqØ,¿Õ¶]¬±³}iÜ%-θ©+eea/$}<Æ'bé)¸E»‘øâ L4yªj‹{AY?Vê�ÅÉGÀ®n~ùØLñx¿JÛB8¶Z«Žy:ù/ž8f›Ñ4±ë¦#K|#’Y°+€$Žý]>qÄAœ6§ˆÃ¥ñ¿•Õâä‡XK7Èüð¼ÅK-ù•Bçž~Ës¬†Ä0¿.õ£ 3¼›H KÆ «'Zø}Úi„–Þ‘Vÿ'|Ò®PA 3•ôF8øˆŸµ½û¢,/‹)ÑÁE“geƒ§«ŽX’ÊÓÀ£~ï\Ë4T0©% &8Ç�°}.l½- Ì-°.�>¿%Iï¬j+ ¸ ¿ 0{°nH +Ú„Ïa°¬üþ9x$sÇ�T"ßZÈüVL(>¡âGÞ§º»ïŸ@Êr`S„%ÈöÅK6Lšè¶nWŸ†e;„88EñwPRl2d°IvtX7ÁZÄÉïç>®ô°'òœïCn +x“iKÌ"ム+Ê?a$ä}rÇá5&öe+¼0Q[2ÐTÌßW±5®ð§iW%Řr,o|ØT”Ðóóf§TVª`è æ¶5õ§U·Ò€�Es? •�u!ÒÓg\Š„ïyÒÔ?òƒºp©SK©c.:ã(@j?¦‡Çö1D­”ƒ×Ðz¹ý6@6ŒLXõˆµSæÅÝj,2wrœôNÈ?â3]¯ÔpJy¬>B¾¨Îý¶)¼™{A±€ØžêbsšùfÏdäc˜Ú"Li‚/eû$©¸ƒA¼»p–@Ø€Â\Êöø›S¤-ikPbô¬\gX™#z4 ¾¿ ½T[éžÞ”Ìn�® 5^}p³ÀàûÍûà¬l<5ñ°R$ßrDŽºB©d—&>4䣲SL2â™Ftl ±%¹©W¢©QÄü]ÈÒû€� 6úš2”ÆÍ\Ôׄö‰o eÁ„ ¡¼€¸$ý{Ä«š;Ý¡ÞSÒGôR?¼�®aNÍéÊÄ"\ϤÜV "nùN\µÀ°¡e�ŽùTÍ3žË°`Ìâ9Ð&Óå +=—øÜ9æ¢eÀ‡IËá´õG©Ïyb¸Û(||ðã­„Ê ‡ L‰™IˆõÐS‰y:tž‡bù €}àì\zz#W@eÎ|«è¼_ fι)úo!#î9®q”5+DEŠýßB¬)¨C{3³¹üƒPúúÆþgª=â+ÆxrÒ8Õž[S+n]r¹÷u8ÆÊÿW°ÝÕ×vlB÷ç_dŒ^¡´5P+¢§ë=H“÷è­]� ˆžÞ›EÌLW¤wÆ»LY{d}­ÄŒÃÍŒÙî"8˜aï€7áÆV? ñ¡XÜ­ŠØ\Ñr 03è0ê¥ζ]zf0uÀ´¬c½lÐÅAïÈÛÊ" zý?é%ÒÅâ�v¹œ„Zqp½`\ÏS|~ˆI’³ ­[i+ì|GÐû~.ºÝ–#‰d�Ð =¥“Ð .]GüL¤×3&Lpª .ר!ZÁz†ðb º~݇÷oXajƒ~Gö•>à'ý)‡ç•I>wé÷õu…iU3ÀJs,ŘpéM‰ÖAꌾÿ¤ö¥Ýç<ºÈDÓ­��n¢°iÉ»*v·iRAÉݦ‘·M‰ Øݦû#D?¶MGßm +)¯­±·MWp£–t›î[)·mʤnÓ¯>)Û¦ˆÚmVšÂbÛ”ßu›BtÔÜm +Ùp·i÷¶MçUýør.2F¡ïªC§ESþè6_Üo¶Me­Ûtp?ªŒw›.Û6}FݦÛñÛ¶)u›ö8%oÛ“ݦ#ÓÑ‘x9Ý6åÛÿÉÝæñ¤"-ò˜jÊ7Ã=i+G‚…oª_æ…”B……ÀAÜBçØ()µò:ù¹¦4`ݧ+'–‡Äg¶°4i4=�¾@•‡k%ï´zyæ²<•é…MêOW3›2‰X†‰Xö°rH–™µª¼ÏœU$!�뚘­…I�š4$‚‹ñxÜ„�àî˜GÀ^ËJ0;áSdKš;s½7:]×ÔKu¤ãO9jÁRUÒÕ?;«^Zc «|I&o¥aBvptF™¦Y,‘Y‰D µE6X¤ �•^‰b§šEùãLïMwʯs"X%°µ?…û )¨ˆ=”¹Éi”•’ ‘®±ZžN‰®îš+ÃT¤´ªdd•è-oHžÃV!ÂK1JjºR +œ4ÿ›Nvx‚¤æfÜs�SQ¡Ÿ¢Æ9ßat6‡¬©ýðñKwÕÔBF+G*™Ú‰¼zÁ- +{b%=e;Â'+ƒ·0(ãµ^“å ±�’TÔ <õííýùµgÒÓY*jY *–#0Ôn š" +0ÇòVž¢r®»|²¸êïÓ”>¶ùÞÀ@g©"¼wò8«�Î?1�l»™lÔ;g`)}”ñPŽÊ5U—>GƒÂ¾Ù B–ÝLp +¨›íe‡”öþ5I_׉#¼Hê«Ï‘"}ÞyúÇ6žwŸh:�ÿÿÓ=ò½}�>9›¨ú[ÁËÉÝû䪥PÍMìrÙî2z�UÀ€ºŨÜ ] ý^SÒŠº1Ô•ó€í.±TMI:Æ•x($!ÕH'ÛrÚÆÆõŽƒ¦¥ÌV…% nÑ›�©)øß7I>0ñ‹÷Œ�- ®Š'sYcj˜JíÊeÅ».“¼ïU 2GÔW]“:7¦Ú‡²­iÚPû$±7'\­3�O§šèh_œ +�0ûŸßâ=fWFÚ·Èn/"$Ò£4C�¾N&ôûd×ÍJäF&?«°¿Ì,Y®’­¨–2˜Î*A}4Õ˜âÙŠj¾)ë<Ó'²'Œ´Ù„¬¶‚Й‰¡n-ä&Eyç°RÑ»GÔPÛõÇthV«¹u®AˆhOåbÞqÂÅ´'‡vGâWDd@8,ê�— /¬ÏMç�ªsG£Ù:TÔšœ=®ét !šÔ?α„#Cg¦gáF"µ kg-ñžêø_7 ‰nɨ:J3Ýû"}¼OXòq7=àëÇGE�i�ðìtÆ8Äú¢�}–Ôz2”Bm*Uܶп ”"âÊž¡ØÆ‹Ê0Õ¯¡¹Ea±rõß°$ZöŽQ8‡â’U:+@�¨#¸ Ré1˜¹��r¦ÄÐãî_g¶ßꪫ­úËýã¾"yТPE²üHîEv<“M­¿ef½Æ­œ• ÇxÎoæ–WÌ‚ái¿V{ÐÅ\Ð1Ÿæ‘…™#¹Çâèü +.<†–0> G R¹ra‚zÕ'©göYÞê‹» “ÉHKœR²'ƒÑtzåžMì:g„RE^2ü¯\|‰s?F.ùÄ®q�]/Þ¹¯çÇHb×ñˆ õ³×ÏXêû¸5†‘,�Ebu©8´û3�Y•g>µ '—èåbÏO�màò:0ëFnë8&±†Žz“öcW&j·‰]_¾èÀ~¨1ÉVÊ¢º™;!zá¡ÝàÕÆ¾ù|Þ³Z: âoRfb@fž»äŠôÿí£±˜™TÑ›€V7¯Wù˜hߢäOœ¶½ëRv’ÅÙŸ×/|¤¹ ¹;ˆš­muxcP§Ç�Ó,8ý‡ë*Q¤È�lÄ6«šK˜Ä- \PÝ=W‹u#¹è[-m‚9›„�Üm гv±ËüBw‹Þ\°á ^J"¸îެÁà3GQº{ Þ^q—’䘖 ×éâÁBÉ6Y xÝìÂèî:í×;?wí Ð\.oÿ™³~f]w©¦qsÐvމGˆo4ZÛãö/Ú=ºÓ±Ä�&߬Ê÷Iy³tÇ?ãS÷k�WáÅlôz%V¯¨©ˆÔ$ÊÇr] öÀÛðDxó¤ÜåFF.!k{2ô¾Oë#å"Qd¡×~ÆN +ÀzãY~œ¦†œ½¯vpk{ ïR†è}GÛ9™lBË4!èÀ” -Ǩm”;Ü®ìÙ’c20ÐûÖ\ÿŽÚ>okiC£4ɱ)ýùj/æz4îìSŒÄôA7K���!¾]³4B^i/–‚s’ó»‰T³"#GEHf¼Ïl²C”¢kˆþ@§Å5TO=$Ä:€c°"ÃÕÍÖ©qìgw‘Þ…’q/Ëð*äyÞ†óÞF÷lá‚‘¨¤ÛÒ=›Ë&9S-o‹ +:¶F TX\ápN„b2N'¨“Ð ma}Ž'¹4Oʇ2÷Ø4¼ñ„‚úÇ7Ò,ºG’— +~˜'oÝZ�©ÙXˆQ=Æ�Þ„0çZ:GÄac Ü5x»#|OñÞ¢ä¸*#`ªª\Õ£(î0ªÏš@$Eù¤†Ž ŽF#EÖì¯(FD`Çêó­ƒ8ÒN‡ØdÕꛄ�ÓÑ‘kIé¬Çt¶e c*BY¦•åÚÈHä™t½wÍvuJ¬‰­•Ý·^�/#!`Æè8=³†xɾ:¾]Q˜¾èÜD¢D¨G}k�Ž0 g& Ýö²úN®`¿�ÐOYš° š…ägy}yÒœ€nùú&Š?䌧Q Åí½`Ëí)n% ýªIÖÅÿ¹_”” äßš“5q&n0Nq;°Äs6.]ÉXw9„×Ù²&¼Âƒ¶„žóóÏáXh‘Ðó(™Û¼"~Ÿ��VBÀ-=EÞSD¡¶˜Ú슘üYð(ì ‡\ø& ž—Ã'^‰G'´²Î�røS†Ìð *ÖyÛ}Ì’¼¾u{\¤¡fœ�pà1é‡lš´ãìRç 5—Û +"¼íßLž!ÑÄJÊ:ßuɘ¦Ñß²{E%«zyï@•KyÕ²ë꣟ÂêäŒÐØwÏF +{¿Obd®XxôO>ø¿òaÐ# gVÝà‘Xmt»1ôÊZ2¥Š£é…æ— „nM…ì¶RWsnÑo¦&€¸ï] Bgö^Ú6'D�ëšòÊ7aŽÍ¸Iyéú3f€9^Ôóøïì™íìžo,Â<àËéeÄ’Àœ­ˆDÐû°ñàævâ��o•€B~¬R±5eùáÙmÌudk¿ï8ÃR5µ\`ØŒ–C¡‡Ç¼•eúq�Ô#š¹re0Øÿ6µJÄ= Ú)³ˆ©ùaSB/Ñü(ãáö"îÞ,ÿÃ[âѦˆ¬™‘+ÑpS“qŒ²>­D<â=oÍÞúÍ5âFÖ.¥ŽÄ}µ  +—ÒÒNö²àeÄm¤ÂH2¦$òª‹ +à™Ø„âC‰Â†x£™8ÏŸÀ¹ˆ Ñ^¹ð{ÕDgÌÄÒ¦BzæQS¾r&–2…A™ž»@CšAK·Õí37ÆÄ¢ …ùÇ8¸¢k/ +ûP–o0{ÆšIêäåºtÊ¥7óÞãÖˆ·GöÝ/¸¶Y ”(L˜%ë¡N÷yžŒÝµ×“AÃhÚSp½õ#‘L¥„ù)6§ŽD„¹‡1RcP'_vÛÀv¸D=¸á00âôº +Fd_ qü…Pž'°äÜÝòä‹Y6C1J¥Vkïiýºæ‹Põ�lLsœuÄû©×^Y šj ‚bÓÆ…ÌU MÍüóL®'ô~ð�ÂdIé3tã€xòElgOæÕö:Câ'£Â£ÑûXàkkL¢Uáô >Ôä¯É@Vy`a� ½œkÏL<O§ˆ«-Ø‹®Œô1ø �¬ë@5ª{ÝÝ%šÄ&¬hSsSÐWbíü°E×Ï ãwæ4,YiKøÖƦœVØFÛPi=Û“†NTµÄÑ$4eñÄÆ&ªûð¨ò#ÍþS%` +tÏW72­×ŸsÀòí" ½J§\,r†~¼®UY‡ñ~l})ѽӘrBM;ReŸ¼J�ÞîTc-­_‡YЦø3Û¯í²„L”-×|�<@Dï”ÙWpEï£K[ºÝ�ï_€á¼°Ü¯üªñ�ÑÛ¡“£\ÅÒ©ƒad¢·Å£7C7¢·Ö.žGÕÞ_°=?7jù+úÙ%XJ˜~öÖ_$L_ÈË^Ú\-i›IWù¾PÜÿQâÛ¸÷ÀgøƒzVpãabuf +Šp†Å2¯ÓÎ\´Ú!;ÞˆŽ%‰;èŸÒ‹/|h +ñó‡F•NNû2%Ö|¬ ‚¾ßãú·&Ê<õ7`óŽÿ[ކ9Ïüv xKs×èv1y®óô޳\ Oš†`¶!s÷þßBxÏÃÖqµ`‹ÎZû·()—ût•tCº’ÂTcÎa˜ˆv®¡s©×ŽïÙ0:Ì6Àªæ©ûÕÜXƒHßÚp½z˜ê _"ˆ +ÿÏ�8}‰ð‡.a"¢{ªQv¹Rý[nåžÝQ1}޲ÿ·Äòý[–žëÿoùRuÝ@Ôôo©ÿÜÿoـܿDÔŒ~˜ˆH¬ê—˜Î—Ç…‰¸ +ñ,(]Þ÷oi¤å ŠéåÂ\ÿ–^:|/K9Áé¾D8&ââtÎæKϵ±‹Î9e�/Ç…‰@EþÿF~Õ’}‰@7#Ÿ¯ŽÚNÀÕLwŽÑÙù/ a Y[5˧^�mv¥òÙèıp–RÜ7÷§¹/ÍJ“wÒ&Jþ‘NIMï‰�6#ˆ±Áâ®.´øW ­ á¬ÈI^¯ +³€Ô´x(ë×P™{úÕ8=B#MºÄÀôbÚÌû_b„†^³åáÂkâã®É}µÙ •!Pº B‚ÔLï*�*CÔF…„ ;RÝdö�*C()��z®7f �í]ºÓCñÜÿžÉ×Gô÷÷•!k�Íu…SÄëR³Í5zµ2D v»”JföO†pç©£G “ Ñ‘è“�üÊç¯dÑì$ζ+Côo/=›— Új{…Ͷ۲j¸¢í…çP×Sè° +ö•šJâ°ûK»KdèBä<uIÑ2"úK7#ž•!ÖÑ­Êè;+uV†Ÿ'C�p#G Ii·2D5Ÿ7nº :á{¶O† ;®’#¶Sü€Ù³^üš,N8[®êN~&CôòÊî•Ö0ñÄÄW*r Grj"²‹�Ûl9 Ê‚€çÛâõb<Šé‚ÑöZâ7)t~FŠ6[úP»>©m[ï-®‘ZR¢2£f¥Ö×m¶ôD0Âó°ÉÞ¡eeˆ°Ë©¢ãG}€¬ÆE¸/¸ÊŸHhN) +Cƒ¢8–‘°Ê•½®§�\89ãM† ¿ó� ó‹x ¾é¹Œ2à“!ÔA`Ô•!ŒìI“!rÚ°�ƒ1E‚Æu,'¯âimʼn +�ò—K ‡Ú‹|ª”OÒñý5…@€¯Guë¬ QóTó¦IÈÕ¨G·òÌÔ +Ú\ª q§(¿Ò?G3kPÐÊt R)V “)“!èÉŒ9Fe’”¢»nß§Ðzƒòî®Sð/1ìR×K¾²¦©xb=|�0~Æ1V«‘—ºþ&›!°EšüžL‰ÁRÚwÈ(Ùã©IíR…R—F±·TyôÔU¾_ðîR׫äìtèq‰�©�tUbuÕ m¢H×ï–W†hN]8½b&C¬©2Dý bÐeq¯¡ÅÙíÒ•>[lonqÛë#Tˆ‡i?&Q¿Ï Á›oH…Z/-üHQ.ÌEÂ燂x\KÁgúûsø³óYƒ2¸k#>j ÍÛ?ªâþ|EºèŒ=Iìõ¯TÝ\ße&^ÀƒçG¤S£lùý5~�å%~ÇššZj. NÞËúƒ‡  ²–¸.…¼AÁƒO¥·À "É7†ã«¹ˆB¬téÊÊjNóWº§ ªL’Ç…Œñ„;†Ãö7çxðrÛĵÃehÀ´®�iƒ_uXBxð3nüwÆp}�©Ì†ý(È�[)[Ö²1œY50l±áP šŒU-dH™Ìvk™H±]yÇ_PcÑyF!Wó§gÔ�0˜ÇU€ö‡“)Dváõ÷¤]V¾ò}5†;ñ°º�æñÕ¿Äp”þæ»>jQJ1*us^©Á�ÿóo3¡t1¥�ZºÈ’NkÔÒ¡ìtÅ)ºJ<`�gHö|0’KAŒ%ª" ›ß} \ñò TÕ˜Ý<3�m0€8äbøC7ç :=AduóŠe7ÞÞX]NqRÊØ.èæò´{,÷ÌÑÍ“µ“€ +ÝÜn½¼µ…rÙ(áyŒ-¶‡JxyŸÏ׉Qa®™‹-l[8›Ý|”‹t•2ØÐͳÓòÇ©›gÀó¼N‡F›xd4èæcò 9!´¿Ê(sË;Âü­á <w~^g%G1AfÊèb‹KþË™L[à mïÅf0†ås@gîË</ÜbË/%Pˆ*–bO!°Â Ea)zƒkµ5¼üÌé «è£†oêp¼YS›’•ìeØ¥aàÏü3+Û$j‰Ô-I>ÚÒÄ?Ç$k‡¥£ö�ÅUj�Õ½^K€¨ªcüŸšïª¢KÝè+ ßŸ_ç¤|eåÔý ?ŠdÁâßž¢í·–r«€]–—/G¹Uc àV@ª©r ëö¦Îhç)s«åu: +øWœ`ºçPn¡ +o ¿ê´d˜[-Š—«•èOöß/Ê-¹cÌ­Óñ„Ö�‡r “œ¹µ^Õ²Eð¯V[É ÇÜ:3•[‚̲'3·Ô·‰ E¹ÆÜø9}ÄŦ”œL›¢bôMŸ«~ð‰•^ì +w¯ƒ<{ ¥:|l˜n<²µÞö~Í�á Ü4AžcLC4íVt· Ó@Øõ‰Ml¡¢‚‰ jêj–-|‹&û�¥IŽ€ÝYâözlÑÎNE®×]Uš¸†ï}ìÌdàцÍè´H óm‘_ÜaÕ€2�†ûAÛn8ÛrËÁì¶u霦ˆ²}“fñØ”mI ]fQ ìx·f2ÙÖ ôœëÞìŠ.Át%^W {I.YQ’@ƒž'iöbFåAŽV”ü¾X¡ÌSñq'*l4àEMrC´l•õ<&&3�ñX!-Îh2�¡!Æ GˆÐ"‘äü¿‹LÚ÷yéËE¦Ñ�dÞ:”)±‹Œ±gŒªÃ^áU"%á6ÈÈ4~Wò‡‚hÏ¥ÓYdˆ‹ÈÉV¾“¡ "™›Ð0#ãvé`Ä‘ÍÈdÅî�×##¨/gdl¯;«á'ˆ*¹À<™Ä¹3HÉÊ}}“²,àT†÷„@\Y¨ÕÖ¦b…{2¹†Â'âæa�•¹Àf5/’öºhhTæ©+ï"Y3‘ñØ>ÝžŒ¶éYÜðT~в^Rg“M#=¹¨·À4 ä9£Ú12Yޱ‰U®Ï²·Šª,±Üâl|ªíGÅЙå ÁrãÞûqJ=‚°–ðŸYþ³X,þSF™ëâ@Å7uh;bä'û}o€}¬<«¼{ÿ¬úÕ-è°¾z^ cƒ4ì£e€×ô«›–Y¿î‹B^^§ßŽD¼s s§�ûñ¶V7Ô�ö�ž¦R»¡×Bü(Î?�‰3”4#½BÐtž¡w4_(¤™2îå@7±V¼$‚†ííd·³:‚xM4-(™5,ìž{À4½,Ë¡[ôª†Ç\ +4ïÞuí%XHñ¼g»ÓWpGÄ�·-ÿý¾‚þ£tp{�е͵{uo_’*î¢ßŠÕ~T ëó^Š}Ç[ílV¤Ý×/`‹´k7m*ÿ‡HíŸÕ:ë§K!¤IÔ�‚À¤"˜þ–i…Ä€ít ŸÃÜ@8-‡�Àž§Š¥›‚(Ø*¾kRSCÆeQ9þo-'¡ÎǦ•Hq¦ ”œÜdx@ä׬eDŽ„¶Èƒô 5Í 1ñªn™>)ˆÊ2Ç‹-×)ˆ–2„)!=�ÓH“ tz¤)2}p ˜Ö^꼈LL$Nb¯f5£ª¼kþ¦/‡¢=}õý§‹åÑ.óþX±™õV±alÈÄ +Ùé Œ�ó‚·æzòÜV›¡F™ã) Š øQ±YnÿÏÉa/JßZÒŒØ Ç5·»S±™ ¼à°©£˜¬W çß¶j£±!¸ 05¡z²�³J�'ynøÍµCc$Lu"2í3 ³Ÿ‡ˆS"„À¶HBõ*#]–²PQMbAK†æ¤Po+Ü—ñéÄÕÉ5:#hõ®ÀiÆR+¨¤I¨à0<©F] 6�ß KSCÂçÒÒÍ¡ZÞÛ/Ý\¦«l`/ؓ竨Él"`[?½ê,b•äáGúBßîÝYW¬P±â%ä:ƒ«0X?ßóFÔ¹, Tcâð¢£x`¿ø„YCÃT0_ôî±á>°GºÉ [Ó un"êžþ¤´Yú𶌰^´êâ 0êŒÇ7œ^$µov uvªT=í‹ärÑòd¡PI6îice¯ª³7,uf`ñ»ô}VIAÝe,¡Î(éï�ÉÉÉë‡ðV0@ÎdEr}:›aá±ád7ܶȌP¸®FÃÙ!9»Ý�þÜÙì^×2õ;ÊfìªHîL$oæð�>©¿HNÀpRþ¾ŠZd†’k¯ÀÆäÌð7ùß\W†ä¤© Éíw©•JÀL©"¹×*˜m—™¥ÏŒË/ðFxƒaJ5’eGxZ¼±øe‰ûUv'•ØC9ÛDŸ·¢¤¦8ç›§=D>¢gÛºböà  `Œò±× 4Uõ™�>Ûûšoÿ¡ |XüDÕóµc<ò3ßhÆŒìN%›Î’lÈCsb2¨êŠêÔ««@ÇÐAÞ|`}¿Ï0ŸyeK:Ú$%*7ÍÊõ8,ÿ™mn6ygÁ‹;Ï?sª.ÜÎ6ö¨•Ù‚ìlSÛõ �ü?sfh6æl5@™mŒËJ;ÛÔ‰�;Ügþ–’³Íj+˜m +ò:Û¬¼xhègn@ÓÙ&Üò=f¶QŽåV0r¶I%ŠÓÅlóÁõvhop¶ <»Go}fÁbû£(Œ³Í˜2õ™Å,Bó4ÞÙ&U†Ü˜E˜m–Ñ(*™š’³ ˆæJógÎÇ¡y¾¹CM?³wœÆl½ël3l&f‚·Êf¼B÷<4—lyåmFÌè¨ÖY| .é3Û^ëpþµÆAû«;OÂô„æ[Wì‰ÿ¦xhö¹c†Üf˜7�øW�PØáÐ|B,irNãÁèth~tYSã°ÍCs‰4Íú׃+?ó¦iºNcÜYà Ó5¾ó)dÚ+WÌåHäæ��š 5oV†fù2mbÞ˜jË/k†­Æó&Ê +w)Bͪ3}½(�„GjãkÞ`ð~`¸9Ì›9jAüd†ycþÕ#J ªì[�n[ ·ÿ”Í›Ìyãz5“€?ñc0ÒF‡-ÍÐ7Gõ]_¸*ÚYd�¶·È4$6Ái?ØÚߘ·ûÖüю�yjC[éUÌ›à"a°&ͪ’@…̹1¯ +>ÉêÍ7YnªŽÌÙÁf¦4æ ‡fµ@ó¦'šJ)‚yƒ y³|Ó0ãÙ6¤-‘j-#¸Gj.Æ?bÙ¹÷ØÈ.Í›„úZEÌ)(®]T v%˜7yCòaVIþ8oZŒ5oÒŠœ0o6ÿ°‰.£#æMª)ö¤yÓ*=Yƒb¯X‘3¤YDÈ�@0¥ü�=�y“P1s¢ ¨¹˜ÒY¤™e”‡ia1öÞ\uE8pR&À¤yMåyf^ÍÌÆ§qÆÙ=y‘i6ýœ´Ð@Ól+å³gëi6¥S�êN¡y¿ð›kHaÞÈ‘ß=öýLd0oúÔ ± 7è*–¶yæÍ>§6%Ƙ;ªys”r\äÑ�’~¤ž7Ð%¤:bñIý3]¶"hí +õ–,ÅÄaF+²Jó&éÊì—I=ˆœNòÂJ„yó·©“ï Eš7ÚûŠ¿Åš+07óc£:l^ÜÕͶ€ô¨yf +8 šºDº+¶õÛÌ+kvA›+hu´¨BjÌ›^c‰ä©ñ<æË�æeb½cýs~õêÊ 1o†VGzÞñä173j)þ]xÌ“Ouë/¦sô F‰ßoó¨ŒKǼ‰…Ù|tŸ^óFÚ1p¤Ž•Kg¡Æ·9’cæR0klèÖ2�c9|Ì›�4ƒzaÕ¥*—aÞäAì¾UÔ¼‰RÐ�y#�9)#óFôÓGuÍ›±ÊÈj–Öe¢ŽBf¬¸÷“^/ w^�¶ÈL8�yºüÿsß8}ÍŠŽ›È)‚×ö�”³u³H'N€øÊÙqàX)ƒ~8²!Ë{µ-�uÙ8ê§.®RŽ$nÿûê°.é�f�&þfjJç®4bôå�cÕåÍ´ ¶`ÉÄÅôÀÉF!ЄՂÄù8ørC&HÃtåÀ ÒgÅt\ÛáµppŠ \ùp!0§Ìà›Ð2o˳²ô#L~÷såE€GF¦El�B+»š7ph…fJ"OòŒ8>u\ aFBæ©¢Áðæ»çÞ@0U+HV–Šþ’ûú>’"¸Ú0 jÉHkÇ@ ã�öÈ2»÷1H𡫯‡‹c­™¤ªç8ÉÒñ25®SÀZq�:/Ø£Ùlüz “R`ŽiúeÌ}àÄ#ªig í³Ù´ªÙ³ ¡ÙžV_ƒÅ8éÛ͢ˮC¾çç2ñg€(Ùõe»†ÓäÌ~Y´ÌµK$ñ€k˜ƒ]6F¦€iÆâß”ñº³ f»ÚÚ{áõi¦ÓÓƒM~݇鿾ßı¡º'L? +À†$"í\ñ£˜ƒéOh À´ ØÎÇÇRÍ€§þ^K˜Îiàðc=\ú¡°"H0}Cç¾Wâ÷‚}š¹�h%É%qk…wžŠ�éÇYoCD!U>•Š�)+ôÿé×ô´l·yæ;K�‘5„éÛÇ9<ÿ´GŒ# +¦¯¡µb„m@˜ ûûÈò†é»í>Ø®ø ógéñÁôÿÑ¥\Kj0}´à`©š +¦§ØM—>Šœæ4@¸†é»­_>\úžQ¦ ýF�“Âô¯2ûÓ8¤%˜>ýÛî2O—~¹ÍAaú� ëQ>˜0ýÈL›ÚÅw—~l`N¿æÔ$LåK<Ó¥/pX˜þ!x•¯ó9‡gPX9@ aúó—\ú•ô0õ»~z‹wøtF,ž��’±I+‚ɘ–؃}ü}aöG‰çæïï‡gËbþþ�˜ù €ƒ)W¿o6K蚪�C‰JÍ%;žÄßÇjmwÀÃë65ü›þ>°N=(eNê÷ÕÐæÔ×SÇto)} Äýõ_¾ x› �-¹ý…�á5$óÕâ+‹rnã¡ š 'ùp¤clŸòjr›¢›iÐæÃÁø_¡þM‹F ù/Ørò  +ÒrAº¡4ÇÖFÛÔ¨ÅU‚;J"N|-_X¡`/§#!Wóö-6НÅ4œ±—§cI¨%g¼~øún¾—ÿ±½ª&›J ör¢H!–'¾Ü ‹Õ>{97…&6õp¿Ì`/—�ñ%ci l|9áëåøPdñå€U_¶íåÎs|ÿ{6·ªððÒW1©Cƾ ²Å$GZI rò"Gœ9<0>´“p«#Ž ±!-Ÿå&@jÜ G–·µ™=9Û/x~áˆÓO:gB¸3Þ?@‡ËŽ8ˆîƒ‡0ÌY”/8âHL + ã¬�Ëò`¼5²¹¢PkSѳøÄÊõ}p×}?õ_T™ÀèµAS� ý_“¼�TVÿœ$jø4y,ߨ]ªqˆì SŒJô!÷}Ñþo^}¿c¹ïÃ-Šñå¹iïû‡/¼›YÞ÷àà6êûï¤A€8ù\¾Õ\U)ÝĬ*"…é:_À8,,ø šÊµ�/P_�+¯|T™*냛�'´AÀµ[jÜCve‰í<¨ßÿÁ妢*~ÒzqQö˜•GU%24žì$žÐÒè…%8Zö¾¸¿«T:ÂJ[Ñ2ê—Õ®‡8<Ç–3Í’þç€ +TžX„|6ƆÁ=< M7³_fL‘\ò¤¥¨”” Õ~åx¹)ì[�»‰_3•çåL *Û—t¼"\ŠÊB|ňx9wu8äÈbœ—{|oñr”£v-'8$¶ñrú3/WëÌ€w{>T¬ÊoX*¶gÆ¡ÈòA¡Ì[ØÃÿ„òçåâfVˆÍ"ÿ¢Ì#Â{Á‚˜> k‚c1àéÎdzŸC”'ÛÈ †—½ &ø#`^™ù^pêT^}[�cÏÚ†B\T´Dû+J2ŸäDQ†éGLŒ”þ[8ÄA±%§ô—QåËOÄ™ò¨5}mUÝ*ª"|(ßÏ[<+o†—Å�O‚‰©#}Š2Ìë$¦Œ5|—¦F»¹mSê² SÐRU2yüOŒÏÕØþ‘ÀøÌ[V`EXérL¿¡tvÀñ `Z®F/|þoÛÕãD“ÖvJŒ]KÄãH.¿2Þ0b +ãpØ]‹Àià%iHÒƒ(áòòÌ^üwY–Dpa‰YÕÇ‘¾ÝÉó'†¹@CKÐ<]œñÇ)Ÿ©ˆ›(…B)Ö‹¶ €ìצï}©EFšoÿ¦Mœa2¾P™�ÓÌç«Ï³ße}7 + þ7^�X +R]}�¶MMÚå¯ý¬ì“4A s†æ-?ÞÃ!\Ѻ�M}àI lfQÀÅØq—¿³ÀdZÎÛ†ìªSrñc­Æ3¯�ÖhËÂ�"íè‚#ì·ž×(i®™”§• Í€úãVÇA„€®Ç õ×Õ$/M�çéÇBô•˜MT|ê˜?Ì5• þ†÷û�ú·ô°E(u4ªg3WÂÓŸ¹÷yPÿWØwР…BåÉ\L ~ÑŸ† Zød$ +àõ®U£KC 1ïÇ}$qý ýóôb/õVˆ¦m¼´œtB-O?ød•×f'Z]ëÞy¹FÓ²Ù'-¼tÂæ<ßÓ�ó 3r d¬)îQޱø×²È°ÃxDCŠ­4Êv)vIùT†;ŠVÄpdUè¹&‚Nó4 +{/fl½é:æ™`R.EaMàmWóÙüpRì šÏB9뉒—Ì$€ß+[üÖT §P× ôÀŸ+&ü Ñ;N(=�ù¡%ÄŽ¸Ëä,‚–æ“ÔÃÞdþÖwÛbòI ŸþcÃ?êÂɪϻ­ø Ò#�œÃ=]¬�[X»Û›è4øZÉ�?: ¤{¿­ïsqkŒH�6“>»àŒôO_Œ¡ŠÎe’ãï9σ9¿÷O!šäœ+C�œ +&/¦Ÿ¤gXî«e}é–Ã*zgU‹íûak8ÄB°Œ »YC]�!]'±*¸ê‘êVàijiJÚlt5PEÁF +ey/°fÜ{—Ie·¼ïù"día!P€ôå)>Aåh´â» üONÚ©�aÁçõ0�ý'ÅáÀÓ´zøÐÐÏI@u‚v(»À·ô­6�öÆÏesj§ÚG1 +äãú/Sð€ qg¨>°sÙâ™�¢]U±Û°(-T�ÑÂWÝ¿X2äX«bíjÁñhusc :;Õ²Ýßp’nn m0U(PJOSñ“C—Sƒ‘…·Œetº¹óY÷ºj 'ø/ùÙˆú +u�-˜„+¤c¶ÕÉ`5wç8hr6uLw +(�»Êw‡ù_ÄË+f K–µï< u„§wƒ‘õ›A˜***³¸îó>…ØòÖ†‘+p>g…É®“yf==²¾oN¦7/g4ï”éc�RR[‰Á$jŵP5 AÓRì“üa‹XÂ-9Â÷�,ÜšÅaZ}k#ÿ�JÓòþbíl _F]vcª×},â¿Kø¶#.yîó,0¸î r\¡\§]Œ\j_\wÀ•>|@¿ÁAÝûk�¼ÚGö²z«¦j3f胾-6½å¤À^YÕ3}_ÿÃXpüÛ3©î`°š”‹Ÿ …¾_Ä#ïúÍú† ?7m÷J¦4¾[òõ -+�©¨†š�]i‰²'Bý·VÂ6¶3¥jîû߷𤓴jB̉c�ù +ù V�°?JV¡ 4d‘™¾H.3ÀZa„ïõÒnQ�jÒŸ†Îc(¼(õÁÊœ,�±°lp;y•–OS—‚;xGøâÊ© Qˆ¥¤%·Qšþ”hrüј7§kO<º(W +ÇJ!]¹17Œ!È^ç}yu)›9/°Ý`yb›ÄjIw}—ÕèÅ2ÌêZ J,œ²)�ØüÁJ²ì'.úþ\ëCð%(=.4qÕøŸZAv'p�Çù” áìð˜ïb�öh /Õ)/’.sŸ¹i®‰h¤d}-"šçߊÂL2…§±À„;â„+kú[+ôŽ·S3l i… Ò>S3M �9ÙE ¦ªž;­2W½§æŒ[üÉŽ0Àœ,¯ÿ}�$ˆ +|jÚÅ‘”"ö¦!E +÷T÷:Ÿ$gì¶%ã¿–þUÅ*¥Òª"�ý+¦à[Ò ²¨º;ÉÉ€½!æÀifƒ¿a�¾, .‘ä +=V +ÏÏ<à­�kÅ‚VK]ìv\kì[+ŒRš$Ho]5 ÝŠk�•·V®q­“×!°Õ¼µNy™ç[«ªØ0–§ÔU�ª´?ÉíA|×èÞÙ¤Qs�5¬ë­šØ§pIŒyEì‹.ÖÃ8Î*˜pl°Ðï’)Ü—f±êé¶©k¨ÇañêîR ½7 1¹x�wZEÄ££:C´Š«e\S~U±.„4ë{�ãR�´’Z]oqß)³ìåD¸æÞsv�·H†Â¤§ÆÌ~LÅ<® *wѦȉ4*ÓälíÛB�#Üç¤èÓÛ8ð]CËÅb†xlšà2 �k€èÀú”J…ÆZœTxC©uj;P݉£hòµ^°Pu‹#C´l_EYD§S%ÞTiòI£ô&—oâØGbÜË_AÃÌ-Vcä¬c*£“GœUw4«~vˆ¸Å!éÑ?/ÆÄ�—|m޽ôƒä|©B4Vû~†§ç(`˜·Áè¢9i0ªïÖB ›Ýh¢b¿‚—©½EÈæ¿ y®*m4Nx?ÒÍdŸ»hàR£fÕ3ßs©öÄ»7º5Gbìrén½)Á¡>+ÉÆ7ÖÔfçÓÿ³,lÇ÷æ@‰árd?WZSj‹2ýò4�2 d¼â¾jS¤—åDgtƒpH�cJ¾%×η1ÝÒpL¯ÍÑîæŒsÍ f;éoq]ȯ·G¦?Õ¡V{›=žŠ.xNYo¦:±²1 ¶ÉŒ¼(‘URMTìi(8/`u9º´S o qåŠ}ݱá¬NoH04÷I=`Ab�Z¹fÜ/ÎX´Ô FØ;AÌGø\ä6 endstream endobj 40 0 obj [/Indexed/DeviceRGB 255 44 0 R] endobj 44 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX$6Ra!<<'!!!*'!!rrmPX()~> endstream endobj 34 0 obj <> endobj 45 0 obj [/View/Design] endobj 46 0 obj <>>> endobj 37 0 obj <> endobj 5 0 obj <> endobj 20 0 obj <> endobj 31 0 obj [/View/Design] endobj 32 0 obj <>>> endobj 17 0 obj [/View/Design] endobj 18 0 obj <>>> endobj 35 0 obj [34 0 R] endobj 47 0 obj <> endobj xref +0 48 +0000000004 65535 f +0000000016 00000 n +0000000173 00000 n +0000023152 00000 n +0000000006 00000 f +0000075829 00000 n +0000000008 00000 f +0000023203 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000019 00000 f +0000076086 00000 n +0000076117 00000 n +0000000000 00000 f +0000075899 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000075970 00000 n +0000076001 00000 n +0000000000 00000 f +0000075529 00000 n +0000076202 00000 n +0000023561 00000 n +0000075716 00000 n +0000024878 00000 n +0000025047 00000 n +0000074955 00000 n +0000025121 00000 n +0000025265 00000 n +0000026759 00000 n +0000075003 00000 n +0000075600 00000 n +0000075631 00000 n +0000076227 00000 n +trailer <]>> startxref 76418 %%EOF \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/info.plist b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/info.plist new file mode 100644 index 0000000..345b450 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/pointinghand/info.plist @@ -0,0 +1,29 @@ + + + + + blur + 2 + delay + 0.0 + frames + 1 + hotx + 13 + hoty + 8 + shadowcolor + + 0.0 + 0.0 + 0.0 + 0.45000000000000001 + + shadowoffsetx + 0.0 + shadowoffsety + -1 + vectoronly + 1 + + diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/text.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/text.png new file mode 100644 index 0000000..6ac5c08 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/pdf/text.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/arrow.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/arrow.png new file mode 100644 index 0000000..706a8e5 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/arrow.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/assets.json b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/assets.json new file mode 100644 index 0000000..4ea15d3 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/assets.json @@ -0,0 +1,66 @@ +[ + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "arrow", + "path" : "\/cursors\/apple\/system\/arrow.png", + "width" : 28 + }, + { + "height" : 22, + "hotX" : 12, + "hotY" : 11, + "id" : "text", + "path" : "\/cursors\/apple\/system\/text.png", + "width" : 23 + }, + { + "height" : 32, + "hotX" : 13, + "hotY" : 8, + "id" : "pointer", + "path" : "\/cursors\/apple\/system\/pointer.png", + "width" : 32 + }, + { + "height" : 32, + "hotX" : 16, + "hotY" : 17, + "id" : "grab", + "path" : "\/cursors\/apple\/system\/grab.png", + "width" : 32 + }, + { + "height" : 32, + "hotX" : 16, + "hotY" : 17, + "id" : "grabbing", + "path" : "\/cursors\/apple\/system\/grabbing.png", + "width" : 32 + }, + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "copy", + "path" : "\/cursors\/apple\/system\/copy.png", + "width" : 28 + }, + { + "height" : 21, + "hotX" : 11, + "hotY" : 3, + "id" : "link", + "path" : "\/cursors\/apple\/system\/link.png", + "width" : 16 + }, + { + "height" : 40, + "hotX" : 5, + "hotY" : 5, + "id" : "blocked", + "path" : "\/cursors\/apple\/system\/blocked.png", + "width" : 28 + } +] \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/blocked.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/blocked.png new file mode 100644 index 0000000..1acc4f4 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/blocked.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/copy.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/copy.png new file mode 100644 index 0000000..2332e6f Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/copy.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grab.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grab.png new file mode 100644 index 0000000..acd8a16 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grab.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grabbing.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grabbing.png new file mode 100644 index 0000000..3df63b5 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/grabbing.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/link.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/link.png new file mode 100644 index 0000000..40e3aa8 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/link.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/pointer.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/pointer.png new file mode 100644 index 0000000..a8c81b7 Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/pointer.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/apple/system/text.png b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/text.png new file mode 100644 index 0000000..778261f Binary files /dev/null and b/produktionsvorgaben/gestaltung/cursor/assets/apple/system/text.png differ diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources.json b/produktionsvorgaben/gestaltung/cursor/assets/sources.json new file mode 100644 index 0000000..722cd68 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources.json @@ -0,0 +1,112 @@ +{ + "retrieved": "2026-10-02", + "projects": [ + { + "id": "ghost-cursor", + "name": "Xetera/ghost-cursor", + "url": "https://github.com/Xetera/ghost-cursor", + "commit": "5525a783fcf833a60f1b0746a8f80653ccfee2ba", + "license": "MIT", + "files": [ + { + "path": "sources/ghost-cursor/LICENSE", + "url": "https://raw.githubusercontent.com/Xetera/ghost-cursor/5525a783fcf833a60f1b0746a8f80653ccfee2ba/LICENSE", + "sha256": "48fe0026f06040aabf2b8cbd6a79209c80f58ac3f1e430b26c1d2eeedcd50e48" + }, + { + "path": "sources/ghost-cursor/README.md", + "url": "https://raw.githubusercontent.com/Xetera/ghost-cursor/5525a783fcf833a60f1b0746a8f80653ccfee2ba/README.md", + "sha256": "ec82b7279b61cb88983d87bb6dbbb4eb02f5dd03b63504a0b61f6ec9ba205edc" + }, + { + "path": "sources/ghost-cursor/src/math.ts", + "url": "https://raw.githubusercontent.com/Xetera/ghost-cursor/5525a783fcf833a60f1b0746a8f80653ccfee2ba/src/math.ts", + "sha256": "068cd80fa9e38c40b2dfa590ef72fd4205deb6d3f831d7e906fb13169e746ce9" + }, + { + "path": "sources/ghost-cursor/src/spoof.ts", + "url": "https://raw.githubusercontent.com/Xetera/ghost-cursor/5525a783fcf833a60f1b0746a8f80653ccfee2ba/src/spoof.ts", + "sha256": "85bcab7fe5817156b2183dceef1102d148b08034fd276f31180e2934e29b3b44" + } + ] + }, + { + "id": "humancursor", + "name": "riflosnake/HumanCursor", + "url": "https://github.com/riflosnake/HumanCursor", + "commit": "39d33f387b953950ffc1035183c9609f7f87c2c8", + "license": "MIT", + "files": [ + { + "path": "sources/humancursor/LICENSE", + "url": "https://raw.githubusercontent.com/riflosnake/HumanCursor/39d33f387b953950ffc1035183c9609f7f87c2c8/LICENSE", + "sha256": "ce401b2a3ed683c362c98ae4402aea7ea13c9d9d33df093a12b36674b7e66fa9" + }, + { + "path": "sources/humancursor/README.md", + "url": "https://raw.githubusercontent.com/riflosnake/HumanCursor/39d33f387b953950ffc1035183c9609f7f87c2c8/README.md", + "sha256": "8f115a3120487b1339ee582dced48b47878fde0b814bde0107bea1ae0346925c" + }, + { + "path": "sources/humancursor/humancursor/utilities/human_curve_generator.py", + "url": "https://raw.githubusercontent.com/riflosnake/HumanCursor/39d33f387b953950ffc1035183c9609f7f87c2c8/humancursor/utilities/human_curve_generator.py", + "sha256": "3754cfc28ac4e172e00bb985f2db181451d8510302d918a63fc76e72d28d89b1" + }, + { + "path": "sources/humancursor/humancursor/utilities/calculate_and_randomize.py", + "url": "https://raw.githubusercontent.com/riflosnake/HumanCursor/39d33f387b953950ffc1035183c9609f7f87c2c8/humancursor/utilities/calculate_and_randomize.py", + "sha256": "06f82accdc8b5f953d21e59d15769bf23d092930e8b7bdc60ec05824db3604eb" + } + ] + }, + { + "id": "mouse-follower", + "name": "Cuberto/mouse-follower", + "url": "https://github.com/Cuberto/mouse-follower", + "commit": "a6bac27df2ef63470b94d2e55e6245a3d2dfebb8", + "license": "MIT", + "files": [ + { + "path": "sources/mouse-follower/LICENSE", + "url": "https://raw.githubusercontent.com/Cuberto/mouse-follower/a6bac27df2ef63470b94d2e55e6245a3d2dfebb8/LICENSE", + "sha256": "888cb6b1f3d92704c8b1d11fd39b9e0932cfe6d6d120cf5fa63f7c82d0bd1b97" + }, + { + "path": "sources/mouse-follower/README.MD", + "url": "https://raw.githubusercontent.com/Cuberto/mouse-follower/a6bac27df2ef63470b94d2e55e6245a3d2dfebb8/README.MD", + "sha256": "b8759bb4b28e878c1cefe7d5b3affc0316c5a20e185d700e80012ac2ceeb0de0" + }, + { + "path": "sources/mouse-follower/src/index.js", + "url": "https://raw.githubusercontent.com/Cuberto/mouse-follower/a6bac27df2ef63470b94d2e55e6245a3d2dfebb8/src/index.js", + "sha256": "3dc21b1a897419c7e5b2812e53df3a7836d8c74d0dd7e576920e20f3ed7647e0" + } + ] + }, + { + "id": "smooth-cursor", + "name": "Code-Parth/smooth-cursor", + "url": "https://github.com/Code-Parth/smooth-cursor", + "commit": "702cdc9660372509b5a6ca16c7544aaae3e49566", + "license": "MIT", + "files": [ + { + "path": "sources/smooth-cursor/LICENSE", + "url": "https://raw.githubusercontent.com/Code-Parth/smooth-cursor/702cdc9660372509b5a6ca16c7544aaae3e49566/LICENSE", + "sha256": "cb6a12748ac90004300ba8bddb67c66c56f1ad481cbb3d9b9d35d88d5d2adad0" + }, + { + "path": "sources/smooth-cursor/README.md", + "url": "https://raw.githubusercontent.com/Code-Parth/smooth-cursor/702cdc9660372509b5a6ca16c7544aaae3e49566/README.md", + "sha256": "4a573187f76bffb863d6570c3e8efcc60d9bc0421c3cc0889955f5a3f95fc54c" + }, + { + "path": "sources/smooth-cursor/src/components/smoothCursor/smoothCursor.tsx", + "url": "https://raw.githubusercontent.com/Code-Parth/smooth-cursor/702cdc9660372509b5a6ca16c7544aaae3e49566/src/components/smoothCursor/smoothCursor.tsx", + "sha256": "c04df14f1801f1fa7fb940ad9d3df2614d74501f4ff5d411f39aa7ff93fe0830" + } + ] + } + ], + "use": "Reference code only. Local deterministic GSAP adaptations; no OS/browser cursor automation." +} diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/LICENSE b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/LICENSE new file mode 100644 index 0000000..47ceae6 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Xetera + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/README.md b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/README.md new file mode 100644 index 0000000..594ad87 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/README.md @@ -0,0 +1,252 @@ +# Ghost Cursor + + + +Generate realistic, human-like mouse movement data between coordinates or navigate between elements with puppeteer +like the definitely-not-robot you are. + +> Oh yeah? Could a robot do _**this?**_ + +## Installation + +```sh +yarn add ghost-cursor +``` +or with npm +```sh +npm install ghost-cursor +``` + +## Usage +Generating movement data between 2 coordinates. + +```js +import { path } from "ghost-cursor" + +const from = { x: 100, y: 100 } +const to = { x: 600, y: 700 } + +const route = path(from, to) + +/** + * [ + * { x: 100, y: 100 }, + * { x: 108.75573501957051, y: 102.83608396351725 }, + * { x: 117.54686481838543, y: 106.20019239793275 }, + * { x: 126.3749821408895, y: 110.08364505509256 }, + * { x: 135.24167973152743, y: 114.47776168684264 } + * ... and so on + * ] + */ +``` + +Generating movement data between 2 coordinates with timestamps. +```js +import { path } from "ghost-cursor" + +const from = { x: 100, y: 100 } +const to = { x: 600, y: 700 } + +const route = path(from, to, { useTimestamps: true }) + +/** + * [ + * { x: 100, y: 100, timestamp: 1711850430643 }, + * { x: 114.78071695023473, y: 97.52340709495319, timestamp: 1711850430697 }, + * { x: 129.1362373468682, y: 96.60141853603243, timestamp: 1711850430749 }, + * { x: 143.09468422606352, y: 97.18676354029148, timestamp: 1711850430799 }, + * { x: 156.68418062398405, y: 99.23217132478408, timestamp: 1711850430848 }, + * ... and so on + * ] + */ +``` + + +Usage with puppeteer: + +```js +import { GhostCursor } from "ghost-cursor" +import puppeteer from "puppeteer" + +const run = async (url) => { + const selector = "#sign-up button" + const browser = await puppeteer.launch({ headless: false }); + const page = await browser.newPage() + const cursor = new GhostCursor(page) + await page.goto(url) + await page.waitForSelector(selector) + await cursor.click(selector) + // shorthand for + // await cursor.move(selector) + // await cursor.click() +} +``` + +### Puppeteer-specific behavior +* `cursor.move()` will automatically overshoot or slightly miss and re-adjust for elements that are too far away +from the cursor's starting point. +* When moving over objects, a random coordinate that's within the element will be selected instead of +hovering over the exact center of the element. +* The speed of the mouse will take the distance and the size of the element you're clicking on into account. + +
    + +![ghost-cursor in action](https://cdn.discordapp.com/attachments/418699380833648644/664110683054538772/acc_gen.gif) + +> Ghost cursor in action on a form + +## Methods + +#### `new GhostCursor(page: puppeteer.Page, { start?: Vector, performRandomMoves?: boolean, defaultOptions?: DefaultOptions, visible?: boolean = false }): GhostCursor` + +Creates the ghost cursor that contains the action functions described below. + +- **page:** Puppeteer `page`. +- **start (optional):** Cursor start position. Default is `{ x: 0, y: 0 }`. +- **performRandomMoves (optional):** Initially perform random movements. Default is `false`. +- **defaultOptions (optional):** Set custom default options for `click`, `move`, `moveTo`, and `randomMove` functions. Default values are described below. +- **visible (optional):** Make the cursor visible, using `installMouseHelper()`. Default is `false`. + +#### `toggleRandomMove(random: boolean): void` + +Toggles random mouse movements on or off. + +#### `click(selector?: string | ElementHandle, options?: ClickOptions): Promise` + +Simulates a mouse click at the specified selector or element. + +- **selector (optional):** CSS selector or ElementHandle to identify the target element. +- **options (optional):** Additional options for clicking. **Extends the `options` of the `move`, `scrollIntoView`, and `getElement` functions (below)** + - `hesitate (number):` Delay before initiating the click action in milliseconds. Default is `0`. + - `waitForClick (number):` Delay between mousedown and mouseup in milliseconds. Default is `0`. + - `moveDelay (number):` Delay after moving the mouse in milliseconds. Default is `2000`. If `randomizeMoveDelay=true`, delay is randomized from 0 to `moveDelay`. + - `button (MouseButton):` Mouse button to click. Default is `left`. + - `clickCount (number):` Number of times to click the button. Default is `1`. + +#### `move(selector: string | ElementHandle, options?: MoveOptions): Promise` + +Moves the mouse to the specified selector or element. + +- **selector:** CSS selector or ElementHandle to identify the target element. +- **options (optional):** Additional options for moving. **Extends the `options` of the `scrollIntoView` and `getElement` functions (below)** + - `paddingPercentage (number):` Percentage of padding to be added inside the element when determining the target point. Default is `0` (may move to anywhere within the element). `100` will always move to center of element. + - `destination (Vector):` Destination to move the cursor to, relative to the top-left corner of the element. If specified, `paddingPercentage` is not used. If not specified (default), destination is random point within the `paddingPercentage`. + - `moveDelay (number):` Delay after moving the mouse in milliseconds. Default is `0`. If `randomizeMoveDelay=true`, delay is randomized from 0 to `moveDelay`. + - `randomizeMoveDelay (boolean):` Randomize delay between actions from `0` to `moveDelay`. Default is `true`. + - `maxTries (number):` Maximum number of attempts to mouse-over the element. Default is `10`. + - `moveSpeed (number):` Speed of mouse movement. Default is random. + - `overshootThreshold (number):` Distance from current location to destination that triggers overshoot to occur. (Below this distance, no overshoot will occur). Default is `500`. + +#### `moveTo(destination: Vector, options?: MoveToOptions): Promise` + +Moves the mouse to the specified destination point. + +- **destination:** An object with `x` and `y` coordinates representing the target position. For example, `{ x: 500, y: 300 }`. +- **options (optional):** Additional options for moving. + - `moveSpeed (number):` Speed of mouse movement. Default is random. + - `moveDelay (number):` Delay after moving the mouse in milliseconds. Default is `0`. If `randomizeMoveDelay=true`, delay is randomized from 0 to `moveDelay`. + - `randomizeMoveDelay (boolean):` Randomize delay between actions from `0` to `moveDelay`. Default is `true`. + +#### `moveBy(delta: Vector, options?: MoveToOptions): Promise` + +Moves the mouse by a specified amount. + +- **delta:** An object with `x` and `y` coordinates representing the distance to move. For example, `{ x: 10, y: 20 }`. +- **options (optional):** Additional options for moving. Same as `moveTo` options + +#### `scrollIntoView(selector: string | ElementHandle, options?: ScrollIntoViewOptions) => Promise` + +Scrolls the element into view. If already in view, no scroll occurs. + +- **selector:** CSS selector or ElementHandle to identify the target element. +- **options (optional):** Additional options for scrolling. **Extends the `options` of the `getElement` and `scroll` functions (below)** + - `scrollSpeed (number):` Scroll speed (when scrolling occurs). 0 to 100. 100 is instant. Default is `100`. + - `scrollDelay (number):` Time to wait after scrolling (when scrolling occurs). Default is `200`. + - `inViewportMargin (number):` Margin (in px) to add around the element when ensuring it is in the viewport. Default is `0`. + +#### `scrollTo: (destination: Partial | 'top' | 'bottom' | 'left' | 'right' | ElementHandle, options?: ScrollOptions) => Promise` + +Scrolls to the specified destination point. + +- **destination:** Can be any of: + - An object with `x` and `y` coordinates representing the target position. For example, `{ x: 500, y: 300 }`. + - `'top'` or `'bottom'` or `'left'` or `'right'`. + - An ElementHandle (scrolls to the element's bounding box x/y coordinates). +- **options (optional):** Additional options for scrolling. **Extends the `options` of the `scroll` function (below)** + +#### `scroll: (delta: Partial, options?: ScrollOptions) => Promise` + +Scrolls the page the distance set by `delta`. + +- **delta:** An object with `x` and `y` coordinates representing the distance to scroll from the current position. +- **options (optional):** Additional options for scrolling. + - `scrollSpeed (number):` Scroll speed. 0 to 100. 100 is instant. Default is `100`. + - `scrollDelay (number):` Time to wait after scrolling. Default is `200`. + +#### `mouseDown / mouseUp: (options?: MouseButtonOptions) => Promise` + +Mouse button up or down. + +- **options (optional):** Additional options for mouse action. + - `button (MouseButton):` Mouse button to click. Default is `left`. + - `clickCount (number):` Number of times to click the button. Default is `1`. + +#### `getElement(selector: string | ElementHandle, options?: GetElementOptions) => Promise` + +Gets the element via a selector. Can use an XPath. + +- **selector:** CSS selector or ElementHandle to identify the target element. +- **options (optional):** Additional options. + - `waitForSelector (number):` Time to wait for the selector to appear in milliseconds. Default is to not wait for selector. + +#### `getLocation(): Vector` + +Get current location of the cursor. + +### Other Utility Methods + +#### `installMouseHelper(page: Page): Promise` + +Installs a mouse helper on the page, making the pointer visible. Gets executed in the `GhostCursor` initialization when passing `visible=true`. Use for debugging only. + +#### `getRandomPagePoint(page: Page): Promise` + +Gets a random point on the browser window. + +#### `path(start: Vector, end: Vector | BoundingBox, options?: number | PathOptions): Vector[] | TimedVector[]` + +Generates a set of points for mouse movement between two coordinates. + +- **start:** Starting point of the movement. +- **end:** Ending point (or bounding box) of the movement. +- **options (optional):** Additional options for generating the path. Can also be a number which will set `spreadOverride`. + - `spreadOverride (number):` Override the spread of the generated path. + - `moveSpeed (number):` Speed of mouse movement. Default is random. + - `useTimestamps (boolean):` Generate timestamps for each point based on the trapezoidal rule. + +## How does it work + +Bezier curves do almost all the work here. They let us create an infinite amount of curves between any 2 points we want +and they look quite human-like. (At least moreso than alternatives like perlin or simplex noise) + +![](https://mamamoo.xetera.dev/😽🤵👲🧦👵.png) + +The magic comes from being able to set multiple points for the curve to go through. This is done by picking +2 coordinates randomly in a limited area above and under the curve. + + + +However, we don't want wonky looking cubic curves when using this method because nobody really moves their mouse +that way, so only one side of the line is picked when generating random points. + + +When calculating how fast the mouse should be moving we use
    Fitts's Law +to determine the amount of points we should be returning relative to the width of the element being clicked on and the distance +between the mouse and the object. + +## To turn on logging, please set your DEBUG env variable like so: + +- OSX: `DEBUG="ghost-cursor:*"` +- Linux: `DEBUG="ghost-cursor:*"` +- Windows CMD: `set DEBUG=ghost-cursor:*` +- Windows PowerShell: `$env:DEBUG = "ghost-cursor:*"` diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/math.ts b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/math.ts new file mode 100644 index 0000000..f324926 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/math.ts @@ -0,0 +1,101 @@ +import { Bezier } from 'bezier-js' + +export interface Vector { + x: number + y: number +} +export interface TimedVector extends Vector { + timestamp: number +} +export const origin: Vector = { x: 0, y: 0 } + +// maybe i should've just imported a vector library lol +export const sub = (a: Vector, b: Vector): Vector => ({ x: a.x - b.x, y: a.y - b.y }) +export const div = (a: Vector, b: number): Vector => ({ x: a.x / b, y: a.y / b }) +export const mult = (a: Vector, b: number): Vector => ({ x: a.x * b, y: a.y * b }) +export const add = (a: Vector, b: Vector): Vector => ({ x: a.x + b.x, y: a.y + b.y }) + +export const extrapolate = (a: Vector, b: Vector): Vector => add(b, sub(b, a)) +export const scale = (value: number, range1: [number, number], range2: [number, number]): number => + (value - range1[0]) * (range2[1] - range2[0]) / (range1[1] - range1[0]) + range2[0] + +export const direction = (a: Vector, b: Vector): Vector => sub(b, a) +export const perpendicular = (a: Vector): Vector => ({ x: a.y, y: -1 * a.x }) +export const magnitude = (a: Vector): number => + Math.sqrt(Math.pow(a.x, 2) + Math.pow(a.y, 2)) +export const unit = (a: Vector): Vector => div(a, magnitude(a)) +export const setMagnitude = (a: Vector, amount: number): Vector => + mult(unit(a), amount) + +export const randomNumberRange = (min: number, max: number): number => + Math.random() * (max - min) + min + +export const randomVectorOnLine = (a: Vector, b: Vector): Vector => { + const vec = direction(a, b) + const multiplier = Math.random() + return add(a, mult(vec, multiplier)) +} + +const randomNormalLine = ( + a: Vector, + b: Vector, + range: number +): [Vector, Vector] => { + const randMid = randomVectorOnLine(a, b) + const normalV = setMagnitude(perpendicular(direction(a, randMid)), range) + return [randMid, normalV] +} + +export const generateBezierAnchors = ( + a: Vector, + b: Vector, + spread: number +): [Vector, Vector] => { + const side = Math.round(Math.random()) === 1 ? 1 : -1 + const calc = (): Vector => { + const [randMid, normalV] = randomNormalLine(a, b, spread) + const choice = mult(normalV, side) + return randomVectorOnLine(randMid, add(randMid, choice)) + } + return [calc(), calc()].sort((a, b) => a.x - b.x) as [Vector, Vector] +} + +export const clamp = (target: number, min: number, max: number): number => + Math.min(max, Math.max(min, target)) + +export const overshoot = (coordinate: Vector, radius: number): Vector => { + const a = Math.random() * 2 * Math.PI + const rad = radius * Math.sqrt(Math.random()) + const vector = { x: rad * Math.cos(a), y: rad * Math.sin(a) } + return add(coordinate, vector) +} + +export const bezierCurve = ( + start: Vector, + finish: Vector, + /** + * Default is length from start to finish, clamped to 2 < x < 200 + */ + spreadOverride?: number +): Bezier => { + // could be played around with + const MIN_SPREAD = 2 + const MAX_SPREAD = 200 + const vec = direction(start, finish) + const length = magnitude(vec) + const spread = spreadOverride ?? clamp(length, MIN_SPREAD, MAX_SPREAD) + const anchors = generateBezierAnchors(start, finish, spread) + return new Bezier(start, ...anchors, finish) +} + +export const bezierCurveSpeed = ( + t: number, + P0: Vector, + P1: Vector, + P2: Vector, + P3: Vector +): number => { + const B1 = 3 * (1 - t) ** 2 * (P1.x - P0.x) + 6 * (1 - t) * t * (P2.x - P1.x) + 3 * t ** 2 * (P3.x - P2.x) + const B2 = 3 * (1 - t) ** 2 * (P1.y - P0.y) + 6 * (1 - t) * t * (P2.y - P1.y) + 3 * t ** 2 * (P3.y - P2.y) + return Math.sqrt(B1 ** 2 + B2 ** 2) +} diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/spoof.ts b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/spoof.ts new file mode 100644 index 0000000..ca34d96 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/ghost-cursor/src/spoof.ts @@ -0,0 +1,1048 @@ +import type { ElementHandle, Page, BoundingBox, CDPSession, Protocol } from 'puppeteer' +import debug from 'debug' +import { + type Vector, + type TimedVector, + bezierCurve, + bezierCurveSpeed, + direction, + magnitude, + origin, + overshoot, + add, + clamp, + scale, + extrapolate +} from './math' +import { installMouseHelper } from './mouse-helper' + +// TODO: remove in next major version, is now wrapped in the GhostCursor class. +export { installMouseHelper } + +const log = debug('ghost-cursor') + +export interface BoxOptions { + /** + * Percentage of padding to be added inside the element when determining the target point. + * Example: + * - `0` = may be anywhere within the element. + * - `100` = will always be center of element. + * @default 0 + */ + readonly paddingPercentage?: number + /** + * Destination to move the cursor to, relative to the top-left corner of the element. + * If specified, `paddingPercentage` is not used. + * If not specified (default), destination is random point within the `paddingPercentage`. + * @default undefined (random point) + */ + readonly destination?: Vector +} + +export interface GetElementOptions { + /** + * Time to wait for the selector to appear in milliseconds. + * Default is to not wait for selector. + */ + readonly waitForSelector?: number +} + +type PagePosition = 'top' | 'bottom' | 'left' | 'right' +export type ScrollToDestination = Partial | PagePosition | ElementHandle + +export interface ScrollOptions { + /** + * Scroll speed. 0 to 100. 100 is instant. + * @default 100 + */ + readonly scrollSpeed?: number + /** + * Time to wait after scrolling. + * @default 200 + */ + readonly scrollDelay?: number +} + +export interface ScrollIntoViewOptions extends ScrollOptions, GetElementOptions { + /** + * Scroll speed (when scrolling occurs). 0 to 100. 100 is instant. + * @default 100 + */ + readonly scrollSpeed?: number + /** + * Time to wait after scrolling (when scrolling occurs). + * @default 200 + */ + readonly scrollDelay?: number + /** + * Margin (in px) to add around the element when ensuring it is in the viewport. + * (Does not take effect if CDP scroll fails.) + * @default 0 + */ + readonly inViewportMargin?: number +} + +export interface MoveOptions extends BoxOptions, ScrollIntoViewOptions, Pick { + /** + * Delay after moving the mouse in milliseconds. If `randomizeMoveDelay=true`, delay is randomized from 0 to `moveDelay`. + * @default 0 + */ + readonly moveDelay?: number + /** + * Randomize delay between actions from `0` to `moveDelay`. See `moveDelay` docs. + * @default true + */ + readonly randomizeMoveDelay?: boolean + /** + * Maximum number of attempts to mouse-over the element. + * @default 10 + */ + readonly maxTries?: number + /** + * Distance from current location to destination that triggers overshoot to + * occur. (Below this distance, no overshoot will occur). + * @default 500 + */ + readonly overshootThreshold?: number +} + +export interface ClickOptions extends MoveOptions { + /** + * Delay before initiating the click action in milliseconds. + * @default 0 + */ + readonly hesitate?: number + /** + * Delay between mousedown and mouseup in milliseconds. + * @default 0 + */ + readonly waitForClick?: number + /** + * @default 2000 + */ + readonly moveDelay?: number + /** + * @default "left" + */ + readonly button?: Protocol.Input.MouseButton + /** + * @default 1 + */ + readonly clickCount?: number +} + +export interface PathOptions { + /** + * Override the spread of the generated path. + */ + readonly spreadOverride?: number + /** + * Speed of mouse movement. + * Default is random. + */ + readonly moveSpeed?: number + + /** + * Generate timestamps for each point in the path. + */ + readonly useTimestamps?: boolean +} + +export interface RandomMoveOptions extends Pick { + /** + * @default 2000 + */ + readonly moveDelay?: number +} + +export interface MoveToOptions extends PathOptions, Pick { + /** + * @default 0 + */ + readonly moveDelay?: number +} + +export type MouseButtonOptions = Pick + +/** + * Default options for cursor functions. + */ +export interface DefaultOptions { + /** + * Default options for the `randomMove` function that occurs when `performRandomMoves=true` + * @default RandomMoveOptions + */ + randomMove?: RandomMoveOptions + /** + * Default options for the `move` function + * @default MoveOptions + */ + move?: MoveOptions + /** + * Default options for the `moveTo` function + * @default MoveToOptions + */ + moveTo?: MoveToOptions + /** + * Default options for the `click` function + * @default ClickOptions + */ + click?: ClickOptions + /** + * Default options for the `scrollIntoView`, `scrollTo`, and `scroll` functions + * @default ScrollIntoViewOptions + */ + scroll?: ScrollOptions & ScrollIntoViewOptions + /** + * Default options for the `getElement` function + * @default GetElementOptions + */ + getElement?: GetElementOptions +} + +/** Helper function to wait a specified number of milliseconds */ +const delay = async (ms: number): Promise => { + if (ms < 1) return + return await new Promise((resolve) => setTimeout(resolve, ms)) +} + +const isElementHandle = (item: any): item is ElementHandle => + item !== null && item !== undefined && typeof item.asElement === 'function' + +/** + * Calculate the amount of time needed to move from (x1, y1) to (x2, y2) + * given the width of the element being clicked on + * https://en.wikipedia.org/wiki/Fitts%27s_law + */ +const fitts = (distance: number, width: number): number => { + const a = 0 + const b = 2 + const id = Math.log2(distance / width + 1) + return a + b * id +} + +/** Get a random point on a box */ +const getRandomBoxPoint = ( + { x, y, width, height }: BoundingBox, + options?: Pick +): Vector => { + let paddingWidth = 0 + let paddingHeight = 0 + + if ( + options?.paddingPercentage !== undefined && + options?.paddingPercentage > 0 && + options?.paddingPercentage <= 100 + ) { + paddingWidth = (width * options.paddingPercentage) / 100 + paddingHeight = (height * options.paddingPercentage) / 100 + } + + return { + x: x + paddingWidth / 2 + Math.random() * (width - paddingWidth), + y: y + paddingHeight / 2 + Math.random() * (height - paddingHeight) + } +} + +/** The function signature to access the internal CDP client changed in puppeteer 14.4.1 */ +export const getCDPClient = (page: Page): CDPSession => + typeof (page as any)._client === 'function' + ? (page as any)._client() + : (page as any)._client + +/** Get a random point on a browser window */ +export const getRandomPagePoint = async (page: Page): Promise => { + const targetId: string = (page.target() as any)._targetId + const window = await getCDPClient(page).send('Browser.getWindowForTarget', { targetId }) + return getRandomBoxPoint({ + x: origin.x, + y: origin.y, + width: window.bounds.width ?? 0, + height: window.bounds.height ?? 0 + }) +} + +/** Get correct position of Inline elements (elements like ``). Has fallback. */ +export const getElementBox = async ( + page: Page, + element: ElementHandle, + relativeToMainFrame: boolean = true): Promise => { + try { + const objectId = element.remoteObject().objectId + if (objectId === undefined) throw new Error('Element objectId is undefined, falling back to alternative methods') + + const quads = await getCDPClient(page).send('DOM.getContentQuads', { objectId }) + const elementBox: BoundingBox = { + x: quads.quads[0][0], + y: quads.quads[0][1], + width: quads.quads[0][4] - quads.quads[0][0], + height: quads.quads[0][5] - quads.quads[0][1] + } + if (!relativeToMainFrame) { + const elementFrame = await element.contentFrame() + const iframes = await elementFrame?.parentFrame()?.$$('xpath/.//iframe') + if (iframes !== undefined && iframes !== null) { + let frame: ElementHandle | undefined + for (const iframe of iframes) { + if ((await iframe.contentFrame()) === elementFrame) { + frame = iframe + } + } + if (frame !== undefined && frame != null) { + const frameBox = await frame.boundingBox() + if (frameBox !== null) { + elementBox.x -= frameBox.x + elementBox.y -= frameBox.y + } + } + } + } + + return elementBox + } catch { + try { + log('Quads not found, trying regular boundingBox') + const elementBox = await element.boundingBox() + if (elementBox === null) throw new Error('Element boundingBox is null, falling back to getBoundingClientRect') + return elementBox + } catch { + log('BoundingBox null, using getBoundingClientRect') + return await element.evaluate((el) => + el.getBoundingClientRect() as BoundingBox + ) + } + } +} + +/** Generates a set of points for mouse movement between two coordinates. */ +export function path ( + start: Vector, + end: Vector | BoundingBox, + /** + * Additional options for generating the path. + * Can also be a number which will set `spreadOverride`. + */ + // TODO: remove number arg in next major version change, fine to just allow `spreadOverride` in object. + options?: number | PathOptions): Vector[] | TimedVector[] { + const optionsResolved: PathOptions = typeof options === 'number' + ? { spreadOverride: options } + : { ...options } + + const DEFAULT_WIDTH = 100 + const MIN_STEPS = 25 + const width = 'width' in end && end.width !== 0 ? end.width : DEFAULT_WIDTH + const curve = bezierCurve(start, end, optionsResolved.spreadOverride) + const length = curve.length() * 0.8 + + const speed = optionsResolved.moveSpeed !== undefined && optionsResolved.moveSpeed > 0 + ? (25 / optionsResolved.moveSpeed) + : Math.random() + const baseTime = speed * MIN_STEPS + const steps = Math.ceil((Math.log2(fitts(length, width) + 1) + baseTime) * 3) + const re = curve.getLUT(steps) + return clampPositive(re, optionsResolved) +} + +const clampPositive = (vectors: Vector[], options?: PathOptions): Vector[] | TimedVector[] => { + const clampedVectors = vectors.map((vector) => ({ + x: Math.max(0, vector.x), + y: Math.max(0, vector.y) + })) + + return options?.useTimestamps === true ? generateTimestamps(clampedVectors, options) : clampedVectors +} + +const generateTimestamps = (vectors: Vector[], options?: PathOptions): TimedVector[] => { + const speed = options?.moveSpeed ?? (Math.random() * 0.5 + 0.5) + const timeToMove = (P0: Vector, P1: Vector, P2: Vector, P3: Vector, samples: number): number => { + let total = 0 + const dt = 1 / samples + + for (let t = 0; t < 1; t += dt) { + const v1 = bezierCurveSpeed(t * dt, P0, P1, P2, P3) + const v2 = bezierCurveSpeed(t, P0, P1, P2, P3) + total += (v1 + v2) * dt / 2 + } + + return Math.round(total / speed) + } + + const timedVectors: TimedVector[] = [] + + for (let i = 0; i < vectors.length; i++) { + if (i === 0) { + timedVectors.push({ ...vectors[i], timestamp: Date.now() }) + } else { + const P0 = vectors[i - 1] + const P1 = vectors[i] + const P2 = i + 1 < vectors.length ? vectors[i + 1] : extrapolate(P0, P1) + const P3 = i + 2 < vectors.length ? vectors[i + 2] : extrapolate(P1, P2) + const time = timeToMove(P0, P1, P2, P3, vectors.length) + + timedVectors.push({ + ...vectors[i], + timestamp: timedVectors[i - 1].timestamp + time + }) + } + } + + return timedVectors +} + +const shouldOvershoot = (a: Vector, b: Vector, threshold: number): boolean => + magnitude(direction(a, b)) > threshold + +const intersectsElement = (vec: Vector, box: BoundingBox): boolean => { + return ( + vec.x > box.x && + vec.x <= box.x + box.width && + vec.y > box.y && + vec.y <= box.y + box.height + ) +} + +export class GhostCursor { + public readonly page: Page + /** Default options for cursor functions. */ + public defaultOptions: DefaultOptions + + /** Location of the cursor. */ + private location: Vector + /** Whether mouse is moving via `click`, `move`, `moveTo`, etc. (does not include random movements). Initial state: not moving. */ + private moving: boolean = false + /** Make the cursor no longer visible. Defined only if `visible=true` was passed, or `installMouseHelper` ran later. */ + private removeMouseHelperFn: undefined | (() => Promise) + + private static readonly OVERSHOOT_SPREAD = 10 + private static readonly OVERSHOOT_RADIUS = 120 + + constructor ( + page: Page, + { + start = origin, + performRandomMoves = false, + defaultOptions = {}, + visible = false + }: + { + /** + * Cursor start position. + * @default { x: 0, y: 0 } + */ + start?: Vector + /** + * Initially perform random movements. + * If `move`,`click`, etc. is performed, these random movements end. + * @default false + */ + performRandomMoves?: boolean + /** + * Set custom default options for cursor action functions. + * Default values are described in the type JSdocs. + */ + defaultOptions?: DefaultOptions + /** + * Whether cursor should be made visible using `installMouseHelper`. + * @default false + */ + visible?: boolean + } = {} + ) { + this.page = page + this.location = start + this.defaultOptions = defaultOptions + + if (visible) { + // Install mouse helper (visible mouse). Do not await the promise but return immediately + this.installMouseHelper().then( + (_) => { }, + (_) => { } + ) + } + + // Start random mouse movements. Do not await the promise but return immediately + if (performRandomMoves) { + this.randomMove().then( + (_) => { }, + (_) => { } + ) + } + } + + /** + * Install mouse helper (visible cursor). + */ + public async installMouseHelper (): Promise { + await installMouseHelper(this.page).then( + ({ removeMouseHelper }) => { + this.removeMouseHelperFn = removeMouseHelper + }) + } + + /** + * Make the cursor no longer visible. + * Only has an effect if `visible=true` was passed, or this.installMouseHelper performed manually. + */ + public async removeMouseHelper (): Promise { + await this.removeMouseHelperFn?.() + this.removeMouseHelperFn = undefined + } + + private async getPageState (): Promise<{ + viewportWidth: number + viewportHeight: number + docHeight: number + docWidth: number + scrollPositionTop: number + scrollPositionLeft: number + }> { + return await this.page.evaluate(() => ({ + viewportWidth: document.body.clientWidth, + viewportHeight: document.body.clientHeight, + docHeight: document.body.scrollHeight, + docWidth: document.body.scrollWidth, + scrollPositionTop: window.scrollY, + scrollPositionLeft: window.scrollX + })) + } + + /** Move the mouse to a point, getting the vectors via `path(previous, newLocation, options)` */ + private async moveMouse ( + newLocation: BoundingBox | Vector, + options?: PathOptions, + abortOnMove: boolean = false + ): Promise { + const cdpClient = getCDPClient(this.page) + const vectors = path(this.location, newLocation, options) + + for (const v of vectors) { + try { + // In case this is called from random mouse movements and the users wants to move the mouse, abort + if (abortOnMove && this.moving) { + return + } + + const dispatchParams: Protocol.Input.DispatchMouseEventRequest = { + type: 'mouseMoved', + x: v.x, + y: v.y + } + + if ('timestamp' in v) dispatchParams.timestamp = v.timestamp + + await cdpClient.send('Input.dispatchMouseEvent', dispatchParams) + + this.location = v + } catch (error) { + // Exit function if the browser is no longer connected + if (!this.page.browser().connected) return + + log('Warning: could not move mouse, error message:', error) + } + } + } + + /** Start random mouse movements. Function recursively calls itself. */ + private async randomMove (options?: RandomMoveOptions): Promise { + const optionsResolved = { + moveDelay: 2000, + randomizeMoveDelay: true, + ...this.defaultOptions?.randomMove, + ...options + } satisfies RandomMoveOptions + + try { + if (!this.moving) { + const rand = await getRandomPagePoint(this.page) + await this.moveMouse(rand, optionsResolved, true) + } + await delay(optionsResolved.moveDelay * (optionsResolved.randomizeMoveDelay ? Math.random() : 1)) + this.randomMove(options).then( + (_) => { }, + (_) => { } + ) // fire and forget, recursive function + } catch (_) { + log('Warning: stopping random mouse movements') + } + } + + private async mouseButtonAction ( + action: Protocol.Input.DispatchMouseEventRequest['type'], + options?: MouseButtonOptions + ): Promise { + const optionsResolved = { + button: 'left', + clickCount: 1, + ...this.defaultOptions?.click, + ...options + } satisfies MouseButtonOptions + + const cdpClient = getCDPClient(this.page) + await cdpClient.send('Input.dispatchMouseEvent', { + x: this.location.x, + y: this.location.y, + button: optionsResolved.button, + clickCount: optionsResolved.clickCount, + type: action + }) + } + + /** Mouse button down */ + public async mouseDown (options?: MouseButtonOptions): Promise { + await this.mouseButtonAction('mousePressed', options) + } + + /** Mouse button up (release) */ + public async mouseUp (options?: MouseButtonOptions): Promise { + await this.mouseButtonAction('mouseReleased', options) + } + + /** Toggles random mouse movements on or off. */ + public toggleRandomMove (random: boolean): void { + this.moving = !random + } + + /** Get current location of the cursor. */ + public getLocation (): Vector { + return this.location + } + + /** + * Simulates a mouse click at the specified selector or element. + * Default is to click at current location, don't move. + */ + public async click ( + selector?: string | ElementHandle, + /** @default defaultOptions.click */ + options?: ClickOptions + ): Promise { + const optionsResolved = { + moveDelay: 2000, + hesitate: 0, + waitForClick: 0, + randomizeMoveDelay: true, + button: 'left', + clickCount: 1, + ...this.defaultOptions?.click, + ...options + } satisfies ClickOptions + + const wasRandom = !this.moving + this.toggleRandomMove(false) + + if (selector !== undefined) { + await this.move(selector, { + ...optionsResolved, + // apply moveDelay after click, but not after actual move + moveDelay: 0 + }) + } + + try { + await delay(optionsResolved.hesitate) + + await this.mouseDown() + await delay(optionsResolved.waitForClick) + await this.mouseUp() + } catch (error) { + log('Warning: could not click mouse, error message:', error) + } + + await delay(optionsResolved.moveDelay * (optionsResolved.randomizeMoveDelay ? Math.random() : 1)) + + this.toggleRandomMove(wasRandom) + } + + /** Moves the mouse to the specified selector or element. */ + public async move ( + selector: string | ElementHandle, + /** @default defaultOptions.move */ + options?: MoveOptions + ): Promise { + const optionsResolved = { + moveDelay: 0, + maxTries: 10, + overshootThreshold: 500, + randomizeMoveDelay: true, + ...this.defaultOptions?.move, + ...options + } satisfies MoveOptions + + const wasRandom = !this.moving + this.toggleRandomMove(false) + + const go = async (iteration: number): Promise => { + if (iteration > (optionsResolved.maxTries)) { + throw Error('Could not mouse-over element within enough tries') + } + + const elem = await this.getElement(selector, optionsResolved) + + // Make sure the object is in view + await this.scrollIntoView(elem, optionsResolved) + + const box = await getElementBox(this.page, elem) + const destination = (optionsResolved.destination !== undefined) + ? add(box, optionsResolved.destination) + : getRandomBoxPoint(box, optionsResolved) + if (shouldOvershoot( + this.location, + destination, + optionsResolved.overshootThreshold + )) { + // overshoot + await this.moveMouse(overshoot(destination, GhostCursor.OVERSHOOT_RADIUS), optionsResolved) + + // then go to the box + await this.moveMouse({ ...box, ...destination }, { + ...optionsResolved, + spreadOverride: GhostCursor.OVERSHOOT_SPREAD + }) + } else { + // go directly to the box, no overshoot + await this.moveMouse(destination, optionsResolved) + } + + const newBoundingBox = await getElementBox(this.page, elem) + + // It's possible that the element that is being moved towards + // has moved to a different location by the time + // the the time the mouseover animation finishes + if (!intersectsElement(this.location, newBoundingBox)) { + return await go(iteration + 1) + } + } + await go(0) + + this.toggleRandomMove(wasRandom) + + await delay(optionsResolved.moveDelay * (optionsResolved.randomizeMoveDelay ? Math.random() : 1)) + } + + /** Moves the mouse to the specified destination point. */ + public async moveTo ( + destination: Vector, + /** @default defaultOptions.moveTo */ + options?: MoveToOptions + ): Promise { + const optionsResolved = { + moveDelay: 0, + randomizeMoveDelay: true, + ...this.defaultOptions?.moveTo, + ...options + } satisfies MoveToOptions + + const wasRandom = !this.moving + this.toggleRandomMove(false) + await this.moveMouse(destination, optionsResolved) + this.toggleRandomMove(wasRandom) + + await delay(optionsResolved.moveDelay * (optionsResolved.randomizeMoveDelay ? Math.random() : 1)) + } + + /** Moves the mouse by a specified amount */ + public async moveBy (delta: Partial, options?: MoveToOptions): Promise { + await this.moveTo(add(this.location, { x: 0, y: 0, ...delta }), options) + } + + /** Scrolls the element into view. If already in view, no scroll occurs. */ + public async scrollIntoView ( + selector: string | ElementHandle, + /** @default defaultOptions.scroll */ + options?: ScrollIntoViewOptions + ): Promise { + const optionsResolved = { + scrollDelay: 200, + scrollSpeed: 100, + inViewportMargin: 0, + ...this.defaultOptions?.scroll, + ...options + } satisfies ScrollIntoViewOptions + + const scrollSpeed = clamp(optionsResolved.scrollSpeed, 1, 100) + + const elem = await this.getElement(selector, optionsResolved) + + const { + viewportWidth, + viewportHeight, + docHeight, + docWidth, + scrollPositionTop, + scrollPositionLeft + } = await this.getPageState() + + const elemBoundingBox = await getElementBox(this.page, elem) // is relative to viewport + const elemBox = { + top: elemBoundingBox.y, + left: elemBoundingBox.x, + bottom: elemBoundingBox.y + elemBoundingBox.height, + right: elemBoundingBox.x + elemBoundingBox.width + } + + // Add margin around the element + const marginedBox = { + top: elemBox.top - optionsResolved.inViewportMargin, + left: elemBox.left - optionsResolved.inViewportMargin, + bottom: elemBox.bottom + optionsResolved.inViewportMargin, + right: elemBox.right + optionsResolved.inViewportMargin + } + + // Get position relative to the whole document + const marginedBoxRelativeToDoc = { + top: marginedBox.top + scrollPositionTop, + left: marginedBox.left + scrollPositionLeft, + bottom: marginedBox.bottom + scrollPositionTop, + right: marginedBox.right + scrollPositionLeft + } + + // Convert back to being relative to the viewport-- though if box with margin added goes outside + // the document, restrict to being *within* the document. + // This makes it so that when element is on the edge of window scroll, isInViewport=true even after + // margin was added. + const targetBox = { + top: Math.max(marginedBoxRelativeToDoc.top, 0) - scrollPositionTop, + left: Math.max(marginedBoxRelativeToDoc.left, 0) - scrollPositionLeft, + bottom: Math.min(marginedBoxRelativeToDoc.bottom, docHeight) - scrollPositionTop, + right: Math.min(marginedBoxRelativeToDoc.right, docWidth) - scrollPositionLeft + } + + const { top, left, bottom, right } = targetBox + + const isInViewport = top >= 0 && + left >= 0 && + bottom <= viewportHeight && + right <= viewportWidth + + if (isInViewport) return + + const manuallyScroll = async (): Promise => { + let deltaY: number = 0 + let deltaX: number = 0 + + if (top < 0) { + deltaY = top // Scroll up + } else if (bottom > viewportHeight) { + deltaY = bottom - viewportHeight // Scroll down + } + + if (left < 0) { + deltaX = left // Scroll left + } else if (right > viewportWidth) { + deltaX = right - viewportWidth// Scroll right + } + + await this.scroll({ x: deltaX, y: deltaY }, optionsResolved) + } + + try { + const cdpClient = getCDPClient(this.page) + + if (scrollSpeed === 100 && optionsResolved.inViewportMargin <= 0) { + try { + const { objectId } = elem.remoteObject() + if (objectId === undefined) throw new Error() + await cdpClient.send('DOM.scrollIntoViewIfNeeded', { objectId }) + } catch { + await manuallyScroll() + } + } else { + await manuallyScroll() + } + } catch (e) { + // use regular JS scroll method as a fallback + log('Falling back to JS scroll method', e) + await elem.evaluate((e) => e.scrollIntoView({ + block: 'center', + behavior: scrollSpeed < 90 ? 'smooth' : undefined + })) + } + } + + /** Scrolls the page the distance set by `delta`. */ + public async scroll ( + delta: Partial, + /** @default defaultOptions.scroll */ + options?: ScrollOptions + ): Promise { + const optionsResolved = { + scrollDelay: 200, + scrollSpeed: 100, + ...this.defaultOptions?.scroll, + ...options + } satisfies ScrollOptions + + const scrollSpeed = clamp(optionsResolved.scrollSpeed, 1, 100) + + const cdpClient = getCDPClient(this.page) + + let deltaX = delta.x ?? 0 + let deltaY = delta.y ?? 0 + const xDirection = deltaX < 0 ? -1 : 1 + const yDirection = deltaY < 0 ? -1 : 1 + + deltaX = Math.abs(deltaX) + deltaY = Math.abs(deltaY) + + const largerDistanceDir = deltaX > deltaY ? 'x' : 'y' + const [largerDistance, shorterDistance] = largerDistanceDir === 'x' ? [deltaX, deltaY] : [deltaY, deltaX] + + // When scrollSpeed under 90, pixels moved each scroll is equal to the scrollSpeed. 1 is as slow as we can get (without adding a delay), and 90 is pretty fast. + // Above 90 though, scale all the way to the full distance so that scrollSpeed=100 results in only 1 scroll action. + const EXP_SCALE_START = 90 + const largerDistanceScrollStep = scrollSpeed < EXP_SCALE_START + ? scrollSpeed + : scale(scrollSpeed, [EXP_SCALE_START, 100], [EXP_SCALE_START, largerDistance]) + + const numSteps = Math.floor(largerDistance / largerDistanceScrollStep) + const largerDistanceRemainder = largerDistance % largerDistanceScrollStep + const shorterDistanceScrollStep = Math.floor(shorterDistance / numSteps) + const shorterDistanceRemainder = shorterDistance % numSteps + + for (let i = 0; i < numSteps; i++) { + let longerDistanceDelta = largerDistanceScrollStep + let shorterDistanceDelta = shorterDistanceScrollStep + if (i === numSteps - 1) { + longerDistanceDelta += largerDistanceRemainder + shorterDistanceDelta += shorterDistanceRemainder + } + let [deltaX, deltaY] = largerDistanceDir === 'x' + ? [longerDistanceDelta, shorterDistanceDelta] + : [shorterDistanceDelta, longerDistanceDelta] + deltaX = deltaX * xDirection + deltaY = deltaY * yDirection + + await cdpClient.send('Input.dispatchMouseEvent', { + type: 'mouseWheel', + deltaX, + deltaY, + x: this.location.x, + y: this.location.y + } satisfies Protocol.Input.DispatchMouseEventRequest) + } + + await delay(optionsResolved.scrollDelay) + } + + /** Scrolls to the specified destination point. */ + public async scrollTo ( + destination: ScrollToDestination, + /** @default defaultOptions.scroll */ + options?: ScrollOptions + ): Promise { + const optionsResolved = { + scrollDelay: 200, + scrollSpeed: 100, + ...this.defaultOptions?.scroll, + ...options + } satisfies ScrollOptions + + const { + docHeight, + docWidth, + scrollPositionTop, + scrollPositionLeft + } = await this.getPageState() + + const to: Partial = await (async (): Promise> => { + switch (destination) { + case 'top': + return { y: 0 } + case 'bottom': + return { y: docHeight } + case 'left': + return { x: 0 } + case 'right': + return { x: docWidth } + default: { + if (isElementHandle(destination)) { + const box = await destination.boundingBox() + if (box == null) { + throw new Error('no boundingBox') + } + // boundingBox() is viewport-relative; convert to document-relative + return { + x: box.x + scrollPositionLeft, + y: box.y + scrollPositionTop + } + } + + // Partial + return destination + } + } + })() + + await this.scroll({ + y: to.y !== undefined ? to.y - scrollPositionTop : 0, + x: to.x !== undefined ? to.x - scrollPositionLeft : 0 + }, optionsResolved) + } + + /** Gets the element via a selector. Can use an XPath. */ + public async getElement ( + selector: string | ElementHandle, + /** @default defaultOptions.getElement */ + options?: GetElementOptions + ): Promise> { + const optionsResolved = { + ...this.defaultOptions?.getElement, + ...options + } satisfies GetElementOptions + + let elem: ElementHandle | null = null + if (typeof selector === 'string') { + if (selector.startsWith('//') || selector.startsWith('(//')) { + selector = `xpath/.${selector}` + if (optionsResolved.waitForSelector !== undefined) { + await this.page.waitForSelector(selector, { timeout: optionsResolved.waitForSelector }) + } + const [handle] = await this.page.$$(selector) + elem = handle.asElement() as ElementHandle | null + } else { + if (optionsResolved.waitForSelector !== undefined) { + await this.page.waitForSelector(selector, { timeout: optionsResolved.waitForSelector }) + } + elem = await this.page.$(selector) + } + if (elem === null) { + throw new Error( + `Could not find element with selector "${selector}", make sure you're waiting for the elements by specifying "waitForSelector"` + ) + } + } else { + // ElementHandle + elem = selector + } + return elem + } +} + +/** + * @deprecated + * TODO: Remove on next major version change. Prefer to just do `new GhostCursor` instead of this function. + * Is here because removing would be breaking. + */ +export const createCursor = ( + page: Page, + /** + * Cursor start position. + * @default { x: 0, y: 0 } + */ + start: Vector = origin, + /** + * Initially perform random movements. + * If `move`,`click`, etc. is performed, these random movements end. + * @default false + */ + performRandomMoves: boolean = false, + /** + * Default options for cursor functions. + */ + defaultOptions: DefaultOptions = {}, + /** + * Whether cursor should be made visible using `installMouseHelper`. + * @default false + */ + visible: boolean = false +): GhostCursor => new GhostCursor(page, { start, performRandomMoves, defaultOptions, visible }) diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/LICENSE b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/LICENSE new file mode 100644 index 0000000..a43a7e3 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Flori Batusha + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/README.md b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/README.md new file mode 100644 index 0000000..539cc71 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/README.md @@ -0,0 +1,158 @@ +# HumanCursor: A Python package for simulating human mouse movements + +

    + +_**HumanCursor**_ is a Python package that allows you to _**simulate realistic human mouse movements**_ on the web and the system. It can be used for _**automating scripts**_ that require mouse interactions, such as _**web scraping**_, _**automated tasks**_, _**testing**_, or _**gaming**_. + +# Content: + +- [Features](#features) +- [Requirements](#requirements) +- [How to install](#installation) +- [How to use](#usage) + - [HCScripter](#hcscripter) + - [WebCursor](#webcursor) + - [SystemCursor](#systemcursor) +- [Demonstration](#demonstration) + +# Features + +- HumanCursor uses a `natural motion algorithm` that mimics the way `humans` move the mouse cursor, with `variable speed`, `acceleration`, and `curvature`. +- Can perform various mouse actions, such as `clicking`, `dragging`, `scrolling`, and `hovering`. +- Designed specifically to `bypass security measures and bot detection software`. +- Includes: + - 🚀 `HCScripter` app to create physical cursor automated scripts without coding. + - � `WebCursor` module for web cursor code automation. + - Fully supported for `Chrome` and `Edge`, not optimal/tested for Firefox and Safari, using `Selenium`. + - 🤖 `SystemCursor` module for physical cursor code automation. + + +# Requirements + +- ```Python >= 3.7``` + - [Download the installer](https://www.python.org/downloads/), run it and follow the steps. + - Make sure to check the box that says `Add Python to PATH` during installation. + - Reboot computer. + +# Installation + +To install, you can use pip: + + pip install --upgrade humancursor + +# Usage + +## HCScripter + +To quickly create an automated system script, you can use `HCScripter`, which registers mouse actions from point to point using key commands and creates a script file for you. + +After installing `humancursor` package, open up `terminal/powershell` and just copy paste this command which runs `launch.py` file inside the folder named `HCScripter` of `humancursor` package: + +```powershell +python -m humancursor.HCScripter.launch +``` + +#### A window will show up looking like this: + +Screenshot 2023-11-29 165810 + +Firstly, you can specify the `name` of the python file which will contain the script and choose the `location` where that file should be saved. + +Then, you can turn on movement listener by pressing the `ON/OFF` button, where it will start registering your movements, by these commands below: + +- Press `Z` -> `Move` +- Press `CTRL` -> `Click` +- Press and hold `CTRL` -> `Drag and drop` + +After completing your script, press `Finish` button and the script file .py should be ready to go! + +## WebCursor + +To use HumanCursor for Web, you need to import the `WebCursor` class, and create an instance: + +```python +from humancursor import WebCursor + +cursor = WebCursor(driver) +``` + +Then, you can use the following methods to simulate mouse movements and actions: + +- `cursor.move_to()`: Moves the mouse cursor to the element or location on the webpage. +- `cursor.click_on()`: Clicks on the element or location on the webpage. +- `cursor.drag_and_drop()`: Drags the mouse cursor from one element and drops it to another element on the screen. +- `cursor.move_by_offset()`: Moves the cursor by x and y pixels. +- `cursor.control_scroll_bar()`: Sets the scroll bar to a certain level, can be a volume, playback slider or anything. Level is set by float number from 0 to 1, meaning fullness +- `cursor.scroll_into_view_of_element()`: Scrolls into view of element if not already there, it is called automatically from above functions. + +These functions can accept as destination, either the `WebElement` itself, or a `list of 'x' and 'y' coordinates`. + +Some parameters explained: + +- `relative_position`: Takes a list of x and y percentages as floats from 0 to 1, which indicate the exact position by width and height inside an element + for example, if you set it to [0.5, 0.5], it will move the cursor to the center of the element. +- `absolute_offset`: If you input a list of coordinates instead of webelement, if you turn this to True, the coordinates will be interpreted as absolute movement by pixels, and not like coordinates in the webpage. +- `steady`: Tries to make movement in straight line, mimicking human, if set to True + + +## SystemCursor +
    + + + +
    +To use HumanCursor for your system mouse, you need to import the `SystemCursor` class, and create an instance just like we did above: + +```python +from humancursor import SystemCursor + +cursor = SystemCursor() +``` + +The `SystemCursor` class, which should be used for controlling the system mouse (with pyautogui), only inherits the `move_to()`, `click_on()` and `drag_and_drop` functions, accepting only the list of 'x' and 'y' coordinates as input, as there are no elements available. + + +# DEMONSTRATION: +To quickly check how the cursor moves, you can do this: + +#### SystemCursor + ```powershell + python -m humancursor.test.system + ``` +#### WebCursor + ```powershell + python -m humancursor.test.web + ``` + +#### Some code examples: + +```python +cursor.move_to(element) # moves to element +cursor.move_to(element, relative_position=[0.5, 0.5]) # moves to the center of the element +cursor.move_to([450, 600]) # moves to coordinates relative to viewport x: 450, y: 600 +cursor.move_to([450, 600], absolute_offset=True) # moves 450 pixels to the right and 600 pixels down + +cursor.move_by_offset(200, 170) # moves 200 pixels to the right and 170 pixels down +cursor.move_by_offset(-10, -20) # moves 10 pixels to the left and 20 pixels up + +cursor.click_on([170, 390]) # clicks on coordinates relative to viewport x: 170, y: 390 +cursor.click_on(element, relative_position=[0.2, 0.5]) # clicks on 0.2 x width, 0.5 x height position of the element. +cursor.click_on(element, click_duration=1.7) # clicks and holds on element for 1.7 seconds + +cursor.drag_and_drop(element1, element2) # clicks and hold on first element, and moves to and releases on the second +cursor.drag_and_drop(element, [640, 320], drag_from_relative_position=[0.9, 0.9]) # drags from element on 0.9 x width, 0.9 x height (far bottom right corner) and moves to and releases to coordinates relative to viewport x: 640, y: 320 + +cursor.control_scroll_bar(element, amount_by_percentage=0.75) # sets a slider to 75% full +cursor.controll_scroll_bar(element, amount_by_percentage=0.2, orientation='vertical') # sets a vertical slider to 20% full + +cursor.scroll_into_view_of_element(element) # scrolls into view of element if not already in it +cursor.show_cursor() # injects javascript that will display a red dot over the cursor on webpage. Should be called only for visual testing before script and not actual work. + +``` + +# License + +HumanCursor is licensed under the MIT License. See LICENSE for more information. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/calculate_and_randomize.py b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/calculate_and_randomize.py new file mode 100644 index 0000000..2e54dde --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/calculate_and_randomize.py @@ -0,0 +1,102 @@ +import math + +from selenium.webdriver import Chrome, Edge, Firefox, Safari +import pytweening +import random + + +def calculate_absolute_offset(element, list_of_x_and_y_offsets): + """Calculates exact number of pixel offsets from relative values""" + dimensions = element.size + width, height = dimensions["width"], dimensions["height"] + x_final = width * list_of_x_and_y_offsets[0] + y_final = height * list_of_x_and_y_offsets[1] + + return [int(x_final), int(y_final)] + + +def generate_random_curve_parameters(driver, pre_origin, post_destination): + """Generates random parameters for the curve, the tween, number of knots, distortion, target points and boundaries""" + web = False + if isinstance(driver, (Chrome, Firefox, Edge, Safari)): + web = True + viewport_width, viewport_height = driver.get_window_size().values() + else: + viewport_width, viewport_height = driver.size() + min_width, max_width = viewport_width * 0.15, viewport_width * 0.85 + min_height, max_height = viewport_height * 0.15, viewport_height * 0.85 + + tween_options = [ + pytweening.easeOutExpo, + pytweening.easeInOutQuint, + pytweening.easeInOutSine, + pytweening.easeInOutQuart, + pytweening.easeInOutExpo, + pytweening.easeInOutCubic, + pytweening.easeInOutCirc, + pytweening.linear, + pytweening.easeOutSine, + pytweening.easeOutQuart, + pytweening.easeOutQuint, + pytweening.easeOutCubic, + pytweening.easeOutCirc, + ] + + tween = random.choice(tween_options) + offset_boundary_x = random.choice( + random.choices( + [range(20, 45), range(45, 75), range(75, 100)], [0.2, 0.65, 15] + )[0] + ) + offset_boundary_y = random.choice( + random.choices( + [range(20, 45), range(45, 75), range(75, 100)], [0.2, 0.65, 15] + )[0] + ) + knots_count = random.choices( + [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + [0.15, 0.36, 0.17, 0.12, 0.08, 0.04, 0.03, 0.02, 0.015, 0.005], + )[0] + + distortion_mean = random.choice(range(80, 110)) / 100 + distortion_st_dev = random.choice(range(85, 110)) / 100 + distortion_frequency = random.choice(range(25, 70)) / 100 + + if web: + target_points = random.choice( + random.choices( + [range(35, 45), range(45, 60), range(60, 80)], [0.53, 0.32, 0.15] + )[0] + ) + else: + target_points = max(int(math.sqrt((pre_origin[0] - post_destination[0]) ** 2 + (pre_origin[1] - post_destination[1]) ** 2)), 2) + + if ( + min_width > pre_origin[0] + or max_width < pre_origin[0] + or min_height > pre_origin[1] + or max_height < pre_origin[1] + ): + offset_boundary_x = 1 + offset_boundary_y = 1 + knots_count = 1 + if ( + min_width > post_destination[0] + or max_width < post_destination[0] + or min_height > post_destination[1] + or max_height < post_destination[1] + ): + offset_boundary_x = 1 + offset_boundary_y = 1 + knots_count = 1 + + return ( + offset_boundary_x, + offset_boundary_y, + knots_count, + distortion_mean, + distortion_st_dev, + distortion_frequency, + tween, + target_points, + ) diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/human_curve_generator.py b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/human_curve_generator.py new file mode 100644 index 0000000..15d357c --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/humancursor/humancursor/utilities/human_curve_generator.py @@ -0,0 +1,197 @@ +import random +import math +import numpy as np +import pytweening + + +class HumanizeMouseTrajectory: + def __init__(self, from_point, to_point, **kwargs): + self.from_point = from_point + self.to_point = to_point + self.points = self.generate_curve(**kwargs) + + def generate_curve(self, **kwargs): + """Generates the curve based on arguments below, default values below are automatically modified to cause randomness""" + offset_boundary_x = kwargs.get("offset_boundary_x", 80) + offset_boundary_y = kwargs.get("offset_boundary_y", 80) + left_boundary = ( + kwargs.get("left_boundary", min(self.from_point[0], self.to_point[0])) + - offset_boundary_x + ) + right_boundary = ( + kwargs.get("right_boundary", max(self.from_point[0], self.to_point[0])) + + offset_boundary_x + ) + down_boundary = ( + kwargs.get("down_boundary", min(self.from_point[1], self.to_point[1])) + - offset_boundary_y + ) + up_boundary = ( + kwargs.get("up_boundary", max(self.from_point[1], self.to_point[1])) + + offset_boundary_y + ) + knots_count = kwargs.get("knots_count", 2) + distortion_mean = kwargs.get("distortion_mean", 1) + distortion_st_dev = kwargs.get("distortion_st_dev", 1) + distortion_frequency = kwargs.get("distortion_frequency", 0.5) + tween = kwargs.get("tweening", pytweening.easeOutQuad) + target_points = kwargs.get("target_points", 100) + + internalKnots = self.generate_internal_knots( + left_boundary, right_boundary, down_boundary, up_boundary, knots_count + ) + points = self.generate_points(internalKnots) + points = self.distort_points( + points, distortion_mean, distortion_st_dev, distortion_frequency + ) + points = self.tween_points(points, tween, target_points) + return points + + def generate_internal_knots( + self, l_boundary, r_boundary, d_boundary, u_boundary, knots_count + ): + """Generates the internal knots of the curve randomly""" + if not ( + self.check_if_numeric(l_boundary) + and self.check_if_numeric(r_boundary) + and self.check_if_numeric(d_boundary) + and self.check_if_numeric(u_boundary) + ): + raise ValueError("Boundaries must be numeric values") + if not isinstance(knots_count, int) or knots_count < 0: + knots_count = 0 + if l_boundary > r_boundary: + raise ValueError( + "left_boundary must be less than or equal to right_boundary" + ) + if d_boundary > u_boundary: + raise ValueError( + "down_boundary must be less than or equal to upper_boundary" + ) + try: + knotsX = np.random.choice(range(l_boundary, r_boundary) or l_boundary, size=knots_count) + knotsY = np.random.choice(range(d_boundary, u_boundary) or d_boundary, size=knots_count) + except TypeError: + knotsX = np.random.choice( + range(int(l_boundary), int(r_boundary)), size=knots_count + ) + knotsY = np.random.choice( + range(int(d_boundary), int(u_boundary)), size=knots_count + ) + knots = list(zip(knotsX, knotsY)) + return knots + + def generate_points(self, knots): + """Generates the points from BezierCalculator""" + if not self.check_if_list_of_points(knots): + raise ValueError("knots must be valid list of points") + + midPtsCnt = max( + abs(self.from_point[0] - self.to_point[0]), + abs(self.from_point[1] - self.to_point[1]), + 2, + ) + knots = [self.from_point] + knots + [self.to_point] + return BezierCalculator.calculate_points_in_curve(int(midPtsCnt), knots) + + def distort_points( + self, points, distortion_mean, distortion_st_dev, distortion_frequency + ): + """Distorts points by parameters of mean, standard deviation and frequency""" + if not ( + self.check_if_numeric(distortion_mean) + and self.check_if_numeric(distortion_st_dev) + and self.check_if_numeric(distortion_frequency) + ): + raise ValueError("Distortions must be numeric") + if not self.check_if_list_of_points(points): + raise ValueError("points must be valid list of points") + if not (0 <= distortion_frequency <= 1): + raise ValueError("distortion_frequency must be in range [0,1]") + + distorted = [] + for i in range(1, len(points) - 1): + x, y = points[i] + delta = ( + np.random.normal(distortion_mean, distortion_st_dev) + if random.random() < distortion_frequency + else 0 + ) + distorted += ((x, y + delta),) + distorted = [points[0]] + distorted + [points[-1]] + return distorted + + def tween_points(self, points, tween, target_points): + """Modifies points by tween""" + if not self.check_if_list_of_points(points): + raise ValueError("List of points not valid") + if not isinstance(target_points, int) or target_points < 2: + raise ValueError("target_points must be an integer greater or equal to 2") + + res = [] + for i in range(target_points): + index = int(tween(float(i) / (target_points - 1)) * (len(points) - 1)) + res += (points[index],) + return res + + @staticmethod + def check_if_numeric(val): + """Checks if value is proper numeric value""" + return isinstance(val, (float, int, np.int32, np.int64, np.float32, np.float64)) + + def check_if_list_of_points(self, list_of_points): + """Checks if list of points is valid""" + if not isinstance(list_of_points, list): + return False + try: + point = lambda p: ( + (len(p) == 2) + and self.check_if_numeric(p[0]) + and self.check_if_numeric(p[1]) + ) + return all(map(point, list_of_points)) + except (KeyError, TypeError): + return False + + +class BezierCalculator: + @staticmethod + def binomial(n, k): + """Returns the binomial coefficient "n choose k" """ + return math.factorial(n) / float(math.factorial(k) * math.factorial(n - k)) + + @staticmethod + def bernstein_polynomial_point(x, i, n): + """Calculate the i-th component of a bernstein polynomial of degree n""" + return BezierCalculator.binomial(n, i) * (x**i) * ((1 - x) ** (n - i)) + + @staticmethod + def bernstein_polynomial(points): + """ + Given list of control points, returns a function, which given a point [0,1] returns + a point in the Bézier curve described by these points + """ + + def bernstein(t): + n = len(points) - 1 + x = y = 0 + for i, point in enumerate(points): + bern = BezierCalculator.bernstein_polynomial_point(t, i, n) + x += point[0] * bern + y += point[1] * bern + return x, y + + return bernstein + + @staticmethod + def calculate_points_in_curve(n, points): + """ + Given list of control points, returns n points in the Bézier curve, + described by these points + """ + curvePoints = [] + bernstein_polynomial = BezierCalculator.bernstein_polynomial(points) + for i in range(n): + t = i / (n - 1) + curvePoints += (bernstein_polynomial(t),) + return curvePoints diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/LICENSE b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/LICENSE new file mode 100644 index 0000000..2ba2c43 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) Cuberto, Ltd. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/README.MD b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/README.MD new file mode 100644 index 0000000..34b8299 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/README.MD @@ -0,0 +1,491 @@ +# Cuberto Mouse Follower + +[![NPM Version](https://img.shields.io/npm/v/mouse-follower?color=red)](https://www.npmjs.com/package/mouse-follower) +[![License](https://img.shields.io/npm/l/mouse-follower?color=orange)](LICENSE) +[![Bundle file size](https://img.shields.io/bundlejs/size/mouse-follower?format=min&color=green&label=size)](https://bundlejs.com/?q=mouse-follower) +[![Bundle file size (gzip)](https://img.shields.io/bundlejs/size/mouse-follower?format=minzip&color=yellow&label=gzip%20size)](https://bundlejs.com/?q=mouse-follower) +[![NPM Downloads](https://img.shields.io/npm/dm/mouse-follower?color=blue)](https://npmcharts.com/compare/mouse-follower?minimal=true) +[![CI](https://img.shields.io/github/actions/workflow/status/Cuberto/mouse-follower/ci.yml?branch=dev&label=build)](https://github.com/Cuberto/mouse-follower/actions/workflows/ci.yml) + +A powerful JavaScript library to create amazing and smooth effects for the mouse cursor on your website. + +![demo](https://user-images.githubusercontent.com/11841379/162477170-5dd33ecd-0e72-4fe4-9053-53d7b5557637.gif) + +## Dependencies + +GSAP v3 (https://greensock.com/gsap/) + +## Quick start + +### Install from NPM + +Mouse Follower requires the GSAP library to work. + +``` +npm install gsap --save +npm install mouse-follower --save +``` + +Import GSAP and Mouse Follower and initialize it: + +```js +import MouseFollower from "mouse-follower"; +import {gsap} from "gsap"; + +MouseFollower.registerGSAP(gsap); + +const cursor = new MouseFollower(); +``` + +Don't forget to import the cursor styles from `/src/scss/index.scss` into your main SCSS file: + +### Use from CDN + +If you don't want to include the Mouse Follower files in your project, you can use it from CDN. + +The following files are available: + +```html + + + +``` + +Mouse Follower requires the GSAP library to work. You need to import it before Mouse Follower if you don't already have it: + +```html + + + +``` + +## Options + +You can configure Mouse Follower via options: + +```js +const cursor = new MouseFollower({ + container: '.mf-container', + speed: 0.3 +}); +``` + +The following options and defaults are available: + +```js +const cursor = new MouseFollower({ + el: null, + container: document.body, + eventsTarget: document.documentElement, + className: 'mf-cursor', + innerClassName: 'mf-cursor-inner', + textClassName: 'mf-cursor-text', + mediaClassName: 'mf-cursor-media', + mediaBoxClassName: 'mf-cursor-media-box', + iconSvgClassName: 'mf-svgsprite', + iconSvgNamePrefix: '-', + iconSvgSrc: '', + iconImgClassName: 'mf-cursor-icon', + dataAttr: 'cursor', + hiddenState: '-hidden', + textState: '-text', + iconState: '-icon', + activeState: '-active', + mediaState: '-media', + stateDetection: { + '-pointer': 'a,button', + '-hidden': 'iframe' + }, + visible: true, + visibleOnState: false, + speed: 0.55, + ease: 'expo.out', + overwrite: true, + skewing: 0, + skewingText: 2, + skewingIcon: 2, + skewingMedia: 2, + skewingDelta: 0.001, + skewingDeltaMax: 0.15, + stickDelta: 0.15, + showTimeout: 20, + hideOnLeave: true, + hideTimeout: 300, + hideMediaTimeout: 300 +}); +``` + +| Name | Type | Description | +| :--- | :---: | :--- | +| `el` | `string` | `HTMLElement` | Existing cursor element. If not specified, the cursor will be created automatically. | +| `container` | `string` | `HTMLElement` | Cursor container. Body by default. | +| `eventsTarget` | `string` | `HTMLElement` | Target for cursor events. Root document element by default. | +| `className` | `string` | Cursor root element class name. | +| `innerClassName` | `string` | Inner element class name. | +| `textClassName` | `string` | Text element class name. | +| `mediaClassName` | `string` | Media element class name. | +| `mediaBoxClassName` | `string` | Media inner element class name. | +| `iconSvgClassName` | `string` | SVG sprite class name. | +| `iconSvgNamePrefix` | `string` | SVG sprite class name prefix for icons. | +| `iconSvgSrc` | `string` | SVG sprite source. If you are not using SVG sprites, leave this blank. | +| `iconImgClassName` | `string` | SVG icon img class name. | +| `dataAttr` | `string` | `null` | Name of the data attribute for changing cursor state directly in HTML markup. Uses event delegation. | +| `hiddenState` | `string` | Hidden class name state. | +| `textState` | `string` | Text class name state. | +| `iconState` | `string` | Icon class name state. | +| `activeState` | `string` | `null` | Active (mousedown) class name state. Set `false` to disable. | +| `mediaState` | `string` | Media (image/video) class name state. | +| `visible` | `boolean` | Whether the cursor is visible by default. | +| `visibleOnState` | `boolean` | Automatically show/hide cursor when a state is added. Can be useful when implementing a hidden cursor follower. | +| `stateDetection` | `object` | `null` | Allows you to set predefined states for different elements on the page. Uses event delegation. | +| `speed` | `number` | Cursor movement speed. | +| `ease` | `string` | Timing function of cursor movement. See [GSAP easing](https://greensock.com/docs/v3/Eases). | +| `overwrite` | `boolean` | Overwrite or preserve the cursor position when the `mousemove` event fires. See [GSAP overwrite modes](https://greensock.com/conflict/). | +| `skewing` | `number` | Default "skewing" factor. | +| `skewingText` | `number` | Skew effect factor in the text state. Set `0` to disable skew in this mode. | +| `skewingIcon` | `number` | Skew effect factor in the icon state. Set `0` to disable skew in this mode. | +| `skewingMedia` | `number` | Skew effect factor in the media (image/video) state. Set `0` to disable skew in this mode. | +| `skewingDelta` | `number` | Skew effect base delta. Set `0` to disable skew in this mode. | +| `skewingDeltaMax` | `number` | Skew effect max delta. Set `0` to disable skew in this mode. | +| `stickDelta` | `number` | Stick effect delta. | +| `showTimeout` | `number` | Delay before showing. May be useful for the spawn animation to work properly. | +| `hideOnLeave` | `boolean` | Hide the cursor when the mouse leaves the event target. | +| `hideTimeout` | `number` | Hiding delay. Should be equal to the CSS hide animation time. | +| `initialPos` | `array` | Array (x, y) of the initial cursor position. | + +## Advanced usage + +### Show or hide cursor + +These basic methods allow you to show and hide the cursor: + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.hide(); +}); + +el.addEventListener('mouseleave', () => { + cursor.show(); +}); +``` + +or via a data attribute: + +```html +
    Hover me to hide cursor!
    +``` + +### Toggle cursor state + +A state is essentially a class that applies to the root element of the cursor. You can change the appearance of the +cursor using CSS (see `src/scss/index.scss`). + +To set/unset a state, use these methods: + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.addState('-inverse'); // you can pass multiple states separated by whitespace +}); + +el.addEventListener('mouseleave', () => { + cursor.removeState('-inverse'); +}); +``` + +or via a data attribute: + +```html +
    Hover me to invert cursor!
    +``` + +### State detection + +You can customize the list of states for all elements on the page: + +```js +const cursor = new MouseFollower({ + stateDetection: { + '-pointer': 'a,button', + '-opaque': '.my-image', + '-hidden': '.my-input' + } +}); +``` + +```html +
    On this element the cursor will be in the pointer state +
    On this element the cursor will be in the opaque state
    +
    On this element the cursor will be hidden
    +``` + +Note: The state detection feature uses event delegation. Do not create a large number of rules or complex selectors to avoid +performance problems. It is recommended to disable this in projects with a large number of nested DOM elements. This +also applies to binding via a data attribute. + +To fully disable event delegation: + +```js +const cursor = new MouseFollower({ + stateDetection: false, + dataAttr: false +}); +``` + +### Text mode + +To display text in the cursor, use this method: + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.setText('Hello!'); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeText(); +}); +``` + +or via a data attribute: + +```html +
    Hover me!
    +``` + +### Icon mode + +If you use an SVG spritesheet in your project and want to display icons in the cursor, then you can use this method. In this +case, you need to specify the path to the SVG sprite in the options and set the class names. + +```js +const cursor = new MouseFollower({ + iconSvgSrc: '/assets/img/sprites/svgsprites.svg', + iconSvgClassName: 'my-spritesheet', + iconSvgNamePrefix: '-', +}); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.setIcon('arrow-left'); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeIcon(); +}); +``` + +or via a data attribute: + +```html +
    Hover me!
    +``` + +You can also pass an SVG element directly: + +```js +const icon = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); +icon.setAttribute('viewBox', '0 0 24 24'); +icon.innerHTML = ''; + +el.addEventListener('mouseenter', () => { + cursor.setIcon(icon); +}); +``` + +You can also use any SVG icon by URL: + +```js +el.addEventListener('mouseenter', () => { + cursor.setIconImg('/img/arrow-left.svg'); +}); +``` + +or via a data attribute: + +```html +
    Hover me!
    +``` + +### Image mode + +This method allows you to show any image in the cursor: + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.setImg('/img/example.png'); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeImg(); +}); +``` + +or via a data attribute: + +```html +
    Hover me to show image!
    +``` + +### Video mode + +You can also play videos: + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.setVideo('/video/example.mp4'); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeVideo(); +}); +``` + +or via a data attribute: + +```html +
    Hover me to show a video!
    +``` + +### Sticky effect + +This method allows you to attach the cursor to an element with a magnet effect. This only works correctly with fixed +elements on the page. + +```js +const cursor = new MouseFollower(); +const box = document.querySelector('.my-fixed-box'); +const el = document.querySelector('.my-fixed-element'); + +box.addEventListener('mouseenter', () => { + cursor.setStick(el); +}); + +box.addEventListener('mouseleave', () => { + cursor.removeStick(); +}); +``` + +or via a data attribute: + +```html +
    Hover me to stick the cursor!
    +``` + +You can also pass an element selector to the data attribute: + +```html +
    Hover
    me
    to stick the cursor!
    +``` + +### Skewing effect + +The skew effect distorts the cursor while it moves. It looks good with round cursors. + +```js +const cursor = new MouseFollower(); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.setSkewing(3); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeSkewing(); +}); +``` + +### Hidden cursor + +In this example, the cursor is initialized as hidden by default and only appears on the desired element. + +```js +const cursor = new MouseFollower({ + visible: false +}); +const el = document.querySelector('.my-element'); + +el.addEventListener('mouseenter', () => { + cursor.show(); + cursor.setText('Surprise!'); +}); + +el.addEventListener('mouseleave', () => { + cursor.removeText(); + cursor.hide(); +}); +``` + +or via a data attribute: + +```html +
    Hover me to show cursor!
    +``` + +### Destroy cursor instance + +Destroy the cursor completely and remove all event listeners. + +```js +const cursor = new MouseFollower(); + +cursor.destroy(); +``` + +## Events + +Mouse Follower comes with useful events you can listen to. Events can be assigned this way: + +```js +const cursor = new MouseFollower(); + +cursor.on('show', () => { + console.log('cursor appears'); +}); +``` + +You can also remove event listeners this way: + +```js +cursor.off('show'); +cursor.off('show', myHandler); +``` + +| Name | Arguments | Description | +| :--- | :--- | :--- | +| `show` | `(cursor)` | Fired when the show state is entered. | +| `hide` | `(cursor)` | Fired when the hidden state is entered. | +| `addState` | `(cursor, state)` | Fired when the state is added. | +| `removeState` | `(cursor, state)` | Fired when the state is removed. | +| `render` | `(cursor)` | Fired on each render tick. | +| `destroy` | `(cursor)` | Fired when the instance is destroyed. | + +## Examples + +- [Cuberto](https://cuberto.com/): Digital design & development agency. +- [Cuberto Hello](https://hello.cuberto.com/): Our marketing page dedicated to our workflows. +- [Minibricks](https://minibricks.co/): Model making company. +- [Potion](https://www.sendpotion.com/): Video email for top sales professionals. +- [Wickret](https://wickret.cuberto.com/): 100% digital bank designed for you. +- [Catchers](https://catchers.agency/): Saudi Arabia content creator & influencer agency. + +See more examples in [our portfolio on Awwwards](https://www.awwwards.com/cuberto/). + +## License + +[The MIT License (MIT)](LICENSE) diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/src/index.js b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/src/index.js new file mode 100644 index 0000000..2ed1f6f --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/mouse-follower/src/index.js @@ -0,0 +1,613 @@ +/*! + * Cuberto Mouse Follower + * https://cuberto.com/ + * + * @version 1.2.1 + * @author Cuberto, Artem Dordzhiev (Draft) + */ + +export default class MouseFollower { + /** + * @typedef {Object} MouseFollowerOptions + * @property {string|HTMLElement|null} [el] Existing cursor element, created automatically if not specified. + * @property {string|HTMLElement|null} [container] Cursor container. Body by default. + * @property {string|HTMLElement|null} [eventsTarget] Target for cursor events. Root document element by default. + * @property {string} [className] Cursor root element class name. + * @property {string} [innerClassName] Inner element class name. + * @property {string} [textClassName] Text element class name. + * @property {string} [mediaClassName] Media element class name. + * @property {string} [mediaBoxClassName] Media inner element class name. + * @property {string} [iconSvgClassName] SVG sprite class name. + * @property {string} [iconSvgNamePrefix] SVG sprite class name prefix for icons. + * @property {string} [iconSvgSrc] SVG sprite source. If you are not using SVG sprites, leave this blank. + * @property {string} [iconImgClassName] SVG icon img class name. + * @property {string|null} [dataAttr] Data attribute name for changing cursor state in HTML. Uses event delegation. + * @property {string} [hiddenState] Hidden class name state. + * @property {string} [textState] Text class name state. + * @property {string} [iconState] Icon class name state. + * @property {string|null} [activeState] Active (mousedown) class name state. Set `false` to disable. + * @property {string} [mediaState] Media (image/video) class name state. + * @property {Object} [stateDetection] Predefined states for different page elements. Uses event delegation. + * @property {boolean} [visible] Whether the cursor is visible by default. + * @property {boolean} [visibleOnState] Automatically show/hide cursor when a state is added. + * @property {number} [speed] Cursor movement speed. + * @property {string} [ease] Timing function of cursor movement. See GSAP easing. + * @property {boolean} [overwrite] Overwrite or preserve the cursor position when `mousemove` fires. + * @property {number} [skewing] Default "skewing" factor. + * @property {number} [skewingText] Skew effect factor in the text state. Set `0` to disable skew in this mode. + * @property {number} [skewingIcon] Skew effect factor in the icon state. Set `0` to disable skew in this mode. + * @property {number} [skewingMedia] Skew effect factor in the media state. Set `0` to disable. + * @property {number} [skewingDelta] Skew effect base delta. + * @property {number} [skewingDeltaMax] Skew effect max delta. + * @property {number} [stickDelta] Stick effect delta. + * @property {number} [showTimeout] Delay before showing. May be useful for the spawn animation to work properly. + * @property {boolean} [hideOnLeave] Hide the cursor when the mouse leaves the event target. + * @property {number} [hideTimeout] Hiding delay. Should be equal to the CSS hide animation time. + * @property {number[]} [initialPos] Array (x, y) of the initial cursor position. + */ + + /** + * Register the GSAP animation library. + * + * @param {gsap} gsap GSAP library. + */ + static registerGSAP(gsap) { + MouseFollower.gsap = gsap; + } + + /** + * Create a cursor instance. + * + * @param {MouseFollowerOptions} [options] Cursor options. + */ + constructor(options = {}) { + /** @type {MouseFollowerOptions} **/ + this.options = Object.assign({}, { + el: null, + container: document.body, + eventsTarget: document.documentElement, + className: 'mf-cursor', + innerClassName: 'mf-cursor-inner', + textClassName: 'mf-cursor-text', + mediaClassName: 'mf-cursor-media', + mediaBoxClassName: 'mf-cursor-media-box', + iconSvgClassName: 'mf-svgsprite', + iconSvgNamePrefix: '-', + iconSvgSrc: '', + iconImgClassName: 'mf-cursor-icon', + dataAttr: 'cursor', + hiddenState: '-hidden', + textState: '-text', + iconState: '-icon', + activeState: '-active', + mediaState: '-media', + stateDetection: { + '-pointer': 'a,button', + }, + visible: true, + visibleOnState: false, + speed: 0.55, + ease: 'expo.out', + overwrite: true, + skewing: 0, + skewingText: 2, + skewingIcon: 2, + skewingMedia: 2, + skewingDelta: 0.001, + skewingDeltaMax: 0.15, + stickDelta: 0.15, + showTimeout: 0, + hideOnLeave: true, + hideTimeout: 300, + hideMediaTimeout: 300, + initialPos: [-window.innerWidth, -window.innerHeight], + }, options); + + if (this.options.visible && options.stateDetection == null) this.options.stateDetection['-hidden'] = 'iframe'; + + this.gsap = MouseFollower.gsap || window.gsap; + this.el = typeof (this.options.el) === 'string' ? + document.querySelector(this.options.el) : this.options.el; + this.container = typeof (this.options.container) === 'string' ? + document.querySelector(this.options.container) : this.options.container; + this.eventsTarget = typeof (this.options.eventsTarget) === 'string' ? + document.querySelector(this.options.eventsTarget) : this.options.eventsTarget; + this.skewing = this.options.skewing; + this.pos = {x: this.options.initialPos[0], y: this.options.initialPos[1]}; + this.vel = {x: 0, y: 0}; + this.event = {}; + this.events = []; + + this.init(); + } + + /** + * Initialize the cursor. + */ + init() { + this.create(); + this.createSetter(); + this.bind(); + this.render(true); + this.ticker = this.render.bind(this, false); + this.gsap.ticker.add(this.ticker); + } + + /** + * Create cursor DOM elements or get existing ones. + */ + create() { + this.el = this.el || this.createPart(this.options.className, this.container, false); + this.inner = this.createPart(this.options.innerClassName, this.el); + this.media = this.createPart(this.options.mediaClassName, this.inner); + this.mediaBox = this.createPart(this.options.mediaBoxClassName, this.media); + this.text = this.createPart(this.options.textClassName, this.inner); + + this.el.classList.add(this.options.hiddenState); + } + + /** + * Create a cursor DOM part or get an existing one. + * + * @param {string} className Element class name. + * @param {HTMLElement} container Parent element. + * @param {boolean} [reuse=true] Use existing element if found. + * @return {HTMLElement} Cursor DOM part. + */ + createPart(className, container, reuse = true) { + const el = reuse && container.getElementsByClassName(className)[0] || document.createElement('div'); + el.className = el.className || className; + if (!el.parentNode) container.appendChild(el); + return el; + } + + /** + * Create the GSAP setters. + */ + createSetter() { + this.setter = { + x: this.gsap.quickSetter(this.el, 'x', 'px'), + y: this.gsap.quickSetter(this.el, 'y', 'px'), + rotation: this.gsap.quickSetter(this.el, 'rotation', 'deg'), + scaleX: this.gsap.quickSetter(this.el, 'scaleX'), + scaleY: this.gsap.quickSetter(this.el, 'scaleY'), + wc: this.gsap.quickSetter(this.el, 'willChange'), + inner: { + rotation: this.gsap.quickSetter(this.inner, 'rotation', 'deg'), + }, + }; + } + + /** + * Create and attach event listeners. + */ + bind() { + this.event.mouseleave = () => this.hide(); + this.event.mouseenter = () => this.show(); + this.event.mousedown = () => this.addState(this.options.activeState); + this.event.mouseup = () => this.removeState(this.options.activeState); + this.event.mousemoveOnce = () => this.show(); + this.event.mousemove = (e) => { + this.gsap.to(this.pos, { + x: this.stick ? this.stick.x - ((this.stick.x - e.clientX) * this.options.stickDelta) : e.clientX, + y: this.stick ? this.stick.y - ((this.stick.y - e.clientY) * this.options.stickDelta) : e.clientY, + overwrite: this.options.overwrite, + ease: this.options.ease, + duration: this.visible ? this.options.speed : 0, + onUpdate: () => this.vel = {x: e.clientX - this.pos.x, y: e.clientY - this.pos.y}, + }); + }; + this.event.mouseover = (e) => { + for (let target = e.target; target && target !== this.eventsTarget; target = target.parentNode) { + if (e.relatedTarget && target.contains(e.relatedTarget)) break; + + for (let state in this.options.stateDetection) { + if (target.matches(this.options.stateDetection[state])) this.addState(state); + } + + if (this.options.dataAttr) { + const params = this.getFromDataset(target); + if (params.state) this.addState(params.state); + if (params.text) this.setText(params.text); + if (params.icon) this.setIcon(params.icon); + if (params.iconImg) this.setIconImg(params.iconImg); + if (params.img) this.setImg(params.img); + if (params.video) this.setVideo(params.video); + if (typeof (params.show) !== 'undefined') this.show(); + if (typeof (params.stick) !== 'undefined') this.setStick(params.stick || target); + } + } + }; + this.event.mouseout = (e) => { + for (let target = e.target; target && target !== this.eventsTarget; target = target.parentNode) { + if (e.relatedTarget && target.contains(e.relatedTarget)) break; + + for (let state in this.options.stateDetection) { + if (target.matches(this.options.stateDetection[state])) this.removeState(state); + } + + if (this.options.dataAttr) { + const params = this.getFromDataset(target); + if (params.state) this.removeState(params.state); + if (params.text) this.removeText(); + if (params.icon) this.removeIcon(); + if (params.iconImg) this.removeIcon(); + if (params.img) this.removeImg(); + if (params.video) this.removeVideo(); + if (typeof (params.show) !== 'undefined') this.hide(); + if (typeof (params.stick) !== 'undefined') this.removeStick(); + } + } + }; + + if (this.options.hideOnLeave) { + this.eventsTarget.addEventListener('mouseleave', this.event.mouseleave, {passive: true}); + } + if (this.options.visible) { + this.eventsTarget.addEventListener('mouseenter', this.event.mouseenter, {passive: true}); + } + if (this.options.activeState) { + this.eventsTarget.addEventListener('mousedown', this.event.mousedown, {passive: true}); + this.eventsTarget.addEventListener('mouseup', this.event.mouseup, {passive: true}); + } + this.eventsTarget.addEventListener('mousemove', this.event.mousemove, {passive: true}); + if (this.options.visible) { + this.eventsTarget.addEventListener('mousemove', this.event.mousemoveOnce, { + passive: true, + once: true, + }); + } + if (this.options.stateDetection || this.options.dataAttr) { + this.eventsTarget.addEventListener('mouseover', this.event.mouseover, {passive: true}); + this.eventsTarget.addEventListener('mouseout', this.event.mouseout, {passive: true}); + } + } + + /** + * Render the cursor at a new position. + * + * @param {boolean} [force=false] Force rendering. + */ + render(force) { + if (force !== true && (this.vel.y === 0 || this.vel.x === 0)) { + this.setter.wc('auto'); + return; + } + + this.trigger('render'); + this.setter.wc('transform'); + this.setter.x(this.pos.x); + this.setter.y(this.pos.y); + + if (this.skewing) { + const distance = Math.sqrt(Math.pow(this.vel.x, 2) + Math.pow(this.vel.y, 2)); + const scale = Math.min(distance * this.options.skewingDelta, + this.options.skewingDeltaMax) * this.skewing; + const angle = Math.atan2(this.vel.y, this.vel.x) * 180 / Math.PI; + + this.setter.rotation(angle); + this.setter.scaleX(1 + scale); + this.setter.scaleY(1 - scale); + this.setter.inner.rotation(-angle); + } + } + + /** + * Show the cursor. + */ + show() { + this.trigger('show'); + clearInterval(this.visibleInt); + this.visibleInt = setTimeout(() => { + this.el.classList.remove(this.options.hiddenState); + this.visible = true; + this.render(true); + }, this.options.showTimeout); + } + + /** + * Hide the cursor. + */ + hide() { + this.trigger('hide'); + clearInterval(this.visibleInt); + this.el.classList.add(this.options.hiddenState); + this.visibleInt = setTimeout(() => this.visible = false, this.options.hideTimeout); + } + + /** + * Toggle the cursor. + * + * @param {boolean} [force] Force the visibility state. + */ + toggle(force) { + if (force === true || force !== false && !this.visible) { + this.show(); + } else { + this.hide(); + } + } + + /** + * Add one or more states to the cursor. + * + * @param {string} state State name. + */ + addState(state) { + this.trigger('addState', state); + if (state === this.options.hiddenState) return this.hide(); + this.el.classList.add(...state.split(' ')); + if (this.options.visibleOnState) this.show(); + } + + /** + * Remove one or more states from the cursor. + * + * @param {string} state State name. + */ + removeState(state) { + this.trigger('removeState', state); + if (state === this.options.hiddenState) return this.show(); + this.el.classList.remove(...state.split(' ')); + if (this.options.visibleOnState && this.el.className === this.options.className) this.hide(); + } + + /** + * Toggle the cursor state. + * + * @param {string} state State name. + * @param {boolean} [force] Force the state. + */ + toggleState(state, force) { + if (force === true || force !== false && !this.el.classList.contains(state)) { + this.addState(state); + } else { + this.removeState(state); + } + } + + /** + * Set the skewing effect factor. + * + * @param {number} value Skewing factor. + */ + setSkewing(value) { + this.gsap.to(this, {skewing: value}); + } + + /** + * Revert the skewing factor to the default. + */ + removeSkewing() { + this.gsap.to(this, {skewing: this.options.skewing}); + } + + /** + * Stick the cursor to an element. + * + * @param {string|HTMLElement} element Element or selector. + */ + setStick(element) { + const el = typeof (element) === 'string' ? document.querySelector(element) : element; + const rect = el.getBoundingClientRect(); + this.stick = { + y: rect.top + (rect.height / 2), + x: rect.left + (rect.width / 2), + }; + } + + /** + * Unstick the cursor from the element. + */ + removeStick() { + this.stick = false; + } + + /** + * Transform the cursor to text mode with the given string. + * + * @param {string} text Text. + */ + setText(text) { + this.text.innerHTML = text; + this.addState(this.options.textState); + this.setSkewing(this.options.skewingText); + } + + /** + * Revert the cursor from text mode. + */ + removeText() { + this.removeState(this.options.textState); + this.removeSkewing(); + } + + /** + * Transform the cursor to SVG icon mode. + * + * @param {string|SVGElement} icon Icon identifier or SVG element. + * @param {string} [style=""] Additional SVG styles. + */ + setIcon(icon, style = '') { + if (icon instanceof SVGElement) { + if (style) icon.setAttribute('style', style); + this.text.innerHTML = ''; + this.text.appendChild(icon); + } else { + this.text.innerHTML = `` + + ``; + } + this.addState(this.options.iconState); + this.setSkewing(this.options.skewingIcon); + } + + /** + * Transform the cursor to image icon mode. + * + * @param {string} url Icon URL. + * @param {string} [style=""] Additional img styles. + */ + setIconImg(url, style = '') { + this.text.innerHTML = ``; + this.addState(this.options.iconState); + this.setSkewing(this.options.skewingIcon); + } + + /** + * Revert the cursor from icon mode. + */ + removeIcon() { + this.removeState(this.options.iconState); + this.removeSkewing(); + } + + /** + * Transform the cursor to media mode with the given element. + * + * @param {HTMLElement} element Element. + */ + setMedia(element) { + clearTimeout(this.mediaInt); + if (element) { + this.mediaBox.innerHTML = ''; + this.mediaBox.appendChild(element); + } + this.mediaInt = setTimeout(() => this.addState(this.options.mediaState), 20); + this.setSkewing(this.options.skewingMedia); + } + + /** + * Revert the cursor from media mode. + */ + removeMedia() { + clearTimeout(this.mediaInt); + this.removeState(this.options.mediaState); + this.mediaInt = setTimeout(() => this.mediaBox.innerHTML = '', this.options.hideMediaTimeout); + this.removeSkewing(); + } + + /** + * Transform the cursor to image mode. + * + * @param {string} url Image URL. + */ + setImg(url) { + if (!this.mediaImg) this.mediaImg = new Image(); + if (this.mediaImg.src !== url) this.mediaImg.src = url; + this.setMedia(this.mediaImg); + } + + /** + * Revert the cursor from image mode. + */ + removeImg() { + this.removeMedia(); + } + + /** + * Transform the cursor to video mode. + * + * @param {string} url Video URL. + */ + setVideo(url) { + if (!this.mediaVideo) { + this.mediaVideo = document.createElement('video'); + this.mediaVideo.muted = true; + this.mediaVideo.loop = true; + this.mediaVideo.autoplay = true; + } + if (this.mediaVideo.src !== url) { + this.mediaVideo.src = url; + this.mediaVideo.load(); + } + this.mediaVideo.play(); + this.setMedia(this.mediaVideo); + } + + /** + * Revert the cursor from video mode. + */ + removeVideo() { + if (this.mediaVideo && this.mediaVideo.readyState > 2) this.mediaVideo.pause(); + this.removeMedia(); + } + + /** + * Attach an event handler. + * + * @param {string} event Event name. + * @param {function} callback Callback function. + */ + on(event, callback) { + if (!(this.events[event] instanceof Array)) this.off(event); + this.events[event].push(callback); + } + + /** + * Remove an event handler. + * + * @param {string} event Event name. + * @param {function} [callback] Callback function. + */ + off(event, callback) { + if (callback) { + this.events[event] = this.events[event].filter((f) => f !== callback); + } else { + this.events[event] = []; + } + } + + /** + * Execute all handlers for the given event type. + * + * @param {string} event Event name. + * @param {...*} params Extra parameters. + */ + trigger(event, ...params) { + if (!this.events[event]) return; + this.events[event].forEach((f) => f.call(this, this, ...params)); + } + + /** + * Get cursor options from the data attributes of a given element. + * + * @param {HTMLElement} element Element. + * @return {Object} Options. + */ + getFromDataset(element) { + const dataset = element.dataset; + return { + state: dataset[this.options.dataAttr], + show: dataset[this.options.dataAttr + 'Show'], + text: dataset[this.options.dataAttr + 'Text'], + icon: dataset[this.options.dataAttr + 'Icon'], + iconImg: dataset[this.options.dataAttr + 'IconImg'], + img: dataset[this.options.dataAttr + 'Img'], + video: dataset[this.options.dataAttr + 'Video'], + stick: dataset[this.options.dataAttr + 'Stick'], + }; + } + + /** + * Destroy the cursor instance. + */ + destroy() { + this.trigger('destroy'); + this.gsap.ticker.remove(this.ticker); + this.eventsTarget.removeEventListener('mouseleave', this.event.mouseleave); + this.eventsTarget.removeEventListener('mouseenter', this.event.mouseenter); + this.eventsTarget.removeEventListener('mousedown', this.event.mousedown); + this.eventsTarget.removeEventListener('mouseup', this.event.mouseup); + this.eventsTarget.removeEventListener('mousemove', this.event.mousemove); + this.eventsTarget.removeEventListener('mousemove', this.event.mousemoveOnce); + this.eventsTarget.removeEventListener('mouseover', this.event.mouseover); + this.eventsTarget.removeEventListener('mouseout', this.event.mouseout); + if (this.el) { + this.container.removeChild(this.el); + this.el = null; + this.mediaImg = null; + this.mediaVideo = null; + } + } +} diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/LICENSE b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/LICENSE new file mode 100644 index 0000000..f12a9cb --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Parth Parmar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/README.md b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/README.md new file mode 100644 index 0000000..1ac942d --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/README.md @@ -0,0 +1,221 @@ +# Smooth Cursor + +A highly customizable, physics-based smooth cursor animation component for React applications. Features spring animations, velocity tracking, and rotation effects for creating engaging cursor experiences. + +https://github.com/user-attachments/assets/2b56dea7-9e98-4563-9b61-ab668b08d2e5 + +🎯 **[Live Preview](https://figbruary.apexia.club)** - See the smooth cursor in action! + +![GitHub package.json version](https://img.shields.io/github/package-json/v/code-parth/smooth-cursor) +![NPM Version](https://img.shields.io/npm/v/smooth-cursor) +![License](https://img.shields.io/npm/l/smooth-cursor) + +## Features + +- 🎯 Smooth physics-based cursor animations +- 🔄 Rotation effects based on movement direction +- ⚡ Performance optimized with RAF +- 🎨 Fully customizable cursor design +- 📦 Lightweight and easy to implement +- 💪 Written in TypeScript +- 🔌 Powered by Framer Motion + +## Installation + +```bash +npm install smooth-cursor +# or +yarn add smooth-cursor +# or +pnpm add smooth-cursor +``` + +## Usage + +### Next.js Integration + +#### App Router (Next.js 13+) + +```tsx +// app/layout.tsx +'use client'; + +import { SmoothCursor } from 'smooth-cursor'; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + + {children} + + + ); +} +``` + +#### Pages Router + +```tsx +// pages/_app.tsx +import type { AppProps } from 'next/app'; +import { SmoothCursor } from 'smooth-cursor'; + +export default function App({ Component, pageProps }: AppProps) { + return ( + <> + + + + ); +} +``` + +### Basic Usage + +```jsx +import { SmoothCursor } from 'smooth-cursor'; + +function App() { + return ( +
    + + {/* Your app content */} +
    + ); +} +``` + +### Custom Cursor + +```jsx +import { SmoothCursor } from 'smooth-cursor'; + +const CustomCursor = () => ( +
    +); + +function App() { + return ( +
    + } /> + {/* Your app content */} +
    + ); +} +``` + +## Props + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| cursor | JSX.Element | `` | Custom cursor component to replace the default cursor | +| springConfig | SpringConfig | See below | Configuration object for the spring animation behavior | + +### SpringConfig Type + +```typescript +interface SpringConfig { + damping: number; // Controls how quickly the animation settles + stiffness: number; // Controls the spring stiffness + mass: number; // Controls the virtual mass of the animated object + restDelta: number; // Controls the threshold at which animation is considered complete +} +``` + +### Default Spring Configuration + +```typescript +const defaultSpringConfig = { + damping: 45, // Default damping value + stiffness: 400, // Default stiffness value + mass: 1, // Default mass value + restDelta: 0.001 // Default rest delta value +} +``` + +### Usage with Custom Spring Configuration + +```tsx +function App() { + const customSpringConfig = { + damping: 60, // Higher damping for less oscillation + stiffness: 500, // Higher stiffness for faster movement + mass: 1.2, // Slightly more mass for momentum + restDelta: 0.0005 // Smaller rest delta for more precise settling + }; + + return ( +
    + + {/* Your app content */} +
    + ); +} +``` + +## Animation Configuration + +The cursor uses Framer Motion's spring animation with the following default configuration: + +```typescript +const springConfig = { + damping: 45, + stiffness: 400, + mass: 1, + restDelta: 0.001 +}; +``` + +## Browser Support + +The component is compatible with all modern browsers that support: +- `requestAnimationFrame` +- CSS transforms +- Pointer events + +## Performance Considerations + +The component is optimized for performance by: +- Using `requestAnimationFrame` for smooth animations +- Implementing throttling for mouse movement events +- Using hardware-accelerated transforms +- Optimizing re-renders with React's lifecycle methods + +## Development + +To run the development environment: + +```bash +# Install dependencies +npm install + +# Build the package +npm run rollup +``` + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change. + +1. Fork the repository +2. Create your feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add some amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## Credits + +Created by [Code-Parth](https://github.com/Code-Parth) + +## Support + +If you have any questions or need help integrating the component, please [open an issue](https://github.com/Code-Parth/smooth-cursor/issues). diff --git a/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/src/components/smoothCursor/smoothCursor.tsx b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/src/components/smoothCursor/smoothCursor.tsx new file mode 100644 index 0000000..1ab5d6d --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/assets/sources/smooth-cursor/src/components/smoothCursor/smoothCursor.tsx @@ -0,0 +1,214 @@ +import { motion, useSpring } from "framer-motion"; +import React, { FC, useState, useEffect, useRef, JSX } from "react"; + +interface Position { + x: number; + y: number; +} + +interface SmoothCursorProps { + cursor?: JSX.Element; + springConfig?: { + damping: number; + stiffness: number; + mass: number; + restDelta: number; + } +} + +const DefaultCursorSVG: FC = () => { + return ( + + + + + + + + + + + + + + + + + + + ); +} + +const SmoothCursor: FC = ( + { + cursor = , + springConfig = { + damping: 45, + stiffness: 400, + mass: 1, + restDelta: 0.001 + } + } +) => { + // export default function SmoothCursor({ cursor = Cursor() }: { cursor?: JSX.Element }) { + const [isMoving, setIsMoving] = useState(false); + const lastMousePos = useRef({ x: 0, y: 0 }); + const velocity = useRef({ x: 0, y: 0 }); + const lastUpdateTime = useRef(Date.now()); + const previousAngle = useRef(0); + const accumulatedRotation = useRef(0); + + const cursorX = useSpring(0, springConfig); + const cursorY = useSpring(0, springConfig); + const rotation = useSpring(0, { + ...springConfig, + damping: 60, + stiffness: 300 + }); + const scale = useSpring(1, { + ...springConfig, + stiffness: 500, + damping: 35 + }); + + useEffect(() => { + const updateVelocity = (currentPos: Position) => { + const currentTime = Date.now(); + const deltaTime = currentTime - lastUpdateTime.current; + + if (deltaTime > 0) { + velocity.current = { + x: (currentPos.x - lastMousePos.current.x) / deltaTime, + y: (currentPos.y - lastMousePos.current.y) / deltaTime + }; + } + + lastUpdateTime.current = currentTime; + lastMousePos.current = currentPos; + }; + + const smoothMouseMove = (e: MouseEvent) => { + const currentPos = { x: e.clientX, y: e.clientY }; + updateVelocity(currentPos); + + const speed = Math.sqrt( + Math.pow(velocity.current.x, 2) + + Math.pow(velocity.current.y, 2) + ); + + cursorX.set(currentPos.x); + cursorY.set(currentPos.y); + + if (speed > 0.1) { + const currentAngle = Math.atan2(velocity.current.y, velocity.current.x) * (180 / Math.PI) + 90; + + let angleDiff = currentAngle - previousAngle.current; + if (angleDiff > 180) angleDiff -= 360; + if (angleDiff < -180) angleDiff += 360; + accumulatedRotation.current += angleDiff; + rotation.set(accumulatedRotation.current); + previousAngle.current = currentAngle; + + scale.set(0.95); + setIsMoving(true); + + const timeout = setTimeout(() => { + scale.set(1); + setIsMoving(false); + }, 150); + + return () => clearTimeout(timeout); + } + }; + + let rafId: number; + const throttledMouseMove = (e: MouseEvent) => { + if (rafId) return; + + rafId = requestAnimationFrame(() => { + smoothMouseMove(e); + rafId = 0; + }); + }; + + document.body.style.cursor = "none"; + window.addEventListener("mousemove", throttledMouseMove); + + return () => { + window.removeEventListener("mousemove", throttledMouseMove); + document.body.style.cursor = "auto"; + if (rafId) cancelAnimationFrame(rafId); + }; + }, [cursorX, cursorY, rotation, scale]); + + return ( + + {cursor} + + ); +}; + +export default SmoothCursor; \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/cursor/auswahl.json b/produktionsvorgaben/gestaltung/cursor/auswahl.json new file mode 100644 index 0000000..235a1a1 --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/auswahl.json @@ -0,0 +1,71 @@ +{ + "behavior": "correction", + "name": "03 · Kleine Korrektur", + "graphics": "Apple Original-PDF", + "assets": [ + { + "height": 40, + "hotX": 5, + "hotY": 5, + "id": "arrow", + "path": "assets/apple/pdf/arrow.png", + "width": 28 + }, + { + "height": 22, + "hotX": 12, + "hotY": 11, + "id": "text", + "path": "assets/apple/pdf/text.png", + "width": 23 + }, + { + "height": 32, + "hotX": 13, + "hotY": 8, + "id": "pointer", + "path": "assets/apple/pdf/pointer.png", + "width": 32 + }, + { + "height": 32, + "hotX": 16, + "hotY": 17, + "id": "grab", + "path": "assets/apple/pdf/grab.png", + "width": 32 + }, + { + "height": 32, + "hotX": 16, + "hotY": 17, + "id": "grabbing", + "path": "assets/apple/pdf/grabbing.png", + "width": 32 + }, + { + "height": 40, + "hotX": 5, + "hotY": 5, + "id": "copy", + "path": "assets/apple/pdf/copy.png", + "width": 28 + }, + { + "height": 21, + "hotX": 11, + "hotY": 3, + "id": "link", + "path": "assets/apple/pdf/link.png", + "width": 16 + }, + { + "height": 40, + "hotX": 5, + "hotY": 5, + "id": "blocked", + "path": "assets/apple/pdf/blocked.png", + "width": 28 + } + ] +} diff --git a/produktionsvorgaben/gestaltung/cursor/motion.js b/produktionsvorgaben/gestaltung/cursor/motion.js new file mode 100644 index 0000000..a45248a --- /dev/null +++ b/produktionsvorgaben/gestaltung/cursor/motion.js @@ -0,0 +1,82 @@ +// Deterministic, visual-only adaptations. Pinned references and MIT notices: /cursors/sources.json. +export const STANDARD_CURSOR='correction'; +export const behaviors = [ + {id:'smooth',name:'01 · Weiches Ankommen',source:'mouse-follower',move:.26,pause:.055,description:'Direkter Weg. Zügiger Start, kurzes weiches Abbremsen.',rules:'Expo-Out wie bei Cuberto. Kein Überschwingen, 55 ms Ruhe vor der Aktion.',fit:'Gut für klare Klick-Demos. Wirkt bewusst geführt, weniger wie eine Handaufnahme.'}, + {id:'natural',name:'02 · Natürlicher Bogen',source:'ghost-cursor',move:.32,pause:.065,description:'Sanft beschleunigen, einen kleinen Bogen nehmen, genau landen.',rules:'Zwei Kontrollpunkte auf derselben Wegseite; maximale Auslenkung 16 px. Längere Wege bekommen mehr Fahrzeit.',fit:'Für alltägliche Klick- und Drag-Demos. Kein Beleg für echte menschliche Eingaben; eine lesbare Motion-Adaption.'}, + {id:'correction',name:'03 · Kleine Korrektur',source:'humancursor',move:.36,pause:.075,description:'Leicht unregelmäßiger Weg mit einer kleinen Nachkorrektur.',rules:'Feste Bézier-Kurve, maximal 0,8 px Wegvariation und 4 px Korrektur bei längeren Wegen. Beim Ziehen keine Korrektur.',fit:'Etwas handgemachter. Bei sehr präzisen technischen Demos kann die Korrektur unnötig wirken.'}, + {id:'spring',name:'04 · Gedämpfte Feder',source:'smooth-cursor',move:.29,pause:.06,description:'Der Cursor beschleunigt kurz und bremst gedämpft ab.',rules:'Federantwort mit k=400, Dämpfung 45, Masse 1 aus Smooth Cursor; auf feste Zeit normiert. Keine Drehung oder Größenänderung des Systempfeils.',fit:'Flüssig und etwas körperlicher. Die feste Vorschau ist eine Adaption des interaktiven Followers.'}, + {id:'magnetic',name:'05 · Magnetisches Ziel',source:'mouse-follower',move:.28,pause:.06,description:'Der Weg führt erst in Zielnähe; die letzten Pixel rasten ein.',rules:'Annäherung bis 9 px vor dem Ziel, dann sanft zentrieren. Cubertos Sticky-Idee als feste Sequenz; kein Einrasten während Drag-and-drop.',fit:'Betont das aktive Ziel. Bewusst stilisiert statt möglichst menschlich.'}, +]; +export const cursorVersions=[{id:'pdf',name:'Apple · Original-PDF',detail:'Scharfe Vektorquelle · macOS 26'},{id:'system',name:'Apple · Systembild',detail:'AppKit-Darstellung · macOS 26'},{id:'draft',name:'Bisherige Entwürfe',detail:'Eigene SVG-Zeichnungen'}]; +export const shapes=[{id:'macos',name:'macOS-Stil · dunkel'},{id:'windows',name:'Windows-Stil · hell'}]; +const clamp=t=>Math.max(0,Math.min(1,t)); +const smooth=t=>t*t*t*(t*(t*6-15)+10); +const lerp=(a,b,t)=>({x:a.x+(b.x-a.x)*t,y:a.y+(b.y-a.y)*t}); +const cubic=(a,b,c,d,t)=>{const u=1-t;return {x:u**3*a.x+3*u*u*t*b.x+3*u*t*t*c.x+t**3*d.x,y:u**3*a.y+3*u*u*t*b.y+3*u*t*t*c.y+t**3*d.y}}; +const spring=t=>{const d=Math.sqrt(45*45-4*400),r1=(-45+d)/2,r2=(-45-d)/2;return 1+(r2*Math.exp(r1*t)-r1*Math.exp(r2*t))/(r1-r2)}; +export function pointAt(id,a,b,progress,drag=false){ + const p=clamp(progress);if(p===0)return {...a,rotation:0};if(p===1)return {...b,rotation:0}; + const dx=b.x-a.x,dy=b.y-a.y,dist=Math.hypot(dx,dy)||1,nx=-dy/dist,ny=dx/dist; + let t=smooth(p),point; + if(id==='smooth')point=lerp(a,b,(1-2**(-8*p))/(1-2**-8)); + else if(id==='spring')point=lerp(a,b,spring(p*.65)/spring(.65)); + else if(id==='magnetic'&&!drag){ + const near={x:b.x-dx/dist*9,y:b.y-dy/dist*9}; + point=p<.72?lerp(a,near,smooth(p/.72)):lerp(near,b,smooth((p-.72)/.28)); + }else{ + let end=b,spread=Math.min(16,dist*.07)*(drag?.35:1); + if(id==='correction'&&!drag&&dist>150){ + end={x:b.x+dx/dist*4,y:b.y+dy/dist*4}; + if(p>.80)return {...lerp(end,b,smooth((p-.80)/.20)),rotation:0}; + t=smooth(p/.80); + } + const c1={x:a.x+dx*.28+nx*spread,y:a.y+dy*.28+ny*spread}; + const c2={x:a.x+dx*.72+nx*spread*.55,y:a.y+dy*.72+ny*spread*.55}; + point=cubic(a,c1,c2,end,t); + if(id==='correction'&&!drag){const variation=.8*Math.sin(t*Math.PI*4)*Math.sin(t*Math.PI)**2;point.x+=nx*variation;point.y+=ny*variation} + } + return {...point,rotation:0}; +} +export const START={x:78,y:365},SEARCH={x:124,y:108},FILE={x:244,y:178},FOLDER={x:478,y:200},MESSAGE={x:96,y:321},SEND={x:528,y:325},PARK={x:594,y:366}; +export const SEARCH_TEXT='Montage',MESSAGE_TEXT='Plan ist im Ordner.'; +const inBox=(p,x,y,w,h)=>p.x>=x&&p.x<=x+w&&p.y>=y&&p.y<=y+h; +export function cursorModeAt(p,dragging,dropped){ + if(dragging)return 'grabbing'; + if(inBox(p,36,90,284,36)||inBox(p,36,294,392,54))return 'text'; + if(!dropped&&inBox(p,36,148,250,60))return 'grab'; + if(inBox(p,460,304,136,42))return 'pointer'; + return 'arrow'; +} +export function schedule(behavior){ + const steps=[];let time=.25,from=START; + for(const [to,kind,hold] of [[SEARCH,'search',.95],[FILE,'select',.28],[FOLDER,'drag',.3],[MESSAGE,'message',1.25],[SEND,'send',.55],[PARK,'leave',.8]]){ + const distance=Math.hypot(to.x-from.x,to.y-from.y); + const duration=behavior.move*(.65+distance/500)*(kind==='drag'?1.2:1); + const end=time+duration,action=end+(kind==='send'?.18:behavior.pause); + steps.push({from,to,kind,start:time,end,action,duration,hold}); + time=action+hold;from=to; + } + return {steps,duration:time}; +} +export function stateAt(behavior,time){ + const {steps,duration}=schedule(behavior),t=Math.max(0,Math.min(duration,time)); + let cursor={...START,rotation:0},active='Bereit'; + const phases={search:'Datei suchen',select:'Datei auswählen',drag:'Datei ziehen',message:'Nachricht schreiben',send:'Nachricht senden',leave:'Abgeschlossen'}; + for(const step of steps){ + if(t>=step.start){cursor=pointAt(behavior.id,step.from,step.to,(t-step.start)/step.duration,step.kind==='drag');active=phases[step.kind]} + } + const [search,select,drag,message,send]=steps; + const dragging=t>=drag.start&&t=drag.action; + const sent=t>=send.action+.32,sending=t>=send.action&&!sent; + const searchProgress=clamp((t-search.action)/.8),messageProgress=clamp((t-message.action)/1.08); + const searchActive=t>=search.action&&t=message.action&&t=0&&dt<.24){ring=dt/.24;press=Math.sin(Math.PI*clamp(dt/.12));click=step.to}} + return {time:t,cursor,mode:cursorModeAt(cursor,dragging,dropped),phase:sent?'Gesendet':sending?'Wird gesendet …':active, + selected:t>=select.action,dragging,dropped,sent,sending,press,ring,click,drop:clamp((t-drag.action)/.2),done:t>=duration, + searchText:SEARCH_TEXT.slice(0,Math.floor(searchProgress*SEARCH_TEXT.length+1e-9)),messageText:MESSAGE_TEXT.slice(0,Math.floor(messageProgress*MESSAGE_TEXT.length+1e-9)), + filtered:searchProgress>.3,searchActive,messageActive,caret:Math.floor(t*2.4)%2===0,buttonHover:inBox(cursor,460,304,136,42), + }; +} +export function pathData(behavior){return schedule(behavior).steps.map(step=>Array.from({length:61},(_,i)=>{const p=pointAt(behavior.id,step.from,step.to,i/60,step.kind==='drag');return `${i?'L':'M'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`}).join(' ')).join(' ')} +export function normalizeSettings(input){return {cursorVersion:cursorVersions.some(v=>v.id===input?.cursorVersion)?input.cursorVersion:'pdf',shape:input?.cursorVersion==='draft'&&shapes.some(s=>s.id===input?.shape)?input.shape:'macos',size:[20,24,28].includes(input?.size)?input.size:24,speed:Number.isFinite(input?.speed)&&input.speed>=.05&&input.speed<=2?Math.round(input.speed*100)/100:1,paths:input?.paths===true,favorite:behaviors.some(b=>b.id===input?.favorite)?input.favorite:STANDARD_CURSOR}} diff --git a/produktionsvorgaben/gestaltung/doodle/LICENSE.txt b/produktionsvorgaben/gestaltung/doodle/LICENSE.txt new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/LICENSE.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/produktionsvorgaben/gestaltung/doodle/README.md b/produktionsvorgaben/gestaltung/doodle/README.md new file mode 100644 index 0000000..4209e7d --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/README.md @@ -0,0 +1,21 @@ +# Doodle · Khushmeen · lokale Auswahl + +Freigegebener Iconstandard für die Übergabe: **Doodle 03 von Khushmeen**. Enthalten sind 12 Motive, nicht der vollständige Upstream-Bestand. Lokale Dateinamen stehen in [auswahl.json](auswahl.json). + +Quelle: https://khushmeen.com/icons +Stand / Revision: 43a217f4dc56db621764f2f17a5755f4706b47ec +Geprüft: 2026-10-01 + +## Lizenz + +CC0-1.0 · Kommerzielle Nutzung und Bearbeitung erlaubt. Keine Namensnennung erforderlich. + +Primärbeleg: https://khushmeen.com/icons + +Keine Pflicht zur Namensnennung (CC0). + +## Verwendung + +SVG · frei skalierbar; einzelne Formen lassen sich separat animieren. SVG-Bilddaten aus der Community-React-Fassung extrahiert; Gestaltung von Khushmeen unter CC0. + +Bei zugeordneten Standardmotiven Doodle verwenden. Nicht vorhandene Motive sowie animierte Spezialformen behalten ihre bestehende Originalgrafik bzw. Geometrie. Vorhandene Logoformen werden nicht durch Icons ersetzt. diff --git a/produktionsvorgaben/gestaltung/doodle/auswahl.json b/produktionsvorgaben/gestaltung/doodle/auswahl.json new file mode 100644 index 0000000..c95d7bc --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/auswahl.json @@ -0,0 +1,65 @@ +{ + "pack": "doodle-khushmeen", + "icons": [ + { + "role": "folder", + "label": "Ordner", + "path": "folder.svg" + }, + { + "role": "file", + "label": "Dokument", + "path": "file.svg" + }, + { + "role": "chat", + "label": "Nachricht", + "path": "chat.svg" + }, + { + "role": "calendar", + "label": "Termin", + "path": "calendar.svg" + }, + { + "role": "check", + "label": "Bestätigung", + "path": "check.svg" + }, + { + "role": "idea", + "label": "Idee", + "path": "idea.svg" + }, + { + "role": "camera", + "label": "Kamera", + "path": "camera.svg" + }, + { + "role": "search", + "label": "Suche", + "path": "search.svg" + }, + { + "role": "heart", + "label": "Herz", + "path": "heart.svg" + }, + { + "role": "settings", + "label": "Einstellungen", + "path": "settings.svg" + }, + { + "role": "person", + "label": "Person", + "path": "person.svg" + }, + { + "role": "mail", + "label": "E-Mail", + "path": "mail.svg" + } + ] +} diff --git a/produktionsvorgaben/gestaltung/doodle/calendar.svg b/produktionsvorgaben/gestaltung/doodle/calendar.svg new file mode 100644 index 0000000..eedb880 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/calendar.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/camera.svg b/produktionsvorgaben/gestaltung/doodle/camera.svg new file mode 100644 index 0000000..d351c98 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/camera.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/chat.svg b/produktionsvorgaben/gestaltung/doodle/chat.svg new file mode 100644 index 0000000..175294f --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/chat.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/check.svg b/produktionsvorgaben/gestaltung/doodle/check.svg new file mode 100644 index 0000000..fec84d0 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/check.svg @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/file.svg b/produktionsvorgaben/gestaltung/doodle/file.svg new file mode 100644 index 0000000..47ed82d --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/file.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/folder.svg b/produktionsvorgaben/gestaltung/doodle/folder.svg new file mode 100644 index 0000000..f9b7871 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/folder.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/heart.svg b/produktionsvorgaben/gestaltung/doodle/heart.svg new file mode 100644 index 0000000..ce6276d --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/heart.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/idea.svg b/produktionsvorgaben/gestaltung/doodle/idea.svg new file mode 100644 index 0000000..bb06d31 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/idea.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/license-source.txt b/produktionsvorgaben/gestaltung/doodle/license-source.txt new file mode 100644 index 0000000..7b29bc1 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/license-source.txt @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + Doodle icons by Khushmeen + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    +

    Doodle Icons

    +

    400+ handcrafted icons free for your next project

    +
    Free icons for commercial and personal use under CC0 license - no attribution required.
    + + + Get figma file + + + Download all icons + + + Get animated icons + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +

    Beautiful hand-drawn icons

    +
    Hand-drawn icons using an icon grid
    +
    400+ icons with 15 categories
    +
    Free for personal & commercial use
    +
    No attribution required
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    Available in multiple formats

    +
    Icons available in PNG, SVG & figma format
    +
    +
    + +
    +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +

    Download all the icons

    + + Download now + +
    +
    +
    +
    + +
    + + + + +
    + + diff --git a/produktionsvorgaben/gestaltung/doodle/mail.svg b/produktionsvorgaben/gestaltung/doodle/mail.svg new file mode 100644 index 0000000..281be25 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/mail.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/person.svg b/produktionsvorgaben/gestaltung/doodle/person.svg new file mode 100644 index 0000000..b619587 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/person.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/search.svg b/produktionsvorgaben/gestaltung/doodle/search.svg new file mode 100644 index 0000000..c607db7 --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/search.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/settings.svg b/produktionsvorgaben/gestaltung/doodle/settings.svg new file mode 100644 index 0000000..f085a4f --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/settings.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/produktionsvorgaben/gestaltung/doodle/sources.json b/produktionsvorgaben/gestaltung/doodle/sources.json new file mode 100644 index 0000000..ce8921d --- /dev/null +++ b/produktionsvorgaben/gestaltung/doodle/sources.json @@ -0,0 +1,162 @@ +{ + "id": "doodle-khushmeen", + "name": "Doodle · Khushmeen", + "style": "Handgezeichnet · rau & organisch", + "description": "Kräftige, unperfekte Konturen. Wirkt wie eine handgezeichnete Erklärung auf Papier.", + "license": "CC0-1.0", + "source": "https://khushmeen.com/icons", + "revision": "43a217f4dc56db621764f2f17a5755f4706b47ec", + "checkedAt": "2026-10-01", + "icons": [ + { + "role": "folder", + "label": "Ordner", + "original": "Folder", + "src": "/icon-packs/doodle-khushmeen/folder.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/FolderIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 160 141", + "sha256": "6bee9f34ed2cccfcbe86c8de393c9cd4d4f316dd2ab7ea6df1ff768843fed9e0", + "sourceSha256": "a71d1e860a520c7b413a2f63c3b80438a9de93d1a3171b181edb27aeb540c5df", + "bytes": 2846 + }, + { + "role": "file", + "label": "Dokument", + "original": "FileText", + "src": "/icon-packs/doodle-khushmeen/file.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/FileTextIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 142 175", + "sha256": "cfd7815a9dc498c0f5587e7649605de0583caa04be5682e6e85b4316abdc7503", + "sourceSha256": "f45639d5f9a64776d885e87f4b4df4dfde50aee1973f674f1d3aaf902b69c55d", + "bytes": 5524 + }, + { + "role": "chat", + "label": "Nachricht", + "original": "Message", + "src": "/icon-packs/doodle-khushmeen/chat.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/MessageIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 158 141", + "sha256": "18e4220cfec1068384a0fd198e2a1ab60940be84df0155c55a084f2f8400001f", + "sourceSha256": "63fea91962528677bbd171106c310cf5bf89e72e3d7f113e5251dec8c8c32854", + "bytes": 3817 + }, + { + "role": "calendar", + "label": "Termin", + "original": "Calendar", + "src": "/icon-packs/doodle-khushmeen/calendar.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/CalendarIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 157 148", + "sha256": "003babaf8f8ea2b3d69ca3caf60152c7f38fea845167ecd5ea32b665b90ec6ea", + "sourceSha256": "df4a5398fe800aa4550773b627c1c6c29e4c0c8e646d783c0ac1dd86ffb8a96a", + "bytes": 6432 + }, + { + "role": "check", + "label": "Bestätigung", + "original": "Tick", + "src": "/icon-packs/doodle-khushmeen/check.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/TickIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 130 90", + "sha256": "34058dca679b4482b4af38a47b59de10afe6bcd9d2e025b5787f172544beb096", + "sourceSha256": "1922d158001cd6b8690a7ff026678f263c23871a1d30a8ee42070e6eca03183f", + "bytes": 937 + }, + { + "role": "idea", + "label": "Idee", + "original": "Bulb", + "src": "/icon-packs/doodle-khushmeen/idea.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/BulbIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 116 160", + "sha256": "cc5dc91aca3bde86381f4eedc01907dca0d848b8a1313ebbc323b5734e2c5d88", + "sourceSha256": "e3fd3a2adf551d0c5b4f3e42c9f7349ce519dca6a16f339b5359530f3fad2014", + "bytes": 4746 + }, + { + "role": "camera", + "label": "Kamera", + "original": "Camera", + "src": "/icon-packs/doodle-khushmeen/camera.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/CameraIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 106 159", + "sha256": "a9e4611b24fa80aafde011876cbada2b977b006cf82eaf81fcd8a55d68900bfc", + "sourceSha256": "9c85941652f1c843d22a08a65e5c24390d2f69f187aa563ee97f0385c497f779", + "bytes": 5499 + }, + { + "role": "search", + "label": "Suche", + "original": "Search", + "src": "/icon-packs/doodle-khushmeen/search.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/SearchIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 160 154", + "sha256": "5a9d58c4687d35ce399811e728e2d7640459dc43fed2b89bf1066e08cc0bab46", + "sourceSha256": "17883612b48135cef12a738deccb15f3fa399b4f78f07f1ec75a40c54a9a93b7", + "bytes": 2453 + }, + { + "role": "heart", + "label": "Herz", + "original": "Heart", + "src": "/icon-packs/doodle-khushmeen/heart.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/HeartIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 143 131", + "sha256": "73e643eb4ea399cc40e3669a4d17f6a564b613feb56c0b572b7d0408548ed2b1", + "sourceSha256": "f44f54999126d3e7eef54f9b1053b95501a92961a7af36c1c0cd9a3016b25e48", + "bytes": 2619 + }, + { + "role": "settings", + "label": "Einstellungen", + "original": "Setting", + "src": "/icon-packs/doodle-khushmeen/settings.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/SettingIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 157 133", + "sha256": "4adfd718eb754ed96ed71c5735ee8fb3c2f287430df68b9b9f298ee64549b6a9", + "sourceSha256": "2350163b60f2a65d9ee0366aa3e2c845b4bd1f41acecaad120259c03273258cb", + "bytes": 5053 + }, + { + "role": "person", + "label": "Person", + "original": "User", + "src": "/icon-packs/doodle-khushmeen/person.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/UserIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 154 139", + "sha256": "40bf4cbb4b42ab48ea1e1822fef9a337713406f7fffeeac9e522e7c2a4ff5850", + "sourceSha256": "3f7b946df3cd87ee3e13d784014c1f7e80c15f275d5724a9dc367047c032d290", + "bytes": 2535 + }, + { + "role": "mail", + "label": "E-Mail", + "original": "Mail", + "src": "/icon-packs/doodle-khushmeen/mail.svg", + "source": "https://raw.githubusercontent.com/agilek/react-doodle-icons/43a217f4dc56db621764f2f17a5755f4706b47ec/src/icons/MailIcon.tsx", + "changes": "SVG aus TSX extrahiert; React-Ref/Props entfernt, feste Basisgröße gesetzt. Pfade unverändert.", + "viewBox": "0 0 178 144", + "sha256": "f89918f52157e757ccbdeb7fc3195526663ff34be1b4632b1e609265aeab3965", + "sourceSha256": "099b2bee3c5fa68fbdf5720330848e47a641fccb8309ec98de8be8e93bc42286", + "bytes": 3607 + } + ], + "licenseSource": "https://khushmeen.com/icons", + "conditions": "Kommerzielle Nutzung und Bearbeitung erlaubt. Keine Namensnennung erforderlich.", + "credit": "Keine Pflicht zur Namensnennung (CC0).", + "licenseFile": "/icon-packs/doodle-khushmeen/LICENSE.txt", + "zip": "/icon-packs/doodle-khushmeen.zip", + "note": "SVG · frei skalierbar; einzelne Formen lassen sich separat animieren. SVG-Bilddaten aus der Community-React-Fassung extrahiert; Gestaltung von Khushmeen unter CC0." +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/README.md b/produktionsvorgaben/gestaltung/library-quellen/README.md new file mode 100644 index 0000000..640a16c --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/README.md @@ -0,0 +1,19 @@ +# Ausgewählte Animationsquellen + +Diese Quellreferenz enthält die freigegebenen **28 gemeinsamen Originalbausteine und 390 Motion-Varianten**. Sie dient Noah bzw. seinem Agenten zum Übernehmen geeigneter Bausteine in geplante HyperFrames-Animationen. Die vollständige Vergleichsgalerie ist nicht erforderlich und nicht enthalten. + +## Einstieg + +- [auswahl.json](auswahl.json): genau die 28 freigegebenen Originalbausteine mit Namen, lokalen Quelldateien, Herkunft und Lizenzangaben. +- [scenes.ts](src/studies/scenes.ts) und [studies.css](src/studies/studies.css): 390 Motion-Varianten mit ihren Abläufen und Darstellung. +- `src/packs/`: vorhandene Demo-Aufbauten der vier ausgewählten React-Packs; `src/vendor/` enthält deren Originalkomponenten. Zusätzliche Hilfskomponenten darin sind technische Quellen, keine Erweiterung der Auswahl. +- `public/sources/`: unveränderte Originalquellen und Lizenzen, einschließlich der ausgewählten HyperFrames-Bausteine. Das Herkunftsmanifest beschreibt den ursprünglichen Katalogstand; nicht alle darin verzeichneten Bibliotheken sind Teil dieses Pakets. +- [package.source.json](package.source.json) und [package-lock.source.json](package-lock.source.json): Abhängigkeiten und Versionsstände der Herkunft. Die dort aufgeführten Galerie-Befehle sind historische Quellmetadaten und kein Startbefehl für diesen Ordner. + +## Beim Verwenden + +Gestaltung aus [tokens.json](../tokens.json) bzw. [tokens.css](../tokens.css) übernehmen. Doodle-Icons stehen in [doodle/](../doodle/README.md), der feste Cursorstandard unter [cursor/](../cursor/README.md). Die 640 × 400 Beispielbühne wird passend zur Zielvorlage skaliert; Texte, Daten und Einsatzzeiten kommen aus dem tatsächlichen Script und Cut. + +React-Komponenten werden als Quellreferenz mitgeliefert. Ihre Interaktionen sind kein fertiger HyperFrames-Videoexport; für Video ist eine zeitlich steuerbare Umsetzung erforderlich. Native HyperFrames-Quellen sind ebenfalls an Inhalt und Bereichsvorlagen anzupassen. Ein vorhandener Beispielablauf ist keine bestätigte HiveGrid-Funktion. + +Animate UI und React Bits enthalten zusätzliche Lizenzbedingungen zur Weitergabe als Komponentenpack; die Originaltexte bleiben bei den Quellen. Diese Quellreferenz wird zur vereinbarten Produktion weitergegeben, nicht als eigene frei weiterverkaufbare Bibliothek ausgewiesen. [Gespeicherte Quellen](public/sources/manifest.json). diff --git a/produktionsvorgaben/gestaltung/library-quellen/auswahl.json b/produktionsvorgaben/gestaltung/library-quellen/auswahl.json new file mode 100644 index 0000000..1d8e9b8 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/auswahl.json @@ -0,0 +1,234 @@ +{ + "status": "Freigegebene gemeinsame Bausteinauswahl D258", + "components": [ + { + "id": "motion-primitives/text", + "name": "Wortweiser Aufbau", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/text-effect.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/text-effect.tsx" + }, + { + "id": "motion-primitives/loop", + "name": "Begriffe wechseln", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/text-loop.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/text-loop.tsx" + }, + { + "id": "magicui/typing", + "name": "Texteingabe", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/typing-animation.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/typing-animation.tsx" + }, + { + "id": "animate-ui/text", + "name": "Typing Text", + "pack": "Animate UI", + "source": "public/sources/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/imskyleen/animate-ui/efeb96ffd7a3b7a4868667e4ac3c346620fb3044/apps/www/registry/primitives/texts/typing/index.tsx" + }, + { + "id": "animate-ui/highlight", + "name": "Text markieren", + "pack": "Animate UI", + "source": "public/sources/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/imskyleen/animate-ui/efeb96ffd7a3b7a4868667e4ac3c346620fb3044/apps/www/registry/primitives/texts/highlight/index.tsx" + }, + { + "id": "motion-primitives/shimmer", + "name": "Verarbeitungsstatus", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/text-shimmer.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/text-shimmer.tsx" + }, + { + "id": "motion-primitives/border", + "name": "Fokus-Kontur", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/border-trail.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/border-trail.tsx" + }, + { + "id": "react-bits/text", + "name": "Rotierende Begriffe", + "pack": "React Bits", + "source": "public/sources/react-bits/src/content/TextAnimations/RotatingText/RotatingText.jsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/DavidHDev/react-bits/e1bbb696fc53f7f91e694c529e4d68c899773b6e/src/content/TextAnimations/RotatingText/RotatingText.jsx" + }, + { + "id": "animate-ui/button", + "name": "Ripple-Button", + "pack": "Animate UI", + "source": "public/sources/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/imskyleen/animate-ui/efeb96ffd7a3b7a4868667e4ac3c346620fb3044/apps/www/registry/primitives/buttons/ripple/index.tsx" + }, + { + "id": "animate-ui/switch", + "name": "Animierter Schalter", + "pack": "Animate UI", + "source": "public/sources/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/imskyleen/animate-ui/efeb96ffd7a3b7a4868667e4ac3c346620fb3044/apps/www/registry/primitives/radix/switch/index.tsx" + }, + { + "id": "hyperframes/press-ripple", + "name": "Cursor & Klick", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/press-ripple/press-ripple.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/press-ripple/press-ripple.html" + }, + { + "id": "hyperframes/settings-toggle-flow", + "name": "Einstellungen", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/settings-toggle-flow/settings-toggle-flow.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/settings-toggle-flow/settings-toggle-flow.html" + }, + { + "id": "hyperframes/notification-stack", + "name": "Benachrichtigungsstapel", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/notification-stack/notification-stack.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/notification-stack/notification-stack.html" + }, + { + "id": "magicui/list", + "name": "Benachrichtigungen", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/animated-list.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/animated-list.tsx" + }, + { + "id": "magicui/beam", + "name": "Verbundene Systeme", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/animated-beam.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/animated-beam.tsx" + }, + { + "id": "motion-primitives/panel", + "name": "Panel-Wechsel", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/transition-panel.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/transition-panel.tsx" + }, + { + "id": "hyperframes/modal-morph", + "name": "Karte → Detailansicht", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/modal-morph/modal-morph.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/modal-morph/modal-morph.html" + }, + { + "id": "hyperframes/screen-flow-carousel", + "name": "Software-Screens", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/screen-flow-carousel/screen-flow-carousel.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/screen-flow-carousel/screen-flow-carousel.html" + }, + { + "id": "hyperframes/onboarding-stepper-flow", + "name": "Onboarding", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html" + }, + { + "id": "magicui/number", + "name": "Zahlen-Ticker", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/number-ticker.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/number-ticker.tsx" + }, + { + "id": "motion-primitives/number", + "name": "Zustandszahl", + "pack": "Motion Primitives", + "source": "public/sources/motion-primitives/components/core/animated-number.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/ibelick/motion-primitives/120f64f6ca60348e251f929e9c81f11ccbe45eda/components/core/animated-number.tsx" + }, + { + "id": "animate-ui/number", + "name": "Zahl hochzählen", + "pack": "Animate UI", + "source": "public/sources/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/imskyleen/animate-ui/efeb96ffd7a3b7a4868667e4ac3c346620fb3044/apps/www/registry/primitives/texts/counting-number/index.tsx" + }, + { + "id": "magicui/progress", + "name": "Kreis-Fortschritt", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/animated-circular-progress-bar.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/animated-circular-progress-bar.tsx" + }, + { + "id": "hyperframes/animated-bar-chart", + "name": "Balkendiagramm", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/animated-bar-chart/animated-bar-chart.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/animated-bar-chart/animated-bar-chart.html" + }, + { + "id": "react-bits/folder", + "name": "Datei-Ordner", + "pack": "React Bits", + "source": "public/sources/react-bits/src/content/Components/Folder/Folder.jsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/DavidHDev/react-bits/e1bbb696fc53f7f91e694c529e4d68c899773b6e/src/content/Components/Folder/Folder.jsx" + }, + { + "id": "react-bits/list", + "name": "Auswahlliste", + "pack": "React Bits", + "source": "public/sources/react-bits/src/content/Components/AnimatedList/AnimatedList.jsx", + "license": "MIT + Commons Clause", + "upstream": "https://raw.githubusercontent.com/DavidHDev/react-bits/e1bbb696fc53f7f91e694c529e4d68c899773b6e/src/content/Components/AnimatedList/AnimatedList.jsx" + }, + { + "id": "magicui/terminal", + "name": "Terminal", + "pack": "Magic UI", + "source": "public/sources/magicui/apps/www/registry/magicui/terminal.tsx", + "license": "MIT", + "upstream": "https://raw.githubusercontent.com/magicuidesign/magicui/d7207e5692d14c00dceafa8488d6d01f197fa0e4/apps/www/registry/magicui/terminal.tsx" + }, + { + "id": "hyperframes/terminal-simulator", + "name": "Terminal", + "pack": "HyperFrames Registry", + "source": "public/sources/hyperframes/registry/components/terminal-simulator/terminal-simulator.html", + "license": "Apache-2.0", + "upstream": "https://raw.githubusercontent.com/heygen-com/hyperframes/ca3a3f6e0b37c993ec25a5280bd74fbfc828c0db/registry/components/terminal-simulator/terminal-simulator.html" + } + ], + "motionVariants": { + "count": 390, + "source": "src/studies/scenes.ts", + "styles": "src/studies/studies.css" + } +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/package-lock.source.json b/produktionsvorgaben/gestaltung/library-quellen/package-lock.source.json new file mode 100644 index 0000000..1900bc2 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/package-lock.source.json @@ -0,0 +1,3505 @@ +{ + "name": "motion-asset-katalog", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "motion-asset-katalog", + "version": "1.0.0", + "dependencies": { + "@fontsource-variable/inter": "5.3.0", + "@radix-ui/themes": "3.3.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "daisyui": "5.7.47", + "gsap": "3.15.0", + "lucide-react": "1.49.0", + "motion": "13.4.6", + "radix-ui": "1.6.7", + "react": "19.3.0", + "react-dom": "19.3.0", + "tailwind-merge": "3.7.0", + "tw-animate-css": "1.4.0" + }, + "devDependencies": { + "@tailwindcss/vite": "4.3.3", + "@vitejs/plugin-react": "6.1.1", + "tailwindcss": "4.3.3", + "vite": "8.3.1" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.152.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.152.0.tgz", + "integrity": "sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@radix-ui/colors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", + "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", + "license": "MIT" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", + "integrity": "sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.7.tgz", + "integrity": "sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.15.tgz", + "integrity": "sha512-WTQwcAvQf5sOcuUyi90lKPbhwcvQ+j55cjrSmeaN+L2vKU3DooOvlKw2MDeiJ5IkV5N905KW0/fGojKOBhD11A==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.20.tgz", + "integrity": "sha512-jDhG9FvAEnlhnjrsINbNXcUa4G+L1KqSkJSunkbKEzFRcAb52jvM0PjPxPRvhe1HNc5F5yc0yzzWeeqlH4yBIg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.23.tgz", + "integrity": "sha512-VAYOiQRqj3GPpYJE0I9J+X8Ip05cyVlNdKOFeiGS2Ou1HHGfpl0BxOyZm6nmVDyU+W+NF3/XLzmjHmVGydhwgA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.15.tgz", + "integrity": "sha512-v4zggRcjadnI+ClKDuijlQEW4tw3NoaeHc/PwpKnLoLLKNUG4InLegkstooLcRIUWCs+8L22dGURCVuFfOKfnA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.15.tgz", + "integrity": "sha512-fy+dyVR+90nelK8rqIznFlxzx7uPcGbhxH8Nfr2bHb4UfSe+e3hklOC0luK0hDwVwnRX7xTRySpsrQVeW+/oNQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.2.6.tgz", + "integrity": "sha512-4ULOTJ/mqy2hT9GlWa/MFHxHSvH3nJzHnZM1waNsc5Bonv7i70aNenghXmD97S6OJ81ekXONGGt4nT1r0PfEdA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.3.11.tgz", + "integrity": "sha512-Gnptr9pDDQxD3hgq2dtPbtrp/c2qH1mBwIzw3X/ivrMb2e1t0jMTi606fVEqFPaQR1ggXIVQWKj3P2WW9v7zGQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.20.tgz", + "integrity": "sha512-mcGesGplBnzN2sbvJETzpCNfSMyPnb29q1GRLU+Ib7bJrpIG2ywmRoh2V5VbA2uNvKikKUlVbAPks7JDjz4A8Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.15.tgz", + "integrity": "sha512-9W+B9NPF0NaaPh/1NJd3+KqsnlLqU9H7T2rvww+fp+T/evVXdNAyYcnfRQZFOjkR1ajQp3yORlqnI8soawLvNA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.2.2.tgz", + "integrity": "sha512-RHCUGwKHDr0hDGg4X7ma4JG4/+12qxw8rkh5QKdDldlCvtja6nUx1Ef/8HVrJze81lEsgLQlqjzjGNHantgnQA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.3.7.tgz", + "integrity": "sha512-CtXP35dxaB5T3zXSd+E3uHe/QpXcpYnZmxp6OaIbfthtfW4wyb77M23BG+bwIJDtsMwEP/YssdsmNyZu7jhWew==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.23.tgz", + "integrity": "sha512-Ksw4WeROkO4rC9k/onilX/Ao2Cr1ku1unMNH+XSCcP4jSXYu7HDsg9n4ojMjVb22XpYjAQ9qfrFlVbru1vXDUA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.1.4.tgz", + "integrity": "sha512-5pzg4FGQNpExhnhT2zlrP1wZFaYCd1K0nYWoFAdcYoYK868IEigqMX3B3f8yIoRlAhAeDWciLI6ZdCKHF9P4Vg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.19.tgz", + "integrity": "sha512-8g4pfOL9HoKKLWGiypT+dphVqjFfmcXO5GBnhsG6zI+lxAx/8feQpr+1LSN8Re3hiZ+XkLNS4O9ztK11/LzQ6w==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-effect-event": "0.0.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.24.tgz", + "integrity": "sha512-geq8l2rJkxvkXsT9RMgtUE3P8pITFpTsvYpbySi1IH4fZEABD/Gp85myayFgxk0ktljGMJnCbeFkyTusvSvv7g==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.6.tgz", + "integrity": "sha512-RNOJjfZMTyBM6xYmV3IVGXkPjIhcBAuv48POevAXwrGJhkWZ9p1rFoIS1JFooPuT193AZmRsCPhpoVJxx6OPoQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.16.tgz", + "integrity": "sha512-wmRZ2WWLvmt6KHy2rNPOdPUjwq5xOHY02+m+udwJTn0aNIox/rkskAvJTyTLGhPK6KgrUjlJUJpgmx/+wFiFIQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-form/-/react-form-0.1.16.tgz", + "integrity": "sha512-Q4TLEn2A7TAypxwmd6R9EwrlXDvkfYSDMrq9/887AXAGh+G1rH+kYJKSTv+Si9Y0JPKTwKYv6PviAJosysNimA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.23.tgz", + "integrity": "sha512-H8qONfZd3ltrU3+jHCIgITbWo6e1iTKvP9DHdrvYbX48ooRM5FjEDTn16AMwdfuOGkWdZEhpl3PLL/Wk/AnHDQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.15.tgz", + "integrity": "sha512-o/rdYEwZTTo5tjknnPeyQFU45kUC4i/XyeDPP+HGyi6XqpOP6Zf5Ya5vh/Yfe9Id5JiuWnnAx2XqIeD3UYZt0g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.24.tgz", + "integrity": "sha512-uW7RVuU6Lp/ZtfeY4b3kL32zccgEWvPv1+cf17ubYzHa9cL8AHokmk36cG/XEiH/smbQvumnieXX9j/e9RqJWA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menubar": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.24.tgz", + "integrity": "sha512-eeVs0vf7cuqXaM0qLQCPcufImiJNVBXdJDLu7ZGYl2732UH23Qat/foNGrr6vYV3/DdTsBqASoggUFgH14OcZA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.22", + "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.22.tgz", + "integrity": "sha512-ou7iLEJ+yrhQndkkA4U21XIdS/CS45F4iXIkTZcb6/Ne9EMsOuDudVmCwmDnfFZZ+y1FZqXRNSIgBy+YMvZVZg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-one-time-password-field": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-one-time-password-field/-/react-one-time-password-field-0.1.16.tgz", + "integrity": "sha512-Tj9P6ntAJEw52oq/F0AGknXR4XncxEt7XU47O3xJQOiWfLzEy3d9gtgKfvjSzGxzHkfL+VzvxGu2KTFsloJqXw==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-password-toggle-field": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-password-toggle-field/-/react-password-toggle-field-0.1.11.tgz", + "integrity": "sha512-4gvFnmDXu3dgj21CqsufzIameRvlRd4SBqaWhcrlrNhRo0Y5i/49AmRJYe1fdAM3G2VNBbmin4b0D6cdQocwgw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-is-hydrated": "0.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.23.tgz", + "integrity": "sha512-mw58MrBlyHWFisTOYignD0vf/3gdcgAR+9of1s9G/38CbFiUwH1nCDkc0AUM9IrXFgN5Ue8n45j9WCgyM1sbiQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.3.7.tgz", + "integrity": "sha512-UsJrrd7w4wuKKTdvd/DNERVlwSlUcyXzjhyDwBk+3aPOsCjOY6ZSbxuw8E6lZTjjfP8Cpd0J8VVkrYUWyGYXyg==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.17.tgz", + "integrity": "sha512-vKQLcWypUnwZVvfV7UkGahH2g6ySe8M8R+zYBwPrv5byZ9QAW6cQVvNKo7GgmD+p8aYb6D9JBuvy8/WhOno2wQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.10.tgz", + "integrity": "sha512-3wyzCQ6+ubRA+D4uv9m95JYLXxmOHp05qjrkjeA7uKHHtjpPggQzc6DAb0URl7j67oR0K2foO4ip27TiX037Bw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.10.tgz", + "integrity": "sha512-MucOnzh6hR5mid6VpkbglRAMYMjKLqRnGBbjXkzjK52fuQDd1qbkx78a5P40mkcnVXJdEVxm26E9OPAiUq7nBg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.3.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.16.tgz", + "integrity": "sha512-5XnomAsoZZCY+KNTxbIghpGqPruZvKFNlvcAljVAOdDRDsH4/OZQxhtwo5wdtoDM5R6MhJBb2sPnDuRFep3lzg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.4.7.tgz", + "integrity": "sha512-cgYFEkntCxppHZgtSZ+7vh0wbZQ+IC7PPMw8DSnRG27B6kDd32/Zw0OJt7dGDigCoprMuWHjg2PvUn3PYvPFoQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.19.tgz", + "integrity": "sha512-V9jI6hDjT7l3jsCQD9bLNvDLM3tH/gdbOTp7Tefp3hbbgCGQoK7tUvrWiRlcoBHIZ809ElXwNQwVo0B98LuTXQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.2.18.tgz", + "integrity": "sha512-Zn5Cd171wxsO3Dfg8HaW6RifTb9CYTKQJHs/G4+LN1GfmJpaQMZQyQxMprVPHpaz7QY4l9BxK2JwQuzHsXC8nA==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.3.7.tgz", + "integrity": "sha512-WFGImkmbzcfxeIwq/+4HvRN0pizBwbwQUED4I13ezQsDdfl38ZntN6TmR8XaSzPBqoCToe8rF75j6NPNDSzhbg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.15.tgz", + "integrity": "sha512-jOLO4lssEzWpoDu7G+Ze4VjwMRUBt291pnZD0gmalREZipnTX3wadQo7Fy48GCTfe14/YRN6rw/rOJqrE85Wxw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.4.7.tgz", + "integrity": "sha512-mTSLf1GC/C0moWjTbvCM6Qn/gBjvlFt1azuWF2v7MN5C3Zq2U2J2lN3ZEYkpujuOU5Ro7A28wkviSxaKnG0BYg==", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.3", + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-previous": "1.1.4", + "@radix-ui/react-use-size": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.3.tgz", + "integrity": "sha512-qx7oqnYbxnK9kYI9m317qmFmEgo6ywqWvbTogdj7cL9p3/yx4M48p7Rnw5z3H890cL/ow/EeWJsuTykeZVXP5Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.3.7.tgz", + "integrity": "sha512-48tB/4dn2UVLBCYhTu9AuR63IHl73l/qLbLgxd86noTUor4/K4LFDAcYjK+isP5313qxaFpjPVogE7+Y0/V3Kw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-size": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.21.tgz", + "integrity": "sha512-UKxJlZid7FVtsk/WTxj4i4uSEgj2Au+KBbS7SQyTlzMhhn+86Cz3tISZdTa87bfEfcuvZezf2ZsxD4xuEKtkog==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.23", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.23.tgz", + "integrity": "sha512-ofhyAsYaocRGOs/n0XWdUOSVzEAG6BfrMVM8z0c0kLEWY38w/0WuMFPTJP/HVaZPYkMvHZoKIIhNcjbTCBILPg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.18.tgz", + "integrity": "sha512-7lonPlKfSacd20GlOBx2ltuVKz9oqWYZz+oMQyOltw6t1y2nyftj2ZmwwUHYn49kqfDWcp8dNZm5NgV+5Z+mug==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.19.tgz", + "integrity": "sha512-OtnwuSVjd1Ofi+AdnvhsjQdyuhCDwYs1w9RyB5BN/OavXOVQo42SYqQjwUnbPnaiPFBpQ9aX70dWeee+v2oBLA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-use-controllable-state": "1.2.6" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toolbar": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.1.19.tgz", + "integrity": "sha512-Ph0IvtYw4VB12ZnZg+YtrGs8yJQsnizwo/zu0R4Y/nWugtJzA7Pg1eWeuDR9+LSqn+xjamss+UOSOJJJ4gx8jw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-toggle-group": "1.1.19" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.16.tgz", + "integrity": "sha512-6EamKFRRnlpdadndbZ6LMwycfwkwPte1B42hs6QA0gYhjaOKqW4PZ4pjaW9UrlDX5eVt/OjncE7BFTPL5nmZhg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.4.tgz", + "integrity": "sha512-R6OUY2e2fA6Yn6s+VSx5KBV6Nx8LQEhu+cz7LCej18rQ1HLyg9PSC9jP/ZNx0o6FAIK9c0F1kHylzSxKsdlkrQ==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.6.tgz", + "integrity": "sha512-uEQJGT97ZA/TgP/Hydw47lHu+/vQj6z/0jA+WeTbK1o9Rx45GImjpD0tc3W5ad3D6XTSR6e1yEO0FvGq6WQfVQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.5.tgz", + "integrity": "sha512-ge3ipobwSXTj4JyVtswQ7qZj0ZHdtbGuOno/LrgAAeSxtsJ6Vs4Gz5IkPH2bmqpjcLUFoqGhA/mueuIf63UXlA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.1.4.tgz", + "integrity": "sha512-XoSLhbRbqxFtgJoi2fNHA3C6pDlY34x508vUpUGoFZfvePfHXHbE1lC4FYFMnJWgiCRroSTw6fOsXQoVS9RwZg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.4.tgz", + "integrity": "sha512-D3anSY15EJoxrihpsXI6SMrmmonnQtR2ni7arO+Lfdg3O95b9hNXxONk8jA5C8ANdF/h5HMAxejgs8PWJ6rlhw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.11.tgz", + "integrity": "sha512-NFS86RYYZb4/exihaESBGOpMJFz8MGLAfu3mOBSGByVnVPC9JPASfYubxd/8KbkQK0sYAv8lVQDEQukDX/qXvQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.10" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@radix-ui/themes": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/themes/-/themes-3.3.0.tgz", + "integrity": "sha512-I0/h2CRNTpYNB7Mi3xFIvSsQq5a108d7kK8dTO5zp5b9HR5QJXKag6B8tjpz2ITkVYkFdkGk45doNkSr7OxwNw==", + "license": "MIT", + "dependencies": { + "@radix-ui/colors": "^3.0.0", + "classnames": "^2.3.2", + "radix-ui": "^1.1.3", + "react-remove-scroll-bar": "^2.3.8" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.12.tgz", + "integrity": "sha512-dB/a1214qKfHMXCpgqR4OZT+jS4kTyEXbQGJPqzobt5EwH5rX080pxE37alt3RzvR1bf1Yz/yGqRfrYAxuPw0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.12.tgz", + "integrity": "sha512-7KHFgQ5VJxIHcLlrwrc3Xbds7oTNQT7Pgi9gQCJKrd2VGab/UksIOYp6VD8MzCstGxOKMgNamPwUCfxPdP1OHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.12.tgz", + "integrity": "sha512-3YIhqHD96nA5SaYNRBR16HnGv4oavZvXfD/ayHM+oYZ0WD/8lBAtf6zQua4kEyAvpqrluKXl0lnOBoiNby7x9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.12.tgz", + "integrity": "sha512-UuuJ35MFw4gmFOrE9pEqIV+K3syIKveph+Qc1/ljHZVdoDW4pz/JHR/eMVom+TZGl/5OOvGJOWaOCVt3ZfqhxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.12.tgz", + "integrity": "sha512-uMvssit0a4W+/7D8CbHUvG719mH3R2jwXAlh/XcPvuHTE0g++LymF88DCGNX0HM2rBOn0xrzgXktIB6fLSJBTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.12.tgz", + "integrity": "sha512-XcFu0R0xWnwzSf4IQgFH1rJIckPN1pLy2R+4r9IDB7Yfu/ys9cVqfa4pBrMHj7a3gl8mIR4nRNPg0e5IvEVs6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.12.tgz", + "integrity": "sha512-260UrKgn8tz39ak+SMDOirKzr7V04M9dWPw5llW00SwBivCZoWcRBKV1d8cXnRkUmSZA3BdiUmBHWk7734Ulpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.12.tgz", + "integrity": "sha512-5YK1I9SqDkbPgc1IA8BgDl34suqUS2q0KWnBrirm0E51YjOs6eo6dV6jbQfNE/argHRSvd0QUGgtpIoYx+WWpw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.12.tgz", + "integrity": "sha512-Rkcrmp7eFRg74yL5fXEU91JEWbdEPLevWwGtXpmhbjlD1StScbWTmO94Bhly+Mo+ketKYkdmM1vNUKeWSlx8cQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.12.tgz", + "integrity": "sha512-qvK4DuAsQc2BSjlx+Xr+IzOIvvxbGZqxFwdWfG6F518Erj0GGISyQbJ6pIappnOxlNPzNHvo/L0BwB30GZ+zVw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.12.tgz", + "integrity": "sha512-Q9uLBO53Xd4QIq1WOycVQyPP1O4HhraEV2qqb3uTrnVw6QZih9duY4vNXOivL1xoUS1/z+W8eF4NMfl2a8Sdjw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.12.tgz", + "integrity": "sha512-3IBxWFMjbOZskDPKv8Lf9BCnahlKuHthWkYnyIxOH/QcJrFcS4EmcenthApkwr/5+nEqZlLzeYbxeMaX7A5u4g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.12.tgz", + "integrity": "sha512-xtX61xg4LKPkPWilZU1ynKClz5Gj4bf74LML4r3eVLWumKnGjoEr1OSHQhMdbBDoYTi+yjrujvpZe2pUnqCrrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.12.tgz", + "integrity": "sha512-At7fPB6PCaIjzgIhEZFxuT+BBFqiQibJDT4d3PhiR3f4E7bbMZF4aKblbFfEM3sETRDd1YiQx/+U/g/B/ou5Ew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.12.tgz", + "integrity": "sha512-WIw2haVKwjuYdXkHaoC0mF8Le71TuCBxjrdKqLbJGctbBABj+ClfmNvtbOnzpq3RokNo5+V1qhtSzJyXorsklQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.1.tgz", + "integrity": "sha512-yxLaQV9gkhS8ezJqCM6+ndU7mDY6gqAg75NQ+0IjwEI8IYOmQCgkRwHKVSfWXW076DsqMo0Dk+0FK1U+M5RgFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/daisyui": { + "version": "5.7.47", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.7.47.tgz", + "integrity": "sha512-NOl4vPifelRqB3CMzoU751zc44KCDD9HdHMTTqQ30uiYVpIyK7+s94/ySDWgYqjdl1tQCaCrgGBx4KCizm+a3Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/saadeghi/daisyui?sponsor=1" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/framer-motion": { + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-13.4.6.tgz", + "integrity": "sha512-TwKWt2CC8rjhARzwV00TZIh04ipumSAqyKM/JZmS+urdncSHg6wTF/mfj/Fd6Oi2W01TZSWsiA3uxXDrXZtKyw==", + "license": "MIT", + "dependencies": { + "motion-dom": "^13.4.5", + "motion-utils": "^13.3.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gsap": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.15.0.tgz", + "integrity": "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==", + "license": "Standard 'no charge' license: https://gsap.com/standard-license." + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-react": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.49.0.tgz", + "integrity": "sha512-ApfaNM4/7jBrVopqLJ84Jz8TMQ1Q1JeZ1PmKh25aeS3E1FTVcMkSh1bEQB7dfzdIrwXRP8p3z4AJjTIHHb5IIA==", + "license": "ISC", + "peerDependencies": { + "@types/react": "*", + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/motion": { + "version": "13.4.6", + "resolved": "https://registry.npmjs.org/motion/-/motion-13.4.6.tgz", + "integrity": "sha512-zDXi6lIdyhda6wZlTsv9QgT2ed6UExAfRegtl/akQmZb5iaeLlArXr9Gmo/hx3iTx2y4R7tmdb9k9koFQmV+NQ==", + "license": "MIT", + "dependencies": { + "framer-motion": "^13.4.6", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/motion-dom": { + "version": "13.4.5", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-13.4.5.tgz", + "integrity": "sha512-p63p2Doq+US/O5wADauIPUVx0/eONHMLPzsudBM9XMWRuBQLXogdxH0vwIA8WYQZw864pyzoV723xoDqakwWTg==", + "license": "MIT", + "dependencies": { + "motion-utils": "^13.3.0" + } + }, + "node_modules/motion-utils": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-13.3.0.tgz", + "integrity": "sha512-sgSschQp7EseHInIlR7hBbMuvet3RA0bs28KPZAXJcGKGdxHGvh1ogpYDilY3bOMtl73EqPNmp75sAKHYPU5sg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/radix-ui": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/radix-ui/-/radix-ui-1.6.7.tgz", + "integrity": "sha512-QBdhh1arIEUvPC0dQ5+nwWAxt7+N+oP/9jPwjJkGFoSk/sqxg32gJtSXGtFh8frAIcS6oC9cx2Q+7KYCQLOAeA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.7", + "@radix-ui/react-accessible-icon": "1.1.15", + "@radix-ui/react-accordion": "1.2.20", + "@radix-ui/react-alert-dialog": "1.1.23", + "@radix-ui/react-arrow": "1.1.15", + "@radix-ui/react-aspect-ratio": "1.1.15", + "@radix-ui/react-avatar": "1.2.6", + "@radix-ui/react-checkbox": "1.3.11", + "@radix-ui/react-collapsible": "1.1.20", + "@radix-ui/react-collection": "1.1.15", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.2.2", + "@radix-ui/react-context-menu": "2.3.7", + "@radix-ui/react-dialog": "1.1.23", + "@radix-ui/react-direction": "1.1.4", + "@radix-ui/react-dismissable-layer": "1.1.19", + "@radix-ui/react-dropdown-menu": "2.1.24", + "@radix-ui/react-focus-guards": "1.1.6", + "@radix-ui/react-focus-scope": "1.1.16", + "@radix-ui/react-form": "0.1.16", + "@radix-ui/react-hover-card": "1.1.23", + "@radix-ui/react-label": "2.1.15", + "@radix-ui/react-menu": "2.1.24", + "@radix-ui/react-menubar": "1.1.24", + "@radix-ui/react-navigation-menu": "1.2.22", + "@radix-ui/react-one-time-password-field": "0.1.16", + "@radix-ui/react-password-toggle-field": "0.1.11", + "@radix-ui/react-popover": "1.1.23", + "@radix-ui/react-popper": "1.3.7", + "@radix-ui/react-portal": "1.1.17", + "@radix-ui/react-presence": "1.1.10", + "@radix-ui/react-primitive": "2.1.10", + "@radix-ui/react-progress": "1.1.16", + "@radix-ui/react-radio-group": "1.4.7", + "@radix-ui/react-roving-focus": "1.1.19", + "@radix-ui/react-scroll-area": "1.2.18", + "@radix-ui/react-select": "2.3.7", + "@radix-ui/react-separator": "1.1.15", + "@radix-ui/react-slider": "1.4.7", + "@radix-ui/react-slot": "1.3.3", + "@radix-ui/react-switch": "1.3.7", + "@radix-ui/react-tabs": "1.1.21", + "@radix-ui/react-toast": "1.2.23", + "@radix-ui/react-toggle": "1.1.18", + "@radix-ui/react-toggle-group": "1.1.19", + "@radix-ui/react-toolbar": "1.1.19", + "@radix-ui/react-tooltip": "1.2.16", + "@radix-ui/react-use-callback-ref": "1.1.4", + "@radix-ui/react-use-controllable-state": "1.2.6", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-escape-keydown": "1.1.5", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-size": "1.1.4", + "@radix-ui/react-visually-hidden": "1.2.11" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/rolldown": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.12.tgz", + "integrity": "sha512-8wafseiaG80xmXSfqidUNqZcylTlhmPZZt+za2m+js2sFZ8dTNlhIOV2WcbIPx2hgwPBJpEUGFAMZ9bgBBLTSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.152.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.12", + "@rolldown/binding-android-arm64": "1.2.12", + "@rolldown/binding-darwin-arm64": "1.2.12", + "@rolldown/binding-darwin-x64": "1.2.12", + "@rolldown/binding-freebsd-x64": "1.2.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.12", + "@rolldown/binding-linux-arm64-gnu": "1.2.12", + "@rolldown/binding-linux-arm64-musl": "1.2.12", + "@rolldown/binding-linux-ppc64-gnu": "1.2.12", + "@rolldown/binding-linux-s390x-gnu": "1.2.12", + "@rolldown/binding-linux-x64-gnu": "1.2.12", + "@rolldown/binding-linux-x64-musl": "1.2.12", + "@rolldown/binding-openharmony-arm64": "1.2.12", + "@rolldown/binding-win32-arm64-msvc": "1.2.12", + "@rolldown/binding-win32-x64-msvc": "1.2.12" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwind-merge": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz", + "integrity": "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.1.tgz", + "integrity": "sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.9", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + } + } +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/package.source.json b/produktionsvorgaben/gestaltung/library-quellen/package.source.json new file mode 100644 index 0000000..b12628c --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/package.source.json @@ -0,0 +1,32 @@ +{ + "dependencies": { + "@fontsource-variable/inter": "5.3.0", + "@radix-ui/themes": "3.3.0", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "daisyui": "5.7.47", + "gsap": "3.15.0", + "lucide-react": "1.49.0", + "motion": "13.4.6", + "radix-ui": "1.6.7", + "react": "19.3.0", + "react-dom": "19.3.0", + "tailwind-merge": "3.7.0", + "tw-animate-css": "1.4.0" + }, + "devDependencies": { + "@tailwindcss/vite": "4.3.3", + "@vitejs/plugin-react": "6.1.1", + "tailwindcss": "4.3.3", + "vite": "8.3.1" + }, + "name": "motion-asset-katalog", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 127.0.0.1 --port 8770 --strictPort", + "build": "python3 tools/prepare-library.py && vite build", + "preview": "vite preview --host 127.0.0.1 --port 8770 --strictPort" + } +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/runtime/GSAP-LICENSE.txt b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/GSAP-LICENSE.txt new file mode 100644 index 0000000..0278421 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/GSAP-LICENSE.txt @@ -0,0 +1,4 @@ +GSAP 3.15.0 +License: Standard 'no charge' license: https://gsap.com/standard-license. +Official terms: https://gsap.com/standard-license/ +The distributed gsap.min.js retains its upstream copyright/license header. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/runtime/Inter-LICENSE.txt b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/Inter-LICENSE.txt new file mode 100644 index 0000000..40589da --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/Inter-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/runtime/LICENSE-inter.txt b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/LICENSE-inter.txt new file mode 100644 index 0000000..40589da --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/LICENSE-inter.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/runtime/gsap.min.js b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/gsap.min.js new file mode 100644 index 0000000..3c73d76 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/runtime/gsap.min.js @@ -0,0 +1,11 @@ +/*! + * GSAP 3.15.0 + * https://gsap.com + * + * @license Copyright 2026, GreenSock. All rights reserved. + * Subject to the terms at https://gsap.com/standard-license. + * @author: Jack Doyle, jack@greensock.com + */ + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).window=t.window||{})}(this,function(e){"use strict";function _inheritsLoose(t,e){t.prototype=Object.create(e.prototype),(t.prototype.constructor=t).__proto__=e}function _assertThisInitialized(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}function r(t){return"string"==typeof t}function s(t){return"function"==typeof t}function t(t){return"number"==typeof t}function u(t){return void 0===t}function v(t){return"object"==typeof t}function w(t){return!1!==t}function x(){return"undefined"!=typeof window}function y(t){return s(t)||r(t)}function R(t){return(i=bt(t,ht))&&Fe}function S(t,e){return console.warn("Invalid property",t,"set to",e,"Missing plugin? gsap.registerPlugin()")}function T(t,e){return!e&&console.warn(t)}function U(t,e){return t&&(ht[t]=e)&&i&&(i[t]=e)||ht}function V(){return 0}function ga(t){var e,r,i=t[0];if(v(i)||s(i)||(t=[t]),!(e=(i._gsap||{}).harness)){for(r=yt.length;r--&&!yt[r].targetTest(i););e=yt[r]}for(r=t.length;r--;)t[r]&&(t[r]._gsap||(t[r]._gsap=new Xt(t[r],e)))||t.splice(r,1);return t}function ha(t){return t._gsap||ga(Pt(t))[0]._gsap}function ia(t,e,r){return(r=t[e])&&s(r)?t[e]():u(r)&&t.getAttribute&&t.getAttribute(e)||r}function ja(t,e){return(t=t.split(",")).forEach(e)||t}function ka(t){return Math.round(1e5*t)/1e5||0}function la(t){return Math.round(1e7*t)/1e7||0}function ma(t,e){var r=e.charAt(0),i=parseFloat(e.substr(2));return t=parseFloat(t),"+"===r?t+i:"-"===r?t-i:"*"===r?t*i:t/i}function na(t,e){for(var r=e.length,i=0;t.indexOf(e[i])<0&&++ia;)s=s._prev;return s?(e._next=s._next,s._next=e):(e._next=t[r],t[r]=e),e._next?e._next._prev=e:t[i]=e,e._prev=s,e.parent=e._dp=t,e}function Ba(t,e,r,i){void 0===r&&(r="_first"),void 0===i&&(i="_last");var n=e._prev,a=e._next;n?n._next=a:t[r]===e&&(t[r]=a),a?a._prev=n:t[i]===e&&(t[i]=n),e._next=e._prev=e.parent=null}function Ca(t,e){t.parent&&(!e||t.parent.autoRemoveChildren)&&t.parent.remove&&t.parent.remove(t),t._act=0}function Da(t,e){if(t&&(!e||e._end>t._dur||e._start<0))for(var r=t;r;)r._dirty=1,r=r.parent;return t}function Fa(t,e,r,i){return t._startAt&&(I?t._startAt.revert(ft):t.vars.immediateRender&&!t.vars.autoRevert||t._startAt.render(e,!0,i))}function Ha(t){return t._repeat?wt(t._tTime,t=t.duration()+t._rDelay)*t:0}function Ja(t,e){return(t-e._start)*e._ts+(0<=e._ts?0:e._dirty?e.totalDuration():e._tDur)}function Ka(t){return t._end=la(t._start+(t._tDur/Math.abs(t._ts||t._rts||q)||0))}function La(t,e){var r=t._dp;return r&&r.smoothChildTiming&&t._ts&&(t._start=la(r._time-(0q)&&e.render(r,!0)),Da(t,e)._dp&&t._initted&&t._time>=t._dur&&t._ts){if(t._dur(n=Math.abs(n))&&(a=i,o=n);return a}function wb(t){return Ca(t),t.scrollTrigger&&t.scrollTrigger.kill(!!I),t.progress()<1&&At(t,"onInterrupt"),t}function zb(t){if(t)if(t=!t.name&&t.default||t,x()||t.headless){var e=t.name,r=s(t),i=e&&!r&&t.init?function(){this._props=[]}:t,n={init:V,render:_e,add:$t,kill:Te,modifier:ve,rawVars:0},a={targetTest:0,get:0,getSetter:ue,aliases:{},register:0};if(Lt(),t!==i){if(mt[e])return;ta(i,ta(xa(t,n),a)),bt(i.prototype,bt(n,xa(t,a))),mt[i.prop=e]=i,t.targetTest&&(yt.push(i),dt[e]=1),e=("css"===e?"CSS":e.charAt(0).toUpperCase()+e.substr(1))+"Plugin"}U(e,i),t.register&&t.register(Fe,i,we)}else Dt.push(t)}function Cb(t,e,r){return(6*(t+=t<0?1:1>16,e>>8&zt,e&zt]:0:Rt.black;if(!p){if(","===e.substr(-1)&&(e=e.substr(0,e.length-1)),Rt[e])p=Rt[e];else if("#"===e.charAt(0)){if(e.length<6&&(e="#"+(n=e.charAt(1))+n+(a=e.charAt(2))+a+(s=e.charAt(3))+s+(5===e.length?e.charAt(4)+e.charAt(4):"")),9===e.length)return[(p=parseInt(e.substr(1,6),16))>>16,p>>8&zt,p&zt,parseInt(e.substr(7),16)/255];p=[(e=parseInt(e.substr(1),16))>>16,e>>8&zt,e&zt]}else if("hsl"===e.substr(0,3))if(p=d=e.match(rt),r){if(~e.indexOf("="))return p=e.match(it),i&&p.length<4&&(p[3]=1),p}else o=+p[0]%360/360,u=p[1]/100,n=2*(h=p[2]/100)-(a=h<=.5?h*(u+1):h+u-h*u),3=X?u.endTime(!1):t._dur;return r(e)&&(isNaN(e)||e in o)?(a=e.charAt(0),s="%"===e.substr(-1),n=e.indexOf("="),"<"===a||">"===a?(0<=n&&(e=e.replace(/=/,"")),("<"===a?u._start:u.endTime(0<=u._repeat))+(parseFloat(e.substr(1))||0)*(s?(n<0?u:i).totalDuration()/100:1)):n<0?(e in o||(o[e]=h),o[e]):(a=parseFloat(e.charAt(n-1)+e.substr(n+1)),s&&i&&(a=a/100*(K(i)?i[0]:i).totalDuration()),1=r&&te)return i;i=i._next}else for(i=t._last;i&&i._start>=r;){if("isPause"===i.data&&i._start=n._start)&&n._ts&&h!==n){if(n.parent!==this)return this.render(t,e,r);if(n.render(0=this.totalDuration()||!v&&_)&&(f!==this._start&&Math.abs(l)===Math.abs(this._ts)||this._lock||(!t&&g||!(v===m&&0=i&&(a instanceof te?e&&n.push(a):(r&&n.push(a),t&&n.push.apply(n,a.getChildren(!0,e,r)))),a=a._next;return n},e.getById=function getById(t){for(var e=this.getChildren(1,1,1),r=e.length;r--;)if(e[r].vars.id===t)return e[r]},e.remove=function remove(t){return r(t)?this.removeLabel(t):s(t)?this.killTweensOf(t):(t.parent===this&&Ba(this,t),t===this._recent&&(this._recent=this._last),Da(this))},e.totalTime=function totalTime(t,e){return arguments.length?(this._forcing=1,!this._dp&&this._ts&&(this._start=la(It.time-(0r:!r||s.isActive())&&n.push(s):(i=s.getTweensOf(a,r)).length&&n.push.apply(n,i),s=s._next;return n},e.tweenTo=function tweenTo(t,e){e=e||{};var r,i=this,n=Ot(i,t),a=e.startAt,s=e.onStart,o=e.onStartParams,u=e.immediateRender,h=te.to(i,ta({ease:e.ease||"none",lazy:!1,immediateRender:!1,time:n,overwrite:"auto",duration:e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale())||q,onStart:function onStart(){if(i.pause(),!r){var t=e.duration||Math.abs((n-(a&&"time"in a?a.time:i._time))/i.timeScale());h._dur!==t&&Ua(h,t,0,1).render(h._time,!0,!0),r=1}s&&s.apply(h,o||[])}},e));return u?h.render(0):h},e.tweenFromTo=function tweenFromTo(t,e,r){return this.tweenTo(e,ta({startAt:{time:Ot(this,t)}},r))},e.recent=function recent(){return this._recent},e.nextLabel=function nextLabel(t){return void 0===t&&(t=this._time),ub(this,Ot(this,t))},e.previousLabel=function previousLabel(t){return void 0===t&&(t=this._time),ub(this,Ot(this,t),1)},e.currentLabel=function currentLabel(t){return arguments.length?this.seek(t,!0):this.previousLabel(this._time+q)},e.shiftChildren=function shiftChildren(t,e,r){void 0===r&&(r=0);var i,n=this._first,a=this.labels;for(t=la(t);n;)n._start>=r&&(n._start+=t,n._end+=t),n=n._next;if(e)for(i in a)a[i]>=r&&(a[i]+=t);return Da(this)},e.invalidate=function invalidate(t){var e=this._first;for(this._lock=0;e;)e.invalidate(t),e=e._next;return i.prototype.invalidate.call(this,t)},e.clear=function clear(t){void 0===t&&(t=!0);for(var e,r=this._first;r;)e=r._next,this.remove(r),r=e;return this._dp&&(this._time=this._tTime=this._pTime=0),t&&(this.labels={}),Da(this)},e.totalDuration=function totalDuration(t){var e,r,i,n=0,a=this,s=a._last,o=X;if(arguments.length)return a.timeScale((a._repeat<0?a.duration():a.totalDuration())/(a.reversed()?-t:t));if(a._dirty){for(i=a.parent;s;)e=s._prev,s._dirty&&s.totalDuration(),o<(r=s._start)&&a._sort&&s._ts&&!a._lock?(a._lock=1,Na(a,s,r-s._delay,1)._lock=0):o=r,r<0&&s._ts&&(n-=r,(!i&&!a._dp||i&&i.smoothChildTiming)&&(a._start+=la(r/a._ts),a._time-=r,a._tTime-=r),a.shiftChildren(-r,!1,-Infinity),o=0),s._end>n&&s._ts&&(n=s._end),s=e;Ua(a,a===L&&a._time>n?a._time:n,1,1),a._dirty=0}return a._tDur},Timeline.updateRoot=function updateRoot(t){if(L._ts&&(qa(L,Ja(t,L)),f=It.frame),It.frame>=vt){vt+=Y.autoSleep||120;var e=L._first;if((!e||!e._ts)&&Y.autoSleep&&It._listeners.length<2){for(;e&&!e._ts;)e=e._next;e||It.sleep()}}},Timeline}(qt);ta(Gt.prototype,{_lock:0,_hasPause:0,_forcing:0});function cc(t,e,i,n,a,o){var u,h,l,f;if(mt[t]&&!1!==(u=new mt[t]).init(a,u.rawVars?e[t]:function _processVars(t,e,i,n,a){if(s(t)&&(t=Qt(t,a,e,i,n)),!v(t)||t.style&&t.nodeType||K(t)||J(t))return r(t)?Qt(t,a,e,i,n):t;var o,u={};for(o in t)u[o]=Qt(t[o],a,e,i,n);return u}(e[t],n,a,o,i),i,n,o)&&(i._pt=h=new we(i._pt,a,t,0,1,u.render,u,0,u.priority),i!==c))for(l=i._ptLookup[i._targets.indexOf(a)],f=u._props.length;f--;)l[u._props[f]]=h;return u}function ic(t,r,e,i){var n,a,s=r.ease||i||"power1.inOut";if(K(r))a=e[t]||(e[t]=[]),r.forEach(function(t,e){return a.push({t:e/(r.length-1)*100,v:t,e:s})});else for(n in r)a=e[n]||(e[n]=[]),"ease"===n||a.push({t:parseFloat(t),v:r[n],e:s})}var Zt,Wt,$t=function _addPropTween(t,e,i,n,a,o,u,h,l,f){s(n)&&(n=n(a||0,t,o));var c,d=t[e],p="get"!==i?i:s(d)?l?t[e.indexOf("set")||!s(t["get"+e.substr(3)])?e:"get"+e.substr(3)](l):t[e]():d,_=s(d)?l?se:ae:ie;if(r(n)&&(~n.indexOf("random(")&&(n=rb(n)),"="===n.charAt(1)&&(!(c=ma(p,n)+(_a(p)||0))&&0!==c||(n=c))),!f||p!==n||Wt)return isNaN(p*n)||""===n?(d||e in t||S(e,n),function _addComplexStringPropTween(t,e,r,i,n,a,s){var o,u,h,l,f,c,d,p,_=new we(this._pt,t,e,0,1,pe,null,n),m=0,g=0;for(_.b=r,_.e=i,r+="",(d=~(i+="").indexOf("random("))&&(i=rb(i)),a&&(a(p=[r,i],t,e),r=p[0],i=p[1]),u=r.match(at)||[];o=at.exec(i);)l=o[0],f=i.substring(m,o.index),h?h=(h+1)%5:"rgba("===f.substr(-5)&&(h=1),l!==u[g++]&&(c=parseFloat(u[g-1])||0,_._pt={_next:_._pt,p:f||1===g?f:",",s:c,c:"="===l.charAt(1)?ma(c,l)-c:parseFloat(l)-c,m:h&&h<4?Math.round:0},m=at.lastIndex);return _.c=m")}),s.duration();else{for(l in u={},k)"ease"===l||"easeEach"===l||ic(l,k[l],u,k.easeEach);for(l in u)for(A=u[l].sort(function(t,e){return t.t-e.t}),o=R=0;o=t._tDur||e<0)&&t.ratio===u&&(u&&Ca(t,1),r||I||(At(t,u?"onComplete":"onReverseComplete",!0),t._prom&&t._prom()))}else t._zTime||(t._zTime=e)}(this,t,e,r);return this},e.targets=function targets(){return this._targets},e.invalidate=function invalidate(t){return t&&this.vars.runBackwards||(this._startAt=0),this._pt=this._op=this._onUpdate=this._lazy=this.ratio=0,this._ptLookup=[],this.timeline&&this.timeline.invalidate(t),E.prototype.invalidate.call(this,t)},e.resetTo=function resetTo(t,e,r,i,n){d||It.wake(),this._ts||this.play();var a,s=Math.min(this._dur,(this._dp._time-this._start)*this._ts);return this._initted||Ht(this,s),a=this._ease(s/this._dur),function _updatePropTweens(t,e,r,i,n,a,s,o){var u,h,l,f,c=(t._pt&&t._ptCache||(t._ptCache={}))[e];if(!c)for(c=t._ptCache[e]=[],l=t._ptLookup,f=t._targets.length;f--;){if((u=l[f][e])&&u.d&&u.d._pt)for(u=u.d._pt;u&&u.p!==e&&u.fp!==e;)u=u._next;if(!u)return Wt=1,t.vars[e]="+=0",Ht(t,s),Wt=0,o?T(e+" not eligible for reset. Try splitting into individual properties"):1;c.push(u)}for(f=c.length;f--;)(u=(h=c[f])._pt||h).s=!i&&0!==i||n?u.s+(i||0)+a*u.c:i,u.c=r-u.s,h.e&&(h.e=ka(r)+_a(h.e)),h.b&&(h.b=u.s+_a(h.b))}(this,t,e,r,i,a,s,n)?this.resetTo(t,e,r,i,1):(La(this,0),this.parent||Aa(this._dp,this,"_first","_last",this._dp._sort?"_start":0),this.render(0))},e.kill=function kill(t,e){if(void 0===e&&(e="all"),!(t||e&&"all"!==e))return this._lazy=this._pt=0,this.parent?wb(this):this.scrollTrigger&&this.scrollTrigger.kill(!!I),this;if(this.timeline){var i=this.timeline.totalDuration();return this.timeline.killTweensOf(t,e,Zt&&!0!==Zt.vars.overwrite)._first||wb(this),this.parent&&i!==this.timeline.totalDuration()&&Ua(this,this._dur*this.timeline._tDur/i,0,1),this}var n,a,s,o,u,h,l,f=this._targets,c=t?Pt(t):f,d=this._ptLookup,p=this._pt;if((!e||"all"===e)&&function _arraysMatch(t,e){for(var r=t.length,i=r===e.length;i&&r--&&t[r]===e[r];);return r<0}(f,c))return"all"===e&&(this._pt=0),wb(this);for(n=this._op=this._op||[],"all"!==e&&(r(e)&&(u={},ja(e,function(t){return u[t]=1}),e=u),e=function _addAliasesToVars(t,e){var r,i,n,a,s=t[0]?ha(t[0]).harness:0,o=s&&s.aliases;if(!o)return e;for(i in r=bt({},e),o)if(i in r)for(n=(a=o[i].split(",")).length;n--;)r[a[n]]=r[i];return r}(f,e)),l=f.length;l--;)if(~c.indexOf(f[l]))for(u in a=d[l],"all"===e?(n[l]=e,o=a,s={}):(s=n[l]=n[l]||{},o=e),o)(h=a&&a[u])&&("kill"in h.d&&!0!==h.d.kill(u)||Ba(this,h,"_pt"),delete a[u]),"all"!==s&&(s[u]=1);return this._initted&&!this._pt&&p&&wb(this),this},Tween.to=function to(t,e,r){return new Tween(t,e,r)},Tween.from=function from(t,e){return Ya(1,arguments)},Tween.delayedCall=function delayedCall(t,e,r,i){return new Tween(e,0,{immediateRender:!1,lazy:!1,overwrite:!1,delay:t,onComplete:e,onReverseComplete:e,onCompleteParams:r,onReverseCompleteParams:r,callbackScope:i})},Tween.fromTo=function fromTo(t,e,r){return Ya(2,arguments)},Tween.set=function set(t,e){return e.duration=0,e.repeatDelay||(e.repeat=0),new Tween(t,e)},Tween.killTweensOf=function killTweensOf(t,e,r){return L.killTweensOf(t,e,r)},Tween}(qt);ta(te.prototype,{_targets:[],_lazy:0,_startAt:0,_op:0,_onInit:0}),ja("staggerTo,staggerFrom,staggerFromTo",function(r){te[r]=function(){var t=new Gt,e=Ct.call(arguments,0);return e.splice("staggerFromTo"===r?5:4,0,0),t[r].apply(t,e)}});function qc(t,e,r){return t.setAttribute(e,r)}function yc(t,e,r,i){i.mSet(t,e,i.m.call(i.tween,r,i.mt),i)}var ie=function _setterPlain(t,e,r){return t[e]=r},ae=function _setterFunc(t,e,r){return t[e](r)},se=function _setterFuncWithParam(t,e,r,i){return t[e](i.fp,r)},ue=function _getSetter(t,e){return s(t[e])?ae:u(t[e])&&t.setAttribute?qc:ie},fe=function _renderPlain(t,e){return e.set(e.t,e.p,Math.round(1e6*(e.s+e.c*t))/1e6,e)},de=function _renderBoolean(t,e){return e.set(e.t,e.p,!!(e.s+e.c*t),e)},pe=function _renderComplexString(t,e){var r=e._pt,i="";if(!t&&e.b)i=e.b;else if(1===t&&e.e)i=e.e;else{for(;r;)i=r.p+(r.m?r.m(r.s+r.c*t):Math.round(1e4*(r.s+r.c*t))/1e4)+i,r=r._next;i+=e.c}e.set(e.t,e.p,i,e)},_e=function _renderPropTweens(t,e){for(var r=e._pt;r;)r.r(t,r.d),r=r._next},ve=function _addPluginModifier(t,e,r,i){for(var n,a=this._pt;a;)n=a._next,a.p===i&&a.modifier(t,e,r),a=n},Te=function _killPropTweensOf(t){for(var e,r,i=this._pt;i;)r=i._next,i.p===t&&!i.op||i.op===t?Ba(this,i,"_pt"):i.dep||(e=1),i=r;return!e},be=function _sortPropTweensByPriority(t){for(var e,r,i,n,a=t._pt;a;){for(e=a._next,r=i;r&&r.pr>a.pr;)r=r._next;(a._prev=r?r._prev:n)?a._prev._next=a:i=a,(a._next=r)?r._prev=a:n=a,a=e}t._pt=i},we=(PropTween.prototype.modifier=function modifier(t,e,r){this.mSet=this.mSet||this.set,this.set=yc,this.m=t,this.mt=r,this.tween=e},PropTween);function PropTween(t,e,r,i,n,a,s,o,u){this.t=e,this.s=i,this.c=n,this.p=r,this.r=a||fe,this.d=s||this,this.set=o||ie,this.pr=u||0,(this._next=t)&&(t._prev=this)}ja(Tt+"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger,easeReverse",function(t){return dt[t]=1}),ht.TweenMax=ht.TweenLite=te,ht.TimelineLite=ht.TimelineMax=Gt,L=new Gt({sortChildren:!1,defaults:j,autoRemoveChildren:!0,id:"root",smoothChildTiming:!0}),Y.stringFilter=Ib;function Gc(t){return(Oe[t]||Me).map(function(t){return t()})}function Hc(){var t=Date.now(),o=[];2 { + value?: T; + defaultValue?: T; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function useControlledState( + props: CommonControlledStateProps & { + onChange?: (value: T, ...args: Rest) => void; + }, +): readonly [T, (next: T, ...args: Rest) => void] { + const { value, defaultValue, onChange } = props; + + const [state, setInternalState] = React.useState( + value !== undefined ? value : (defaultValue as T), + ); + + React.useEffect(() => { + if (value !== undefined) setInternalState(value); + }, [value]); + + const setState = React.useCallback( + (next: T, ...args: Rest) => { + setInternalState(next); + onChange?.(next, ...args); + }, + [onChange], + ); + + return [state, setState] as const; +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/hooks/use-is-in-view/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/hooks/use-is-in-view/index.tsx new file mode 100644 index 0000000..3738c56 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/hooks/use-is-in-view/index.tsx @@ -0,0 +1,25 @@ +import * as React from 'react'; +import { useInView, type UseInViewOptions } from 'motion/react'; + +interface UseIsInViewOptions { + inView?: boolean; + inViewOnce?: boolean; + inViewMargin?: UseInViewOptions['margin']; +} + +function useIsInView( + ref: React.Ref, + options: UseIsInViewOptions = {}, +) { + const { inView, inViewOnce = false, inViewMargin = '0px' } = options; + const localRef = React.useRef(null); + React.useImperativeHandle(ref, () => localRef.current as T); + const inViewResult = useInView(localRef, { + once: inViewOnce, + margin: inViewMargin, + }); + const isInView = !inView || inViewResult; + return { ref: localRef, isInView }; +} + +export { useIsInView, type UseIsInViewOptions }; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/lib/get-strict-context/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/lib/get-strict-context/index.tsx new file mode 100644 index 0000000..be139dc --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/lib/get-strict-context/index.tsx @@ -0,0 +1,36 @@ +import * as React from 'react'; + +function getStrictContext( + name?: string, +): readonly [ + ({ + value, + children, + }: { + value: T; + children?: React.ReactNode; + }) => React.JSX.Element, + () => T, +] { + const Context = React.createContext(undefined); + + const Provider = ({ + value, + children, + }: { + value: T; + children?: React.ReactNode; + }) => {children}; + + const useSafeContext = () => { + const ctx = React.useContext(Context); + if (ctx === undefined) { + throw new Error(`useContext must be used within ${name ?? 'a Provider'}`); + } + return ctx; + }; + + return [Provider, useSafeContext] as const; +} + +export { getStrictContext }; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/animate/slot/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/animate/slot/index.tsx new file mode 100644 index 0000000..07bfdcc --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/animate/slot/index.tsx @@ -0,0 +1,96 @@ +'use client'; + +import * as React from 'react'; +import { motion, isMotionComponent, type HTMLMotionProps } from 'motion/react'; +import { cn } from '@workspace/ui/lib/utils'; + +type AnyProps = Record; + +type DOMMotionProps = Omit< + HTMLMotionProps, + 'ref' +> & { ref?: React.Ref }; + +type WithAsChild = + | (Base & { asChild: true; children: React.ReactElement }) + | (Base & { asChild?: false | undefined }); + +type SlotProps = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + children?: any; +} & DOMMotionProps; + +function mergeRefs( + ...refs: (React.Ref | undefined)[] +): React.RefCallback { + return (node) => { + refs.forEach((ref) => { + if (!ref) return; + if (typeof ref === 'function') { + ref(node); + } else { + (ref as React.RefObject).current = node; + } + }); + }; +} + +function mergeProps( + childProps: AnyProps, + slotProps: DOMMotionProps, +): AnyProps { + const merged: AnyProps = { ...childProps, ...slotProps }; + + if (childProps.className || slotProps.className) { + merged.className = cn( + childProps.className as string, + slotProps.className as string, + ); + } + + if (childProps.style || slotProps.style) { + merged.style = { + ...(childProps.style as React.CSSProperties), + ...(slotProps.style as React.CSSProperties), + }; + } + + return merged; +} + +function Slot({ + children, + ref, + ...props +}: SlotProps) { + const isAlreadyMotion = + typeof children.type === 'object' && + children.type !== null && + isMotionComponent(children.type); + + const Base = React.useMemo( + () => + isAlreadyMotion + ? (children.type as React.ElementType) + : motion.create(children.type as React.ElementType), + [isAlreadyMotion, children.type], + ); + + if (!React.isValidElement(children)) return null; + + const { ref: childRef, ...childProps } = children.props as AnyProps; + + const mergedProps = mergeProps(childProps, props); + + return ( + , ref)} /> + ); +} + +export { + Slot, + type SlotProps, + type WithAsChild, + type DOMMotionProps, + type AnyProps, +}; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx new file mode 100644 index 0000000..5217634 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/buttons/ripple/index.tsx @@ -0,0 +1,144 @@ +'use client'; + +import * as React from 'react'; +import { motion, type HTMLMotionProps } from 'motion/react'; + +import { getStrictContext } from '@/registry/lib/get-strict-context'; +import { Slot, type WithAsChild } from '@/registry/primitives/animate/slot'; + +type Ripple = { + id: number; + x: number; + y: number; +}; + +type RippleButtonContextType = { + ripples: Ripple[]; + setRipples: (ripples: Ripple[]) => void; +}; + +const [RippleButtonProvider, useRippleButton] = + getStrictContext('RippleButtonContext'); + +type RippleButtonProps = WithAsChild< + HTMLMotionProps<'button'> & { + hoverScale?: number; + tapScale?: number; + } +>; + +function RippleButton({ + ref, + onClick, + hoverScale = 1.05, + tapScale = 0.95, + asChild = false, + style, + ...props +}: RippleButtonProps) { + const [ripples, setRipples] = React.useState([]); + const buttonRef = React.useRef(null); + React.useImperativeHandle(ref, () => buttonRef.current as HTMLButtonElement); + + const createRipple = React.useCallback( + (event: React.MouseEvent) => { + const button = buttonRef.current; + if (!button) return; + + const rect = button.getBoundingClientRect(); + const x = event.clientX - rect.left; + const y = event.clientY - rect.top; + + const newRipple: Ripple = { + id: Date.now(), + x, + y, + }; + + setRipples((prev) => [...prev, newRipple]); + + setTimeout(() => { + setRipples((prev) => prev.filter((r) => r.id !== newRipple.id)); + }, 600); + }, + [], + ); + + const handleClick = React.useCallback( + (event: React.MouseEvent) => { + createRipple(event); + if (onClick) { + onClick(event); + } + }, + [createRipple, onClick], + ); + + const Component = asChild ? Slot : motion.button; + + return ( + + + + ); +} + +type RippleButtonRipplesProps = WithAsChild< + HTMLMotionProps<'span'> & { + color?: string; + scale?: number; + } +>; + +function RippleButtonRipples({ + color = 'var(--ripple-button-ripple-color)', + scale = 10, + transition = { duration: 0.6, ease: 'easeOut' }, + asChild = false, + style, + ...props +}: RippleButtonRipplesProps) { + const { ripples } = useRippleButton(); + + const Component = asChild ? Slot : motion.span; + + return ripples.map((ripple) => ( + + )); +} + +export { + RippleButton, + RippleButtonRipples, + type RippleButtonProps, + type RippleButtonRipplesProps, +}; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx new file mode 100644 index 0000000..6975872 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/radix/switch/index.tsx @@ -0,0 +1,132 @@ +'use client'; + +import * as React from 'react'; +import { Switch as SwitchPrimitives } from 'radix-ui'; +import { + motion, + type TargetAndTransition, + type VariantLabels, + type HTMLMotionProps, + type LegacyAnimationControls, +} from 'motion/react'; + +import { getStrictContext } from '@/registry/lib/get-strict-context'; +import { useControlledState } from '@/registry/hooks/use-controlled-state'; + +type SwitchContextType = { + isChecked: boolean; + setIsChecked: (isChecked: boolean) => void; + isPressed: boolean; + setIsPressed: (isPressed: boolean) => void; +}; + +const [SwitchProvider, useSwitch] = + getStrictContext('SwitchContext'); + +type SwitchProps = Omit< + React.ComponentProps, + 'asChild' +> & + HTMLMotionProps<'button'>; + +function Switch(props: SwitchProps) { + const [isPressed, setIsPressed] = React.useState(false); + const [isChecked, setIsChecked] = useControlledState({ + value: props.checked, + defaultValue: props.defaultChecked, + onChange: props.onCheckedChange, + }); + + return ( + + + setIsPressed(true)} + onTapCancel={() => setIsPressed(false)} + onTap={() => setIsPressed(false)} + {...props} + /> + + + ); +} + +type SwitchThumbProps = Omit< + React.ComponentProps, + 'asChild' +> & + HTMLMotionProps<'div'> & { + pressedAnimation?: + | TargetAndTransition + | VariantLabels + | boolean + | LegacyAnimationControls; + }; + +function SwitchThumb({ + pressedAnimation, + transition = { type: 'spring', stiffness: 300, damping: 25 }, + ...props +}: SwitchThumbProps) { + const { isPressed } = useSwitch(); + + return ( + + + + ); +} + +type SwitchIconPosition = 'left' | 'right' | 'thumb'; + +type SwitchIconProps = HTMLMotionProps<'div'> & { + position: SwitchIconPosition; +}; + +function SwitchIcon({ + position, + transition = { type: 'spring', bounce: 0 }, + ...props +}: SwitchIconProps) { + const { isChecked } = useSwitch(); + + const isAnimated = React.useMemo(() => { + if (position === 'right') return !isChecked; + if (position === 'left') return isChecked; + if (position === 'thumb') return true; + return false; + }, [position, isChecked]); + + return ( + + ); +} + +export { + Switch, + SwitchThumb, + SwitchIcon, + useSwitch, + type SwitchProps, + type SwitchThumbProps, + type SwitchIconProps, + type SwitchIconPosition, + type SwitchContextType, +}; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx new file mode 100644 index 0000000..d3e4310 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/counting-number/index.tsx @@ -0,0 +1,119 @@ +'use client'; + +import * as React from 'react'; +import { useMotionValue, useSpring, type SpringOptions } from 'motion/react'; + +import { + useIsInView, + type UseIsInViewOptions, +} from '@/registry/hooks/use-is-in-view'; + +type CountingNumberProps = Omit, 'children'> & { + number: number; + fromNumber?: number; + padStart?: boolean; + decimalSeparator?: string; + decimalPlaces?: number; + transition?: SpringOptions; + delay?: number; + initiallyStable?: boolean; +} & UseIsInViewOptions; + +function CountingNumber({ + ref, + number, + fromNumber = 0, + padStart = false, + inView = false, + inViewMargin = '0px', + inViewOnce = true, + decimalSeparator = '.', + transition = { stiffness: 90, damping: 50 }, + decimalPlaces = 0, + delay = 0, + initiallyStable = false, + ...props +}: CountingNumberProps) { + const { ref: localRef, isInView } = useIsInView( + ref as React.Ref, + { + inView, + inViewOnce, + inViewMargin, + }, + ); + + const numberStr = number.toString(); + const decimals = + typeof decimalPlaces === 'number' + ? decimalPlaces + : numberStr.includes('.') + ? (numberStr.split('.')[1]?.length ?? 0) + : 0; + + const motionVal = useMotionValue(initiallyStable ? number : fromNumber); + const springVal = useSpring(motionVal, transition); + + React.useEffect(() => { + const timeoutId = setTimeout(() => { + if (isInView) motionVal.set(number); + }, delay); + + return () => clearTimeout(timeoutId); + }, [isInView, number, motionVal, delay]); + + React.useEffect(() => { + const unsubscribe = springVal.on('change', (latest) => { + if (localRef.current) { + let formatted = + decimals > 0 + ? latest.toFixed(decimals) + : Math.round(latest).toString(); + + if (decimals > 0) { + formatted = formatted.replace('.', decimalSeparator); + } + + if (padStart) { + const finalIntLength = Math.floor(Math.abs(number)).toString().length; + const [intPart, fracPart] = formatted.split(decimalSeparator); + const paddedInt = intPart?.padStart(finalIntLength, '0') ?? ''; + formatted = fracPart + ? `${paddedInt}${decimalSeparator}${fracPart}` + : paddedInt; + } + + localRef.current.textContent = formatted; + } + }); + return () => unsubscribe(); + }, [springVal, decimals, padStart, number, decimalSeparator, localRef]); + + const finalIntLength = Math.floor(Math.abs(number)).toString().length; + + const formatValue = (val: number) => { + let out = decimals > 0 ? val.toFixed(decimals) : Math.round(val).toString(); + if (decimals > 0) out = out.replace('.', decimalSeparator); + if (padStart) { + const [intPart, fracPart] = out.split(decimalSeparator); + const paddedInt = (intPart ?? '').padStart(finalIntLength, '0'); + out = fracPart ? `${paddedInt}${decimalSeparator}${fracPart}` : paddedInt; + } + return out; + }; + + const zeroText = padStart + ? '0'.padStart(finalIntLength, '0') + + (decimals > 0 ? decimalSeparator + '0'.repeat(decimals) : '') + : '0' + (decimals > 0 ? decimalSeparator + '0'.repeat(decimals) : ''); + + const initialText = initiallyStable ? formatValue(number) : zeroText; + + return ( + + {initialText} + + ); +} + +export { CountingNumber, type CountingNumberProps }; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx new file mode 100644 index 0000000..5700bc7 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/highlight/index.tsx @@ -0,0 +1,60 @@ +'use client'; + +import * as React from 'react'; +import { motion, type HTMLMotionProps } from 'motion/react'; + +import { + useIsInView, + type UseIsInViewOptions, +} from '@/registry/hooks/use-is-in-view'; + +type HighlightTextProps = Omit, 'children'> & { + text: string; + delay?: number; +} & UseIsInViewOptions; + +function HighlightText({ + ref, + text, + style, + inView = false, + inViewMargin = '0px', + inViewOnce = true, + transition = { duration: 2, ease: 'easeInOut' }, + delay = 0, + ...props +}: HighlightTextProps) { + const { ref: localRef, isInView } = useIsInView( + ref as React.Ref, + { + inView, + inViewOnce, + inViewMargin, + }, + ); + + return ( + + {text} + + ); +} + +export { HighlightText, type HighlightTextProps }; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx new file mode 100644 index 0000000..b7f836e --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/animate-ui/apps/www/registry/primitives/texts/typing/index.tsx @@ -0,0 +1,183 @@ +'use client'; + +import * as React from 'react'; +import { motion, type HTMLMotionProps } from 'motion/react'; + +import { + useIsInView, + type UseIsInViewOptions, +} from '@/registry/hooks/use-is-in-view'; +import { getStrictContext } from '@/registry/lib/get-strict-context'; + +type TypingTextContextType = { + isTyping: boolean; + setIsTyping: (isTyping: boolean) => void; +}; + +const [TypingTextProvider, useTypingText] = + getStrictContext('TypingTextContext'); + +type TypingTextProps = React.ComponentProps<'span'> & { + duration?: number; + delay?: number; + loop?: boolean; + holdDelay?: number; + text: string | string[]; +} & UseIsInViewOptions; + +function TypingText({ + ref, + children, + duration = 100, + delay = 0, + inView = false, + inViewMargin = '0px', + inViewOnce = true, + loop = false, + holdDelay = 1000, + text, + ...props +}: TypingTextProps) { + const { ref: localRef, isInView } = useIsInView( + ref as React.Ref, + { + inView, + inViewOnce, + inViewMargin, + }, + ); + + const [isTyping, setIsTyping] = React.useState(false); + const [started, setStarted] = React.useState(false); + const [displayedText, setDisplayedText] = React.useState(''); + + React.useEffect(() => { + if (isInView) { + const timeoutId = setTimeout(() => { + setStarted(true); + }, delay); + return () => clearTimeout(timeoutId); + } + }, [isInView, delay]); + + React.useEffect(() => { + if (!started) return; + + const timeoutIds: Array> = []; + const texts: string[] = typeof text === 'string' ? [text] : text; + + const typeText = (str: string, onComplete: () => void) => { + setIsTyping(true); + let currentIndex = 0; + const type = () => { + if (currentIndex <= str.length) { + setDisplayedText(str.substring(0, currentIndex)); + currentIndex++; + const id = setTimeout(type, duration); + timeoutIds.push(id); + } else { + setIsTyping(false); + onComplete(); + } + }; + type(); + }; + + const eraseText = (str: string, onComplete: () => void) => { + setIsTyping(true); + let currentIndex = str.length; + const erase = () => { + if (currentIndex >= 0) { + setDisplayedText(str.substring(0, currentIndex)); + currentIndex--; + const id = setTimeout(erase, duration); + timeoutIds.push(id); + } else { + setIsTyping(false); + onComplete(); + } + }; + erase(); + }; + + const animateTexts = (index: number) => { + typeText(texts[index] ?? '', () => { + const isLast = index === texts.length - 1; + if (isLast && !loop) { + return; + } + const id = setTimeout(() => { + eraseText(texts[index] ?? '', () => { + const nextIndex = isLast ? 0 : index + 1; + animateTexts(nextIndex); + }); + }, holdDelay); + timeoutIds.push(id); + }); + }; + + animateTexts(0); + + return () => { + timeoutIds.forEach(clearTimeout); + }; + }, [text, duration, started, loop, holdDelay]); + + return ( + + + {displayedText} + {children} + + + ); +} + +type TypingTextCursorProps = Omit, 'children'>; + +function TypingTextCursor({ + style, + variants, + ...props +}: TypingTextCursorProps) { + const { isTyping } = useTypingText(); + + return ( + + ); +} + +export { + TypingText, + TypingTextCursor, + type TypingTextProps, + type TypingTextCursorProps, +}; diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/LICENSE b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/LICENSE new file mode 100644 index 0000000..ae06b37 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/LICENSE @@ -0,0 +1,190 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to the Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by the Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding any notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2026 HeyGen, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/animated-bar-chart.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/animated-bar-chart.html new file mode 100644 index 0000000..71b5b93 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/animated-bar-chart.html @@ -0,0 +1,98 @@ + + +
    +
    +
    +

    Animated Bar Chart

    +

    A compact data card with deterministic bar growth and value callouts.

    +
    + +42% +
    +
    + +
    + + + +
    + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/demo.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/demo.html new file mode 100644 index 0000000..16e6014 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/demo.html @@ -0,0 +1,176 @@ + + + + + + Animated Bar Chart - Demo + + + + +
    +
    +
    +
    +
    +

    Animated Bar Chart

    +

    A compact data card with deterministic bar growth and value callouts.

    +
    + +42% +
    +
    + +
    + +
    +
    + +
    + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/registry-item.json b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/registry-item.json new file mode 100644 index 0000000..88073a8 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/animated-bar-chart/registry-item.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/registry-item.json", + "name": "animated-bar-chart", + "type": "hyperframes:component", + "title": "Animated Bar Chart", + "description": "A compact data card with deterministic bar growth and value callouts.", + "tags": ["data"], + "files": [ + { + "path": "animated-bar-chart.html", + "target": "compositions/components/animated-bar-chart.html", + "type": "hyperframes:snippet" + } + ], + "preview": { + "poster": "https://static.heygen.ai/hyperframes-oss/docs/images/catalog/components/animated-bar-chart.png" + } +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/README.md b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/README.md new file mode 100644 index 0000000..d41dda1 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/README.md @@ -0,0 +1,53 @@ +# modal-morph + +The shared-element grow (Wave M9 experiment): a small card expands into a full panel with its children re-flowing continuously. FLIP-style: both layouts are real DOM measured exactly once at mount; the morph interpolates the container rect and applies it as transform only (translate + scaleX/scaleY, never width/height tweens) while keyed children counter-scale against the container and travel onto the lerp of their own two measured rects, all as pure functions of timeline time. + +4s authored, elastic HOLD, exit `none` by default. + +## Variables + +| id | type | default | notes | +| ------------ | ------ | ------- | ------------------------------------------------------------------------------------------------------------------- | +| `from_scale` | number | `1` | Multiplies the authored card footprint before the one-time measurement, clamped 0.5 to 1.5. | +| `expand_at` | number | `1.2` | Seconds after mount when the grow begins. | +| `register` | enum | `calm` | `calm` is a smooth inOut cubic; `snappy` is faster with a settle that never overshoots the target rect beyond 1.02. | +| `accent` | enum | `green` | green rides `--brand`, blue rides `--accent`, violet rides `--accent-2`. | +| `exit` | enum | `none` | `none` holds until the cut; `fade` departs opacity-only; `up` rises out. | + +## Card content slot + +Place an inert template anywhere in the HOST page: + +```html + +``` + +The slot content is cloned into BOTH the card body and the panel head, so every `data-morph-key` has a measured rect in each layout and re-flows between them during the morph. Slot content without any keys is wrapped and morphs as one block. With no slot, the primitive renders token defaults (accent dot, display title line, mono meta line) that re-flow from a stacked card to an inline panel header row. + +Panel furniture (skeleton tile grid, footer chips) is panel-only and fades up over the back half of the morph. + +## Mount + +```html +
    +``` + +Elastic root: no `data-width`/`data-height`; it fills whatever box the host clip gives it. Timeline registers under the literal `modal-morph` key. + +## Notes + +- The FLIP law: measure once, then transform-only. Container scale is `lerpRect(card, panel, ease(p))` against the panel's natural size; each matched child sets `scale = want / (home * containerScale)` and a translate expressed in the scaled container space, so content re-flows instead of stretching. +- The card and panel are separate authored layers that crossfade in the first 30% of the morph (both run the same rect math, mirrored), so each endpoint is pixel-crisp in its own styling. +- `snappy` uses a back-out ease with c1 = 0.7 (analytic peak 1.0176 of the rect delta), under the 1.02 cap. +- Deterministic: no Math.random, no wall clock, no incremental state; measurement happens synchronously at mount and every later frame is recomputed from `tl.time()` alone, so eventful seeks land identical frames in any order and either direction. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/demo.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/demo.html new file mode 100644 index 0000000..09d3c2c --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/demo.html @@ -0,0 +1,86 @@ + + + + + + + Modal Morph Demo + + + +
    + +
    + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/modal-morph.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/modal-morph.html new file mode 100644 index 0000000..9d6bb7d --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/modal-morph.html @@ -0,0 +1,522 @@ + + + + + + Modal Morph + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/registry-item.json b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/registry-item.json new file mode 100644 index 0000000..d66ac0a --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/modal-morph/registry-item.json @@ -0,0 +1,84 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/registry-item.json", + "name": "modal-morph", + "type": "hyperframes:component", + "title": "Modal Morph", + "description": "A small card expands into a full panel, shared-element style: both layouts measured once at mount, the container morphs by transform only (never width/height tweens) while keyed children counter-scale and re-flow onto their own measured targets as pure functions of time.", + "tags": [ + "motion-primitive", + "structure", + "flip", + "shared-element", + "modal", + "deterministic", + "experiment" + ], + "jobs": ["demonstrate"], + "family": "structure", + "profile": "shared-element", + "evidence": "Wave M9 experiment: the FLIP shared-element grow (Codrops recipes, wild-scout)", + "syncPoints": [{ "id": "expand", "phase": "in", "offset": 1.2 }], + "files": [ + { + "path": "modal-morph.html", + "target": "compositions/components/modal-morph.html", + "type": "hyperframes:snippet" + } + ], + "variables": [ + { + "id": "from_scale", + "type": "number", + "role": "style", + "label": "From scale", + "description": "Multiplies the authored card footprint, clamped 0.5 to 1.5.", + "default": 1 + }, + { + "id": "expand_at", + "type": "number", + "role": "timing", + "label": "Expand at", + "description": "Seconds after mount when the card grows into the panel.", + "default": 1.2 + }, + { + "id": "register", + "type": "enum", + "role": "timing", + "label": "Register", + "description": "Morph feel. Snappy is faster with a settle capped at 1.02 of the target rect.", + "default": "calm", + "options": [ + { "value": "calm", "label": "Calm" }, + { "value": "snappy", "label": "Snappy" } + ] + }, + { + "id": "accent", + "type": "enum", + "role": "style", + "label": "Accent", + "description": "Accent color: green rides --brand, blue rides --accent, violet rides --accent-2.", + "default": "green", + "options": [ + { "value": "green", "label": "Green" }, + { "value": "blue", "label": "Blue" }, + { "value": "violet", "label": "Violet" } + ] + }, + { + "id": "exit", + "type": "enum", + "role": "timing", + "label": "Exit", + "description": "Optional departure. Default none: the settled panel holds until the frame cuts.", + "default": "none", + "options": [ + { "value": "none", "label": "None" }, + { "value": "fade", "label": "Fade" }, + { "value": "up", "label": "Up" } + ] + } + ] +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/README.md b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/README.md new file mode 100644 index 0000000..dc6f34c --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/README.md @@ -0,0 +1,42 @@ +# notification-stack + +Product-demo primitive: 1 to 5 token notification cards (accent icon dot, +title, one body line) slide-settle into a vertical stack on cues, newest on +top. Each new card drops into the top slot with a fade and a smooth long-tail +settle while the cards already present shift down one slot. After the last +card lands, one card (the `expand` index) grows slightly and brightens to +resolve as the focus while the rest dim by stack position (deeper cards dim +more). Then the frame holds perfectly still. + +Authored at 4s with an elastic HOLD: arrivals plus the resolve are fixed, +everything after is still frame until the (optional) exit. Type sizes ride +`cqmin` with card-height caps so the stack stays readable at 1920x1080 and +legible when the stage is mounted small. + +## Variables + +| id | type | default | notes | +| -------- | ---------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `titles` | string | `Build queued,Checks passed,Deploy live` | Comma list of card titles, 1 to 5 cards; extras past 5 are dropped. | +| `bodies` | string | `Pipeline started for main,All 42 checks green,Now serving version 2.4` | Comma list of body lines matched to titles by index. A missing or blank entry hides that card's body line. | +| `expand` | number -1 to 4 | `-1` | Index of the focus card in the `titles` list. `-1` (or any out-of-range value) focuses the newest card, which sits on top of the stack. | +| `cues` | string | `""` | Comma-separated per-card arrival times in seconds relative to mount start. Blank or invalid entries fall back to that card's default rhythm slot (~0.55s gap). Times are kept non-decreasing and clamped so every card lands before the resolve. | +| `accent` | enum `green` \| `blue` \| `violet` | `green` | Icon dot family: green rides `--brand`, blue `--accent`, violet `--accent-2`. | +| `exit` | enum `none` \| `fade` \| `up` | `none` | Frame roots own transitions; the default hold ends the film. | + +## Usage + +```html +
    +``` + +Golden refs: scramble-reveal (token consumption), grid-card-assemble +(stagger and dim discipline), toggle-flip (mount-contract structure). diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/demo.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/demo.html new file mode 100644 index 0000000..834d6ef --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/demo.html @@ -0,0 +1,93 @@ + + + + + + + notification-stack Demo + + + +
    +
    +
    + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/notification-stack.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/notification-stack.html new file mode 100644 index 0000000..b28e407 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/notification-stack.html @@ -0,0 +1,387 @@ + + + + + + Notification Stack + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/registry-item.json b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/registry-item.json new file mode 100644 index 0000000..57bfae3 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/notification-stack/registry-item.json @@ -0,0 +1,83 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/registry-item.json", + "name": "notification-stack", + "type": "hyperframes:component", + "title": "Notification Stack", + "description": "1 to 5 token notification cards slide-settle into a vertical stack on cues, newest on top; one card grows slightly and brightens as the focus while the rest dim by position.", + "tags": ["motion-primitive", "product-demo", "notification", "stack", "stagger"], + "jobs": ["demonstrate"], + "family": "product-demo", + "profile": "stack", + "evidence": "Wave J J2-9: product-demo notification unit per the Wave J2 shelf expansion", + "syncPoints": [{ "id": "stack-resolved", "phase": "in", "offset": 2.45 }], + "files": [ + { + "path": "notification-stack.html", + "target": "compositions/components/notification-stack.html", + "type": "hyperframes:snippet" + } + ], + "variables": [ + { + "id": "titles", + "type": "string", + "role": "content", + "label": "Titles", + "description": "Comma-separated card titles (1 to 5 cards).", + "default": "Build queued,Checks passed,Deploy live" + }, + { + "id": "bodies", + "type": "string", + "role": "content", + "label": "Bodies", + "description": "Comma-separated body lines matched to titles by index. Blank entries hide that body line.", + "default": "Pipeline started for main,All 42 checks green,Now serving version 2.4" + }, + { + "id": "expand", + "type": "number", + "role": "content", + "label": "Expand", + "description": "Index of the focus card in the titles list. -1 focuses the newest card (top of the stack).", + "default": -1, + "min": -1, + "max": 4, + "step": 1 + }, + { + "id": "cues", + "type": "string", + "role": "timing", + "label": "Cues", + "description": "Comma-separated per-card arrival times in seconds. Blank entries use the default rhythm.", + "default": "" + }, + { + "id": "accent", + "type": "enum", + "role": "style", + "label": "Accent", + "description": "Accent token family used by the icon dots.", + "default": "green", + "options": [ + { "value": "green", "label": "Green" }, + { "value": "blue", "label": "Blue" }, + { "value": "violet", "label": "Violet" } + ] + }, + { + "id": "exit", + "type": "enum", + "role": "timing", + "label": "Exit", + "description": "How the stack leaves the frame. Default none: the hold ends the film.", + "default": "none", + "options": [ + { "value": "none", "label": "None" }, + { "value": "fade", "label": "Fade" }, + { "value": "up", "label": "Up" } + ] + } + ] +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/demo.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/demo.html new file mode 100644 index 0000000..d3bc015 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/demo.html @@ -0,0 +1,154 @@ + + + + + + Onboarding Stepper Flow - Demo + + + + +
    +
    +
    +
    + 123 +
    +
    + Step 2 of 3 + Choose your visual style +

    Pick a direction so the agent can generate matching motion primitives.

    + +
    +
    +
    + +
    + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html new file mode 100644 index 0000000..f9cbb0a --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/onboarding-stepper-flow.html @@ -0,0 +1,92 @@ + + +
    +
    + 123 +
    +
    + Step 2 of 3 + Choose your visual style +

    Pick a direction so the agent can generate matching motion primitives.

    + +
    +
    + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/registry-item.json b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/registry-item.json new file mode 100644 index 0000000..8781300 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/onboarding-stepper-flow/registry-item.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/registry-item.json", + "name": "onboarding-stepper-flow", + "type": "hyperframes:component", + "title": "Onboarding Stepper Flow", + "description": "A composed onboarding flow with milestone rail, active step card, and next-action button", + "tags": ["ui-flow", "onboarding", "stepper"], + "files": [ + { + "path": "onboarding-stepper-flow.html", + "target": "compositions/components/onboarding-stepper-flow.html", + "type": "hyperframes:snippet" + } + ], + "preview": { + "poster": "https://static.heygen.ai/hyperframes-oss/docs/images/catalog/components/onboarding-stepper-flow.png" + } +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/README.md b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/README.md new file mode 100644 index 0000000..70be7b4 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/README.md @@ -0,0 +1,82 @@ +# press-ripple + +Product demo payoff primitive: a cursor decel-arrives from off-stage (power3.out, +it arrives, it never passes through), lands a few px off-center on a +caller-positioned target zone, target and cursor compress in lockstep, two small +click rings grow from the cursor tip while the label swaps to a check plus +`done_label`, then the cursor exits off-stage the way it came. The confirmed +state holds dead-still to the end of the clip; the cursor never occludes the +label during the hold. 2.4s authored, elastic HOLD (never time-scaled). + +## Mounting + +```html +
    +``` + +## Variables + +| id | type | default | notes | +| ---------- | ------ | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| label | string | "Get started" | Text in the default pill. Ignored when the slot is replaced. | +| done_label | string | "Saved" | Text beside the check once the default pill is pressed. Keep it no wider than `label`; the pill keeps the label's width. | +| target_x | number | 50 | Zone center, percent of host width (8 to 92). | +| target_y | number | 50 | Zone center, percent of host height (8 to 92). | +| press_at | number | 0.9 | Seconds from mount start when the compression begins. Clamped so the press tail (release, rings, cursor exit, 0.8s) and any exit stay inside the clip duration. | +| cursor | enum | light | light (white pointer, dark stroke) or dark (inverse). | +| accent | enum | green | green maps to --brand, blue to --accent, violet to --accent-2. Colors the click rings and the confirmation check. | +| exit | enum | none | none holds the pressed state (frame roots own transitions); fade or up add a 0.45s departure. | + +## Target slot + +The element marked `data-slot="target"` is the press surface. Its default child +is a token-styled pill (`--surface` body, `--border` edge, `--font-body` at +weight 600) carrying `label`, and a check plus `done_label` layered over it. +The pill keeps its fill when pressed; only the label changes. Replace the slot's children in your installed copy +to press anything else: an icon button, a card, a toggle. + +The slot wrapper flips `data-state="idle"` to `data-state="pressed"` at the +press (seek-safe: scrubbing backwards restores idle). Custom slot content can +key its own pressed look off that attribute, mirroring the default rule: + +```css +.pr-target-slot[data-state="pressed"] .my-thing { + /* pressed look */ +} +``` + +## Choreography + +- 0.00s: target settles in (fade + short rise, power3.out). +- press_at - 0.6s: cursor departs off-stage bottom-right (0.45s, power3.out), + tip landing slightly below-right of the zone center (human aim), then a + 0.15s dwell. +- press_at: target and cursor compress to 0.93 in lockstep (cursor scales + about its tip). +- press_at + 0.12s: pressed state lands; release springs back (back.out). Two + 2px accent rings grow from the cursor tip, 16px to 72px radius at 1920 wide + (320ms, power2.out), the second 60ms behind at 60% opacity. The label swaps + to a check plus `done_label` (scale 0.3 to 1, blur 3px to 0, 300ms). +- press_at + 0.4s: the cursor exits off-stage bottom-right (0.4s, power2.in, + accelerating away), clearing the label before the hold begins. +- HOLD: dead still on the confirmed state, elastic with the clip duration, + cursor gone. + +Sync point `press` fires the moment compression starts; align SFX or a +downstream reveal to it. + +## Known tripwire + +The bundler mirrors composition variables as scoped CSS custom properties, so +this unit's own `accent` variable becomes `--accent: blue` inside its subtree, +shadowing the contract token (and `blue` is a valid CSS color). The script +detects the shadow and substitutes the literal contract fallback for the blue +mapping, so `accent: "blue"` renders the soft contract blue, not pure blue. diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/demo.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/demo.html new file mode 100644 index 0000000..642ab65 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/demo.html @@ -0,0 +1,83 @@ + + + + + + + press-ripple Demo + + + +
    +
    +
    + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/press-ripple.html b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/press-ripple.html new file mode 100644 index 0000000..41f2d38 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/press-ripple.html @@ -0,0 +1,434 @@ + + + + + + Press Ripple + + + + + diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/registry-item.json b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/registry-item.json new file mode 100644 index 0000000..b26bcbe --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/press-ripple/registry-item.json @@ -0,0 +1,112 @@ +{ + "$schema": "https://hyperframes.heygen.com/schema/registry-item.json", + "name": "press-ripple", + "type": "hyperframes:component", + "title": "Press Ripple", + "description": "A cursor decel-arrives from off-stage, lands slightly off-center on a caller-positioned target, compresses with it in lockstep, releases with two small click rings while the label swaps to a check, then exits off-stage while the confirmed state holds.", + "tags": ["cursor", "motion-primitive", "product-demo", "press", "ripple", "payoff"], + "jobs": ["demonstrate"], + "family": "product-demo", + "profile": "payoff", + "evidence": "Wave J J1-1: the recurring launch-film press mechanic (decelerating cursor arrival, lockstep compression, ink ripple release) generalized behind a target slot", + "syncPoints": [{ "id": "press", "phase": "in", "offset": 0.9 }], + "files": [ + { + "path": "press-ripple.html", + "target": "compositions/components/press-ripple.html", + "type": "hyperframes:snippet" + } + ], + "variables": [ + { + "id": "label", + "type": "string", + "role": "content", + "label": "Label", + "description": "Text inside the default pill target.", + "default": "Get started" + }, + { + "id": "done_label", + "type": "string", + "role": "content", + "label": "Done label", + "description": "Text beside the check once the default pill is pressed.", + "default": "Saved" + }, + { + "id": "target_x", + "type": "number", + "role": "layout", + "label": "Target X", + "description": "Zone center, percent of host width.", + "default": 50, + "min": 8, + "max": 92, + "step": 1, + "unit": "%" + }, + { + "id": "target_y", + "type": "number", + "role": "layout", + "label": "Target Y", + "description": "Zone center, percent of host height.", + "default": 50, + "min": 8, + "max": 92, + "step": 1, + "unit": "%" + }, + { + "id": "press_at", + "type": "number", + "role": "timing", + "label": "Press at", + "description": "Seconds from mount start when the press begins.", + "default": 0.9, + "min": 0.9, + "max": 10, + "step": 0.1, + "unit": "s" + }, + { + "id": "cursor", + "type": "enum", + "role": "style", + "label": "Cursor", + "description": "Pointer tone.", + "default": "light", + "options": [ + { "value": "light", "label": "Light" }, + { "value": "dark", "label": "Dark" } + ] + }, + { + "id": "accent", + "type": "enum", + "role": "style", + "label": "Accent", + "description": "Contract color for the click rings and the confirmation check.", + "default": "green", + "options": [ + { "value": "green", "label": "Green" }, + { "value": "blue", "label": "Blue" }, + { "value": "violet", "label": "Violet" } + ] + }, + { + "id": "exit", + "type": "enum", + "role": "style", + "label": "Exit", + "description": "How the frame leaves. None holds the pressed state.", + "default": "none", + "options": [ + { "value": "none", "label": "None" }, + { "value": "fade", "label": "Fade" }, + { "value": "up", "label": "Fade up" } + ] + } + ] +} diff --git a/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/README.md b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/README.md new file mode 100644 index 0000000..a0560b0 --- /dev/null +++ b/produktionsvorgaben/gestaltung/library-quellen/public/sources/hyperframes/registry/components/screen-flow-carousel/README.md @@ -0,0 +1,52 @@ +# screen-flow-carousel + +Two to five app screens ride a horizontal rail. One screen is primary at center while its neighbors recede (smaller and dimmer). On each cue the whole rail advances one screen with a velocity-matched throw: a fast lateral translate that sheds speed quickly, then a smooth long-tail catch onto the next center (the velocity-throw-snap motion law with the snap softened to the smooth register: no overshoot, both sides always moving the same direction). A mono caption under the rail swaps with each advance. + +5s authored, elastic HOLD, exit `none` by default. + +## Variables + +| id | type | default | notes | +| ---------- | ------ | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `screens` | number | `3` | 2 to 5 screens on the rail. | +| `captions` | string | `""` | Comma-separated caption per screen. Blank entries use the authored defaults (Overview, Details, Insights, Activity, Settings). | +| `cues` | string | `""` | Comma-separated advance times in seconds from mount start (`screens - 1` advances). Blank entries use the authored even rhythm; values are clamped inside the hold and kept far enough apart that throws never overlap. | +| `accent` | enum | `green` | Active ring, caption dot, and skeleton accents: green rides `--brand`, blue rides `--accent`, violet rides `--accent-2`. | +| `exit` | enum | `none` | `none` holds the final screen until the cut; `fade` departs opacity-only; `up` fades while rising. | + +## Screen slots + +Screens are slots. Place inert templates anywhere in the HOST page (templates never render, and the runtime wipes the host clip's own children on mount, so slots live at document level): + +```html + + +``` + +Slot content may be an ``, a muted `