func extractZip(zipfile, root string) error {
	archive, err := zip.OpenReader(zipfile)
	if err != nil {
		return err
	}
	defer archive.Close()
	for _, f := range archive.File {
		path := filepath.Join(root, f.Name)
		switch {
		case f.FileInfo().IsDir():
			if err := os.Mkdir(path, f.Mode()); err != nil {
				return err
			}
		default:
			extractZipFile(path, f)
		}
	}
	return nil
}