Instead of requiring hashtable, I copied all the source here and I'll maintain them both