Here's a new version with less special case code.