移植thoryan过来,并做了相关修改和注释.