Special thanks to Artem Smirnov for a lot of useful tricks.