code: def decrypt_with_ad(self, ad: bytes, ciphertext: bytes) -> bytes:
          
          if self.n == MAX_NONCE:
              raise NoiseMaxNonceError('Nonce has depleted!')
  
          if not self.has_key():
              return ciphertext
  
          plaintext = self.cipher.decrypt(self.k, self.n, ad, ciphertext)
          self.n = self.n + 1
          return plaintext
docs: If k is non-empty returns DECRYPT(k, n++, ad, ciphertext). Otherwise returns ciphertext. If an authentication
          failure occurs in DECRYPT() then n is not incremented and an error is signaled to the caller.
  
          :param ad: bytes sequence
          :param ciphertext: bytes sequence
          :return: plaintext bytes sequence