diff --git a/api/server/router/network/network_routes.go b/api/server/router/network/network_routes.go index 1c3e0632ee1cc..8fdd1a8e8cf78 100644 --- a/api/server/router/network/network_routes.go +++ b/api/server/router/network/network_routes.go @@ -163,6 +163,12 @@ func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r // network with the same ID (from local scope previously) if _, ok := listByFullName[nw.ID]; !ok { listByFullName[nw.ID] = nw + } else { + // If the network is already in the listByFullName, update the available IPs from the swarm scope + n := listByFullName[nw.ID] + n.AvailableIps = nw.AvailableIps + n.AvailableAllocationIps = nw.AvailableAllocationIps + listByFullName[nw.ID] = n } } if strings.HasPrefix(nw.ID, term) { diff --git a/api/types/network/ipam.go b/api/types/network/ipam.go index f319e1402b081..8b8515fc3e183 100644 --- a/api/types/network/ipam.go +++ b/api/types/network/ipam.go @@ -17,10 +17,12 @@ type IPAM struct { // IPAMConfig represents IPAM configurations type IPAMConfig struct { - Subnet string `json:",omitempty"` - IPRange string `json:",omitempty"` - Gateway string `json:",omitempty"` - AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` + Subnet string `json:",omitempty"` + IPRange string `json:",omitempty"` + Gateway string `json:",omitempty"` + AuxAddress map[string]string `json:"AuxiliaryAddresses,omitempty"` + AvailableIps uint64 `json:",omitempty"` + AvailableAllocationIps uint64 `json:",omitempty"` } type ipFamily string diff --git a/api/types/network/network.go b/api/types/network/network.go index d34b8ab724983..7ae6316f54cbc 100644 --- a/api/types/network/network.go +++ b/api/types/network/network.go @@ -72,24 +72,26 @@ type DisconnectOptions struct { // Inspect is the body of the "get network" http response message. type Inspect struct { - Name string // Name is the name of the network - ID string `json:"Id"` // ID uniquely identifies a network on a single machine - Created time.Time // Created is the time the network created - Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level) - Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`) - EnableIPv4 bool // EnableIPv4 represents whether IPv4 is enabled - EnableIPv6 bool // EnableIPv6 represents whether IPv6 is enabled - IPAM IPAM // IPAM is the network's IP Address Management - Internal bool // Internal represents if the network is used internal only - Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode. - Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster. - ConfigFrom ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network. - ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services. - Containers map[string]EndpointResource // Containers contains endpoints belonging to the network - Options map[string]string // Options holds the network specific options to use for when creating the network - Labels map[string]string // Labels holds metadata specific to the network being created - Peers []PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network - Services map[string]ServiceInfo `json:",omitempty"` + Name string // Name is the name of the network + ID string `json:"Id"` // ID uniquely identifies a network on a single machine + Created time.Time // Created is the time the network created + Scope string // Scope describes the level at which the network exists (e.g. `swarm` for cluster-wide or `local` for machine level) + Driver string // Driver is the Driver name used to create the network (e.g. `bridge`, `overlay`) + EnableIPv4 bool // EnableIPv4 represents whether IPv4 is enabled + EnableIPv6 bool // EnableIPv6 represents whether IPv6 is enabled + IPAM IPAM // IPAM is the network's IP Address Management + AvailableIps uint64 // AvailableIps represents the number of available IPs in the network + AvailableAllocationIps uint64 // AvailableAllocationIps represents the number of available dynamic IPs in the network + Internal bool // Internal represents if the network is used internal only + Attachable bool // Attachable represents if the global scope is manually attachable by regular containers from workers in swarm mode. + Ingress bool // Ingress indicates the network is providing the routing-mesh for the swarm cluster. + ConfigFrom ConfigReference // ConfigFrom specifies the source which will provide the configuration for this network. + ConfigOnly bool // ConfigOnly networks are place-holder networks for network configurations to be used by other networks. ConfigOnly networks cannot be used directly to run containers or services. + Containers map[string]EndpointResource // Containers contains endpoints belonging to the network + Options map[string]string // Options holds the network specific options to use for when creating the network + Labels map[string]string // Labels holds metadata specific to the network being created + Peers []PeerInfo `json:",omitempty"` // List of peer nodes for an overlay network + Services map[string]ServiceInfo `json:",omitempty"` } // Summary is used as response when listing networks. It currently is an alias diff --git a/api/types/swarm/network.go b/api/types/swarm/network.go index 98ef3284d1da0..82fdadcf60380 100644 --- a/api/types/swarm/network.go +++ b/api/types/swarm/network.go @@ -115,7 +115,9 @@ type IPAMOptions struct { // IPAMConfig represents ipam configuration. type IPAMConfig struct { - Subnet string `json:",omitempty"` - Range string `json:",omitempty"` - Gateway string `json:",omitempty"` + Subnet string `json:",omitempty"` + Range string `json:",omitempty"` + Gateway string `json:",omitempty"` + AvailableIps uint64 `json:",omitempty"` + AvailableAllocationIps uint64 `json:",omitempty"` } diff --git a/daemon/cluster/convert/network.go b/daemon/cluster/convert/network.go index ebc8eb3b90342..8de9a84584816 100644 --- a/daemon/cluster/convert/network.go +++ b/daemon/cluster/convert/network.go @@ -140,6 +140,7 @@ func swarmPortConfigToAPIPortConfig(portConfig *swarmapi.PortConfig) types.PortC func BasicNetworkFromGRPC(n swarmapi.Network) network.Inspect { spec := n.Spec var ipam network.IPAM + var availableIps, availableAllocationIps uint64 if n.IPAM != nil { if n.IPAM.Driver != nil { ipam.Driver = n.IPAM.Driver.Name @@ -154,18 +155,25 @@ func BasicNetworkFromGRPC(n swarmapi.Network) network.Inspect { AuxAddress: ic.Reserved, }) } + + for _, ipamCfg := range n.IPAM.Configs { + availableIps += ipamCfg.AvailableIps + availableAllocationIps += ipamCfg.AvailableAllocationIps + } } nr := network.Inspect{ - ID: n.ID, - Name: n.Spec.Annotations.Name, - Scope: scope.Swarm, - EnableIPv6: spec.Ipv6Enabled, - IPAM: ipam, - Internal: spec.Internal, - Attachable: spec.Attachable, - Ingress: IsIngressNetwork(&n), - Labels: n.Spec.Annotations.Labels, + ID: n.ID, + Name: n.Spec.Annotations.Name, + Scope: scope.Swarm, + EnableIPv6: spec.Ipv6Enabled, + IPAM: ipam, + Internal: spec.Internal, + AvailableIps: availableIps, + AvailableAllocationIps: availableAllocationIps, + Attachable: spec.Attachable, + Ingress: IsIngressNetwork(&n), + Labels: n.Spec.Annotations.Labels, } nr.Created, _ = gogotypes.TimestampFromProto(n.Meta.CreatedAt) diff --git a/daemon/network.go b/daemon/network.go index 8e4687e121082..ee4552c877483 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -617,25 +617,30 @@ func buildNetworkResource(nw *libnetwork.Network) networktypes.Inspect { if nw == nil { return networktypes.Inspect{} } - + availableIps, availableAllocationIps, err := nw.AvailableIPs() + if err != nil { + availableIps = 0 + } return networktypes.Inspect{ - Name: nw.Name(), - ID: nw.ID(), - Created: nw.Created(), - Scope: nw.Scope(), - Driver: nw.Type(), - EnableIPv4: nw.IPv4Enabled(), - EnableIPv6: nw.IPv6Enabled(), - IPAM: buildIPAMResources(nw), - Internal: nw.Internal(), - Attachable: nw.Attachable(), - Ingress: nw.Ingress(), - ConfigFrom: networktypes.ConfigReference{Network: nw.ConfigFrom()}, - ConfigOnly: nw.ConfigOnly(), - Containers: map[string]networktypes.EndpointResource{}, - Options: nw.DriverOptions(), - Labels: nw.Labels(), - Peers: buildPeerInfoResources(nw.Peers()), + Name: nw.Name(), + ID: nw.ID(), + Created: nw.Created(), + Scope: nw.Scope(), + Driver: nw.Type(), + EnableIPv4: nw.IPv4Enabled(), + EnableIPv6: nw.IPv6Enabled(), + AvailableIps: availableIps, + AvailableAllocationIps: availableAllocationIps, + IPAM: buildIPAMResources(nw), + Internal: nw.Internal(), + Attachable: nw.Attachable(), + Ingress: nw.Ingress(), + ConfigFrom: networktypes.ConfigReference{Network: nw.ConfigFrom()}, + ConfigOnly: nw.ConfigOnly(), + Containers: map[string]networktypes.EndpointResource{}, + Options: nw.DriverOptions(), + Labels: nw.Labels(), + Peers: buildPeerInfoResources(nw.Peers()), } } diff --git a/libnetwork/cnmallocator/networkallocator.go b/libnetwork/cnmallocator/networkallocator.go index b4a97b72217f9..cda40ea63a309 100644 --- a/libnetwork/cnmallocator/networkallocator.go +++ b/libnetwork/cnmallocator/networkallocator.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/libnetwork/driverapi" "github.com/docker/docker/libnetwork/drivers/remote" "github.com/docker/docker/libnetwork/drvregistry" + "github.com/docker/docker/libnetwork/internal/netiputil" "github.com/docker/docker/libnetwork/ipamapi" "github.com/docker/docker/libnetwork/ipams/defaultipam" remoteipam "github.com/docker/docker/libnetwork/ipams/remote" @@ -114,6 +115,23 @@ func (p *Provider) NewAllocator(netConfig *networkallocator.Config) (networkallo return na, nil } +func (na *cnmNetworkAllocator) GetNetwork(id string) (*api.Network, error) { + n, ok := na.networks[id] + if !ok { + return nil, fmt.Errorf("network %s not found", id) + } + return n.nw, nil +} +func (na *cnmNetworkAllocator) UpdateAvailableIps(networkId, cidr string, availableIps, availableAllocationIps uint64) error { + n, ok := na.networks[networkId] + if !ok { + return fmt.Errorf("network %s not found", networkId) + } + n.nw.UpdateAvailableIps(cidr, availableIps, availableAllocationIps) + na.networks[networkId] = n + return nil +} + // Allocate allocates all the necessary resources both general // and driver-specific which may be specified in the NetworkSpec func (na *cnmNetworkAllocator) Allocate(n *api.Network) error { @@ -533,7 +551,7 @@ func (na *cnmNetworkAllocator) releaseEndpoints(networks []*api.NetworkAttachmen poolID := localNet.endpoints[addr] delete(localNet.endpoints, addr) - ip, _, err := net.ParseCIDR(addr) + ip, ipNet, err := net.ParseCIDR(addr) if err != nil { log.G(context.TODO()).Errorf("Could not parse IP address %s while releasing", addr) continue @@ -542,6 +560,11 @@ func (na *cnmNetworkAllocator) releaseEndpoints(networks []*api.NetworkAttachmen if err := ipam.ReleaseAddress(poolID, ip); err != nil { log.G(context.TODO()).WithError(err).Errorf("IPAM failure while releasing IP address %s", addr) } + + availableIps, availableAllocationIps, _ := ipam.GetAvailableIPs(poolID) + if err := na.UpdateAvailableIps(localNet.nw.ID, ipNet.String(), availableIps, availableAllocationIps); err != nil { + return errors.Wrap(err, "could not find network") + } } // Clear out the address list when we are done with @@ -589,7 +612,7 @@ func (na *cnmNetworkAllocator) allocateVIP(vip *api.Endpoint_VirtualIP) error { opts = setIPAMSerialAlloc(localNet.nw.IPAM.Driver.Options) } - for _, poolID := range localNet.pools { + for cidr, poolID := range localNet.pools { ip, _, err := ipam.RequestAddress(poolID, addr, opts) if err != nil && err != ipamapi.ErrNoAvailableIPs && err != ipamapi.ErrIPOutOfRange { return errors.Wrap(err, "could not allocate VIP from IPAM") @@ -600,6 +623,11 @@ func (na *cnmNetworkAllocator) allocateVIP(vip *api.Endpoint_VirtualIP) error { ipStr := ip.String() localNet.endpoints[ipStr] = poolID vip.Addr = ipStr + + availableIps, availableAllocationIps, _ := ipam.GetAvailableIPs(poolID) + if err := na.UpdateAvailableIps(localNet.nw.ID, cidr, availableIps, availableAllocationIps); err != nil { + return errors.Wrap(err, "could not find network") + } return nil } } @@ -625,7 +653,7 @@ func (na *cnmNetworkAllocator) deallocateVIP(vip *api.Endpoint_VirtualIP) error poolID := localNet.endpoints[vip.Addr] delete(localNet.endpoints, vip.Addr) - ip, _, err := net.ParseCIDR(vip.Addr) + ip, ipNet, err := net.ParseCIDR(vip.Addr) if err != nil { log.G(context.TODO()).Errorf("Could not parse VIP address %s while releasing", vip.Addr) return err @@ -636,7 +664,9 @@ func (na *cnmNetworkAllocator) deallocateVIP(vip *api.Endpoint_VirtualIP) error return err } - return nil + availableIps, availableAllocationIps, _ := ipam.GetAvailableIPs(poolID) + cidr, _ := netiputil.ToPrefix(ipNet) + return na.UpdateAvailableIps(vip.NetworkID, cidr.String(), availableIps, availableAllocationIps) } // allocate the IP addresses for a single network attachment of the task. @@ -678,7 +708,7 @@ func (na *cnmNetworkAllocator) allocateNetworkIPs(nAttach *api.NetworkAttachment opts = setIPAMSerialAlloc(localNet.nw.IPAM.Driver.Options) } - for _, poolID := range localNet.pools { + for cidr, poolID := range localNet.pools { var err error ip, _, err = ipam.RequestAddress(poolID, addr, opts) @@ -692,6 +722,10 @@ func (na *cnmNetworkAllocator) allocateNetworkIPs(nAttach *api.NetworkAttachment localNet.endpoints[ipStr] = poolID addresses[i] = ipStr nAttach.Addresses = addresses + availableIps, availableAllocationIps, _ := ipam.GetAvailableIPs(poolID) + if err := na.UpdateAvailableIps(nAttach.Network.ID, cidr, availableIps, availableAllocationIps); err != nil { + return errors.Wrap(err, "could not find network") + } return nil } } @@ -937,6 +971,8 @@ func (na *cnmNetworkAllocator) allocatePools(n *api.Network) (map[string]string, ic.Gateway = gwIP.IP.String() } + availableIPs, availableAllocationIPs, _ := ipam.GetAvailableIPs(alloc.PoolID) + n.UpdateAvailableIps(alloc.Pool.String(), availableIPs, availableAllocationIPs) } return pools, nil diff --git a/libnetwork/cnmallocator/networkallocator_test.go b/libnetwork/cnmallocator/networkallocator_test.go index d1ca16056efd2..19c3b4898aaa7 100644 --- a/libnetwork/cnmallocator/networkallocator_test.go +++ b/libnetwork/cnmallocator/networkallocator_test.go @@ -754,6 +754,10 @@ func (a *mockIpam) IsBuiltIn() bool { return true } +func (a *mockIpam) GetAvailableIPs(poolID string) (uint64, uint64, error) { + return 0, 0, nil +} + func TestCorrectlyPassIPAMOptions(t *testing.T) { var err error expectedIpamOptions := map[string]string{"network-name": "freddie"} diff --git a/libnetwork/internal/addrset/addrset.go b/libnetwork/internal/addrset/addrset.go index b2df6c71b5654..5f8cd16ad9d12 100644 --- a/libnetwork/internal/addrset/addrset.go +++ b/libnetwork/internal/addrset/addrset.go @@ -174,6 +174,18 @@ func (as *AddrSet) getBitmap(addr netip.Addr) (*bitmap.Bitmap, netip.Prefix, err return bm, bmKey, nil } +func (as *AddrSet) Unselected() uint64 { + var unselected uint64 + maxUint64 := ^uint64(0) + for _, bm := range as.bitmaps { + if maxUint64-unselected < bm.Unselected() { + return maxUint64 + } + unselected += bm.Unselected() + } + return unselected +} + func (as *AddrSet) addrsPerBitmap() uint64 { bits := as.pool.Addr().BitLen() - as.pool.Bits() if bits > maxBitsPerBitmap { diff --git a/libnetwork/ipamapi/contract.go b/libnetwork/ipamapi/contract.go index 2cf8f74ad35ed..7daf969e48b13 100644 --- a/libnetwork/ipamapi/contract.go +++ b/libnetwork/ipamapi/contract.go @@ -55,6 +55,9 @@ type Ipam interface { // IsBuiltIn returns true if it is a built-in driver. IsBuiltIn() bool + + // GetAvailableIPs returns the number of free IPs in the pool for IPv4 + GetAvailableIPs(poolID string) (uint64, uint64, error) } type PoolRequest struct { diff --git a/libnetwork/ipams/defaultipam/address_space.go b/libnetwork/ipams/defaultipam/address_space.go index a3f8806eeef7a..ae1e859843ffa 100644 --- a/libnetwork/ipams/defaultipam/address_space.go +++ b/libnetwork/ipams/defaultipam/address_space.go @@ -5,11 +5,13 @@ package defaultipam import ( "context" + "errors" "net/netip" "slices" "sync" "github.com/containerd/log" + "github.com/docker/docker/libnetwork/internal/addrset" "github.com/docker/docker/libnetwork/internal/netiputil" "github.com/docker/docker/libnetwork/ipamapi" "github.com/docker/docker/libnetwork/ipamutils" @@ -97,7 +99,9 @@ func (aSpace *addrSpace) allocateSubnetL(nw, sub netip.Prefix) error { if aSpace.overlaps(nw) { return ipamapi.ErrPoolOverlap } - return aSpace.allocatePool(nw) + p := aSpace.allocatePool(nw) + aSpace.subnets[nw].availableAllocationIps = aSpace.subnets[nw].addrs.Unselected() + return p } // Look for parent pool @@ -109,9 +113,68 @@ func (aSpace *addrSpace) allocateSubnetL(nw, sub netip.Prefix) error { aSpace.subnets[nw].autoRelease = true } aSpace.subnets[nw].children[sub] = struct{}{} + + ones, bits := sub.Bits(), sub.Addr().BitLen() + numAddresses := uint64(1 << uint(bits-ones)) + if nw.Addr() == sub.Addr() { + numAddresses-- + } + if netiputil.LastAddr(nw) == netiputil.LastAddr(sub) { + numAddresses-- + } + aSpace.subnets[nw].availableAllocationIps = numAddresses return nil } +func (addrSpace *addrSpace) getAddress(base netip.Prefix, prefAddress netip.Addr, ipr netip.Prefix, serial bool) (netip.Addr, error) { + p := addrSpace.subnets[base] + addr, err := getAddress(base, p.addrs, prefAddress, ipr, serial) + if err != nil { + return netip.Addr{}, err + } + if len(p.children) == 0 { + p.availableAllocationIps-- + } else { + for sub, _ := range p.children { + if sub.Contains(addr) { + p.availableAllocationIps-- + } + } + } + return addr, nil +} + +func getAddress(base netip.Prefix, addrSet *addrset.AddrSet, prefAddress netip.Addr, ipr netip.Prefix, serial bool) (netip.Addr, error) { + var ( + addr netip.Addr + err error + ) + + log.G(context.TODO()).Debugf("Request address PoolID:%v %s Serial:%v PrefAddress:%v ", base, addrSet, serial, prefAddress) + + if prefAddress.IsValid() { + err = addrSet.Add(prefAddress) + if err == nil { + addr = prefAddress + } + } else if ipr.IsValid() && ipr != base { + addr, err = addrSet.AddAnyInRange(ipr, serial) + } else { + addr, err = addrSet.AddAny(serial) + } + + if err != nil { + if errors.Is(err, addrset.ErrAllocated) { + return netip.Addr{}, ipamapi.ErrIPAlreadyAllocated + } + if errors.Is(err, addrset.ErrNotAvailable) { + return netip.Addr{}, ipamapi.ErrNoAvailableIPs + } + return netip.Addr{}, err + } + return addr, nil +} + // overlaps reports whether nw contains any IP addresses in common with any of // the existing subnets in this address space. func (aSpace *addrSpace) overlaps(nw netip.Prefix) bool { @@ -338,7 +401,7 @@ func (aSpace *addrSpace) requestAddress(nw, sub netip.Prefix, prefAddress netip. // In order to request for a serial ip address allocation, callers can pass in the option to request // IP allocation serially or first available IP in the subnet serial := opts[ipamapi.AllocSerialPrefix] == "true" - ip, err := getAddress(nw, p.addrs, prefAddress, sub, serial) + ip, err := aSpace.getAddress(nw, prefAddress, sub, serial) if err != nil { return netip.Addr{}, err } @@ -370,5 +433,19 @@ func (aSpace *addrSpace) releaseAddress(nw, sub netip.Prefix, address netip.Addr defer log.G(context.TODO()).Debugf("Released address Address:%v Sequence:%s", address, p.addrs) - return p.addrs.Remove(address) + if err := p.addrs.Remove(address); err != nil { + return err + } + + if len(p.children) == 0 { + p.availableAllocationIps++ + } else { + for sub, _ := range p.children { + if sub.Contains(address) { + p.availableAllocationIps++ + } + } + } + + return nil } diff --git a/libnetwork/ipams/defaultipam/allocator.go b/libnetwork/ipams/defaultipam/allocator.go index 5e71c16653651..366dcfbc5d4f9 100644 --- a/libnetwork/ipams/defaultipam/allocator.go +++ b/libnetwork/ipams/defaultipam/allocator.go @@ -2,7 +2,6 @@ package defaultipam import ( "context" - "errors" "fmt" "net" "net/netip" @@ -227,7 +226,35 @@ func newPoolData(pool netip.Prefix) *PoolData { h.Add(netiputil.LastAddr(pool)) } - return &PoolData{addrs: h, children: map[netip.Prefix]struct{}{}} + var numAddresses uint64 + if bits > 64 { + numAddresses = ^uint64(0) + } else { + numAddresses = 1< 1 { + numAddresses -= 2 + } + + return &PoolData{addrs: h, children: map[netip.Prefix]struct{}{}, availableAllocationIps: numAddresses} +} + +func (a *Allocator) GetAvailableIPs(poolID string) (availableIPs, availableAllocationIPs uint64, err error) { + log.G(context.TODO()).Debugf("GetAvailableIPs(%s)", poolID) + k, err := PoolIDFromString(poolID) + if err != nil { + return 0, 0, types.InvalidParameterErrorf("invalid pool id: %s", poolID) + } + + aSpace, err := a.getAddrSpace(k.AddressSpace, k.Is6()) + if err != nil { + return 0, 0, err + } + + aSpace.mu.Lock() + defer aSpace.mu.Unlock() + return aSpace.subnets[k.Subnet].addrs.Unselected(), aSpace.subnets[k.Subnet].availableAllocationIps, nil } // RequestAddress returns an address from the specified pool ID @@ -281,37 +308,6 @@ func (a *Allocator) ReleaseAddress(poolID string, address net.IP) error { return aSpace.releaseAddress(k.Subnet, k.ChildSubnet, addr.Unmap()) } -func getAddress(base netip.Prefix, addrSet *addrset.AddrSet, prefAddress netip.Addr, ipr netip.Prefix, serial bool) (netip.Addr, error) { - var ( - addr netip.Addr - err error - ) - - log.G(context.TODO()).Debugf("Request address PoolID:%v %s Serial:%v PrefAddress:%v ", base, addrSet, serial, prefAddress) - - if prefAddress.IsValid() { - err = addrSet.Add(prefAddress) - if err == nil { - addr = prefAddress - } - } else if ipr.IsValid() && ipr != base { - addr, err = addrSet.AddAnyInRange(ipr, serial) - } else { - addr, err = addrSet.AddAny(serial) - } - - if err != nil { - if errors.Is(err, addrset.ErrAllocated) { - return netip.Addr{}, ipamapi.ErrIPAlreadyAllocated - } - if errors.Is(err, addrset.ErrNotAvailable) { - return netip.Addr{}, ipamapi.ErrNoAvailableIPs - } - return netip.Addr{}, err - } - return addr, nil -} - // IsBuiltIn returns true for builtin drivers func (a *Allocator) IsBuiltIn() bool { return true diff --git a/libnetwork/ipams/defaultipam/structures.go b/libnetwork/ipams/defaultipam/structures.go index 2a41d81133196..28128acb0cc74 100644 --- a/libnetwork/ipams/defaultipam/structures.go +++ b/libnetwork/ipams/defaultipam/structures.go @@ -20,6 +20,8 @@ type PoolData struct { addrs *addrset.AddrSet children map[netip.Prefix]struct{} + availableAllocationIps uint64 + // Whether to implicitly release the pool once it no longer has any children. autoRelease bool } diff --git a/libnetwork/ipams/null/null.go b/libnetwork/ipams/null/null.go index 4ef6c2894e055..07f8c840787b6 100644 --- a/libnetwork/ipams/null/null.go +++ b/libnetwork/ipams/null/null.go @@ -76,6 +76,10 @@ func (a *allocator) IsBuiltIn() bool { return true } +func (a *allocator) GetAvailableIPs(poolID string) (uint64, uint64, error) { + return 0, 0, nil +} + // Register registers the null ipam driver with r. func Register(r ipamapi.Registerer) error { return r.RegisterIpamDriver(DriverName, &allocator{}) diff --git a/libnetwork/ipams/remote/remote.go b/libnetwork/ipams/remote/remote.go index d3378ccc5e013..c436d9b8c7fc8 100644 --- a/libnetwork/ipams/remote/remote.go +++ b/libnetwork/ipams/remote/remote.go @@ -253,3 +253,7 @@ func (a *allocator) ReleaseAddress(poolID string, address net.IP) error { func (a *allocator) IsBuiltIn() bool { return false } + +func (a *allocator) GetAvailableIPs(poolID string) (uint64, uint64, error) { + return 0, 0, nil +} diff --git a/libnetwork/ipams/windowsipam/windowsipam.go b/libnetwork/ipams/windowsipam/windowsipam.go index 5e4ad2225d49a..3247865e1a751 100644 --- a/libnetwork/ipams/windowsipam/windowsipam.go +++ b/libnetwork/ipams/windowsipam/windowsipam.go @@ -87,3 +87,7 @@ func (a *allocator) ReleaseAddress(poolID string, address net.IP) error { func (a *allocator) IsBuiltIn() bool { return true } + +func (a *allocator) GetAvailableIPs(poolID string) (uint64, uint64, error) { + return 0, 0, nil +} diff --git a/libnetwork/network.go b/libnetwork/network.go index 57c2d47c99c39..4754ab1850574 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -1867,6 +1867,30 @@ func (n *Network) IPv6Enabled() bool { return n.enableIPv6 } +func (n *Network) AvailableIPs() (availableIPs, availableAllocationIPs uint64, err error) { + + if n.hasSpecialDriver() { + return 0, 0, nil + } + + ipam, _, err := n.getController().getIPAMDriver(n.ipamType) + if err != nil { + return 0, 0, err + } + + ipamInfos, _ := n.IpamInfo() + for _, ipamInfo := range ipamInfos { + allIPs, dynIPs, err := ipam.GetAvailableIPs(ipamInfo.PoolID) + availableIPs += allIPs + availableAllocationIPs += dynIPs + if err != nil { + return 0, 0, err + } + } + + return availableIPs, availableAllocationIPs, nil +} + func (n *Network) ConfigFrom() string { n.mu.Lock() defer n.mu.Unlock() diff --git a/vendor.mod b/vendor.mod index 3cacba4a495f6..d6267f42ba91c 100644 --- a/vendor.mod +++ b/vendor.mod @@ -251,3 +251,5 @@ exclude ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 ) + +replace github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 => github.com/aepifanov/swarmkit/v2 v2.0.0-20250127222316-1d80daa215d4 diff --git a/vendor.sum b/vendor.sum index 14a0937c88947..5a9b7e04c5d85 100644 --- a/vendor.sum +++ b/vendor.sum @@ -29,6 +29,8 @@ github.com/Microsoft/hcsshim v0.12.9 h1:2zJy5KA+l0loz1HzEGqyNnjd3fyZA31ZBCGKacp6 github.com/Microsoft/hcsshim v0.12.9/go.mod h1:fJ0gkFAna6ukt0bLdKB8djt4XIJhF/vEPuoIWYVvZ8Y= github.com/RackSec/srslog v0.0.0-20180709174129-a4725f04ec91 h1:vX+gnvBc56EbWYrmlhYbFYRaeikAke1GL84N4BEYOFE= github.com/RackSec/srslog v0.0.0-20180709174129-a4725f04ec91/go.mod h1:cDLGBht23g0XQdLjzn6xOGXDkLK182YfINAaZEQLCHQ= +github.com/aepifanov/swarmkit/v2 v2.0.0-20250127222316-1d80daa215d4 h1:o/csx6y9E8iwgYVE66kX2/x7NgO9tsUAkbbw9DbQkDQ= +github.com/aepifanov/swarmkit/v2 v2.0.0-20250127222316-1d80daa215d4/go.mod h1:mTTGIAz/59OGZR5Qe+QByIe3Nxc+sSuJkrsStFhr6Lg= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -379,8 +381,6 @@ github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkV github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/pubsub v1.0.0 h1:jkp/imWsmJz2f6LyFsk7EkVeN2HxR/HTTOY8kHrsxfA= github.com/moby/pubsub v1.0.0/go.mod h1:bXSO+3h5MNXXCaEG+6/NlAIk7MMZbySZlnB+cUQhKKc= -github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 h1:DMHJbgyNZWyrPKYjCYt2IxEO7KA0eSd4fo6KQsv2W84= -github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554/go.mod h1:mTTGIAz/59OGZR5Qe+QByIe3Nxc+sSuJkrsStFhr6Lg= github.com/moby/sys/mount v0.3.4 h1:yn5jq4STPztkkzSKpZkLcmjue+bZJ0u2AuQY1iNI1Ww= github.com/moby/sys/mount v0.3.4/go.mod h1:KcQJMbQdJHPlq5lcYT+/CjatWM4PuxKe+XLSVS4J6Os= github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9KouLrg= diff --git a/vendor/github.com/moby/swarmkit/v2/api/api.pb.txt b/vendor/github.com/moby/swarmkit/v2/api/api.pb.txt index a77d1a8965ddc..6939bc27d1d13 100644 --- a/vendor/github.com/moby/swarmkit/v2/api/api.pb.txt +++ b/vendor/github.com/moby/swarmkit/v2/api/api.pb.txt @@ -3269,6 +3269,20 @@ file { type_name: ".docker.swarmkit.v1.IPAMConfig.ReservedEntry" json_name: "reserved" } + field { + name: "available_ips" + number: 6 + label: LABEL_OPTIONAL + type: TYPE_UINT64 + json_name: "availableIps" + } + field { + name: "available_allocation_ips" + number: 7 + label: LABEL_OPTIONAL + type: TYPE_UINT64 + json_name: "availableAllocationIps" + } nested_type { name: "ReservedEntry" field { diff --git a/vendor/github.com/moby/swarmkit/v2/api/network.go b/vendor/github.com/moby/swarmkit/v2/api/network.go new file mode 100644 index 0000000000000..1385440e948c1 --- /dev/null +++ b/vendor/github.com/moby/swarmkit/v2/api/network.go @@ -0,0 +1,10 @@ +package api + +func (m *Network) UpdateAvailableIps(subnet string, availableIps uint64, availableDynamicIps uint64) { + for _, ipamCfg := range m.IPAM.Configs { + if ipamCfg.Subnet == subnet { + ipamCfg.AvailableIps = availableIps + ipamCfg.AvailableAllocationIps = availableDynamicIps + } + } +} diff --git a/vendor/github.com/moby/swarmkit/v2/api/types.pb.go b/vendor/github.com/moby/swarmkit/v2/api/types.pb.go index 8fe2107d73e9b..a74a257d88925 100644 --- a/vendor/github.com/moby/swarmkit/v2/api/types.pb.go +++ b/vendor/github.com/moby/swarmkit/v2/api/types.pb.go @@ -2259,6 +2259,10 @@ type IPAMConfig struct { // allocated. These addresses may have already been allocated or may be // reserved for another allocation manager. Reserved map[string]string `protobuf:"bytes,5,rep,name=reserved,proto3" json:"reserved,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Counter of available IPs in the subnet + AvailableIps uint64 `protobuf:"varint,6,opt,name=available_ips,json=availableIps,proto3" json:"available_ips,omitempty"` + // Counter of available IPs in the allocation pool + AvailableAllocationIps uint64 `protobuf:"varint,7,opt,name=available_allocation_ips,json=availableAllocationIps,proto3" json:"available_allocation_ips,omitempty"` } func (m *IPAMConfig) Reset() { *m = IPAMConfig{} } @@ -5161,419 +5165,422 @@ func init() { } var fileDescriptor_0b5eafd0404ded3d = []byte{ - // 6589 bytes of a gzipped FileDescriptorProto + // 6633 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x7b, 0x5d, 0x6c, 0x24, 0xc7, 0x99, 0x18, 0xe7, 0x97, 0x33, 0xdf, 0x0c, 0xc9, 0xde, 0x22, 0x45, 0x71, 0x47, 0x2b, 0x92, 0x6a, 0x69, 0xad, 0xd5, 0x4a, 0xe6, 0xae, 0x56, 0xb2, 0xb2, 0x92, 0x2c, 0x6b, 0xe7, 0x8f, 0xcb, 0xd1, 0x92, 0x33, 0x83, 0x9a, 0xe1, 0xae, 0x65, 0x20, 0xee, 0x34, 0xbb, 0x8b, 0xc3, 0xd6, 0xf6, 0x74, 0x77, 0xba, 0x7b, 0xc8, 0x65, 0x9c, 0x20, 0x7a, 0x8a, 0x03, 0x02, 0x81, 0x13, 0x04, 0x70, 0x1c, - 0x24, 0x44, 0x82, 0xd8, 0x01, 0x02, 0xf8, 0x21, 0x0f, 0x79, 0x08, 0x12, 0xdc, 0x83, 0x0e, 0x38, - 0x1c, 0x7c, 0x4f, 0x67, 0x9f, 0x0f, 0x77, 0x86, 0xef, 0xc0, 0x3b, 0xd3, 0xcf, 0x87, 0xbb, 0x97, - 0xc3, 0xdd, 0xe3, 0xa1, 0xfe, 0xba, 0x7b, 0xb8, 0x43, 0x72, 0xd7, 0xf2, 0xbd, 0x90, 0x5d, 0xdf, - 0x5f, 0x55, 0x7d, 0x55, 0xf5, 0xd5, 0xf7, 0x7d, 0xf5, 0x0d, 0xdc, 0x1c, 0x58, 0xe1, 0xde, 0x68, - 0x67, 0xcd, 0x70, 0x87, 0xb7, 0x4c, 0xd7, 0x78, 0x4c, 0xfc, 0x5b, 0xc1, 0x81, 0xee, 0x0f, 0x1f, - 0x5b, 0xe1, 0x2d, 0xdd, 0xb3, 0x6e, 0x85, 0x87, 0x1e, 0x09, 0xd6, 0x3c, 0xdf, 0x0d, 0x5d, 0x84, - 0x38, 0xc1, 0x9a, 0x24, 0x58, 0xdb, 0x7f, 0xbb, 0xb2, 0x32, 0x70, 0xdd, 0x81, 0x4d, 0x6e, 0x31, - 0x8a, 0x9d, 0xd1, 0xee, 0xad, 0xd0, 0x1a, 0x92, 0x20, 0xd4, 0x87, 0x1e, 0x67, 0xaa, 0x2c, 0x9f, - 0x25, 0x30, 0x47, 0xbe, 0x1e, 0x5a, 0xae, 0x73, 0x1e, 0xfe, 0xc0, 0xd7, 0x3d, 0x8f, 0xf8, 0xa2, - 0xd3, 0xca, 0xc2, 0xc0, 0x1d, 0xb8, 0xec, 0xf3, 0x16, 0xfd, 0xe2, 0x50, 0x75, 0x05, 0xa6, 0x1f, - 0x12, 0x3f, 0xb0, 0x5c, 0x07, 0x2d, 0x40, 0xce, 0x72, 0x4c, 0xf2, 0x64, 0x29, 0xb5, 0x9a, 0xba, - 0x91, 0xc5, 0xbc, 0xa1, 0xde, 0x06, 0x68, 0xd1, 0x8f, 0xa6, 0x13, 0xfa, 0x87, 0x48, 0x81, 0xcc, - 0x63, 0x72, 0xc8, 0x28, 0x8a, 0x98, 0x7e, 0x52, 0xc8, 0xbe, 0x6e, 0x2f, 0xa5, 0x39, 0x64, 0x5f, - 0xb7, 0xd5, 0x5f, 0xa5, 0xa0, 0x54, 0x75, 0x1c, 0x37, 0x64, 0xa3, 0x0b, 0x10, 0x82, 0xac, 0xa3, - 0x0f, 0x89, 0x60, 0x62, 0xdf, 0xa8, 0x0e, 0x79, 0x5b, 0xdf, 0x21, 0x76, 0xb0, 0x94, 0x5e, 0xcd, - 0xdc, 0x28, 0xdd, 0x79, 0x73, 0xed, 0x69, 0x95, 0xac, 0x25, 0x84, 0xac, 0x6d, 0x32, 0x6a, 0x36, - 0x08, 0x2c, 0x58, 0xd1, 0x37, 0x60, 0xda, 0x72, 0x4c, 0xcb, 0x20, 0xc1, 0x52, 0x96, 0x49, 0x59, - 0x9e, 0x24, 0x25, 0x1e, 0x7d, 0x2d, 0xfb, 0x93, 0x93, 0x95, 0x29, 0x2c, 0x99, 0x2a, 0xef, 0x43, - 0x29, 0x21, 0x76, 0xc2, 0xdc, 0x16, 0x20, 0xb7, 0xaf, 0xdb, 0x23, 0x22, 0x66, 0xc7, 0x1b, 0x1f, - 0xa4, 0xef, 0xa6, 0xd4, 0x7b, 0xb0, 0xd0, 0xd6, 0x87, 0xc4, 0xbc, 0x4f, 0x1c, 0xe2, 0x5b, 0x06, - 0x26, 0x81, 0x3b, 0xf2, 0x0d, 0x42, 0xe7, 0xfa, 0xd8, 0x72, 0x4c, 0x39, 0x57, 0xfa, 0x3d, 0x59, - 0x8a, 0x5a, 0x87, 0x17, 0x1b, 0x56, 0x60, 0xf8, 0x24, 0x24, 0xcf, 0x2d, 0x24, 0x23, 0x85, 0x9c, - 0xa4, 0x60, 0xee, 0x2c, 0xf7, 0xb7, 0x60, 0x9e, 0xaa, 0xd8, 0xd4, 0x7c, 0x01, 0xd1, 0x02, 0x8f, - 0x18, 0x4c, 0x58, 0xe9, 0xce, 0x8d, 0x49, 0x1a, 0x9a, 0x34, 0x93, 0x8d, 0x29, 0x7c, 0x85, 0x89, - 0x91, 0x80, 0x9e, 0x47, 0x0c, 0x64, 0xc0, 0xa2, 0x29, 0x06, 0x7d, 0x46, 0x7c, 0x9a, 0x89, 0x9f, - 0xb8, 0x8c, 0xe7, 0x4c, 0x73, 0x63, 0x0a, 0x2f, 0x48, 0x61, 0xc9, 0x4e, 0x6a, 0x00, 0x05, 0x29, - 0x5b, 0xfd, 0x41, 0x0a, 0x8a, 0x12, 0x19, 0xa0, 0x37, 0xa0, 0xe8, 0xe8, 0x8e, 0xab, 0x19, 0xde, - 0x28, 0x60, 0x13, 0xca, 0xd4, 0xca, 0xa7, 0x27, 0x2b, 0x85, 0xb6, 0xee, 0xb8, 0xf5, 0xee, 0x76, - 0x80, 0x0b, 0x14, 0x5d, 0xf7, 0x46, 0x01, 0x7a, 0x05, 0xca, 0x43, 0x32, 0x74, 0xfd, 0x43, 0x6d, - 0xe7, 0x30, 0x24, 0x81, 0x50, 0x5b, 0x89, 0xc3, 0x6a, 0x14, 0x84, 0x3e, 0x82, 0xe9, 0x01, 0x1f, - 0xd2, 0x52, 0x86, 0x6d, 0x9f, 0x57, 0x27, 0x8d, 0xfe, 0xcc, 0xa8, 0xb1, 0xe4, 0x51, 0xbf, 0x9f, - 0x86, 0x85, 0x08, 0x4a, 0xfe, 0xf9, 0xc8, 0xf2, 0xc9, 0x90, 0x38, 0x61, 0x80, 0xbe, 0x06, 0x79, - 0xdb, 0x1a, 0x5a, 0x61, 0x20, 0x74, 0xfe, 0xf2, 0x24, 0xb1, 0xd1, 0xa4, 0xb0, 0x20, 0x46, 0x55, - 0x28, 0xfb, 0x24, 0x20, 0xfe, 0x3e, 0xdf, 0xf1, 0x42, 0xa3, 0x97, 0x30, 0x8f, 0xb1, 0xa0, 0x0f, - 0x00, 0x82, 0x03, 0xdd, 0x13, 0x53, 0xce, 0x30, 0x01, 0x2f, 0xad, 0x71, 0xbb, 0xb0, 0x26, 0xed, - 0xc2, 0x5a, 0xcb, 0x09, 0xdf, 0x7b, 0xf7, 0x21, 0xdd, 0x3f, 0xb8, 0x48, 0xc9, 0xb9, 0x36, 0x36, - 0xe0, 0x8a, 0x50, 0x18, 0x85, 0x79, 0x96, 0x43, 0x02, 0x7a, 0xac, 0x2e, 0x15, 0xa1, 0x70, 0xae, - 0x5e, 0xc4, 0xa4, 0xae, 0x43, 0xa1, 0x6b, 0xeb, 0xe1, 0xae, 0xeb, 0x0f, 0x91, 0x0a, 0x65, 0xdd, - 0x37, 0xf6, 0xac, 0x90, 0x18, 0xe1, 0xc8, 0x97, 0x36, 0x60, 0x0c, 0x86, 0x16, 0x21, 0xed, 0xf2, - 0xe9, 0x16, 0x6b, 0xf9, 0xd3, 0x93, 0x95, 0x74, 0xa7, 0x87, 0xd3, 0x6e, 0xa0, 0x7e, 0x08, 0x57, - 0xba, 0xf6, 0x68, 0x60, 0x39, 0x0d, 0x12, 0x18, 0xbe, 0xe5, 0xd1, 0x39, 0xd2, 0xb3, 0x41, 0x2d, - 0xa9, 0x3c, 0x1b, 0xf4, 0x3b, 0x32, 0x30, 0xe9, 0xd8, 0xc0, 0xa8, 0xdf, 0x4d, 0xc3, 0x95, 0xa6, - 0x33, 0xb0, 0x1c, 0x92, 0xe4, 0xbe, 0x0e, 0xb3, 0x84, 0x01, 0xb5, 0x7d, 0x6e, 0xf4, 0x84, 0x9c, - 0x19, 0x0e, 0x95, 0x96, 0xb0, 0x75, 0xc6, 0x3a, 0xbd, 0x3d, 0x69, 0x11, 0x9e, 0x92, 0x3e, 0xd1, - 0x46, 0x35, 0x61, 0xda, 0x63, 0x93, 0x08, 0xc4, 0x26, 0xbb, 0x3e, 0x49, 0xd6, 0x53, 0xf3, 0x94, - 0xa6, 0x4a, 0xf0, 0x7e, 0x19, 0x53, 0xf5, 0x1f, 0x33, 0x30, 0xd7, 0x76, 0xcd, 0x31, 0x3d, 0x54, - 0xa0, 0xb0, 0xe7, 0x06, 0x61, 0xc2, 0x2c, 0x47, 0x6d, 0x74, 0x17, 0x0a, 0x9e, 0x58, 0x3e, 0xb1, - 0x07, 0xaf, 0x4d, 0x1e, 0x32, 0xa7, 0xc1, 0x11, 0x35, 0xfa, 0x10, 0x8a, 0xf2, 0xe0, 0xca, 0xdd, - 0x77, 0xc9, 0xf6, 0x8d, 0xe9, 0xd1, 0x47, 0x90, 0xe7, 0x8b, 0x20, 0x36, 0xdd, 0xf5, 0x67, 0xd2, - 0x39, 0x16, 0x4c, 0xe8, 0x3e, 0x14, 0x42, 0x3b, 0xd0, 0x2c, 0x67, 0xd7, 0x5d, 0xca, 0x31, 0x01, - 0x2b, 0x13, 0x4d, 0x9d, 0x6b, 0x92, 0xfe, 0x66, 0xaf, 0xe5, 0xec, 0xba, 0xb5, 0xd2, 0xe9, 0xc9, - 0xca, 0xb4, 0x68, 0xe0, 0xe9, 0xd0, 0x0e, 0xe8, 0x07, 0xba, 0x06, 0xd9, 0x5d, 0xcb, 0x0b, 0x96, - 0xf2, 0xab, 0xa9, 0x1b, 0x85, 0x5a, 0xe1, 0xf4, 0x64, 0x25, 0xbb, 0xde, 0xea, 0xf6, 0x30, 0x83, - 0xd2, 0x6e, 0x8c, 0xc0, 0xe2, 0xdd, 0x4c, 0xb3, 0xf5, 0x3c, 0xb7, 0x9b, 0x7a, 0xaf, 0x15, 0x77, - 0x23, 0x1a, 0x78, 0xda, 0x08, 0x2c, 0xfa, 0xa1, 0xfe, 0x87, 0x14, 0x94, 0x12, 0x83, 0x41, 0x2f, - 0x03, 0x84, 0xfe, 0x28, 0x08, 0x35, 0xdf, 0x75, 0x43, 0xb6, 0x26, 0x65, 0x5c, 0x64, 0x10, 0xec, - 0xba, 0x21, 0x5a, 0x83, 0x79, 0x83, 0xf8, 0xa1, 0x66, 0x05, 0xc1, 0x88, 0xf8, 0x5a, 0x30, 0xda, - 0xf9, 0x8c, 0x18, 0x21, 0x5b, 0x9f, 0x32, 0xbe, 0x42, 0x51, 0x2d, 0x86, 0xe9, 0x71, 0x04, 0x7a, - 0x07, 0x16, 0x93, 0xf4, 0xde, 0x68, 0xc7, 0xb6, 0x0c, 0x8d, 0xee, 0x99, 0x0c, 0x63, 0x99, 0x8f, - 0x59, 0xba, 0x0c, 0xf7, 0x80, 0x1c, 0xaa, 0x3f, 0x17, 0x63, 0x12, 0x83, 0x45, 0x2b, 0x50, 0xe2, - 0xfb, 0x4f, 0x4b, 0x6c, 0x14, 0xe0, 0x20, 0x7a, 0x67, 0xa0, 0x57, 0x61, 0xda, 0x71, 0x4d, 0xa2, - 0x59, 0xa6, 0x38, 0xbe, 0x70, 0x7a, 0xb2, 0x92, 0xa7, 0x22, 0x5a, 0x0d, 0x9c, 0xa7, 0xa8, 0x96, - 0x89, 0x6e, 0xc1, 0xc2, 0x50, 0x7f, 0xa2, 0xed, 0xbb, 0xf6, 0x68, 0x48, 0x02, 0xcd, 0x23, 0xbe, - 0x46, 0x31, 0x6c, 0x20, 0x19, 0x7c, 0x65, 0xa8, 0x3f, 0x79, 0xc8, 0x51, 0x5d, 0xe2, 0x53, 0x56, - 0xb4, 0x05, 0xf3, 0xba, 0x61, 0x90, 0x20, 0xb0, 0x76, 0x6c, 0xa2, 0x85, 0xae, 0xe7, 0xda, 0xee, - 0xe0, 0x50, 0x6c, 0x8b, 0x89, 0x7b, 0xb1, 0x2f, 0x68, 0x30, 0x8a, 0x19, 0x25, 0x4c, 0xfd, 0x45, - 0x0a, 0x14, 0xac, 0xef, 0x86, 0x5b, 0x64, 0xb8, 0x43, 0xfc, 0x5e, 0xa8, 0x87, 0xa3, 0x00, 0x2d, - 0x42, 0xde, 0x26, 0xba, 0x49, 0x7c, 0x36, 0xab, 0x02, 0x16, 0x2d, 0xb4, 0x4d, 0x8d, 0xb0, 0x6e, - 0xec, 0xe9, 0x3b, 0x96, 0x6d, 0x85, 0x87, 0x6c, 0x5a, 0xb3, 0x93, 0xcf, 0xff, 0x59, 0x99, 0x6b, - 0x38, 0xc1, 0x88, 0xc7, 0xc4, 0xa0, 0x25, 0x98, 0x1e, 0x92, 0x20, 0xd0, 0x07, 0x7c, 0xda, 0x45, - 0x2c, 0x9b, 0xea, 0x87, 0x50, 0x4e, 0xf2, 0xa1, 0x12, 0x4c, 0x6f, 0xb7, 0x1f, 0xb4, 0x3b, 0x8f, - 0xda, 0xca, 0x14, 0x9a, 0x83, 0xd2, 0x76, 0x1b, 0x37, 0xab, 0xf5, 0x8d, 0x6a, 0x6d, 0xb3, 0xa9, - 0xa4, 0xd0, 0x0c, 0x14, 0xe3, 0x66, 0x5a, 0xfd, 0x3f, 0x29, 0x00, 0xaa, 0x32, 0x31, 0xa9, 0x0f, - 0x20, 0x17, 0x84, 0x7a, 0xc8, 0x57, 0x6a, 0xf6, 0xce, 0x6b, 0xe7, 0xed, 0x4c, 0x31, 0x5e, 0xfa, - 0x8f, 0x60, 0xce, 0x92, 0x1c, 0x61, 0x7a, 0x6c, 0x84, 0xd4, 0xba, 0xea, 0xa6, 0xe9, 0x8b, 0x81, - 0xb3, 0x6f, 0xf5, 0x43, 0xc8, 0x31, 0xee, 0xf1, 0xe1, 0x16, 0x20, 0xdb, 0xa0, 0x5f, 0x29, 0x54, - 0x84, 0x1c, 0x6e, 0x56, 0x1b, 0x9f, 0x2a, 0x69, 0xa4, 0x40, 0xb9, 0xd1, 0xea, 0xd5, 0x3b, 0xed, - 0x76, 0xb3, 0xde, 0x6f, 0x36, 0x94, 0x8c, 0x7a, 0x1d, 0x72, 0xad, 0x21, 0x95, 0x7c, 0x8d, 0xda, - 0x8b, 0x5d, 0xe2, 0x13, 0xc7, 0x90, 0xbb, 0x2b, 0x06, 0xa8, 0xdf, 0x9b, 0x83, 0xdc, 0x96, 0x3b, - 0x72, 0x42, 0x74, 0x27, 0x61, 0xf3, 0x67, 0x27, 0x3b, 0x79, 0x8c, 0x70, 0xad, 0x7f, 0xe8, 0x11, - 0x71, 0x27, 0x2c, 0x42, 0x9e, 0x5b, 0x16, 0x31, 0x1d, 0xd1, 0xa2, 0xf0, 0x50, 0xf7, 0x07, 0x24, - 0x14, 0xf3, 0x11, 0x2d, 0x74, 0x83, 0x3a, 0x1d, 0xba, 0xe9, 0x3a, 0x36, 0xdf, 0x69, 0x05, 0xee, - 0x59, 0x60, 0xa2, 0x9b, 0x1d, 0xc7, 0x3e, 0xc4, 0x11, 0x16, 0xdd, 0x87, 0x92, 0xe1, 0x3a, 0x81, - 0x15, 0x84, 0xc4, 0x31, 0x0e, 0x97, 0x0a, 0x6c, 0x50, 0xd7, 0xcf, 0x1f, 0x54, 0x3d, 0x26, 0xc6, - 0x49, 0x4e, 0xb4, 0x01, 0xe5, 0x1d, 0xcb, 0x31, 0x35, 0xd7, 0xe3, 0x17, 0x7e, 0xee, 0x7c, 0xbb, - 0xc7, 0x25, 0xd5, 0x2c, 0xc7, 0xec, 0x70, 0x62, 0x5c, 0xda, 0x89, 0x1b, 0xa8, 0x0d, 0xb3, 0xfc, - 0x78, 0x45, 0xb2, 0xf2, 0x4c, 0xd6, 0xeb, 0xe7, 0xcb, 0xe2, 0x67, 0x4e, 0x4a, 0x9b, 0xd9, 0x4f, - 0x36, 0xd1, 0x03, 0x98, 0x09, 0x87, 0xde, 0x6e, 0x10, 0x89, 0x9b, 0x66, 0xe2, 0xbe, 0x72, 0x81, - 0xe6, 0x29, 0xb9, 0x94, 0x56, 0x0e, 0x13, 0xad, 0xca, 0x7f, 0xcd, 0x41, 0x29, 0x31, 0x72, 0xd4, - 0x83, 0x92, 0xe7, 0xbb, 0x9e, 0x3e, 0x60, 0x4e, 0x8b, 0x58, 0xd4, 0xb7, 0x9f, 0x69, 0xd6, 0x6b, - 0xdd, 0x98, 0x11, 0x27, 0xa5, 0xa0, 0x77, 0xa1, 0xec, 0xb8, 0x8e, 0x4f, 0x8c, 0x91, 0x1f, 0x58, - 0xfb, 0x7c, 0xd1, 0x0b, 0x35, 0xe5, 0xf4, 0x64, 0xa5, 0xdc, 0x76, 0x1d, 0x2c, 0xe1, 0x78, 0x8c, - 0x0a, 0xdd, 0x03, 0xc5, 0xf0, 0x89, 0x1e, 0x92, 0x21, 0xed, 0xc9, 0x73, 0x2d, 0x87, 0x6f, 0x8b, - 0x42, 0x6d, 0xe1, 0xf4, 0x64, 0x45, 0xa9, 0x33, 0xdc, 0x56, 0x84, 0xc3, 0x4f, 0x51, 0xa3, 0x4d, - 0x58, 0x90, 0x1b, 0x63, 0xac, 0x7f, 0xbe, 0x85, 0x96, 0x4e, 0x4f, 0x56, 0x16, 0xe4, 0x16, 0x1a, - 0x1b, 0xc7, 0x44, 0x2e, 0x84, 0x61, 0x51, 0xc2, 0x77, 0x5d, 0xdf, 0x20, 0xb1, 0xbc, 0x1c, 0x93, - 0x57, 0x39, 0x3d, 0x59, 0x59, 0x94, 0xf2, 0xd6, 0x5d, 0xe6, 0x78, 0x4a, 0x89, 0xe7, 0x70, 0xaa, - 0xc7, 0x69, 0x28, 0x25, 0xd4, 0x86, 0x6e, 0x42, 0x01, 0x77, 0x71, 0xeb, 0x61, 0xb5, 0xdf, 0x54, - 0xa6, 0x2a, 0xd7, 0x8e, 0x8e, 0x57, 0x97, 0xd8, 0x0c, 0x93, 0xaa, 0xed, 0xfa, 0xd6, 0x3e, 0x3d, - 0xdd, 0x37, 0x60, 0x5a, 0x92, 0xa6, 0x2a, 0x2f, 0x1d, 0x1d, 0xaf, 0xbe, 0x78, 0x96, 0x34, 0x41, - 0x89, 0x7b, 0x1b, 0x55, 0xdc, 0x6c, 0x28, 0xe9, 0xc9, 0x94, 0xb8, 0xb7, 0xa7, 0xfb, 0xc4, 0x44, - 0x5f, 0x81, 0xbc, 0x20, 0xcc, 0x54, 0x2a, 0x47, 0xc7, 0xab, 0x8b, 0x67, 0x09, 0x63, 0x3a, 0xdc, - 0xdb, 0xac, 0x3e, 0x6c, 0x2a, 0xd9, 0xc9, 0x74, 0xb8, 0x67, 0xeb, 0xfb, 0x04, 0xbd, 0x06, 0x39, - 0x4e, 0x96, 0xab, 0x5c, 0x3d, 0x3a, 0x5e, 0x7d, 0xe1, 0x29, 0x71, 0x94, 0xaa, 0xb2, 0xf4, 0x6f, - 0x7f, 0xb8, 0x3c, 0xf5, 0xff, 0x7f, 0xb4, 0xac, 0x9c, 0x45, 0x57, 0x7e, 0x98, 0x86, 0x99, 0xb1, - 0xc3, 0x80, 0x54, 0xc8, 0x3b, 0xae, 0xe1, 0x7a, 0xdc, 0xbf, 0x2a, 0xc8, 0x4b, 0xad, 0xee, 0x7a, - 0x87, 0x58, 0x60, 0xd0, 0x83, 0x33, 0x1e, 0xe2, 0x3b, 0xcf, 0x78, 0xd2, 0x26, 0xfa, 0x88, 0x1f, - 0xc3, 0x8c, 0xe9, 0x5b, 0xfb, 0xc4, 0xd7, 0x0c, 0xd7, 0xd9, 0xb5, 0x06, 0xc2, 0x77, 0xaa, 0x4c, - 0x0c, 0xa6, 0x18, 0x21, 0x2e, 0x73, 0x86, 0x3a, 0xa3, 0x47, 0xd7, 0x61, 0x3a, 0x18, 0xed, 0x78, - 0x7a, 0xb8, 0xc7, 0x36, 0x5e, 0x91, 0xfb, 0x1c, 0x3d, 0x0e, 0xc2, 0x12, 0xf7, 0x25, 0x9c, 0xc8, - 0x8a, 0x07, 0xe5, 0xe4, 0x11, 0xa7, 0xee, 0x4a, 0x60, 0xfd, 0x0b, 0x22, 0x22, 0x0d, 0x16, 0x8a, - 0xe1, 0x22, 0x85, 0xf0, 0x60, 0xe2, 0x75, 0xc8, 0x0e, 0xe9, 0x1d, 0x4f, 0xe5, 0xcc, 0xd4, 0xe6, - 0xa9, 0x2f, 0xfb, 0xcb, 0x93, 0x95, 0x92, 0x1b, 0xac, 0xad, 0x5b, 0x36, 0xd9, 0x72, 0x4d, 0x82, - 0x19, 0x01, 0xbd, 0x76, 0xa4, 0x8d, 0x11, 0x17, 0xa3, 0x68, 0xaa, 0xbf, 0x93, 0x82, 0x2c, 0xb5, - 0xe7, 0xe8, 0x25, 0xc8, 0xd6, 0x5a, 0xed, 0x86, 0x32, 0x55, 0xb9, 0x72, 0x74, 0xbc, 0x3a, 0xc3, - 0x94, 0x4a, 0x11, 0xd4, 0x2e, 0xa0, 0x15, 0xc8, 0x3f, 0xec, 0x6c, 0x6e, 0x6f, 0xd1, 0x0d, 0x3a, - 0x7f, 0x74, 0xbc, 0x3a, 0x17, 0xa1, 0xb9, 0xda, 0xd1, 0xcb, 0x90, 0xeb, 0x6f, 0x75, 0xd7, 0x7b, - 0x4a, 0xba, 0x82, 0x8e, 0x8e, 0x57, 0x67, 0x23, 0x3c, 0x9b, 0x0e, 0x7a, 0x05, 0x72, 0xed, 0x6e, - 0xab, 0xdb, 0x54, 0x32, 0x95, 0xc5, 0xa3, 0xe3, 0x55, 0x14, 0xa1, 0x59, 0x4c, 0xdc, 0xb5, 0x3c, - 0x82, 0x5e, 0x81, 0xe9, 0xfa, 0xe6, 0x76, 0xaf, 0xdf, 0xc4, 0x4a, 0xb6, 0xb2, 0x70, 0x74, 0xbc, - 0xaa, 0x44, 0x44, 0x75, 0x7b, 0x14, 0x84, 0xc4, 0xaf, 0x5c, 0x11, 0xbb, 0xab, 0x18, 0x61, 0xd4, - 0x9f, 0xa5, 0xa0, 0x94, 0xb0, 0xfc, 0xf4, 0x80, 0x34, 0x9a, 0xeb, 0xd5, 0xed, 0xcd, 0xbe, 0x32, - 0x95, 0x38, 0x20, 0x09, 0x92, 0x06, 0xd9, 0xd5, 0x47, 0x36, 0xbd, 0x89, 0xa0, 0xde, 0x69, 0xf7, - 0x5a, 0xbd, 0x7e, 0xb3, 0xdd, 0x57, 0x52, 0x95, 0xa5, 0xa3, 0xe3, 0xd5, 0x85, 0xb3, 0xc4, 0xeb, - 0x23, 0xdb, 0xa6, 0x47, 0xa4, 0x5e, 0xad, 0x6f, 0xb0, 0x33, 0x17, 0x1f, 0x91, 0x04, 0x55, 0x5d, - 0x37, 0xf6, 0x88, 0x89, 0xde, 0x82, 0x62, 0xa3, 0xb9, 0xd9, 0xbc, 0x5f, 0x65, 0xf7, 0x6f, 0xe5, - 0xe5, 0xa3, 0xe3, 0xd5, 0xab, 0x4f, 0xf7, 0x6e, 0x93, 0x81, 0x1e, 0x12, 0xf3, 0xcc, 0x51, 0x49, - 0x90, 0xa8, 0x7f, 0x9b, 0x86, 0x19, 0x4c, 0x82, 0x50, 0xf7, 0xc3, 0xae, 0x6b, 0x5b, 0xc6, 0x21, - 0xea, 0x42, 0xd1, 0x70, 0x1d, 0xd3, 0x4a, 0x58, 0xf2, 0x3b, 0xe7, 0x78, 0xfc, 0x31, 0x97, 0x6c, - 0xd5, 0x25, 0x27, 0x8e, 0x85, 0xa0, 0x5b, 0x90, 0x33, 0x89, 0xad, 0x1f, 0x8a, 0xd0, 0xe3, 0xea, - 0x53, 0xa1, 0x67, 0x43, 0x64, 0xbd, 0x30, 0xa7, 0x63, 0x81, 0xbe, 0xfe, 0x44, 0xd3, 0xc3, 0x90, - 0x0c, 0xbd, 0x90, 0x6f, 0xa3, 0x2c, 0x2e, 0x0d, 0xf5, 0x27, 0x55, 0x01, 0x42, 0x6f, 0x43, 0xfe, - 0xc0, 0x72, 0x4c, 0xf7, 0x40, 0xf8, 0x90, 0x17, 0x08, 0x15, 0x84, 0xea, 0x11, 0x75, 0x1a, 0xcf, - 0x0c, 0x93, 0xee, 0xc4, 0x76, 0xa7, 0xdd, 0x94, 0x3b, 0x51, 0xe0, 0x3b, 0x4e, 0xdb, 0x75, 0xa8, - 0x1d, 0x82, 0x4e, 0x5b, 0x5b, 0xaf, 0xb6, 0x36, 0xb7, 0x31, 0xdd, 0x8d, 0x6c, 0xa7, 0x44, 0x24, - 0xeb, 0xba, 0x65, 0xd3, 0x58, 0xf7, 0x2a, 0x64, 0xaa, 0xed, 0x4f, 0x95, 0x74, 0x45, 0x39, 0x3a, - 0x5e, 0x2d, 0x47, 0xe8, 0xaa, 0x73, 0x18, 0xeb, 0xfd, 0x6c, 0xbf, 0xea, 0x1f, 0x66, 0xa0, 0xbc, - 0xed, 0x99, 0x7a, 0x48, 0xc4, 0x79, 0x5f, 0x85, 0x92, 0xa7, 0xfb, 0xba, 0x6d, 0x13, 0xdb, 0x0a, - 0x86, 0x22, 0x5f, 0x97, 0x04, 0xa1, 0xf7, 0x9f, 0x55, 0x8d, 0xb5, 0x02, 0x3d, 0x9c, 0x3f, 0xf8, - 0x8b, 0x95, 0x94, 0x54, 0xe8, 0x36, 0xcc, 0xee, 0xf2, 0xd1, 0x6a, 0xba, 0xc1, 0x16, 0x36, 0xc3, - 0x16, 0x76, 0x6d, 0xd2, 0xc2, 0x26, 0x87, 0xb5, 0x26, 0x26, 0x59, 0x65, 0x5c, 0x78, 0x66, 0x37, - 0xd9, 0x44, 0xef, 0xc0, 0xf4, 0xd0, 0x75, 0xac, 0xd0, 0xf5, 0x2f, 0x5f, 0x05, 0x49, 0x89, 0x6e, - 0x02, 0x8d, 0x0f, 0x34, 0x39, 0x1e, 0x86, 0x66, 0x77, 0x61, 0x1a, 0xcf, 0x0d, 0xf5, 0x27, 0xa2, - 0x43, 0x4c, 0xc1, 0xa8, 0x06, 0x39, 0xd7, 0xa7, 0x1e, 0x7d, 0x9e, 0x0d, 0xf7, 0xad, 0x4b, 0x87, - 0xcb, 0x1b, 0x1d, 0xca, 0x83, 0x39, 0xab, 0xfa, 0x1e, 0xcc, 0x8c, 0x4d, 0x82, 0x3a, 0xb2, 0xdd, - 0xea, 0x76, 0xaf, 0xa9, 0x4c, 0xa1, 0x32, 0x14, 0xea, 0x9d, 0x76, 0xbf, 0xd5, 0xde, 0xa6, 0x9e, - 0x78, 0x19, 0x0a, 0xb8, 0xb3, 0xb9, 0x59, 0xab, 0xd6, 0x1f, 0x28, 0x69, 0x75, 0x0d, 0x4a, 0x09, - 0x69, 0x68, 0x16, 0xa0, 0xd7, 0xef, 0x74, 0xb5, 0xf5, 0x16, 0xee, 0xf5, 0xb9, 0x1f, 0xdf, 0xeb, - 0x57, 0x71, 0x5f, 0x00, 0x52, 0xea, 0x5f, 0xa7, 0xe5, 0x8a, 0x0a, 0xd7, 0xbd, 0x36, 0xee, 0xba, - 0x5f, 0x30, 0x78, 0xe1, 0xbc, 0xc7, 0x8d, 0xc8, 0x85, 0x7f, 0x1f, 0x80, 0x6d, 0x1c, 0x62, 0x6a, - 0x7a, 0x28, 0x16, 0xbe, 0xf2, 0x94, 0x92, 0xfb, 0x32, 0xad, 0x8c, 0x8b, 0x82, 0xba, 0x1a, 0xa2, - 0x8f, 0xa0, 0x6c, 0xb8, 0x43, 0xcf, 0x26, 0x82, 0x39, 0x73, 0x29, 0x73, 0x29, 0xa2, 0xaf, 0x86, - 0xc9, 0xe0, 0x21, 0x3b, 0x1e, 0xde, 0xfc, 0x9b, 0x94, 0xd4, 0xcc, 0x84, 0x78, 0xa1, 0x0c, 0x85, - 0xed, 0x6e, 0xa3, 0xda, 0x6f, 0xb5, 0xef, 0x2b, 0x29, 0x04, 0x90, 0x67, 0xaa, 0x6e, 0x28, 0x69, - 0x1a, 0xe7, 0xd4, 0x3b, 0x5b, 0xdd, 0xcd, 0x26, 0xb3, 0x58, 0x68, 0x01, 0x14, 0xa9, 0x6c, 0x8d, - 0x29, 0xb2, 0xd9, 0x50, 0xb2, 0x68, 0x1e, 0xe6, 0x22, 0xa8, 0xe0, 0xcc, 0xa1, 0x45, 0x40, 0x11, - 0x30, 0x16, 0x91, 0x57, 0xff, 0x15, 0xcc, 0xd5, 0x5d, 0x27, 0xd4, 0x2d, 0x27, 0x8a, 0x01, 0xef, - 0xd0, 0x49, 0x0b, 0x10, 0x0d, 0x61, 0xd9, 0x45, 0x58, 0x9b, 0x3b, 0x3d, 0x59, 0x29, 0x45, 0xa4, - 0xad, 0x06, 0xf3, 0xd9, 0x45, 0xc3, 0xa4, 0xe7, 0xd7, 0x13, 0xd1, 0x6e, 0xae, 0x36, 0x7d, 0x7a, - 0xb2, 0x92, 0xe9, 0xb6, 0x1a, 0x98, 0xc2, 0xd0, 0x4b, 0x50, 0x24, 0x4f, 0xac, 0x50, 0x33, 0x64, - 0x70, 0x9b, 0xc3, 0x05, 0x0a, 0xa8, 0xbb, 0x26, 0x51, 0x6b, 0x00, 0x5d, 0xd7, 0x0f, 0x45, 0xcf, - 0xef, 0x42, 0xce, 0x73, 0x7d, 0x96, 0x20, 0x3c, 0x37, 0x6d, 0x4d, 0xc9, 0xf9, 0x46, 0xc5, 0x9c, - 0x58, 0xfd, 0xcf, 0x19, 0x80, 0xbe, 0x1e, 0x3c, 0x16, 0x42, 0xee, 0x42, 0x31, 0x7a, 0x22, 0x10, - 0x99, 0xc6, 0x0b, 0x57, 0x3b, 0x22, 0x46, 0xef, 0xc8, 0xcd, 0xc6, 0xa3, 0xdb, 0x89, 0x39, 0x1a, - 0xd9, 0xd1, 0xa4, 0x00, 0x71, 0x3c, 0x84, 0xa5, 0x7e, 0x04, 0xf1, 0x7d, 0xb1, 0xf2, 0xf4, 0x13, - 0xd5, 0xd9, 0xb5, 0xc0, 0x95, 0x26, 0xc2, 0x9a, 0x89, 0xb9, 0xd5, 0x33, 0x2b, 0xb2, 0x31, 0x85, - 0x63, 0x3e, 0xf4, 0x31, 0x94, 0xe8, 0xbc, 0xb5, 0x80, 0xe1, 0x44, 0x44, 0x73, 0xae, 0xaa, 0xb8, - 0x04, 0x0c, 0x5e, 0xac, 0xe5, 0x97, 0x01, 0x74, 0xcf, 0xb3, 0x2d, 0x62, 0x6a, 0x3b, 0x87, 0x2c, - 0x84, 0x29, 0xe2, 0xa2, 0x80, 0xd4, 0x0e, 0xe9, 0x71, 0x91, 0x68, 0x3d, 0x64, 0x61, 0xdc, 0x25, - 0x0a, 0x14, 0xd4, 0xd5, 0xb0, 0xa6, 0xc0, 0xac, 0x3f, 0x72, 0xa8, 0x42, 0xc5, 0xe8, 0xd4, 0xff, - 0x9d, 0x86, 0x17, 0xdb, 0x24, 0x3c, 0x70, 0xfd, 0xc7, 0xd5, 0x30, 0xd4, 0x8d, 0xbd, 0x21, 0x71, - 0xc4, 0xf2, 0x25, 0x42, 0xce, 0xd4, 0x58, 0xc8, 0xb9, 0x04, 0xd3, 0xba, 0x6d, 0xe9, 0x01, 0xe1, - 0x4e, 0x64, 0x11, 0xcb, 0x26, 0x0d, 0x8c, 0x69, 0x98, 0x4d, 0x82, 0x80, 0xf0, 0xb4, 0x21, 0x1d, - 0xb8, 0x04, 0xa0, 0xef, 0xc0, 0xa2, 0x70, 0x17, 0xf5, 0xa8, 0x2b, 0x1a, 0xa9, 0xc9, 0x57, 0x90, - 0xe6, 0xc4, 0xb8, 0x7f, 0xf2, 0xe0, 0x84, 0x3f, 0x19, 0x83, 0x3b, 0x5e, 0x28, 0xbc, 0xd3, 0x05, - 0x73, 0x02, 0xaa, 0x72, 0x1f, 0xae, 0x9e, 0xcb, 0xf2, 0x5c, 0x69, 0xc9, 0x9f, 0xa7, 0x01, 0x5a, - 0xdd, 0xea, 0x96, 0x50, 0x52, 0x03, 0xf2, 0xbb, 0xfa, 0xd0, 0xb2, 0x0f, 0x2f, 0xb2, 0x80, 0x31, - 0xfd, 0x5a, 0x95, 0xab, 0x63, 0x9d, 0xf1, 0x60, 0xc1, 0xcb, 0xa2, 0xfe, 0xd1, 0x8e, 0x43, 0xc2, - 0x28, 0xea, 0x67, 0x2d, 0x3a, 0x0c, 0x5f, 0x77, 0xa2, 0xad, 0xcb, 0x1b, 0x74, 0x01, 0xa8, 0xcb, - 0x73, 0xa0, 0x1f, 0x4a, 0xb3, 0x25, 0x9a, 0x68, 0x83, 0x3d, 0x41, 0x10, 0x7f, 0x9f, 0x98, 0x4b, - 0x39, 0xa6, 0xd4, 0xcb, 0xc6, 0x83, 0x05, 0x39, 0xd7, 0x5d, 0xc4, 0x5d, 0xf9, 0x90, 0xb9, 0x4c, - 0x31, 0xea, 0xb9, 0x74, 0x74, 0x1b, 0x66, 0xc6, 0xe6, 0xf9, 0x54, 0xba, 0xa5, 0xd5, 0x7d, 0xf8, - 0xae, 0x92, 0x15, 0x5f, 0xef, 0x29, 0x79, 0xf5, 0xf7, 0x33, 0xdc, 0xd0, 0x08, 0xad, 0x4e, 0x7e, - 0x7a, 0x2b, 0xb0, 0xdd, 0x6d, 0xb8, 0xb6, 0x30, 0x00, 0xaf, 0x5f, 0x6c, 0x7f, 0x68, 0xd4, 0xcd, - 0xc8, 0x71, 0xc4, 0x88, 0x56, 0xa0, 0xc4, 0x77, 0xb1, 0x46, 0x0f, 0x1c, 0x53, 0xeb, 0x0c, 0x06, - 0x0e, 0xa2, 0x9c, 0xe8, 0x3a, 0xcc, 0xb2, 0xa4, 0x63, 0xb0, 0x47, 0x4c, 0x4e, 0x93, 0x65, 0x34, - 0x33, 0x11, 0x94, 0x91, 0x6d, 0x41, 0x59, 0x00, 0x34, 0x16, 0x30, 0xe4, 0xd8, 0x80, 0x6e, 0x5e, - 0x36, 0x20, 0xce, 0xc2, 0xe2, 0x88, 0x92, 0x17, 0x37, 0xd4, 0x7f, 0x06, 0x05, 0x39, 0x58, 0xb4, - 0x04, 0x99, 0x7e, 0xbd, 0xab, 0x4c, 0x55, 0xe6, 0x8e, 0x8e, 0x57, 0x4b, 0x12, 0xdc, 0xaf, 0x77, - 0x29, 0x66, 0xbb, 0xd1, 0x55, 0x52, 0xe3, 0x98, 0xed, 0x46, 0x17, 0x55, 0x20, 0xdb, 0xab, 0xf7, - 0xbb, 0xd2, 0x3f, 0x93, 0x28, 0x0a, 0xab, 0x64, 0xa9, 0x7f, 0xa6, 0xee, 0x42, 0x29, 0xd1, 0x3b, - 0x7a, 0x15, 0xa6, 0x5b, 0xed, 0xfb, 0xb8, 0xd9, 0xeb, 0x29, 0x53, 0x3c, 0x82, 0x48, 0x60, 0x5b, - 0xce, 0x80, 0xae, 0x1d, 0x7a, 0x19, 0xb2, 0x1b, 0x1d, 0x7a, 0xef, 0xf3, 0x10, 0x25, 0x41, 0xb1, - 0xe1, 0x06, 0x61, 0x65, 0x5e, 0x38, 0x7e, 0x49, 0xc1, 0xea, 0x7f, 0x49, 0x41, 0x9e, 0x1f, 0xb4, - 0x89, 0x8b, 0x58, 0x8d, 0xe3, 0x26, 0x1e, 0x80, 0xbe, 0x7e, 0x7e, 0xb0, 0xb8, 0x26, 0x82, 0x36, - 0xbe, 0x35, 0x25, 0x5f, 0xe5, 0x03, 0x28, 0x27, 0x11, 0xcf, 0xb5, 0x31, 0xbf, 0x03, 0x25, 0xba, - 0xf7, 0x65, 0x34, 0x78, 0x07, 0xf2, 0xdc, 0x58, 0x44, 0xf7, 0xd0, 0xf9, 0x91, 0xab, 0xa0, 0x44, - 0x77, 0x61, 0x9a, 0x47, 0xbb, 0xf2, 0x61, 0x64, 0xf9, 0xe2, 0x13, 0x86, 0x25, 0xb9, 0xfa, 0x31, - 0x64, 0xbb, 0x84, 0xf8, 0xc9, 0xec, 0x73, 0xea, 0xdc, 0xec, 0xb3, 0xcc, 0x5e, 0xa6, 0x13, 0xd9, - 0xcb, 0x3e, 0x94, 0x1f, 0x11, 0x6b, 0xb0, 0x17, 0x12, 0x93, 0x09, 0x7a, 0x0b, 0xb2, 0x1e, 0x89, - 0x06, 0xbf, 0x34, 0x71, 0xf3, 0x11, 0xe2, 0x63, 0x46, 0x45, 0x6d, 0xcc, 0x01, 0xe3, 0x16, 0x6f, - 0x8a, 0xa2, 0xa5, 0xfe, 0x51, 0x1a, 0x66, 0x5b, 0x41, 0x30, 0xd2, 0x1d, 0x43, 0x7a, 0x75, 0xdf, - 0x18, 0xf7, 0xea, 0x26, 0x3e, 0xbe, 0x8e, 0xb3, 0x8c, 0x27, 0x65, 0xc5, 0xcd, 0x9a, 0x8e, 0x6e, - 0x56, 0xf5, 0xaf, 0x52, 0x32, 0xf3, 0x7a, 0x3d, 0x61, 0x0a, 0x78, 0x8c, 0x98, 0x94, 0x44, 0xb6, - 0x9d, 0xc7, 0x8e, 0x7b, 0xe0, 0xd0, 0x00, 0x17, 0x37, 0xdb, 0xcd, 0x47, 0x4a, 0x8a, 0x6f, 0xcf, - 0x31, 0x22, 0x4c, 0x1c, 0x72, 0x40, 0x25, 0x75, 0x9b, 0xed, 0x06, 0xf5, 0xc2, 0xd2, 0x13, 0x24, - 0x75, 0x89, 0x63, 0x5a, 0xce, 0x00, 0xbd, 0x0a, 0xf9, 0x56, 0xaf, 0xb7, 0xcd, 0x42, 0xc8, 0x17, - 0x8f, 0x8e, 0x57, 0xe7, 0xc7, 0xa8, 0xd8, 0x5b, 0x82, 0x49, 0x89, 0x68, 0x08, 0x44, 0xfd, 0xb3, - 0x09, 0x44, 0xd4, 0xb7, 0xe6, 0x44, 0xb8, 0xd3, 0xaf, 0xf6, 0x9b, 0x4a, 0x6e, 0x02, 0x11, 0x76, - 0xe9, 0x5f, 0x71, 0xdc, 0xfe, 0x2c, 0x0d, 0x4a, 0xd5, 0x30, 0x88, 0x17, 0x52, 0xbc, 0x88, 0x3a, - 0xfb, 0x50, 0xf0, 0xe8, 0x97, 0x45, 0xa4, 0x07, 0x75, 0x77, 0x62, 0xf9, 0xc0, 0x19, 0xbe, 0x35, - 0xec, 0xda, 0xa4, 0x6a, 0x0e, 0xad, 0x20, 0xb0, 0x5c, 0x87, 0xc3, 0x70, 0x24, 0xa9, 0xf2, 0x37, - 0x29, 0x98, 0x9f, 0x40, 0x81, 0x6e, 0x43, 0xd6, 0x77, 0x6d, 0xb9, 0x86, 0xd7, 0xce, 0x4b, 0xaa, - 0x53, 0x56, 0xcc, 0x28, 0xd1, 0x32, 0x80, 0x3e, 0x0a, 0x5d, 0x9d, 0xf5, 0xcf, 0x53, 0x91, 0x38, - 0x01, 0x41, 0x8f, 0x20, 0x1f, 0x10, 0xc3, 0x27, 0xd2, 0xcf, 0xfe, 0xf8, 0x37, 0x1d, 0xfd, 0x5a, - 0x8f, 0x89, 0xc1, 0x42, 0x5c, 0x65, 0x0d, 0xf2, 0x1c, 0x42, 0xb7, 0xbd, 0xa9, 0x87, 0xba, 0x78, - 0x48, 0x62, 0xdf, 0x74, 0x37, 0xe9, 0xf6, 0x40, 0xee, 0x26, 0xdd, 0x1e, 0xa8, 0xbf, 0x97, 0x06, - 0x68, 0x3e, 0x09, 0x89, 0xef, 0xe8, 0x76, 0xbd, 0x8a, 0x9a, 0x89, 0x9b, 0x81, 0xcf, 0xf6, 0x8d, - 0x89, 0x8f, 0x70, 0x11, 0xc7, 0x5a, 0xbd, 0x3a, 0xe1, 0x6e, 0xb8, 0x0a, 0x99, 0x91, 0x2f, 0x2a, - 0x42, 0xb8, 0x8f, 0xbc, 0x8d, 0x37, 0x31, 0x85, 0xa1, 0x66, 0x32, 0xdd, 0x73, 0x6e, 0xdd, 0x47, - 0xa2, 0x83, 0x89, 0xa6, 0x8b, 0x9e, 0x7c, 0x43, 0xd7, 0x0c, 0x22, 0x6e, 0x95, 0x32, 0x3f, 0xf9, - 0xf5, 0x6a, 0x9d, 0xf8, 0x21, 0xce, 0x1b, 0x3a, 0xfd, 0xff, 0xa5, 0xec, 0xdb, 0x5b, 0x00, 0xf1, - 0xd4, 0xd0, 0x32, 0xe4, 0xea, 0xeb, 0xbd, 0xde, 0xa6, 0x32, 0xc5, 0x0d, 0x78, 0x8c, 0x62, 0x60, - 0xf5, 0xff, 0xa5, 0xa1, 0x50, 0xaf, 0x8a, 0x2b, 0xb7, 0x0e, 0x0a, 0xb3, 0x4a, 0xec, 0xf9, 0x8d, - 0x3c, 0xf1, 0x2c, 0xff, 0x50, 0x18, 0x96, 0x0b, 0x02, 0xde, 0x59, 0xca, 0x42, 0x47, 0xdd, 0x64, - 0x0c, 0x08, 0x43, 0x99, 0x08, 0x25, 0x68, 0x86, 0x2e, 0x6d, 0xfc, 0xf2, 0xc5, 0xca, 0xe2, 0xa1, - 0x4b, 0xdc, 0x0e, 0x70, 0x49, 0x0a, 0xa9, 0xeb, 0x01, 0x7a, 0x1f, 0xe6, 0x02, 0x6b, 0xe0, 0x58, - 0xce, 0x40, 0x93, 0xca, 0x63, 0x6f, 0x81, 0xb5, 0x2b, 0xa7, 0x27, 0x2b, 0x33, 0x3d, 0x8e, 0x12, - 0x3a, 0x9c, 0x11, 0x94, 0x75, 0xa6, 0x4a, 0xf4, 0x1e, 0xcc, 0x26, 0x58, 0xa9, 0x16, 0xb9, 0xda, - 0x59, 0x7e, 0x3d, 0xe2, 0x7c, 0x40, 0x0e, 0x71, 0x39, 0x62, 0x7c, 0x40, 0x58, 0x6e, 0x86, 0x65, - 0xa3, 0x35, 0x9f, 0x9d, 0x69, 0x76, 0xbb, 0x67, 0x71, 0x89, 0xc1, 0xf8, 0x31, 0x57, 0x1f, 0xc2, - 0x7c, 0xc7, 0x37, 0xf6, 0x48, 0x10, 0x72, 0x55, 0x08, 0x2d, 0x7e, 0x0c, 0xd7, 0x42, 0x3d, 0x78, - 0xac, 0xed, 0x59, 0x41, 0xe8, 0xfa, 0x87, 0x9a, 0x4f, 0x42, 0xe2, 0x50, 0xbc, 0xc6, 0xaa, 0x25, - 0x44, 0xc6, 0xf1, 0x2a, 0xa5, 0xd9, 0xe0, 0x24, 0x58, 0x52, 0x6c, 0x52, 0x02, 0xb5, 0x05, 0x65, - 0x1a, 0xc2, 0x88, 0xa4, 0x1a, 0x9d, 0x3d, 0xd8, 0xee, 0x40, 0x7b, 0xe6, 0x6b, 0xaa, 0x68, 0xbb, - 0x03, 0xfe, 0xa9, 0x7e, 0x13, 0x94, 0x86, 0x15, 0x78, 0x7a, 0x68, 0xec, 0x45, 0x19, 0xd7, 0x06, - 0x28, 0x7b, 0x44, 0xf7, 0xc3, 0x1d, 0xa2, 0x87, 0x9a, 0x47, 0x7c, 0xcb, 0x35, 0x2f, 0x5f, 0xe5, - 0xb9, 0x88, 0xa5, 0xcb, 0x38, 0xd4, 0xbf, 0x4b, 0x01, 0x60, 0x7d, 0x57, 0x7a, 0x6b, 0x6f, 0xc2, - 0x95, 0xc0, 0xd1, 0xbd, 0x60, 0xcf, 0x0d, 0x35, 0xcb, 0x09, 0x89, 0xbf, 0xaf, 0xdb, 0x22, 0xb9, - 0xa3, 0x48, 0x44, 0x4b, 0xc0, 0xd1, 0x5b, 0x80, 0x1e, 0x13, 0xe2, 0x69, 0xae, 0x6d, 0x6a, 0x12, - 0xc9, 0xab, 0x28, 0xb2, 0x58, 0xa1, 0x98, 0x8e, 0x6d, 0xf6, 0x24, 0x1c, 0xd5, 0x60, 0x99, 0x4e, - 0x9f, 0x38, 0xa1, 0x6f, 0x91, 0x40, 0xdb, 0x75, 0x7d, 0x2d, 0xb0, 0xdd, 0x03, 0x6d, 0xd7, 0xb5, - 0x6d, 0xf7, 0x80, 0xf8, 0x32, 0x6f, 0x56, 0xb1, 0xdd, 0x41, 0x93, 0x13, 0xad, 0xbb, 0x7e, 0xcf, - 0x76, 0x0f, 0xd6, 0x25, 0x05, 0x75, 0xe9, 0xe2, 0x39, 0x87, 0x96, 0xf1, 0x58, 0xba, 0x74, 0x11, - 0xb4, 0x6f, 0x19, 0x8f, 0xd1, 0xab, 0x30, 0x43, 0x6c, 0xc2, 0xd2, 0x27, 0x9c, 0x2a, 0xc7, 0xa8, - 0xca, 0x12, 0x48, 0x89, 0xd4, 0x7b, 0xa0, 0x34, 0x1d, 0xc3, 0x3f, 0xf4, 0x12, 0x6b, 0xfe, 0x16, - 0x20, 0x6a, 0x24, 0x35, 0xdb, 0x35, 0x1e, 0x6b, 0x43, 0xdd, 0xd1, 0x07, 0x74, 0x5c, 0xfc, 0x7d, - 0x56, 0xa1, 0x98, 0x4d, 0xd7, 0x78, 0xbc, 0x25, 0xe0, 0xea, 0xfb, 0x00, 0x3d, 0xcf, 0x27, 0xba, - 0xd9, 0xa1, 0xde, 0x04, 0x55, 0x1d, 0x6b, 0x69, 0xa6, 0x28, 0x0e, 0x70, 0x7d, 0x71, 0xd4, 0x15, - 0x8e, 0x68, 0x44, 0x70, 0xf5, 0x9f, 0xc2, 0x7c, 0xd7, 0xd6, 0x0d, 0x56, 0xae, 0xd3, 0x8d, 0x1e, - 0x1c, 0xd1, 0x5d, 0xc8, 0x73, 0x52, 0xb1, 0x92, 0x13, 0x8f, 0x5b, 0xdc, 0xe7, 0xc6, 0x14, 0x16, - 0xf4, 0xb5, 0x32, 0x40, 0x2c, 0x47, 0xfd, 0xd3, 0x14, 0x14, 0x23, 0xf9, 0x68, 0x95, 0x3f, 0x17, - 0x86, 0xbe, 0x6e, 0x39, 0x22, 0xe2, 0x2f, 0xe2, 0x24, 0x08, 0xb5, 0xa0, 0xe4, 0x45, 0xdc, 0x17, - 0xfa, 0x73, 0x13, 0x46, 0x8d, 0x93, 0xbc, 0xe8, 0x03, 0x28, 0xca, 0x6a, 0x0c, 0x69, 0x61, 0x2f, - 0x2e, 0xde, 0x88, 0xc9, 0x65, 0x22, 0xd5, 0x27, 0x9e, 0x6d, 0x51, 0x9b, 0x93, 0x8d, 0x12, 0xa9, - 0x58, 0x80, 0xd4, 0x6f, 0x00, 0x7c, 0xe2, 0x5a, 0x4e, 0xdf, 0x7d, 0x4c, 0x1c, 0xf6, 0x86, 0x4e, - 0x43, 0x4a, 0x22, 0x15, 0x2d, 0x5a, 0x2c, 0x53, 0xc0, 0x57, 0x29, 0x7a, 0x4a, 0xe6, 0x4d, 0xf5, - 0x77, 0xd3, 0x90, 0xc7, 0xae, 0x1b, 0xd6, 0xab, 0x68, 0x15, 0xf2, 0xc2, 0x94, 0xb0, 0x2b, 0xaa, - 0x56, 0x3c, 0x3d, 0x59, 0xc9, 0x71, 0x1b, 0x92, 0x33, 0x98, 0xf1, 0x48, 0x18, 0xf9, 0xf4, 0x79, - 0x46, 0x1e, 0xdd, 0x86, 0xb2, 0x20, 0xd2, 0xf6, 0xf4, 0x60, 0x8f, 0xc7, 0x77, 0xb5, 0xd9, 0xd3, - 0x93, 0x15, 0xe0, 0x94, 0x1b, 0x7a, 0xb0, 0x87, 0x81, 0x53, 0xd3, 0x6f, 0xd4, 0x84, 0xd2, 0x67, - 0xae, 0xe5, 0x68, 0x21, 0x9b, 0x84, 0xc8, 0x45, 0x4e, 0x5c, 0xea, 0x78, 0xaa, 0xa2, 0x1a, 0x07, - 0x3e, 0x8b, 0x27, 0xdf, 0x84, 0x19, 0xdf, 0x75, 0x43, 0x6e, 0xd9, 0x2c, 0xd7, 0x11, 0x69, 0x8e, - 0xd5, 0x89, 0xd9, 0x6f, 0xd7, 0x0d, 0xb1, 0xa0, 0xc3, 0x65, 0x3f, 0xd1, 0x42, 0xb7, 0x61, 0xc1, - 0xd6, 0x83, 0x50, 0x63, 0x26, 0xd1, 0x8c, 0xa5, 0xe5, 0x99, 0xf2, 0x11, 0xc5, 0xb1, 0x77, 0x3e, - 0x53, 0x72, 0xa8, 0x7f, 0x92, 0x82, 0x12, 0x9d, 0x8c, 0xb5, 0x6b, 0x19, 0xd4, 0x0f, 0x7c, 0x7e, - 0xf7, 0xe4, 0x2a, 0x64, 0x8c, 0xc0, 0x17, 0x4a, 0x65, 0xf7, 0x73, 0xbd, 0x87, 0x31, 0x85, 0xa1, - 0x7b, 0x90, 0x17, 0xe9, 0x16, 0xee, 0x99, 0xa8, 0x97, 0x7b, 0xac, 0x42, 0x37, 0x82, 0x8f, 0x6d, - 0xf7, 0x78, 0x74, 0xfc, 0x9e, 0xc0, 0x49, 0x10, 0x5a, 0x84, 0xb4, 0xc1, 0xd5, 0x25, 0xca, 0xbd, - 0xea, 0x6d, 0x9c, 0x36, 0x1c, 0xf5, 0x67, 0x29, 0x98, 0x89, 0x6d, 0x02, 0xdd, 0x01, 0xd7, 0xa0, - 0x18, 0x8c, 0x76, 0x82, 0xc3, 0x20, 0x24, 0x43, 0x59, 0x1f, 0x10, 0x01, 0x50, 0x0b, 0x8a, 0xba, - 0x3d, 0x70, 0x7d, 0x2b, 0xdc, 0x1b, 0x8a, 0x40, 0x76, 0xb2, 0x37, 0x91, 0x94, 0xb9, 0x56, 0x95, - 0x2c, 0x38, 0xe6, 0x96, 0xae, 0x01, 0x2f, 0x8d, 0x61, 0xae, 0xc1, 0x2b, 0x50, 0xb6, 0xf5, 0x21, - 0xcb, 0x3f, 0x85, 0xd6, 0x90, 0xc8, 0xc3, 0x20, 0x60, 0x7d, 0x6b, 0x48, 0x54, 0x15, 0x8a, 0x91, - 0x30, 0x34, 0x07, 0xa5, 0x6a, 0xb3, 0xa7, 0xbd, 0x7d, 0xe7, 0xae, 0x76, 0xbf, 0xbe, 0xa5, 0x4c, - 0x09, 0xf7, 0xf5, 0xff, 0xa6, 0x60, 0x46, 0x58, 0x2c, 0x11, 0x12, 0xbc, 0x0a, 0xd3, 0xbe, 0xbe, - 0x1b, 0xca, 0xa0, 0x25, 0xcb, 0x77, 0x35, 0xbd, 0x04, 0x68, 0xd0, 0x42, 0x51, 0x93, 0x83, 0x96, - 0x44, 0xc5, 0x4a, 0xe6, 0xc2, 0x8a, 0x95, 0xec, 0x6f, 0xa5, 0x62, 0x45, 0xfd, 0xd7, 0x00, 0xeb, - 0x96, 0x4d, 0xfa, 0x3c, 0x55, 0x35, 0x29, 0x04, 0xa5, 0x6e, 0x5e, 0x54, 0xf8, 0xc3, 0xdd, 0xbc, - 0x56, 0x03, 0x53, 0x18, 0x45, 0x0d, 0x2c, 0x53, 0x1c, 0x46, 0x86, 0xba, 0x4f, 0x51, 0x03, 0xcb, - 0x8c, 0x5e, 0x06, 0xb3, 0x97, 0xbc, 0x0c, 0xaa, 0x73, 0x30, 0x83, 0x79, 0x8e, 0x8d, 0x8f, 0x41, - 0x3d, 0x4e, 0xc1, 0x9c, 0xf0, 0x77, 0x23, 0x93, 0xfd, 0x06, 0x14, 0xb9, 0xeb, 0x1b, 0x07, 0x81, - 0xac, 0x6c, 0x83, 0xd3, 0xb5, 0x1a, 0xb8, 0xc0, 0xd1, 0x2d, 0x13, 0xad, 0x40, 0x49, 0x90, 0x26, - 0x6a, 0x05, 0x81, 0x83, 0x58, 0x31, 0xd3, 0xbb, 0x90, 0xdd, 0xb5, 0x6c, 0x22, 0x76, 0xfe, 0x44, - 0x8b, 0x10, 0x6b, 0x64, 0x63, 0x0a, 0x33, 0xea, 0x5a, 0x41, 0x26, 0xf7, 0xd4, 0x3f, 0x4f, 0xb1, - 0x14, 0x33, 0x0d, 0x55, 0x93, 0xe3, 0xe3, 0x51, 0xeb, 0x99, 0xf1, 0x71, 0x3a, 0x3a, 0x3e, 0x8e, - 0xe6, 0xe3, 0x13, 0xa4, 0xc9, 0xf1, 0x71, 0xd0, 0x6f, 0x3e, 0x3e, 0xf4, 0x11, 0x4c, 0x8b, 0x54, - 0xa5, 0x30, 0x75, 0xaf, 0x4c, 0xdc, 0x19, 0x49, 0x4d, 0x6f, 0x4c, 0x61, 0xc9, 0x93, 0x98, 0xde, - 0x26, 0x2c, 0xd6, 0x6c, 0xdd, 0x78, 0x6c, 0x5b, 0x41, 0x48, 0xcc, 0xa4, 0x05, 0xba, 0x03, 0xf9, - 0x31, 0x3f, 0xf7, 0xa2, 0x24, 0xaa, 0xa0, 0x54, 0xff, 0x57, 0x1a, 0xca, 0x1b, 0x44, 0xb7, 0xc3, - 0xbd, 0x38, 0x53, 0x15, 0x92, 0x20, 0x14, 0xf7, 0x23, 0xfb, 0x46, 0x5f, 0x83, 0x42, 0xe4, 0x06, - 0x5d, 0xfa, 0x1c, 0x18, 0x91, 0xa2, 0x77, 0x60, 0x9a, 0x8e, 0xdd, 0x1d, 0xc9, 0xf8, 0xea, 0xa2, - 0x97, 0x26, 0x41, 0x49, 0x2f, 0x2d, 0x9f, 0x30, 0xbf, 0x87, 0xe9, 0x29, 0x87, 0x65, 0x13, 0x7d, - 0x1d, 0xca, 0xec, 0xa1, 0x44, 0xba, 0x79, 0xb9, 0xcb, 0x64, 0x96, 0xf8, 0x5b, 0x27, 0xa3, 0x46, - 0xf7, 0x60, 0x96, 0x73, 0x47, 0x33, 0xc9, 0x5f, 0xc6, 0x3f, 0xc3, 0x18, 0xa4, 0xa3, 0xa7, 0xfe, - 0x38, 0x0d, 0x0b, 0x5b, 0xfa, 0xe1, 0x0e, 0x11, 0x86, 0x8c, 0x98, 0x98, 0x18, 0xae, 0x6f, 0xa2, - 0x6e, 0xd2, 0x00, 0x5e, 0xf0, 0xf8, 0x3a, 0x89, 0x79, 0xb2, 0x1d, 0x94, 0x51, 0x63, 0x3a, 0x11, - 0x35, 0x2e, 0x40, 0xce, 0x71, 0x1d, 0x83, 0x08, 0xeb, 0xc8, 0x1b, 0xea, 0xf7, 0x53, 0x49, 0xeb, - 0x57, 0x89, 0x1e, 0x46, 0x59, 0xda, 0xac, 0xed, 0x86, 0x51, 0x77, 0xe8, 0x1e, 0x54, 0x7a, 0xcd, - 0x3a, 0x6e, 0xf6, 0x6b, 0x9d, 0x6f, 0x6a, 0xbd, 0xea, 0x66, 0xaf, 0x7a, 0xe7, 0xb6, 0xd6, 0xed, - 0x6c, 0x7e, 0xfa, 0xf6, 0x3b, 0xb7, 0xbf, 0xa6, 0xa4, 0x2a, 0xab, 0x47, 0xc7, 0xab, 0xd7, 0xda, - 0xd5, 0xfa, 0x26, 0x3f, 0xb3, 0x3b, 0xee, 0x93, 0x9e, 0x6e, 0x07, 0xfa, 0x9d, 0xdb, 0x5d, 0xd7, - 0x3e, 0xa4, 0x34, 0xe8, 0x4d, 0x40, 0xeb, 0x4d, 0xdc, 0x6e, 0xf6, 0x35, 0x69, 0x62, 0xeb, 0xb5, - 0xba, 0x92, 0xe6, 0xb1, 0xd8, 0x3a, 0xf1, 0x1d, 0x12, 0x56, 0x9b, 0xbd, 0xb7, 0xef, 0xdc, 0xad, - 0xd7, 0xea, 0xd4, 0x4a, 0x94, 0x93, 0xf7, 0x6d, 0xd2, 0x8d, 0x48, 0x9d, 0xeb, 0x46, 0xc4, 0xde, - 0x48, 0xfa, 0x1c, 0x6f, 0x64, 0x1d, 0x16, 0x0c, 0xdf, 0x0d, 0x02, 0x8d, 0x06, 0x38, 0xc4, 0x3c, - 0x13, 0x42, 0xbd, 0x70, 0x7a, 0xb2, 0x72, 0xa5, 0x4e, 0xf1, 0x3d, 0x86, 0x16, 0xe2, 0xaf, 0x18, - 0x09, 0x10, 0xeb, 0x49, 0xfd, 0xf1, 0x34, 0xf5, 0x15, 0xad, 0x7d, 0xcb, 0x26, 0x03, 0x12, 0xa0, - 0x87, 0x30, 0x67, 0xf8, 0xc4, 0xa4, 0x91, 0x8b, 0x6e, 0x27, 0x0b, 0xf5, 0xbf, 0x3a, 0xd1, 0x6d, - 0x8b, 0x18, 0xd7, 0xea, 0x11, 0x57, 0xcf, 0x23, 0x06, 0x9e, 0x35, 0xc6, 0xda, 0xe8, 0x33, 0x98, - 0x0b, 0x88, 0x6d, 0x39, 0xa3, 0x27, 0x9a, 0xe1, 0x3a, 0x21, 0x79, 0x22, 0x1f, 0x04, 0x2f, 0x93, - 0xdb, 0x6b, 0x6e, 0x52, 0xae, 0x3a, 0x67, 0xaa, 0xa1, 0xd3, 0x93, 0x95, 0xd9, 0x71, 0x18, 0x9e, - 0x15, 0x92, 0x45, 0x1b, 0x35, 0x60, 0x3a, 0x20, 0x86, 0xe1, 0x0e, 0x3d, 0x71, 0xde, 0x6e, 0x5e, - 0xd6, 0x07, 0xa7, 0xee, 0x78, 0x61, 0x80, 0x25, 0x2b, 0xba, 0x0f, 0x05, 0xdd, 0xf3, 0x74, 0x7f, - 0x18, 0x3d, 0x10, 0xbf, 0x79, 0x89, 0x98, 0xaa, 0xe7, 0x55, 0x29, 0x39, 0x93, 0x13, 0x31, 0xa3, - 0x9b, 0x70, 0xc5, 0x71, 0x35, 0x87, 0x1c, 0x68, 0x5e, 0x44, 0xcb, 0xeb, 0xa7, 0xf0, 0x9c, 0xe3, - 0xb6, 0xc9, 0x41, 0x2c, 0xa2, 0xb2, 0x07, 0xb3, 0xe3, 0x8a, 0x44, 0x0b, 0xc2, 0xca, 0x32, 0x63, - 0x1d, 0x59, 0xd1, 0x6b, 0x50, 0xf0, 0xc9, 0xc0, 0x0a, 0x42, 0x9f, 0xef, 0x10, 0x8a, 0x89, 0x20, - 0x68, 0x09, 0xf2, 0x89, 0xc2, 0x1d, 0x8a, 0x13, 0x6d, 0x6a, 0x3e, 0x79, 0xdd, 0x61, 0xe5, 0x5f, - 0xc2, 0x19, 0x35, 0x52, 0x8b, 0x63, 0x5a, 0x81, 0xbe, 0x23, 0x3a, 0x2b, 0x60, 0xd9, 0xa4, 0xc7, - 0x70, 0x14, 0x44, 0xde, 0x33, 0xfb, 0xa6, 0x30, 0xe6, 0xe6, 0x89, 0x2a, 0x4c, 0xe6, 0xc8, 0xc9, - 0x5a, 0xf8, 0x6c, 0xa2, 0x16, 0x7e, 0x01, 0x72, 0x36, 0xd9, 0x27, 0x36, 0x77, 0xb0, 0x30, 0x6f, - 0x54, 0x7e, 0x9c, 0x82, 0x52, 0x42, 0xeb, 0xe8, 0x13, 0x71, 0x0b, 0x73, 0xab, 0xf1, 0xde, 0xb3, - 0xaf, 0x97, 0xfc, 0x1e, 0x2f, 0xe1, 0xf1, 0x7c, 0x97, 0x29, 0x8d, 0xdb, 0x0d, 0xd9, 0x54, 0xdf, - 0x8b, 0x3a, 0x65, 0xb9, 0xf2, 0x52, 0xa2, 0x04, 0x06, 0xcd, 0x02, 0x6c, 0xb7, 0xeb, 0x9d, 0xf6, - 0x7a, 0xab, 0xdd, 0x6c, 0xf0, 0xd7, 0xdf, 0xfa, 0x76, 0xaf, 0xdf, 0xd9, 0x52, 0xd2, 0x95, 0xef, - 0xa6, 0xa0, 0x9c, 0x5c, 0x5c, 0xb4, 0x39, 0x36, 0xdc, 0xbb, 0xcf, 0xb1, 0x2f, 0xa2, 0x46, 0xc2, - 0xb3, 0x78, 0x23, 0x96, 0xfe, 0xf4, 0xb8, 0xca, 0x50, 0x68, 0xb4, 0x7a, 0xd5, 0xda, 0x26, 0x1d, - 0x15, 0x33, 0x73, 0x9f, 0xb8, 0x3b, 0xc2, 0x77, 0x5b, 0x87, 0x99, 0xcf, 0xdc, 0x1d, 0xcd, 0x0a, - 0x89, 0x1f, 0xd7, 0x2e, 0x96, 0xee, 0xbc, 0x34, 0x69, 0x3c, 0xe2, 0xa7, 0x04, 0xc2, 0x3b, 0x2e, - 0x7f, 0xe6, 0xee, 0xb4, 0x24, 0x1b, 0xaa, 0xc2, 0x2c, 0x73, 0xfa, 0xc9, 0x13, 0x62, 0x8c, 0x98, - 0xa0, 0xcb, 0x1f, 0xeb, 0x67, 0x28, 0x47, 0x53, 0x32, 0xa8, 0x3f, 0xca, 0x81, 0xc2, 0x2b, 0x9c, - 0xaa, 0xac, 0xe2, 0x99, 0x4d, 0xe4, 0x1e, 0xe4, 0x02, 0xc3, 0x8d, 0x0a, 0x65, 0x27, 0x1e, 0xc3, - 0xb3, 0x4c, 0x6b, 0x3d, 0xca, 0x81, 0x39, 0x23, 0x5a, 0x87, 0xe9, 0x60, 0x4f, 0xf7, 0x2d, 0x67, - 0x20, 0x3c, 0xea, 0xb7, 0x9e, 0x4d, 0x06, 0xe7, 0xc1, 0x92, 0x19, 0x6d, 0x40, 0x6e, 0x87, 0x86, - 0xf1, 0xc2, 0x20, 0xdc, 0x7e, 0x26, 0x29, 0x35, 0xca, 0xc1, 0xa1, 0x1b, 0x53, 0x98, 0x0b, 0xa0, - 0x92, 0x58, 0xb9, 0xa5, 0xb0, 0x09, 0xcf, 0x26, 0x89, 0x55, 0x2e, 0xc5, 0x92, 0x98, 0x80, 0xca, - 0x0c, 0x94, 0x12, 0x3d, 0x54, 0xee, 0x43, 0x29, 0x41, 0x86, 0x5e, 0x84, 0xe9, 0xdd, 0x40, 0x4b, - 0xfc, 0xb4, 0x24, 0xbf, 0x1b, 0xb0, 0xf2, 0xb3, 0x15, 0x28, 0x31, 0x7e, 0x6d, 0xd7, 0xd6, 0x07, - 0xf2, 0xa5, 0x16, 0x18, 0x68, 0x9d, 0x42, 0x54, 0x03, 0x72, 0x4c, 0x87, 0xe8, 0x26, 0x94, 0x7a, - 0xad, 0xf6, 0xfd, 0xcd, 0xa6, 0xd6, 0xee, 0x34, 0xe8, 0x65, 0xc8, 0xea, 0x11, 0xb9, 0x7c, 0x46, - 0xd1, 0xb3, 0x9c, 0x81, 0x4d, 0x58, 0x8d, 0xfb, 0x0d, 0x80, 0xad, 0xed, 0xcd, 0x7e, 0x8b, 0x93, - 0x8a, 0x22, 0xaf, 0x04, 0xe9, 0xd6, 0xc8, 0x0e, 0x2d, 0x4a, 0x29, 0x02, 0x89, 0xff, 0x99, 0x82, - 0x69, 0xa1, 0x65, 0xb4, 0x12, 0xdd, 0xb6, 0x2f, 0x1c, 0x1d, 0xaf, 0x5e, 0x11, 0x5c, 0x1c, 0xc9, - 0x4a, 0x91, 0x6e, 0xb0, 0x2a, 0xf1, 0x86, 0xd6, 0x69, 0x6f, 0x7e, 0xaa, 0xa4, 0xc6, 0x86, 0x21, - 0x16, 0x4a, 0x94, 0x90, 0xa2, 0x9b, 0x00, 0x9d, 0x76, 0x53, 0x7b, 0x84, 0x5b, 0xfd, 0x26, 0x96, - 0x55, 0x64, 0x63, 0xa4, 0x1d, 0x87, 0x3c, 0xf2, 0xe9, 0x8e, 0x47, 0x2f, 0x43, 0xa6, 0xba, 0xb9, - 0xa9, 0x64, 0x78, 0x65, 0xd3, 0x18, 0x51, 0xd5, 0xb6, 0xf9, 0x38, 0x6b, 0x33, 0x50, 0xe2, 0x25, - 0xf8, 0x4c, 0x95, 0xea, 0x5d, 0x28, 0x0b, 0x42, 0x9e, 0x96, 0x7e, 0x3a, 0x07, 0xbb, 0x18, 0xe5, - 0xc2, 0xe5, 0x8b, 0x2d, 0x6b, 0xa9, 0xff, 0x23, 0x03, 0xf3, 0x9c, 0x55, 0xbc, 0x8a, 0xc5, 0xf1, - 0xd3, 0xe5, 0x8f, 0x3e, 0xf5, 0xf1, 0x02, 0x87, 0xaf, 0x9e, 0xbf, 0x69, 0xc6, 0x84, 0x8f, 0x3f, - 0xbe, 0x98, 0x30, 0x27, 0x9f, 0x26, 0xe5, 0x15, 0xca, 0x33, 0x2a, 0x1f, 0x3e, 0xab, 0x38, 0xd1, - 0x12, 0x06, 0x9f, 0xe7, 0xb0, 0xe5, 0xab, 0x68, 0xe2, 0x16, 0x90, 0x65, 0x15, 0xb9, 0xb1, 0xb2, - 0x8a, 0x4a, 0x15, 0xe6, 0x27, 0x08, 0x78, 0xae, 0x34, 0xf6, 0xb7, 0xe5, 0x63, 0xd1, 0x3c, 0xcc, - 0x89, 0x27, 0x1e, 0xad, 0xbb, 0x5d, 0xdb, 0x6c, 0xf5, 0x36, 0x94, 0x29, 0x34, 0x03, 0x45, 0xd1, - 0x60, 0x16, 0xb8, 0x02, 0x8b, 0x92, 0x86, 0x6e, 0x4a, 0x6d, 0xbb, 0x2d, 0x49, 0xd3, 0xe8, 0x05, - 0xb8, 0x22, 0x71, 0x31, 0x38, 0xa3, 0xfe, 0x41, 0x1a, 0x80, 0x4f, 0x9c, 0xfd, 0x5e, 0xe4, 0x3a, - 0xcc, 0x1a, 0xba, 0xa7, 0x1b, 0x56, 0x78, 0x38, 0x56, 0x18, 0x3a, 0x23, 0xa1, 0xbc, 0x38, 0xf4, - 0x9b, 0x51, 0xb5, 0x7a, 0xec, 0x9a, 0x9c, 0xfb, 0x2b, 0xab, 0x58, 0xbc, 0xf8, 0x1c, 0xd3, 0xa6, - 0xa8, 0x5b, 0x97, 0xca, 0x7c, 0x03, 0x8a, 0x42, 0x72, 0x14, 0x7d, 0xb2, 0x70, 0x4b, 0x08, 0x69, - 0xe0, 0x02, 0x47, 0xb7, 0xcc, 0xf3, 0x7f, 0x64, 0x92, 0xf9, 0x4d, 0x7e, 0x64, 0x52, 0xb9, 0x07, - 0xe8, 0xe9, 0xe1, 0x3d, 0xd7, 0x5a, 0x3d, 0x82, 0x99, 0xba, 0x50, 0x13, 0x66, 0xd5, 0x09, 0xd7, - 0x61, 0xd6, 0xe7, 0x3f, 0x2b, 0x34, 0xc7, 0xb5, 0x29, 0xa1, 0x5c, 0x9b, 0x2b, 0x50, 0x62, 0x29, - 0xf1, 0xb1, 0xdf, 0x39, 0x02, 0x03, 0x31, 0x02, 0xf5, 0x8f, 0xb3, 0xd1, 0x55, 0x11, 0x50, 0xe7, - 0x95, 0x65, 0x25, 0x17, 0x21, 0x1d, 0x9d, 0x20, 0x96, 0x84, 0x69, 0x35, 0x70, 0xda, 0x32, 0xc7, - 0x35, 0x98, 0xbe, 0x50, 0x83, 0xf1, 0xa3, 0x6f, 0xe6, 0x99, 0x1f, 0x7d, 0xbf, 0xfd, 0xd4, 0xd2, - 0x73, 0x85, 0xff, 0x93, 0x0b, 0xcc, 0x7a, 0x34, 0xe8, 0x67, 0xd8, 0x00, 0xfa, 0xd3, 0x67, 0x36, - 0x77, 0xfe, 0x03, 0xe1, 0x53, 0x1d, 0x3c, 0xcb, 0x81, 0x6d, 0x46, 0x16, 0x8e, 0xb9, 0x24, 0x3c, - 0x9a, 0x7b, 0xed, 0x59, 0xae, 0x25, 0x0c, 0x7a, 0x7c, 0x57, 0x7f, 0xc0, 0x9c, 0x66, 0x9f, 0x84, - 0x81, 0xf8, 0x1d, 0xd9, 0xea, 0xf9, 0x22, 0x44, 0xd6, 0x43, 0x32, 0x7c, 0xf9, 0xcd, 0xf6, 0xdb, - 0xb0, 0x2d, 0xdf, 0x8a, 0x76, 0x55, 0x54, 0x08, 0x74, 0xee, 0xae, 0x7a, 0xce, 0x1f, 0xe3, 0xa8, - 0xff, 0x2e, 0x05, 0xf3, 0xd1, 0x71, 0x8b, 0x7f, 0x5a, 0x8b, 0x3e, 0x80, 0x22, 0xdb, 0xfc, 0x81, - 0xc5, 0xde, 0xd4, 0x2f, 0x3f, 0xaa, 0x31, 0x39, 0x4b, 0x8d, 0xb3, 0x4c, 0xb9, 0x4f, 0x4c, 0x61, - 0x70, 0x2e, 0xe1, 0x8d, 0xc8, 0xd5, 0xef, 0xa5, 0xa0, 0x20, 0xe1, 0x68, 0x1d, 0x0a, 0x01, 0x19, - 0xb0, 0x9f, 0xfa, 0x8a, 0x31, 0xdc, 0xbc, 0x48, 0xce, 0x5a, 0x4f, 0x10, 0x8b, 0xca, 0x20, 0xc9, - 0x5b, 0xf9, 0x10, 0x66, 0xc6, 0x50, 0xcf, 0xa5, 0xfd, 0x5f, 0x46, 0x87, 0x9a, 0x1a, 0x0d, 0xf1, - 0xdb, 0xb1, 0xc8, 0xeb, 0x4a, 0x5d, 0xe6, 0x2b, 0xc5, 0x4c, 0x97, 0x78, 0x5d, 0xe9, 0xe7, 0x90, - 0x34, 0xc9, 0xeb, 0x42, 0xdd, 0xf1, 0xe3, 0xc2, 0x4d, 0xc5, 0xad, 0x67, 0x92, 0x37, 0xf9, 0xe4, - 0xfc, 0x63, 0xf9, 0x71, 0x95, 0xbf, 0x4f, 0x01, 0x24, 0x9c, 0xe9, 0x8d, 0xb1, 0x98, 0xe3, 0xdd, - 0xe7, 0x1c, 0xf1, 0x5a, 0x22, 0xde, 0xf8, 0x6f, 0x29, 0xc8, 0xca, 0x40, 0x23, 0xae, 0xde, 0x5a, - 0x04, 0x94, 0xf0, 0x16, 0xa5, 0x0b, 0x96, 0x42, 0x2f, 0xc1, 0x8b, 0x49, 0x38, 0x75, 0xe4, 0x9a, - 0x98, 0xbb, 0x72, 0x69, 0x7a, 0x47, 0xc7, 0x6e, 0xe3, 0x18, 0x2e, 0x83, 0xae, 0xc1, 0x52, 0x02, - 0x27, 0x64, 0x08, 0xb1, 0x59, 0x2a, 0x36, 0x81, 0xe5, 0x9f, 0x02, 0x99, 0x3b, 0xe3, 0xb5, 0xdd, - 0xfc, 0x3a, 0x94, 0xe5, 0x4f, 0x74, 0x99, 0xea, 0x0a, 0x90, 0xed, 0x57, 0x7b, 0x0f, 0x94, 0x29, - 0x1a, 0xa5, 0xf1, 0x64, 0x8e, 0x88, 0xd8, 0x68, 0xfc, 0x76, 0x5f, 0x49, 0xd3, 0x6f, 0xf1, 0x33, - 0x8c, 0xcc, 0xcd, 0xff, 0x94, 0x85, 0x62, 0x54, 0x3d, 0x8a, 0xae, 0x42, 0xa6, 0xdd, 0x7c, 0x24, - 0x33, 0x43, 0x11, 0xbc, 0x4d, 0x0e, 0xd0, 0x2b, 0x71, 0xdd, 0xc9, 0x3d, 0xee, 0x54, 0x46, 0x68, - 0x59, 0x73, 0xf2, 0x1a, 0x14, 0xaa, 0xbd, 0x5e, 0xeb, 0x3e, 0x8d, 0x11, 0xbf, 0x48, 0x71, 0x7f, - 0x37, 0x22, 0xe2, 0x86, 0x9b, 0x98, 0x8c, 0xaa, 0x5e, 0x6f, 0x76, 0xfb, 0xcd, 0x86, 0xf2, 0x79, - 0xfa, 0x2c, 0x15, 0xab, 0xa3, 0x60, 0x3f, 0x28, 0x2a, 0x76, 0x71, 0xb3, 0x5b, 0xc5, 0xb4, 0xc3, - 0x2f, 0xd2, 0xbc, 0x1c, 0x26, 0xee, 0xd1, 0x27, 0x1e, 0x77, 0xaf, 0x97, 0xe5, 0x6f, 0x17, 0x3f, - 0xcf, 0xf0, 0x9f, 0x8c, 0xc4, 0xa5, 0xb0, 0x44, 0x37, 0x0f, 0x69, 0x6f, 0xac, 0x06, 0x99, 0x89, - 0xc9, 0x9c, 0xe9, 0xad, 0x17, 0xea, 0x7e, 0x48, 0xa5, 0xa8, 0x30, 0x8d, 0xb7, 0xdb, 0x6d, 0x4a, - 0xf4, 0x79, 0xf6, 0xcc, 0xec, 0xf0, 0xc8, 0x71, 0x28, 0xcd, 0x75, 0x28, 0xc8, 0x12, 0x65, 0xe5, - 0x8b, 0xec, 0x99, 0x01, 0xd5, 0x65, 0x7d, 0x35, 0xeb, 0x70, 0x63, 0xbb, 0xcf, 0x7e, 0x5a, 0xf9, - 0x79, 0xee, 0x6c, 0x87, 0x7b, 0xa3, 0xd0, 0x74, 0x0f, 0x1c, 0xb4, 0x1a, 0x55, 0xde, 0x7c, 0x91, - 0xe3, 0xa9, 0xb1, 0x88, 0x46, 0x94, 0xdd, 0xbc, 0x06, 0x05, 0xdc, 0xfc, 0x84, 0xff, 0x0a, 0xf3, - 0xf3, 0xfc, 0x19, 0x39, 0x98, 0x7c, 0x46, 0x0c, 0xda, 0xdb, 0x2a, 0xe4, 0x71, 0x73, 0xab, 0xf3, - 0xb0, 0xa9, 0xfc, 0xf7, 0xfc, 0x19, 0x39, 0x98, 0x0c, 0x5d, 0xf6, 0x8b, 0xab, 0x42, 0x07, 0x77, - 0x37, 0xaa, 0x6c, 0x51, 0xce, 0xca, 0xe9, 0xf8, 0xde, 0x9e, 0xee, 0x10, 0x33, 0xfe, 0x4d, 0x4c, - 0x84, 0xba, 0xf9, 0x6d, 0x28, 0xc8, 0xa7, 0x28, 0xb4, 0x0c, 0xf9, 0x47, 0x1d, 0xfc, 0xa0, 0x89, - 0x95, 0x29, 0xae, 0x65, 0x89, 0x79, 0xc4, 0x1f, 0x11, 0x57, 0x61, 0x7a, 0xab, 0xda, 0xae, 0xde, - 0xa7, 0x67, 0x82, 0x0f, 0x43, 0x12, 0x88, 0xf7, 0x94, 0x8a, 0x22, 0x3a, 0x88, 0x64, 0xd6, 0x5e, - 0xfb, 0xc9, 0xaf, 0x96, 0xa7, 0x7e, 0xf1, 0xab, 0xe5, 0xa9, 0xcf, 0x4f, 0x97, 0x53, 0x3f, 0x39, - 0x5d, 0x4e, 0xfd, 0xf4, 0x74, 0x39, 0xf5, 0x97, 0xa7, 0xcb, 0xa9, 0x7f, 0xff, 0xeb, 0xe5, 0xa9, - 0x9f, 0xfe, 0x7a, 0x79, 0xea, 0x17, 0xbf, 0x5e, 0x9e, 0xda, 0xc9, 0xb3, 0xe8, 0xfa, 0x9d, 0x7f, - 0x08, 0x00, 0x00, 0xff, 0xff, 0x17, 0xf6, 0x52, 0x33, 0xb1, 0x45, 0x00, 0x00, + 0x24, 0x44, 0x82, 0xd8, 0x01, 0x02, 0xf8, 0x21, 0x40, 0xf2, 0x10, 0xe4, 0x70, 0x0f, 0x3a, 0xe0, + 0x70, 0xf0, 0x3d, 0x9d, 0x7d, 0x77, 0xb8, 0x33, 0x7c, 0x07, 0xde, 0x99, 0x7e, 0x3e, 0xdc, 0xbd, + 0x1c, 0xee, 0x1e, 0x0f, 0xf5, 0xd7, 0xdd, 0xc3, 0x1d, 0x92, 0xbb, 0x96, 0xef, 0x85, 0x9c, 0xfa, + 0xfe, 0xaa, 0xea, 0xab, 0xaa, 0xaf, 0xbe, 0xef, 0xab, 0xaf, 0xe1, 0xe6, 0xc0, 0x0a, 0xf7, 0x46, + 0x3b, 0x6b, 0x86, 0x3b, 0xbc, 0x65, 0xba, 0xc6, 0x63, 0xe2, 0xdf, 0x0a, 0x0e, 0x74, 0x7f, 0xf8, + 0xd8, 0x0a, 0x6f, 0xe9, 0x9e, 0x75, 0x2b, 0x3c, 0xf4, 0x48, 0xb0, 0xe6, 0xf9, 0x6e, 0xe8, 0x22, + 0xc4, 0x09, 0xd6, 0x24, 0xc1, 0xda, 0xfe, 0xdb, 0x95, 0x95, 0x81, 0xeb, 0x0e, 0x6c, 0x72, 0x8b, + 0x51, 0xec, 0x8c, 0x76, 0x6f, 0x85, 0xd6, 0x90, 0x04, 0xa1, 0x3e, 0xf4, 0x38, 0x53, 0x65, 0xf9, + 0x2c, 0x81, 0x39, 0xf2, 0xf5, 0xd0, 0x72, 0x9d, 0xf3, 0xf0, 0x07, 0xbe, 0xee, 0x79, 0xc4, 0x17, + 0x9d, 0x56, 0x16, 0x06, 0xee, 0xc0, 0x65, 0x3f, 0x6f, 0xd1, 0x5f, 0x1c, 0xaa, 0xae, 0xc0, 0xf4, + 0x43, 0xe2, 0x07, 0x96, 0xeb, 0xa0, 0x05, 0xc8, 0x59, 0x8e, 0x49, 0x9e, 0x2c, 0xa5, 0x56, 0x53, + 0x37, 0xb2, 0x98, 0x37, 0xd4, 0xdb, 0x00, 0x2d, 0xfa, 0xa3, 0xe9, 0x84, 0xfe, 0x21, 0x52, 0x20, + 0xf3, 0x98, 0x1c, 0x32, 0x8a, 0x22, 0xa6, 0x3f, 0x29, 0x64, 0x5f, 0xb7, 0x97, 0xd2, 0x1c, 0xb2, + 0xaf, 0xdb, 0xea, 0x2f, 0x53, 0x50, 0xaa, 0x3a, 0x8e, 0x1b, 0xb2, 0xd1, 0x05, 0x08, 0x41, 0xd6, + 0xd1, 0x87, 0x44, 0x30, 0xb1, 0xdf, 0xa8, 0x0e, 0x79, 0x5b, 0xdf, 0x21, 0x76, 0xb0, 0x94, 0x5e, + 0xcd, 0xdc, 0x28, 0xdd, 0x79, 0x73, 0xed, 0x69, 0x95, 0xac, 0x25, 0x84, 0xac, 0x6d, 0x32, 0x6a, + 0x36, 0x08, 0x2c, 0x58, 0xd1, 0x37, 0x60, 0xda, 0x72, 0x4c, 0xcb, 0x20, 0xc1, 0x52, 0x96, 0x49, + 0x59, 0x9e, 0x24, 0x25, 0x1e, 0x7d, 0x2d, 0xfb, 0x93, 0x93, 0x95, 0x29, 0x2c, 0x99, 0x2a, 0xef, + 0x43, 0x29, 0x21, 0x76, 0xc2, 0xdc, 0x16, 0x20, 0xb7, 0xaf, 0xdb, 0x23, 0x22, 0x66, 0xc7, 0x1b, + 0x1f, 0xa4, 0xef, 0xa6, 0xd4, 0x7b, 0xb0, 0xd0, 0xd6, 0x87, 0xc4, 0xbc, 0x4f, 0x1c, 0xe2, 0x5b, + 0x06, 0x26, 0x81, 0x3b, 0xf2, 0x0d, 0x42, 0xe7, 0xfa, 0xd8, 0x72, 0x4c, 0x39, 0x57, 0xfa, 0x7b, + 0xb2, 0x14, 0xb5, 0x0e, 0x2f, 0x36, 0xac, 0xc0, 0xf0, 0x49, 0x48, 0x9e, 0x5b, 0x48, 0x46, 0x0a, + 0x39, 0x49, 0xc1, 0xdc, 0x59, 0xee, 0x6f, 0xc1, 0x3c, 0x55, 0xb1, 0xa9, 0xf9, 0x02, 0xa2, 0x05, + 0x1e, 0x31, 0x98, 0xb0, 0xd2, 0x9d, 0x1b, 0x93, 0x34, 0x34, 0x69, 0x26, 0x1b, 0x53, 0xf8, 0x0a, + 0x13, 0x23, 0x01, 0x3d, 0x8f, 0x18, 0xc8, 0x80, 0x45, 0x53, 0x0c, 0xfa, 0x8c, 0xf8, 0x34, 0x13, + 0x3f, 0x71, 0x19, 0xcf, 0x99, 0xe6, 0xc6, 0x14, 0x5e, 0x90, 0xc2, 0x92, 0x9d, 0xd4, 0x00, 0x0a, + 0x52, 0xb6, 0xfa, 0x83, 0x14, 0x14, 0x25, 0x32, 0x40, 0x6f, 0x40, 0xd1, 0xd1, 0x1d, 0x57, 0x33, + 0xbc, 0x51, 0xc0, 0x26, 0x94, 0xa9, 0x95, 0x4f, 0x4f, 0x56, 0x0a, 0x6d, 0xdd, 0x71, 0xeb, 0xdd, + 0xed, 0x00, 0x17, 0x28, 0xba, 0xee, 0x8d, 0x02, 0xf4, 0x0a, 0x94, 0x87, 0x64, 0xe8, 0xfa, 0x87, + 0xda, 0xce, 0x61, 0x48, 0x02, 0xa1, 0xb6, 0x12, 0x87, 0xd5, 0x28, 0x08, 0x7d, 0x04, 0xd3, 0x03, + 0x3e, 0xa4, 0xa5, 0x0c, 0xdb, 0x3e, 0xaf, 0x4e, 0x1a, 0xfd, 0x99, 0x51, 0x63, 0xc9, 0xa3, 0x7e, + 0x3f, 0x0d, 0x0b, 0x11, 0x94, 0xfc, 0xf3, 0x91, 0xe5, 0x93, 0x21, 0x71, 0xc2, 0x00, 0x7d, 0x0d, + 0xf2, 0xb6, 0x35, 0xb4, 0xc2, 0x40, 0xe8, 0xfc, 0xe5, 0x49, 0x62, 0xa3, 0x49, 0x61, 0x41, 0x8c, + 0xaa, 0x50, 0xf6, 0x49, 0x40, 0xfc, 0x7d, 0xbe, 0xe3, 0x85, 0x46, 0x2f, 0x61, 0x1e, 0x63, 0x41, + 0x1f, 0x00, 0x04, 0x07, 0xba, 0x27, 0xa6, 0x9c, 0x61, 0x02, 0x5e, 0x5a, 0xe3, 0x76, 0x61, 0x4d, + 0xda, 0x85, 0xb5, 0x96, 0x13, 0xbe, 0xf7, 0xee, 0x43, 0xba, 0x7f, 0x70, 0x91, 0x92, 0x73, 0x6d, + 0x6c, 0xc0, 0x15, 0xa1, 0x30, 0x0a, 0xf3, 0x2c, 0x87, 0x04, 0xf4, 0x58, 0x5d, 0x2a, 0x42, 0xe1, + 0x5c, 0xbd, 0x88, 0x49, 0x5d, 0x87, 0x42, 0xd7, 0xd6, 0xc3, 0x5d, 0xd7, 0x1f, 0x22, 0x15, 0xca, + 0xba, 0x6f, 0xec, 0x59, 0x21, 0x31, 0xc2, 0x91, 0x2f, 0x6d, 0xc0, 0x18, 0x0c, 0x2d, 0x42, 0xda, + 0xe5, 0xd3, 0x2d, 0xd6, 0xf2, 0xa7, 0x27, 0x2b, 0xe9, 0x4e, 0x0f, 0xa7, 0xdd, 0x40, 0xfd, 0x10, + 0xae, 0x74, 0xed, 0xd1, 0xc0, 0x72, 0x1a, 0x24, 0x30, 0x7c, 0xcb, 0xa3, 0x73, 0xa4, 0x67, 0x83, + 0x5a, 0x52, 0x79, 0x36, 0xe8, 0xef, 0xc8, 0xc0, 0xa4, 0x63, 0x03, 0xa3, 0x7e, 0x37, 0x0d, 0x57, + 0x9a, 0xce, 0xc0, 0x72, 0x48, 0x92, 0xfb, 0x3a, 0xcc, 0x12, 0x06, 0xd4, 0xf6, 0xb9, 0xd1, 0x13, + 0x72, 0x66, 0x38, 0x54, 0x5a, 0xc2, 0xd6, 0x19, 0xeb, 0xf4, 0xf6, 0xa4, 0x45, 0x78, 0x4a, 0xfa, + 0x44, 0x1b, 0xd5, 0x84, 0x69, 0x8f, 0x4d, 0x22, 0x10, 0x9b, 0xec, 0xfa, 0x24, 0x59, 0x4f, 0xcd, + 0x53, 0x9a, 0x2a, 0xc1, 0xfb, 0x65, 0x4c, 0xd5, 0x7f, 0xcc, 0xc0, 0x5c, 0xdb, 0x35, 0xc7, 0xf4, + 0x50, 0x81, 0xc2, 0x9e, 0x1b, 0x84, 0x09, 0xb3, 0x1c, 0xb5, 0xd1, 0x5d, 0x28, 0x78, 0x62, 0xf9, + 0xc4, 0x1e, 0xbc, 0x36, 0x79, 0xc8, 0x9c, 0x06, 0x47, 0xd4, 0xe8, 0x43, 0x28, 0xca, 0x83, 0x2b, + 0x77, 0xdf, 0x25, 0xdb, 0x37, 0xa6, 0x47, 0x1f, 0x41, 0x9e, 0x2f, 0x82, 0xd8, 0x74, 0xd7, 0x9f, + 0x49, 0xe7, 0x58, 0x30, 0xa1, 0xfb, 0x50, 0x08, 0xed, 0x40, 0xb3, 0x9c, 0x5d, 0x77, 0x29, 0xc7, + 0x04, 0xac, 0x4c, 0x34, 0x75, 0xae, 0x49, 0xfa, 0x9b, 0xbd, 0x96, 0xb3, 0xeb, 0xd6, 0x4a, 0xa7, + 0x27, 0x2b, 0xd3, 0xa2, 0x81, 0xa7, 0x43, 0x3b, 0xa0, 0x3f, 0xd0, 0x35, 0xc8, 0xee, 0x5a, 0x5e, + 0xb0, 0x94, 0x5f, 0x4d, 0xdd, 0x28, 0xd4, 0x0a, 0xa7, 0x27, 0x2b, 0xd9, 0xf5, 0x56, 0xb7, 0x87, + 0x19, 0x94, 0x76, 0x63, 0x04, 0x16, 0xef, 0x66, 0x9a, 0xad, 0xe7, 0xb9, 0xdd, 0xd4, 0x7b, 0xad, + 0xb8, 0x1b, 0xd1, 0xc0, 0xd3, 0x46, 0x60, 0xd1, 0x1f, 0xea, 0x7f, 0x48, 0x41, 0x29, 0x31, 0x18, + 0xf4, 0x32, 0x40, 0xe8, 0x8f, 0x82, 0x50, 0xf3, 0x5d, 0x37, 0x64, 0x6b, 0x52, 0xc6, 0x45, 0x06, + 0xc1, 0xae, 0x1b, 0xa2, 0x35, 0x98, 0x37, 0x88, 0x1f, 0x6a, 0x56, 0x10, 0x8c, 0x88, 0xaf, 0x05, + 0xa3, 0x9d, 0xcf, 0x88, 0x11, 0xb2, 0xf5, 0x29, 0xe3, 0x2b, 0x14, 0xd5, 0x62, 0x98, 0x1e, 0x47, + 0xa0, 0x77, 0x60, 0x31, 0x49, 0xef, 0x8d, 0x76, 0x6c, 0xcb, 0xd0, 0xe8, 0x9e, 0xc9, 0x30, 0x96, + 0xf9, 0x98, 0xa5, 0xcb, 0x70, 0x0f, 0xc8, 0xa1, 0xfa, 0x47, 0x62, 0x4c, 0x62, 0xb0, 0x68, 0x05, + 0x4a, 0x7c, 0xff, 0x69, 0x89, 0x8d, 0x02, 0x1c, 0x44, 0xef, 0x0c, 0xf4, 0x2a, 0x4c, 0x3b, 0xae, + 0x49, 0x34, 0xcb, 0x14, 0xc7, 0x17, 0x4e, 0x4f, 0x56, 0xf2, 0x54, 0x44, 0xab, 0x81, 0xf3, 0x14, + 0xd5, 0x32, 0xd1, 0x2d, 0x58, 0x18, 0xea, 0x4f, 0xb4, 0x7d, 0xd7, 0x1e, 0x0d, 0x49, 0xa0, 0x79, + 0xc4, 0xd7, 0x28, 0x86, 0x0d, 0x24, 0x83, 0xaf, 0x0c, 0xf5, 0x27, 0x0f, 0x39, 0xaa, 0x4b, 0x7c, + 0xca, 0x8a, 0xb6, 0x60, 0x5e, 0x37, 0x0c, 0x12, 0x04, 0xd6, 0x8e, 0x4d, 0xb4, 0xd0, 0xf5, 0x5c, + 0xdb, 0x1d, 0x1c, 0x8a, 0x6d, 0x31, 0x71, 0x2f, 0xf6, 0x05, 0x0d, 0x46, 0x31, 0xa3, 0x84, 0xa9, + 0x3f, 0x4f, 0x81, 0x82, 0xf5, 0xdd, 0x70, 0x8b, 0x0c, 0x77, 0x88, 0xdf, 0x0b, 0xf5, 0x70, 0x14, + 0xa0, 0x45, 0xc8, 0xdb, 0x44, 0x37, 0x89, 0xcf, 0x66, 0x55, 0xc0, 0xa2, 0x85, 0xb6, 0xa9, 0x11, + 0xd6, 0x8d, 0x3d, 0x7d, 0xc7, 0xb2, 0xad, 0xf0, 0x90, 0x4d, 0x6b, 0x76, 0xf2, 0xf9, 0x3f, 0x2b, + 0x73, 0x0d, 0x27, 0x18, 0xf1, 0x98, 0x18, 0xb4, 0x04, 0xd3, 0x43, 0x12, 0x04, 0xfa, 0x80, 0x4f, + 0xbb, 0x88, 0x65, 0x53, 0xfd, 0x10, 0xca, 0x49, 0x3e, 0x54, 0x82, 0xe9, 0xed, 0xf6, 0x83, 0x76, + 0xe7, 0x51, 0x5b, 0x99, 0x42, 0x73, 0x50, 0xda, 0x6e, 0xe3, 0x66, 0xb5, 0xbe, 0x51, 0xad, 0x6d, + 0x36, 0x95, 0x14, 0x9a, 0x81, 0x62, 0xdc, 0x4c, 0xab, 0xff, 0x37, 0x05, 0x40, 0x55, 0x26, 0x26, + 0xf5, 0x01, 0xe4, 0x82, 0x50, 0x0f, 0xf9, 0x4a, 0xcd, 0xde, 0x79, 0xed, 0xbc, 0x9d, 0x29, 0xc6, + 0x4b, 0xff, 0x11, 0xcc, 0x59, 0x92, 0x23, 0x4c, 0x8f, 0x8d, 0x90, 0x5a, 0x57, 0xdd, 0x34, 0x7d, + 0x31, 0x70, 0xf6, 0x5b, 0xfd, 0x10, 0x72, 0x8c, 0x7b, 0x7c, 0xb8, 0x05, 0xc8, 0x36, 0xe8, 0xaf, + 0x14, 0x2a, 0x42, 0x0e, 0x37, 0xab, 0x8d, 0x4f, 0x95, 0x34, 0x52, 0xa0, 0xdc, 0x68, 0xf5, 0xea, + 0x9d, 0x76, 0xbb, 0x59, 0xef, 0x37, 0x1b, 0x4a, 0x46, 0xbd, 0x0e, 0xb9, 0xd6, 0x90, 0x4a, 0xbe, + 0x46, 0xed, 0xc5, 0x2e, 0xf1, 0x89, 0x63, 0xc8, 0xdd, 0x15, 0x03, 0xd4, 0xef, 0xcd, 0x41, 0x6e, + 0xcb, 0x1d, 0x39, 0x21, 0xba, 0x93, 0xb0, 0xf9, 0xb3, 0x93, 0x9d, 0x3c, 0x46, 0xb8, 0xd6, 0x3f, + 0xf4, 0x88, 0xb8, 0x13, 0x16, 0x21, 0xcf, 0x2d, 0x8b, 0x98, 0x8e, 0x68, 0x51, 0x78, 0xa8, 0xfb, + 0x03, 0x12, 0x8a, 0xf9, 0x88, 0x16, 0xba, 0x41, 0x9d, 0x0e, 0xdd, 0x74, 0x1d, 0x9b, 0xef, 0xb4, + 0x02, 0xf7, 0x2c, 0x30, 0xd1, 0xcd, 0x8e, 0x63, 0x1f, 0xe2, 0x08, 0x8b, 0xee, 0x43, 0xc9, 0x70, + 0x9d, 0xc0, 0x0a, 0x42, 0xe2, 0x18, 0x87, 0x4b, 0x05, 0x36, 0xa8, 0xeb, 0xe7, 0x0f, 0xaa, 0x1e, + 0x13, 0xe3, 0x24, 0x27, 0xda, 0x80, 0xf2, 0x8e, 0xe5, 0x98, 0x9a, 0xeb, 0xf1, 0x0b, 0x3f, 0x77, + 0xbe, 0xdd, 0xe3, 0x92, 0x6a, 0x96, 0x63, 0x76, 0x38, 0x31, 0x2e, 0xed, 0xc4, 0x0d, 0xd4, 0x86, + 0x59, 0x7e, 0xbc, 0x22, 0x59, 0x79, 0x26, 0xeb, 0xf5, 0xf3, 0x65, 0xf1, 0x33, 0x27, 0xa5, 0xcd, + 0xec, 0x27, 0x9b, 0xe8, 0x01, 0xcc, 0x84, 0x43, 0x6f, 0x37, 0x88, 0xc4, 0x4d, 0x33, 0x71, 0x5f, + 0xb9, 0x40, 0xf3, 0x94, 0x5c, 0x4a, 0x2b, 0x87, 0x89, 0x56, 0xe5, 0xbf, 0xe6, 0xa0, 0x94, 0x18, + 0x39, 0xea, 0x41, 0xc9, 0xf3, 0x5d, 0x4f, 0x1f, 0x30, 0xa7, 0x45, 0x2c, 0xea, 0xdb, 0xcf, 0x34, + 0xeb, 0xb5, 0x6e, 0xcc, 0x88, 0x93, 0x52, 0xd0, 0xbb, 0x50, 0x76, 0x5c, 0xc7, 0x27, 0xc6, 0xc8, + 0x0f, 0xac, 0x7d, 0xbe, 0xe8, 0x85, 0x9a, 0x72, 0x7a, 0xb2, 0x52, 0x6e, 0xbb, 0x0e, 0x96, 0x70, + 0x3c, 0x46, 0x85, 0xee, 0x81, 0x62, 0xf8, 0x44, 0x0f, 0xc9, 0x90, 0xf6, 0xe4, 0xb9, 0x96, 0xc3, + 0xb7, 0x45, 0xa1, 0xb6, 0x70, 0x7a, 0xb2, 0xa2, 0xd4, 0x19, 0x6e, 0x2b, 0xc2, 0xe1, 0xa7, 0xa8, + 0xd1, 0x26, 0x2c, 0xc8, 0x8d, 0x31, 0xd6, 0x3f, 0xdf, 0x42, 0x4b, 0xa7, 0x27, 0x2b, 0x0b, 0x72, + 0x0b, 0x8d, 0x8d, 0x63, 0x22, 0x17, 0xc2, 0xb0, 0x28, 0xe1, 0xbb, 0xae, 0x6f, 0x90, 0x58, 0x5e, + 0x8e, 0xc9, 0xab, 0x9c, 0x9e, 0xac, 0x2c, 0x4a, 0x79, 0xeb, 0x2e, 0x73, 0x3c, 0xa5, 0xc4, 0x73, + 0x38, 0xd5, 0xe3, 0x34, 0x94, 0x12, 0x6a, 0x43, 0x37, 0xa1, 0x80, 0xbb, 0xb8, 0xf5, 0xb0, 0xda, + 0x6f, 0x2a, 0x53, 0x95, 0x6b, 0x47, 0xc7, 0xab, 0x4b, 0x6c, 0x86, 0x49, 0xd5, 0x76, 0x7d, 0x6b, + 0x9f, 0x9e, 0xee, 0x1b, 0x30, 0x2d, 0x49, 0x53, 0x95, 0x97, 0x8e, 0x8e, 0x57, 0x5f, 0x3c, 0x4b, + 0x9a, 0xa0, 0xc4, 0xbd, 0x8d, 0x2a, 0x6e, 0x36, 0x94, 0xf4, 0x64, 0x4a, 0xdc, 0xdb, 0xd3, 0x7d, + 0x62, 0xa2, 0xaf, 0x40, 0x5e, 0x10, 0x66, 0x2a, 0x95, 0xa3, 0xe3, 0xd5, 0xc5, 0xb3, 0x84, 0x31, + 0x1d, 0xee, 0x6d, 0x56, 0x1f, 0x36, 0x95, 0xec, 0x64, 0x3a, 0xdc, 0xb3, 0xf5, 0x7d, 0x82, 0x5e, + 0x83, 0x1c, 0x27, 0xcb, 0x55, 0xae, 0x1e, 0x1d, 0xaf, 0xbe, 0xf0, 0x94, 0x38, 0x4a, 0x55, 0x59, + 0xfa, 0xb7, 0x3f, 0x5c, 0x9e, 0xfa, 0xad, 0x1f, 0x2d, 0x2b, 0x67, 0xd1, 0x95, 0x1f, 0xa6, 0x61, + 0x66, 0xec, 0x30, 0x20, 0x15, 0xf2, 0x8e, 0x6b, 0xb8, 0x1e, 0xf7, 0xaf, 0x0a, 0xf2, 0x52, 0xab, + 0xbb, 0xde, 0x21, 0x16, 0x18, 0xf4, 0xe0, 0x8c, 0x87, 0xf8, 0xce, 0x33, 0x9e, 0xb4, 0x89, 0x3e, + 0xe2, 0xc7, 0x30, 0x63, 0xfa, 0xd6, 0x3e, 0xf1, 0x35, 0xc3, 0x75, 0x76, 0xad, 0x81, 0xf0, 0x9d, + 0x2a, 0x13, 0x83, 0x29, 0x46, 0x88, 0xcb, 0x9c, 0xa1, 0xce, 0xe8, 0xd1, 0x75, 0x98, 0x0e, 0x46, + 0x3b, 0x9e, 0x1e, 0xee, 0xb1, 0x8d, 0x57, 0xe4, 0x3e, 0x47, 0x8f, 0x83, 0xb0, 0xc4, 0x7d, 0x09, + 0x27, 0xb2, 0xe2, 0x41, 0x39, 0x79, 0xc4, 0xa9, 0xbb, 0x12, 0x58, 0xff, 0x82, 0x88, 0x48, 0x83, + 0x85, 0x62, 0xb8, 0x48, 0x21, 0x3c, 0x98, 0x78, 0x1d, 0xb2, 0x43, 0x7a, 0xc7, 0x53, 0x39, 0x33, + 0xb5, 0x79, 0xea, 0xcb, 0xfe, 0xe2, 0x64, 0xa5, 0xe4, 0x06, 0x6b, 0xeb, 0x96, 0x4d, 0xb6, 0x5c, + 0x93, 0x60, 0x46, 0x40, 0xaf, 0x1d, 0x69, 0x63, 0xc4, 0xc5, 0x28, 0x9a, 0xea, 0x6f, 0xa7, 0x20, + 0x4b, 0xed, 0x39, 0x7a, 0x09, 0xb2, 0xb5, 0x56, 0xbb, 0xa1, 0x4c, 0x55, 0xae, 0x1c, 0x1d, 0xaf, + 0xce, 0x30, 0xa5, 0x52, 0x04, 0xb5, 0x0b, 0x68, 0x05, 0xf2, 0x0f, 0x3b, 0x9b, 0xdb, 0x5b, 0x74, + 0x83, 0xce, 0x1f, 0x1d, 0xaf, 0xce, 0x45, 0x68, 0xae, 0x76, 0xf4, 0x32, 0xe4, 0xfa, 0x5b, 0xdd, + 0xf5, 0x9e, 0x92, 0xae, 0xa0, 0xa3, 0xe3, 0xd5, 0xd9, 0x08, 0xcf, 0xa6, 0x83, 0x5e, 0x81, 0x5c, + 0xbb, 0xdb, 0xea, 0x36, 0x95, 0x4c, 0x65, 0xf1, 0xe8, 0x78, 0x15, 0x45, 0x68, 0x16, 0x13, 0x77, + 0x2d, 0x8f, 0xa0, 0x57, 0x60, 0xba, 0xbe, 0xb9, 0xdd, 0xeb, 0x37, 0xb1, 0x92, 0xad, 0x2c, 0x1c, + 0x1d, 0xaf, 0x2a, 0x11, 0x51, 0xdd, 0x1e, 0x05, 0x21, 0xf1, 0x2b, 0x57, 0xc4, 0xee, 0x2a, 0x46, + 0x18, 0xf5, 0x67, 0x29, 0x28, 0x25, 0x2c, 0x3f, 0x3d, 0x20, 0x8d, 0xe6, 0x7a, 0x75, 0x7b, 0xb3, + 0xaf, 0x4c, 0x25, 0x0e, 0x48, 0x82, 0xa4, 0x41, 0x76, 0xf5, 0x91, 0x4d, 0x6f, 0x22, 0xa8, 0x77, + 0xda, 0xbd, 0x56, 0xaf, 0xdf, 0x6c, 0xf7, 0x95, 0x54, 0x65, 0xe9, 0xe8, 0x78, 0x75, 0xe1, 0x2c, + 0xf1, 0xfa, 0xc8, 0xb6, 0xe9, 0x11, 0xa9, 0x57, 0xeb, 0x1b, 0xec, 0xcc, 0xc5, 0x47, 0x24, 0x41, + 0x55, 0xd7, 0x8d, 0x3d, 0x62, 0xa2, 0xb7, 0xa0, 0xd8, 0x68, 0x6e, 0x36, 0xef, 0x57, 0xd9, 0xfd, + 0x5b, 0x79, 0xf9, 0xe8, 0x78, 0xf5, 0xea, 0xd3, 0xbd, 0xdb, 0x64, 0xa0, 0x87, 0xc4, 0x3c, 0x73, + 0x54, 0x12, 0x24, 0xea, 0xdf, 0xa6, 0x61, 0x06, 0x93, 0x20, 0xd4, 0xfd, 0xb0, 0xeb, 0xda, 0x96, + 0x71, 0x88, 0xba, 0x50, 0x34, 0x5c, 0xc7, 0xb4, 0x12, 0x96, 0xfc, 0xce, 0x39, 0x1e, 0x7f, 0xcc, + 0x25, 0x5b, 0x75, 0xc9, 0x89, 0x63, 0x21, 0xe8, 0x16, 0xe4, 0x4c, 0x62, 0xeb, 0x87, 0x22, 0xf4, + 0xb8, 0xfa, 0x54, 0xe8, 0xd9, 0x10, 0x59, 0x2f, 0xcc, 0xe9, 0x58, 0xa0, 0xaf, 0x3f, 0xd1, 0xf4, + 0x30, 0x24, 0x43, 0x2f, 0xe4, 0xdb, 0x28, 0x8b, 0x4b, 0x43, 0xfd, 0x49, 0x55, 0x80, 0xd0, 0xdb, + 0x90, 0x3f, 0xb0, 0x1c, 0xd3, 0x3d, 0x10, 0x3e, 0xe4, 0x05, 0x42, 0x05, 0xa1, 0x7a, 0x44, 0x9d, + 0xc6, 0x33, 0xc3, 0xa4, 0x3b, 0xb1, 0xdd, 0x69, 0x37, 0xe5, 0x4e, 0x14, 0xf8, 0x8e, 0xd3, 0x76, + 0x1d, 0x6a, 0x87, 0xa0, 0xd3, 0xd6, 0xd6, 0xab, 0xad, 0xcd, 0x6d, 0x4c, 0x77, 0x23, 0xdb, 0x29, + 0x11, 0xc9, 0xba, 0x6e, 0xd9, 0x34, 0xd6, 0xbd, 0x0a, 0x99, 0x6a, 0xfb, 0x53, 0x25, 0x5d, 0x51, + 0x8e, 0x8e, 0x57, 0xcb, 0x11, 0xba, 0xea, 0x1c, 0xc6, 0x7a, 0x3f, 0xdb, 0xaf, 0xfa, 0x07, 0x19, + 0x28, 0x6f, 0x7b, 0xa6, 0x1e, 0x12, 0x71, 0xde, 0x57, 0xa1, 0xe4, 0xe9, 0xbe, 0x6e, 0xdb, 0xc4, + 0xb6, 0x82, 0xa1, 0xc8, 0xd7, 0x25, 0x41, 0xe8, 0xfd, 0x67, 0x55, 0x63, 0xad, 0x40, 0x0f, 0xe7, + 0x0f, 0xfe, 0x62, 0x25, 0x25, 0x15, 0xba, 0x0d, 0xb3, 0xbb, 0x7c, 0xb4, 0x9a, 0x6e, 0xb0, 0x85, + 0xcd, 0xb0, 0x85, 0x5d, 0x9b, 0xb4, 0xb0, 0xc9, 0x61, 0xad, 0x89, 0x49, 0x56, 0x19, 0x17, 0x9e, + 0xd9, 0x4d, 0x36, 0xd1, 0x3b, 0x30, 0x3d, 0x74, 0x1d, 0x2b, 0x74, 0xfd, 0xcb, 0x57, 0x41, 0x52, + 0xa2, 0x9b, 0x40, 0xe3, 0x03, 0x4d, 0x8e, 0x87, 0xa1, 0xd9, 0x5d, 0x98, 0xc6, 0x73, 0x43, 0xfd, + 0x89, 0xe8, 0x10, 0x53, 0x30, 0xaa, 0x41, 0xce, 0xf5, 0xa9, 0x47, 0x9f, 0x67, 0xc3, 0x7d, 0xeb, + 0xd2, 0xe1, 0xf2, 0x46, 0x87, 0xf2, 0x60, 0xce, 0xaa, 0xbe, 0x07, 0x33, 0x63, 0x93, 0xa0, 0x8e, + 0x6c, 0xb7, 0xba, 0xdd, 0x6b, 0x2a, 0x53, 0xa8, 0x0c, 0x85, 0x7a, 0xa7, 0xdd, 0x6f, 0xb5, 0xb7, + 0xa9, 0x27, 0x5e, 0x86, 0x02, 0xee, 0x6c, 0x6e, 0xd6, 0xaa, 0xf5, 0x07, 0x4a, 0x5a, 0x5d, 0x83, + 0x52, 0x42, 0x1a, 0x9a, 0x05, 0xe8, 0xf5, 0x3b, 0x5d, 0x6d, 0xbd, 0x85, 0x7b, 0x7d, 0xee, 0xc7, + 0xf7, 0xfa, 0x55, 0xdc, 0x17, 0x80, 0x94, 0xfa, 0xd7, 0x69, 0xb9, 0xa2, 0xc2, 0x75, 0xaf, 0x8d, + 0xbb, 0xee, 0x17, 0x0c, 0x5e, 0x38, 0xef, 0x71, 0x23, 0x72, 0xe1, 0xdf, 0x07, 0x60, 0x1b, 0x87, + 0x98, 0x9a, 0x1e, 0x8a, 0x85, 0xaf, 0x3c, 0xa5, 0xe4, 0xbe, 0x4c, 0x2b, 0xe3, 0xa2, 0xa0, 0xae, + 0x86, 0xe8, 0x23, 0x28, 0x1b, 0xee, 0xd0, 0xb3, 0x89, 0x60, 0xce, 0x5c, 0xca, 0x5c, 0x8a, 0xe8, + 0xab, 0x61, 0x32, 0x78, 0xc8, 0x8e, 0x87, 0x37, 0xff, 0x26, 0x25, 0x35, 0x33, 0x21, 0x5e, 0x28, + 0x43, 0x61, 0xbb, 0xdb, 0xa8, 0xf6, 0x5b, 0xed, 0xfb, 0x4a, 0x0a, 0x01, 0xe4, 0x99, 0xaa, 0x1b, + 0x4a, 0x9a, 0xc6, 0x39, 0xf5, 0xce, 0x56, 0x77, 0xb3, 0xc9, 0x2c, 0x16, 0x5a, 0x00, 0x45, 0x2a, + 0x5b, 0x63, 0x8a, 0x6c, 0x36, 0x94, 0x2c, 0x9a, 0x87, 0xb9, 0x08, 0x2a, 0x38, 0x73, 0x68, 0x11, + 0x50, 0x04, 0x8c, 0x45, 0xe4, 0xd5, 0x7f, 0x05, 0x73, 0x75, 0xd7, 0x09, 0x75, 0xcb, 0x89, 0x62, + 0xc0, 0x3b, 0x74, 0xd2, 0x02, 0x44, 0x43, 0x58, 0x76, 0x11, 0xd6, 0xe6, 0x4e, 0x4f, 0x56, 0x4a, + 0x11, 0x69, 0xab, 0xc1, 0x7c, 0x76, 0xd1, 0x30, 0xe9, 0xf9, 0xf5, 0x44, 0xb4, 0x9b, 0xab, 0x4d, + 0x9f, 0x9e, 0xac, 0x64, 0xba, 0xad, 0x06, 0xa6, 0x30, 0xf4, 0x12, 0x14, 0xc9, 0x13, 0x2b, 0xd4, + 0x0c, 0x19, 0xdc, 0xe6, 0x70, 0x81, 0x02, 0xea, 0xae, 0x49, 0xd4, 0x1a, 0x40, 0xd7, 0xf5, 0x43, + 0xd1, 0xf3, 0xbb, 0x90, 0xf3, 0x5c, 0x9f, 0x25, 0x08, 0xcf, 0x4d, 0x5b, 0x53, 0x72, 0xbe, 0x51, + 0x31, 0x27, 0x56, 0xff, 0x73, 0x06, 0xa0, 0xaf, 0x07, 0x8f, 0x85, 0x90, 0xbb, 0x50, 0x8c, 0x9e, + 0x08, 0x44, 0xa6, 0xf1, 0xc2, 0xd5, 0x8e, 0x88, 0xd1, 0x3b, 0x72, 0xb3, 0xf1, 0xe8, 0x76, 0x62, + 0x8e, 0x46, 0x76, 0x34, 0x29, 0x40, 0x1c, 0x0f, 0x61, 0xa9, 0x1f, 0x41, 0x7c, 0x5f, 0xac, 0x3c, + 0xfd, 0x89, 0xea, 0xec, 0x5a, 0xe0, 0x4a, 0x13, 0x61, 0xcd, 0xc4, 0xdc, 0xea, 0x99, 0x15, 0xd9, + 0x98, 0xc2, 0x31, 0x1f, 0xfa, 0x18, 0x4a, 0x74, 0xde, 0x5a, 0xc0, 0x70, 0x22, 0xa2, 0x39, 0x57, + 0x55, 0x5c, 0x02, 0x06, 0x2f, 0xd6, 0xf2, 0xcb, 0x00, 0xba, 0xe7, 0xd9, 0x16, 0x31, 0xb5, 0x9d, + 0x43, 0x16, 0xc2, 0x14, 0x71, 0x51, 0x40, 0x6a, 0x87, 0xf4, 0xb8, 0x48, 0xb4, 0x1e, 0xb2, 0x30, + 0xee, 0x12, 0x05, 0x0a, 0xea, 0x6a, 0x58, 0x53, 0x60, 0xd6, 0x1f, 0x39, 0x54, 0xa1, 0x62, 0x74, + 0xea, 0xff, 0x4e, 0xc3, 0x8b, 0x6d, 0x12, 0x1e, 0xb8, 0xfe, 0xe3, 0x6a, 0x18, 0xea, 0xc6, 0xde, + 0x90, 0x38, 0x62, 0xf9, 0x12, 0x21, 0x67, 0x6a, 0x2c, 0xe4, 0x5c, 0x82, 0x69, 0xdd, 0xb6, 0xf4, + 0x80, 0x70, 0x27, 0xb2, 0x88, 0x65, 0x93, 0x06, 0xc6, 0x34, 0xcc, 0x26, 0x41, 0x40, 0x78, 0xda, + 0x90, 0x0e, 0x5c, 0x02, 0xd0, 0x77, 0x60, 0x51, 0xb8, 0x8b, 0x7a, 0xd4, 0x15, 0x8d, 0xd4, 0xe4, + 0x2b, 0x48, 0x73, 0x62, 0xdc, 0x3f, 0x79, 0x70, 0xc2, 0x9f, 0x8c, 0xc1, 0x1d, 0x2f, 0x14, 0xde, + 0xe9, 0x82, 0x39, 0x01, 0x55, 0xb9, 0x0f, 0x57, 0xcf, 0x65, 0x79, 0xae, 0xb4, 0xe4, 0xff, 0xc9, + 0x00, 0xb4, 0xba, 0xd5, 0x2d, 0xa1, 0xa4, 0x06, 0xe4, 0x77, 0xf5, 0xa1, 0x65, 0x1f, 0x5e, 0x64, + 0x01, 0x63, 0xfa, 0xb5, 0x2a, 0x57, 0xc7, 0x3a, 0xe3, 0xc1, 0x82, 0x97, 0x45, 0xfd, 0xa3, 0x1d, + 0x87, 0x84, 0x51, 0xd4, 0xcf, 0x5a, 0x74, 0x18, 0xbe, 0xee, 0x44, 0x5b, 0x97, 0x37, 0xe8, 0x02, + 0x50, 0x97, 0xe7, 0x40, 0x3f, 0x94, 0x66, 0x4b, 0x34, 0xd1, 0x06, 0x7b, 0x82, 0x20, 0xfe, 0x3e, + 0x31, 0x97, 0x72, 0x4c, 0xa9, 0x97, 0x8d, 0x07, 0x0b, 0x72, 0xae, 0xbb, 0x88, 0x1b, 0xbd, 0x0a, + 0x33, 0xfa, 0xbe, 0x6e, 0xd9, 0xfa, 0x8e, 0x4d, 0x34, 0x99, 0x57, 0xcc, 0xe2, 0x72, 0x04, 0x6c, + 0x79, 0xf4, 0x28, 0x2f, 0xc5, 0x44, 0xba, 0x6d, 0xbb, 0x06, 0xbb, 0x07, 0x19, 0xfd, 0x34, 0xa3, + 0x5f, 0x8c, 0xf0, 0xd5, 0x08, 0xdd, 0xf2, 0x82, 0xca, 0x87, 0xcc, 0x23, 0x8b, 0x7b, 0x7e, 0xae, + 0x25, 0xb8, 0x0d, 0x33, 0x63, 0x6a, 0x7c, 0x2a, 0x9b, 0xd3, 0xea, 0x3e, 0x7c, 0x57, 0xc9, 0x8a, + 0x5f, 0xef, 0x29, 0x79, 0xf5, 0xf7, 0x32, 0xdc, 0x8e, 0x89, 0x45, 0x9b, 0xfc, 0xb2, 0x57, 0x60, + 0x87, 0xc7, 0x70, 0x6d, 0x61, 0x5f, 0x5e, 0xbf, 0xd8, 0xbc, 0xd1, 0xa0, 0x9e, 0x91, 0xe3, 0x88, + 0x11, 0xad, 0x40, 0x89, 0x1f, 0x12, 0x8d, 0x9e, 0x67, 0xb6, 0x6a, 0x33, 0x18, 0x38, 0x88, 0x72, + 0xa2, 0xeb, 0x30, 0xcb, 0x72, 0x9a, 0xc1, 0x1e, 0x31, 0x39, 0x4d, 0x96, 0xd1, 0xcc, 0x44, 0x50, + 0x46, 0xb6, 0x05, 0x65, 0x01, 0xd0, 0x58, 0x3c, 0x92, 0x63, 0x03, 0xba, 0x79, 0xd9, 0x80, 0x38, + 0x0b, 0x0b, 0x53, 0x4a, 0x5e, 0xdc, 0x50, 0xff, 0x19, 0x14, 0xe4, 0x60, 0xd1, 0x12, 0x64, 0xfa, + 0xf5, 0xae, 0x32, 0x55, 0x99, 0x3b, 0x3a, 0x5e, 0x2d, 0x49, 0x70, 0xbf, 0xde, 0xa5, 0x98, 0xed, + 0x46, 0x57, 0x49, 0x8d, 0x63, 0xb6, 0x1b, 0x5d, 0x54, 0x81, 0x6c, 0xaf, 0xde, 0xef, 0x4a, 0xf7, + 0x4f, 0xa2, 0x28, 0xac, 0x92, 0xa5, 0xee, 0x9f, 0xba, 0x0b, 0xa5, 0x44, 0xef, 0xe8, 0x55, 0x98, + 0x6e, 0xb5, 0xef, 0xe3, 0x66, 0xaf, 0xa7, 0x4c, 0xf1, 0x00, 0x25, 0x81, 0x6d, 0x39, 0x03, 0xba, + 0x76, 0xe8, 0x65, 0xc8, 0x6e, 0x74, 0xa8, 0x5b, 0xc1, 0x23, 0xa0, 0x04, 0xc5, 0x86, 0x1b, 0x84, + 0x95, 0x79, 0xe1, 0x57, 0x26, 0x05, 0xab, 0xff, 0x25, 0x05, 0x79, 0x7e, 0x8e, 0x27, 0x2e, 0x62, + 0x35, 0x0e, 0xcb, 0x78, 0x7c, 0xfb, 0xfa, 0xf9, 0xb1, 0xe8, 0x9a, 0x88, 0x09, 0xf9, 0xce, 0x97, + 0x7c, 0x95, 0x0f, 0xa0, 0x9c, 0x44, 0x3c, 0xd7, 0xc6, 0xfc, 0x0e, 0x94, 0xe8, 0xd1, 0x92, 0xc1, + 0xe6, 0x1d, 0xc8, 0x73, 0x5b, 0x14, 0x5d, 0x73, 0xe7, 0x07, 0xc6, 0x82, 0x12, 0xdd, 0x85, 0x69, + 0x1e, 0x4c, 0xcb, 0x77, 0x97, 0xe5, 0x8b, 0x0f, 0x30, 0x96, 0xe4, 0xea, 0xc7, 0x90, 0xed, 0x12, + 0xe2, 0x27, 0x93, 0xdb, 0xa9, 0x73, 0x93, 0xdb, 0x32, 0x39, 0x9a, 0x4e, 0x24, 0x47, 0xfb, 0x50, + 0x7e, 0x44, 0xac, 0xc1, 0x5e, 0x48, 0x4c, 0x26, 0xe8, 0x2d, 0xc8, 0x7a, 0x24, 0x1a, 0xfc, 0xd2, + 0xc4, 0xcd, 0x47, 0x88, 0x8f, 0x19, 0x15, 0x35, 0x61, 0x07, 0x8c, 0x5b, 0x3c, 0x59, 0x8a, 0x96, + 0xfa, 0x87, 0x69, 0x98, 0x6d, 0x05, 0xc1, 0x48, 0x77, 0x0c, 0xe9, 0x34, 0x7e, 0x63, 0xdc, 0x69, + 0x9c, 0xf8, 0xb6, 0x3b, 0xce, 0x32, 0x9e, 0xf3, 0x15, 0x17, 0x77, 0x3a, 0xba, 0xb8, 0xd5, 0xbf, + 0x4a, 0xc9, 0xc4, 0xee, 0xf5, 0x84, 0x29, 0xe0, 0x21, 0x68, 0x52, 0x12, 0xd9, 0x76, 0x1e, 0x3b, + 0xee, 0x81, 0x43, 0xe3, 0x67, 0xdc, 0x6c, 0x37, 0x1f, 0x29, 0x29, 0xbe, 0x3d, 0xc7, 0x88, 0x30, + 0x71, 0xc8, 0x01, 0x95, 0xd4, 0x6d, 0xb6, 0x1b, 0xd4, 0xc9, 0x4b, 0x4f, 0x90, 0xd4, 0x25, 0x8e, + 0x69, 0x39, 0x03, 0xf4, 0x2a, 0xe4, 0x5b, 0xbd, 0xde, 0x36, 0x8b, 0x50, 0x5f, 0x3c, 0x3a, 0x5e, + 0x9d, 0x1f, 0xa3, 0x62, 0x4f, 0x15, 0xd4, 0x9a, 0xe6, 0x69, 0x84, 0x45, 0xdd, 0xbf, 0x09, 0x44, + 0xd4, 0x75, 0xe7, 0x44, 0xb8, 0xd3, 0xaf, 0xf6, 0x9b, 0x4a, 0x6e, 0x02, 0x11, 0x76, 0xe9, 0x5f, + 0x71, 0xdc, 0xfe, 0x2c, 0x0d, 0x4a, 0xd5, 0x30, 0x88, 0x17, 0x52, 0xbc, 0x08, 0x6a, 0xfb, 0x50, + 0xf0, 0xe8, 0x2f, 0x8b, 0x48, 0x07, 0xed, 0xee, 0xc4, 0xea, 0x84, 0x33, 0x7c, 0x6b, 0xd8, 0xb5, + 0x49, 0xd5, 0x1c, 0x5a, 0x41, 0x60, 0xb9, 0x0e, 0x87, 0xe1, 0x48, 0x52, 0xe5, 0x6f, 0x52, 0x30, + 0x3f, 0x81, 0x02, 0xdd, 0x86, 0xac, 0xef, 0xda, 0x72, 0x0d, 0xaf, 0x9d, 0x97, 0xb3, 0xa7, 0xac, + 0x98, 0x51, 0xa2, 0x65, 0x00, 0x7d, 0x14, 0xba, 0x3a, 0xeb, 0x9f, 0x67, 0x3a, 0x71, 0x02, 0x82, + 0x1e, 0x41, 0x3e, 0x20, 0x86, 0x4f, 0xa4, 0x1b, 0xff, 0xf1, 0xaf, 0x3b, 0xfa, 0xb5, 0x1e, 0x13, + 0x83, 0x85, 0xb8, 0xca, 0x1a, 0xe4, 0x39, 0x84, 0x6e, 0x7b, 0x53, 0x0f, 0x75, 0xf1, 0x4e, 0xc5, + 0x7e, 0xd3, 0xdd, 0xa4, 0xdb, 0x03, 0xb9, 0x9b, 0x74, 0x7b, 0xa0, 0xfe, 0x6e, 0x1a, 0xa0, 0xf9, + 0x24, 0x24, 0xbe, 0xa3, 0xdb, 0xf5, 0x2a, 0x6a, 0x26, 0x6e, 0x06, 0x3e, 0xdb, 0x37, 0x26, 0xbe, + 0xf1, 0x45, 0x1c, 0x6b, 0xf5, 0xea, 0x84, 0xbb, 0xe1, 0x2a, 0x64, 0x46, 0xbe, 0x28, 0x38, 0xe1, + 0x2e, 0xf8, 0x36, 0xde, 0xc4, 0x14, 0x86, 0x9a, 0xc9, 0x6c, 0xd2, 0xb9, 0x65, 0x25, 0x89, 0x0e, + 0x26, 0x9a, 0x2e, 0x7a, 0xf2, 0x0d, 0x5d, 0x33, 0x88, 0xb8, 0x55, 0xca, 0xfc, 0xe4, 0xd7, 0xab, + 0x75, 0xe2, 0x87, 0x38, 0x6f, 0xe8, 0xf4, 0xff, 0x97, 0xb2, 0x6f, 0x6f, 0x01, 0xc4, 0x53, 0x43, + 0xcb, 0x90, 0xab, 0xaf, 0xf7, 0x7a, 0x9b, 0xca, 0x14, 0x37, 0xe0, 0x31, 0x8a, 0x81, 0xd5, 0xff, + 0x9f, 0x86, 0x42, 0xbd, 0x2a, 0xae, 0xdc, 0x3a, 0x28, 0xcc, 0x2a, 0xb1, 0xd7, 0x3d, 0xf2, 0xc4, + 0xb3, 0xfc, 0x43, 0x61, 0x58, 0x2e, 0x88, 0xa7, 0x67, 0x29, 0x0b, 0x1d, 0x75, 0x93, 0x31, 0x20, + 0x0c, 0x65, 0x22, 0x94, 0xa0, 0x19, 0xba, 0xb4, 0xf1, 0xcb, 0x17, 0x2b, 0x8b, 0x47, 0x46, 0x71, + 0x3b, 0xc0, 0x25, 0x29, 0xa4, 0xae, 0x07, 0xe8, 0x7d, 0x98, 0x0b, 0xac, 0x81, 0x63, 0x39, 0x03, + 0x4d, 0x2a, 0x8f, 0x3d, 0x35, 0xd6, 0xae, 0x9c, 0x9e, 0xac, 0xcc, 0xf4, 0x38, 0x4a, 0xe8, 0x70, + 0x46, 0x50, 0xd6, 0x99, 0x2a, 0xd1, 0x7b, 0x30, 0x9b, 0x60, 0xa5, 0x5a, 0xe4, 0x6a, 0x67, 0xe9, + 0xfb, 0x88, 0xf3, 0x01, 0x39, 0xc4, 0xe5, 0x88, 0xf1, 0x01, 0x61, 0xa9, 0x1f, 0x96, 0xec, 0xd6, + 0x7c, 0x76, 0xa6, 0xd9, 0xed, 0x9e, 0xc5, 0x25, 0x06, 0xe3, 0xc7, 0x5c, 0x7d, 0x08, 0xf3, 0x1d, + 0xdf, 0xd8, 0x23, 0x41, 0xc8, 0x55, 0x21, 0xb4, 0xf8, 0x31, 0x5c, 0x0b, 0xf5, 0xe0, 0xb1, 0xb6, + 0x67, 0x05, 0xa1, 0xeb, 0x1f, 0x6a, 0x3e, 0x09, 0x89, 0xc3, 0x5c, 0x2e, 0x56, 0x8c, 0x21, 0x12, + 0x9a, 0x57, 0x29, 0xcd, 0x06, 0x27, 0xc1, 0x92, 0x62, 0x93, 0x12, 0xa8, 0x2d, 0x28, 0xd3, 0x08, + 0x49, 0xe4, 0xec, 0xe8, 0xec, 0xc1, 0x76, 0x07, 0xda, 0x33, 0x5f, 0x53, 0x45, 0xdb, 0x1d, 0xf0, + 0x9f, 0xea, 0x37, 0x41, 0x69, 0x58, 0x81, 0xa7, 0x87, 0xc6, 0x5e, 0x94, 0xd0, 0x6d, 0x80, 0xb2, + 0x47, 0x74, 0x3f, 0xdc, 0x21, 0x7a, 0xa8, 0x79, 0xc4, 0xb7, 0x5c, 0xf3, 0xf2, 0x55, 0x9e, 0x8b, + 0x58, 0xba, 0x8c, 0x43, 0xfd, 0xbb, 0x14, 0x00, 0xd6, 0x77, 0xa5, 0xb7, 0xf6, 0x26, 0x5c, 0x09, + 0x1c, 0xdd, 0x0b, 0xf6, 0xdc, 0x50, 0xb3, 0x9c, 0x90, 0xf8, 0xfb, 0xba, 0x2d, 0x72, 0x47, 0x8a, + 0x44, 0xb4, 0x04, 0x1c, 0xbd, 0x05, 0xe8, 0x31, 0x21, 0x9e, 0xe6, 0xda, 0xa6, 0x26, 0x91, 0xbc, + 0x48, 0x23, 0x8b, 0x15, 0x8a, 0xe9, 0xd8, 0x66, 0x4f, 0xc2, 0x51, 0x0d, 0x96, 0xe9, 0xf4, 0x89, + 0x13, 0xfa, 0x16, 0x09, 0xb4, 0x5d, 0xd7, 0xd7, 0x02, 0xdb, 0x3d, 0xd0, 0x76, 0x5d, 0xdb, 0x76, + 0x0f, 0x88, 0x2f, 0xd3, 0x72, 0x15, 0xdb, 0x1d, 0x34, 0x39, 0xd1, 0xba, 0xeb, 0xf7, 0x6c, 0xf7, + 0x60, 0x5d, 0x52, 0x50, 0x97, 0x2e, 0x9e, 0x73, 0x68, 0x19, 0x8f, 0xa5, 0x4b, 0x17, 0x41, 0xfb, + 0x96, 0xf1, 0x98, 0x3a, 0xd4, 0xc4, 0x26, 0x2c, 0x3b, 0xc3, 0xa9, 0x72, 0x8c, 0xaa, 0x2c, 0x81, + 0x94, 0x48, 0xbd, 0x07, 0x4a, 0xd3, 0x31, 0xfc, 0x43, 0x2f, 0xb1, 0xe6, 0x6f, 0x01, 0xa2, 0x46, + 0x52, 0xb3, 0x5d, 0xe3, 0xb1, 0x36, 0xd4, 0x1d, 0x7d, 0x40, 0xc7, 0xc5, 0x9f, 0x7f, 0x15, 0x8a, + 0xd9, 0x74, 0x8d, 0xc7, 0x5b, 0x02, 0xae, 0xbe, 0x0f, 0xd0, 0xf3, 0x7c, 0xa2, 0x9b, 0x1d, 0xea, + 0x4d, 0x50, 0xd5, 0xb1, 0x96, 0x66, 0x8a, 0xda, 0x03, 0xd7, 0x17, 0x47, 0x5d, 0xe1, 0x88, 0x46, + 0x04, 0x57, 0xff, 0x29, 0xcc, 0x77, 0x6d, 0xdd, 0x60, 0xd5, 0x40, 0xdd, 0xe8, 0x3d, 0x13, 0xdd, + 0x85, 0x3c, 0x27, 0x15, 0x2b, 0x39, 0xf1, 0xb8, 0xc5, 0x7d, 0x6e, 0x4c, 0x61, 0x41, 0x5f, 0x2b, + 0x03, 0xc4, 0x72, 0xd4, 0x3f, 0x4d, 0x41, 0x31, 0x92, 0x8f, 0x56, 0xf9, 0x6b, 0x64, 0xe8, 0xeb, + 0x96, 0x23, 0x12, 0x0a, 0x45, 0x9c, 0x04, 0xa1, 0x16, 0x94, 0xbc, 0x88, 0xfb, 0x42, 0x7f, 0x6e, + 0xc2, 0xa8, 0x71, 0x92, 0x17, 0x7d, 0x00, 0x45, 0x59, 0xec, 0x21, 0x2d, 0xec, 0xc5, 0xb5, 0x21, + 0x31, 0xb9, 0xcc, 0xd3, 0xfa, 0xc4, 0xb3, 0x2d, 0x6a, 0x73, 0xb2, 0x51, 0x9e, 0x16, 0x0b, 0x90, + 0xfa, 0x0d, 0x80, 0x4f, 0x5c, 0xcb, 0xe9, 0xbb, 0x8f, 0x89, 0xc3, 0x9e, 0xe8, 0x69, 0xc4, 0x4a, + 0xa4, 0xa2, 0x45, 0x8b, 0x25, 0x22, 0xf8, 0x2a, 0x45, 0x2f, 0xd5, 0xbc, 0xa9, 0xfe, 0x4e, 0x1a, + 0xf2, 0xd8, 0x75, 0xc3, 0x7a, 0x15, 0xad, 0x42, 0x5e, 0x98, 0x12, 0x76, 0x45, 0xd5, 0x8a, 0xa7, + 0x27, 0x2b, 0x39, 0x6e, 0x43, 0x72, 0x06, 0x33, 0x1e, 0x09, 0x23, 0x9f, 0x3e, 0xcf, 0xc8, 0xa3, + 0xdb, 0x50, 0x16, 0x44, 0xda, 0x9e, 0x1e, 0xec, 0xf1, 0xf0, 0xb1, 0x36, 0x7b, 0x7a, 0xb2, 0x02, + 0x9c, 0x72, 0x43, 0x0f, 0xf6, 0x30, 0x70, 0x6a, 0xfa, 0x1b, 0x35, 0xa1, 0xf4, 0x99, 0x6b, 0x39, + 0x5a, 0xc8, 0x26, 0x21, 0x52, 0x9d, 0x13, 0x97, 0x3a, 0x9e, 0xaa, 0x28, 0xf6, 0x81, 0xcf, 0xe2, + 0xc9, 0x37, 0x61, 0xc6, 0x77, 0xdd, 0x90, 0x5b, 0x36, 0xcb, 0x75, 0x44, 0x16, 0x65, 0x75, 0x62, + 0x72, 0xdd, 0x75, 0x43, 0x2c, 0xe8, 0x70, 0xd9, 0x4f, 0xb4, 0xd0, 0x6d, 0x58, 0xb0, 0xf5, 0x20, + 0xd4, 0x98, 0x49, 0x34, 0x63, 0x69, 0x3c, 0x08, 0x45, 0x14, 0xc7, 0x9e, 0x11, 0x4d, 0xc9, 0xa1, + 0xfe, 0x49, 0x0a, 0x4a, 0x74, 0x32, 0xd6, 0xae, 0x65, 0x50, 0x3f, 0xf0, 0xf9, 0xdd, 0x93, 0xab, + 0x90, 0x31, 0x02, 0x5f, 0x28, 0x95, 0xdd, 0xcf, 0xf5, 0x1e, 0xc6, 0x14, 0x86, 0xee, 0x41, 0x5e, + 0x64, 0x73, 0xb8, 0x67, 0xa2, 0x5e, 0xee, 0xb1, 0x0a, 0xdd, 0x08, 0x3e, 0xb6, 0xdd, 0xe3, 0xd1, + 0xf1, 0x7b, 0x02, 0x27, 0x41, 0x68, 0x11, 0xd2, 0x06, 0x57, 0x97, 0xa8, 0x26, 0xab, 0xb7, 0x71, + 0xda, 0x70, 0xd4, 0x9f, 0xa5, 0x60, 0x26, 0xb6, 0x09, 0x74, 0x07, 0x5c, 0x83, 0x62, 0x30, 0xda, + 0x09, 0x0e, 0x83, 0x90, 0x0c, 0x65, 0xf9, 0x41, 0x04, 0x40, 0x2d, 0x28, 0xea, 0xf6, 0xc0, 0xf5, + 0xad, 0x70, 0x6f, 0x28, 0x02, 0xd9, 0xc9, 0xde, 0x44, 0x52, 0xe6, 0x5a, 0x55, 0xb2, 0xe0, 0x98, + 0x5b, 0xba, 0x06, 0xbc, 0xf2, 0x86, 0xb9, 0x06, 0xaf, 0x40, 0xd9, 0xd6, 0x87, 0x2c, 0xbd, 0x15, + 0x5a, 0x43, 0x22, 0x0f, 0x83, 0x80, 0xf5, 0xad, 0x21, 0x51, 0x55, 0x28, 0x46, 0xc2, 0xd0, 0x1c, + 0x94, 0xaa, 0xcd, 0x9e, 0xf6, 0xf6, 0x9d, 0xbb, 0xda, 0xfd, 0xfa, 0x96, 0x32, 0x25, 0xdc, 0xd7, + 0xff, 0x97, 0x82, 0x19, 0x61, 0xb1, 0x44, 0x48, 0xf0, 0x2a, 0x4c, 0xfb, 0xfa, 0x6e, 0x28, 0x83, + 0x96, 0x2c, 0xdf, 0xd5, 0xf4, 0x12, 0xa0, 0x41, 0x0b, 0x45, 0x4d, 0x0e, 0x5a, 0x12, 0x05, 0x31, + 0x99, 0x0b, 0x0b, 0x62, 0xb2, 0xbf, 0x91, 0x82, 0x18, 0xf5, 0x5f, 0x03, 0xac, 0x5b, 0x36, 0xe9, + 0xf3, 0x4c, 0xd8, 0xa4, 0x10, 0x94, 0xba, 0x79, 0x51, 0x5d, 0x11, 0x77, 0xf3, 0x5a, 0x0d, 0x4c, + 0x61, 0x14, 0x35, 0xb0, 0x4c, 0x71, 0x18, 0x19, 0xea, 0x3e, 0x45, 0x0d, 0x2c, 0x33, 0x7a, 0x78, + 0xcc, 0x5e, 0xf2, 0xf0, 0xa8, 0xce, 0xc1, 0x0c, 0xe6, 0x29, 0x3c, 0x3e, 0x06, 0xf5, 0x38, 0x05, + 0x73, 0xc2, 0xdf, 0x8d, 0x4c, 0xf6, 0x1b, 0x50, 0xe4, 0xae, 0x6f, 0x1c, 0x04, 0xb2, 0xaa, 0x10, + 0x4e, 0xd7, 0x6a, 0xe0, 0x02, 0x47, 0xb7, 0x4c, 0xb4, 0x02, 0x25, 0x41, 0x9a, 0x28, 0x45, 0x04, + 0x0e, 0x62, 0xb5, 0x52, 0xef, 0x42, 0x76, 0xd7, 0xb2, 0x89, 0xd8, 0xf9, 0x13, 0x2d, 0x42, 0xac, + 0x91, 0x8d, 0x29, 0xcc, 0xa8, 0x6b, 0x05, 0x99, 0x3b, 0x54, 0xff, 0x3c, 0xc5, 0x32, 0xd8, 0x34, + 0x54, 0x4d, 0x8e, 0x8f, 0x47, 0xad, 0x67, 0xc6, 0xc7, 0xe9, 0xe8, 0xf8, 0x38, 0x9a, 0x8f, 0x4f, + 0x90, 0x26, 0xc7, 0xc7, 0x41, 0xbf, 0xfe, 0xf8, 0xd0, 0x47, 0x30, 0x2d, 0x32, 0xa1, 0xc2, 0xd4, + 0xbd, 0x32, 0x71, 0x67, 0x24, 0x35, 0xbd, 0x31, 0x85, 0x25, 0x4f, 0x62, 0x7a, 0x9b, 0xb0, 0x58, + 0xb3, 0x75, 0xe3, 0xb1, 0x6d, 0x05, 0x21, 0x31, 0x93, 0x16, 0xe8, 0x0e, 0xe4, 0xc7, 0xfc, 0xdc, + 0x8b, 0x72, 0xb4, 0x82, 0x52, 0xfd, 0x5f, 0x69, 0x28, 0x6f, 0x10, 0xdd, 0x0e, 0xf7, 0xe2, 0x4c, + 0x55, 0x48, 0x82, 0x50, 0xdc, 0x8f, 0xec, 0x37, 0xfa, 0x1a, 0x14, 0x22, 0x37, 0xe8, 0xd2, 0xd7, + 0xc6, 0x88, 0x14, 0xbd, 0x03, 0xd3, 0x74, 0xec, 0xee, 0x48, 0xc6, 0x57, 0x17, 0x3d, 0x64, 0x09, + 0x4a, 0x7a, 0x69, 0xf9, 0x84, 0xf9, 0x3d, 0x4c, 0x4f, 0x39, 0x2c, 0x9b, 0xe8, 0xeb, 0x50, 0x66, + 0xef, 0x30, 0xd2, 0xcd, 0xcb, 0x5d, 0x26, 0xb3, 0xc4, 0x9f, 0x52, 0x19, 0x35, 0xba, 0x07, 0xb3, + 0x9c, 0x3b, 0x9a, 0x49, 0xfe, 0x32, 0xfe, 0x19, 0xc6, 0x20, 0x1d, 0x3d, 0xf5, 0xc7, 0x69, 0x58, + 0xd8, 0xd2, 0x0f, 0x77, 0x88, 0x30, 0x64, 0xc4, 0xc4, 0xc4, 0x70, 0x7d, 0x13, 0x75, 0x93, 0x06, + 0xf0, 0x82, 0xb7, 0xdd, 0x49, 0xcc, 0x93, 0xed, 0xa0, 0x8c, 0x1a, 0xd3, 0x89, 0xa8, 0x71, 0x01, + 0x72, 0x8e, 0xeb, 0x18, 0x44, 0x58, 0x47, 0xde, 0x50, 0xbf, 0x9f, 0x4a, 0x5a, 0xbf, 0x4a, 0xf4, + 0xee, 0xca, 0xd2, 0x66, 0x6d, 0x37, 0x8c, 0xba, 0x43, 0xf7, 0xa0, 0xd2, 0x6b, 0xd6, 0x71, 0xb3, + 0x5f, 0xeb, 0x7c, 0x53, 0xeb, 0x55, 0x37, 0x7b, 0xd5, 0x3b, 0xb7, 0xb5, 0x6e, 0x67, 0xf3, 0xd3, + 0xb7, 0xdf, 0xb9, 0xfd, 0x35, 0x25, 0x55, 0x59, 0x3d, 0x3a, 0x5e, 0xbd, 0xd6, 0xae, 0xd6, 0x37, + 0xf9, 0x99, 0xdd, 0x71, 0x9f, 0xf4, 0x74, 0x3b, 0xd0, 0xef, 0xdc, 0xee, 0xba, 0xf6, 0x21, 0xa5, + 0x41, 0x6f, 0x02, 0x5a, 0x6f, 0xe2, 0x76, 0xb3, 0xaf, 0x49, 0x13, 0x5b, 0xaf, 0xd5, 0x95, 0x34, + 0x8f, 0xc5, 0xd6, 0x89, 0xef, 0x90, 0xb0, 0xda, 0xec, 0xbd, 0x7d, 0xe7, 0x6e, 0xbd, 0x56, 0xa7, + 0x56, 0xa2, 0x9c, 0xbc, 0x6f, 0x93, 0x6e, 0x44, 0xea, 0x5c, 0x37, 0x22, 0xf6, 0x46, 0xd2, 0xe7, + 0x78, 0x23, 0xeb, 0xb0, 0x60, 0xf8, 0x6e, 0x10, 0x68, 0x34, 0xc0, 0x21, 0xe6, 0x99, 0x10, 0xea, + 0x85, 0xd3, 0x93, 0x95, 0x2b, 0x75, 0x8a, 0xef, 0x31, 0xb4, 0x10, 0x7f, 0xc5, 0x48, 0x80, 0x58, + 0x4f, 0xea, 0x8f, 0xa7, 0xa9, 0xaf, 0x68, 0xed, 0x5b, 0x36, 0x19, 0x90, 0x00, 0x3d, 0x84, 0x39, + 0xc3, 0x27, 0x26, 0x8d, 0x5c, 0x74, 0x3b, 0xf9, 0x1d, 0xc0, 0x57, 0x27, 0xba, 0x6d, 0x11, 0xe3, + 0x5a, 0x3d, 0xe2, 0xea, 0x79, 0xc4, 0xc0, 0xb3, 0xc6, 0x58, 0x1b, 0x7d, 0x06, 0x73, 0x01, 0xb1, + 0x2d, 0x67, 0xf4, 0x44, 0x33, 0x5c, 0x27, 0x24, 0x4f, 0xe4, 0x7b, 0xe3, 0x65, 0x72, 0x7b, 0xcd, + 0x4d, 0xca, 0x55, 0xe7, 0x4c, 0x35, 0x74, 0x7a, 0xb2, 0x32, 0x3b, 0x0e, 0xc3, 0xb3, 0x42, 0xb2, + 0x68, 0xa3, 0x06, 0x4c, 0x07, 0xc4, 0x30, 0xdc, 0xa1, 0x27, 0xce, 0xdb, 0xcd, 0xcb, 0xfa, 0xe0, + 0xd4, 0x1d, 0x2f, 0x0c, 0xb0, 0x64, 0x45, 0xf7, 0xa1, 0xa0, 0x7b, 0x9e, 0xee, 0x0f, 0xa3, 0xf7, + 0xe7, 0x37, 0x2f, 0x11, 0x53, 0xf5, 0xbc, 0x2a, 0x25, 0x67, 0x72, 0x22, 0x66, 0x74, 0x13, 0xae, + 0x38, 0xae, 0xe6, 0x90, 0x03, 0xcd, 0x8b, 0x68, 0x79, 0x79, 0x16, 0x9e, 0x73, 0xdc, 0x36, 0x39, + 0x88, 0x45, 0x54, 0xf6, 0x60, 0x76, 0x5c, 0x91, 0x68, 0x41, 0x58, 0x59, 0x66, 0xac, 0x23, 0x2b, + 0x7a, 0x0d, 0x0a, 0x3e, 0x19, 0x58, 0x41, 0xe8, 0xf3, 0x1d, 0x42, 0x31, 0x11, 0x04, 0x2d, 0x41, + 0x3e, 0x51, 0x17, 0x44, 0x71, 0xa2, 0x4d, 0xcd, 0x27, 0x2f, 0x6b, 0xac, 0xfc, 0x4b, 0x38, 0xa3, + 0x46, 0x6a, 0x71, 0x4c, 0x2b, 0xd0, 0x77, 0x44, 0x67, 0x05, 0x2c, 0x9b, 0xf4, 0x18, 0x8e, 0x82, + 0xc8, 0x7b, 0x66, 0xbf, 0x29, 0x8c, 0xb9, 0x79, 0xa2, 0xc8, 0x93, 0x39, 0x72, 0xb2, 0xd4, 0x3e, + 0x9b, 0x28, 0xb5, 0x5f, 0x80, 0x9c, 0x4d, 0xf6, 0x89, 0xcd, 0x1d, 0x2c, 0xcc, 0x1b, 0x95, 0x1f, + 0xa7, 0xa0, 0x94, 0xd0, 0x3a, 0xfa, 0x44, 0xdc, 0xc2, 0xdc, 0x6a, 0xbc, 0xf7, 0xec, 0xeb, 0x25, + 0x7f, 0x8f, 0x57, 0x08, 0x79, 0xbe, 0xcb, 0x94, 0xc6, 0xed, 0x86, 0x6c, 0xaa, 0xef, 0x45, 0x9d, + 0xb2, 0x5c, 0x79, 0x29, 0x51, 0x61, 0x83, 0x66, 0x01, 0xb6, 0xdb, 0xf5, 0x4e, 0x7b, 0xbd, 0xd5, + 0x6e, 0x36, 0xf8, 0xe3, 0x72, 0x7d, 0xbb, 0xd7, 0xef, 0x6c, 0x29, 0xe9, 0xca, 0x77, 0x53, 0x50, + 0x4e, 0x2e, 0x2e, 0xda, 0x1c, 0x1b, 0xee, 0xdd, 0xe7, 0xd8, 0x17, 0x51, 0x23, 0xe1, 0x59, 0xbc, + 0x11, 0x4b, 0x7f, 0x7a, 0x5c, 0x65, 0x28, 0x34, 0x5a, 0xbd, 0x6a, 0x6d, 0x93, 0x8e, 0x8a, 0x99, + 0xb9, 0x4f, 0xdc, 0x1d, 0xe1, 0xbb, 0xad, 0xc3, 0xcc, 0x67, 0xee, 0x8e, 0x66, 0x85, 0xc4, 0x8f, + 0x4b, 0x23, 0x4b, 0x77, 0x5e, 0x9a, 0x34, 0x1e, 0xf1, 0xa5, 0x82, 0xf0, 0x8e, 0xcb, 0x9f, 0xb9, + 0x3b, 0x2d, 0xc9, 0x86, 0xaa, 0x30, 0xcb, 0x9c, 0x7e, 0xf2, 0x84, 0x18, 0x23, 0x26, 0xe8, 0xf2, + 0x5a, 0x80, 0x19, 0xca, 0xd1, 0x94, 0x0c, 0xea, 0x8f, 0x72, 0xa0, 0xf0, 0x02, 0xaa, 0x2a, 0x2b, + 0xa8, 0x66, 0x13, 0xb9, 0x07, 0xb9, 0xc0, 0x70, 0xa3, 0x3a, 0xdc, 0x89, 0xc7, 0xf0, 0x2c, 0xd3, + 0x5a, 0x8f, 0x72, 0x60, 0xce, 0x88, 0xd6, 0x61, 0x3a, 0xd8, 0xd3, 0x7d, 0xcb, 0x19, 0x08, 0x8f, + 0xfa, 0xad, 0x67, 0x93, 0xc1, 0x79, 0xb0, 0x64, 0x46, 0x1b, 0x90, 0xdb, 0xa1, 0x61, 0xbc, 0x30, + 0x08, 0xb7, 0x9f, 0x49, 0x4a, 0x8d, 0x72, 0x70, 0xe8, 0xc6, 0x14, 0xe6, 0x02, 0xa8, 0x24, 0x56, + 0xcd, 0x29, 0x6c, 0xc2, 0xb3, 0x49, 0x62, 0x85, 0x51, 0xb1, 0x24, 0x26, 0xa0, 0x32, 0x03, 0xa5, + 0x44, 0x0f, 0x95, 0xfb, 0x50, 0x4a, 0x90, 0xa1, 0x17, 0x61, 0x7a, 0x37, 0xd0, 0x12, 0x5f, 0xae, + 0xe4, 0x77, 0x03, 0x56, 0xdd, 0xb6, 0x02, 0x25, 0xc6, 0xaf, 0xed, 0xda, 0xfa, 0x40, 0x3e, 0x04, + 0x03, 0x03, 0xad, 0x53, 0x88, 0x6a, 0x40, 0x8e, 0xe9, 0x10, 0xdd, 0x84, 0x52, 0xaf, 0xd5, 0xbe, + 0xbf, 0xd9, 0xd4, 0xda, 0x9d, 0x06, 0xbd, 0x0c, 0x59, 0xb9, 0x23, 0x97, 0xcf, 0x28, 0x7a, 0x96, + 0x33, 0xb0, 0x09, 0x2b, 0xa1, 0xbf, 0x01, 0xb0, 0xb5, 0xbd, 0xd9, 0x6f, 0x71, 0x52, 0x51, 0x43, + 0x96, 0x20, 0xdd, 0x1a, 0xd9, 0xa1, 0x45, 0x29, 0x45, 0x20, 0xf1, 0x3f, 0x53, 0x30, 0x2d, 0xb4, + 0x8c, 0x56, 0xa2, 0xdb, 0xf6, 0x85, 0xa3, 0xe3, 0xd5, 0x2b, 0x82, 0x8b, 0x23, 0x59, 0xa5, 0xd3, + 0x0d, 0x56, 0x84, 0xde, 0xd0, 0x3a, 0xed, 0xcd, 0x4f, 0x95, 0xd4, 0xd8, 0x30, 0xc4, 0x42, 0x89, + 0x0a, 0x55, 0x74, 0x13, 0xa0, 0xd3, 0x6e, 0x6a, 0x8f, 0x70, 0xab, 0xdf, 0xc4, 0xb2, 0x48, 0x6d, + 0x8c, 0xb4, 0xe3, 0x90, 0x47, 0x3e, 0xdd, 0xf1, 0xe8, 0x65, 0xc8, 0x54, 0x37, 0x37, 0x95, 0x0c, + 0x2f, 0x9c, 0x1a, 0x23, 0xaa, 0xda, 0x36, 0x1f, 0x67, 0x6d, 0x06, 0x4a, 0xbc, 0xc2, 0x9f, 0xa9, + 0x52, 0xbd, 0x0b, 0x65, 0x41, 0xc8, 0xd3, 0xd2, 0x4f, 0xe7, 0x60, 0x17, 0xa3, 0x5c, 0xb8, 0x7c, + 0x10, 0x66, 0x2d, 0xf5, 0x7f, 0x64, 0x60, 0x9e, 0xb3, 0x8a, 0x57, 0xb1, 0x38, 0x7e, 0xba, 0xfc, + 0xd1, 0xa7, 0x3e, 0x5e, 0x3f, 0xf1, 0xd5, 0xf3, 0x37, 0xcd, 0x98, 0xf0, 0xf1, 0xc7, 0x17, 0x13, + 0xe6, 0xe4, 0xd3, 0xa4, 0xbc, 0x42, 0x79, 0x46, 0xe5, 0xc3, 0x67, 0x15, 0x27, 0x5a, 0xc2, 0xe0, + 0xf3, 0x1c, 0xb6, 0x7c, 0x15, 0x4d, 0xdc, 0x02, 0xb2, 0x6a, 0x23, 0x37, 0x56, 0xb5, 0x51, 0xa9, + 0xc2, 0xfc, 0x04, 0x01, 0xcf, 0x95, 0xc6, 0xfe, 0xb6, 0x7c, 0x2c, 0x9a, 0x87, 0x39, 0xf1, 0xc4, + 0xa3, 0x75, 0xb7, 0x6b, 0x9b, 0xad, 0xde, 0x86, 0x32, 0x85, 0x66, 0xa0, 0x28, 0x1a, 0xcc, 0x02, + 0x57, 0x60, 0x51, 0xd2, 0xd0, 0x4d, 0xa9, 0x6d, 0xb7, 0x25, 0x69, 0x1a, 0xbd, 0x00, 0x57, 0x24, + 0x2e, 0x06, 0x67, 0xd4, 0xdf, 0x4f, 0x03, 0xf0, 0x89, 0xb3, 0xcf, 0x51, 0xae, 0xc3, 0xac, 0xa1, + 0x7b, 0xba, 0x61, 0x85, 0x87, 0x63, 0x75, 0xa7, 0x33, 0x12, 0xca, 0x6b, 0x4f, 0xbf, 0x19, 0x15, + 0xc3, 0xc7, 0xae, 0xc9, 0xb9, 0x1f, 0x71, 0xc5, 0xe2, 0xc5, 0xcf, 0x31, 0x6d, 0x8a, 0xb2, 0x78, + 0xa9, 0xcc, 0x37, 0xa0, 0x28, 0x24, 0x47, 0xd1, 0x27, 0x0b, 0xb7, 0x84, 0x90, 0x06, 0x2e, 0x70, + 0x74, 0xcb, 0x3c, 0xff, 0x1b, 0x96, 0xcc, 0xaf, 0xf3, 0x0d, 0x4b, 0xe5, 0x1e, 0xa0, 0xa7, 0x87, + 0xf7, 0x5c, 0x6b, 0xf5, 0x08, 0x66, 0xea, 0x42, 0x4d, 0x98, 0x15, 0x3f, 0x5c, 0x87, 0x59, 0x9f, + 0x7f, 0xb5, 0x68, 0x8e, 0x6b, 0x53, 0x42, 0xb9, 0x36, 0x57, 0xa0, 0xc4, 0x52, 0xe2, 0x63, 0x9f, + 0x51, 0x02, 0x03, 0x31, 0x02, 0xf5, 0x8f, 0xb3, 0xd1, 0x55, 0x11, 0x50, 0xe7, 0x95, 0x65, 0x25, + 0x17, 0x21, 0x1d, 0x9d, 0x20, 0x96, 0x84, 0x69, 0x35, 0x70, 0xda, 0x32, 0xc7, 0x35, 0x98, 0xbe, + 0x50, 0x83, 0xf1, 0xa3, 0x6f, 0xe6, 0x99, 0x1f, 0x7d, 0xbf, 0xfd, 0xd4, 0xd2, 0x73, 0x85, 0xff, + 0x93, 0x0b, 0xcc, 0x7a, 0x34, 0xe8, 0x67, 0xd8, 0x00, 0xfa, 0xd3, 0x67, 0x36, 0x77, 0xfe, 0x03, + 0xe1, 0x53, 0x1d, 0x3c, 0xcb, 0x81, 0x6d, 0x46, 0x16, 0x8e, 0xb9, 0x24, 0x3c, 0x9a, 0x7b, 0xed, + 0x59, 0xae, 0x25, 0x0c, 0x7a, 0x7c, 0x57, 0x7f, 0xc0, 0x9c, 0x66, 0x9f, 0x84, 0x81, 0xf8, 0x4c, + 0x6d, 0xf5, 0x7c, 0x11, 0x22, 0xeb, 0x21, 0x19, 0xbe, 0xfc, 0x66, 0xfb, 0x4d, 0xd8, 0x96, 0x6f, + 0x45, 0xbb, 0x2a, 0xaa, 0x33, 0x3a, 0x77, 0x57, 0x3d, 0xe7, 0xb7, 0x3e, 0xea, 0xbf, 0x4b, 0xc1, + 0x7c, 0x74, 0xdc, 0xe2, 0x2f, 0x77, 0xd1, 0x07, 0x50, 0x64, 0x9b, 0x3f, 0xb0, 0xd8, 0x9b, 0xfa, + 0xe5, 0x47, 0x35, 0x26, 0x67, 0xa9, 0x71, 0x96, 0x29, 0xf7, 0x89, 0x29, 0x0c, 0xce, 0x25, 0xbc, + 0x11, 0xb9, 0xfa, 0xbd, 0x14, 0x14, 0x24, 0x1c, 0xad, 0x43, 0x21, 0x20, 0x03, 0xf6, 0x25, 0xb1, + 0x18, 0xc3, 0xcd, 0x8b, 0xe4, 0xac, 0xf5, 0x04, 0xb1, 0x28, 0x3c, 0x92, 0xbc, 0x95, 0x0f, 0x61, + 0x66, 0x0c, 0xf5, 0x5c, 0xda, 0xff, 0x45, 0x74, 0xa8, 0xa9, 0xd1, 0x10, 0x9f, 0xa6, 0x45, 0x5e, + 0x57, 0xea, 0x32, 0x5f, 0x29, 0x66, 0xba, 0xc4, 0xeb, 0x4a, 0x3f, 0x87, 0xa4, 0x49, 0x5e, 0x17, + 0xea, 0x8e, 0x1f, 0x17, 0x6e, 0x2a, 0x6e, 0x3d, 0x93, 0xbc, 0xc9, 0x27, 0xe7, 0x1f, 0xcb, 0x8f, + 0xab, 0xfc, 0x7d, 0x0a, 0x20, 0xe1, 0x4c, 0x6f, 0x8c, 0xc5, 0x1c, 0xef, 0x3e, 0xe7, 0x88, 0xd7, + 0x12, 0xf1, 0xc6, 0x7f, 0x4b, 0x41, 0x56, 0x06, 0x1a, 0x71, 0xf5, 0xd6, 0x22, 0xa0, 0x84, 0xb7, + 0x28, 0x5d, 0xb0, 0x14, 0x7a, 0x09, 0x5e, 0x4c, 0xc2, 0xa9, 0x23, 0xd7, 0xc4, 0xdc, 0x95, 0x4b, + 0xd3, 0x3b, 0x3a, 0x76, 0x1b, 0xc7, 0x70, 0x19, 0x74, 0x0d, 0x96, 0x12, 0x38, 0x21, 0x43, 0x88, + 0xcd, 0x52, 0xb1, 0x09, 0x2c, 0xff, 0x29, 0x90, 0xb9, 0x33, 0x5e, 0xdb, 0xcd, 0xaf, 0x43, 0x59, + 0x7e, 0x01, 0xcc, 0x54, 0x57, 0x80, 0x6c, 0xbf, 0xda, 0x7b, 0xa0, 0x4c, 0xd1, 0x28, 0x8d, 0x27, + 0x73, 0x44, 0xc4, 0x46, 0xe3, 0xb7, 0xfb, 0x4a, 0x9a, 0xfe, 0x16, 0x5f, 0x79, 0x64, 0x6e, 0xfe, + 0xa7, 0x2c, 0x14, 0xa3, 0xe2, 0x54, 0x74, 0x15, 0x32, 0xed, 0xe6, 0x23, 0x99, 0x19, 0x8a, 0xe0, + 0x6d, 0x72, 0x80, 0x5e, 0x89, 0xeb, 0x4e, 0xee, 0x71, 0xa7, 0x32, 0x42, 0xcb, 0x9a, 0x93, 0xd7, + 0xa0, 0x50, 0xed, 0xf5, 0x5a, 0xf7, 0x69, 0x8c, 0xf8, 0x45, 0x8a, 0xfb, 0xbb, 0x11, 0x11, 0x37, + 0xdc, 0xc4, 0x64, 0x54, 0xf5, 0x7a, 0xb3, 0xdb, 0x6f, 0x36, 0x94, 0xcf, 0xd3, 0x67, 0xa9, 0x58, + 0x1d, 0x05, 0xfb, 0x5e, 0xa9, 0xd8, 0xc5, 0xcd, 0x6e, 0x15, 0xd3, 0x0e, 0xbf, 0x48, 0xf3, 0x72, + 0x98, 0xb8, 0x47, 0x9f, 0x78, 0xdc, 0xbd, 0x5e, 0x96, 0x9f, 0x46, 0x7e, 0x9e, 0xe1, 0x5f, 0xa4, + 0xc4, 0x95, 0xb6, 0x44, 0x37, 0x0f, 0x69, 0x6f, 0xac, 0xc4, 0x99, 0x89, 0xc9, 0x9c, 0xe9, 0xad, + 0x17, 0xea, 0x7e, 0x48, 0xa5, 0xa8, 0x30, 0x8d, 0xb7, 0xdb, 0x6d, 0x4a, 0xf4, 0x79, 0xf6, 0xcc, + 0xec, 0xf0, 0xc8, 0x71, 0x28, 0xcd, 0x75, 0x28, 0xc8, 0x0a, 0x68, 0xe5, 0x8b, 0xec, 0x99, 0x01, + 0xd5, 0x65, 0xf9, 0x36, 0xeb, 0x70, 0x63, 0xbb, 0xcf, 0xbe, 0xdc, 0xfc, 0x3c, 0x77, 0xb6, 0xc3, + 0xbd, 0x51, 0x68, 0xba, 0x07, 0x0e, 0x5a, 0x8d, 0x2a, 0x6f, 0xbe, 0xc8, 0xf1, 0xd4, 0x58, 0x44, + 0x23, 0xca, 0x6e, 0x5e, 0x83, 0x02, 0x6e, 0x7e, 0xc2, 0x3f, 0xf2, 0xfc, 0x3c, 0x7f, 0x46, 0x0e, + 0x26, 0x9f, 0x11, 0x83, 0xf6, 0xb6, 0x0a, 0x79, 0xdc, 0xdc, 0xea, 0x3c, 0x6c, 0x2a, 0xff, 0x3d, + 0x7f, 0x46, 0x0e, 0x26, 0x43, 0x97, 0x7d, 0xd0, 0x55, 0xe8, 0xe0, 0xee, 0x46, 0x95, 0x2d, 0xca, + 0x59, 0x39, 0x1d, 0xdf, 0xdb, 0xd3, 0x1d, 0x62, 0xc6, 0x9f, 0xdc, 0x44, 0xa8, 0x9b, 0xdf, 0x86, + 0x82, 0x7c, 0x8a, 0x42, 0xcb, 0x90, 0x7f, 0xd4, 0xc1, 0x0f, 0x9a, 0x58, 0x99, 0xe2, 0x5a, 0x96, + 0x98, 0x47, 0xfc, 0x11, 0x71, 0x15, 0xa6, 0xb7, 0xaa, 0xed, 0xea, 0x7d, 0x7a, 0x26, 0xf8, 0x30, + 0x24, 0x81, 0x78, 0x4f, 0xa9, 0x28, 0xa2, 0x83, 0x48, 0x66, 0xed, 0xb5, 0x9f, 0xfc, 0x72, 0x79, + 0xea, 0xe7, 0xbf, 0x5c, 0x9e, 0xfa, 0xfc, 0x74, 0x39, 0xf5, 0x93, 0xd3, 0xe5, 0xd4, 0x4f, 0x4f, + 0x97, 0x53, 0x7f, 0x79, 0xba, 0x9c, 0xfa, 0xf7, 0xbf, 0x5a, 0x9e, 0xfa, 0xe9, 0xaf, 0x96, 0xa7, + 0x7e, 0xfe, 0xab, 0xe5, 0xa9, 0x9d, 0x3c, 0x8b, 0xae, 0xdf, 0xf9, 0x87, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xf9, 0x81, 0xb5, 0x45, 0x10, 0x46, 0x00, 0x00, } func (m *Version) Copy() *Version { @@ -8953,6 +8960,16 @@ func (m *IPAMConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.AvailableAllocationIps != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.AvailableAllocationIps)) + i-- + dAtA[i] = 0x38 + } + if m.AvailableIps != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.AvailableIps)) + i-- + dAtA[i] = 0x30 + } if len(m.Reserved) > 0 { for k := range m.Reserved { v := m.Reserved[k] @@ -12341,6 +12358,12 @@ func (m *IPAMConfig) Size() (n int) { n += mapEntrySize + 1 + sovTypes(uint64(mapEntrySize)) } } + if m.AvailableIps != 0 { + n += 1 + sovTypes(uint64(m.AvailableIps)) + } + if m.AvailableAllocationIps != 0 { + n += 1 + sovTypes(uint64(m.AvailableAllocationIps)) + } return n } @@ -13979,6 +14002,8 @@ func (this *IPAMConfig) String() string { `Range:` + fmt.Sprintf("%v", this.Range) + `,`, `Gateway:` + fmt.Sprintf("%v", this.Gateway) + `,`, `Reserved:` + mapStringForReserved + `,`, + `AvailableIps:` + fmt.Sprintf("%v", this.AvailableIps) + `,`, + `AvailableAllocationIps:` + fmt.Sprintf("%v", this.AvailableAllocationIps) + `,`, `}`, }, "") return s @@ -19708,6 +19733,44 @@ func (m *IPAMConfig) Unmarshal(dAtA []byte) error { } m.Reserved[mapkey] = mapvalue iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AvailableIps", wireType) + } + m.AvailableIps = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AvailableIps |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AvailableAllocationIps", wireType) + } + m.AvailableAllocationIps = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AvailableAllocationIps |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/vendor/github.com/moby/swarmkit/v2/api/types.proto b/vendor/github.com/moby/swarmkit/v2/api/types.proto index 74f5c7135f462..367b2730e4b12 100644 --- a/vendor/github.com/moby/swarmkit/v2/api/types.proto +++ b/vendor/github.com/moby/swarmkit/v2/api/types.proto @@ -671,6 +671,10 @@ message IPAMConfig { // allocated. These addresses may have already been allocated or may be // reserved for another allocation manager. map reserved = 5; + // Counter of available IPs in the subnet + uint64 available_ips = 6; + // Counter of available IPs in the allocation pool + uint64 available_allocation_ips = 7; } // PortConfig specifies an exposed port which can be diff --git a/vendor/github.com/moby/swarmkit/v2/manager/allocator/network.go b/vendor/github.com/moby/swarmkit/v2/manager/allocator/network.go index 141e86e72039f..10139ff1c13b1 100644 --- a/vendor/github.com/moby/swarmkit/v2/manager/allocator/network.go +++ b/vendor/github.com/moby/swarmkit/v2/manager/allocator/network.go @@ -266,6 +266,21 @@ func (a *Allocator) doNetworkAlloc(ctx context.Context, ev events.Event) { log.G(ctx).WithError(err).Errorf("Failed deallocation during delete of service %s", s.ID) } else { nc.somethingWasDeallocated = true + + for _, vip := range v.Service.Endpoint.VirtualIPs { + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(vip.NetworkID) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", vip.NetworkID) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", vip.NetworkID) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } + } } // Remove it from unallocatedServices just in case @@ -563,6 +578,18 @@ func (a *Allocator) deallocateNodeAttachments(ctx context.Context, nid string) e log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", node.ID) } + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(nid) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", nid) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", node.ID) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } } } @@ -580,6 +607,20 @@ func (a *Allocator) deallocateNode(node *api.Node) error { if err := nc.nwkAllocator.DeallocateAttachment(node, na); err != nil { return err } + // FIXME: This is a workaround to remove the network attachment from the node. + ctx := context.Background() + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(na.Network.ID) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", na.Network.ID) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", node.ID) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } } } @@ -910,6 +951,21 @@ func (a *Allocator) doTaskAlloc(ctx context.Context, ev events.Event) { } } + for _, net := range t.Spec.Networks { + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(net.Target) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", net.Target) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", net.Target) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } + } + // if we're deallocating the task, we also might need to deallocate the // node's network attachment, if this is the last task on the node that // needs it. we can do that by doing the same dance to reallocate a @@ -1023,12 +1079,25 @@ func (a *Allocator) allocateNode(ctx context.Context, node *api.Node, existingAd } lbAttachment.Network = network.Copy() - if err := a.netCtx.nwkAllocator.AllocateAttachment(node, lbAttachment); err != nil { + netAlloc := a.netCtx.nwkAllocator + if err := netAlloc.AllocateAttachment(node, lbAttachment); err != nil { log.G(ctx).WithError(err).Errorf("Failed to allocate network resources for node %s", node.ID) // TODO: Should we add a unallocatedNode and retry allocating resources like we do for network, tasks, services? // right now, we will only retry allocating network resources for the node when the node is updated. continue } + if err := a.store.Update(func(tx store.Tx) error { + n, err := netAlloc.GetNetwork(lbAttachment.Network.ID) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", lbAttachment.Network.ID) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit allocation of network resources for node %s", node.ID) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit allocation of network resources for nodes") + } allocated = true } @@ -1206,6 +1275,21 @@ func (a *Allocator) allocateService(ctx context.Context, s *api.Service, existin return err } + for _, vip := range s.Endpoint.VirtualIPs { + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(vip.NetworkID) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", vip.NetworkID) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", vip.NetworkID) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } + } + // If the service doesn't expose ports any more and if we have // any lingering virtual IP references for ingress network // clean them up here. @@ -1345,6 +1429,21 @@ func (a *Allocator) allocateTask(ctx context.Context, t *api.Task) (err error) { if nc.nwkAllocator.IsTaskAllocated(t) { taskUpdated = true } + + for _, net := range t.Spec.Networks { + if err := a.store.Update(func(tx store.Tx) error { + n, err := nc.nwkAllocator.GetNetwork(net.Target) + if err == nil { + log.G(ctx).WithError(err).Errorf("Failed to find network with ID %s", net.Target) + } + if err := store.UpdateNetwork(tx, n); err != nil { + log.G(ctx).WithError(err).Errorf("Failed to commit deallocation of network resources for node %s", net.Target) + } + return nil + }); err != nil { + log.G(ctx).WithError(err).Error("Failed to commit deallocation of network resources for nodes") + } + } }) if err != nil { diff --git a/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/inert.go b/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/inert.go index be18ac417f5d5..99a94ac934011 100644 --- a/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/inert.go +++ b/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/inert.go @@ -59,6 +59,11 @@ var _ NetworkAllocator = Inert{} var errUnavailable = errors.New("network support is unavailable") +// Allocate returns an error unless n.Spec.Ingress is true. +func (Inert) GetNetwork(id string) (*api.Network, error) { + return nil, errUnavailable +} + // Allocate returns an error unless n.Spec.Ingress is true. func (Inert) Allocate(n *api.Network) error { if n.Spec.Ingress { @@ -67,6 +72,10 @@ func (Inert) Allocate(n *api.Network) error { return errUnavailable } +func (Inert) UpdateAvailableIps(networkId, cidr string, availableIps, availableAllocationIps uint64) error { + return nil +} + // AllocateAttachment unconditionally returns an error. func (Inert) AllocateAttachment(node *api.Node, networkAttachment *api.NetworkAttachment) error { return errUnavailable diff --git a/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/networkallocator.go b/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/networkallocator.go index 197ee4c6f4e25..ab6f9ceda66fd 100644 --- a/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/networkallocator.go +++ b/vendor/github.com/moby/swarmkit/v2/manager/allocator/networkallocator/networkallocator.go @@ -85,6 +85,12 @@ type NetworkAllocator interface { // IsAttachmentAllocated If lb endpoint is allocated on the node IsAttachmentAllocated(node *api.Node, networkAttachment *api.NetworkAttachment) bool + + // GetNetwork returns the network object for the given network ID + GetNetwork(id string) (*api.Network, error) + + // UpdateAvailableIps updates the available IPs for the network + UpdateAvailableIps(networkId, cidr string, availableIps, availableAllocationIps uint64) error } // Config is used to store network related cluster config in the Manager. diff --git a/vendor/github.com/moby/swarmkit/v2/manager/drivers/provider.go b/vendor/github.com/moby/swarmkit/v2/manager/drivers/provider.go index 1dd3fa620b6cc..0da89c9edd1bc 100644 --- a/vendor/github.com/moby/swarmkit/v2/manager/drivers/provider.go +++ b/vendor/github.com/moby/swarmkit/v2/manager/drivers/provider.go @@ -32,3 +32,16 @@ func (m *DriverProvider) NewSecretDriver(driver *api.Driver) (*SecretDriver, err } return NewSecretDriver(plugin), nil } + +// GetIPAM returns the IPAM plugin +func (m *DriverProvider) GetIPAM() (plugin.Plugin, error) { + if m.pluginGetter == nil { + return nil, fmt.Errorf("plugin getter is nil") + } + // Search for the specified plugin + plugin, err := m.pluginGetter.Get("docker.ipamdriver/1.0", SecretsProviderCapability) + if err != nil { + return nil, err + } + return plugin, nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 7af02c542dfbd..f6e79b697bfdb 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -895,7 +895,7 @@ github.com/moby/patternmatcher/ignorefile # github.com/moby/pubsub v1.0.0 ## explicit; go 1.19 github.com/moby/pubsub -# github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 +# github.com/moby/swarmkit/v2 v2.0.0-20250103191802-8c1959736554 => github.com/aepifanov/swarmkit/v2 v2.0.0-20250127222316-1d80daa215d4 ## explicit; go 1.18 github.com/moby/swarmkit/v2/agent github.com/moby/swarmkit/v2/agent/configs