This is a student group's homework. It's very buggy and verbose. See README.