pub fn normalize(s: &str) -> String {
let lines: Vec<&str> = s.lines().map(|l| l.trim_end()).collect();
let mut result = String::new();
let mut prev_blank = false;
for line in &lines {
let is_blank = line.is_empty();
if is_blank && prev_blank {
continue;
}
result.push_str(line);
result.push('\n');
prev_blank = is_blank;
}
result.trim_end().to_string()
}