See the code in #6.