Done. Need to fix tiny bugs. But I'm finally done