обновлено и добавлены некоторые комментарии