rearranged as module with a setup.py