Разделю пост на две части.

Часть первая

Часть вторая