todo fractorize