code: def decode(s):
      
  
      s = s.lower()
      r = ""
      t = ""
      for c in s:
          if c >= 'a' and c <= 'z':
              t += c
          elif c == ':':
              try:
                  if t[-1] == 'u':
                      t = t[:-1] + u"\u00fc"
              except:
                  pass
          else:
              if c >= '0' and c <= '5':
                  tone = int(c) % 5
                  if tone != 0:
                      m = re.search(u"[aoeiuv\u00fc]+", t)
                      if m is None:
                          t += c
                      elif len(m.group(0)) == 1:
                          t = t[:m.start(0)] + PinyinToneMark[tone][PinyinToneMark[0].index(m.group(0))] + t[m.end(0):]
                      else:
                          if 'a' in t:
                              t = t.replace("a", PinyinToneMark[tone][0])
                          elif 'o' in t:
                              t = t.replace("o", PinyinToneMark[tone][1])
                          elif 'e' in t:
                              t = t.replace("e", PinyinToneMark[tone][2])
                          elif t.endswith("ui"):
                              t = t.replace("i", PinyinToneMark[tone][3])
                          elif t.endswith("iu"):
                              t = t.replace("u", PinyinToneMark[tone][4])
                          else:
                              t += "!"
              r += t
              t = ""
      r += t
      return r
docs: Converts text in the numbering format of pinyin ("ni3hao3") to text with the 
      appropriate tone marks ("nǐhǎo").