Created by beining wang
Contributed by Ben Mingo
Contributed by Martin Vácha
Contributed by Nick Sherman