Hotkeys, Hotstrings und Neubelegung
Doppelte Anführungszeichen (") haben nur innerhalb von Ausdrücken eine besondere Bedeutung. Überall sonst werden sie wie normale Zeichen behandelt. Wenn jedoch ein Skript ein Programm oder Dokument startet, müssen Befehlszeilenparameter, die Leerzeichen enthalten, in Anführungszeichen gesetzt werden, damit sie vom Betriebssystem richtig erkannt werden. Zum Beispiel: Run, Notepad.exe "C:\Meine Dateien\Adressliste.txt"
.
Variablennamen werden immer mit Prozentzeichen umschlossen, außer in den unten fett geschriebenen Fällen:
StringLen, AusgabeVar, EingabeVar
Var = 123abc
If Var1 < %Var2%
If (Var1 <> Var2) Var1 := Var2 + 100
Weitere Informationen zur Verwendung von Prozentzeichen finden Sie unter Legacy-Syntax und Dynamische Variablen. Prozentzeichen können auch andere Bedeutungen haben:
`%
) und Prozentzeichen innerhalb von in Anführungszeichen gesetzten, direkt geschriebenen Zeichenketten haben keine besondere Bedeutung (sie werden als direkt geschriebene Prozentzeichen interpretiert).Direkt geschriebene Prozentzeichen müssen mit einem Escapezeichen versehen werden, üblicherweise durch Voranstellen eines Akzents/umgekehrten Häkchens. Zum Beispiel: MsgBox Der aktuelle Prozentwert liegt bei 25`%
. Direkt geschriebene Kommas müssen ebenfalls mit einem Escapezeichen versehen werden (`,
), es sei denn, sie werden in einer MsgBox oder im letzten Parameter eines Befehls verwendet (dann ist das umgekehrte Häkchen zulässig, aber nicht notwendig).
Wenn Kommas oder Prozentzeichen innerhalb eines Ausdrucks in Anführungszeichen stehen, ist das umgekehrte Häkchen zulässig, aber nicht notwendig. Zum Beispiel: Var := "15%"
.
7-Zip-Fehler: Entpacken Sie mit 7-Zip oder einem kompatiblen Programm die Setup-Dateien aus der Installer-EXE und starten Sie dann setup.exe oder Installer.ahk (ziehen Sie Installer.ahk mit gedrückter Maustaste auf AutoHotkeyU32.exe).
Der AutoHotkey-Installer ist ein selbstentpackendes 7-Zip-Archiv, das versucht, die Dateien in das temporäre Benutzerverzeichnis zu entpacken und ein kompiliertes Skript zu starten. Manchmal kann es vorkommen, dass die Dateien aufgrund von Systemrichtlinien oder anderen Faktoren nicht entpackt oder ausgeführt werden dürfen. Normalerweise wird in solchen Fällen ein "7-Zip-Fehler" angezeigt. Um potenziell Abhilfe zu schaffen, entpacken Sie die Dateien manuell in ein anderes Verzeichnis.
Setup hängt: Wenn das Setup-Fenster ohne Inhalt oder gar nicht erscheint, können Sie eine oder beide der folgenden Methoden ausprobieren:
setup.exe /S
oder AutoHotkeyU32.exe Installer.ahk /S
verwenden.Sonstiges: Die obigen Vorschläge beziehen sich nur auf die am häufigsten auftretenden Probleme. Weitere Hilfe finden Sie im Forum.
Normalerweise sollte, wenn AutoHotkey installiert ist, ein Rechtsklick auf eine AutoHotkey-Skriptdatei (.ahk) die folgenden Optionen bieten:
Manchmal werden diese Optionen durch Einstellungen im Profil des aktuellen Benutzers überschrieben, z.B. wenn Öffnen mit verwendet wurde, um das Standardprogramm zum Öffnen von .ahk-Dateien zu ändern. Dieses Problem kann durch Löschen des folgenden Registry-Schlüssels behoben werden:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ahk\UserChoice
Noch einfacher geht es mit diesem Registry-Patch.
Eventuell müssen Sie auch die Standardwerte in der Registry reparieren, indem Sie entweder AutoHotkey neu installieren oder das AutoHotkey-Setup (aus dem Startmenü) ausführen und apply oben im Fenster auswählen.
Um bestimmte Zeilen sofort beim Start des Skripts auszuführen, fügen Sie diese am Anfang des Skripts vor dem ersten Hotkey, Hotstring oder Return ein. Weitere Informationen finden Sie unter Der Anfang des Skripts (automatischer Ausführungsbereich).
Beachten Sie auch, dass, wenn ein Hotkey mehr als eine Zeile ausführt, die erste Zeile unter dem Hotkey stehen muss, nicht in derselben Zeile. Zum Beispiel:
#space:: ; WIN+LEERTASTE Run Notepad WinWaitActive Unbenannt - Editor WinMaximize return
Dieses Problem gibt es in mehreren Varianten:
Wenn Sie auf ein anderes Betriebssystem umgestiegen sind, kann es sein, dass sich etwas geändert hat, das sich auf Ihr Skript auswirkt. Haben Sie zum Beispiel einen neuen Computer, können andere Treiber oder Software installiert sein. Wenn Sie AutoHotkey auf eine neue Version aktualisiert haben, finden Sie heraus, welche Version zuvor installiert war, und überprüfen Sie dann das Changelog und die Kompatibilitätshinweise auf Änderungen, die Ihr Skript beeinträchtigen könnten.
SoundGet, SoundSet, SoundGetWaveVolume und SoundSetWaveVolume verhalten sich in Windows Vista und höher anders als in älteren Windows-Versionen. Das liegt vor allem daran, dass die Gerätenummerierung anders ist und einige Komponenten eventuell nicht verfügbar sind. Das Verhalten hängt von den Audiotreibern ab, die sich zwangsläufig von denen in XP unterscheiden. Mit dem Soundkartenanalyse-Skript können die korrekten Gerätenummern ermittelt werden.
Siehe auch die folgende Frage:
Aus Sicherheitsgründen verhindert die Benutzerkontensteuerung (engl. User Account Control, kurz UAC), dass "höherberechtigte" Programme (also Programme mit Adminrechten) von anderen, nicht-höherberechtigten Programmen automatisiert werden können. Auch Hotkeys werden blockiert, so dass bspw. ein nicht-höherberechtigtes Programm keine Eingaben mitlesen kann, die für ein höherberechtigtes Programm bestimmt sind.
UAC kann sich auch negativ auf SendPlay und BlockInput auswirken.
Es gibt folgende Übergangslösungen:
"AutoHotkeyU32_UIA.exe" "Ihr Skript.ahk"
benutzen (aber mit vollständigem Pfad).Sie müssen den Fehler in Ihrem Skript beheben, wenn Sie das Tray-Symbol zurückhaben wollen. Aber zuerst müssen Sie die Skriptdatei finden.
Suchen Sie nach AutoHotkey.ahk in den folgenden Verzeichnissen:
Wenn Sie eine andere AutoHotkey-EXE-Datei direkt ausführen, wird automatisch ein Skript mit demselben Namen gestartet. Führen Sie beispielsweise AutoHotkeyU32.exe aus, müssen Sie nach AutoHotkeyU32.ahk suchen. Beachten Sie, dass je nach Systemeinstellung die .ahk-Endung versteckt sein könnte, allerdings sollte die Datei ein Symbol haben, das wie folgt aussieht:
Sie können eine Skriptdatei üblicherweise durch Öffnen des Rechtsklickmenüs und Auswählen von Edit Script editieren. Wenn das nicht funktioniert, öffnen Sie die Datei in Notepad oder in einem anderen Texteditor.
Wenn Sie AutoHotkey über das Startmenü oder durch direktes Ausführen von AutoHotkey.exe starten (ohne Befehlszeilenparameter), sucht es nach einem Skript in einem der oben genannten Orte. Oder Sie erstellen einfach eine Skriptdatei (beliebigerName.ahk) an einem beliebigen Ort und führen diese stattdessen aus.
Siehe auch Befehlszeilenparameter "Skriptdateiname" und Portabilität von AutoHotkey.exe.
Für einfache Skripte siehe Ein Skript debuggen. Um den Inhalt einer Variable anzuzeigen, verwenden Sie MsgBox oder ToolTip. Für komplexe Skripte siehe Interaktives Debuggen.
Einige Programme müssen in ihrem eigenen Verzeichnis gestartet werden (was im Zweifelsfall immer getan werden sollte). Zum Beispiel:
Run, %ProgramFiles%\Beliebige Anwendung\Anwendung.exe, %ProgramFiles%\Beliebige Anwendung
Wenn Sie mit der 32-Bit-Version von AutoHotkey auf einem 64-Bit-System ein Programm starten wollen, das sich im Ordner %A_WinDir%\System32
befindet, kann es sein, dass die Dateisystemumleitung Probleme macht. Um das zu umgehen, können Sie stattdessen %A_WinDir%\SysNative
verwenden; dieser Pfad führt zu einem virtuellen Verzeichnis, das nur 32-Bit-Programme auf einem 64-Bit-System sehen können.
Kurze Antwort: Speichern Sie das Skript unter UTF-8 mit BOM.
Obwohl AutoHotkey Unicodetexte unterstützt, ist es auf Abwärtskompatibilität ausgelegt, d.h. es verwendet standardmäßig die ANSI-Kodierung, nicht das international empfohlene UTF-8. AutoHotkey wird eine UTF-8-Datei nicht automatisch erkennen, es sei denn, sie beginnt mit einer Byte-Order-Markierung (BOM).
Mit anderen Worten: UTF-8-Dateien, die keine BOM haben, werden fehlinterpretiert, was dazu führt, dass ASCII-fremde Zeichen falsch dekodiert werden. Um dieses Problem zu beheben, müssen Sie die Datei unter UTF-8 mit BOM speichern oder die Befehlszeilenoption /CP65001 hinzufügen.
Um eine Datei in Notepad unter UTF-8 mit BOM zu speichern, wählen Sie UTF-8 mit BOM (oder UTF-8 auf Systemen älter als Windows 10 v1903) in der ausklappbaren Liste neben Kodierung im Dialogfenster "Speichern unter" aus. Beachten Sie, dass Notepad in Windows 10 v1903 und höher standardmäßig UTF-8 (ohne BOM) verwendet.
Um BOM-lose UTF-8-Dateien zu lesen, verwenden Sie FileEncoding UTF-8-RAW
, die *P65001
-Option mit FileRead oder "UTF-8-RAW"
im dritten Parameter von FileOpen(). Sie können das -RAW
-Suffix weglassen, aber dann werden alle neuen Dateien eine BOM haben.
Beachten Sie, dass INI-Dateien, die mit den Standard-INI-Befehlen gelesen oder geschrieben werden, UTF-8 nicht unterstützen; sie müssen unter ANSI oder UTF-16 gespeichert sein.
Nicht immer ist es bei Videospielen möglich, ihnen Tasten oder Mausklicks zu senden oder ihre Pixelfarben zu lesen.
Es gibt jedoch einige Alternativen, die Sie ausprobieren können. Wenn alle fehlschlagen, ist AutoHotkey möglicherweise nicht für Ihr Videospiel geeignet. Einige Videospiele haben eingebaute Maßnahmen gegen Hacks und Cheats, wie z.B. GameGuard und Hackshield. In diesem Fall besteht eine hohe Chance, dass AutoHotkey nicht funktioniert.
Verwenden Sie SendPlay via SendPlay-Befehl, SendMode Play und/oder Hotstring-Option SP.
SendPlay, abc
SendMode, Play Send, abc
:SP:bzw::beziehungsweise ; oder #Hotstring SP ::bzw::beziehungsweise
Hinweis: SendPlay funktioniert möglicherweise nicht in Windows Vista oder höher, wenn die Benutzerkontensteuerung (engl. User Account Control, kurz UAC) aktiviert ist, auch wenn das Skript als Administrator ausgeführt wird.
Erhöhen Sie SetKeyDelay. Zum Beispiel:
SetKeyDelay, 0, 50 SetKeyDelay, 0, 50, Play
Probieren Sie ControlSend aus, das in manchen Situationen besser funktioniert als die anderen Send-Modi:
ControlSend,, abc, Videospiel_Titel
Probieren Sie das Down- und Up-Ereignis einer Taste mit verschiedenen Sendemethoden aus:
Send {TASTE down}{TASTE up}
Probieren Sie das Down- und Up-Ereignis einer Taste mit einem Sleep dazwischen aus:
Send {TASTE down} Sleep 10 ; probieren Sie verschiedene Millisekunden aus Send {TASTE up}
Wenn Hotkeys, Clicks oder Sends bei hoher CPU-Last spürbar langsamer als normal sind, kann es helfen, die Prozesspriorität des Skripts zu erhöhen. Fügen Sie dazu die folgende Zeile am Anfang des Skripts ein:
Process, Priority, , High
Es kann zwar nie ganz ausgeschlossen werden, dass die Datei infiziert ist, aber in den meisten Fällen handelt es sich bei solchen Warnungen um False-Positives (Falschmeldungen), d.h. das Antivirenprogramm irrt sich. Oft wird vorgeschlagen, die Datei bei einem Onlinedienst wie virustotal oder Jotti hochzuladen, um zu sehen, was andere Antivirenprogramme melden. Im Zweifelsfall kann man die Datei an den Hersteller des Antivirenprogramms schicken und sich die Echtheit bestätigen lassen. Das würde auch uns und anderen AutoHotkey-Benutzern helfen, da der Hersteller diese Warnung möglicherweise als False-Positive einstuft und sein Programm so anpasst, dass es reibungslos mit AutoHotkey funktioniert.
False-Positives können häufiger auftreten, wenn kompilierte Skripte mit UPX (Standard in AutoHotkey 1.0, aber nicht in 1.1) oder MPRESS (optional in AutoHotkey 1.1) komprimiert sind. Da die Standardinstallation von AutoHotkey keinen Kompressor enthält, werden kompilierte Skripte standardmäßig nicht komprimiert.
Auf der Download-Seite von AutoHotkey.
Siehe Portabilität von AutoHotkey.exe.
Hinweis: Wenn Sie ein Skript kompilieren, das auto-inkludierte Funktionsbibliotheken verwendet, müssen AutoHotkey.exe und der Lib-Ordner eine Ebene höher liegen als Ahk2Exe.exe (z.B. \AutoHotkey.exe vs \Compiler\Ahk2Exe.exe). Beachten Sie auch, dass Ahk2Exe seine Einstellungen in folgendem Registry-Schlüssel speichert: HKCU\Software\AutoHotkey\Ahk2Exe
. Der Compiler selbst (Ahk2Exe) wird nicht benötigt, um Skripte auszuführen.
Um die Ausgabe einer Befehlszeilenoperation abzurufen, können Sie eine temporäre Datei verwenden. Tests haben gezeigt, dass diese Methode bei relativ kleinen Ausgaben aufgrund von Datei-Caching sehr schnell sein kann. Tatsächlich wird die Datei oft gar nicht auf das Laufwerk geschrieben, wenn sie sofort nach ihrer Verwendung gelöscht wird. Zum Beispiel:
RunWait %ComSpec% /c dir > C:\Meine Temp-Datei.txt FileRead, VarMitInhalt, C:\Meine Temp-Datei.txt FileDelete, C:\Meine Temp-Datei.txt
Wenn Sie temporäre Dateien vermeiden wollen (besonders wenn die Ausgabe groß ist), sollten Sie die Shell.Exec()-Methode verwenden, die bei den Beispielen zum Run-Befehl zu finden ist.
Hier zunächst ein Beispiel, das ein anderes Skript schließt:
DetectHiddenWindows On ; Ermöglicht die Erkennung des versteckten Hauptfensters eines Skripts. SetTitleMatchMode 2 ; Verhindert, dass unten der vollständige Pfad der Datei angegeben werden muss. WinClose SkriptDateiName.ahk - AutoHotkey ; Verwenden Sie hier den Namen Ihres Skripts (Groß-/Kleinschreibung-sensitiv).
Wenn ein anderes Skript suspendiert, pausiert oder neu geladen werden soll, ersetzen Sie die letzte Zeile oben mit eine der folgenden Zeilen:
PostMessage, 0x0111, 65305,,, SkriptDateiName.ahk - AutoHotkey ; Suspendieren. PostMessage, 0x0111, 65306,,, SkriptDateiName.ahk - AutoHotkey ; Pausieren. PostMessage, 0x0111, 65303,,, SkriptDateiName.ahk - AutoHotkey ; Neu laden.
Um das gesamte Skript auf Tastendruck zu pausieren oder fortzusetzen, weisen Sie dem Pause-Befehl einen Hotkey wie folgt zu:
^!p::Pause ; Drücke Strg+Alt+P zum Pausieren. Drücke erneut zum Fortsetzen.
Um eine sich wiederholende Aktion innerhalb einer Schleife zu stoppen, verwenden Sie den folgenden Hotkey, der seine eigene sich wiederholende Aktion sowohl startet als auch stoppt. Durch einmaliges Drücken des Hotkeys wird die Schleife gestartet, durch erneutes Drücken wird sie gestoppt.
#MaxThreadsPerHotkey 3 #z:: ; WIN+Z (passen Sie diesen Hotkey Ihren Bedürfnissen an). #MaxThreadsPerHotkey 1 if WinZLaufenLassen ; Bedeutet, dass ein darunter liegender Thread die Schleife unten bereits ausführt. { WinZLaufenLassen := false ; Signalisiert der Schleife zu stoppen. return ; Beendet diesen Thread, damit der darunter liegende weiterläuft und die Änderung von der Zeile oben sieht. } ; Andernfalls: WinZLaufenLassen := true Loop { ; Die nächsten vier Zeilen sind die Aktionen, die wiederholt werden sollen (passen Sie sie Ihren Bedürfnissen an): ToolTip, Drücken Sie erneut WIN+Z`, um das hier zu stoppen. Sleep 1000 ToolTip Sleep 1000 ; Lassen Sie den Rest aber unverändert. if not WinZLaufenLassen ; Der Benutzer signalisierte den Stopp der Schleife durch erneutes Drücken von WIN+Z. break ; Unterbricht die Schleife. } WinZLaufenLassen := false ; Setzt den Wert zum Wiederverwenden des Hotkeys zurück. return
Rajat hat dafür dieses Skript geschrieben.
Für den Internet Explorer ist DllCall() in Kombination mit COM wohl die zuverlässigste Methode; ein Beispiel dazu finden Sie unter www.autohotkey.com/board/topic/17715-. Es ist auch möglich, den Inhalt der Adress- und Statusleiste abzurufen; siehe www.autohotkey.com/board/topic/17714-.
Ältere, weniger zuverlässige Methode: Das folgende Beispiel funktioniert für fast alle Webseiten des Internet Explorers. Eine ähnliche Methode könnte auch für andere Browser funktionieren:
Run, www.yahoo.com MouseMove, 0, 0 ; Verhindert, dass aufgrund der Mausposition ein Link in der Statusleiste angezeigt wird. WinWait, Yahoo! - WinActivate StatusBarWait, Done, 30 if ErrorLevel MsgBox Die Wartezeit ist abgelaufen oder das Fenster wurde geschlossen. else MsgBox Die Webseite wurde geladen.
Der EnvAdd-Befehl kann eine bestimmte Anzahl von Tagen, Stunden, Minuten oder Sekunden im YYYYMMDDHH24MISS-Format addieren oder subtrahieren. Das folgende Beispiel subtrahiert 7 Tage von einer bestimmten Zeit: EnvAdd, VarMitZeitstempel, -7, d
.
Um die Zeitmenge zwischen zwei Datums- oder Zeitwerten zu ermitteln, sehen Sie sich das Beispiel in EnvSub an. Die interne Variable A_Now enthält die aktuelle Ortszeit. Des Weiteren gibt es mehrere interne Datum/Zeit-Variablen, sowie den FormatTime-Befehl, um eine benutzerdefinierte Datum/Zeit-Zeichenkette zu erzeugen.
Mit FormatTime oder internen Datum/Zeit-Variablen.
Mit ControlSend.
Siehe Winamp automatisieren.
Hier dazu ein Beispiel.
Im Beispielabschnitt von Edit finden Sie ein Skript, mit dem Sie den Standardeditor ändern können.
Mit Gui Submit. Zum Beispiel:
Gui, Add, Text,, Tragen Sie etwas Text ein und drücken Sie Submit: Gui, Add, Edit, vZugeordneteVar Gui, Add, Button,, Submit Gui, Show Return ButtonSubmit: Gui, Submit, NoHide MsgBox, Inhalt des Edit-Steuerelements: %ZugeordneteVar% Return
Siehe GDI+ standard library von tic. Mit Gui kann man auch etwas zeichnen, aber nur sehr rudimentär.
Mit WinWait, WinWaitClose oder WinWait[Not]Active.
Es gibt von Benutzern erstellte Lösungen wie OnWin.ahk und [How to] Hook on to Shell to receive its messages (wie man auf Shell zugreifen kann, um dessen Meldungen abzurufen).
Es gibt mehrere Möglichkeiten, ein Skript (oder ein anderes Programm) beim Start von Windows auszuführen. Am einfachsten ist es, eine Verknüpfung zur Skriptdatei im Autostart-Ordner zu platzieren:
shell:startup
ein und klicken Sie auf OK oder drücken Sie Enter. Der Autostart-Ordner des aktuellen Benutzers wird geöffnet. Um stattdessen den Ordner aller Benutzer zu öffnen, geben Sie shell:common startup
ein (in diesem Fall benötigen Sie jedoch Adminrechte).Die linke und rechte Maustaste sollten normal belegbar sein (z.B. ist #LButton::
der Hotkey Win+MAUSTASTE-LINKS). Die mittlere Maustaste und das Mausrad sollten ebenfalls normal belegbar sein, außer bei Mäusen, deren Tasten direkt vom Treiber gesteuert werden.
Die vierte (XButton1) und fünfte Maustaste (XButton2) können ebenfalls belegt werden, sofern Ihr Maustreiber diese Klicks für das System erkennbar macht. Wenn das System diese Tasten nicht erkennt (oder um neben den 5 Haupttasten noch andere Maustasten erkennbar zu machen), können Sie versuchen, die Maus mittels eigener Software so einzustellen (manchmal über die Systemsteuerung oder das Startmenü zugänglich), dass sie einen Tastendruck sendet, wenn Sie eine dieser Maustasten drücken. Dieser Tastendruck kann dann in einem Skript als Hotkey definiert werden. Wenn Sie zum Beispiel die vierte Maustaste so einstellen, dass sie Strg+F1 sendet, können Sie diese Maustaste indirekt als Hotkey definieren, indem Sie ^F1::
in einem Skript verwenden.
Wenn Sie eine 5-Tasten-Maus besitzen, aber das System die vierte und fünfte Maustaste nicht erkennt, können Sie versuchen, den Maustreiber mit dem Standardtreiber des Betriebssystems zu ersetzen. Dies setzt voraus, dass so ein Treiber für Ihre Maus vorhanden ist und dass Sie auf die Features, die die Software Ihrer Maus normalerweise bereitstellt, verzichten können.
Benutzen Sie die englischen Namen dieser Tasten (Tab und Space). Zum Beispiel: #Space
ist Win+Leer und ^!Tab
ist Strg+Alt+Tab.
Informationen dazu finden Sie unter Neubelegung von Tasten.
Verwenden Sie die internen Hotkey-Variablen wie folgt:
~Ctrl:: if (A_ThisHotkey = A_PriorHotkey && A_TimeSincePriorHotkey < 200) MsgBox Doppeldruck return
Die bevorzugte Methode ist #IfWinActive. Zum Beispiel:
#IfWinActive, ahk_class Notepad ^a::MsgBox Sie haben STRG+A gedrückt, während Notepad aktiv war.
Das folgende Beispiel macht aus Numpad0 eine Präfixtaste:
Numpad0 & Numpad1::MsgBox, Sie haben Numpad1 gedrückt, während Sie Numpad0 gedrückt hielten.
Um nun Numpad0 dazu zu bringen, immer dann einen echten Numpad0-Tastendruck zu senden, wenn die Taste nicht zum Starten eines Hotkeys wie oben benötigt wird, fügen Sie den folgenden Hotkey hinzu:
$Numpad0::Send, {Numpad0}
Das $-Präfix ist notwendig, um ein Warndialogfenster im Falle einer Endlosschleife zu unterdrücken (da der Hotkey "sich selbst sendet"). Außerdem wird die obige Aktion erst ausgelöst, wenn die Taste losgelassen wird.
Hier einige Beispiele.
Verwenden Sie das Skript von polyethene (Beispiele sind enthalten).
Siehe Sondertasten.
Ja. Dieses Beispiel-Skript lässt 000 ein Gleichheitszeichen senden. Um stattdessen eine andere Aktion ausführen zu lassen, ersetzen Sie Send, =
mit eine oder mehrere Zeilen Ihrer Wahl.