From 2cee0396de887f6c23283d05c5b5c4ff646d92b7 Mon Sep 17 00:00:00 2001 From: coolneng Date: Fri, 10 Jun 2022 20:03:25 +0200 Subject: [PATCH] Update mouse library --- mouse/.gitignore | 101 ++++ mouse/CHANGES.md | 30 ++ mouse/LICENSE.txt | 21 + mouse/Makefile | 18 + mouse/README.md | 500 ++++++++++++++++++ mouse/__init__.pyc | Bin 12107 -> 0 bytes mouse/__pycache__/__init__.cpython-38.pyc | Bin 9978 -> 0 bytes mouse/__pycache__/_generic.cpython-38.pyc | Bin 2485 -> 0 bytes mouse/__pycache__/_mouse_event.cpython-38.pyc | Bin 547 -> 0 bytes mouse/__pycache__/_nixcommon.cpython-38.pyc | Bin 5385 -> 0 bytes mouse/__pycache__/_nixmouse.cpython-38.pyc | Bin 3578 -> 0 bytes mouse/_generic.pyc | Bin 2992 -> 0 bytes mouse/_mouse_event.pyc | Bin 694 -> 0 bytes mouse/_nixcommon.pyc | Bin 6782 -> 0 bytes mouse/_nixmouse.pyc | Bin 4889 -> 0 bytes mouse/make_release.py | 91 ++++ mouse/{ => mouse}/__init__.py | 4 - mouse/{ => mouse}/__main__.py | 0 mouse/{ => mouse}/_generic.py | 0 mouse/{ => mouse}/_mouse_event.py | 0 mouse/{ => mouse}/_mouse_tests.py | 0 mouse/{ => mouse}/_nixcommon.py | 10 +- mouse/{ => mouse}/_nixmouse.py | 0 mouse/{ => mouse}/_winmouse.py | 0 mouse/setup.py | 38 ++ 25 files changed, 801 insertions(+), 12 deletions(-) create mode 100644 mouse/.gitignore create mode 100644 mouse/CHANGES.md create mode 100644 mouse/LICENSE.txt create mode 100644 mouse/Makefile create mode 100644 mouse/README.md delete mode 100644 mouse/__init__.pyc delete mode 100644 mouse/__pycache__/__init__.cpython-38.pyc delete mode 100644 mouse/__pycache__/_generic.cpython-38.pyc delete mode 100644 mouse/__pycache__/_mouse_event.cpython-38.pyc delete mode 100644 mouse/__pycache__/_nixcommon.cpython-38.pyc delete mode 100644 mouse/__pycache__/_nixmouse.cpython-38.pyc delete mode 100644 mouse/_generic.pyc delete mode 100644 mouse/_mouse_event.pyc delete mode 100644 mouse/_nixcommon.pyc delete mode 100644 mouse/_nixmouse.pyc create mode 100644 mouse/make_release.py rename mouse/{ => mouse}/__init__.py (98%) rename mouse/{ => mouse}/__main__.py (100%) rename mouse/{ => mouse}/_generic.py (100%) rename mouse/{ => mouse}/_mouse_event.py (100%) rename mouse/{ => mouse}/_mouse_tests.py (100%) rename mouse/{ => mouse}/_nixcommon.py (96%) rename mouse/{ => mouse}/_nixmouse.py (100%) rename mouse/{ => mouse}/_winmouse.py (100%) create mode 100644 mouse/setup.py diff --git a/mouse/.gitignore b/mouse/.gitignore new file mode 100644 index 0000000..7bbc71c --- /dev/null +++ b/mouse/.gitignore @@ -0,0 +1,101 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# dotenv +.env + +# virtualenv +.venv +venv/ +ENV/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ diff --git a/mouse/CHANGES.md b/mouse/CHANGES.md new file mode 100644 index 0000000..e877696 --- /dev/null +++ b/mouse/CHANGES.md @@ -0,0 +1,30 @@ +# 0.7.1 + +- Fixed errors and incorrect information on setup.py. +- Fixed Windows segfault. +- Applied pending bug fixes. + + +# 0.7.0 + +- [All] Fix Windows hook error (#1). +- [All] Add __main__ module, allowing `python -m mouse` to save and load events. + + +# 0.6.1 + +- [Windows] Fixed ctypes type-checking error. +- [All] Misc fixes to release process. + + +# 0.6.0 + +- Added README and API docs. +- Bump version to replace old library. + + +# 0.0.1 + +- Initial release, migrated from `keyboard` package. + + diff --git a/mouse/LICENSE.txt b/mouse/LICENSE.txt new file mode 100644 index 0000000..4f3cb7b --- /dev/null +++ b/mouse/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Lucas Boppre Niehues + +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/mouse/Makefile b/mouse/Makefile new file mode 100644 index 0000000..b2f750a --- /dev/null +++ b/mouse/Makefile @@ -0,0 +1,18 @@ +test: tests +tests: + python2 -m coverage run -m mouse._mouse_tests + python2 -m coverage run -am mouse._mouse_tests + python -m coverage run -am mouse._mouse_tests + python -m coverage run -am mouse._mouse_tests + python -m coverage report && coverage3 html + +build: tests mouse setup.py + python ../docstring2markdown/docstring2markdown.py mouse "https://github.com/boppreh/mouse/blob/master" > README.md + find . \( -name "*.py" -o -name "*.sh" -o -name "* .md" \) -exec dos2unix {} \; + python setup.py sdist --format=zip bdist_wheel --universal bdist_wininst && twine check dist/* + +release: + python make_release.py + +clean: + rm -rfv dist build coverage_html_report mouse.egg-info \ No newline at end of file diff --git a/mouse/README.md b/mouse/README.md new file mode 100644 index 0000000..ea98e2f --- /dev/null +++ b/mouse/README.md @@ -0,0 +1,500 @@ + +mouse +===== + +Take full control of your mouse with this small Python library. Hook global events, register hotkeys, simulate mouse movement and clicks, and much more. + +_Huge thanks to [Kirill Pavlov](http://kirillpavlov.com/) for donating the package name. If you are looking for the Cheddargetter.com client implementation, [`pip install mouse==0.5.0`](https://pypi.python.org/pypi/mouse/0.5.0)._ + +## Features + +- Global event hook on all mice devices (captures events regardless of focus). +- **Listen** and **sends** mouse events. +- Works with **Windows** and **Linux** (requires sudo). +- **Pure Python**, no C modules to be compiled. +- **Zero dependencies**. Trivial to install and deploy, just copy the files. +- **Python 2 and 3**. +- Includes **high level API** (e.g. [record](#mouse.record) and [play](#mouse.play). +- Events automatically captured in separate thread, doesn't block main program. +- Tested and documented. + +This program makes no attempt to hide itself, so don't use it for keyloggers. + +## Usage + +Install the [PyPI package](https://pypi.python.org/pypi/mouse/): + + $ sudo pip install mouse + +or clone the repository (no installation required, source files are sufficient): + + $ git clone https://github.com/boppreh/mouse + +Then check the [API docs](https://github.com/boppreh/mouse#api) to see what features are available. + + +## Known limitations: + +- Events generated under Windows don't report device id (`event.device == None`). [#21](https://github.com/boppreh/keyboard/issues/21) +- To avoid depending on X the Linux parts reads raw device files (`/dev/input/input*`) but this requries root. +- Other applications, such as some games, may register hooks that swallow all key events. In this case `mouse` will be unable to report events. + + + +# API +#### Table of Contents + +- [mouse.**ButtonEvent**](#mouse.ButtonEvent) +- [mouse.**DOUBLE**](#mouse.DOUBLE) +- [mouse.**DOWN**](#mouse.DOWN) +- [mouse.**LEFT**](#mouse.LEFT) +- [mouse.**MIDDLE**](#mouse.MIDDLE) +- [mouse.**MoveEvent**](#mouse.MoveEvent) +- [mouse.**RIGHT**](#mouse.RIGHT) +- [mouse.**UP**](#mouse.UP) +- [mouse.**WheelEvent**](#mouse.WheelEvent) +- [mouse.**X**](#mouse.X) +- [mouse.**X2**](#mouse.X2) +- [mouse.**version**](#mouse.version) +- [mouse.**is\_pressed**](#mouse.is_pressed) +- [mouse.**press**](#mouse.press) *(aliases: `hold`)* +- [mouse.**release**](#mouse.release) +- [mouse.**click**](#mouse.click) +- [mouse.**double\_click**](#mouse.double_click) +- [mouse.**right\_click**](#mouse.right_click) +- [mouse.**wheel**](#mouse.wheel) +- [mouse.**move**](#mouse.move) +- [mouse.**drag**](#mouse.drag) +- [mouse.**on\_button**](#mouse.on_button) +- [mouse.**on\_click**](#mouse.on_click) +- [mouse.**on\_double\_click**](#mouse.on_double_click) +- [mouse.**on\_right\_click**](#mouse.on_right_click) +- [mouse.**on\_middle\_click**](#mouse.on_middle_click) +- [mouse.**wait**](#mouse.wait) +- [mouse.**get\_position**](#mouse.get_position) +- [mouse.**hook**](#mouse.hook) +- [mouse.**unhook**](#mouse.unhook) +- [mouse.**unhook\_all**](#mouse.unhook_all) +- [mouse.**record**](#mouse.record) +- [mouse.**play**](#mouse.play) *(aliases: `replay`)* + + + + +## class mouse.**ButtonEvent** + +ButtonEvent(event_type, button, time) + + + + +### ButtonEvent.**button** + +Alias for field number 1 + + + + +### ButtonEvent.**count**(self, value, /) + +Return number of occurrences of value. + + + + +### ButtonEvent.**event\_type** + +Alias for field number 0 + + + + +### ButtonEvent.**index**(self, value, start=0, stop=9223372036854775807, /) + +Return first index of value. + +Raises ValueError if the value is not present. + + + + +### ButtonEvent.**time** + +Alias for field number 2 + + + + + + +## mouse.**DOUBLE** +```py += 'double' +``` + + + +## mouse.**DOWN** +```py += 'down' +``` + + + +## mouse.**LEFT** +```py += 'left' +``` + + + +## mouse.**MIDDLE** +```py += 'middle' +``` + + + +## class mouse.**MoveEvent** + +MoveEvent(x, y, time) + + + + +### MoveEvent.**count**(self, value, /) + +Return number of occurrences of value. + + + + +### MoveEvent.**index**(self, value, start=0, stop=9223372036854775807, /) + +Return first index of value. + +Raises ValueError if the value is not present. + + + + +### MoveEvent.**time** + +Alias for field number 2 + + + + +### MoveEvent.**x** + +Alias for field number 0 + + + + +### MoveEvent.**y** + +Alias for field number 1 + + + + + + +## mouse.**RIGHT** +```py += 'right' +``` + + + +## mouse.**UP** +```py += 'up' +``` + + + +## class mouse.**WheelEvent** + +WheelEvent(delta, time) + + + + +### WheelEvent.**count**(self, value, /) + +Return number of occurrences of value. + + + + +### WheelEvent.**delta** + +Alias for field number 0 + + + + +### WheelEvent.**index**(self, value, start=0, stop=9223372036854775807, /) + +Return first index of value. + +Raises ValueError if the value is not present. + + + + +### WheelEvent.**time** + +Alias for field number 1 + + + + + + +## mouse.**X** +```py += 'x' +``` + + + +## mouse.**X2** +```py += 'x2' +``` + + + +## mouse.**version** +```py += '0.7.1' +``` + + + +## mouse.**is\_pressed**(button='left') + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L78) + +Returns True if the given button is currently pressed. + + + + +## mouse.**press**(button='left') + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L83) + +Presses the given button (but doesn't release). + + + + +## mouse.**release**(button='left') + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L87) + +Releases the given button. + + + + +## mouse.**click**(button='left') + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L91) + +Sends a click with the given button. + + + + +## mouse.**double\_click**(button='left') + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L96) + +Sends a double click with the given button. + + + + +## mouse.**right\_click**() + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L101) + +Sends a right click with the given button. + + + + +## mouse.**wheel**(delta=1) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L105) + +Scrolls the wheel `delta` clicks. Sign indicates direction. + + + + +## mouse.**move**(x, y, absolute=True, duration=0) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L109) + + +Moves the mouse. If `absolute`, to position (x, y), otherwise move relative +to the current position. If `duration` is non-zero, animates the movement. + + + + + +## mouse.**drag**(start\_x, start\_y, end\_x, end\_y, absolute=True, duration=0) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L143) + + +Holds the left mouse button, moving from start to end position, then +releases. `absolute` and `duration` are parameters regarding the mouse +movement. + + + + + +## mouse.**on\_button**(callback, args=(), buttons=('left', 'middle', 'right', 'x', 'x2'), types=('up', 'down', 'double')) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L156) + +Invokes `callback` with `args` when the specified event happens. + + + + +## mouse.**on\_click**(callback, args=()) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L170) + +Invokes `callback` with `args` when the left button is clicked. + + + + +## mouse.**on\_double\_click**(callback, args=()) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L174) + + +Invokes `callback` with `args` when the left button is double clicked. + + + + + +## mouse.**on\_right\_click**(callback, args=()) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L180) + +Invokes `callback` with `args` when the right button is clicked. + + + + +## mouse.**on\_middle\_click**(callback, args=()) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L184) + +Invokes `callback` with `args` when the middle button is clicked. + + + + +## mouse.**wait**(button='left', target\_types=('up', 'down', 'double')) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L188) + + +Blocks program execution until the given button performs an event. + + + + + +## mouse.**get\_position**() + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L199) + +Returns the (x, y) mouse position. + + + + +## mouse.**hook**(callback) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L203) + + +Installs a global listener on all available mouses, invoking `callback` +each time it is moved, a key status changes or the wheel is spun. A mouse +event is passed as argument, with type either `mouse.ButtonEvent`, +`mouse.WheelEvent` or `mouse.MoveEvent`. + +Returns the given callback for easier development. + + + + + +## mouse.**unhook**(callback) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L215) + + +Removes a previously installed hook. + + + + + +## mouse.**unhook\_all**() + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L221) + + +Removes all hooks registered by this application. Note this may include +hooks installed by high level functions, such as [`record`](#mouse.record). + + + + + +## mouse.**record**(button='right', target\_types=('down',)) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L228) + + +Records all mouse events until the user presses the given button. +Then returns the list of events recorded. Pairs well with [`play(events)`](#mouse.play). + +Note: this is a blocking function. +Note: for more details on the mouse hook and events see [`hook`](#mouse.hook). + + + + + +## mouse.**play**(events, speed\_factor=1.0, include\_clicks=True, include\_moves=True, include\_wheel=True) + +[\[source\]](https://github.com/boppreh/mouse/blob/master/mouse/__init__.py#L242) + + +Plays a sequence of recorded events, maintaining the relative time +intervals. If speed_factor is <= 0 then the actions are replayed as fast +as the OS allows. Pairs well with [`record()`](#mouse.record). + +The parameters `include_*` define if events of that type should be inluded +in the replay or ignored. + + + diff --git a/mouse/__init__.pyc b/mouse/__init__.pyc deleted file mode 100644 index 0e8936fcea774771629d0e2498c2c6f0ce753dce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12107 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 C!ib0f diff --git a/mouse/__pycache__/__init__.cpython-38.pyc b/mouse/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 80e1dc4810ff8e2626acd2bf5959f55fd0060f5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9978 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 diff --git a/mouse/__pycache__/_generic.cpython-38.pyc b/mouse/__pycache__/_generic.cpython-38.pyc deleted file mode 100644 index f58ab70375696765d62678a5376aa791069365ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2485 zcmWIL<>g{vU|{&pp%5R!!NBks#6iX!3=9ko3=9m#X$%YuDGVu$ISjdsQH;4vQA~^= zK2r{J6mtqg3R4bC6ibyr3PTEW4r?x36dNN$I76NS3qvY&gFF`KQWV*!`l2MeJm~xB7CqFscPm}Q$YhY<= zX=*Y^8W}Ue9O=ctz>vxi#hAhn#gxk2%n-$r!kEI;!Vtxp!kog=!Vtxl!kWU?!Vtxt z!k)s>!Vtxg!kNO=!Vtxo!kxm?!Vtxk!kfa^!Vtxs!XM0_DR7J5JvA@2C^Ok7v$zDr zN@hf|7sLix?FpLklQko^$IF)am2@G=4F<|$Mb<)#RhUN zBO4ClRr%^9B~rsw!`RGNBoofS z$dJMq%n;5{$i~7@!kEofzE@LA{h$VA{YwU zpkeV66mXg>MIguB;&iP@PAw?O%+I^USyGgkoSKxFoE^nkP?VWh5}#U;tjSUYN};z{ zQ_E8GN^Y@3!|)bkDmaiJ1P>?>`7`s%^0QOpp(=`nK>+}gVPNE9WMbrC;$akEtdd6$ z1~gq5F$~H9;Ls?6hQtv zE0koUD!|i_LJ2sVC}gH7WR@tDCl=?amnbCWfU-`d9$aULCgUx(lEk9))Dk~Uo?9$A z`N`S0*b|crOEZg7Z?PAp=AsHpLSSw2nQ8HPsUUrcMU^t37z1S_ z1{P3^u`zNmu`%*7axii+fk-~4Dkb#T!!!gXIfJ|a!r%x5rG*lP6vk%8CPrvdtTGMB z$ShXKO)bgDPf;k&$S=)FQAkQv$jmLsNzF~oD@jdJ$jk!=cXCE%PKrWuPGWJfo+jfh zVZZzmPlPJhqN4nwl}zBYS|o_YyMhHpsqxT|i3g`;1CVb)j$>e~QbhL`hH8{_3DU*P zz`y|ZmJKvrrZ8r67W0)bHZg+oEGPxlGS)CGV6I_Y$XKKUN~a(eBP4yXg3?zZA1D`V zGF3&uQ;AQ0enGK9epzY}*wdwXDXB#{m6>_z3g9A2AwNw4?D%4Z#Jm&*sDDzy2{IQH zQu#$GsYQrH=cmb51j<0S_#BIiQ;R^^92`=&nA1~BiWEWNBmzosoF$3H+3_j)d8tJT zAVE+Ogh(qzvJ4Ci#-QK=6$K0|d`w)7AXp`i8EoJ*h>-^1fdxukH4FfB}`;46GcCRnq7|f}|36un0iY&;mx3;LuhGO3lqLO9h2QK~ZX1W`1dLPNhO( zN=j-9Gz6fft)7CPCKIGYXDb5hDN@7YZa#<{%;|0*r-KqR15=e8y2DYGg32t8`1riU z+|>B^TU_z+x%nxjIUqJqe0*VPVh%*62o%#rVj!z|K?EpuL4p>X*gy%XNF5}h2_g`o z3TA-{h$2=71_ltX7!)QPjBHFCtQ?#iA{@*d+#DQWSxv56oRBgQRDpw>53v=b;T9)2 z#pLJb6oV5!q<-i2%q_?-DuE<@w)`YeH4ZiklEy*SL0BLc+~Tl-_{|PvbTOzN7hvRI Pg{vU|{&pp%A}}k%8ech=Yt-85kHG7#J9evlti{QW#Pga~N_NqZk<(QkbHc zQkbKdQ&^%{Qdpx{Q`n-|QrM%|Q#hhHQaGbHQ@EnIQn;hIQ+T3yQW;ZtQ}|N&Qv}kP zo0+0`QyEhPQ-o3k(wUl>qWDr7Q-o94QbeG#{3)Wr44PsuL9Wnbyv3E5n46kXQd*Fc zdW$6|HLc_pYf)x;MoAP~Ze~hKPU<#|zTDfy*I zIjK<`WvN9anaPPcQCu1MMVVFkc_oQCx44~3OG@(dT+34PN^Wtbf~feC%7WBeY)N2= zTP!7+xv96f!a;^ZRI#R{=9DDf;`GfgONEFqR{CiQ+~Q8o&&f$mF3HT#D=uPUU|_h# z;^XQTa*H*{)7>NF7Mri9i;ItI6l=JLtEg{vU|{&pp%8B^#=!6x#6iX!3=9ko3=9m#KNuJoQW#Pga~Pr^G-DJan9mf& zl){k0l*63M9L2&2l4H(c&1H*X1G8Cj*mK#V*clnB1X37MSaUdXIiolk8NwOz6j&Hi zxw5&6au^vv5G>0Hk&R@?V~Su%VT;ffMS;f@ka;Ys0b zVTclPXGq~o;csC`;ZGHAW{whZXGjr95o}>d5d`x^!7dbw5=&u75y}zIm57pHWJr}r z5l#_lW{Q$b5si{c5lazoVTh7Wkw}qjVTh7RkxG$nVTh7Vkx7wlVTh7TVGL%_lzRyZ z6F*JHTP!7+xv83rx7b25ic%9(KqBcm`AM3Lw^##9Q%h5$SaWhbJUm}AGB7Z_WC9V) zAc6%%h%qoQB!disVIBqs22k)jg97*#D1aGL7;+eD8B#zrV=ZF|QwmcGb2C#dQwmEh za}C1+<{G9N<`R~L%!~{vthFpv3MH&5Y|V@=46#DBtWbHD8di{ep;b6To&gI(30pQ- zQ3E4GEgK_4l~4^^7JCUtHgi!y4OFlKSpaHMe8u&3~VA!8bQ4d*2m_d`@uLu+-Rowb1sb%`5nRx}JCAXN$lQL66SsXG`K?DOc149ug z!9|H!7!-SWcz9%*nIOIgF2if#DV##A8uBp`P)G}ah`B|ySCB^y$Mfr(ENvWA7`nma~#i{!7 zd6^Z-`MJ6Id3ptvx43f?vs2?C7E6LcR0EVI83mZR7+Dzkm{=H@7vxSDjlMjQW#U1S{S03Q(01&Q&?IU zni->5Q(012Q`o?4wiNahjuwU}_7u((t`>$Ujuh@-P|R_=mZj#ExTKb4CZ{HYauLV^ z5C*Y97@T83`KgAnh9RCIg`tKao)Jtkr7#3DtYq}lWCq1jNyaVicyL;aPs_|ny~Pus zUs_U7S_0;2GTmY+PR&UxQUJvtC^*4kS|kICNsjpV%)HE!_;_z*4Wxb{V>2ToLkW8`1E}l-XIjQO zMp&k8XGmjAVM$?a;izRQ;aI>~!vxBbAX|eOG}-)aF%>0M2?nGVY`D1KdcN#Sb3zOk9k7jC_n$;>d1CQi*TIO1oTGm=NP(_!*D9s?wP{UHgTEkYu zkj0k93ii-*P-r%^=s9Y#7a4$34-2R&E&><89Lb3}$;Fvfska2cX*515GcO(*n{1_d zpmH0W-8I?4QFx0bC9x#&7JG4Oa(-S)@hzU*%;chc7>}i-vLN*qOLBfn>Mho?#GFz{ z3WdZrB%(n!$AfJO1qBc&{WCBMF^Zu@Ekao`s3`#Q00@Ih2~ctdhfWp)149Wz31c$@ zsC0;70);~fQw>WqV=Y?=Qw?hhlL$jIV=X%HD-|!DE2{VOq1&tTS{hGZhp!w=Dhs! zTg;hxCE!3U0u{7Hrl62!a}A3Rj`S-s1Zffl5#pf4#RU$`A}f%9HHZME`Y86yypq)P z)S@Vkw4%i1lFaj0n81qa3OM0pb!Sd zG6SOkBL}F0VisW%Kud^7>isl1Z*j!O=OyN*#>d~{ijU9DPbtj-v3cU-3riDoATmWN zAfIs*6y+DB7L`)*99YtSOL!gmnQMDAg1ifT~taHb_GbC6|Me z4=7!Oi+)gQ0TuiU7;6|7Ff9b9y+Q_%UPzJ8e2W{LVd4ux4dz?S1*IiLppXW&s#CyK zKBOcC2RA6BZ}AqFBo>v#gECQOUV1ht%t4I+2Bs=gtbqfsmJ!teiV2!bx7bP&i_%j| zZm}d5r5A^2vKN7ZugC+G64)V*D89u8Db$KUp?Zt6IJLwjF*P?o?-ncAFikc{q6Za> zMgE{f;te9aKt`~YfO`j!#0)N3LH+9&`#aJbW-!B*e z4ssT_-~eR_P_dfD2x@Nif;ueBej%VPNm5RJa<(QD#9z$msU=7u3lCm!;1`3O1rAik zDh2Eg0R=xKBchaHpm+xb9@r_MiVozI1&q+L3Di+Rs_enx1jV}C8Y&9ska0nZBm!i;^d;t0#K1wB@ao=pys7QW^p{YwGCoqL;EFF zntoOaeu=rMwn`e&aZ0h;_L@q1+V&n+3Lc4hDLJV{#kLyJaWQ$Z+L|a)45~Rfp$+Zg zCQx%qp#)SjF!uA+GS)CIU|h&h%LMAc1u_INM1We7Vk`_LOxavTX0WCfD9=SOWHQt; zL+b~o66P$nh0HDtu?CR(C55Skc>#M0a}Dc4rUe`+EDIUM8EV;T7;0Fv*@}EhIBVFN z8N(PD847(sW@)neRf&Uo7RmZarN#Q-Mh>VumzkVeTqOWvLB+s9QpE+PG-6V;HNjPl zCKsgfWemz9f^L~Psebt-ZuzBoDUfCuQ&H+I_O#5rl*F8zTYQjQ7+;WBQj%JfcZYfzh$i&2b`58M%wU=(BI zU@S@k#Sp0Y0~Ny{49Y{GoCzxZi$TpyP^8r`h%3p?}C5$zU&_Lw@2P%_al_XNw zB~|KXrs!+wf&))ilc@-l!65!*DvARoXOOArju*#td{Sk6W=a>x^&k^Kb!HLBQ7DNF zlyO0_pbS$S25x{fGl1Nf!r07M%LK~A@eq=^gr$VFhM^fG&RoM>WLCmf!(79Z!qm$Y z%uvEo!VZ;VsbMJ!Dq*W(fyse;|IB_>LXh63f?HyCssbb%X)=NfPE8JQj}q)hNE;p0 zRK3Ll@)9_J!8sA^cuiJF5J-TU5Zq~?PAnvyLBJ2GZ%?~25_1g zn;5|n%?znItMrijS4H{xC7}LQX>qDTNk(R|LQZB=t)wUU6wrYCOp3l_2kcVwi!Ehp{LV)L4^; zH0nU59i$Tga($6KC{uDm>aEPYba15yPI|Xk!Sytxg3JJ=KTu1s$PvT>)nm6nZNeZ| zA299c6bz<)gPn^&c?KM@x7hNNK!XyH2nLm^MG+v|xRdj9a#Fz!!{Q=P^SKC=0*gTH z7f7^&k}EjC!4AjjR}LFUqs|WGiDFQ5jDrybc^E;EiBW)&k5Pz;g#|Q*0me)$OdPTT T1_HvM1|(>-gM*iYg+m$uDnrx6 diff --git a/mouse/__pycache__/_nixmouse.cpython-38.pyc b/mouse/__pycache__/_nixmouse.cpython-38.pyc deleted file mode 100644 index 90d0e73032dfb662a86e506280d255db69c66927..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3578 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