'Instantiate a new IPv6 Network object.
Args:
address: A string or integer representing the IPv6 network or the IP
and prefix/netmask.
\'2001:db8::/128\'
\'2001:db8:0000:0000:0000:0000:0000:0000/128\'
\'2001:db8::\'
are all functionally the same in IPv6.  That is to say,
failing to provide a subnetmask will create an object with
a mask of /128.
Additionally, an integer can be passed, so
IPv6Network(\'2001:db8::\') ==
IPv6Network(42540766411282592856903984951653826560)
or, more generally
IPv6Network(int(IPv6Network(\'2001:db8::\'))) ==
IPv6Network(\'2001:db8::\')
strict: A boolean. If true, ensure that we have been passed
A true network address, eg, 2001:db8::1000/124 and not an
IP address on a network, eg, 2001:db8::1/124.
Raises:
AddressValueError: If address isn\'t a valid IPv6 address.
NetmaskValueError: If the netmask isn\'t valid for
an IPv6 address.
ValueError: If strict was True and a network address was not
supplied.'

def __init__(self, address, strict=True):

    _BaseV6.__init__(self, address)
    _BaseNetwork.__init__(self, address)
    if isinstance(address, int):
        if ((address < 0) or (address > self._ALL_ONES)):
            raise AddressValueError(address)
        self.network_address = IPv6Address(address)
        self._prefixlen = self._max_prefixlen
        self.netmask = IPv6Address(self._ALL_ONES)
        if strict:
            if (IPv6Address((int(self.network_address) & int(self.netmask))) != self.network_address):
                raise ValueError(('%s    has    host    bits    set' % str(self)))
        self.network_address = IPv6Address((int(self.network_address) & int(self.netmask)))
        return
    if (isinstance(address, bytes) and (len(address) == 16)):
        tmp = struct.unpack('!QQ', address)
        self.network_address = IPv6Address(((tmp[0] << 64) | tmp[1]))
        self._prefixlen = self._max_prefixlen
        self.netmask = IPv6Address(self._ALL_ONES)
        if strict:
            if (IPv6Address((int(self.network_address) & int(self.netmask))) != self.network_address):
                raise ValueError(('%s    has    host    bits    set' % str(self)))
            self.network_address = IPv6Address((int(self.network_address) & int(self.netmask)))
            return
    addr = str(address).split('/')
    if (len(addr) > 2):
        raise AddressValueError(address)
    self.network_address = IPv6Address(self._ip_int_from_string(addr[0]))
    if (len(addr) == 2):
        if self._is_valid_netmask(addr[1]):
            self._prefixlen = int(addr[1])
        else:
            raise NetmaskValueError(addr[1])
    else:
        self._prefixlen = self._max_prefixlen
    self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
    if strict:
        if (IPv6Address((int(self.network_address) & int(self.netmask))) != self.network_address):
            raise ValueError(('%s    has    host    bits    set' % str(self)))
    self.network_address = IPv6Address((int(self.network_address) & int(self.netmask)))
    if (self._prefixlen == (self._max_prefixlen - 1)):
        self.hosts = self.__iter__
