Laufender Betrieb
Zeitsteuerung, Protokoll, Makros, config.json, Systemaufgaben und häufige Fragen.
- Zeitsteuerung der Module (allgemein)
- Log Informationen
- Makros
- Anpassungen über die config.json
- Wartung und Systemaufgaben
- Häufige Fragen
Zeitsteuerung der Module (allgemein)
Jedes Modul bringt Aufgaben mit, die in Abständen laufen — Artikel exportieren, Bestellungen holen, Mails ablegen. Verwaltet werden sie in der Zeitsteuerung. Diese Seite beschreibt, was für alle Module gilt; welche Aufgaben es gibt, steht im Handbuch des jeweiligen Moduls.
Die Tabelle
| Spalte | Inhalt |
|---|---|
| Timer | Name der Aufgabe, gruppiert nach Bereich |
| letzte Ausführung | Uhrzeit, oder läuft… bzw. warten… |
| nächste Ausführung | Uhrzeit des nächsten Starts |
| Intervall | der eingestellte Abstand |
| ▶ | startet die Aufgabe sofort |
| Kategorie | Untergruppe der Aufgabe |
Über Aktualisieren wird die Ansicht neu geladen; sie aktualisiert sich außerdem selbst.
Steht in der Spalte Intervall 00:00:00, ist die Aufgabe nicht eingeplant. Sie läuft dann nur, wenn sie von Hand gestartet wird.
Intervall einstellen
Ein Klick auf die Uhrzeit in der Spalte Intervall öffnet die Eingabe.
Eingegeben wird eine Zeitspanne in Stunden : Minuten : Sekunden.
| Eingabe | Bedeutung | mit Feste Zeit |
|---|---|---|
00:15:00 |
alle 15 Minuten | täglich 0:15 Uhr |
01:00:00 |
jede Stunde | täglich 1:00 Uhr |
05:00:00 |
alle 5 Stunden | täglich 5:00 Uhr |
Feste Zeit
Ohne den Haken ist die Angabe ein Abstand, mit dem Haken eine Uhrzeit.
Für große Läufe — ein Vollexport aller Artikel — ist die feste Zeit der richtige Weg: einmal nachts, statt tagsüber alle paar Stunden.
Parallel ausführen
Normalerweise läuft immer nur eine Aufgabe. Ist eine andere aktiv, wartet die nächste und zeigt warten…, bis sie an die Reihe kommt.
Mit dem Haken Parallel ausführen überspringt eine Aufgabe dieses Warten und läuft gleichzeitig mit anderen.
Das ist Absicht und keine Einschränkung: Zwei Läufe, die dieselben Artikel schreiben, würden sich ins Gehege kommen. Die Warteschlange verhindert das.
Parallel gehört nur dort eingeschaltet, wo eine Aufgabe kurz ist und andere Daten anfasst — etwa der Abruf von Bestellungen, während nachts Artikel exportiert werden. Bei zwei Läufen auf denselben Daten führt es zu Fehlern, die schwer zu deuten sind.
Die Symbole
| Symbol | Bedeutung |
|---|---|
| Pfeil im Kreis | Abstand |
| Uhr | feste Zeit |
| Unendlich-Zeichen | parallel |
Zeitsteuerung ein- und ausschalten
Der Haken Aktiv in der Überschrift gilt für alle Module dieser Installation.
Ausgeschaltet läuft keine Aufgabe mehr — und Änderungen an den Intervallen sind gesperrt. Das ist der Schalter für Wartungsarbeiten, nicht für den Dauerbetrieb.
Ein Start über ▶ funktioniert trotzdem. Manuelle Läufe sind von Aktiv und vom Zeitfenster nicht betroffen.
Zeitfenster: Von und Bis
Neben Aktiv stehen zwei Felder, Von und Bis. Sind sie gefüllt, laufen die geplanten Aufgaben nur innerhalb dieser Zeitspanne.
Damit lässt sich der Betrieb auf die Geschäftszeiten begrenzen — oder umgekehrt aus ihnen heraushalten, wenn die Datenbank tagsüber für die SelectLine frei bleiben soll.
Ein Fenster über Mitternacht wirkt nicht. Bei Von 22:00 und Bis 06:00 wird die Einschränkung übergangen und alle Aufgaben laufen wie ohne Fenster. Für nachts gehört das Fenster deshalb innerhalb eines Tages angegeben, etwa Von 00:00 Bis 06:00.
Die Felder erscheinen nur in der Zeitsteuerung unter SelectLine. Das Fenster gilt aber für alle Module.
Von Hand starten
Die Schaltfläche ▶ startet eine Aufgabe sofort — unabhängig von Intervall, Aktiv und Zeitfenster. Während sie läuft, ist sie ausgegraut.
Der manuelle Start umgeht auch die Warteschlange. Zwei große Läufe gehören deshalb nicht gleichzeitig von Hand gestartet.
Welche Daten eine Aufgabe berücksichtigt
Das hängt von der Aufgabe ab. Grob gilt:
| Art der Aufgabe | Berücksichtigt |
|---|---|
| Stammdaten synchronisieren, Extratabellen exportieren, Artikelgruppen exportieren, Bestand komplett, Kunden exportieren | alle Datensätze der betroffenen Tabellen |
| geänderte Artikel exportieren, Preise exportieren, Bestand geändert, Status exportieren | Datensätze, die seit dem Start des letzten Laufs geändert wurden |
| ein einzelner Artikel | zu diesem Artikel alles: Daten, Preis, Bestand, Bilder |
| XDATZUORD exportieren | geänderte Datensätze, deren Datei im Pfad vorhanden ist |
Bei XDATZUORD gilt zusätzlich: Fehlt die im Datensatz genannte Datei, wird der Datensatz übersprungen. Mehrfach genannte Dateien werden nur einmal übertragen.
Die Erkennung geänderter Datensätze stützt sich auf geändert am. Änderungen, die dieses Feld nicht setzen — etwa direkte Eingriffe in die Datenbank —, werden von den Änderungsläufen nicht erfasst. Dann hilft nur ein Vollauf.
Status und Meldungen
Unter der Tabelle stehen die aktuellen Meldungen des laufenden Betriebs.
Das vollständige Protokoll steht unter Log Informationen.
Systemaufgaben
Neben den Modulaufgaben laufen eigene Aufgaben der Anwendung mit. Siehe Wartung und Systemaufgaben.
Nächster Schritt
Log Informationen
Das Protokoll ist die erste Stelle, an der man nachsieht, wenn etwas nicht wie erwartet funktioniert. Jede Übertragung, jeder Fehler und jeder Start hinterlässt dort eine Zeile.
Wo es zu finden ist
Über die Schaltfläche rechts oben in der Oberfläche.
Was angezeigt wird
Die letzten 10.000 Einträge der letzten 24 Stunden. Ältere Einträge stehen im Download.
| Spalte | Inhalt |
|---|---|
| Typ | DEBUG, INFO, WARN oder ERROR |
| Datum | Zeitpunkt |
| Nachricht | der Text; ein Klick auf die Zeile zeigt sie vollständig |
Lange Meldungen sind gekürzt. Ein Klick auf die Zeile klappt sie auf — dort steht auch, aus welchem Bereich der Anwendung sie stammt.
Die vier Typen
| Typ | Bedeutung | Handlungsbedarf |
|---|---|---|
DEBUG |
Einzelschritte, für die Fehlersuche | keiner |
INFO |
normaler Ablauf: Start, Ende, Anzahl | keiner |
WARN |
etwas wurde übersprungen oder ersetzt | gelegentlich ansehen |
ERROR |
etwas ist nicht durchgelaufen | ansehen |
Einzelne ERROR-Zeilen bedeuten nicht, dass ein Lauf insgesamt gescheitert ist — meist betrifft es einen Datensatz. Der Lauf gilt trotzdem als beendet. Der Abschluss allein sagt also nicht, dass alles angekommen ist.
Suchen und filtern
| Feld | Wirkung |
|---|---|
| Suche | Volltextsuche über die Meldungen |
| Typ | zeigt nur INFO, DEBUG, WARN oder ERROR |
Der schnellste Weg zur Ursache: auf ERROR filtern und von der ältesten Meldung nach vorne lesen. Der erste Fehler nennt die Ursache — die folgenden sind oft nur Folgefehler.
Zu jeder Zeile steht der Zusammenhang
Zu jeder Meldung wird vermerkt, aus welchem Aufruf sie stammt, welcher Pfad betroffen war und welcher Benutzer beteiligt war.
Damit lässt sich ein Vorgang zusammenhängend nachlesen, statt einzelne Zeilen zusammenzusuchen — besonders wenn mehrere Module gleichzeitig protokollieren.
Das vollständige Protokoll herunterladen
Die Schaltfläche mit dem Pfeil lädt das gesamte Protokoll als ZIP-Datei herunter.
Das ist die Datei, die der DAKO-Support braucht. Sie enthält deutlich mehr als die Ansicht — auch die DEBUG-Zeilen und die älteren Tage.
Im Protokoll stehen Datensatznummern, Mailadressen und Namen aus dem Mandanten. Beim Weitergeben ist das zu berücksichtigen.
Wie lange die Dateien vorgehalten werden
Die Protokolldateien liegen im Ordner log der Installation. Es werden die letzten 10
Dateien behalten; ältere werden gelöscht.
Bei einer sehr gesprächigen Installation deckt das nur wenige Tage ab. Wenn ein Fehler beobachtet werden soll, der nur selten auftritt, gehört das Protokoll deshalb zeitnah heruntergeladen.
Fehler per E-Mail
Fehler gehen zusätzlich per E-Mail heraus, wenn der Mailversand eingerichtet ist.
Das ist der Grund, den Mailversand einzurichten: Ohne ihn sieht niemand von selbst ins Protokoll — und eine Störung fällt erst auf, wenn ein Anwender sie meldet.
Siehe E-Mail-Versand.
Nächster Schritt
Makros
Mit Makros lassen sich Daten vor oder nach einer Übertragung noch verändern — ohne Anpassung der Schnittstelle. Geschrieben werden sie in der SelectLine, eingetragen in FINN.ghost.
Das ist der vorgesehene Weg für Sonderfälle: Ein Feld soll anders gefüllt, ein Text ergänzt, eine Auswahl anders getroffen werden. Was sich mit einem Makro lösen lässt, braucht keine Programmierung.
Wo die Felder stehen
In den Einstellungen der Module gibt es den Punkt Makro. Welche Makros ein Modul anbietet, steht im Handbuch des Moduls.
Was eingetragen wird
Der Dateiname, den die SelectLine dem Makro automatisch gibt — nicht seine Bezeichnung.
Das ist die häufigste Verwechslung: In der SelectLine ist die Bezeichnung sichtbar, gebraucht wird aber der Dateiname. Trägt man die Bezeichnung ein, wird das Makro nicht gefunden — und meist ohne auffällige Meldung übergangen.
Die Parameter müssen passen
Steht der Eingabecursor im Feld, zeigt FINN.ghost die Parameter, die das Makro erwartet. Diese müssen im Makro gleichlautend vorhanden sein.
Weicht ein Parametername ab, läuft das Makro nicht. Die Parameter sind die vereinbarte Schnittstelle zwischen FINN.ghost und dem Makro — sie gehören zeichengenau übernommen.
Was zu bedenken ist
Ein Makro läuft bei jedem betroffenen Datensatz. Bei einem Vollexport mit zehntausenden Artikeln entscheidet seine Laufzeit über die Dauer des Laufs — ein Makro, das eine Sekunde braucht, verlängert den Export um Stunden.
Makros werden in der SelectLine ausgeführt und können dort schreiben. Vor dem Einsatz in einem echten Mandanten gehören sie in einem Testmandanten geprüft.
Wenn ein Makro nicht greift
| Ursache | Abhilfe |
|---|---|
| Bezeichnung statt Dateiname eingetragen | Dateiname aus der SelectLine übernehmen |
| Parametername weicht ab | im Makro anpassen |
| Makro liegt im falschen Mandanten | im richtigen Mandanten anlegen |
| Makro läuft, wirkt aber nicht | prüfen, ob es vor oder nach der Übertragung greift |
Meldungen dazu stehen im Protokoll. Siehe Log Informationen.
Nächster Schritt
Anpassungen über die config.json
Anpassungen über die config.json
Alle Einstellungen von FINN.ghost stehen in einer Datei: der config.json im
Installationsordner. Fast alles darin wird über die Oberfläche gepflegt — für einige
Sonderfälle gibt es keine Maske.
Diese Datei enthält die gesamte Konfiguration einschließlich der verschlüsselten Kennwörter. Änderungen von Hand nur mit angehaltenem Dienst und nur mit einer Kopie der bisherigen Datei — eine ungültige Datei verhindert den Start.
Wo sie liegt
C:\DAKO\SelectLine.ghost\config.json
Der Pfad richtet sich nach dem gewählten Installationsordner.
| Beim Update | wird nicht überschrieben |
| Kennwortfelder | werden verschlüsselt gespeichert |
config.json.tmp |
Sicherheitskopie |
Die Sicherheitskopie
Im gleichen Verzeichnis liegt config.json.tmp. Sie wird stündlich von der Systemaufgabe
Backup Config geschrieben.
Sie ist damit der Stand der letzten vollen Stunde — nicht der Stand unmittelbar vor der letzten Änderung. Wer eine Einstellung zurücknehmen will, findet dort den Stand von vorher nur, wenn seit der letzten Sicherung noch nichts geändert wurde.
Vor größeren Änderungen deshalb selbst eine Kopie anlegen und mit Datum benennen. Das kostet nichts und erspart im Zweifel viel.
Siehe Wartung und Systemaufgaben.
Vorgehen bei Änderungen von Hand
- Windows-Dienst
SL_<Ordnername>anhalten. - Kopie der
config.jsonanlegen. - Ändern und die Datei als gültiges JSON speichern.
- Dienst starten.
- Im Protokoll prüfen, dass er gestartet ist.
Wird bei laufendem Dienst geändert, geht die Änderung verloren: Die Anwendung hält die Einstellungen im Speicher und schreibt die Datei beim nächsten Speichern komplett neu.
Dateien im Dateisystem ablegen
Standardmäßig legt FINN.ghost die Dateien von Journalen in der Datenbank ab. Sollen sie stattdessen im Dateisystem liegen, wird der Pfad zum SYSTEM-Ordner der SelectLine hinterlegt:
{
"systemPath": "\\sql03\SelectLineSQL2022_SRV\SYSTEM"
}
Läuft FINN.ghost nicht auf demselben System wie die SelectLine, muss es ein Netzwerkpfad sein. Im JSON werden Backslashes doppelt geschrieben — \ statt \.
Der Benutzer, unter dem der Windows-Dienst läuft, braucht Schreibrechte auf diesen Pfad. Läuft der Dienst als lokales Systemkonto, hat er auf einem Netzwerkpfad in der Regel keine Rechte — dann gehört dem Dienst ein Domänenkonto zugewiesen.
Datenbank oder Dateisystem
| Datenbank (Standard) | Dateisystem | |
|---|---|---|
| In der Datensicherung | enthalten | nur wenn der Ordner mitgesichert wird |
| Größe der Datenbank | wächst mit den Dateien | bleibt klein |
| Zugriff | nur über die SelectLine | auch direkt im Ordner |
Bei FINN.mail2SL lohnt die Überlegung: Dort entsteht je abgelegter Mail eine Datei. Über Jahre summiert sich das in der Datenbank deutlich.
Einstellungen, die es nur hier gibt
Ein Teil der Einstellungen hat keine Maske: eigene Abfragen für die Bestandsermittlung, Zuordnungen einzelner Felder und Sonderfälle der einzelnen Module. Welche das sind und was sie bewirken, steht im Kapitel Einstellungen ohne Maske.
Was hier nicht geändert werden sollte
Alles, wofür es eine Maske gibt, gehört über die Oberfläche geändert — dort werden Werte geprüft, Kennwörter verschlüsselt und nötige Neustarts ausgelöst. Der direkte Eingriff ist für die Fälle gedacht, die keine Maske haben.
Eine Ausnahme ist der Notfall: Hat man sich durch die eingeschaltete Benutzeranmeldung ausgesperrt, lässt sie sich hier zurücksetzen. Siehe Server und Oberfläche.
Nächster Schritt
Wartung und Systemaufgaben
Neben den Aufgaben der Module laufen eigene Aufgaben der Anwendung. Sie stehen in der Zeitsteuerung unter der Kategorie System.
Die Systemaufgaben
| Aufgabe | Abstand | Was sie tut |
|---|---|---|
| Backup Config | stündlich | schreibt config.json.tmp und meldet den Stand der Installation an DAKO-IT |
| MSSQL-Log aufräumen | eingeplant | verkleinert das Transaktionsprotokoll der Datenbank |
| SSL Zertifikat erneuern | alle 12 Stunden | erneuert das Let's-Encrypt-Zertifikat, wenn es nötig ist |
Dazu je Modul dessen eigene Aufgaben. Siehe Zeitsteuerung der Module (allgemein).
MSSQL-Log aufräumen
Diese Aufgabe verkleinert das Transaktionsprotokoll der Mandantendatenbank. Dazu stellt sie das Wiederherstellungsmodell kurzzeitig auf Einfach, verkleinert die Protokolldatei und stellt das Modell wieder auf Vollständig.
Der Grund ist praktischer Natur: Massenläufe wie ein Artikelvollexport lassen das Transaktionsprotokoll stark anwachsen. Ohne Verkleinerung läuft die Platte über.
Der Wechsel des Wiederherstellungsmodells unterbricht die Kette der Protokollsicherungen. Wer die SelectLine-Datenbank mit Transaktionsprotokollsicherungen sichert, muss danach eine neue Vollsicherung anstoßen — sonst ist eine zeitpunktgenaue Wiederherstellung nicht mehr möglich. Diese Aufgabe gehört deshalb mit dem Datenbankverantwortlichen abgestimmt.
Wird die Datenbank ohnehin im Modell Einfach betrieben — bei SelectLine-Installationen verbreitet —, ist das ohne Bedeutung.
Was stündlich an DAKO-IT gemeldet wird
Die Aufgabe Backup Config meldet zusammen mit der Sicherung den Stand der Installation an einen Dienst von DAKO-IT. Übertragen werden:
| Angabe | Wozu |
|---|---|
| Lizenzschlüssel | Prüfung, ob die Lizenz noch gültig ist |
| Firmenname aus der SelectLine-Lizenz | Zuordnung zum Kunden |
| Mandant | Zuordnung der Installation |
| Version der SelectLine | Unterstützung und Fehlersuche |
| Version von FINN.ghost | Hinweis auf verfügbare Updates |
| Installationspfad und Rechnername | Unterscheidung mehrerer Installationen |
Es werden keine Belege, Adressen oder Artikel übertragen — nur die genannten Angaben zur Installation.
Meldet der Dienst die Lizenz als abgelaufen, wird der Lizenzschlüssel geleert und die Anwendung beendet sich. Sie startet danach ohne Module. Bei einer auslaufenden Lizenz gehört die Verlängerung deshalb rechtzeitig geklärt.
Ohne ausgehende Internetverbindung schlägt diese Meldung fehl. Das ist für den Betrieb unkritisch — im Protokoll erscheint dann aber regelmäßig ein Fehler.
Was in die Datensicherung gehört
| Was | Warum |
|---|---|
config.json |
die gesamte Konfiguration |
Ordner data\ssl |
Zertifikat, Schlüssel und Let's-Encrypt-Zugang |
Ordner client\plugins |
eigene Erweiterungen, falls vorhanden |
| Datenbank des Mandanten | dort liegen die Daten der Module |
Mit config.json und data\ssl ist eine Installation nach einem Serverausfall in wenigen Minuten wiederhergestellt: Setup ausführen, beides zurückkopieren, Dienst starten.
Das Programm selbst braucht nicht gesichert zu werden — das Setup lässt sich jederzeit neu herunterladen.
Siehe Installation und Update.
Regelmäßig nachsehen
| Wie oft | Was |
|---|---|
| täglich | die Fehlermails, sofern eingerichtet |
| wöchentlich | Protokoll auf wiederkehrende ERROR-Meldungen |
| monatlich | läuft eine aktuelle Version? |
| monatlich | Restlaufzeit des Zertifikats |
| jährlich | Ablaufdatum von Clientschlüsseln bei Microsoft 365 |
Der letzte Punkt fällt in der Praxis am häufigsten auf: Clientschlüssel in Azure laufen nach ein bis zwei Jahren ab. Danach steht der Mailversand — und damit auch die Benachrichtigung, die darauf hinweisen würde.
Siehe E-Mail über Microsoft 365.
Nächster Schritt
Häufige Fragen
Wo läuft FINN.ghost?
Als Windows-Dienst auf einem Server im Haus. Bedient wird es im Browser. Siehe Überblick.
Braucht FINN.ghost eine eigene Datenbank?
Nein. Was gespeichert werden muss, legt es in eigenen Tabellen im SelectLine-Mandanten ab. Deshalb braucht der SQL-Benutzer das Recht, Tabellen anzulegen. Siehe Datenbank.
Warum werden Datenbank und API gebraucht?
Gelesen wird direkt aus der Datenbank, weil das bei großen Mengen um ein Vielfaches schneller ist. Geschrieben wird über die API, damit Nummernkreise, Preisfindung und Buchungen der SelectLine gelten. Siehe SelectLine-API.
Können mehrere FINN.ghost auf einem Server laufen?
Ja. Jede Installation braucht einen eigenen Ordner und einen eigenen Port. Der Ordnername wird zum Dienstnamen — sprechende Namen erleichtern die Unterscheidung. Siehe Installation und Update.
Können mehrere Mandanten mit einer Installation bedient werden?
Nein. Eine Installation arbeitet auf einer Mandantendatenbank. Für einen zweiten Mandanten braucht es eine zweite Installation. Siehe Datenbank.
Wie aktualisiere ich?
In der Oberfläche Strg + Alt + U. Alternativ das Setup über denselben Ordner ausführen. Siehe Installation und Update.
Bleiben die Einstellungen beim Update erhalten?
Ja, die config.json wird nicht überschrieben. Siehe
Anpassungen über die config.json.
Warum warnt der Browser vor der Verbindung?
Weil das Zertifikat nicht anerkannt wird. Mit öffentlicher Domain löst das Let's Encrypt, ohne Domain das Verteilen des Stammzertifikats an die Arbeitsplätze — siehe Zertifikat einrichten.
Muss FINN.ghost aus dem Internet erreichbar sein?
Für Let's Encrypt nicht — der Nachweis läuft über einen DNS-Eintrag. Einzelne Module brauchen aber eingehende Verbindungen, etwa für Rückmeldungen eines Shops. Das steht im jeweiligen Modulhandbuch.
Warum fehlt ein Modul im Menü?
Weil die Lizenz es nicht enthält oder nach dem Speichern noch nicht neu gestartet wurde. Siehe Lizenz und Module.
Eine Aufgabe steht auf „warten…" — ist das ein Fehler?
Nein. Es läuft gerade eine andere Aufgabe; es wird immer nur eine ausgeführt. Siehe Zeitsteuerung der Module (allgemein).
Warum läuft nachts alles, obwohl ich ein Zeitfenster gesetzt habe?
Weil ein Fenster über Mitternacht nicht wirkt. Von 22:00 Bis 06:00 wird übergangen. Das Fenster muss innerhalb eines Tages liegen. Siehe Zeitsteuerung der Module (allgemein).
Ein Lauf ist beendet — sind damit alle Daten übertragen?
Nicht zwangsläufig. Einzelne Datensätze können gescheitert sein; der Lauf gilt trotzdem als beendet. Sicherheit gibt nur das Protokoll. Siehe Log Informationen.
Wie lange bleiben Protokolle erhalten?
Die Ansicht zeigt 24 Stunden, auf der Platte liegen die letzten 10 Protokolldateien. Wer mehr braucht, lädt das Protokoll als ZIP herunter. Siehe Log Informationen.
Was braucht der Support von mir?
Das Protokoll als ZIP, die Version aus der Fußzeile und eine Beschreibung, welcher Vorgang betroffen ist. Siehe Log Informationen.
Der Mailversand läuft nicht mehr, ohne dass sich etwas geändert hat.
Meist ist ein Clientschlüssel in Azure abgelaufen. Siehe E-Mail über Microsoft 365.
Wer darf die Oberfläche öffnen?
Ohne eingeschaltete Benutzeranmeldung jeder, der den Server im Netz erreicht. Für alles
außerhalb von localhost gehört sie eingeschaltet. Siehe
Server und Oberfläche.
Kann ich FINN.ghost in der SelectLine anzeigen?
Ja, die Oberfläche lässt sich in den SelectLine-Dashboards einbinden. Die Anwender bleiben dann in der SelectLine.
Wie entferne ich eine Installation?
Dienst anhalten und entfernen, Ordner löschen. Vorher die config.json sichern. Siehe
Installation und Update.
Wo steht, was sich geändert hat?
Im Änderungsverlauf — und auf der Startseite der Anwendung.