блин это долго писать но попробую