Recent Developments in String Theory: From Perturbative Dualities to M-Theory