import base64
import binascii


def b64urldecode(data):
    """Decodes an unpadded Base64url-encoded string.

    :param data: data bytes to decode
    :type data: bytes

    :returns bytes

    """
    return base64.urlsafe_b64decode(data + b"===="[len(data) % 4 :])


def b64urlencode(data):
    """Encode a byte string into a Base64url-encoded string without padding

    :param data: data bytes to encode
    :type data: bytes

    :returns str

    """
    return base64.urlsafe_b64encode(data).replace(b"=", b"").decode("utf8")


def num_to_bytes(n, pad_to):
    """Returns the byte representation of an integer, in big-endian order.
    :param n: The integer to encode.
    :type n: int
    :param pad_to: Expected length of result, zeropad if necessary.
    :type pad_to: int
    :returns bytes
    """
    h = "%x" % n
    r = binascii.unhexlify("0" * (len(h) % 2) + h)
    return b"\x00" * (pad_to - len(r)) + r
