old_contents: # Copyright (c) 2013 Yubico AB
  # All rights reserved.
  #
  #   Redistribution and use in source and binary forms, with or
  #   without modification, are permitted provided that the following
  #   conditions are met:
  #
  #    1. Redistributions of source code must retain the above copyright
  #       notice, this list of conditions and the following disclaimer.
  #    2. Redistributions in binary form must reproduce the above
  #       copyright notice, this list of conditions and the following
  #       disclaimer in the documentation and/or other materials provided
  #       with the distribution.
  #
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  # POSSIBILITY OF SUCH DAMAGE.
  
  from u2flib_host.yubicommon.compat import text_type
  
  from base64 import urlsafe_b64decode, urlsafe_b64encode
  from hashlib import sha256
  
  __all__ = [
      'u2str',
      'websafe_encode',
      'websafe_decode',
      'H'
  ]
  
  
  def u2str(data):
      """Recursivly converts unicode object to UTF-8 formatted strings."""
      if isinstance(data, dict):
          return {u2str(k): u2str(v) for k, v in data.items()}
      elif isinstance(data, list):
          return [u2str(x) for x in data]
      elif isinstance(data, text_type):
          return data.encode('utf-8')
      else:
          return data
  
  
  def websafe_decode(data):
      if isinstance(data, text_type):
          data = data.encode('ascii')
      data += b'=' * (-len(data) % 4)
      return urlsafe_b64decode(data)
  
  
  def websafe_encode(data):
      if isinstance(data, text_type):
          data = data.encode('ascii')
      return urlsafe_b64encode(data).replace(b'=', b'').decode('ascii')
  
  
  def H(data):
      f = sha256()
      f.update(data)
      return f.digest()
  
new_contents: # Copyright (c) 2013 Yubico AB
  # All rights reserved.
  #
  #   Redistribution and use in source and binary forms, with or
  #   without modification, are permitted provided that the following
  #   conditions are met:
  #
  #    1. Redistributions of source code must retain the above copyright
  #       notice, this list of conditions and the following disclaimer.
  #    2. Redistributions in binary form must reproduce the above
  #       copyright notice, this list of conditions and the following
  #       disclaimer in the documentation and/or other materials provided
  #       with the distribution.
  #
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  # POSSIBILITY OF SUCH DAMAGE.
  
  from u2flib_host.yubicommon.compat import text_type
  
  from base64 import urlsafe_b64decode, urlsafe_b64encode
  from hashlib import sha256
  
  __all__ = [
      'u2str',
      'websafe_encode',
      'websafe_decode',
      'H'
  ]
  
  
  def u2str(data):
      """Recursively converts unicode objects to UTF-8 encoded byte strings."""
      if isinstance(data, dict):
          return {u2str(k): u2str(v) for k, v in data.items()}
      elif isinstance(data, list):
          return [u2str(x) for x in data]
      elif isinstance(data, text_type):
          return data.encode('utf-8')
      else:
          return data
  
  
  def websafe_decode(data):
      if isinstance(data, text_type):
          data = data.encode('ascii')
      data += b'=' * (-len(data) % 4)
      return urlsafe_b64decode(data)
  
  
  def websafe_encode(data):
      if isinstance(data, text_type):
          data = data.encode('ascii')
      return urlsafe_b64encode(data).replace(b'=', b'').decode('ascii')
  
  
  def H(data):
      f = sha256()
      f.update(data)
      return f.digest()
  
subject: Correct spelling/phrasing of docstring