he ordenado el código y algo de doc para que se entienda lo que hace...