Author: Haojian.