From 2bfb8e60e88c0c06e5bbf2b0f554f07af080ca0c Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Thu, 6 Jul 2023 19:31:04 +0000 Subject: [PATCH 1/2] Revendor moby/moby to get API changes This is needed for the next commit which uses the new `StartInterval` health config field. Signed-off-by: Brian Goff --- go.mod | 2 +- go.sum | 4 +- .../github.com/docker/docker/api/swagger.yaml | 48 +--- .../docker/api/types/container/config.go | 7 +- .../docker/docker/api/types/types.go | 7 + .../docker/docker/client/container_create.go | 3 + .../docker/libnetwork/bitmap/sequence.go | 4 +- .../docker/libnetwork/bitseq/sequence.go | 213 ---------------- .../docker/docker/libnetwork/bitseq/store.go | 128 ---------- .../docker/libnetwork/datastore/cache.go | 2 +- .../docker/libnetwork/datastore/datastore.go | 231 ++---------------- .../docker/libnetwork/datastore/mock_store.go | 51 +--- .../drivers/bridge/brmanager/brmanager.go | 4 +- .../docker/libnetwork/drivers/host/host.go | 14 +- .../drivers/ipvlan/ivmanager/ivmanager.go | 4 +- .../drivers/macvlan/mvmanager/mvmanager.go | 4 +- .../drivers/overlay/overlayutils/utils.go | 22 ++ .../drivers/overlay/ovmanager/ovmanager.go | 114 ++++----- .../libnetwork/drivers/remote/driver.go | 4 +- .../docker/docker/libnetwork/idm/idm.go | 76 ------ .../libnetwork/internal/kvstore/kvstore.go | 65 +---- vendor/modules.txt | 4 +- 22 files changed, 151 insertions(+), 860 deletions(-) delete mode 100644 vendor/github.com/docker/docker/libnetwork/bitseq/sequence.go delete mode 100644 vendor/github.com/docker/docker/libnetwork/bitseq/store.go delete mode 100644 vendor/github.com/docker/docker/libnetwork/idm/idm.go diff --git a/go.mod b/go.mod index cc3d6092a7..1c95133161 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/cloudflare/cfssl v0.0.0-20180323000720-5d63dbd981b5 github.com/container-storage-interface/spec v1.2.0 github.com/docker/distribution v2.8.2+incompatible - github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible // master (v25.0.0-dev) + github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible // master (v25.0.0-dev) github.com/docker/go-connections v0.4.0 github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c github.com/docker/go-metrics v0.0.1 diff --git a/go.sum b/go.sum index bcd70a8043..ccbd619349 100644 --- a/go.sum +++ b/go.sum @@ -111,8 +111,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible h1:3OTkzTHbQj93/CJInJrkpgiKz+8THR9Y9lp/i5Jb/JE= -github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible h1:XccikgvtGCEZE9ZQoaEApdx9ZvruGYakfi2tw4d/vUg= +github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= diff --git a/vendor/github.com/docker/docker/api/swagger.yaml b/vendor/github.com/docker/docker/api/swagger.yaml index f761a30708..0ad0b1c076 100644 --- a/vendor/github.com/docker/docker/api/swagger.yaml +++ b/vendor/github.com/docker/docker/api/swagger.yaml @@ -804,6 +804,12 @@ definitions: 1000000 (1 ms). 0 means inherit. type: "integer" format: "int64" + StartInterval: + description: | + The time to wait between checks in nanoseconds during the start period. + It should be 0 or at least 1000000 (1 ms). 0 means inherit. + type: "integer" + format: "int64" Health: description: | @@ -5161,42 +5167,8 @@ definitions: ServerVersion: description: | Version string of the daemon. - - > **Note**: the [standalone Swarm API](https://docs.docker.com/swarm/swarm-api/) - > returns the Swarm version instead of the daemon version, for example - > `swarm/1.2.8`. - type: "string" - example: "17.06.0-ce" - ClusterStore: - description: | - URL of the distributed storage backend. - - - The storage backend is used for multihost networking (to store - network and endpoint information) and by the node discovery mechanism. - -


- - > **Deprecated**: This field is only propagated when using standalone Swarm - > mode, and overlay networking using an external k/v store. Overlay - > networks with Swarm mode enabled use the built-in raft store, and - > this field will be empty. type: "string" - example: "consul://consul.corp.example.com:8600/some/path" - ClusterAdvertise: - description: | - The network endpoint that the Engine advertises for the purpose of - node discovery. ClusterAdvertise is a `host:port` combination on which - the daemon is reachable by other hosts. - -


- - > **Deprecated**: This field is only propagated when using standalone Swarm - > mode, and overlay networking using an external k/v store. Overlay - > networks with Swarm mode enabled use the built-in raft store, and - > this field will be empty. - type: "string" - example: "node5.corp.example.com:8000" + example: "24.0.2" Runtimes: description: | List of [OCI compliant](https://github.com/opencontainers/runtime-spec) @@ -10391,6 +10363,12 @@ paths: default if omitted. required: true type: "string" + - name: "force" + in: "query" + description: | + Force disable a plugin even if still in use. + required: false + type: "boolean" tags: ["Plugin"] /plugins/{name}/upgrade: post: diff --git a/vendor/github.com/docker/docker/api/types/container/config.go b/vendor/github.com/docker/docker/api/types/container/config.go index 077583e66c..8776dfbf36 100644 --- a/vendor/github.com/docker/docker/api/types/container/config.go +++ b/vendor/github.com/docker/docker/api/types/container/config.go @@ -44,9 +44,10 @@ type HealthConfig struct { Test []string `json:",omitempty"` // Zero means to inherit. Durations are expressed as integer nanoseconds. - Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks. - Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung. - StartPeriod time.Duration `json:",omitempty"` // The start period for the container to initialize before the retries starts to count down. + Interval time.Duration `json:",omitempty"` // Interval is the time to wait between checks. + Timeout time.Duration `json:",omitempty"` // Timeout is the time to wait before considering the check to have hung. + StartPeriod time.Duration `json:",omitempty"` // The start period for the container to initialize before the retries starts to count down. + StartInterval time.Duration `json:",omitempty"` // The interval to attempt healthchecks at during the start period // Retries is the number of consecutive failures needed to consider a container as unhealthy. // Zero means inherit. diff --git a/vendor/github.com/docker/docker/api/types/types.go b/vendor/github.com/docker/docker/api/types/types.go index 60bc14c1aa..02cc394bc8 100644 --- a/vendor/github.com/docker/docker/api/types/types.go +++ b/vendor/github.com/docker/docker/api/types/types.go @@ -307,6 +307,9 @@ type Info struct { ProductLicense string `json:",omitempty"` DefaultAddressPools []NetworkAddressPool `json:",omitempty"` + // Legacy API fields for older API versions. + legacyFields + // Warnings contains a slice of warnings that occurred while collecting // system information. These warnings are intended to be informational // messages for the user, and are not intended to be parsed / used for @@ -314,6 +317,10 @@ type Info struct { Warnings []string } +type legacyFields struct { + ExecutionDriver string `json:",omitempty"` // Deprecated: deprecated since API v1.25, but returned for older versions. +} + // KeyValue holds a key/value pair type KeyValue struct { Key, Value string diff --git a/vendor/github.com/docker/docker/client/container_create.go b/vendor/github.com/docker/docker/client/container_create.go index 193a2bb562..14a2127d88 100644 --- a/vendor/github.com/docker/docker/client/container_create.go +++ b/vendor/github.com/docker/docker/client/container_create.go @@ -29,6 +29,9 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config if err := cli.NewVersionError("1.41", "specify container image platform"); platform != nil && err != nil { return response, err } + if err := cli.NewVersionError("1.44", "specify health-check start interval"); config != nil && config.Healthcheck != nil && config.Healthcheck.StartInterval != 0 && err != nil { + return response, err + } if hostConfig != nil { if versions.LessThan(cli.ClientVersion(), "1.25") { diff --git a/vendor/github.com/docker/docker/libnetwork/bitmap/sequence.go b/vendor/github.com/docker/docker/libnetwork/bitmap/sequence.go index 9dc11384e9..2644c5d354 100644 --- a/vendor/github.com/docker/docker/libnetwork/bitmap/sequence.go +++ b/vendor/github.com/docker/docker/libnetwork/bitmap/sequence.go @@ -47,7 +47,7 @@ type Bitmap struct { noCopy noCopy } -// NewHandle returns a new Bitmap n bits long. +// NewHandle returns a new Bitmap of ordinals in the interval [0, n). func New(n uint64) *Bitmap { return &Bitmap{ bits: n, @@ -176,7 +176,7 @@ func (s *sequence) fromByteArray(data []byte) error { return nil } -// SetAnyInRange sets the first unset bit in the range [start, end) and returns +// SetAnyInRange sets the first unset bit in the range [start, end] and returns // the ordinal of the set bit. // // When serial=true, the bitmap is scanned starting from the ordinal following diff --git a/vendor/github.com/docker/docker/libnetwork/bitseq/sequence.go b/vendor/github.com/docker/docker/libnetwork/bitseq/sequence.go deleted file mode 100644 index b78dae0492..0000000000 --- a/vendor/github.com/docker/docker/libnetwork/bitseq/sequence.go +++ /dev/null @@ -1,213 +0,0 @@ -// Package bitseq provides a structure and utilities for representing a long -// bitmask which is persisted in a datastore. It is backed by [bitmap.Bitmap] -// which operates directly on the encoded representation, without uncompressing. -package bitseq - -import ( - "encoding/json" - "fmt" - "sync" - - "github.com/docker/docker/libnetwork/bitmap" - "github.com/docker/docker/libnetwork/datastore" - "github.com/docker/docker/libnetwork/types" -) - -var ( - // ErrNoBitAvailable is returned when no more bits are available to set - ErrNoBitAvailable = bitmap.ErrNoBitAvailable - // ErrBitAllocated is returned when the specific bit requested is already set - ErrBitAllocated = bitmap.ErrBitAllocated -) - -// Handle contains the sequence representing the bitmask and its identifier -type Handle struct { - app string - id string - dbIndex uint64 - dbExists bool - store datastore.DataStore - bm *bitmap.Bitmap - mu sync.Mutex -} - -// NewHandle returns a thread-safe instance of the bitmask handler -func NewHandle(app string, ds datastore.DataStore, id string, numElements uint64) (*Handle, error) { - h := &Handle{ - bm: bitmap.New(numElements), - app: app, - id: id, - store: ds, - } - - if h.store == nil { - return h, nil - } - - // Get the initial status from the ds if present. - if err := h.store.GetObject(datastore.Key(h.Key()...), h); err != nil && err != datastore.ErrKeyNotFound { - return nil, err - } - - // If the handle is not in store, write it. - if !h.Exists() { - if err := h.writeToStore(); err != nil { - return nil, fmt.Errorf("failed to write bitsequence to store: %v", err) - } - } - - return h, nil -} - -func (h *Handle) getCopy() *Handle { - return &Handle{ - bm: bitmap.Copy(h.bm), - app: h.app, - id: h.id, - dbIndex: h.dbIndex, - dbExists: h.dbExists, - store: h.store, - } -} - -// SetAnyInRange atomically sets the first unset bit in the specified range in the sequence and returns the corresponding ordinal -func (h *Handle) SetAnyInRange(start, end uint64, serial bool) (uint64, error) { - return h.apply(func(b *bitmap.Bitmap) (uint64, error) { return b.SetAnyInRange(start, end, serial) }) -} - -// SetAny atomically sets the first unset bit in the sequence and returns the corresponding ordinal -func (h *Handle) SetAny(serial bool) (uint64, error) { - return h.apply(func(b *bitmap.Bitmap) (uint64, error) { return b.SetAny(serial) }) -} - -// Set atomically sets the corresponding bit in the sequence -func (h *Handle) Set(ordinal uint64) error { - _, err := h.apply(func(b *bitmap.Bitmap) (uint64, error) { return 0, b.Set(ordinal) }) - return err -} - -// Unset atomically unsets the corresponding bit in the sequence -func (h *Handle) Unset(ordinal uint64) error { - _, err := h.apply(func(b *bitmap.Bitmap) (uint64, error) { return 0, b.Unset(ordinal) }) - return err -} - -// IsSet atomically checks if the ordinal bit is set. In case ordinal -// is outside of the bit sequence limits, false is returned. -func (h *Handle) IsSet(ordinal uint64) bool { - h.mu.Lock() - defer h.mu.Unlock() - return h.bm.IsSet(ordinal) -} - -// set/reset the bit -func (h *Handle) apply(op func(*bitmap.Bitmap) (uint64, error)) (uint64, error) { - for { - var store datastore.DataStore - h.mu.Lock() - store = h.store - if store != nil { - h.mu.Unlock() // The lock is acquired in the GetObject - if err := store.GetObject(datastore.Key(h.Key()...), h); err != nil && err != datastore.ErrKeyNotFound { - return 0, err - } - h.mu.Lock() // Acquire the lock back - } - - // Create a private copy of h and work on it - nh := h.getCopy() - - ret, err := op(nh.bm) - if err != nil { - h.mu.Unlock() - return ret, err - } - - if h.store != nil { - h.mu.Unlock() - // Attempt to write private copy to store - if err := nh.writeToStore(); err != nil { - if _, ok := err.(types.RetryError); !ok { - return ret, fmt.Errorf("internal failure while setting the bit: %v", err) - } - // Retry - continue - } - h.mu.Lock() - } - - // Previous atomic push was successful. Save private copy to local copy - h.bm = nh.bm - h.dbExists = nh.dbExists - h.dbIndex = nh.dbIndex - h.mu.Unlock() - return ret, nil - } -} - -// Destroy removes from the datastore the data belonging to this handle -func (h *Handle) Destroy() error { - for { - if err := h.deleteFromStore(); err != nil { - if _, ok := err.(types.RetryError); !ok { - return fmt.Errorf("internal failure while destroying the sequence: %v", err) - } - // Fetch latest - if err := h.store.GetObject(datastore.Key(h.Key()...), h); err != nil { - if err == datastore.ErrKeyNotFound { // already removed - return nil - } - return fmt.Errorf("failed to fetch from store when destroying the sequence: %v", err) - } - continue - } - return nil - } -} - -// Bits returns the length of the bit sequence -func (h *Handle) Bits() uint64 { - h.mu.Lock() - defer h.mu.Unlock() - return h.bm.Bits() -} - -// Unselected returns the number of bits which are not selected -func (h *Handle) Unselected() uint64 { - h.mu.Lock() - defer h.mu.Unlock() - return h.bm.Unselected() -} - -func (h *Handle) String() string { - h.mu.Lock() - defer h.mu.Unlock() - return fmt.Sprintf("App: %s, ID: %s, DBIndex: 0x%x, %s", - h.app, h.id, h.dbIndex, h.bm) -} - -type jsonMessage struct { - ID string `json:"id"` - Sequence *bitmap.Bitmap `json:"sequence"` -} - -// MarshalJSON encodes h into a JSON message. -func (h *Handle) MarshalJSON() ([]byte, error) { - h.mu.Lock() - defer h.mu.Unlock() - m := jsonMessage{ID: h.id, Sequence: h.bm} - return json.Marshal(m) -} - -// UnmarshalJSON decodes a JSON message into h. -func (h *Handle) UnmarshalJSON(data []byte) error { - var m jsonMessage - if err := json.Unmarshal(data, &m); err != nil { - return err - } - - h.mu.Lock() - defer h.mu.Unlock() - h.id, h.bm = m.ID, m.Sequence - return nil -} diff --git a/vendor/github.com/docker/docker/libnetwork/bitseq/store.go b/vendor/github.com/docker/docker/libnetwork/bitseq/store.go deleted file mode 100644 index edcee5e5be..0000000000 --- a/vendor/github.com/docker/docker/libnetwork/bitseq/store.go +++ /dev/null @@ -1,128 +0,0 @@ -package bitseq - -import ( - "encoding/json" - - "github.com/docker/docker/libnetwork/bitmap" - "github.com/docker/docker/libnetwork/datastore" - "github.com/docker/docker/libnetwork/types" -) - -// Key provides the Key to be used in KV Store -func (h *Handle) Key() []string { - h.mu.Lock() - defer h.mu.Unlock() - return []string{h.app, h.id} -} - -// KeyPrefix returns the immediate parent key that can be used for tree walk -func (h *Handle) KeyPrefix() []string { - h.mu.Lock() - defer h.mu.Unlock() - return []string{h.app} -} - -// Value marshals the data to be stored in the KV store -func (h *Handle) Value() []byte { - b, err := json.Marshal(h) - if err != nil { - return nil - } - return b -} - -// SetValue unmarshals the data from the KV store -func (h *Handle) SetValue(value []byte) error { - return json.Unmarshal(value, h) -} - -// Index returns the latest DB Index as seen by this object -func (h *Handle) Index() uint64 { - h.mu.Lock() - defer h.mu.Unlock() - return h.dbIndex -} - -// SetIndex method allows the datastore to store the latest DB Index into this object -func (h *Handle) SetIndex(index uint64) { - h.mu.Lock() - h.dbIndex = index - h.dbExists = true - h.mu.Unlock() -} - -// Exists method is true if this object has been stored in the DB. -func (h *Handle) Exists() bool { - h.mu.Lock() - defer h.mu.Unlock() - return h.dbExists -} - -// New method returns a handle based on the receiver handle -func (h *Handle) New() datastore.KVObject { - h.mu.Lock() - defer h.mu.Unlock() - - return &Handle{ - app: h.app, - store: h.store, - } -} - -// CopyTo deep copies the handle into the passed destination object -func (h *Handle) CopyTo(o datastore.KVObject) error { - h.mu.Lock() - defer h.mu.Unlock() - - dstH := o.(*Handle) - if h == dstH { - return nil - } - dstH.mu.Lock() - defer dstH.mu.Unlock() - dstH.bm = bitmap.Copy(h.bm) - dstH.app = h.app - dstH.id = h.id - dstH.dbIndex = h.dbIndex - dstH.dbExists = h.dbExists - dstH.store = h.store - - return nil -} - -// Skip provides a way for a KV Object to avoid persisting it in the KV Store -func (h *Handle) Skip() bool { - return false -} - -// DataScope method returns the storage scope of the datastore -func (h *Handle) DataScope() string { - h.mu.Lock() - defer h.mu.Unlock() - - return h.store.Scope() -} - -func (h *Handle) writeToStore() error { - h.mu.Lock() - store := h.store - h.mu.Unlock() - if store == nil { - return nil - } - err := store.PutObjectAtomic(h) - if err == datastore.ErrKeyModified { - return types.RetryErrorf("failed to perform atomic write (%v). Retry might fix the error", err) - } - return err -} - -func (h *Handle) deleteFromStore() error { - h.mu.Lock() - store := h.store - h.mu.Unlock() - if store == nil { - return nil - } - return store.DeleteObjectAtomic(h) -} diff --git a/vendor/github.com/docker/docker/libnetwork/datastore/cache.go b/vendor/github.com/docker/docker/libnetwork/datastore/cache.go index f001fc8138..61bc67e8ac 100644 --- a/vendor/github.com/docker/docker/libnetwork/datastore/cache.go +++ b/vendor/github.com/docker/docker/libnetwork/datastore/cache.go @@ -138,7 +138,7 @@ func (c *cache) del(kvObject KVObject, atomic bool) error { return nil } -func (c *cache) get(key string, kvObject KVObject) error { +func (c *cache) get(kvObject KVObject) error { kmap, err := c.kmap(kvObject) if err != nil { return err diff --git a/vendor/github.com/docker/docker/libnetwork/datastore/datastore.go b/vendor/github.com/docker/docker/libnetwork/datastore/datastore.go index b7963f04d6..f1456616b0 100644 --- a/vendor/github.com/docker/docker/libnetwork/datastore/datastore.go +++ b/vendor/github.com/docker/docker/libnetwork/datastore/datastore.go @@ -2,7 +2,6 @@ package datastore import ( "fmt" - "log" "reflect" "strings" "sync" @@ -17,24 +16,10 @@ import ( type DataStore interface { // GetObject gets data from datastore and unmarshals to the specified object GetObject(key string, o KVObject) error - // PutObject adds a new Record based on an object into the datastore - PutObject(kvObject KVObject) error // PutObjectAtomic provides an atomic add and update operation for a Record PutObjectAtomic(kvObject KVObject) error - // DeleteObject deletes a record - DeleteObject(kvObject KVObject) error // DeleteObjectAtomic performs an atomic delete operation DeleteObjectAtomic(kvObject KVObject) error - // DeleteTree deletes a record - DeleteTree(kvObject KVObject) error - // Watchable returns whether the store is watchable or not - Watchable() bool - // Watch for changes on a KVObject - Watch(kvObject KVObject, stopCh <-chan struct{}) (<-chan KVObject, error) - // RestartWatch retriggers stopped Watches - RestartWatch() - // Active returns if the store is active - Active() bool // List returns of a list of KVObjects belonging to the parent // key. The caller must pass a KVObject of the same type as // the objects that need to be listed @@ -56,13 +41,10 @@ var ( ) type datastore struct { - scope string - store store.Store - cache *cache - watchCh chan struct{} - active bool - sequential bool - sync.Mutex + mu sync.Mutex + scope string + store store.Store + cache *cache } // KVObject is Key/Value interface used by objects to be part of the DataStore @@ -210,7 +192,7 @@ func newClient(kv string, addr string, config *store.Config) (DataStore, error) return nil, err } - ds := &datastore{scope: LocalScope, store: s, active: true, watchCh: make(chan struct{}), sequential: true} + ds := &datastore{scope: LocalScope, store: s} ds.cache = newCache(ds) return ds, nil @@ -261,91 +243,6 @@ func (ds *datastore) Scope() string { return ds.scope } -func (ds *datastore) Active() bool { - return ds.active -} - -func (ds *datastore) Watchable() bool { - return ds.scope != LocalScope -} - -func (ds *datastore) Watch(kvObject KVObject, stopCh <-chan struct{}) (<-chan KVObject, error) { - sCh := make(chan struct{}) - - ctor, ok := kvObject.(KVConstructor) - if !ok { - return nil, fmt.Errorf("error watching object type %T, object does not implement KVConstructor interface", kvObject) - } - - kvpCh, err := ds.store.Watch(Key(kvObject.Key()...), sCh) - if err != nil { - return nil, err - } - - kvoCh := make(chan KVObject) - - go func() { - retry_watch: - var err error - - // Make sure to get a new instance of watch channel - ds.Lock() - watchCh := ds.watchCh - ds.Unlock() - - loop: - for { - select { - case <-stopCh: - close(sCh) - return - case kvPair := <-kvpCh: - // If the backend KV store gets reset libkv's go routine - // for the watch can exit resulting in a nil value in - // channel. - if kvPair == nil { - ds.Lock() - ds.active = false - ds.Unlock() - break loop - } - - dstO := ctor.New() - - if err = dstO.SetValue(kvPair.Value); err != nil { - log.Printf("Could not unmarshal kvpair value = %s", string(kvPair.Value)) - break - } - - dstO.SetIndex(kvPair.LastIndex) - kvoCh <- dstO - } - } - - // Wait on watch channel for a re-trigger when datastore becomes active - <-watchCh - - kvpCh, err = ds.store.Watch(Key(kvObject.Key()...), sCh) - if err != nil { - log.Printf("Could not watch the key %s in store: %v", Key(kvObject.Key()...), err) - } - - goto retry_watch - }() - - return kvoCh, nil -} - -func (ds *datastore) RestartWatch() { - ds.Lock() - defer ds.Unlock() - - ds.active = true - watchCh := ds.watchCh - ds.watchCh = make(chan struct{}) - close(watchCh) -} - func (ds *datastore) KVStore() store.Store { return ds.store } @@ -357,10 +254,8 @@ func (ds *datastore) PutObjectAtomic(kvObject KVObject) error { pair *store.KVPair err error ) - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } + ds.mu.Lock() + defer ds.mu.Unlock() if kvObject == nil { return types.BadRequestErrorf("invalid KV Object : nil") @@ -382,7 +277,7 @@ func (ds *datastore) PutObjectAtomic(kvObject KVObject) error { previous = nil } - _, pair, err = ds.store.AtomicPut(Key(kvObject.Key()...), kvObjValue, previous, nil) + pair, err = ds.store.AtomicPut(Key(kvObject.Key()...), kvObjValue, previous) if err != nil { if err == store.ErrKeyExists { return ErrKeyModified @@ -402,53 +297,13 @@ add_cache: return nil } -// PutObject adds a new Record based on an object into the datastore -func (ds *datastore) PutObject(kvObject KVObject) error { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } - - if kvObject == nil { - return types.BadRequestErrorf("invalid KV Object : nil") - } - - if kvObject.Skip() { - goto add_cache - } - - if err := ds.putObjectWithKey(kvObject, kvObject.Key()...); err != nil { - return err - } - -add_cache: - if ds.cache != nil { - // If persistent store is skipped, sequencing needs to - // happen in cache. - return ds.cache.add(kvObject, kvObject.Skip()) - } - - return nil -} - -func (ds *datastore) putObjectWithKey(kvObject KVObject, key ...string) error { - kvObjValue := kvObject.Value() - - if kvObjValue == nil { - return types.BadRequestErrorf("invalid KV Object with a nil Value for key %s", Key(kvObject.Key()...)) - } - return ds.store.Put(Key(key...), kvObjValue, nil) -} - // GetObject returns a record matching the key func (ds *datastore) GetObject(key string, o KVObject) error { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } + ds.mu.Lock() + defer ds.mu.Unlock() if ds.cache != nil { - return ds.cache.get(key, o) + return ds.cache.get(o) } kvPair, err := ds.store.Get(key) @@ -474,14 +329,12 @@ func (ds *datastore) ensureParent(parent string) error { if exists { return nil } - return ds.store.Put(parent, []byte{}, &store.WriteOptions{IsDir: true}) + return ds.store.Put(parent, []byte{}) } func (ds *datastore) List(key string, kvObject KVObject) ([]KVObject, error) { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } + ds.mu.Lock() + defer ds.mu.Unlock() if ds.cache != nil { return ds.cache.list(kvObject) @@ -535,10 +388,8 @@ func (ds *datastore) iterateKVPairsFromStore(key string, kvObject KVObject, call } func (ds *datastore) Map(key string, kvObject KVObject) (map[string]KVObject, error) { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } + ds.mu.Lock() + defer ds.mu.Unlock() kvol := make(map[string]KVObject) cb := func(key string, val KVObject) { @@ -552,33 +403,10 @@ func (ds *datastore) Map(key string, kvObject KVObject) (map[string]KVObject, er return kvol, nil } -// DeleteObject unconditionally deletes a record from the store -func (ds *datastore) DeleteObject(kvObject KVObject) error { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } - - // cleanup the cache first - if ds.cache != nil { - // If persistent store is skipped, sequencing needs to - // happen in cache. - ds.cache.del(kvObject, kvObject.Skip()) - } - - if kvObject.Skip() { - return nil - } - - return ds.store.Delete(Key(kvObject.Key()...)) -} - // DeleteObjectAtomic performs atomic delete on a record func (ds *datastore) DeleteObjectAtomic(kvObject KVObject) error { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } + ds.mu.Lock() + defer ds.mu.Unlock() if kvObject == nil { return types.BadRequestErrorf("invalid KV Object : nil") @@ -590,7 +418,7 @@ func (ds *datastore) DeleteObjectAtomic(kvObject KVObject) error { goto del_cache } - if _, err := ds.store.AtomicDelete(Key(kvObject.Key()...), previous); err != nil { + if err := ds.store.AtomicDelete(Key(kvObject.Key()...), previous); err != nil { if err == store.ErrKeyExists { return ErrKeyModified } @@ -607,24 +435,3 @@ del_cache: return nil } - -// DeleteTree unconditionally deletes a record from the store -func (ds *datastore) DeleteTree(kvObject KVObject) error { - if ds.sequential { - ds.Lock() - defer ds.Unlock() - } - - // cleanup the cache first - if ds.cache != nil { - // If persistent store is skipped, sequencing needs to - // happen in cache. - ds.cache.del(kvObject, kvObject.Skip()) - } - - if kvObject.Skip() { - return nil - } - - return ds.store.DeleteTree(Key(kvObject.KeyPrefix()...)) -} diff --git a/vendor/github.com/docker/docker/libnetwork/datastore/mock_store.go b/vendor/github.com/docker/docker/libnetwork/datastore/mock_store.go index d6a513815f..9e7a0bb84b 100644 --- a/vendor/github.com/docker/docker/libnetwork/datastore/mock_store.go +++ b/vendor/github.com/docker/docker/libnetwork/datastore/mock_store.go @@ -38,7 +38,7 @@ func (s *MockStore) Get(key string) (*store.KVPair, error) { } // Put a value at "key" -func (s *MockStore) Put(key string, value []byte, options *store.WriteOptions) error { +func (s *MockStore) Put(key string, value []byte) error { mData := s.db[key] if mData == nil { mData = &MockData{value, 0} @@ -48,12 +48,6 @@ func (s *MockStore) Put(key string, value []byte, options *store.WriteOptions) e return nil } -// Delete a value at "key" -func (s *MockStore) Delete(key string) error { - delete(s.db, key) - return nil -} - // Exists checks that the key exists inside the store func (s *MockStore) Exists(key string) (bool, error) { _, ok := s.db[key] @@ -65,59 +59,38 @@ func (s *MockStore) List(prefix string) ([]*store.KVPair, error) { return nil, ErrNotImplemented } -// DeleteTree deletes a range of values at "directory" -func (s *MockStore) DeleteTree(prefix string) error { - delete(s.db, prefix) - return nil -} - -// Watch a single key for modifications -func (s *MockStore) Watch(key string, stopCh <-chan struct{}) (<-chan *store.KVPair, error) { - return nil, ErrNotImplemented -} - -// WatchTree triggers a watch on a range of values at "directory" -func (s *MockStore) WatchTree(prefix string, stopCh <-chan struct{}) (<-chan []*store.KVPair, error) { - return nil, ErrNotImplemented -} - -// NewLock exposed -func (s *MockStore) NewLock(key string, options *store.LockOptions) (store.Locker, error) { - return nil, ErrNotImplemented -} - // AtomicPut put a value at "key" if the key has not been // modified in the meantime, throws an error if this is the case -func (s *MockStore) AtomicPut(key string, newValue []byte, previous *store.KVPair, options *store.WriteOptions) (bool, *store.KVPair, error) { +func (s *MockStore) AtomicPut(key string, newValue []byte, previous *store.KVPair) (*store.KVPair, error) { mData := s.db[key] if previous == nil { if mData != nil { - return false, nil, types.BadRequestErrorf("atomic put failed because key exists") + return nil, types.BadRequestErrorf("atomic put failed because key exists") } // Else OK. } else { if mData == nil { - return false, nil, types.BadRequestErrorf("atomic put failed because key exists") + return nil, types.BadRequestErrorf("atomic put failed because key exists") } if mData != nil && mData.Index != previous.LastIndex { - return false, nil, types.BadRequestErrorf("atomic put failed due to mismatched Index") + return nil, types.BadRequestErrorf("atomic put failed due to mismatched Index") } // Else OK. } - err := s.Put(key, newValue, nil) - if err != nil { - return false, nil, err + if err := s.Put(key, newValue); err != nil { + return nil, err } - return true, &store.KVPair{Key: key, Value: newValue, LastIndex: s.db[key].Index}, nil + return &store.KVPair{Key: key, Value: newValue, LastIndex: s.db[key].Index}, nil } // AtomicDelete deletes a value at "key" if the key has not // been modified in the meantime, throws an error if this is the case -func (s *MockStore) AtomicDelete(key string, previous *store.KVPair) (bool, error) { +func (s *MockStore) AtomicDelete(key string, previous *store.KVPair) error { mData := s.db[key] if mData != nil && mData.Index != previous.LastIndex { - return false, types.BadRequestErrorf("atomic delete failed due to mismatched Index") + return types.BadRequestErrorf("atomic delete failed due to mismatched Index") } - return true, s.Delete(key) + delete(s.db, key) + return nil } // Close closes the client connection diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/bridge/brmanager/brmanager.go b/vendor/github.com/docker/docker/libnetwork/drivers/bridge/brmanager/brmanager.go index 22922d8253..e90d6febf6 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/bridge/brmanager/brmanager.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/bridge/brmanager/brmanager.go @@ -15,11 +15,11 @@ type driver struct{} // // Deprecated: use [Register]. func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error { - return Register(dc, nil) + return Register(dc) } // Register registers a new instance of the bridge manager driver with r. -func Register(r driverapi.Registerer, _ map[string]interface{}) error { +func Register(r driverapi.Registerer) error { return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{ DataScope: datastore.LocalScope, ConnectivityScope: datastore.LocalScope, diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/host/host.go b/vendor/github.com/docker/docker/libnetwork/drivers/host/host.go index 9eb596ce14..ee9adbc4d8 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/host/host.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/host/host.go @@ -9,7 +9,7 @@ import ( "github.com/docker/docker/libnetwork/types" ) -const networkType = "host" +const NetworkType = "host" type driver struct { network string @@ -20,11 +20,11 @@ type driver struct { // // Deprecated: use [Register]. func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error { - return Register(dc, nil) + return Register(dc) } -func Register(r driverapi.Registerer, _ map[string]interface{}) error { - return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{ +func Register(r driverapi.Registerer) error { + return r.RegisterDriver(NetworkType, &driver{}, driverapi.Capability{ DataScope: datastore.LocalScope, ConnectivityScope: datastore.LocalScope, }) @@ -50,7 +50,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d defer d.Unlock() if d.network != "" { - return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", networkType) + return types.ForbiddenErrorf("only one instance of \"%s\" network is allowed", NetworkType) } d.network = id @@ -59,7 +59,7 @@ func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo d } func (d *driver) DeleteNetwork(nid string) error { - return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", networkType) + return types.ForbiddenErrorf("network of type \"%s\" cannot be deleted", NetworkType) } func (d *driver) CreateEndpoint(nid, eid string, ifInfo driverapi.InterfaceInfo, epOptions map[string]interface{}) error { @@ -93,7 +93,7 @@ func (d *driver) RevokeExternalConnectivity(nid, eid string) error { } func (d *driver) Type() string { - return networkType + return NetworkType } func (d *driver) IsBuiltIn() bool { diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/ipvlan/ivmanager/ivmanager.go b/vendor/github.com/docker/docker/libnetwork/drivers/ipvlan/ivmanager/ivmanager.go index e7e5a285d2..d3d841ecb3 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/ipvlan/ivmanager/ivmanager.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/ipvlan/ivmanager/ivmanager.go @@ -15,11 +15,11 @@ type driver struct{} // // Deprecated: use [Register]. func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error { - return Register(dc, nil) + return Register(dc) } // Register registers a new instance of the ipvlan manager driver. -func Register(r driverapi.Registerer, _ map[string]interface{}) error { +func Register(r driverapi.Registerer) error { return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{ DataScope: datastore.LocalScope, ConnectivityScope: datastore.GlobalScope, diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/macvlan/mvmanager/mvmanager.go b/vendor/github.com/docker/docker/libnetwork/drivers/macvlan/mvmanager/mvmanager.go index ba69cd933f..b490c6769e 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/macvlan/mvmanager/mvmanager.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/macvlan/mvmanager/mvmanager.go @@ -15,11 +15,11 @@ type driver struct{} // // Deprecated: use [Register]. func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error { - return Register(dc, nil) + return Register(dc) } // Register registers a new instance of the macvlan manager driver. -func Register(r driverapi.Registerer, _ map[string]interface{}) error { +func Register(r driverapi.Registerer) error { return r.RegisterDriver(networkType, &driver{}, driverapi.Capability{ DataScope: datastore.LocalScope, ConnectivityScope: datastore.GlobalScope, diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/overlay/overlayutils/utils.go b/vendor/github.com/docker/docker/libnetwork/drivers/overlay/overlayutils/utils.go index 2d7674a535..2ce3c237dc 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/overlay/overlayutils/utils.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/overlay/overlayutils/utils.go @@ -3,6 +3,8 @@ package overlayutils import ( "fmt" + "strconv" + "strings" "sync" ) @@ -40,3 +42,23 @@ func VXLANUDPPort() uint32 { defer mutex.RUnlock() return vxlanUDPPort } + +// AppendVNIList appends the VNI values encoded as a CSV string to slice. +func AppendVNIList(vnis []uint32, csv string) ([]uint32, error) { + for { + var ( + vniStr string + found bool + ) + vniStr, csv, found = strings.Cut(csv, ",") + vni, err := strconv.Atoi(vniStr) + if err != nil { + return vnis, fmt.Errorf("invalid vxlan id value %q passed", vniStr) + } + + vnis = append(vnis, uint32(vni)) + if !found { + return vnis, nil + } + } +} diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go b/vendor/github.com/docker/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go index 41b05eb95e..256de20207 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/overlay/ovmanager/ovmanager.go @@ -5,30 +5,33 @@ import ( "fmt" "net" "strconv" - "strings" "sync" "github.com/containerd/containerd/log" + "github.com/docker/docker/libnetwork/bitmap" "github.com/docker/docker/libnetwork/datastore" "github.com/docker/docker/libnetwork/discoverapi" "github.com/docker/docker/libnetwork/driverapi" - "github.com/docker/docker/libnetwork/idm" + "github.com/docker/docker/libnetwork/drivers/overlay/overlayutils" "github.com/docker/docker/libnetwork/netlabel" "github.com/docker/docker/libnetwork/types" ) const ( - networkType = "overlay" + networkType = "overlay" + // The lowest VNI value to auto-assign. Windows does not support VXLAN IDs + // which overlap the range of 802.1Q VLAN IDs [0, 4095]. vxlanIDStart = 4096 - vxlanIDEnd = (1 << 24) - 1 + // The largest VNI value permitted by RFC 7348. + vxlanIDEnd = (1 << 24) - 1 ) type networkTable map[string]*network type driver struct { + mu sync.Mutex networks networkTable - vxlanIdm *idm.Idm - sync.Mutex + vxlanIdm *bitmap.Bitmap } type subnet struct { @@ -41,34 +44,30 @@ type network struct { id string driver *driver subnets []*subnet - sync.Mutex } // Init registers a new instance of the overlay driver. // // Deprecated: use [Register]. func Init(dc driverapi.DriverCallback, _ map[string]interface{}) error { - return Register(dc, nil) + return Register(dc) } // Register registers a new instance of the overlay driver. -func Register(r driverapi.Registerer, _ map[string]interface{}) error { - var err error - d := &driver{ - networks: networkTable{}, - } - - d.vxlanIdm, err = idm.New(nil, "vxlan-id", 0, vxlanIDEnd) - if err != nil { - return fmt.Errorf("failed to initialize vxlan id manager: %v", err) - } - - return r.RegisterDriver(networkType, d, driverapi.Capability{ +func Register(r driverapi.Registerer) error { + return r.RegisterDriver(networkType, newDriver(), driverapi.Capability{ DataScope: datastore.GlobalScope, ConnectivityScope: datastore.GlobalScope, }) } +func newDriver() *driver { + return &driver{ + networks: networkTable{}, + vxlanIdm: bitmap.New(vxlanIDEnd + 1), // The full range of valid vxlan IDs: [0, 2^24). + } +} + func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, ipV6Data []driverapi.IPAMData) (map[string]string, error) { if id == "" { return nil, fmt.Errorf("invalid network id for overlay network") @@ -89,33 +88,40 @@ func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, for key, val := range option { if key == netlabel.OverlayVxlanIDList { log.G(context.TODO()).Debugf("overlay network option: %s", val) - valStrList := strings.Split(val, ",") - for _, idStr := range valStrList { - vni, err := strconv.Atoi(idStr) - if err != nil { - return nil, fmt.Errorf("invalid vxlan id value %q passed", idStr) - } - - vxlanIDList = append(vxlanIDList, uint32(vni)) + var err error + vxlanIDList, err = overlayutils.AppendVNIList(vxlanIDList, val) + if err != nil { + return nil, err } } else { opts[key] = val } } + d.mu.Lock() + defer d.mu.Unlock() for i, ipd := range ipV4Data { s := &subnet{ subnetIP: ipd.Pool, gwIP: ipd.Gateway, } - if len(vxlanIDList) > i { + if len(vxlanIDList) > i { // The VNI for this subnet was specified in the network options. s.vni = vxlanIDList[i] - } - - if err := n.obtainVxlanID(s); err != nil { - n.releaseVxlanID() - return nil, fmt.Errorf("could not obtain vxlan id for pool %s: %v", s.subnetIP, err) + err := d.vxlanIdm.Set(uint64(s.vni)) // Mark VNI as in-use. + if err != nil { + // The VNI is already in use by another subnet/network. + n.releaseVxlanID() + return nil, fmt.Errorf("could not assign vxlan id %v to pool %s: %v", s.vni, s.subnetIP, err) + } + } else { + // Allocate an available VNI for the subnet, outside the range of 802.1Q VLAN IDs. + vni, err := d.vxlanIdm.SetAnyInRange(vxlanIDStart, vxlanIDEnd, true) + if err != nil { + n.releaseVxlanID() + return nil, fmt.Errorf("could not obtain vxlan id for pool %s: %v", s.subnetIP, err) + } + s.vni = uint32(vni) } n.subnets = append(n.subnets, s) @@ -127,8 +133,6 @@ func (d *driver) NetworkAllocate(id string, option map[string]string, ipV4Data, } opts[netlabel.OverlayVxlanIDList] = val - d.Lock() - defer d.Unlock() if _, ok := d.networks[id]; ok { n.releaseVxlanID() return nil, fmt.Errorf("network %s already exists", id) @@ -143,8 +147,8 @@ func (d *driver) NetworkFree(id string) error { return fmt.Errorf("invalid network id passed while freeing overlay network") } - d.Lock() - defer d.Unlock() + d.mu.Lock() + defer d.mu.Unlock() n, ok := d.networks[id] if !ok { @@ -159,43 +163,11 @@ func (d *driver) NetworkFree(id string) error { return nil } -func (n *network) obtainVxlanID(s *subnet) error { - var ( - err error - vni uint64 - ) - - n.Lock() - vni = uint64(s.vni) - n.Unlock() - - if vni == 0 { - vni, err = n.driver.vxlanIdm.GetIDInRange(vxlanIDStart, vxlanIDEnd, true) - if err != nil { - return err - } - - n.Lock() - s.vni = uint32(vni) - n.Unlock() - return nil - } - - return n.driver.vxlanIdm.GetSpecificID(vni) -} - func (n *network) releaseVxlanID() { - n.Lock() - vnis := make([]uint32, 0, len(n.subnets)) for _, s := range n.subnets { - vnis = append(vnis, s.vni) + n.driver.vxlanIdm.Unset(uint64(s.vni)) s.vni = 0 } - n.Unlock() - - for _, vni := range vnis { - n.driver.vxlanIdm.Release(uint64(vni)) - } } func (d *driver) CreateNetwork(id string, option map[string]interface{}, nInfo driverapi.NetworkInfo, ipV4Data, ipV6Data []driverapi.IPAMData) error { diff --git a/vendor/github.com/docker/docker/libnetwork/drivers/remote/driver.go b/vendor/github.com/docker/docker/libnetwork/drivers/remote/driver.go index 19e641a13c..5147c0ee17 100644 --- a/vendor/github.com/docker/docker/libnetwork/drivers/remote/driver.go +++ b/vendor/github.com/docker/docker/libnetwork/drivers/remote/driver.go @@ -246,11 +246,11 @@ func errorWithRollback(msg string, err error) error { } func (d *driver) DeleteEndpoint(nid, eid string) error { - delete := &api.DeleteEndpointRequest{ + deleteRequest := &api.DeleteEndpointRequest{ NetworkID: nid, EndpointID: eid, } - return d.call("DeleteEndpoint", delete, &api.DeleteEndpointResponse{}) + return d.call("DeleteEndpoint", deleteRequest, &api.DeleteEndpointResponse{}) } func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) { diff --git a/vendor/github.com/docker/docker/libnetwork/idm/idm.go b/vendor/github.com/docker/docker/libnetwork/idm/idm.go deleted file mode 100644 index 49d16037a9..0000000000 --- a/vendor/github.com/docker/docker/libnetwork/idm/idm.go +++ /dev/null @@ -1,76 +0,0 @@ -// Package idm manages reservation/release of numerical ids from a configured set of contiguous ids -package idm - -import ( - "errors" - "fmt" - - "github.com/docker/docker/libnetwork/bitseq" - "github.com/docker/docker/libnetwork/datastore" -) - -// Idm manages the reservation/release of numerical ids from a contiguous set -type Idm struct { - start uint64 - end uint64 - handle *bitseq.Handle -} - -// New returns an instance of id manager for a [start,end] set of numerical ids -func New(ds datastore.DataStore, id string, start, end uint64) (*Idm, error) { - if id == "" { - return nil, errors.New("Invalid id") - } - if end <= start { - return nil, fmt.Errorf("Invalid set range: [%d, %d]", start, end) - } - - h, err := bitseq.NewHandle("idm", ds, id, 1+end-start) - if err != nil { - return nil, fmt.Errorf("failed to initialize bit sequence handler: %s", err.Error()) - } - - return &Idm{start: start, end: end, handle: h}, nil -} - -// GetID returns the first available id in the set -func (i *Idm) GetID(serial bool) (uint64, error) { - if i.handle == nil { - return 0, errors.New("ID set is not initialized") - } - ordinal, err := i.handle.SetAny(serial) - return i.start + ordinal, err -} - -// GetSpecificID tries to reserve the specified id -func (i *Idm) GetSpecificID(id uint64) error { - if i.handle == nil { - return errors.New("ID set is not initialized") - } - - if id < i.start || id > i.end { - return errors.New("Requested id does not belong to the set") - } - - return i.handle.Set(id - i.start) -} - -// GetIDInRange returns the first available id in the set within a [start,end] range -func (i *Idm) GetIDInRange(start, end uint64, serial bool) (uint64, error) { - if i.handle == nil { - return 0, errors.New("ID set is not initialized") - } - - if start < i.start || end > i.end { - return 0, errors.New("Requested range does not belong to the set") - } - - ordinal, err := i.handle.SetAnyInRange(start-i.start, end-i.start, serial) - - return i.start + ordinal, err -} - -// Release releases the specified id -func (i *Idm) Release(id uint64) { - i.handle.Unset(id - i.start) -} diff --git a/vendor/github.com/docker/docker/libnetwork/internal/kvstore/kvstore.go b/vendor/github.com/docker/docker/libnetwork/internal/kvstore/kvstore.go index bc7a24f462..e8b61046ad 100644 --- a/vendor/github.com/docker/docker/libnetwork/internal/kvstore/kvstore.go +++ b/vendor/github.com/docker/docker/libnetwork/internal/kvstore/kvstore.go @@ -1,7 +1,6 @@ package kvstore import ( - "crypto/tls" "errors" "time" ) @@ -15,8 +14,6 @@ const BOLTDB Backend = "boltdb" var ( // ErrBackendNotSupported is thrown when the backend k/v store is not supported by libkv ErrBackendNotSupported = errors.New("Backend storage not supported yet, please choose one of") - // ErrCallNotSupported is thrown when a method is not implemented/supported by the current backend - ErrCallNotSupported = errors.New("The current call is not supported with this backend") // ErrKeyModified is thrown during an atomic operation if the index does not match the one in the store ErrKeyModified = errors.New("Unable to complete atomic operation, key modified") // ErrKeyNotFound is thrown when the key is not found in the store during a Get operation @@ -29,21 +26,9 @@ var ( // Config contains the options for a storage client type Config struct { - ClientTLS *ClientTLSConfig - TLS *tls.Config ConnectionTimeout time.Duration Bucket string PersistConnection bool - Username string - Password string -} - -// ClientTLSConfig contains data for a Client TLS configuration in the form -// the etcd client wants it. Eventually we'll adapt it for ZK and Consul. -type ClientTLSConfig struct { - CertFile string - KeyFile string - CACertFile string } // Store represents the backend K/V storage @@ -52,41 +37,23 @@ type ClientTLSConfig struct { // backend for libkv type Store interface { // Put a value at the specified key - Put(key string, value []byte, options *WriteOptions) error + Put(key string, value []byte) error // Get a value given its key Get(key string) (*KVPair, error) - // Delete the value at the specified key - Delete(key string) error - - // Verify if a Key exists in the store + // Exists verifies if a Key exists in the store. Exists(key string) (bool, error) - // Watch for changes on a key - Watch(key string, stopCh <-chan struct{}) (<-chan *KVPair, error) - - // WatchTree watches for changes on child nodes under - // a given directory - WatchTree(directory string, stopCh <-chan struct{}) (<-chan []*KVPair, error) - - // NewLock creates a lock for a given key. - // The returned Locker is not held and must be acquired - // with `.Lock`. The Value is optional. - NewLock(key string, options *LockOptions) (Locker, error) - // List the content of a given prefix List(directory string) ([]*KVPair, error) - // DeleteTree deletes a range of keys under a given directory - DeleteTree(directory string) error - - // Atomic CAS operation on a single value. + // AtomicPut performs an atomic CAS operation on a single value. // Pass previous = nil to create a new key. - AtomicPut(key string, value []byte, previous *KVPair, options *WriteOptions) (bool, *KVPair, error) + AtomicPut(key string, value []byte, previous *KVPair) (*KVPair, error) - // Atomic delete of a single value - AtomicDelete(key string, previous *KVPair) (bool, error) + // AtomicDelete performs an atomic delete of a single value. + AtomicDelete(key string, previous *KVPair) error // Close the store connection Close() @@ -98,23 +65,3 @@ type KVPair struct { Value []byte LastIndex uint64 } - -// WriteOptions contains optional request parameters -type WriteOptions struct { - IsDir bool - TTL time.Duration -} - -// LockOptions contains optional request parameters -type LockOptions struct { - Value []byte // Optional, value to associate with the lock - TTL time.Duration // Optional, expiration ttl associated with the lock - RenewLock chan struct{} // Optional, chan used to control and stop the session ttl renewal for the lock -} - -// Locker provides locking mechanism on top of the store. -// Similar to `sync.Lock` except it may return errors. -type Locker interface { - Lock(stopChan chan struct{}) (<-chan struct{}, error) - Unlock() error -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 0c908dccd3..a5c6d12f39 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -48,7 +48,7 @@ github.com/davecgh/go-spew/spew ## explicit github.com/docker/distribution/digestset github.com/docker/distribution/reference -# github.com/docker/docker v24.0.0-rc.2.0.20230630161949-75ee002347f8+incompatible +# github.com/docker/docker v24.0.0-rc.2.0.20230706181717-98d3da79ef9c+incompatible ## explicit github.com/docker/docker/api github.com/docker/docker/api/types @@ -69,7 +69,6 @@ github.com/docker/docker/api/types/volume github.com/docker/docker/client github.com/docker/docker/errdefs github.com/docker/docker/libnetwork/bitmap -github.com/docker/docker/libnetwork/bitseq github.com/docker/docker/libnetwork/datastore github.com/docker/docker/libnetwork/discoverapi github.com/docker/docker/libnetwork/driverapi @@ -82,7 +81,6 @@ github.com/docker/docker/libnetwork/drivers/overlay/ovmanager github.com/docker/docker/libnetwork/drivers/remote github.com/docker/docker/libnetwork/drivers/remote/api github.com/docker/docker/libnetwork/drvregistry -github.com/docker/docker/libnetwork/idm github.com/docker/docker/libnetwork/internal/kvstore github.com/docker/docker/libnetwork/ipam github.com/docker/docker/libnetwork/ipamapi From 74b10bbcc7212d064fb03794cf2c0d730cb299bc Mon Sep 17 00:00:00 2001 From: Brian Goff Date: Thu, 6 Jul 2023 19:31:58 +0000 Subject: [PATCH 2/2] Add support for health start interval This is a new option in the docker API to set the interval health-checks are run during the start period. Signed-off-by: Brian Goff --- agent/exec/dockerapi/container.go | 12 +- agent/exec/dockerapi/container_test.go | 22 +- api/api.pb.txt | 58 +- api/types.pb.go | 862 ++++++++++-------- api/types.proto | 6 + manager/controlapi/service.go | 10 + manager/controlapi/service_test.go | 22 +- .../plugin/deepcopy/test/deepcopypb_test.go | 163 ++-- 8 files changed, 639 insertions(+), 516 deletions(-) diff --git a/agent/exec/dockerapi/container.go b/agent/exec/dockerapi/container.go index 49650c0585..7d09f6e350 100644 --- a/agent/exec/dockerapi/container.go +++ b/agent/exec/dockerapi/container.go @@ -193,12 +193,14 @@ func (c *containerConfig) healthcheck() *enginecontainer.HealthConfig { interval, _ := gogotypes.DurationFromProto(hcSpec.Interval) timeout, _ := gogotypes.DurationFromProto(hcSpec.Timeout) startPeriod, _ := gogotypes.DurationFromProto(hcSpec.StartPeriod) + startInterval, _ := gogotypes.DurationFromProto(hcSpec.StartInterval) return &enginecontainer.HealthConfig{ - Test: hcSpec.Test, - Interval: interval, - Timeout: timeout, - Retries: int(hcSpec.Retries), - StartPeriod: startPeriod, + Test: hcSpec.Test, + Interval: interval, + Timeout: timeout, + Retries: int(hcSpec.Retries), + StartPeriod: startPeriod, + StartInterval: startInterval, } } diff --git a/agent/exec/dockerapi/container_test.go b/agent/exec/dockerapi/container_test.go index 7b64a25bc0..bddd105a60 100644 --- a/agent/exec/dockerapi/container_test.go +++ b/agent/exec/dockerapi/container_test.go @@ -115,11 +115,12 @@ func TestHealthcheck(t *testing.T) { Spec: api.TaskSpec{Runtime: &api.TaskSpec_Container{ Container: &api.ContainerSpec{ Healthcheck: &api.HealthConfig{ - Test: []string{"a", "b", "c"}, - Interval: gogotypes.DurationProto(time.Second), - Timeout: gogotypes.DurationProto(time.Minute), - Retries: 10, - StartPeriod: gogotypes.DurationProto(time.Minute), + Test: []string{"a", "b", "c"}, + Interval: gogotypes.DurationProto(time.Second), + Timeout: gogotypes.DurationProto(time.Minute), + Retries: 10, + StartPeriod: gogotypes.DurationProto(time.Minute), + StartInterval: gogotypes.DurationProto(time.Minute), }, }, }}, @@ -127,11 +128,12 @@ func TestHealthcheck(t *testing.T) { } config := c.config() expected := &enginecontainer.HealthConfig{ - Test: []string{"a", "b", "c"}, - Interval: time.Second, - Timeout: time.Minute, - Retries: 10, - StartPeriod: time.Minute, + Test: []string{"a", "b", "c"}, + Interval: time.Second, + Timeout: time.Minute, + Retries: 10, + StartPeriod: time.Minute, + StartInterval: time.Minute, } if !reflect.DeepEqual(config.Healthcheck, expected) { t.Fatalf("expected %#v, got %#v", expected, config.Healthcheck) diff --git a/api/api.pb.txt b/api/api.pb.txt index 90ed599171..83259e8ede 100755 --- a/api/api.pb.txt +++ b/api/api.pb.txt @@ -2621,6 +2621,36 @@ file { } json_name: "nonrecursive" } + field { + name: "createmountpoint" + number: 3 + label: LABEL_OPTIONAL + type: TYPE_BOOL + options { + 65004: "CreateMountpoint" + } + json_name: "createmountpoint" + } + field { + name: "readonlynonrecursive" + number: 4 + label: LABEL_OPTIONAL + type: TYPE_BOOL + options { + 65004: "ReadOnlyNonRecursive" + } + json_name: "readonlynonrecursive" + } + field { + name: "readonlyforcerecursive" + number: 5 + label: LABEL_OPTIONAL + type: TYPE_BOOL + options { + 65004: "ReadOnlyForceRecursive" + } + json_name: "readonlyforcerecursive" + } enum_type { name: "Propagation" value { @@ -2735,8 +2765,8 @@ file { label: LABEL_OPTIONAL type: TYPE_UINT32 options { - 65001: 0 65003: "os.FileMode" + 65001: 0 } json_name: "mode" } @@ -2904,8 +2934,8 @@ file { type: TYPE_MESSAGE type_name: ".google.protobuf.Duration" options { - 65001: 0 65011: 1 + 65001: 0 } json_name: "delay" } @@ -3348,8 +3378,8 @@ file { } } options { - 62001: 0 62023: "PublishMode" + 62001: 0 } } } @@ -4055,8 +4085,8 @@ file { label: LABEL_OPTIONAL type: TYPE_UINT32 options { - 65001: 0 65003: "os.FileMode" + 65001: 0 } json_name: "mode" } @@ -4182,6 +4212,14 @@ file { type_name: ".google.protobuf.Duration" json_name: "startPeriod" } + field { + name: "start_interval" + number: 6 + label: LABEL_OPTIONAL + type: TYPE_MESSAGE + type_name: ".google.protobuf.Duration" + json_name: "startInterval" + } } message_type { name: "MaybeEncryptedRecord" @@ -5052,8 +5090,8 @@ file { } } options { - 62001: 0 62023: "NodeRole" + 62001: 0 } } syntax: "proto3" @@ -9739,8 +9777,8 @@ file { type: TYPE_MESSAGE type_name: ".google.protobuf.Duration" options { - 65001: 0 65011: 1 + 65001: 0 } json_name: "period" } @@ -10958,14 +10996,14 @@ file { } } options { - 63001: 0 - 63002: 0 63017: 1 - 63018: 1 63020: 1 + 63018: 1 + 63001: 0 + 63002: 0 + 63035: 0 63026: 0 63034: 0 - 63035: 0 } } file { diff --git a/api/types.pb.go b/api/types.pb.go index d0234c866b..d53775cd6d 100644 --- a/api/types.pb.go +++ b/api/types.pb.go @@ -3609,6 +3609,10 @@ type HealthConfig struct { // which health check failures will note count towards the maximum // number of retries. StartPeriod *types.Duration `protobuf:"bytes,5,opt,name=start_period,json=startPeriod,proto3" json:"start_period,omitempty"` + // StartInterval is the time to wait between checks during the start period. + // Zero means inherit. + // Note: can't use stdduration because this field needs to be nullable. + StartInterval *types.Duration `protobuf:"bytes,6,opt,name=start_interval,json=startInterval,proto3" json:"start_interval,omitempty"` } func (m *HealthConfig) Reset() { *m = HealthConfig{} } @@ -5011,407 +5015,408 @@ func init() { } var fileDescriptor_0b5eafd0404ded3d = []byte{ - // 6395 bytes of a gzipped FileDescriptorProto + // 6412 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x7b, 0x4d, 0x6c, 0x24, 0x49, - 0x56, 0xb0, 0xeb, 0xd7, 0x55, 0xaf, 0xca, 0x76, 0x76, 0xd8, 0xe3, 0x71, 0xd7, 0xf4, 0xd8, 0x9e, - 0x9c, 0xe9, 0x9d, 0x9e, 0xde, 0x59, 0x77, 0x4f, 0xcf, 0xec, 0x7c, 0x3d, 0x33, 0x3b, 0x3b, 0x5d, - 0x7f, 0x6e, 0xd7, 0xb6, 0x5d, 0x55, 0x8a, 0x2a, 0x77, 0xef, 0xac, 0xf4, 0x6d, 0x92, 0xce, 0x0c, - 0x97, 0x73, 0x9c, 0x95, 0x59, 0x64, 0x66, 0xd9, 0x6d, 0x16, 0xc4, 0x9c, 0x00, 0x59, 0x42, 0x80, - 0x90, 0x96, 0x45, 0x60, 0x81, 0x60, 0x39, 0x71, 0xe0, 0xc0, 0x81, 0x1f, 0x71, 0x18, 0x24, 0x84, - 0x96, 0x13, 0xbb, 0x2c, 0x82, 0xd5, 0x82, 0x0c, 0xeb, 0x95, 0x10, 0x17, 0x04, 0x17, 0x04, 0x07, - 0x0e, 0x28, 0xfe, 0x32, 0xb3, 0xaa, 0xcb, 0x76, 0xf7, 0xce, 0x72, 0xb1, 0x33, 0xde, 0x5f, 0x44, - 0xbc, 0x88, 0x78, 0xf1, 0xde, 0x8b, 0x57, 0x70, 0xb3, 0x67, 0x05, 0x7b, 0xc3, 0x9d, 0x35, 0xc3, - 0xed, 0xdf, 0x32, 0x5d, 0x63, 0x9f, 0x78, 0xb7, 0xfc, 0x43, 0xdd, 0xeb, 0xef, 0x5b, 0xc1, 0x2d, - 0x7d, 0x60, 0xdd, 0x0a, 0x8e, 0x06, 0xc4, 0x5f, 0x1b, 0x78, 0x6e, 0xe0, 0x22, 0xc4, 0x09, 0xd6, - 0x24, 0xc1, 0xda, 0xc1, 0x1b, 0xa5, 0x95, 0x9e, 0xeb, 0xf6, 0x6c, 0x72, 0x8b, 0x51, 0xec, 0x0c, - 0x77, 0x6f, 0x05, 0x56, 0x9f, 0xf8, 0x81, 0xde, 0x1f, 0x70, 0xa6, 0xd2, 0xf2, 0x38, 0x81, 0x39, - 0xf4, 0xf4, 0xc0, 0x72, 0x9d, 0xf3, 0xf0, 0x87, 0x9e, 0x3e, 0x18, 0x10, 0x4f, 0x74, 0x5a, 0x5a, - 0xe8, 0xb9, 0x3d, 0x97, 0x7d, 0xde, 0xa2, 0x5f, 0x1c, 0xaa, 0xae, 0xc0, 0xf4, 0x43, 0xe2, 0xf9, - 0x96, 0xeb, 0xa0, 0x05, 0xc8, 0x58, 0x8e, 0x49, 0x1e, 0x2f, 0x25, 0x56, 0x13, 0x37, 0xd2, 0x98, - 0x37, 0xd4, 0xdb, 0x00, 0x0d, 0xfa, 0x51, 0x77, 0x02, 0xef, 0x08, 0x29, 0x90, 0xda, 0x27, 0x47, - 0x8c, 0x22, 0x8f, 0xe9, 0x27, 0x85, 0x1c, 0xe8, 0xf6, 0x52, 0x92, 0x43, 0x0e, 0x74, 0x5b, 0xfd, - 0x41, 0x02, 0x0a, 0x65, 0xc7, 0x71, 0x03, 0x36, 0x3a, 0x1f, 0x21, 0x48, 0x3b, 0x7a, 0x9f, 0x08, - 0x26, 0xf6, 0x8d, 0xaa, 0x90, 0xb5, 0xf5, 0x1d, 0x62, 0xfb, 0x4b, 0xc9, 0xd5, 0xd4, 0x8d, 0xc2, - 0x9d, 0xcf, 0xae, 0x3d, 0xa9, 0x92, 0xb5, 0x98, 0x90, 0xb5, 0x4d, 0x46, 0xcd, 0x06, 0x81, 0x05, - 0x2b, 0xfa, 0x22, 0x4c, 0x5b, 0x8e, 0x69, 0x19, 0xc4, 0x5f, 0x4a, 0x33, 0x29, 0xcb, 0x93, 0xa4, - 0x44, 0xa3, 0xaf, 0xa4, 0xbf, 0x75, 0xba, 0x32, 0x85, 0x25, 0x53, 0xe9, 0x1d, 0x28, 0xc4, 0xc4, - 0x4e, 0x98, 0xdb, 0x02, 0x64, 0x0e, 0x74, 0x7b, 0x48, 0xc4, 0xec, 0x78, 0xe3, 0xdd, 0xe4, 0xdd, - 0x84, 0x7a, 0x0f, 0x16, 0x9a, 0x7a, 0x9f, 0x98, 0xf7, 0x89, 0x43, 0x3c, 0xcb, 0xc0, 0xc4, 0x77, - 0x87, 0x9e, 0x41, 0xe8, 0x5c, 0xf7, 0x2d, 0xc7, 0x94, 0x73, 0xa5, 0xdf, 0x93, 0xa5, 0xa8, 0x55, - 0x78, 0xbe, 0x66, 0xf9, 0x86, 0x47, 0x02, 0xf2, 0xcc, 0x42, 0x52, 0x52, 0xc8, 0x69, 0x02, 0xe6, - 0xc6, 0xb9, 0xbf, 0x02, 0xf3, 0x54, 0xc5, 0xa6, 0xe6, 0x09, 0x88, 0xe6, 0x0f, 0x88, 0xc1, 0x84, - 0x15, 0xee, 0xdc, 0x98, 0xa4, 0xa1, 0x49, 0x33, 0xd9, 0x98, 0xc2, 0x57, 0x98, 0x18, 0x09, 0xe8, - 0x0c, 0x88, 0x81, 0x0c, 0x58, 0x34, 0xc5, 0xa0, 0xc7, 0xc4, 0x27, 0x99, 0xf8, 0x89, 0xcb, 0x78, - 0xce, 0x34, 0x37, 0xa6, 0xf0, 0x82, 0x14, 0x16, 0xef, 0xa4, 0x02, 0x90, 0x93, 0xb2, 0xd5, 0x6f, - 0x24, 0x20, 0x2f, 0x91, 0x3e, 0x7a, 0x0d, 0xf2, 0x8e, 0xee, 0xb8, 0x9a, 0x31, 0x18, 0xfa, 0x6c, - 0x42, 0xa9, 0x4a, 0xf1, 0xec, 0x74, 0x25, 0xd7, 0xd4, 0x1d, 0xb7, 0xda, 0xde, 0xf6, 0x71, 0x8e, - 0xa2, 0xab, 0x83, 0xa1, 0x8f, 0x5e, 0x82, 0x62, 0x9f, 0xf4, 0x5d, 0xef, 0x48, 0xdb, 0x39, 0x0a, - 0x88, 0x2f, 0xd4, 0x56, 0xe0, 0xb0, 0x0a, 0x05, 0xa1, 0xf7, 0x61, 0xba, 0xc7, 0x87, 0xb4, 0x94, - 0x62, 0xdb, 0xe7, 0xe5, 0x49, 0xa3, 0x1f, 0x1b, 0x35, 0x96, 0x3c, 0xea, 0xd7, 0x93, 0xb0, 0x10, - 0x42, 0xc9, 0x4f, 0x0e, 0x2d, 0x8f, 0xf4, 0x89, 0x13, 0xf8, 0xe8, 0xf3, 0x90, 0xb5, 0xad, 0xbe, - 0x15, 0xf8, 0x42, 0xe7, 0x2f, 0x4e, 0x12, 0x1b, 0x4e, 0x0a, 0x0b, 0x62, 0x54, 0x86, 0xa2, 0x47, - 0x7c, 0xe2, 0x1d, 0xf0, 0x1d, 0x2f, 0x34, 0x7a, 0x09, 0xf3, 0x08, 0x0b, 0x7a, 0x17, 0xc0, 0x3f, - 0xd4, 0x07, 0x62, 0xca, 0x29, 0x26, 0xe0, 0x85, 0x35, 0x6e, 0x17, 0xd6, 0xa4, 0x5d, 0x58, 0x6b, - 0x38, 0xc1, 0xdb, 0x6f, 0x3d, 0xa4, 0xfb, 0x07, 0xe7, 0x29, 0x39, 0xd7, 0xc6, 0x06, 0x5c, 0x11, - 0x0a, 0xa3, 0xb0, 0x81, 0xe5, 0x10, 0x9f, 0x1e, 0xab, 0x4b, 0x45, 0x28, 0x9c, 0xab, 0x13, 0x32, - 0xa9, 0xeb, 0x90, 0x6b, 0xdb, 0x7a, 0xb0, 0xeb, 0x7a, 0x7d, 0xa4, 0x42, 0x51, 0xf7, 0x8c, 0x3d, - 0x2b, 0x20, 0x46, 0x30, 0xf4, 0xa4, 0x0d, 0x18, 0x81, 0xa1, 0x45, 0x48, 0xba, 0x7c, 0xba, 0xf9, - 0x4a, 0xf6, 0xec, 0x74, 0x25, 0xd9, 0xea, 0xe0, 0xa4, 0xeb, 0xab, 0xef, 0xc1, 0x95, 0xb6, 0x3d, - 0xec, 0x59, 0x4e, 0x8d, 0xf8, 0x86, 0x67, 0x0d, 0xe8, 0x1c, 0xe9, 0xd9, 0xa0, 0x96, 0x54, 0x9e, - 0x0d, 0xfa, 0x1d, 0x1a, 0x98, 0x64, 0x64, 0x60, 0xd4, 0x9f, 0x4f, 0xc2, 0x95, 0xba, 0xd3, 0xb3, - 0x1c, 0x12, 0xe7, 0xbe, 0x0e, 0xb3, 0x84, 0x01, 0xb5, 0x03, 0x6e, 0xf4, 0x84, 0x9c, 0x19, 0x0e, - 0x95, 0x96, 0xb0, 0x31, 0x66, 0x9d, 0xde, 0x98, 0xb4, 0x08, 0x4f, 0x48, 0x9f, 0x68, 0xa3, 0xea, - 0x30, 0x3d, 0x60, 0x93, 0xf0, 0xc5, 0x26, 0xbb, 0x3e, 0x49, 0xd6, 0x13, 0xf3, 0x94, 0xa6, 0x4a, - 0xf0, 0x7e, 0x1a, 0x53, 0xf5, 0xab, 0x29, 0x98, 0x6b, 0xba, 0xe6, 0x88, 0x1e, 0x4a, 0x90, 0xdb, - 0x73, 0xfd, 0x20, 0x66, 0x96, 0xc3, 0x36, 0xba, 0x0b, 0xb9, 0x81, 0x58, 0x3e, 0xb1, 0x07, 0xaf, - 0x4d, 0x1e, 0x32, 0xa7, 0xc1, 0x21, 0x35, 0x7a, 0x0f, 0xf2, 0xf2, 0xe0, 0xca, 0xdd, 0x77, 0xc9, - 0xf6, 0x8d, 0xe8, 0xd1, 0xfb, 0x90, 0xe5, 0x8b, 0x20, 0x36, 0xdd, 0xf5, 0xa7, 0xd2, 0x39, 0x16, - 0x4c, 0xe8, 0x3e, 0xe4, 0x02, 0xdb, 0xd7, 0x2c, 0x67, 0xd7, 0x5d, 0xca, 0x30, 0x01, 0x2b, 0x13, - 0x4d, 0x9d, 0x6b, 0x92, 0xee, 0x66, 0xa7, 0xe1, 0xec, 0xba, 0x95, 0xc2, 0xd9, 0xe9, 0xca, 0xb4, - 0x68, 0xe0, 0xe9, 0xc0, 0xf6, 0xe9, 0x07, 0xba, 0x06, 0xe9, 0x5d, 0x6b, 0xe0, 0x2f, 0x65, 0x57, - 0x13, 0x37, 0x72, 0x95, 0xdc, 0xd9, 0xe9, 0x4a, 0x7a, 0xbd, 0xd1, 0xee, 0x60, 0x06, 0xa5, 0xdd, - 0x18, 0xbe, 0xc5, 0xbb, 0x99, 0x66, 0xeb, 0x79, 0x6e, 0x37, 0xd5, 0x4e, 0x23, 0xea, 0x46, 0x34, - 0xf0, 0xb4, 0xe1, 0x5b, 0xf4, 0x43, 0xfd, 0x95, 0x04, 0x14, 0x62, 0x83, 0x41, 0x2f, 0x02, 0x04, - 0xde, 0xd0, 0x0f, 0x34, 0xcf, 0x75, 0x03, 0xb6, 0x26, 0x45, 0x9c, 0x67, 0x10, 0xec, 0xba, 0x01, - 0x5a, 0x83, 0x79, 0x83, 0x78, 0x81, 0x66, 0xf9, 0xfe, 0x90, 0x78, 0x9a, 0x3f, 0xdc, 0xf9, 0x88, - 0x18, 0x01, 0x5b, 0x9f, 0x22, 0xbe, 0x42, 0x51, 0x0d, 0x86, 0xe9, 0x70, 0x04, 0x7a, 0x13, 0x16, - 0xe3, 0xf4, 0x83, 0xe1, 0x8e, 0x6d, 0x19, 0x1a, 0xdd, 0x33, 0x29, 0xc6, 0x32, 0x1f, 0xb1, 0xb4, - 0x19, 0xee, 0x01, 0x39, 0x52, 0xbf, 0x2b, 0xc6, 0x24, 0x06, 0x8b, 0x56, 0xa0, 0xc0, 0xf7, 0x9f, - 0x16, 0xdb, 0x28, 0xc0, 0x41, 0xf4, 0xce, 0x40, 0x2f, 0xc3, 0xb4, 0xe3, 0x9a, 0x44, 0xb3, 0x4c, - 0x71, 0x7c, 0xe1, 0xec, 0x74, 0x25, 0x4b, 0x45, 0x34, 0x6a, 0x38, 0x4b, 0x51, 0x0d, 0x13, 0xdd, - 0x82, 0x85, 0xbe, 0xfe, 0x58, 0x3b, 0x70, 0xed, 0x61, 0x9f, 0xf8, 0xda, 0x80, 0x78, 0x1a, 0xc5, - 0xb0, 0x81, 0xa4, 0xf0, 0x95, 0xbe, 0xfe, 0xf8, 0x21, 0x47, 0xb5, 0x89, 0x47, 0x59, 0xd1, 0x16, - 0xcc, 0xeb, 0x86, 0x41, 0x7c, 0xdf, 0xda, 0xb1, 0x89, 0x16, 0xb8, 0x03, 0xd7, 0x76, 0x7b, 0x47, - 0x62, 0x5b, 0x4c, 0xdc, 0x8b, 0x5d, 0x41, 0x83, 0x51, 0xc4, 0x28, 0x61, 0xea, 0xf7, 0x12, 0xa0, - 0x60, 0x7d, 0x37, 0xd8, 0x22, 0xfd, 0x1d, 0xe2, 0x75, 0x02, 0x3d, 0x18, 0xfa, 0x68, 0x11, 0xb2, - 0x36, 0xd1, 0x4d, 0xe2, 0xb1, 0x59, 0xe5, 0xb0, 0x68, 0xa1, 0x6d, 0x6a, 0x84, 0x75, 0x63, 0x4f, - 0xdf, 0xb1, 0x6c, 0x2b, 0x38, 0x62, 0xd3, 0x9a, 0x9d, 0x7c, 0xfe, 0xc7, 0x65, 0xae, 0xe1, 0x18, - 0x23, 0x1e, 0x11, 0x83, 0x96, 0x60, 0xba, 0x4f, 0x7c, 0x5f, 0xef, 0xf1, 0x69, 0xe7, 0xb1, 0x6c, - 0xaa, 0xef, 0x41, 0x31, 0xce, 0x87, 0x0a, 0x30, 0xbd, 0xdd, 0x7c, 0xd0, 0x6c, 0x3d, 0x6a, 0x2a, - 0x53, 0x68, 0x0e, 0x0a, 0xdb, 0x4d, 0x5c, 0x2f, 0x57, 0x37, 0xca, 0x95, 0xcd, 0xba, 0x92, 0x40, - 0x33, 0x90, 0x8f, 0x9a, 0x49, 0xf5, 0x0f, 0x13, 0x00, 0x54, 0x65, 0x62, 0x52, 0xef, 0x42, 0xc6, - 0x0f, 0xf4, 0x80, 0xaf, 0xd4, 0xec, 0x9d, 0x57, 0xce, 0xdb, 0x99, 0x62, 0xbc, 0xf4, 0x1f, 0xc1, - 0x9c, 0x25, 0x3e, 0xc2, 0xe4, 0xc8, 0x08, 0xa9, 0x75, 0xd5, 0x4d, 0xd3, 0x13, 0x03, 0x67, 0xdf, - 0xea, 0x7b, 0x90, 0x61, 0xdc, 0xa3, 0xc3, 0xcd, 0x41, 0xba, 0x46, 0xbf, 0x12, 0x28, 0x0f, 0x19, - 0x5c, 0x2f, 0xd7, 0x3e, 0x54, 0x92, 0x48, 0x81, 0x62, 0xad, 0xd1, 0xa9, 0xb6, 0x9a, 0xcd, 0x7a, - 0xb5, 0x5b, 0xaf, 0x29, 0x29, 0xf5, 0x3a, 0x64, 0x1a, 0x7d, 0x2a, 0xf9, 0x1a, 0xb5, 0x17, 0xbb, - 0xc4, 0x23, 0x8e, 0x21, 0x77, 0x57, 0x04, 0x50, 0xff, 0x75, 0x16, 0x32, 0x5b, 0xee, 0xd0, 0x09, - 0xd0, 0x9d, 0x98, 0xcd, 0x9f, 0x9d, 0xec, 0xe4, 0x31, 0xc2, 0xb5, 0xee, 0xd1, 0x80, 0x88, 0x3b, - 0x61, 0x11, 0xb2, 0xdc, 0xb2, 0x88, 0xe9, 0x88, 0x16, 0x85, 0x07, 0xba, 0xd7, 0x23, 0x81, 0x98, - 0x8f, 0x68, 0xa1, 0x1b, 0xd4, 0xe9, 0xd0, 0x4d, 0xd7, 0xb1, 0xf9, 0x4e, 0xcb, 0x71, 0xcf, 0x02, - 0x13, 0xdd, 0x6c, 0x39, 0xf6, 0x11, 0x0e, 0xb1, 0xe8, 0x3e, 0x14, 0x0c, 0xd7, 0xf1, 0x2d, 0x3f, - 0x20, 0x8e, 0x71, 0xb4, 0x94, 0x63, 0x83, 0xba, 0x7e, 0xfe, 0xa0, 0xaa, 0x11, 0x31, 0x8e, 0x73, - 0xa2, 0x0d, 0x28, 0xee, 0x58, 0x8e, 0xa9, 0xb9, 0x03, 0x7e, 0xe1, 0x67, 0xce, 0xb7, 0x7b, 0x5c, - 0x52, 0xc5, 0x72, 0xcc, 0x16, 0x27, 0xc6, 0x85, 0x9d, 0xa8, 0x81, 0x9a, 0x30, 0xcb, 0x8f, 0x57, - 0x28, 0x2b, 0xcb, 0x64, 0xbd, 0x7a, 0xbe, 0x2c, 0x7e, 0xe6, 0xa4, 0xb4, 0x99, 0x83, 0x78, 0x13, - 0x3d, 0x80, 0x99, 0xa0, 0x3f, 0xd8, 0xf5, 0x43, 0x71, 0xd3, 0x4c, 0xdc, 0x67, 0x2e, 0xd0, 0x3c, - 0x25, 0x97, 0xd2, 0x8a, 0x41, 0xac, 0x55, 0xfa, 0xcd, 0x0c, 0x14, 0x62, 0x23, 0x47, 0x1d, 0x28, - 0x0c, 0x3c, 0x77, 0xa0, 0xf7, 0x98, 0xd3, 0x22, 0x16, 0xf5, 0x8d, 0xa7, 0x9a, 0xf5, 0x5a, 0x3b, - 0x62, 0xc4, 0x71, 0x29, 0xe8, 0x2d, 0x28, 0x3a, 0xae, 0xe3, 0x11, 0x63, 0xe8, 0xf9, 0xd6, 0x01, - 0x5f, 0xf4, 0x5c, 0x45, 0x39, 0x3b, 0x5d, 0x29, 0x36, 0x5d, 0x07, 0x4b, 0x38, 0x1e, 0xa1, 0x42, - 0xf7, 0x40, 0x31, 0x3c, 0xa2, 0x07, 0xa4, 0x4f, 0x7b, 0x1a, 0xb8, 0x96, 0xc3, 0xb7, 0x45, 0xae, - 0xb2, 0x70, 0x76, 0xba, 0xa2, 0x54, 0x19, 0x6e, 0x2b, 0xc4, 0xe1, 0x27, 0xa8, 0xd1, 0x26, 0x2c, - 0xc8, 0x8d, 0x31, 0xd2, 0x3f, 0xdf, 0x42, 0x4b, 0x67, 0xa7, 0x2b, 0x0b, 0x72, 0x0b, 0x8d, 0x8c, - 0x63, 0x22, 0x17, 0xc2, 0xb0, 0x28, 0xe1, 0xbb, 0xae, 0x67, 0x90, 0x48, 0x5e, 0x86, 0xc9, 0x2b, - 0x9d, 0x9d, 0xae, 0x2c, 0x4a, 0x79, 0xeb, 0x2e, 0x73, 0x3c, 0xa5, 0xc4, 0x73, 0x38, 0xd5, 0x93, - 0x24, 0x14, 0x62, 0x6a, 0x43, 0x37, 0x21, 0x87, 0xdb, 0xb8, 0xf1, 0xb0, 0xdc, 0xad, 0x2b, 0x53, - 0xa5, 0x6b, 0xc7, 0x27, 0xab, 0x4b, 0x6c, 0x86, 0x71, 0xd5, 0xb6, 0x3d, 0xeb, 0x80, 0x9e, 0xee, - 0x1b, 0x30, 0x2d, 0x49, 0x13, 0xa5, 0x17, 0x8e, 0x4f, 0x56, 0x9f, 0x1f, 0x27, 0x8d, 0x51, 0xe2, - 0xce, 0x46, 0x19, 0xd7, 0x6b, 0x4a, 0x72, 0x32, 0x25, 0xee, 0xec, 0xe9, 0x1e, 0x31, 0xd1, 0x67, - 0x20, 0x2b, 0x08, 0x53, 0xa5, 0xd2, 0xf1, 0xc9, 0xea, 0xe2, 0x38, 0x61, 0x44, 0x87, 0x3b, 0x9b, - 0xe5, 0x87, 0x75, 0x25, 0x3d, 0x99, 0x0e, 0x77, 0x6c, 0xfd, 0x80, 0xa0, 0x57, 0x20, 0xc3, 0xc9, - 0x32, 0xa5, 0xab, 0xc7, 0x27, 0xab, 0xcf, 0x3d, 0x21, 0x8e, 0x52, 0x95, 0x96, 0x7e, 0xe1, 0x77, - 0x97, 0xa7, 0xfe, 0xf4, 0x9b, 0xcb, 0xca, 0x38, 0xba, 0xf4, 0x3f, 0x09, 0x98, 0x19, 0x39, 0x0c, - 0x48, 0x85, 0xac, 0xe3, 0x1a, 0xee, 0x80, 0xfb, 0x57, 0x39, 0x79, 0xa9, 0x55, 0xdd, 0xc1, 0x11, - 0x16, 0x18, 0xf4, 0x60, 0xcc, 0x43, 0x7c, 0xf3, 0x29, 0x4f, 0xda, 0x44, 0x1f, 0xf1, 0x03, 0x98, - 0x31, 0x3d, 0xeb, 0x80, 0x78, 0x9a, 0xe1, 0x3a, 0xbb, 0x56, 0x4f, 0xf8, 0x4e, 0xa5, 0x89, 0xc1, - 0x14, 0x23, 0xc4, 0x45, 0xce, 0x50, 0x65, 0xf4, 0x9f, 0xc2, 0x3b, 0x2c, 0x0d, 0xa0, 0x18, 0x3f, - 0xbb, 0xd4, 0x0f, 0xf1, 0xad, 0x9f, 0x22, 0x22, 0x84, 0x60, 0x31, 0x16, 0xce, 0x53, 0x08, 0x8f, - 0x12, 0x5e, 0x85, 0x74, 0x9f, 0x5e, 0xde, 0x54, 0xce, 0x4c, 0x65, 0x9e, 0x3a, 0xa9, 0xdf, 0x3f, - 0x5d, 0x29, 0xb8, 0xfe, 0xda, 0xba, 0x65, 0x93, 0x2d, 0xd7, 0x24, 0x98, 0x11, 0xd0, 0xfb, 0x44, - 0x1a, 0x0f, 0x71, 0xe3, 0x89, 0xa6, 0xfa, 0x67, 0x09, 0x48, 0x53, 0x43, 0x8d, 0x5e, 0x80, 0x74, - 0xa5, 0xd1, 0xac, 0x29, 0x53, 0xa5, 0x2b, 0xc7, 0x27, 0xab, 0x33, 0x4c, 0x5b, 0x14, 0x41, 0x0f, - 0x3c, 0x5a, 0x81, 0xec, 0xc3, 0xd6, 0xe6, 0xf6, 0x16, 0xdd, 0x79, 0xf3, 0xc7, 0x27, 0xab, 0x73, - 0x21, 0x9a, 0xeb, 0x13, 0xbd, 0x08, 0x99, 0xee, 0x56, 0x7b, 0xbd, 0xa3, 0x24, 0x4b, 0xe8, 0xf8, - 0x64, 0x75, 0x36, 0xc4, 0xb3, 0xe9, 0xa0, 0x97, 0x20, 0xd3, 0x6c, 0x37, 0xda, 0x75, 0x25, 0x55, - 0x5a, 0x3c, 0x3e, 0x59, 0x45, 0x21, 0x9a, 0x05, 0xbb, 0x6d, 0x6b, 0x40, 0xd0, 0x4b, 0x30, 0x5d, - 0xdd, 0xdc, 0xee, 0x74, 0xeb, 0x58, 0x49, 0x97, 0x16, 0x8e, 0x4f, 0x56, 0x95, 0x90, 0xa8, 0x6a, - 0x0f, 0xfd, 0x80, 0x78, 0xa5, 0x2b, 0x62, 0xdb, 0xe4, 0x43, 0x8c, 0xfa, 0x9d, 0x04, 0x14, 0x62, - 0x26, 0x9d, 0xee, 0xfc, 0x5a, 0x7d, 0xbd, 0xbc, 0xbd, 0xd9, 0x55, 0xa6, 0x62, 0x3b, 0x3f, 0x46, - 0x52, 0x23, 0xbb, 0xfa, 0xd0, 0xa6, 0x57, 0x0c, 0x54, 0x5b, 0xcd, 0x4e, 0xa3, 0xd3, 0xad, 0x37, - 0xbb, 0x4a, 0xa2, 0xb4, 0x74, 0x7c, 0xb2, 0xba, 0x30, 0x4e, 0xbc, 0x3e, 0xb4, 0x6d, 0xba, 0xf7, - 0xab, 0xe5, 0xea, 0x06, 0x3b, 0x4c, 0xd1, 0xde, 0x8f, 0x51, 0x55, 0x75, 0x63, 0x8f, 0x98, 0xe8, - 0x75, 0xc8, 0xd7, 0xea, 0x9b, 0xf5, 0xfb, 0x65, 0x76, 0xb1, 0x96, 0x5e, 0x3c, 0x3e, 0x59, 0xbd, - 0xfa, 0x64, 0xef, 0x36, 0xe9, 0xe9, 0x01, 0x31, 0xc7, 0xce, 0x40, 0x8c, 0x44, 0xfd, 0xcf, 0x24, - 0xcc, 0x60, 0xe2, 0x07, 0xba, 0x17, 0xb4, 0x5d, 0xdb, 0x32, 0x8e, 0x50, 0x1b, 0xf2, 0x86, 0xeb, - 0x98, 0x56, 0xcc, 0x44, 0xdf, 0x39, 0xc7, 0x95, 0x8f, 0xb8, 0x64, 0xab, 0x2a, 0x39, 0x71, 0x24, - 0x04, 0xdd, 0x82, 0x8c, 0x49, 0x6c, 0xfd, 0x48, 0xc4, 0x14, 0x57, 0x9f, 0x88, 0x29, 0x6b, 0x22, - 0x9d, 0x85, 0x39, 0x1d, 0x8b, 0xe0, 0xf5, 0xc7, 0x9a, 0x1e, 0x04, 0xa4, 0x3f, 0x08, 0xf8, 0x36, - 0x4a, 0xe3, 0x42, 0x5f, 0x7f, 0x5c, 0x16, 0x20, 0xf4, 0x06, 0x64, 0x0f, 0x2d, 0xc7, 0x74, 0x0f, - 0x85, 0x73, 0x78, 0x81, 0x50, 0x41, 0xa8, 0x1e, 0x53, 0x6f, 0x70, 0x6c, 0x98, 0x74, 0x27, 0x36, - 0x5b, 0xcd, 0xba, 0xdc, 0x89, 0x02, 0xdf, 0x72, 0x9a, 0xae, 0x43, 0x0d, 0x0c, 0xb4, 0x9a, 0xda, - 0x7a, 0xb9, 0xb1, 0xb9, 0x8d, 0xe9, 0x6e, 0x64, 0x3b, 0x25, 0x24, 0x59, 0xd7, 0x2d, 0x9b, 0x06, - 0xb1, 0x57, 0x21, 0x55, 0x6e, 0x7e, 0xa8, 0x24, 0x4b, 0xca, 0xf1, 0xc9, 0x6a, 0x31, 0x44, 0x97, - 0x9d, 0xa3, 0x48, 0xef, 0xe3, 0xfd, 0xaa, 0x7f, 0x9d, 0x82, 0xe2, 0xf6, 0xc0, 0xd4, 0x03, 0xc2, - 0x0f, 0x32, 0x5a, 0x85, 0xc2, 0x40, 0xf7, 0x74, 0xdb, 0x26, 0xb6, 0xe5, 0xf7, 0x45, 0x22, 0x2e, - 0x0e, 0x42, 0xef, 0x3c, 0xad, 0x1a, 0x2b, 0x39, 0x7a, 0x38, 0xbf, 0xf1, 0x4f, 0x2b, 0x09, 0xa9, - 0xd0, 0x6d, 0x98, 0xdd, 0xe5, 0xa3, 0xd5, 0x74, 0x83, 0x2d, 0x6c, 0x8a, 0x2d, 0xec, 0xda, 0xa4, - 0x85, 0x8d, 0x0f, 0x6b, 0x4d, 0x4c, 0xb2, 0xcc, 0xb8, 0xf0, 0xcc, 0x6e, 0xbc, 0x89, 0xde, 0x84, - 0xe9, 0xbe, 0xeb, 0x58, 0x81, 0xeb, 0x5d, 0xbe, 0x0a, 0x92, 0x12, 0xdd, 0x04, 0xea, 0xf8, 0x6b, - 0x72, 0x3c, 0x0c, 0xcd, 0x2e, 0xb9, 0x24, 0x9e, 0xeb, 0xeb, 0x8f, 0x45, 0x87, 0x98, 0x82, 0x51, - 0x05, 0x32, 0xae, 0x47, 0x5d, 0xf5, 0x2c, 0x1b, 0xee, 0xeb, 0x97, 0x0e, 0x97, 0x37, 0x5a, 0x94, - 0x07, 0x73, 0x56, 0xf5, 0x6d, 0x98, 0x19, 0x99, 0x04, 0xf5, 0x50, 0xdb, 0xe5, 0xed, 0x4e, 0x5d, - 0x99, 0x42, 0x45, 0xc8, 0x55, 0x5b, 0xcd, 0x6e, 0xa3, 0xb9, 0x4d, 0x5d, 0xec, 0x22, 0xe4, 0x70, - 0x6b, 0x73, 0xb3, 0x52, 0xae, 0x3e, 0x50, 0x92, 0xea, 0x1a, 0x14, 0x62, 0xd2, 0xd0, 0x2c, 0x40, - 0xa7, 0xdb, 0x6a, 0x6b, 0xeb, 0x0d, 0xdc, 0xe9, 0x72, 0x07, 0xbd, 0xd3, 0x2d, 0xe3, 0xae, 0x00, - 0x24, 0xd4, 0x7f, 0x4f, 0xca, 0x15, 0x15, 0x3e, 0x79, 0x65, 0xd4, 0x27, 0xbf, 0x60, 0xf0, 0xc2, - 0x2b, 0x8f, 0x1a, 0xa1, 0x6f, 0xfe, 0x0e, 0x00, 0xdb, 0x38, 0xc4, 0xd4, 0xf4, 0x40, 0x2c, 0x7c, - 0xe9, 0x09, 0x25, 0x77, 0x65, 0xbe, 0x18, 0xe7, 0x05, 0x75, 0x39, 0x40, 0xef, 0x43, 0xd1, 0x70, - 0xfb, 0x03, 0x9b, 0x08, 0xe6, 0xd4, 0xa5, 0xcc, 0x85, 0x90, 0xbe, 0x1c, 0xc4, 0xa3, 0x82, 0xf4, - 0x68, 0xdc, 0xf2, 0x73, 0x09, 0xa9, 0x99, 0x09, 0x81, 0x40, 0x11, 0x72, 0xdb, 0xed, 0x5a, 0xb9, - 0xdb, 0x68, 0xde, 0x57, 0x12, 0x08, 0x20, 0xcb, 0x54, 0x5d, 0x53, 0x92, 0x34, 0x80, 0xa9, 0xb6, - 0xb6, 0xda, 0x9b, 0x75, 0x66, 0xb1, 0xd0, 0x02, 0x28, 0x52, 0xd9, 0x1a, 0x53, 0x64, 0xbd, 0xa6, - 0xa4, 0xd1, 0x3c, 0xcc, 0x85, 0x50, 0xc1, 0x99, 0x41, 0x8b, 0x80, 0x42, 0x60, 0x24, 0x22, 0xab, - 0xfe, 0x0c, 0xcc, 0x55, 0x5d, 0x27, 0xd0, 0x2d, 0x27, 0x0c, 0xee, 0xee, 0xd0, 0x49, 0x0b, 0x10, - 0x8d, 0x4d, 0xd9, 0x45, 0x58, 0x99, 0x3b, 0x3b, 0x5d, 0x29, 0x84, 0xa4, 0x8d, 0x1a, 0x73, 0xc6, - 0x45, 0xc3, 0xa4, 0xe7, 0x77, 0x20, 0xc2, 0xd8, 0x4c, 0x65, 0xfa, 0xec, 0x74, 0x25, 0xd5, 0x6e, - 0xd4, 0x30, 0x85, 0xa1, 0x17, 0x20, 0x4f, 0x1e, 0x5b, 0x81, 0x66, 0xc8, 0xa8, 0x35, 0x83, 0x73, - 0x14, 0x50, 0x75, 0x4d, 0xa2, 0x56, 0x00, 0xda, 0xae, 0x17, 0x88, 0x9e, 0xdf, 0x82, 0xcc, 0xc0, - 0xf5, 0x58, 0xe6, 0xef, 0xdc, 0x7c, 0x34, 0x25, 0xe7, 0x1b, 0x15, 0x73, 0x62, 0xf5, 0xd7, 0x53, - 0x00, 0x5d, 0xdd, 0xdf, 0x17, 0x42, 0xee, 0x42, 0x3e, 0xcc, 0xfd, 0x8b, 0x14, 0xe2, 0x85, 0xab, - 0x1d, 0x12, 0xa3, 0x37, 0xe5, 0x66, 0xe3, 0x61, 0xeb, 0xc4, 0xe4, 0x8b, 0xec, 0x68, 0x52, 0xe4, - 0x37, 0x1a, 0x9b, 0x52, 0x3f, 0x82, 0x78, 0x9e, 0x58, 0x79, 0xfa, 0x89, 0xaa, 0xec, 0x5a, 0xe0, - 0x4a, 0x13, 0xf1, 0xca, 0xc4, 0xa4, 0xe9, 0xd8, 0x8a, 0x6c, 0x4c, 0xe1, 0x88, 0x0f, 0x7d, 0x00, - 0x05, 0x3a, 0x6f, 0xcd, 0x67, 0x38, 0x11, 0xaa, 0x9c, 0xab, 0x2a, 0x2e, 0x01, 0xc3, 0x20, 0xd2, - 0xf2, 0x8b, 0x00, 0xfa, 0x60, 0x60, 0x5b, 0xc4, 0xd4, 0x76, 0x8e, 0x58, 0x6c, 0x92, 0xc7, 0x79, - 0x01, 0xa9, 0x1c, 0xd1, 0xe3, 0x22, 0xd1, 0x7a, 0xc0, 0xe2, 0xb3, 0x4b, 0x14, 0x28, 0xa8, 0xcb, - 0x41, 0x45, 0x81, 0x59, 0x6f, 0xe8, 0x50, 0x85, 0x8a, 0xd1, 0xa9, 0x7f, 0x90, 0x84, 0xe7, 0x9b, - 0x24, 0x38, 0x74, 0xbd, 0xfd, 0x72, 0x10, 0xe8, 0xc6, 0x5e, 0x9f, 0x38, 0x62, 0xf9, 0x62, 0xb1, - 0x64, 0x62, 0x24, 0x96, 0x5c, 0x82, 0x69, 0xdd, 0xb6, 0x74, 0x9f, 0x70, 0xef, 0x30, 0x8f, 0x65, - 0x93, 0x46, 0xbc, 0x34, 0x7e, 0x26, 0xbe, 0x4f, 0x78, 0x3e, 0x90, 0x0e, 0x5c, 0x02, 0xd0, 0xd7, - 0x60, 0x51, 0xf8, 0x81, 0x7a, 0xd8, 0x15, 0x0d, 0xc1, 0xe4, 0xf3, 0x46, 0x7d, 0x62, 0x40, 0x3f, - 0x79, 0x70, 0xc2, 0x51, 0x8c, 0xc0, 0xad, 0x41, 0x20, 0xdc, 0xce, 0x05, 0x73, 0x02, 0xaa, 0x74, - 0x1f, 0xae, 0x9e, 0xcb, 0xf2, 0x4c, 0xf9, 0xc6, 0xef, 0x26, 0x01, 0x1a, 0xed, 0xf2, 0x96, 0x50, - 0x52, 0x0d, 0xb2, 0xbb, 0x7a, 0xdf, 0xb2, 0x8f, 0x2e, 0xb2, 0x80, 0x11, 0xfd, 0x5a, 0x99, 0xab, - 0x63, 0x9d, 0xf1, 0x60, 0xc1, 0xcb, 0xc2, 0xf9, 0xe1, 0x8e, 0x43, 0x82, 0x30, 0x9c, 0x67, 0x2d, - 0x3a, 0x0c, 0x4f, 0x77, 0xc2, 0xad, 0xcb, 0x1b, 0x74, 0x01, 0xa8, 0xcb, 0x73, 0xa8, 0x1f, 0x49, - 0xb3, 0x25, 0x9a, 0x68, 0x83, 0xbd, 0x2d, 0x10, 0xef, 0x80, 0x98, 0x4b, 0x19, 0xa6, 0xd4, 0xcb, - 0xc6, 0x83, 0x05, 0x39, 0xd7, 0x5d, 0xc8, 0x5d, 0x7a, 0x8f, 0xb9, 0x4c, 0x11, 0xea, 0x99, 0x74, - 0x74, 0x1b, 0x66, 0x46, 0xe6, 0xf9, 0x44, 0x1e, 0xa5, 0xd1, 0x7e, 0xf8, 0x96, 0x92, 0x16, 0x5f, - 0x6f, 0x2b, 0x59, 0xf5, 0x2f, 0x53, 0xdc, 0xd0, 0x08, 0xad, 0x4e, 0x7e, 0x53, 0xcb, 0xb1, 0xdd, - 0x6d, 0xb8, 0xb6, 0x30, 0x00, 0xaf, 0x5e, 0x6c, 0x7f, 0x68, 0x38, 0xcd, 0xc8, 0x71, 0xc8, 0x88, - 0x56, 0xa0, 0xc0, 0x77, 0xb1, 0x46, 0x0f, 0x1c, 0x53, 0xeb, 0x0c, 0x06, 0x0e, 0xa2, 0x9c, 0xe8, - 0x3a, 0xcc, 0xb2, 0x6c, 0xa2, 0xbf, 0x47, 0x4c, 0x4e, 0x93, 0x66, 0x34, 0x33, 0x21, 0x94, 0x91, - 0x6d, 0x41, 0x51, 0x00, 0x34, 0x16, 0x30, 0x64, 0xd8, 0x80, 0x6e, 0x5e, 0x36, 0x20, 0xce, 0xc2, - 0xe2, 0x88, 0xc2, 0x20, 0x6a, 0xa8, 0x3f, 0x01, 0x39, 0x39, 0x58, 0xb4, 0x04, 0xa9, 0x6e, 0xb5, - 0xad, 0x4c, 0x95, 0xe6, 0x8e, 0x4f, 0x56, 0x0b, 0x12, 0xdc, 0xad, 0xb6, 0x29, 0x66, 0xbb, 0xd6, - 0x56, 0x12, 0xa3, 0x98, 0xed, 0x5a, 0x1b, 0x95, 0x20, 0xdd, 0xa9, 0x76, 0xdb, 0xd2, 0x3f, 0x93, - 0x28, 0x0a, 0x2b, 0xa5, 0xa9, 0x7f, 0xa6, 0xee, 0x42, 0x21, 0xd6, 0x3b, 0x7a, 0x19, 0xa6, 0x1b, - 0xcd, 0xfb, 0xb8, 0xde, 0xe9, 0x28, 0x53, 0x3c, 0x82, 0x88, 0x61, 0x1b, 0x4e, 0x8f, 0xae, 0x1d, - 0x7a, 0x11, 0xd2, 0x1b, 0x2d, 0x7a, 0xef, 0xf3, 0x10, 0x25, 0x46, 0xb1, 0xe1, 0xfa, 0x41, 0x69, - 0x5e, 0x38, 0x7e, 0x71, 0xc1, 0xea, 0x6f, 0x24, 0x20, 0xcb, 0x0f, 0xda, 0xc4, 0x45, 0x2c, 0x47, - 0x71, 0x13, 0x8f, 0x2c, 0x5f, 0x3d, 0x3f, 0x0a, 0x5c, 0x13, 0x41, 0x1b, 0xdf, 0x9a, 0x92, 0xaf, - 0xf4, 0x2e, 0x14, 0xe3, 0x88, 0x67, 0xda, 0x98, 0x5f, 0x83, 0x02, 0xdd, 0xfb, 0x32, 0x1a, 0xbc, - 0x03, 0x59, 0x6e, 0x2c, 0xc2, 0x7b, 0xe8, 0xfc, 0x90, 0x54, 0x50, 0xa2, 0xbb, 0x30, 0xcd, 0xc3, - 0x58, 0xf9, 0xe2, 0xb1, 0x7c, 0xf1, 0x09, 0xc3, 0x92, 0x5c, 0xfd, 0x00, 0xd2, 0x6d, 0x42, 0xbc, - 0x78, 0x5a, 0x39, 0x71, 0x6e, 0x5a, 0x59, 0xa6, 0x25, 0x93, 0xb1, 0xb4, 0x64, 0x17, 0x8a, 0x8f, - 0x88, 0xd5, 0xdb, 0x0b, 0x88, 0xc9, 0x04, 0xbd, 0x0e, 0xe9, 0x01, 0x09, 0x07, 0xbf, 0x34, 0x71, - 0xf3, 0x11, 0xe2, 0x61, 0x46, 0x45, 0x6d, 0xcc, 0x21, 0xe3, 0x16, 0x8f, 0x85, 0xa2, 0xa5, 0xfe, - 0x4d, 0x12, 0x66, 0x1b, 0xbe, 0x3f, 0xd4, 0x1d, 0x43, 0x7a, 0x75, 0x5f, 0x1c, 0xf5, 0xea, 0x26, - 0xbe, 0xaa, 0x8e, 0xb2, 0x8c, 0x66, 0x5b, 0xc5, 0xcd, 0x9a, 0x0c, 0x6f, 0x56, 0xf5, 0xdf, 0x12, - 0x32, 0xa5, 0x7a, 0x3d, 0x66, 0x0a, 0x78, 0x8c, 0x18, 0x97, 0x44, 0xb6, 0x9d, 0x7d, 0xc7, 0x3d, - 0x74, 0x68, 0x80, 0x8b, 0xeb, 0xcd, 0xfa, 0x23, 0x25, 0xc1, 0xb7, 0xe7, 0x08, 0x11, 0x26, 0x0e, - 0x39, 0xa4, 0x92, 0xda, 0xf5, 0x66, 0x8d, 0x7a, 0x61, 0xc9, 0x09, 0x92, 0xda, 0xc4, 0x31, 0x2d, - 0xa7, 0x87, 0x5e, 0x86, 0x6c, 0xa3, 0xd3, 0xd9, 0x66, 0x21, 0xe4, 0xf3, 0xc7, 0x27, 0xab, 0xf3, - 0x23, 0x54, 0xec, 0x91, 0xc0, 0xa4, 0x44, 0x34, 0x04, 0xa2, 0xfe, 0xd9, 0x04, 0x22, 0xea, 0x5b, - 0x73, 0x22, 0xdc, 0xea, 0x96, 0xbb, 0x75, 0x25, 0x33, 0x81, 0x08, 0xbb, 0xf4, 0xaf, 0x38, 0x6e, - 0xff, 0x90, 0x04, 0xa5, 0x6c, 0x18, 0x64, 0x10, 0x50, 0xbc, 0x88, 0x3a, 0xbb, 0x90, 0x1b, 0xd0, - 0x2f, 0x8b, 0x48, 0x0f, 0xea, 0xee, 0xc4, 0xba, 0x80, 0x31, 0xbe, 0x35, 0xec, 0xda, 0xa4, 0x6c, - 0xf6, 0x2d, 0xdf, 0xb7, 0x5c, 0x87, 0xc3, 0x70, 0x28, 0xa9, 0xf4, 0x1f, 0x09, 0x98, 0x9f, 0x40, - 0x81, 0x6e, 0x43, 0xda, 0x73, 0x6d, 0xb9, 0x86, 0xd7, 0xce, 0xcb, 0x96, 0x53, 0x56, 0xcc, 0x28, - 0xd1, 0x32, 0x80, 0x3e, 0x0c, 0x5c, 0x9d, 0xf5, 0xcf, 0x73, 0x8c, 0x38, 0x06, 0x41, 0x8f, 0x20, - 0xeb, 0x13, 0xc3, 0x23, 0xd2, 0xcf, 0xfe, 0xe0, 0x47, 0x1d, 0xfd, 0x5a, 0x87, 0x89, 0xc1, 0x42, - 0x5c, 0x69, 0x0d, 0xb2, 0x1c, 0x42, 0xb7, 0xbd, 0xa9, 0x07, 0xba, 0x78, 0x21, 0x62, 0xdf, 0x74, - 0x37, 0xe9, 0x76, 0x4f, 0xee, 0x26, 0xdd, 0xee, 0xa9, 0x7f, 0x91, 0x04, 0xa8, 0x3f, 0x0e, 0x88, - 0xe7, 0xe8, 0x76, 0xb5, 0x8c, 0xea, 0xb1, 0x9b, 0x81, 0xcf, 0xf6, 0xb5, 0x89, 0xaf, 0x6b, 0x21, - 0xc7, 0x5a, 0xb5, 0x3c, 0xe1, 0x6e, 0xb8, 0x0a, 0xa9, 0xa1, 0x27, 0x4a, 0x3d, 0xb8, 0x8f, 0xbc, - 0x8d, 0x37, 0x31, 0x85, 0xa1, 0x7a, 0x3c, 0xdd, 0x73, 0x6e, 0x41, 0x47, 0xac, 0x83, 0x89, 0xa6, - 0x8b, 0x9e, 0x7c, 0x43, 0xd7, 0x0c, 0x22, 0x6e, 0x95, 0x22, 0x3f, 0xf9, 0xd5, 0x72, 0x95, 0x78, - 0x01, 0xce, 0x1a, 0x3a, 0xfd, 0xff, 0xa9, 0xec, 0xdb, 0xeb, 0x00, 0xd1, 0xd4, 0xd0, 0x32, 0x64, - 0xaa, 0xeb, 0x9d, 0xce, 0xa6, 0x32, 0xc5, 0x0d, 0x78, 0x84, 0x62, 0x60, 0xf5, 0x4f, 0x92, 0x90, - 0xab, 0x96, 0xc5, 0x95, 0x5b, 0x05, 0x85, 0x59, 0x25, 0xf6, 0xae, 0x46, 0x1e, 0x0f, 0x2c, 0xef, - 0x48, 0x18, 0x96, 0x0b, 0x02, 0xde, 0x59, 0xca, 0x42, 0x47, 0x5d, 0x67, 0x0c, 0x08, 0x43, 0x91, - 0x08, 0x25, 0x68, 0x86, 0x2e, 0x6d, 0xfc, 0xf2, 0xc5, 0xca, 0xe2, 0xa1, 0x4b, 0xd4, 0xf6, 0x71, - 0x41, 0x0a, 0xa9, 0xea, 0x3e, 0x7a, 0x07, 0xe6, 0x7c, 0xab, 0xe7, 0x58, 0x4e, 0x4f, 0x93, 0xca, - 0x63, 0x8f, 0x7c, 0x95, 0x2b, 0x67, 0xa7, 0x2b, 0x33, 0x1d, 0x8e, 0x12, 0x3a, 0x9c, 0x11, 0x94, - 0x55, 0xa6, 0x4a, 0xf4, 0x36, 0xcc, 0xc6, 0x58, 0xa9, 0x16, 0xb9, 0xda, 0x59, 0xe2, 0x3c, 0xe4, - 0x7c, 0x40, 0x8e, 0x70, 0x31, 0x64, 0x7c, 0x40, 0x58, 0x6e, 0x86, 0xa5, 0x99, 0x35, 0x8f, 0x9d, - 0x69, 0x76, 0xbb, 0xa7, 0x71, 0x81, 0xc1, 0xf8, 0x31, 0x57, 0x1f, 0xc2, 0x7c, 0xcb, 0x33, 0xf6, - 0x88, 0x1f, 0x70, 0x55, 0x08, 0x2d, 0x7e, 0x00, 0xd7, 0x02, 0xdd, 0xdf, 0xd7, 0xf6, 0x2c, 0x3f, - 0x70, 0xbd, 0x23, 0xcd, 0x23, 0x01, 0x71, 0x28, 0x5e, 0x63, 0x65, 0x10, 0x22, 0xe3, 0x78, 0x95, - 0xd2, 0x6c, 0x70, 0x12, 0x2c, 0x29, 0x36, 0x29, 0x81, 0xda, 0x80, 0x22, 0x0d, 0x61, 0x44, 0x52, - 0x8d, 0xce, 0x1e, 0x6c, 0xb7, 0xa7, 0x3d, 0xf5, 0x35, 0x95, 0xb7, 0xdd, 0x1e, 0xff, 0x54, 0xbf, - 0x0c, 0x4a, 0xcd, 0xf2, 0x07, 0x7a, 0x60, 0xec, 0xc9, 0x54, 0x2a, 0xaa, 0x81, 0xb2, 0x47, 0x74, - 0x2f, 0xd8, 0x21, 0x7a, 0xa0, 0x0d, 0x88, 0x67, 0xb9, 0xe6, 0xe5, 0xab, 0x3c, 0x17, 0xb2, 0xb4, - 0x19, 0x87, 0xfa, 0x5f, 0x09, 0x00, 0xac, 0xef, 0x4a, 0x6f, 0xed, 0xb3, 0x70, 0xc5, 0x77, 0xf4, - 0x81, 0xbf, 0xe7, 0x06, 0x9a, 0xe5, 0x04, 0xc4, 0x3b, 0xd0, 0x6d, 0x91, 0xdc, 0x51, 0x24, 0xa2, - 0x21, 0xe0, 0xe8, 0x75, 0x40, 0xfb, 0x84, 0x0c, 0x34, 0xd7, 0x36, 0x35, 0x89, 0xe4, 0xe5, 0x11, - 0x69, 0xac, 0x50, 0x4c, 0xcb, 0x36, 0x3b, 0x12, 0x8e, 0x2a, 0xb0, 0x4c, 0xa7, 0x4f, 0x9c, 0xc0, - 0xb3, 0x88, 0xaf, 0xed, 0xba, 0x9e, 0xe6, 0xdb, 0xee, 0xa1, 0xb6, 0xeb, 0xda, 0xb6, 0x7b, 0x48, - 0x3c, 0x99, 0x37, 0x2b, 0xd9, 0x6e, 0xaf, 0xce, 0x89, 0xd6, 0x5d, 0xaf, 0x63, 0xbb, 0x87, 0xeb, - 0x92, 0x82, 0xba, 0x74, 0xd1, 0x9c, 0x03, 0xcb, 0xd8, 0x97, 0x2e, 0x5d, 0x08, 0xed, 0x5a, 0xc6, - 0x3e, 0x7a, 0x19, 0x66, 0x88, 0x4d, 0x58, 0xfa, 0x84, 0x53, 0x65, 0x18, 0x55, 0x51, 0x02, 0x29, - 0x91, 0x7a, 0x0f, 0x94, 0xba, 0x63, 0x78, 0x47, 0x83, 0xd8, 0x9a, 0xbf, 0x0e, 0x88, 0x1a, 0x49, - 0xcd, 0x76, 0x8d, 0x7d, 0xad, 0xaf, 0x3b, 0x7a, 0x8f, 0x8e, 0x8b, 0x3f, 0xbc, 0x2a, 0x14, 0xb3, - 0xe9, 0x1a, 0xfb, 0x5b, 0x02, 0xae, 0xbe, 0x03, 0xd0, 0x19, 0x78, 0x44, 0x37, 0x5b, 0xd4, 0x9b, - 0xa0, 0xaa, 0x63, 0x2d, 0xcd, 0x14, 0xaf, 0xfe, 0xae, 0x27, 0x8e, 0xba, 0xc2, 0x11, 0xb5, 0x10, - 0xae, 0xfe, 0x7f, 0x98, 0x6f, 0xdb, 0xba, 0xc1, 0xea, 0x70, 0xda, 0xe1, 0x4b, 0x22, 0xba, 0x0b, - 0x59, 0x4e, 0x2a, 0x56, 0x72, 0xe2, 0x71, 0x8b, 0xfa, 0xdc, 0x98, 0xc2, 0x82, 0xbe, 0x52, 0x04, - 0x88, 0xe4, 0xa8, 0x7f, 0x9f, 0x80, 0x7c, 0x28, 0x1f, 0xad, 0xf2, 0x77, 0xc0, 0xc0, 0xd3, 0x2d, - 0x47, 0x44, 0xfc, 0x79, 0x1c, 0x07, 0xa1, 0x06, 0x14, 0x06, 0x21, 0xf7, 0x85, 0xfe, 0xdc, 0x84, - 0x51, 0xe3, 0x38, 0x2f, 0x7a, 0x17, 0xf2, 0xb2, 0xcc, 0x42, 0x5a, 0xd8, 0x8b, 0xab, 0x32, 0x22, - 0x72, 0x99, 0x48, 0xf5, 0xc8, 0xc0, 0xb6, 0xa8, 0xcd, 0x49, 0x87, 0x89, 0x54, 0x2c, 0x40, 0xea, - 0x17, 0x01, 0xbe, 0xe4, 0x5a, 0x4e, 0xd7, 0xdd, 0x27, 0x0e, 0x7b, 0x1c, 0xa7, 0x21, 0x25, 0x91, - 0x8a, 0x16, 0x2d, 0x96, 0x29, 0xe0, 0xab, 0x14, 0xbe, 0x11, 0xf3, 0xa6, 0xfa, 0xe7, 0x49, 0xc8, - 0x62, 0xd7, 0x0d, 0xaa, 0x65, 0xb4, 0x0a, 0x59, 0x61, 0x4a, 0xd8, 0x15, 0x55, 0xc9, 0x9f, 0x9d, - 0xae, 0x64, 0xb8, 0x0d, 0xc9, 0x18, 0xcc, 0x78, 0xc4, 0x8c, 0x7c, 0xf2, 0x3c, 0x23, 0x8f, 0x6e, - 0x43, 0x51, 0x10, 0x69, 0x7b, 0xba, 0xbf, 0xc7, 0xe3, 0xbb, 0xca, 0xec, 0xd9, 0xe9, 0x0a, 0x70, - 0xca, 0x0d, 0xdd, 0xdf, 0xc3, 0xc0, 0xa9, 0xe9, 0x37, 0xaa, 0x43, 0xe1, 0x23, 0xd7, 0x72, 0xb4, - 0x80, 0x4d, 0x42, 0xe4, 0x22, 0x27, 0x2e, 0x75, 0x34, 0x55, 0x51, 0x66, 0x03, 0x1f, 0x45, 0x93, - 0xaf, 0xc3, 0x8c, 0xe7, 0xba, 0x01, 0xb7, 0x6c, 0x96, 0xeb, 0x88, 0x34, 0xc7, 0xea, 0xc4, 0xec, - 0xb7, 0xeb, 0x06, 0x58, 0xd0, 0xe1, 0xa2, 0x17, 0x6b, 0xa1, 0xdb, 0xb0, 0x60, 0xeb, 0x7e, 0xa0, - 0x31, 0x93, 0x68, 0x46, 0xd2, 0xb2, 0x4c, 0xf9, 0x88, 0xe2, 0xd8, 0x03, 0x9e, 0x29, 0x39, 0xd4, - 0xbf, 0x4b, 0x40, 0x81, 0x4e, 0xc6, 0xda, 0xb5, 0x0c, 0xea, 0x07, 0x3e, 0xbb, 0x7b, 0x72, 0x15, - 0x52, 0x86, 0xef, 0x09, 0xa5, 0xb2, 0xfb, 0xb9, 0xda, 0xc1, 0x98, 0xc2, 0xd0, 0x3d, 0xc8, 0x8a, - 0x74, 0x0b, 0xf7, 0x4c, 0xd4, 0xcb, 0x3d, 0x56, 0xa1, 0x1b, 0xc1, 0xc7, 0xb6, 0x7b, 0x34, 0x3a, - 0x7e, 0x4f, 0xe0, 0x38, 0x08, 0x2d, 0x42, 0xd2, 0xe0, 0xea, 0x12, 0x75, 0x5c, 0xd5, 0x26, 0x4e, - 0x1a, 0x8e, 0xfa, 0x9d, 0x04, 0xcc, 0x44, 0x36, 0x81, 0xee, 0x80, 0x6b, 0x90, 0xf7, 0x87, 0x3b, - 0xfe, 0x91, 0x1f, 0x90, 0xbe, 0x7c, 0xf8, 0x0f, 0x01, 0xa8, 0x01, 0x79, 0xdd, 0xee, 0xb9, 0x9e, - 0x15, 0xec, 0xf5, 0x45, 0x20, 0x3b, 0xd9, 0x9b, 0x88, 0xcb, 0x5c, 0x2b, 0x4b, 0x16, 0x1c, 0x71, - 0x4b, 0xd7, 0x80, 0xd7, 0xbc, 0x30, 0xd7, 0xe0, 0x25, 0x28, 0xda, 0x7a, 0x9f, 0xe5, 0x9f, 0x02, - 0xab, 0x4f, 0xe4, 0x61, 0x10, 0xb0, 0xae, 0xd5, 0x27, 0xaa, 0x0a, 0xf9, 0x50, 0x18, 0x9a, 0x83, - 0x42, 0xb9, 0xde, 0xd1, 0xde, 0xb8, 0x73, 0x57, 0xbb, 0x5f, 0xdd, 0x52, 0xa6, 0x84, 0xfb, 0xfa, - 0x47, 0x09, 0x98, 0x11, 0x16, 0x4b, 0x84, 0x04, 0x2f, 0xc3, 0xb4, 0xa7, 0xef, 0x06, 0x32, 0x68, - 0x49, 0xf3, 0x5d, 0x4d, 0x2f, 0x01, 0x1a, 0xb4, 0x50, 0xd4, 0xe4, 0xa0, 0x25, 0x56, 0x8a, 0x92, - 0xba, 0xb0, 0x14, 0x25, 0xfd, 0x63, 0x29, 0x45, 0x51, 0x7f, 0x16, 0x60, 0xdd, 0xb2, 0x49, 0x97, - 0xa7, 0xaa, 0x26, 0x85, 0xa0, 0xd4, 0xcd, 0x0b, 0x2b, 0x7a, 0xb8, 0x9b, 0xd7, 0xa8, 0x61, 0x0a, - 0xa3, 0xa8, 0x9e, 0x65, 0x8a, 0xc3, 0xc8, 0x50, 0xf7, 0x29, 0xaa, 0x67, 0x99, 0xe1, 0xcb, 0x60, - 0xfa, 0x92, 0x97, 0x41, 0x75, 0x0e, 0x66, 0x30, 0xcf, 0xb1, 0xf1, 0x31, 0xa8, 0x27, 0x09, 0x98, - 0x13, 0xfe, 0x6e, 0x68, 0xb2, 0x5f, 0x83, 0x3c, 0x77, 0x7d, 0xa3, 0x20, 0x90, 0xd5, 0x63, 0x70, - 0xba, 0x46, 0x0d, 0xe7, 0x38, 0xba, 0x61, 0xa2, 0x15, 0x28, 0x08, 0xd2, 0x58, 0x11, 0x20, 0x70, - 0x10, 0xab, 0x52, 0x7a, 0x0b, 0xd2, 0xbb, 0x96, 0x4d, 0xc4, 0xce, 0x9f, 0x68, 0x11, 0x22, 0x8d, - 0x6c, 0x4c, 0x61, 0x46, 0x5d, 0xc9, 0xc9, 0xe4, 0x9e, 0xfa, 0x8f, 0x09, 0x96, 0x62, 0xa6, 0xa1, - 0x6a, 0x7c, 0x7c, 0x3c, 0x6a, 0x1d, 0x1b, 0x1f, 0xa7, 0xa3, 0xe3, 0xe3, 0x68, 0x3e, 0x3e, 0x41, - 0x1a, 0x1f, 0x1f, 0x07, 0xfd, 0xe8, 0xe3, 0x43, 0xef, 0xc3, 0xb4, 0x48, 0x55, 0x0a, 0x53, 0xf7, - 0xd2, 0xc4, 0x9d, 0x11, 0xd7, 0xf4, 0xc6, 0x14, 0x96, 0x3c, 0xb1, 0xe9, 0x6d, 0xc2, 0x62, 0xc5, - 0xd6, 0x8d, 0x7d, 0xdb, 0xf2, 0x03, 0x62, 0xc6, 0x2d, 0xd0, 0x1d, 0xc8, 0x8e, 0xf8, 0xb9, 0x17, - 0x25, 0x51, 0x05, 0xa5, 0xfa, 0x2f, 0x09, 0x28, 0x6e, 0x10, 0xdd, 0x0e, 0xf6, 0xa2, 0x4c, 0x55, - 0x40, 0xfc, 0x40, 0xdc, 0x8f, 0xec, 0x1b, 0x7d, 0x1e, 0x72, 0xa1, 0x1b, 0x74, 0xe9, 0x73, 0x60, - 0x48, 0x8a, 0xde, 0x84, 0x69, 0x3a, 0x76, 0x77, 0x28, 0xe3, 0xab, 0x8b, 0x5e, 0x9a, 0x04, 0x25, - 0xbd, 0xb4, 0x3c, 0xc2, 0xfc, 0x1e, 0xa6, 0xa7, 0x0c, 0x96, 0x4d, 0xf4, 0x05, 0x28, 0xb2, 0x87, - 0x12, 0xe9, 0xe6, 0x65, 0x2e, 0x93, 0x59, 0xe0, 0x6f, 0x9d, 0xdc, 0xc5, 0xfb, 0xfd, 0x24, 0x2c, - 0x6c, 0xe9, 0x47, 0x3b, 0x44, 0x98, 0x21, 0x62, 0x62, 0x62, 0xb8, 0x9e, 0x89, 0xda, 0x71, 0xf3, - 0x75, 0xc1, 0xd3, 0xe9, 0x24, 0xe6, 0xc9, 0x56, 0x4c, 0xc6, 0x7c, 0xc9, 0x58, 0xcc, 0xb7, 0x00, - 0x19, 0xc7, 0x75, 0x0c, 0x22, 0x6c, 0x1b, 0x6f, 0xa8, 0x5f, 0x4f, 0xc4, 0x6d, 0x57, 0x29, 0x7c, - 0xd6, 0x64, 0x49, 0xaf, 0xa6, 0x1b, 0x84, 0xdd, 0xa1, 0x7b, 0x50, 0xea, 0xd4, 0xab, 0xb8, 0xde, - 0xad, 0xb4, 0xbe, 0xac, 0x75, 0xca, 0x9b, 0x9d, 0xf2, 0x9d, 0xdb, 0x5a, 0xbb, 0xb5, 0xf9, 0xe1, - 0x1b, 0x6f, 0xde, 0xfe, 0xbc, 0x92, 0x28, 0xad, 0x1e, 0x9f, 0xac, 0x5e, 0x6b, 0x96, 0xab, 0x9b, - 0xfc, 0xc4, 0xed, 0xb8, 0x8f, 0x3b, 0xba, 0xed, 0xeb, 0x77, 0x6e, 0xb7, 0x5d, 0xfb, 0x88, 0xd2, - 0xa0, 0xcf, 0x02, 0x5a, 0xaf, 0xe3, 0x66, 0xbd, 0xab, 0x49, 0x03, 0x59, 0xad, 0x54, 0x95, 0x24, - 0x8f, 0xa4, 0xd6, 0x89, 0xe7, 0x90, 0xa0, 0x5c, 0xef, 0xbc, 0x71, 0xe7, 0x6e, 0xb5, 0x52, 0xa5, - 0x67, 0xbc, 0x18, 0xbf, 0x2d, 0xe3, 0x4e, 0x40, 0xe2, 0x5c, 0x27, 0x20, 0xf2, 0x25, 0x92, 0xe7, - 0xf8, 0x12, 0xeb, 0xb0, 0x60, 0x78, 0xae, 0xef, 0x6b, 0x34, 0x3c, 0x21, 0xe6, 0x58, 0x00, 0xf4, - 0xdc, 0xd9, 0xe9, 0xca, 0x95, 0x2a, 0xc5, 0x77, 0x18, 0x5a, 0x88, 0xbf, 0x62, 0xc4, 0x40, 0xac, - 0x27, 0xf5, 0x8f, 0x53, 0xd4, 0xd3, 0xb3, 0x0e, 0x2c, 0x9b, 0xf4, 0x88, 0x8f, 0x1e, 0xc2, 0x9c, - 0xe1, 0x11, 0x93, 0xc6, 0x1d, 0xba, 0x1d, 0xaf, 0x9f, 0xff, 0xdc, 0x44, 0xa7, 0x2b, 0x64, 0x5c, - 0xab, 0x86, 0x5c, 0x9d, 0x01, 0x31, 0xf0, 0xac, 0x31, 0xd2, 0x46, 0x1f, 0xc1, 0x9c, 0x4f, 0x6c, - 0xcb, 0x19, 0x3e, 0xd6, 0x0c, 0xd7, 0x09, 0xc8, 0x63, 0xf9, 0x9c, 0x77, 0x99, 0xdc, 0x4e, 0x7d, - 0x93, 0x72, 0x55, 0x39, 0x53, 0x05, 0x9d, 0x9d, 0xae, 0xcc, 0x8e, 0xc2, 0xf0, 0xac, 0x90, 0x2c, - 0xda, 0xa5, 0x3d, 0x98, 0x1d, 0x1d, 0x0d, 0x5a, 0x10, 0x86, 0x86, 0xd9, 0xab, 0xd0, 0x90, 0x5c, - 0x83, 0x9c, 0x47, 0x7a, 0x96, 0x1f, 0x78, 0x5c, 0xcd, 0x14, 0x13, 0x42, 0xd0, 0x12, 0x64, 0x63, - 0x45, 0x29, 0x14, 0x27, 0xda, 0xd4, 0x82, 0xf0, 0x9a, 0xba, 0xd2, 0x4f, 0xc3, 0xd8, 0x58, 0xe8, - 0xa1, 0x33, 0x2d, 0x5f, 0xdf, 0x11, 0x9d, 0xe5, 0xb0, 0x6c, 0xd2, 0xbd, 0x3c, 0xf4, 0x43, 0x07, - 0x92, 0x7d, 0x53, 0x18, 0xf3, 0x74, 0x44, 0x85, 0x21, 0xf3, 0x65, 0x64, 0x9d, 0x77, 0x3a, 0x56, - 0xe7, 0xbd, 0x00, 0x19, 0x9b, 0x1c, 0x10, 0x9b, 0xfb, 0x18, 0x98, 0x37, 0xd8, 0x9e, 0xff, 0x92, - 0xbb, 0x23, 0xae, 0xe1, 0x75, 0x98, 0xf9, 0xc8, 0xdd, 0xd1, 0xac, 0x80, 0x78, 0x51, 0x7d, 0x59, - 0xe1, 0xce, 0x0b, 0x93, 0xf4, 0x2b, 0xca, 0xbd, 0x85, 0xa3, 0x53, 0xfc, 0xc8, 0xdd, 0x69, 0x48, - 0x36, 0x54, 0x86, 0x59, 0xe6, 0xbf, 0x91, 0xc7, 0xc4, 0x18, 0x32, 0x41, 0x97, 0xbf, 0xbb, 0xce, - 0x50, 0x8e, 0xba, 0x64, 0x50, 0xbf, 0x99, 0x01, 0x85, 0x17, 0xab, 0x94, 0x59, 0x55, 0x2a, 0xcb, - 0x2b, 0xdf, 0x83, 0x8c, 0x6f, 0xb8, 0x61, 0x31, 0xe3, 0xc4, 0x84, 0xf8, 0x38, 0xd3, 0x5a, 0x87, - 0x72, 0x60, 0xce, 0x88, 0xd6, 0x61, 0xda, 0xdf, 0xd3, 0x3d, 0xcb, 0xe9, 0x09, 0xe7, 0xe8, 0xf5, - 0xa7, 0x93, 0xc1, 0x79, 0xb0, 0x64, 0x46, 0x1b, 0x90, 0xd9, 0xa1, 0x11, 0x99, 0xb0, 0xa5, 0xb7, - 0x9f, 0x4a, 0x4a, 0x85, 0x72, 0x70, 0xe8, 0xc6, 0x14, 0xe6, 0x02, 0xa8, 0x24, 0x56, 0x12, 0x27, - 0x2e, 0xa2, 0xa7, 0x93, 0xc4, 0x8a, 0x50, 0x22, 0x49, 0x4c, 0x40, 0x69, 0x06, 0x0a, 0xb1, 0x1e, - 0x4a, 0xf7, 0xa1, 0x10, 0x23, 0x43, 0xcf, 0xc3, 0xf4, 0xae, 0xaf, 0xc5, 0xca, 0xff, 0xb3, 0xbb, - 0x3e, 0xab, 0x24, 0x5a, 0x81, 0x02, 0xe3, 0xd7, 0x76, 0x6d, 0xbd, 0x27, 0x1f, 0xdd, 0x80, 0x81, - 0xd6, 0x29, 0x44, 0x35, 0x20, 0xc3, 0x74, 0x88, 0x6e, 0x42, 0xa1, 0xd3, 0x68, 0xde, 0xdf, 0xac, - 0x6b, 0xcd, 0x56, 0x8d, 0x5a, 0x46, 0x56, 0x33, 0xc6, 0xe5, 0x33, 0x8a, 0x8e, 0xe5, 0xf4, 0x6c, - 0xc2, 0xea, 0x90, 0x6f, 0x00, 0x6c, 0x6d, 0x6f, 0x76, 0x1b, 0x9c, 0x54, 0xd4, 0xeb, 0xc4, 0x48, - 0xb7, 0x86, 0x76, 0x60, 0x51, 0x4a, 0xe1, 0x13, 0xfe, 0x5e, 0x02, 0xa6, 0x85, 0x96, 0xd1, 0x4a, - 0x68, 0x7a, 0x9f, 0x3b, 0x3e, 0x59, 0xbd, 0x22, 0xb8, 0x38, 0x92, 0x55, 0x95, 0xdc, 0x60, 0x95, - 0xbc, 0x35, 0xad, 0xd5, 0xdc, 0xfc, 0x50, 0x49, 0x8c, 0x0c, 0x43, 0x2c, 0x94, 0x28, 0xf3, 0x43, - 0x37, 0x01, 0x5a, 0xcd, 0xba, 0xf6, 0x08, 0x37, 0xba, 0x75, 0x2c, 0x0b, 0x82, 0x46, 0x48, 0x5b, - 0x0e, 0x79, 0xe4, 0xd1, 0x1d, 0x8f, 0x5e, 0x84, 0x54, 0x79, 0x73, 0x53, 0x49, 0xf1, 0x22, 0x95, - 0x11, 0xa2, 0xb2, 0x6d, 0xf3, 0x71, 0x56, 0x66, 0xa0, 0xc0, 0xcb, 0xa4, 0x99, 0x2a, 0xd5, 0xbb, - 0x50, 0x14, 0x84, 0x3c, 0xc3, 0xf8, 0x64, 0x3a, 0x6d, 0x31, 0x4c, 0x6b, 0xca, 0xc7, 0x37, 0xd6, - 0x52, 0x7f, 0x27, 0x05, 0xf3, 0x9c, 0x55, 0x3c, 0x70, 0x44, 0xae, 0xf0, 0xe5, 0xf9, 0xfb, 0xea, - 0xe8, 0x5b, 0xf5, 0xe7, 0xce, 0xdf, 0x34, 0x23, 0xc2, 0x47, 0xf3, 0xe8, 0x26, 0xcc, 0xc9, 0x57, - 0x26, 0x69, 0x4f, 0x79, 0x70, 0xfc, 0xde, 0xd3, 0x8a, 0x13, 0x2d, 0x61, 0xb8, 0x78, 0x3a, 0x52, - 0x3e, 0x70, 0xc5, 0xac, 0x99, 0x7c, 0x21, 0xcf, 0x8c, 0xbc, 0x90, 0x97, 0xca, 0x30, 0x3f, 0x41, - 0xc0, 0x33, 0x65, 0x24, 0xbf, 0x2a, 0xf3, 0xfe, 0xf3, 0x30, 0x27, 0xb2, 0xf5, 0x5a, 0x7b, 0xbb, - 0xb2, 0xd9, 0xe8, 0x6c, 0x28, 0x53, 0x68, 0x06, 0xf2, 0xa2, 0x51, 0xaf, 0x29, 0x09, 0x54, 0x82, - 0x45, 0x49, 0x43, 0x37, 0xa5, 0xb6, 0xdd, 0x94, 0xa4, 0x49, 0xf4, 0x1c, 0x5c, 0x91, 0xb8, 0x08, - 0x9c, 0x52, 0xff, 0x2a, 0x09, 0xc0, 0x27, 0xce, 0x6a, 0xfa, 0xaf, 0xc3, 0xac, 0xa1, 0x0f, 0x74, - 0xc3, 0x0a, 0x8e, 0x46, 0x6a, 0xfc, 0x66, 0x24, 0x94, 0xd7, 0xf9, 0x7d, 0x39, 0xac, 0x28, 0x8e, - 0xee, 0xa9, 0x73, 0x7f, 0x09, 0x13, 0x89, 0x17, 0x9f, 0x23, 0xda, 0x14, 0xb5, 0xc5, 0x52, 0x99, - 0xaf, 0x41, 0x5e, 0x48, 0x0e, 0x03, 0x09, 0xe6, 0x39, 0x0b, 0x21, 0x35, 0x9c, 0xe3, 0xe8, 0x86, - 0x79, 0xfe, 0x0f, 0x01, 0x52, 0x3f, 0xca, 0x0f, 0x01, 0x4a, 0xf7, 0x00, 0x3d, 0x39, 0xbc, 0x67, - 0x5a, 0xab, 0x47, 0x30, 0x53, 0x15, 0x6a, 0xc2, 0xec, 0xa1, 0xf9, 0x3a, 0xcc, 0x7a, 0xfc, 0xa7, - 0x5f, 0xe6, 0xa8, 0x36, 0x25, 0x94, 0x6b, 0x73, 0x05, 0x0a, 0x2c, 0xbb, 0x39, 0xf2, 0x5b, 0x34, - 0x60, 0x20, 0x46, 0xa0, 0xfe, 0x6d, 0x3a, 0xbc, 0x2a, 0x7c, 0xea, 0xc9, 0xb0, 0x04, 0xd3, 0x22, - 0x24, 0xc3, 0x13, 0xc4, 0xe2, 0xe9, 0x46, 0x0d, 0x27, 0x2d, 0x73, 0x54, 0x83, 0xc9, 0x0b, 0x35, - 0x18, 0xbd, 0xdf, 0xa5, 0x9e, 0xfa, 0xfd, 0xee, 0xab, 0x4f, 0x2c, 0x3d, 0x57, 0xf8, 0xff, 0xbb, - 0xc0, 0xac, 0x87, 0x83, 0x7e, 0x8a, 0x0d, 0xa0, 0x3f, 0x79, 0x66, 0x33, 0xe7, 0xbf, 0xf5, 0x3c, - 0xd1, 0xc1, 0xd3, 0x1c, 0xd8, 0x7a, 0x68, 0xe1, 0x58, 0x48, 0xca, 0x2b, 0x4c, 0x5e, 0x79, 0x9a, - 0x6b, 0x09, 0x83, 0x1e, 0xdd, 0xd5, 0xef, 0xc2, 0x34, 0xb7, 0x74, 0xbe, 0xf8, 0xad, 0xcf, 0xea, - 0xf9, 0x22, 0x44, 0x00, 0x2b, 0x19, 0x3e, 0xfd, 0x66, 0xfb, 0x71, 0xd8, 0x96, 0xaf, 0x84, 0xbb, - 0x2a, 0xac, 0xe9, 0x38, 0x77, 0x57, 0x3d, 0xe3, 0x0f, 0x26, 0xd4, 0x5f, 0x4c, 0xc0, 0x7c, 0x78, - 0xdc, 0xa2, 0x9f, 0x3f, 0xa2, 0x77, 0x21, 0xcf, 0x36, 0xbf, 0x6f, 0xb1, 0xe7, 0xd1, 0xcb, 0x8f, - 0x6a, 0x44, 0xce, 0xb2, 0x9c, 0x2c, 0xe9, 0xe9, 0x11, 0x53, 0x18, 0x9c, 0x4b, 0x78, 0x43, 0x72, - 0xf5, 0x97, 0x12, 0x90, 0x93, 0x70, 0xb4, 0x0e, 0x39, 0x9f, 0xf4, 0xd8, 0xcf, 0x31, 0xc5, 0x18, - 0x6e, 0x5e, 0x24, 0x67, 0xad, 0x23, 0x88, 0x45, 0x91, 0x87, 0xe4, 0x2d, 0xbd, 0x07, 0x33, 0x23, - 0xa8, 0x67, 0xd2, 0xfe, 0xf7, 0xc3, 0x43, 0x4d, 0x8d, 0x86, 0xf8, 0x7d, 0x4f, 0xe8, 0x75, 0x25, - 0x2e, 0xf3, 0x95, 0x22, 0xa6, 0x4b, 0xbc, 0xae, 0xe4, 0x33, 0x48, 0x9a, 0xe4, 0x75, 0xa1, 0xf6, - 0xe8, 0x71, 0xe1, 0xa6, 0xe2, 0xd6, 0x53, 0xc9, 0x9b, 0x7c, 0x72, 0xfe, 0xaf, 0xfc, 0xb8, 0xd2, - 0x7f, 0x27, 0x00, 0x62, 0xce, 0xf4, 0x86, 0xc8, 0x39, 0x71, 0x5f, 0xfa, 0xad, 0x67, 0x1c, 0xf1, - 0x5a, 0x2c, 0x29, 0xf5, 0x5b, 0x09, 0x48, 0x33, 0x91, 0x23, 0x85, 0x38, 0x8b, 0x80, 0x62, 0xde, - 0xa2, 0x74, 0xc1, 0x12, 0xe8, 0x05, 0x78, 0x3e, 0x0e, 0xa7, 0x8e, 0x5c, 0x1d, 0x73, 0x57, 0x2e, - 0x49, 0xef, 0xe8, 0xc8, 0x6d, 0x1c, 0xc1, 0xa5, 0xd0, 0x35, 0x58, 0x8a, 0xe1, 0x84, 0x0c, 0x21, - 0x36, 0x4d, 0xc5, 0xc6, 0xb0, 0xfc, 0x53, 0x20, 0x33, 0x63, 0x5e, 0xdb, 0xcd, 0x2f, 0x40, 0x51, - 0xfe, 0x8c, 0x92, 0xa9, 0x2e, 0x07, 0xe9, 0x6e, 0xb9, 0xf3, 0x40, 0x99, 0x42, 0x00, 0x59, 0x1e, - 0xd9, 0xf3, 0xd2, 0xcb, 0x6a, 0xab, 0xb9, 0xde, 0xb8, 0xaf, 0x24, 0xe9, 0xb7, 0xa8, 0xa8, 0x4f, - 0xdd, 0xfc, 0xb5, 0x34, 0xe4, 0xc3, 0x42, 0x40, 0x74, 0x15, 0x52, 0xcd, 0xfa, 0x23, 0x99, 0x26, - 0x08, 0xe1, 0x4d, 0x72, 0x88, 0x5e, 0x8a, 0x4a, 0x08, 0xee, 0x71, 0xa7, 0x32, 0x44, 0xcb, 0xf2, - 0x81, 0x57, 0x20, 0x57, 0xee, 0x74, 0x1a, 0xf7, 0x9b, 0xf5, 0x9a, 0xf2, 0x49, 0x82, 0xfb, 0xbb, - 0x21, 0x11, 0x37, 0xdc, 0xc4, 0x64, 0x54, 0xd5, 0x6a, 0xbd, 0xdd, 0xad, 0xd7, 0x94, 0x8f, 0x93, - 0xe3, 0x54, 0xec, 0x49, 0x9c, 0xfd, 0xe8, 0x23, 0xdf, 0xc6, 0xf5, 0x76, 0x19, 0xd3, 0x0e, 0x3f, - 0x49, 0xf2, 0xca, 0x86, 0xa8, 0x47, 0x8f, 0x0c, 0xb8, 0x7b, 0xbd, 0x2c, 0x7f, 0x5f, 0xf6, 0x71, - 0x8a, 0x57, 0xff, 0x47, 0x55, 0x8d, 0x44, 0x37, 0x8f, 0x68, 0x6f, 0xac, 0x9c, 0x94, 0x89, 0x49, - 0x8d, 0xf5, 0xd6, 0x09, 0x74, 0x2f, 0xa0, 0x52, 0x54, 0x98, 0xc6, 0xdb, 0xcd, 0x26, 0x25, 0xfa, - 0x38, 0x3d, 0x36, 0x3b, 0x3c, 0x74, 0x1c, 0x4a, 0x73, 0x1d, 0x72, 0xb2, 0xda, 0x54, 0xf9, 0x24, - 0x3d, 0x36, 0xa0, 0xaa, 0x2c, 0x95, 0x65, 0x1d, 0x6e, 0x6c, 0x77, 0xd9, 0xcf, 0xdf, 0x3e, 0xce, - 0x8c, 0x77, 0xb8, 0x37, 0x0c, 0x4c, 0xf7, 0xd0, 0x41, 0xab, 0x61, 0x11, 0xc5, 0x27, 0x19, 0x9e, - 0x27, 0x09, 0x69, 0x44, 0x05, 0xc5, 0x2b, 0x90, 0xc3, 0xf5, 0x2f, 0xf1, 0x5f, 0xca, 0x7d, 0x9c, - 0x1d, 0x93, 0x83, 0xc9, 0x47, 0xc4, 0xa0, 0xbd, 0xad, 0x42, 0x16, 0xd7, 0xb7, 0x5a, 0x0f, 0xeb, - 0xca, 0x6f, 0x67, 0xc7, 0xe4, 0x60, 0xd2, 0x77, 0xd9, 0xaf, 0x62, 0x72, 0x2d, 0xdc, 0xde, 0x28, - 0xb3, 0x45, 0x19, 0x97, 0xd3, 0xf2, 0x06, 0x7b, 0xba, 0x43, 0xcc, 0xe8, 0xe7, 0x0d, 0x21, 0xea, - 0xe6, 0x57, 0x21, 0x27, 0x5f, 0x15, 0xd0, 0x32, 0x64, 0x1f, 0xb5, 0xf0, 0x83, 0x3a, 0x56, 0xa6, - 0xb8, 0x96, 0x25, 0xe6, 0x11, 0x7f, 0x0f, 0x5a, 0x85, 0xe9, 0xad, 0x72, 0xb3, 0x7c, 0x9f, 0x9e, - 0x09, 0x3e, 0x0c, 0x49, 0x20, 0x52, 0xe3, 0x25, 0x45, 0x74, 0x10, 0xca, 0xac, 0xbc, 0xf2, 0xad, - 0x1f, 0x2c, 0x4f, 0x7d, 0xef, 0x07, 0xcb, 0x53, 0x1f, 0x9f, 0x2d, 0x27, 0xbe, 0x75, 0xb6, 0x9c, - 0xf8, 0xf6, 0xd9, 0x72, 0xe2, 0x9f, 0xcf, 0x96, 0x13, 0xbf, 0xfc, 0xc3, 0xe5, 0xa9, 0x6f, 0xff, - 0x70, 0x79, 0xea, 0x7b, 0x3f, 0x5c, 0x9e, 0xda, 0xc9, 0xb2, 0xe8, 0xfa, 0xcd, 0xff, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0xdd, 0x33, 0x91, 0x58, 0x55, 0x43, 0x00, 0x00, + 0x56, 0xb0, 0xeb, 0xd7, 0x55, 0xaf, 0xaa, 0xec, 0xec, 0xb0, 0xc7, 0xe3, 0xae, 0xe9, 0xb1, 0x3d, + 0x39, 0xd3, 0x3b, 0x3d, 0xbd, 0xb3, 0xee, 0x9e, 0x9e, 0xd9, 0xf9, 0x7a, 0x66, 0x76, 0x76, 0xba, + 0xfe, 0xdc, 0xae, 0x6d, 0xbb, 0xaa, 0x14, 0x55, 0xee, 0xde, 0x59, 0xe9, 0xdb, 0x24, 0x9d, 0x19, + 0x2e, 0xe7, 0x38, 0x2b, 0xb3, 0xc8, 0xcc, 0xb2, 0xdb, 0x2c, 0x88, 0x39, 0x01, 0xb2, 0x84, 0x00, + 0x21, 0x2d, 0x8b, 0xc0, 0x02, 0xc1, 0x22, 0x21, 0x71, 0xe0, 0xc0, 0x81, 0x1f, 0x71, 0x18, 0x24, + 0x84, 0x96, 0x13, 0xbb, 0x2c, 0x82, 0xd5, 0x82, 0x0c, 0xeb, 0xbd, 0x70, 0x41, 0x70, 0x41, 0x70, + 0xe0, 0x80, 0xe2, 0x2f, 0x33, 0xcb, 0x5d, 0xb6, 0xbb, 0x77, 0x96, 0x8b, 0x9d, 0xf1, 0xfe, 0x22, + 0xe2, 0x45, 0xc4, 0x8b, 0xf7, 0x5e, 0xbc, 0x82, 0x9b, 0x7d, 0x2b, 0xd8, 0x1d, 0x6d, 0xaf, 0x1a, + 0xee, 0xe0, 0x96, 0xe9, 0x1a, 0x7b, 0xc4, 0xbb, 0xe5, 0x1f, 0xe8, 0xde, 0x60, 0xcf, 0x0a, 0x6e, + 0xe9, 0x43, 0xeb, 0x56, 0x70, 0x38, 0x24, 0xfe, 0xea, 0xd0, 0x73, 0x03, 0x17, 0x21, 0x4e, 0xb0, + 0x2a, 0x09, 0x56, 0xf7, 0xdf, 0x28, 0x2f, 0xf7, 0x5d, 0xb7, 0x6f, 0x93, 0x5b, 0x8c, 0x62, 0x7b, + 0xb4, 0x73, 0x2b, 0xb0, 0x06, 0xc4, 0x0f, 0xf4, 0xc1, 0x90, 0x33, 0x95, 0x97, 0xce, 0x12, 0x98, + 0x23, 0x4f, 0x0f, 0x2c, 0xd7, 0x39, 0x0f, 0x7f, 0xe0, 0xe9, 0xc3, 0x21, 0xf1, 0x44, 0xa7, 0xe5, + 0xf9, 0xbe, 0xdb, 0x77, 0xd9, 0xe7, 0x2d, 0xfa, 0xc5, 0xa1, 0xea, 0x32, 0x4c, 0x3f, 0x24, 0x9e, + 0x6f, 0xb9, 0x0e, 0x9a, 0x87, 0x8c, 0xe5, 0x98, 0xe4, 0xf1, 0x62, 0x62, 0x25, 0x71, 0x23, 0x8d, + 0x79, 0x43, 0xbd, 0x0d, 0xd0, 0xa4, 0x1f, 0x0d, 0x27, 0xf0, 0x0e, 0x91, 0x02, 0xa9, 0x3d, 0x72, + 0xc8, 0x28, 0xf2, 0x98, 0x7e, 0x52, 0xc8, 0xbe, 0x6e, 0x2f, 0x26, 0x39, 0x64, 0x5f, 0xb7, 0xd5, + 0x1f, 0x24, 0xa0, 0x50, 0x71, 0x1c, 0x37, 0x60, 0xa3, 0xf3, 0x11, 0x82, 0xb4, 0xa3, 0x0f, 0x88, + 0x60, 0x62, 0xdf, 0xa8, 0x06, 0x59, 0x5b, 0xdf, 0x26, 0xb6, 0xbf, 0x98, 0x5c, 0x49, 0xdd, 0x28, + 0xdc, 0xf9, 0xec, 0xea, 0x93, 0x2a, 0x59, 0x8d, 0x09, 0x59, 0xdd, 0x60, 0xd4, 0x6c, 0x10, 0x58, + 0xb0, 0xa2, 0x2f, 0xc2, 0xb4, 0xe5, 0x98, 0x96, 0x41, 0xfc, 0xc5, 0x34, 0x93, 0xb2, 0x34, 0x49, + 0x4a, 0x34, 0xfa, 0x6a, 0xfa, 0x5b, 0x27, 0xcb, 0x53, 0x58, 0x32, 0x95, 0xdf, 0x81, 0x42, 0x4c, + 0xec, 0x84, 0xb9, 0xcd, 0x43, 0x66, 0x5f, 0xb7, 0x47, 0x44, 0xcc, 0x8e, 0x37, 0xde, 0x4d, 0xde, + 0x4d, 0xa8, 0xf7, 0x60, 0xbe, 0xa5, 0x0f, 0x88, 0x79, 0x9f, 0x38, 0xc4, 0xb3, 0x0c, 0x4c, 0x7c, + 0x77, 0xe4, 0x19, 0x84, 0xce, 0x75, 0xcf, 0x72, 0x4c, 0x39, 0x57, 0xfa, 0x3d, 0x59, 0x8a, 0x5a, + 0x83, 0xe7, 0xeb, 0x96, 0x6f, 0x78, 0x24, 0x20, 0xcf, 0x2c, 0x24, 0x25, 0x85, 0x9c, 0x24, 0x60, + 0xf6, 0x2c, 0xf7, 0x57, 0x60, 0x8e, 0xaa, 0xd8, 0xd4, 0x3c, 0x01, 0xd1, 0xfc, 0x21, 0x31, 0x98, + 0xb0, 0xc2, 0x9d, 0x1b, 0x93, 0x34, 0x34, 0x69, 0x26, 0xeb, 0x53, 0xf8, 0x0a, 0x13, 0x23, 0x01, + 0xdd, 0x21, 0x31, 0x90, 0x01, 0x0b, 0xa6, 0x18, 0xf4, 0x19, 0xf1, 0x49, 0x26, 0x7e, 0xe2, 0x32, + 0x9e, 0x33, 0xcd, 0xf5, 0x29, 0x3c, 0x2f, 0x85, 0xc5, 0x3b, 0xa9, 0x02, 0xe4, 0xa4, 0x6c, 0xf5, + 0x1b, 0x09, 0xc8, 0x4b, 0xa4, 0x8f, 0x5e, 0x83, 0xbc, 0xa3, 0x3b, 0xae, 0x66, 0x0c, 0x47, 0x3e, + 0x9b, 0x50, 0xaa, 0x5a, 0x3c, 0x3d, 0x59, 0xce, 0xb5, 0x74, 0xc7, 0xad, 0x75, 0xb6, 0x7c, 0x9c, + 0xa3, 0xe8, 0xda, 0x70, 0xe4, 0xa3, 0x97, 0xa0, 0x38, 0x20, 0x03, 0xd7, 0x3b, 0xd4, 0xb6, 0x0f, + 0x03, 0xe2, 0x0b, 0xb5, 0x15, 0x38, 0xac, 0x4a, 0x41, 0xe8, 0x7d, 0x98, 0xee, 0xf3, 0x21, 0x2d, + 0xa6, 0xd8, 0xf6, 0x79, 0x79, 0xd2, 0xe8, 0xcf, 0x8c, 0x1a, 0x4b, 0x1e, 0xf5, 0xeb, 0x49, 0x98, + 0x0f, 0xa1, 0xe4, 0x27, 0x47, 0x96, 0x47, 0x06, 0xc4, 0x09, 0x7c, 0xf4, 0x79, 0xc8, 0xda, 0xd6, + 0xc0, 0x0a, 0x7c, 0xa1, 0xf3, 0x17, 0x27, 0x89, 0x0d, 0x27, 0x85, 0x05, 0x31, 0xaa, 0x40, 0xd1, + 0x23, 0x3e, 0xf1, 0xf6, 0xf9, 0x8e, 0x17, 0x1a, 0xbd, 0x84, 0x79, 0x8c, 0x05, 0xbd, 0x0b, 0xe0, + 0x1f, 0xe8, 0x43, 0x31, 0xe5, 0x14, 0x13, 0xf0, 0xc2, 0x2a, 0xb7, 0x0b, 0xab, 0xd2, 0x2e, 0xac, + 0x36, 0x9d, 0xe0, 0xed, 0xb7, 0x1e, 0xd2, 0xfd, 0x83, 0xf3, 0x94, 0x9c, 0x6b, 0x63, 0x1d, 0xae, + 0x08, 0x85, 0x51, 0xd8, 0xd0, 0x72, 0x88, 0x4f, 0x8f, 0xd5, 0xa5, 0x22, 0x14, 0xce, 0xd5, 0x0d, + 0x99, 0xd4, 0x35, 0xc8, 0x75, 0x6c, 0x3d, 0xd8, 0x71, 0xbd, 0x01, 0x52, 0xa1, 0xa8, 0x7b, 0xc6, + 0xae, 0x15, 0x10, 0x23, 0x18, 0x79, 0xd2, 0x06, 0x8c, 0xc1, 0xd0, 0x02, 0x24, 0x5d, 0x3e, 0xdd, + 0x7c, 0x35, 0x7b, 0x7a, 0xb2, 0x9c, 0x6c, 0x77, 0x71, 0xd2, 0xf5, 0xd5, 0xf7, 0xe0, 0x4a, 0xc7, + 0x1e, 0xf5, 0x2d, 0xa7, 0x4e, 0x7c, 0xc3, 0xb3, 0x86, 0x74, 0x8e, 0xf4, 0x6c, 0x50, 0x4b, 0x2a, + 0xcf, 0x06, 0xfd, 0x0e, 0x0d, 0x4c, 0x32, 0x32, 0x30, 0xea, 0xcf, 0x27, 0xe1, 0x4a, 0xc3, 0xe9, + 0x5b, 0x0e, 0x89, 0x73, 0x5f, 0x87, 0x19, 0xc2, 0x80, 0xda, 0x3e, 0x37, 0x7a, 0x42, 0x4e, 0x89, + 0x43, 0xa5, 0x25, 0x6c, 0x9e, 0xb1, 0x4e, 0x6f, 0x4c, 0x5a, 0x84, 0x27, 0xa4, 0x4f, 0xb4, 0x51, + 0x0d, 0x98, 0x1e, 0xb2, 0x49, 0xf8, 0x62, 0x93, 0x5d, 0x9f, 0x24, 0xeb, 0x89, 0x79, 0x4a, 0x53, + 0x25, 0x78, 0x3f, 0x8d, 0xa9, 0xfa, 0xd5, 0x14, 0xcc, 0xb6, 0x5c, 0x73, 0x4c, 0x0f, 0x65, 0xc8, + 0xed, 0xba, 0x7e, 0x10, 0x33, 0xcb, 0x61, 0x1b, 0xdd, 0x85, 0xdc, 0x50, 0x2c, 0x9f, 0xd8, 0x83, + 0xd7, 0x26, 0x0f, 0x99, 0xd3, 0xe0, 0x90, 0x1a, 0xbd, 0x07, 0x79, 0x79, 0x70, 0xe5, 0xee, 0xbb, + 0x64, 0xfb, 0x46, 0xf4, 0xe8, 0x7d, 0xc8, 0xf2, 0x45, 0x10, 0x9b, 0xee, 0xfa, 0x53, 0xe9, 0x1c, + 0x0b, 0x26, 0x74, 0x1f, 0x72, 0x81, 0xed, 0x6b, 0x96, 0xb3, 0xe3, 0x2e, 0x66, 0x98, 0x80, 0xe5, + 0x89, 0xa6, 0xce, 0x35, 0x49, 0x6f, 0xa3, 0xdb, 0x74, 0x76, 0xdc, 0x6a, 0xe1, 0xf4, 0x64, 0x79, + 0x5a, 0x34, 0xf0, 0x74, 0x60, 0xfb, 0xf4, 0x03, 0x5d, 0x83, 0xf4, 0x8e, 0x35, 0xf4, 0x17, 0xb3, + 0x2b, 0x89, 0x1b, 0xb9, 0x6a, 0xee, 0xf4, 0x64, 0x39, 0xbd, 0xd6, 0xec, 0x74, 0x31, 0x83, 0xd2, + 0x6e, 0x0c, 0xdf, 0xe2, 0xdd, 0x4c, 0xb3, 0xf5, 0x3c, 0xb7, 0x9b, 0x5a, 0xb7, 0x19, 0x75, 0x23, + 0x1a, 0x78, 0xda, 0xf0, 0x2d, 0xfa, 0xa1, 0xfe, 0x4a, 0x02, 0x0a, 0xb1, 0xc1, 0xa0, 0x17, 0x01, + 0x02, 0x6f, 0xe4, 0x07, 0x9a, 0xe7, 0xba, 0x01, 0x5b, 0x93, 0x22, 0xce, 0x33, 0x08, 0x76, 0xdd, + 0x00, 0xad, 0xc2, 0x9c, 0x41, 0xbc, 0x40, 0xb3, 0x7c, 0x7f, 0x44, 0x3c, 0xcd, 0x1f, 0x6d, 0x7f, + 0x44, 0x8c, 0x80, 0xad, 0x4f, 0x11, 0x5f, 0xa1, 0xa8, 0x26, 0xc3, 0x74, 0x39, 0x02, 0xbd, 0x09, + 0x0b, 0x71, 0xfa, 0xe1, 0x68, 0xdb, 0xb6, 0x0c, 0x8d, 0xee, 0x99, 0x14, 0x63, 0x99, 0x8b, 0x58, + 0x3a, 0x0c, 0xf7, 0x80, 0x1c, 0xaa, 0xdf, 0x15, 0x63, 0x12, 0x83, 0x45, 0xcb, 0x50, 0xe0, 0xfb, + 0x4f, 0x8b, 0x6d, 0x14, 0xe0, 0x20, 0x7a, 0x67, 0xa0, 0x97, 0x61, 0xda, 0x71, 0x4d, 0xa2, 0x59, + 0xa6, 0x38, 0xbe, 0x70, 0x7a, 0xb2, 0x9c, 0xa5, 0x22, 0x9a, 0x75, 0x9c, 0xa5, 0xa8, 0xa6, 0x89, + 0x6e, 0xc1, 0xfc, 0x40, 0x7f, 0xac, 0xed, 0xbb, 0xf6, 0x68, 0x40, 0x7c, 0x6d, 0x48, 0x3c, 0x8d, + 0x62, 0xd8, 0x40, 0x52, 0xf8, 0xca, 0x40, 0x7f, 0xfc, 0x90, 0xa3, 0x3a, 0xc4, 0xa3, 0xac, 0x68, + 0x13, 0xe6, 0x74, 0xc3, 0x20, 0xbe, 0x6f, 0x6d, 0xdb, 0x44, 0x0b, 0xdc, 0xa1, 0x6b, 0xbb, 0xfd, + 0x43, 0xb1, 0x2d, 0x26, 0xee, 0xc5, 0x9e, 0xa0, 0xc1, 0x28, 0x62, 0x94, 0x30, 0xf5, 0x7b, 0x09, + 0x50, 0xb0, 0xbe, 0x13, 0x6c, 0x92, 0xc1, 0x36, 0xf1, 0xba, 0x81, 0x1e, 0x8c, 0x7c, 0xb4, 0x00, + 0x59, 0x9b, 0xe8, 0x26, 0xf1, 0xd8, 0xac, 0x72, 0x58, 0xb4, 0xd0, 0x16, 0x35, 0xc2, 0xba, 0xb1, + 0xab, 0x6f, 0x5b, 0xb6, 0x15, 0x1c, 0xb2, 0x69, 0xcd, 0x4c, 0x3e, 0xff, 0x67, 0x65, 0xae, 0xe2, + 0x18, 0x23, 0x1e, 0x13, 0x83, 0x16, 0x61, 0x7a, 0x40, 0x7c, 0x5f, 0xef, 0xf3, 0x69, 0xe7, 0xb1, + 0x6c, 0xaa, 0xef, 0x41, 0x31, 0xce, 0x87, 0x0a, 0x30, 0xbd, 0xd5, 0x7a, 0xd0, 0x6a, 0x3f, 0x6a, + 0x29, 0x53, 0x68, 0x16, 0x0a, 0x5b, 0x2d, 0xdc, 0xa8, 0xd4, 0xd6, 0x2b, 0xd5, 0x8d, 0x86, 0x92, + 0x40, 0x25, 0xc8, 0x47, 0xcd, 0xa4, 0xfa, 0x47, 0x09, 0x00, 0xaa, 0x32, 0x31, 0xa9, 0x77, 0x21, + 0xe3, 0x07, 0x7a, 0xc0, 0x57, 0x6a, 0xe6, 0xce, 0x2b, 0xe7, 0xed, 0x4c, 0x31, 0x5e, 0xfa, 0x8f, + 0x60, 0xce, 0x12, 0x1f, 0x61, 0x72, 0x6c, 0x84, 0xd4, 0xba, 0xea, 0xa6, 0xe9, 0x89, 0x81, 0xb3, + 0x6f, 0xf5, 0x3d, 0xc8, 0x30, 0xee, 0xf1, 0xe1, 0xe6, 0x20, 0x5d, 0xa7, 0x5f, 0x09, 0x94, 0x87, + 0x0c, 0x6e, 0x54, 0xea, 0x1f, 0x2a, 0x49, 0xa4, 0x40, 0xb1, 0xde, 0xec, 0xd6, 0xda, 0xad, 0x56, + 0xa3, 0xd6, 0x6b, 0xd4, 0x95, 0x94, 0x7a, 0x1d, 0x32, 0xcd, 0x01, 0x95, 0x7c, 0x8d, 0xda, 0x8b, + 0x1d, 0xe2, 0x11, 0xc7, 0x90, 0xbb, 0x2b, 0x02, 0xa8, 0xff, 0x3a, 0x03, 0x99, 0x4d, 0x77, 0xe4, + 0x04, 0xe8, 0x4e, 0xcc, 0xe6, 0xcf, 0x4c, 0x76, 0xf2, 0x18, 0xe1, 0x6a, 0xef, 0x70, 0x48, 0xc4, + 0x9d, 0xb0, 0x00, 0x59, 0x6e, 0x59, 0xc4, 0x74, 0x44, 0x8b, 0xc2, 0x03, 0xdd, 0xeb, 0x93, 0x40, + 0xcc, 0x47, 0xb4, 0xd0, 0x0d, 0xea, 0x74, 0xe8, 0xa6, 0xeb, 0xd8, 0x7c, 0xa7, 0xe5, 0xb8, 0x67, + 0x81, 0x89, 0x6e, 0xb6, 0x1d, 0xfb, 0x10, 0x87, 0x58, 0x74, 0x1f, 0x0a, 0x86, 0xeb, 0xf8, 0x96, + 0x1f, 0x10, 0xc7, 0x38, 0x5c, 0xcc, 0xb1, 0x41, 0x5d, 0x3f, 0x7f, 0x50, 0xb5, 0x88, 0x18, 0xc7, + 0x39, 0xd1, 0x3a, 0x14, 0xb7, 0x2d, 0xc7, 0xd4, 0xdc, 0x21, 0xbf, 0xf0, 0x33, 0xe7, 0xdb, 0x3d, + 0x2e, 0xa9, 0x6a, 0x39, 0x66, 0x9b, 0x13, 0xe3, 0xc2, 0x76, 0xd4, 0x40, 0x2d, 0x98, 0xe1, 0xc7, + 0x2b, 0x94, 0x95, 0x65, 0xb2, 0x5e, 0x3d, 0x5f, 0x16, 0x3f, 0x73, 0x52, 0x5a, 0x69, 0x3f, 0xde, + 0x44, 0x0f, 0xa0, 0x14, 0x0c, 0x86, 0x3b, 0x7e, 0x28, 0x6e, 0x9a, 0x89, 0xfb, 0xcc, 0x05, 0x9a, + 0xa7, 0xe4, 0x52, 0x5a, 0x31, 0x88, 0xb5, 0xca, 0xbf, 0x99, 0x81, 0x42, 0x6c, 0xe4, 0xa8, 0x0b, + 0x85, 0xa1, 0xe7, 0x0e, 0xf5, 0x3e, 0x73, 0x5a, 0xc4, 0xa2, 0xbe, 0xf1, 0x54, 0xb3, 0x5e, 0xed, + 0x44, 0x8c, 0x38, 0x2e, 0x05, 0xbd, 0x05, 0x45, 0xc7, 0x75, 0x3c, 0x62, 0x8c, 0x3c, 0xdf, 0xda, + 0xe7, 0x8b, 0x9e, 0xab, 0x2a, 0xa7, 0x27, 0xcb, 0xc5, 0x96, 0xeb, 0x60, 0x09, 0xc7, 0x63, 0x54, + 0xe8, 0x1e, 0x28, 0x86, 0x47, 0xf4, 0x80, 0x0c, 0x68, 0x4f, 0x43, 0xd7, 0x72, 0xf8, 0xb6, 0xc8, + 0x55, 0xe7, 0x4f, 0x4f, 0x96, 0x95, 0x1a, 0xc3, 0x6d, 0x86, 0x38, 0xfc, 0x04, 0x35, 0xda, 0x80, + 0x79, 0xb9, 0x31, 0xc6, 0xfa, 0xe7, 0x5b, 0x68, 0xf1, 0xf4, 0x64, 0x79, 0x5e, 0x6e, 0xa1, 0xb1, + 0x71, 0x4c, 0xe4, 0x42, 0x18, 0x16, 0x24, 0x7c, 0xc7, 0xf5, 0x0c, 0x12, 0xc9, 0xcb, 0x30, 0x79, + 0xe5, 0xd3, 0x93, 0xe5, 0x05, 0x29, 0x6f, 0xcd, 0x65, 0x8e, 0xa7, 0x94, 0x78, 0x0e, 0xa7, 0x7a, + 0x9c, 0x84, 0x42, 0x4c, 0x6d, 0xe8, 0x26, 0xe4, 0x70, 0x07, 0x37, 0x1f, 0x56, 0x7a, 0x0d, 0x65, + 0xaa, 0x7c, 0xed, 0xe8, 0x78, 0x65, 0x91, 0xcd, 0x30, 0xae, 0xda, 0x8e, 0x67, 0xed, 0xd3, 0xd3, + 0x7d, 0x03, 0xa6, 0x25, 0x69, 0xa2, 0xfc, 0xc2, 0xd1, 0xf1, 0xca, 0xf3, 0x67, 0x49, 0x63, 0x94, + 0xb8, 0xbb, 0x5e, 0xc1, 0x8d, 0xba, 0x92, 0x9c, 0x4c, 0x89, 0xbb, 0xbb, 0xba, 0x47, 0x4c, 0xf4, + 0x19, 0xc8, 0x0a, 0xc2, 0x54, 0xb9, 0x7c, 0x74, 0xbc, 0xb2, 0x70, 0x96, 0x30, 0xa2, 0xc3, 0xdd, + 0x8d, 0xca, 0xc3, 0x86, 0x92, 0x9e, 0x4c, 0x87, 0xbb, 0xb6, 0xbe, 0x4f, 0xd0, 0x2b, 0x90, 0xe1, + 0x64, 0x99, 0xf2, 0xd5, 0xa3, 0xe3, 0x95, 0xe7, 0x9e, 0x10, 0x47, 0xa9, 0xca, 0x8b, 0xbf, 0xf0, + 0xbb, 0x4b, 0x53, 0x7f, 0xf6, 0xcd, 0x25, 0xe5, 0x2c, 0xba, 0xfc, 0x3f, 0x09, 0x28, 0x8d, 0x1d, + 0x06, 0xa4, 0x42, 0xd6, 0x71, 0x0d, 0x77, 0xc8, 0xfd, 0xab, 0x9c, 0xbc, 0xd4, 0x6a, 0xee, 0xf0, + 0x10, 0x0b, 0x0c, 0x7a, 0x70, 0xc6, 0x43, 0x7c, 0xf3, 0x29, 0x4f, 0xda, 0x44, 0x1f, 0xf1, 0x03, + 0x28, 0x99, 0x9e, 0xb5, 0x4f, 0x3c, 0xcd, 0x70, 0x9d, 0x1d, 0xab, 0x2f, 0x7c, 0xa7, 0xf2, 0xc4, + 0x60, 0x8a, 0x11, 0xe2, 0x22, 0x67, 0xa8, 0x31, 0xfa, 0x4f, 0xe1, 0x1d, 0x96, 0x87, 0x50, 0x8c, + 0x9f, 0x5d, 0xea, 0x87, 0xf8, 0xd6, 0x4f, 0x11, 0x11, 0x42, 0xb0, 0x18, 0x0b, 0xe7, 0x29, 0x84, + 0x47, 0x09, 0xaf, 0x42, 0x7a, 0x40, 0x2f, 0x6f, 0x2a, 0xa7, 0x54, 0x9d, 0xa3, 0x4e, 0xea, 0xf7, + 0x4f, 0x96, 0x0b, 0xae, 0xbf, 0xba, 0x66, 0xd9, 0x64, 0xd3, 0x35, 0x09, 0x66, 0x04, 0xf4, 0x3e, + 0x91, 0xc6, 0x43, 0xdc, 0x78, 0xa2, 0xa9, 0xfe, 0x79, 0x02, 0xd2, 0xd4, 0x50, 0xa3, 0x17, 0x20, + 0x5d, 0x6d, 0xb6, 0xea, 0xca, 0x54, 0xf9, 0xca, 0xd1, 0xf1, 0x4a, 0x89, 0x69, 0x8b, 0x22, 0xe8, + 0x81, 0x47, 0xcb, 0x90, 0x7d, 0xd8, 0xde, 0xd8, 0xda, 0xa4, 0x3b, 0x6f, 0xee, 0xe8, 0x78, 0x65, + 0x36, 0x44, 0x73, 0x7d, 0xa2, 0x17, 0x21, 0xd3, 0xdb, 0xec, 0xac, 0x75, 0x95, 0x64, 0x19, 0x1d, + 0x1d, 0xaf, 0xcc, 0x84, 0x78, 0x36, 0x1d, 0xf4, 0x12, 0x64, 0x5a, 0x9d, 0x66, 0xa7, 0xa1, 0xa4, + 0xca, 0x0b, 0x47, 0xc7, 0x2b, 0x28, 0x44, 0xb3, 0x60, 0xb7, 0x63, 0x0d, 0x09, 0x7a, 0x09, 0xa6, + 0x6b, 0x1b, 0x5b, 0xdd, 0x5e, 0x03, 0x2b, 0xe9, 0xf2, 0xfc, 0xd1, 0xf1, 0x8a, 0x12, 0x12, 0xd5, + 0xec, 0x91, 0x1f, 0x10, 0xaf, 0x7c, 0x45, 0x6c, 0x9b, 0x7c, 0x88, 0x51, 0xbf, 0x93, 0x80, 0x42, + 0xcc, 0xa4, 0xd3, 0x9d, 0x5f, 0x6f, 0xac, 0x55, 0xb6, 0x36, 0x7a, 0xca, 0x54, 0x6c, 0xe7, 0xc7, + 0x48, 0xea, 0x64, 0x47, 0x1f, 0xd9, 0xf4, 0x8a, 0x81, 0x5a, 0xbb, 0xd5, 0x6d, 0x76, 0x7b, 0x8d, + 0x56, 0x4f, 0x49, 0x94, 0x17, 0x8f, 0x8e, 0x57, 0xe6, 0xcf, 0x12, 0xaf, 0x8d, 0x6c, 0x9b, 0xee, + 0xfd, 0x5a, 0xa5, 0xb6, 0xce, 0x0e, 0x53, 0xb4, 0xf7, 0x63, 0x54, 0x35, 0xdd, 0xd8, 0x25, 0x26, + 0x7a, 0x1d, 0xf2, 0xf5, 0xc6, 0x46, 0xe3, 0x7e, 0x85, 0x5d, 0xac, 0xe5, 0x17, 0x8f, 0x8e, 0x57, + 0xae, 0x3e, 0xd9, 0xbb, 0x4d, 0xfa, 0x7a, 0x40, 0xcc, 0x33, 0x67, 0x20, 0x46, 0xa2, 0xfe, 0x67, + 0x12, 0x4a, 0x98, 0xf8, 0x81, 0xee, 0x05, 0x1d, 0xd7, 0xb6, 0x8c, 0x43, 0xd4, 0x81, 0xbc, 0xe1, + 0x3a, 0xa6, 0x15, 0x33, 0xd1, 0x77, 0xce, 0x71, 0xe5, 0x23, 0x2e, 0xd9, 0xaa, 0x49, 0x4e, 0x1c, + 0x09, 0x41, 0xb7, 0x20, 0x63, 0x12, 0x5b, 0x3f, 0x14, 0x31, 0xc5, 0xd5, 0x27, 0x62, 0xca, 0xba, + 0x48, 0x67, 0x61, 0x4e, 0xc7, 0x22, 0x78, 0xfd, 0xb1, 0xa6, 0x07, 0x01, 0x19, 0x0c, 0x03, 0xbe, + 0x8d, 0xd2, 0xb8, 0x30, 0xd0, 0x1f, 0x57, 0x04, 0x08, 0xbd, 0x01, 0xd9, 0x03, 0xcb, 0x31, 0xdd, + 0x03, 0xe1, 0x1c, 0x5e, 0x20, 0x54, 0x10, 0xaa, 0x47, 0xd4, 0x1b, 0x3c, 0x33, 0x4c, 0xba, 0x13, + 0x5b, 0xed, 0x56, 0x43, 0xee, 0x44, 0x81, 0x6f, 0x3b, 0x2d, 0xd7, 0xa1, 0x06, 0x06, 0xda, 0x2d, + 0x6d, 0xad, 0xd2, 0xdc, 0xd8, 0xc2, 0x74, 0x37, 0xb2, 0x9d, 0x12, 0x92, 0xac, 0xe9, 0x96, 0x4d, + 0x83, 0xd8, 0xab, 0x90, 0xaa, 0xb4, 0x3e, 0x54, 0x92, 0x65, 0xe5, 0xe8, 0x78, 0xa5, 0x18, 0xa2, + 0x2b, 0xce, 0x61, 0xa4, 0xf7, 0xb3, 0xfd, 0xaa, 0x7f, 0x93, 0x82, 0xe2, 0xd6, 0xd0, 0xd4, 0x03, + 0xc2, 0x0f, 0x32, 0x5a, 0x81, 0xc2, 0x50, 0xf7, 0x74, 0xdb, 0x26, 0xb6, 0xe5, 0x0f, 0x44, 0x22, + 0x2e, 0x0e, 0x42, 0xef, 0x3c, 0xad, 0x1a, 0xab, 0x39, 0x7a, 0x38, 0xbf, 0xf1, 0xcf, 0xcb, 0x09, + 0xa9, 0xd0, 0x2d, 0x98, 0xd9, 0xe1, 0xa3, 0xd5, 0x74, 0x83, 0x2d, 0x6c, 0x8a, 0x2d, 0xec, 0xea, + 0xa4, 0x85, 0x8d, 0x0f, 0x6b, 0x55, 0x4c, 0xb2, 0xc2, 0xb8, 0x70, 0x69, 0x27, 0xde, 0x44, 0x6f, + 0xc2, 0xf4, 0xc0, 0x75, 0xac, 0xc0, 0xf5, 0x2e, 0x5f, 0x05, 0x49, 0x89, 0x6e, 0x02, 0x75, 0xfc, + 0x35, 0x39, 0x1e, 0x86, 0x66, 0x97, 0x5c, 0x12, 0xcf, 0x0e, 0xf4, 0xc7, 0xa2, 0x43, 0x4c, 0xc1, + 0xa8, 0x0a, 0x19, 0xd7, 0xa3, 0xae, 0x7a, 0x96, 0x0d, 0xf7, 0xf5, 0x4b, 0x87, 0xcb, 0x1b, 0x6d, + 0xca, 0x83, 0x39, 0xab, 0xfa, 0x36, 0x94, 0xc6, 0x26, 0x41, 0x3d, 0xd4, 0x4e, 0x65, 0xab, 0xdb, + 0x50, 0xa6, 0x50, 0x11, 0x72, 0xb5, 0x76, 0xab, 0xd7, 0x6c, 0x6d, 0x51, 0x17, 0xbb, 0x08, 0x39, + 0xdc, 0xde, 0xd8, 0xa8, 0x56, 0x6a, 0x0f, 0x94, 0xa4, 0xba, 0x0a, 0x85, 0x98, 0x34, 0x34, 0x03, + 0xd0, 0xed, 0xb5, 0x3b, 0xda, 0x5a, 0x13, 0x77, 0x7b, 0xdc, 0x41, 0xef, 0xf6, 0x2a, 0xb8, 0x27, + 0x00, 0x09, 0xf5, 0xdf, 0x93, 0x72, 0x45, 0x85, 0x4f, 0x5e, 0x1d, 0xf7, 0xc9, 0x2f, 0x18, 0xbc, + 0xf0, 0xca, 0xa3, 0x46, 0xe8, 0x9b, 0xbf, 0x03, 0xc0, 0x36, 0x0e, 0x31, 0x35, 0x3d, 0x10, 0x0b, + 0x5f, 0x7e, 0x42, 0xc9, 0x3d, 0x99, 0x2f, 0xc6, 0x79, 0x41, 0x5d, 0x09, 0xd0, 0xfb, 0x50, 0x34, + 0xdc, 0xc1, 0xd0, 0x26, 0x82, 0x39, 0x75, 0x29, 0x73, 0x21, 0xa4, 0xaf, 0x04, 0xf1, 0xa8, 0x20, + 0x3d, 0x1e, 0xb7, 0xfc, 0x5c, 0x42, 0x6a, 0x66, 0x42, 0x20, 0x50, 0x84, 0xdc, 0x56, 0xa7, 0x5e, + 0xe9, 0x35, 0x5b, 0xf7, 0x95, 0x04, 0x02, 0xc8, 0x32, 0x55, 0xd7, 0x95, 0x24, 0x0d, 0x60, 0x6a, + 0xed, 0xcd, 0xce, 0x46, 0x83, 0x59, 0x2c, 0x34, 0x0f, 0x8a, 0x54, 0xb6, 0xc6, 0x14, 0xd9, 0xa8, + 0x2b, 0x69, 0x34, 0x07, 0xb3, 0x21, 0x54, 0x70, 0x66, 0xd0, 0x02, 0xa0, 0x10, 0x18, 0x89, 0xc8, + 0xaa, 0x3f, 0x03, 0xb3, 0x35, 0xd7, 0x09, 0x74, 0xcb, 0x09, 0x83, 0xbb, 0x3b, 0x74, 0xd2, 0x02, + 0x44, 0x63, 0x53, 0x76, 0x11, 0x56, 0x67, 0x4f, 0x4f, 0x96, 0x0b, 0x21, 0x69, 0xb3, 0xce, 0x9c, + 0x71, 0xd1, 0x30, 0xe9, 0xf9, 0x1d, 0x8a, 0x30, 0x36, 0x53, 0x9d, 0x3e, 0x3d, 0x59, 0x4e, 0x75, + 0x9a, 0x75, 0x4c, 0x61, 0xe8, 0x05, 0xc8, 0x93, 0xc7, 0x56, 0xa0, 0x19, 0x32, 0x6a, 0xcd, 0xe0, + 0x1c, 0x05, 0xd4, 0x5c, 0x93, 0xa8, 0x55, 0x80, 0x8e, 0xeb, 0x05, 0xa2, 0xe7, 0xb7, 0x20, 0x33, + 0x74, 0x3d, 0x96, 0xf9, 0x3b, 0x37, 0x1f, 0x4d, 0xc9, 0xf9, 0x46, 0xc5, 0x9c, 0x58, 0xfd, 0xf5, + 0x14, 0x40, 0x4f, 0xf7, 0xf7, 0x84, 0x90, 0xbb, 0x90, 0x0f, 0x73, 0xff, 0x22, 0x85, 0x78, 0xe1, + 0x6a, 0x87, 0xc4, 0xe8, 0x4d, 0xb9, 0xd9, 0x78, 0xd8, 0x3a, 0x31, 0xf9, 0x22, 0x3b, 0x9a, 0x14, + 0xf9, 0x8d, 0xc7, 0xa6, 0xd4, 0x8f, 0x20, 0x9e, 0x27, 0x56, 0x9e, 0x7e, 0xa2, 0x1a, 0xbb, 0x16, + 0xb8, 0xd2, 0x44, 0xbc, 0x32, 0x31, 0x69, 0x7a, 0x66, 0x45, 0xd6, 0xa7, 0x70, 0xc4, 0x87, 0x3e, + 0x80, 0x02, 0x9d, 0xb7, 0xe6, 0x33, 0x9c, 0x08, 0x55, 0xce, 0x55, 0x15, 0x97, 0x80, 0x61, 0x18, + 0x69, 0xf9, 0x45, 0x00, 0x7d, 0x38, 0xb4, 0x2d, 0x62, 0x6a, 0xdb, 0x87, 0x2c, 0x36, 0xc9, 0xe3, + 0xbc, 0x80, 0x54, 0x0f, 0xe9, 0x71, 0x91, 0x68, 0x3d, 0x60, 0xf1, 0xd9, 0x25, 0x0a, 0x14, 0xd4, + 0x95, 0xa0, 0xaa, 0xc0, 0x8c, 0x37, 0x72, 0xa8, 0x42, 0xc5, 0xe8, 0xd4, 0x3f, 0x4c, 0xc2, 0xf3, + 0x2d, 0x12, 0x1c, 0xb8, 0xde, 0x5e, 0x25, 0x08, 0x74, 0x63, 0x77, 0x40, 0x1c, 0xb1, 0x7c, 0xb1, + 0x58, 0x32, 0x31, 0x16, 0x4b, 0x2e, 0xc2, 0xb4, 0x6e, 0x5b, 0xba, 0x4f, 0xb8, 0x77, 0x98, 0xc7, + 0xb2, 0x49, 0x23, 0x5e, 0x1a, 0x3f, 0x13, 0xdf, 0x27, 0x3c, 0x1f, 0x48, 0x07, 0x2e, 0x01, 0xe8, + 0x6b, 0xb0, 0x20, 0xfc, 0x40, 0x3d, 0xec, 0x8a, 0x86, 0x60, 0xf2, 0x79, 0xa3, 0x31, 0x31, 0xa0, + 0x9f, 0x3c, 0x38, 0xe1, 0x28, 0x46, 0xe0, 0xf6, 0x30, 0x10, 0x6e, 0xe7, 0xbc, 0x39, 0x01, 0x55, + 0xbe, 0x0f, 0x57, 0xcf, 0x65, 0x79, 0xa6, 0x7c, 0xe3, 0x77, 0x93, 0x00, 0xcd, 0x4e, 0x65, 0x53, + 0x28, 0xa9, 0x0e, 0xd9, 0x1d, 0x7d, 0x60, 0xd9, 0x87, 0x17, 0x59, 0xc0, 0x88, 0x7e, 0xb5, 0xc2, + 0xd5, 0xb1, 0xc6, 0x78, 0xb0, 0xe0, 0x65, 0xe1, 0xfc, 0x68, 0xdb, 0x21, 0x41, 0x18, 0xce, 0xb3, + 0x16, 0x1d, 0x86, 0xa7, 0x3b, 0xe1, 0xd6, 0xe5, 0x0d, 0xba, 0x00, 0xd4, 0xe5, 0x39, 0xd0, 0x0f, + 0xa5, 0xd9, 0x12, 0x4d, 0xb4, 0xce, 0xde, 0x16, 0x88, 0xb7, 0x4f, 0xcc, 0xc5, 0x0c, 0x53, 0xea, + 0x65, 0xe3, 0xc1, 0x82, 0x9c, 0xeb, 0x2e, 0xe4, 0x2e, 0xbf, 0xc7, 0x5c, 0xa6, 0x08, 0xf5, 0x4c, + 0x3a, 0xba, 0x0d, 0xa5, 0xb1, 0x79, 0x3e, 0x91, 0x47, 0x69, 0x76, 0x1e, 0xbe, 0xa5, 0xa4, 0xc5, + 0xd7, 0xdb, 0x4a, 0x56, 0xfd, 0xab, 0x14, 0x37, 0x34, 0x42, 0xab, 0x93, 0xdf, 0xd4, 0x72, 0x6c, + 0x77, 0x1b, 0xae, 0x2d, 0x0c, 0xc0, 0xab, 0x17, 0xdb, 0x1f, 0x1a, 0x4e, 0x33, 0x72, 0x1c, 0x32, + 0xa2, 0x65, 0x28, 0xf0, 0x5d, 0xac, 0xd1, 0x03, 0xc7, 0xd4, 0x5a, 0xc2, 0xc0, 0x41, 0x94, 0x13, + 0x5d, 0x87, 0x19, 0x96, 0x4d, 0xf4, 0x77, 0x89, 0xc9, 0x69, 0xd2, 0x8c, 0xa6, 0x14, 0x42, 0x19, + 0xd9, 0x26, 0x14, 0x05, 0x40, 0x63, 0x01, 0x43, 0x86, 0x0d, 0xe8, 0xe6, 0x65, 0x03, 0xe2, 0x2c, + 0x2c, 0x8e, 0x28, 0x0c, 0xa3, 0x86, 0xfa, 0x13, 0x90, 0x93, 0x83, 0x45, 0x8b, 0x90, 0xea, 0xd5, + 0x3a, 0xca, 0x54, 0x79, 0xf6, 0xe8, 0x78, 0xa5, 0x20, 0xc1, 0xbd, 0x5a, 0x87, 0x62, 0xb6, 0xea, + 0x1d, 0x25, 0x31, 0x8e, 0xd9, 0xaa, 0x77, 0x50, 0x19, 0xd2, 0xdd, 0x5a, 0xaf, 0x23, 0xfd, 0x33, + 0x89, 0xa2, 0xb0, 0x72, 0x9a, 0xfa, 0x67, 0xea, 0x0e, 0x14, 0x62, 0xbd, 0xa3, 0x97, 0x61, 0xba, + 0xd9, 0xba, 0x8f, 0x1b, 0xdd, 0xae, 0x32, 0xc5, 0x23, 0x88, 0x18, 0xb6, 0xe9, 0xf4, 0xe9, 0xda, + 0xa1, 0x17, 0x21, 0xbd, 0xde, 0xa6, 0xf7, 0x3e, 0x0f, 0x51, 0x62, 0x14, 0xeb, 0xae, 0x1f, 0x94, + 0xe7, 0x84, 0xe3, 0x17, 0x17, 0xac, 0xfe, 0x46, 0x02, 0xb2, 0xfc, 0xa0, 0x4d, 0x5c, 0xc4, 0x4a, + 0x14, 0x37, 0xf1, 0xc8, 0xf2, 0xd5, 0xf3, 0xa3, 0xc0, 0x55, 0x11, 0xb4, 0xf1, 0xad, 0x29, 0xf9, + 0xca, 0xef, 0x42, 0x31, 0x8e, 0x78, 0xa6, 0x8d, 0xf9, 0x35, 0x28, 0xd0, 0xbd, 0x2f, 0xa3, 0xc1, + 0x3b, 0x90, 0xe5, 0xc6, 0x22, 0xbc, 0x87, 0xce, 0x0f, 0x49, 0x05, 0x25, 0xba, 0x0b, 0xd3, 0x3c, + 0x8c, 0x95, 0x2f, 0x1e, 0x4b, 0x17, 0x9f, 0x30, 0x2c, 0xc9, 0xd5, 0x0f, 0x20, 0xdd, 0x21, 0xc4, + 0x8b, 0xa7, 0x95, 0x13, 0xe7, 0xa6, 0x95, 0x65, 0x5a, 0x32, 0x19, 0x4b, 0x4b, 0xf6, 0xa0, 0xf8, + 0x88, 0x58, 0xfd, 0xdd, 0x80, 0x98, 0x4c, 0xd0, 0xeb, 0x90, 0x1e, 0x92, 0x70, 0xf0, 0x8b, 0x13, + 0x37, 0x1f, 0x21, 0x1e, 0x66, 0x54, 0xd4, 0xc6, 0x1c, 0x30, 0x6e, 0xf1, 0x58, 0x28, 0x5a, 0xea, + 0xdf, 0x26, 0x61, 0xa6, 0xe9, 0xfb, 0x23, 0xdd, 0x31, 0xa4, 0x57, 0xf7, 0xc5, 0x71, 0xaf, 0x6e, + 0xe2, 0xab, 0xea, 0x38, 0xcb, 0x78, 0xb6, 0x55, 0xdc, 0xac, 0xc9, 0xf0, 0x66, 0x55, 0xff, 0x2d, + 0x21, 0x53, 0xaa, 0xd7, 0x63, 0xa6, 0x80, 0xc7, 0x88, 0x71, 0x49, 0x64, 0xcb, 0xd9, 0x73, 0xdc, + 0x03, 0x87, 0x06, 0xb8, 0xb8, 0xd1, 0x6a, 0x3c, 0x52, 0x12, 0x7c, 0x7b, 0x8e, 0x11, 0x61, 0xe2, + 0x90, 0x03, 0x2a, 0xa9, 0xd3, 0x68, 0xd5, 0xa9, 0x17, 0x96, 0x9c, 0x20, 0xa9, 0x43, 0x1c, 0xd3, + 0x72, 0xfa, 0xe8, 0x65, 0xc8, 0x36, 0xbb, 0xdd, 0x2d, 0x16, 0x42, 0x3e, 0x7f, 0x74, 0xbc, 0x32, + 0x37, 0x46, 0xc5, 0x1e, 0x09, 0x4c, 0x4a, 0x44, 0x43, 0x20, 0xea, 0x9f, 0x4d, 0x20, 0xa2, 0xbe, + 0x35, 0x27, 0xc2, 0xed, 0x5e, 0xa5, 0xd7, 0x50, 0x32, 0x13, 0x88, 0xb0, 0x4b, 0xff, 0x8a, 0xe3, + 0xf6, 0x8f, 0x49, 0x50, 0x2a, 0x86, 0x41, 0x86, 0x01, 0xc5, 0x8b, 0xa8, 0xb3, 0x07, 0xb9, 0x21, + 0xfd, 0xb2, 0x88, 0xf4, 0xa0, 0xee, 0x4e, 0xac, 0x0b, 0x38, 0xc3, 0xb7, 0x8a, 0x5d, 0x9b, 0x54, + 0xcc, 0x81, 0xe5, 0xfb, 0x96, 0xeb, 0x70, 0x18, 0x0e, 0x25, 0x95, 0xff, 0x23, 0x01, 0x73, 0x13, + 0x28, 0xd0, 0x6d, 0x48, 0x7b, 0xae, 0x2d, 0xd7, 0xf0, 0xda, 0x79, 0xd9, 0x72, 0xca, 0x8a, 0x19, + 0x25, 0x5a, 0x02, 0xd0, 0x47, 0x81, 0xab, 0xb3, 0xfe, 0x79, 0x8e, 0x11, 0xc7, 0x20, 0xe8, 0x11, + 0x64, 0x7d, 0x62, 0x78, 0x44, 0xfa, 0xd9, 0x1f, 0xfc, 0xa8, 0xa3, 0x5f, 0xed, 0x32, 0x31, 0x58, + 0x88, 0x2b, 0xaf, 0x42, 0x96, 0x43, 0xe8, 0xb6, 0x37, 0xf5, 0x40, 0x17, 0x2f, 0x44, 0xec, 0x9b, + 0xee, 0x26, 0xdd, 0xee, 0xcb, 0xdd, 0xa4, 0xdb, 0x7d, 0xf5, 0x2f, 0x93, 0x00, 0x8d, 0xc7, 0x01, + 0xf1, 0x1c, 0xdd, 0xae, 0x55, 0x50, 0x23, 0x76, 0x33, 0xf0, 0xd9, 0xbe, 0x36, 0xf1, 0x75, 0x2d, + 0xe4, 0x58, 0xad, 0x55, 0x26, 0xdc, 0x0d, 0x57, 0x21, 0x35, 0xf2, 0x44, 0xa9, 0x07, 0xf7, 0x91, + 0xb7, 0xf0, 0x06, 0xa6, 0x30, 0xd4, 0x88, 0xa7, 0x7b, 0xce, 0x2d, 0xe8, 0x88, 0x75, 0x30, 0xd1, + 0x74, 0xd1, 0x93, 0x6f, 0xe8, 0x9a, 0x41, 0xc4, 0xad, 0x52, 0xe4, 0x27, 0xbf, 0x56, 0xa9, 0x11, + 0x2f, 0xc0, 0x59, 0x43, 0xa7, 0xff, 0x3f, 0x95, 0x7d, 0x7b, 0x1d, 0x20, 0x9a, 0x1a, 0x5a, 0x82, + 0x4c, 0x6d, 0xad, 0xdb, 0xdd, 0x50, 0xa6, 0xb8, 0x01, 0x8f, 0x50, 0x0c, 0xac, 0xfe, 0x69, 0x12, + 0x72, 0xb5, 0x8a, 0xb8, 0x72, 0x6b, 0xa0, 0x30, 0xab, 0xc4, 0xde, 0xd5, 0xc8, 0xe3, 0xa1, 0xe5, + 0x1d, 0x0a, 0xc3, 0x72, 0x41, 0xc0, 0x3b, 0x43, 0x59, 0xe8, 0xa8, 0x1b, 0x8c, 0x01, 0x61, 0x28, + 0x12, 0xa1, 0x04, 0xcd, 0xd0, 0xa5, 0x8d, 0x5f, 0xba, 0x58, 0x59, 0x3c, 0x74, 0x89, 0xda, 0x3e, + 0x2e, 0x48, 0x21, 0x35, 0xdd, 0x47, 0xef, 0xc0, 0xac, 0x6f, 0xf5, 0x1d, 0xcb, 0xe9, 0x6b, 0x52, + 0x79, 0xec, 0x91, 0xaf, 0x7a, 0xe5, 0xf4, 0x64, 0xb9, 0xd4, 0xe5, 0x28, 0xa1, 0xc3, 0x92, 0xa0, + 0xac, 0x31, 0x55, 0xa2, 0xb7, 0x61, 0x26, 0xc6, 0x4a, 0xb5, 0xc8, 0xd5, 0xce, 0x12, 0xe7, 0x21, + 0xe7, 0x03, 0x72, 0x88, 0x8b, 0x21, 0xe3, 0x03, 0xc2, 0x72, 0x33, 0x2c, 0xcd, 0xac, 0x79, 0xec, + 0x4c, 0xb3, 0xdb, 0x3d, 0x8d, 0x0b, 0x0c, 0xc6, 0x8f, 0xb9, 0xfa, 0x10, 0xe6, 0xda, 0x9e, 0xb1, + 0x4b, 0xfc, 0x80, 0xab, 0x42, 0x68, 0xf1, 0x03, 0xb8, 0x16, 0xe8, 0xfe, 0x9e, 0xb6, 0x6b, 0xf9, + 0x81, 0xeb, 0x1d, 0x6a, 0x1e, 0x09, 0x88, 0x43, 0xf1, 0x1a, 0x2b, 0x83, 0x10, 0x19, 0xc7, 0xab, + 0x94, 0x66, 0x9d, 0x93, 0x60, 0x49, 0xb1, 0x41, 0x09, 0xd4, 0x26, 0x14, 0x69, 0x08, 0x23, 0x92, + 0x6a, 0x74, 0xf6, 0x60, 0xbb, 0x7d, 0xed, 0xa9, 0xaf, 0xa9, 0xbc, 0xed, 0xf6, 0xf9, 0xa7, 0xfa, + 0x65, 0x50, 0xea, 0x96, 0x3f, 0xd4, 0x03, 0x63, 0x57, 0xa6, 0x52, 0x51, 0x1d, 0x94, 0x5d, 0xa2, + 0x7b, 0xc1, 0x36, 0xd1, 0x03, 0x6d, 0x48, 0x3c, 0xcb, 0x35, 0x2f, 0x5f, 0xe5, 0xd9, 0x90, 0xa5, + 0xc3, 0x38, 0xd4, 0xff, 0x4a, 0x00, 0x60, 0x7d, 0x47, 0x7a, 0x6b, 0x9f, 0x85, 0x2b, 0xbe, 0xa3, + 0x0f, 0xfd, 0x5d, 0x37, 0xd0, 0x2c, 0x27, 0x20, 0xde, 0xbe, 0x6e, 0x8b, 0xe4, 0x8e, 0x22, 0x11, + 0x4d, 0x01, 0x47, 0xaf, 0x03, 0xda, 0x23, 0x64, 0xa8, 0xb9, 0xb6, 0xa9, 0x49, 0x24, 0x2f, 0x8f, + 0x48, 0x63, 0x85, 0x62, 0xda, 0xb6, 0xd9, 0x95, 0x70, 0x54, 0x85, 0x25, 0x3a, 0x7d, 0xe2, 0x04, + 0x9e, 0x45, 0x7c, 0x6d, 0xc7, 0xf5, 0x34, 0xdf, 0x76, 0x0f, 0xb4, 0x1d, 0xd7, 0xb6, 0xdd, 0x03, + 0xe2, 0xc9, 0xbc, 0x59, 0xd9, 0x76, 0xfb, 0x0d, 0x4e, 0xb4, 0xe6, 0x7a, 0x5d, 0xdb, 0x3d, 0x58, + 0x93, 0x14, 0xd4, 0xa5, 0x8b, 0xe6, 0x1c, 0x58, 0xc6, 0x9e, 0x74, 0xe9, 0x42, 0x68, 0xcf, 0x32, + 0xf6, 0xd0, 0xcb, 0x50, 0x22, 0x36, 0x61, 0xe9, 0x13, 0x4e, 0x95, 0x61, 0x54, 0x45, 0x09, 0xa4, + 0x44, 0xea, 0x3d, 0x50, 0x1a, 0x8e, 0xe1, 0x1d, 0x0e, 0x63, 0x6b, 0xfe, 0x3a, 0x20, 0x6a, 0x24, + 0x35, 0xdb, 0x35, 0xf6, 0xb4, 0x81, 0xee, 0xe8, 0x7d, 0x3a, 0x2e, 0xfe, 0xf0, 0xaa, 0x50, 0xcc, + 0x86, 0x6b, 0xec, 0x6d, 0x0a, 0xb8, 0xfa, 0x0e, 0x40, 0x77, 0xe8, 0x11, 0xdd, 0x6c, 0x53, 0x6f, + 0x82, 0xaa, 0x8e, 0xb5, 0x34, 0x53, 0xbc, 0xfa, 0xbb, 0x9e, 0x38, 0xea, 0x0a, 0x47, 0xd4, 0x43, + 0xb8, 0xfa, 0xff, 0x61, 0xae, 0x63, 0xeb, 0x06, 0xab, 0xc3, 0xe9, 0x84, 0x2f, 0x89, 0xe8, 0x2e, + 0x64, 0x39, 0xa9, 0x58, 0xc9, 0x89, 0xc7, 0x2d, 0xea, 0x73, 0x7d, 0x0a, 0x0b, 0xfa, 0x6a, 0x11, + 0x20, 0x92, 0xa3, 0xfe, 0x43, 0x02, 0xf2, 0xa1, 0x7c, 0xb4, 0xc2, 0xdf, 0x01, 0x03, 0x4f, 0xb7, + 0x1c, 0x11, 0xf1, 0xe7, 0x71, 0x1c, 0x84, 0x9a, 0x50, 0x18, 0x86, 0xdc, 0x17, 0xfa, 0x73, 0x13, + 0x46, 0x8d, 0xe3, 0xbc, 0xe8, 0x5d, 0xc8, 0xcb, 0x32, 0x0b, 0x69, 0x61, 0x2f, 0xae, 0xca, 0x88, + 0xc8, 0x65, 0x22, 0xd5, 0x23, 0x43, 0xdb, 0xa2, 0x36, 0x27, 0x1d, 0x26, 0x52, 0xb1, 0x00, 0xa9, + 0x5f, 0x04, 0xf8, 0x92, 0x6b, 0x39, 0x3d, 0x77, 0x8f, 0x38, 0xec, 0x71, 0x9c, 0x86, 0x94, 0x44, + 0x2a, 0x5a, 0xb4, 0x58, 0xa6, 0x80, 0xaf, 0x52, 0xf8, 0x46, 0xcc, 0x9b, 0xea, 0x5f, 0x24, 0x21, + 0x8b, 0x5d, 0x37, 0xa8, 0x55, 0xd0, 0x0a, 0x64, 0x85, 0x29, 0x61, 0x57, 0x54, 0x35, 0x7f, 0x7a, + 0xb2, 0x9c, 0xe1, 0x36, 0x24, 0x63, 0x30, 0xe3, 0x11, 0x33, 0xf2, 0xc9, 0xf3, 0x8c, 0x3c, 0xba, + 0x0d, 0x45, 0x41, 0xa4, 0xed, 0xea, 0xfe, 0x2e, 0x8f, 0xef, 0xaa, 0x33, 0xa7, 0x27, 0xcb, 0xc0, + 0x29, 0xd7, 0x75, 0x7f, 0x17, 0x03, 0xa7, 0xa6, 0xdf, 0xa8, 0x01, 0x85, 0x8f, 0x5c, 0xcb, 0xd1, + 0x02, 0x36, 0x09, 0x91, 0x8b, 0x9c, 0xb8, 0xd4, 0xd1, 0x54, 0x45, 0x99, 0x0d, 0x7c, 0x14, 0x4d, + 0xbe, 0x01, 0x25, 0xcf, 0x75, 0x03, 0x6e, 0xd9, 0x2c, 0xd7, 0x11, 0x69, 0x8e, 0x95, 0x89, 0xd9, + 0x6f, 0xd7, 0x0d, 0xb0, 0xa0, 0xc3, 0x45, 0x2f, 0xd6, 0x42, 0xb7, 0x61, 0xde, 0xd6, 0xfd, 0x40, + 0x63, 0x26, 0xd1, 0x8c, 0xa4, 0x65, 0x99, 0xf2, 0x11, 0xc5, 0xb1, 0x07, 0x3c, 0x53, 0x72, 0xa8, + 0x7f, 0x9f, 0x80, 0x02, 0x9d, 0x8c, 0xb5, 0x63, 0x19, 0xd4, 0x0f, 0x7c, 0x76, 0xf7, 0xe4, 0x2a, + 0xa4, 0x0c, 0xdf, 0x13, 0x4a, 0x65, 0xf7, 0x73, 0xad, 0x8b, 0x31, 0x85, 0xa1, 0x7b, 0x90, 0x15, + 0xe9, 0x16, 0xee, 0x99, 0xa8, 0x97, 0x7b, 0xac, 0x42, 0x37, 0x82, 0x8f, 0x6d, 0xf7, 0x68, 0x74, + 0xfc, 0x9e, 0xc0, 0x71, 0x10, 0x5a, 0x80, 0xa4, 0xc1, 0xd5, 0x25, 0xea, 0xb8, 0x6a, 0x2d, 0x9c, + 0x34, 0x1c, 0xf5, 0x3b, 0x09, 0x28, 0x45, 0x36, 0x81, 0xee, 0x80, 0x6b, 0x90, 0xf7, 0x47, 0xdb, + 0xfe, 0xa1, 0x1f, 0x90, 0x81, 0x7c, 0xf8, 0x0f, 0x01, 0xa8, 0x09, 0x79, 0xdd, 0xee, 0xbb, 0x9e, + 0x15, 0xec, 0x0e, 0x44, 0x20, 0x3b, 0xd9, 0x9b, 0x88, 0xcb, 0x5c, 0xad, 0x48, 0x16, 0x1c, 0x71, + 0x4b, 0xd7, 0x80, 0xd7, 0xbc, 0x30, 0xd7, 0xe0, 0x25, 0x28, 0xda, 0xfa, 0x80, 0xe5, 0x9f, 0x02, + 0x6b, 0x40, 0xe4, 0x61, 0x10, 0xb0, 0x9e, 0x35, 0x20, 0xaa, 0x0a, 0xf9, 0x50, 0x18, 0x9a, 0x85, + 0x42, 0xa5, 0xd1, 0xd5, 0xde, 0xb8, 0x73, 0x57, 0xbb, 0x5f, 0xdb, 0x54, 0xa6, 0x84, 0xfb, 0xfa, + 0xc7, 0x09, 0x28, 0x09, 0x8b, 0x25, 0x42, 0x82, 0x97, 0x61, 0xda, 0xd3, 0x77, 0x02, 0x19, 0xb4, + 0xa4, 0xf9, 0xae, 0xa6, 0x97, 0x00, 0x0d, 0x5a, 0x28, 0x6a, 0x72, 0xd0, 0x12, 0x2b, 0x45, 0x49, + 0x5d, 0x58, 0x8a, 0x92, 0xfe, 0xb1, 0x94, 0xa2, 0xa8, 0x3f, 0x0b, 0xb0, 0x66, 0xd9, 0xa4, 0xc7, + 0x53, 0x55, 0x93, 0x42, 0x50, 0xea, 0xe6, 0x85, 0x15, 0x3d, 0xdc, 0xcd, 0x6b, 0xd6, 0x31, 0x85, + 0x51, 0x54, 0xdf, 0x32, 0xc5, 0x61, 0x64, 0xa8, 0xfb, 0x14, 0xd5, 0xb7, 0xcc, 0xf0, 0x65, 0x30, + 0x7d, 0xc9, 0xcb, 0xa0, 0x3a, 0x0b, 0x25, 0xcc, 0x73, 0x6c, 0x7c, 0x0c, 0xea, 0x71, 0x02, 0x66, + 0x85, 0xbf, 0x1b, 0x9a, 0xec, 0xd7, 0x20, 0xcf, 0x5d, 0xdf, 0x28, 0x08, 0x64, 0xf5, 0x18, 0x9c, + 0xae, 0x59, 0xc7, 0x39, 0x8e, 0x6e, 0x9a, 0x68, 0x19, 0x0a, 0x82, 0x34, 0x56, 0x04, 0x08, 0x1c, + 0xc4, 0xaa, 0x94, 0xde, 0x82, 0xf4, 0x8e, 0x65, 0x13, 0xb1, 0xf3, 0x27, 0x5a, 0x84, 0x48, 0x23, + 0xeb, 0x53, 0x98, 0x51, 0x57, 0x73, 0x32, 0xb9, 0xa7, 0xfe, 0x53, 0x82, 0xa5, 0x98, 0x69, 0xa8, + 0x1a, 0x1f, 0x1f, 0x8f, 0x5a, 0xcf, 0x8c, 0x8f, 0xd3, 0xd1, 0xf1, 0x71, 0x34, 0x1f, 0x9f, 0x20, + 0x8d, 0x8f, 0x8f, 0x83, 0x7e, 0xf4, 0xf1, 0xa1, 0xf7, 0x61, 0x5a, 0xa4, 0x2a, 0x85, 0xa9, 0x7b, + 0x69, 0xe2, 0xce, 0x88, 0x6b, 0x7a, 0x7d, 0x0a, 0x4b, 0x9e, 0xd8, 0xf4, 0x36, 0x60, 0xa1, 0x6a, + 0xeb, 0xc6, 0x9e, 0x6d, 0xf9, 0x01, 0x31, 0xe3, 0x16, 0xe8, 0x0e, 0x64, 0xc7, 0xfc, 0xdc, 0x8b, + 0x92, 0xa8, 0x82, 0x52, 0xfd, 0xfd, 0x24, 0x14, 0xd7, 0x89, 0x6e, 0x07, 0xbb, 0x51, 0xa6, 0x2a, + 0x20, 0x7e, 0x20, 0xee, 0x47, 0xf6, 0x8d, 0x3e, 0x0f, 0xb9, 0xd0, 0x0d, 0xba, 0xf4, 0x39, 0x30, + 0x24, 0x45, 0x6f, 0xc2, 0x34, 0x1d, 0xbb, 0x3b, 0x92, 0xf1, 0xd5, 0x45, 0x2f, 0x4d, 0x82, 0x92, + 0x5e, 0x5a, 0x1e, 0x61, 0x7e, 0x0f, 0xd3, 0x53, 0x06, 0xcb, 0x26, 0xfa, 0x02, 0x14, 0xd9, 0x43, + 0x89, 0x74, 0xf3, 0x32, 0x97, 0xc9, 0x2c, 0xf0, 0xb7, 0x4e, 0x46, 0x8d, 0xee, 0xc1, 0x0c, 0xe7, + 0x0e, 0x67, 0x92, 0xbd, 0x8c, 0xbf, 0xc4, 0x18, 0xa4, 0xa3, 0xa7, 0xfe, 0x41, 0x12, 0xe6, 0x37, + 0xf5, 0xc3, 0x6d, 0x22, 0x0c, 0x19, 0x31, 0x31, 0x31, 0x5c, 0xcf, 0x44, 0x9d, 0xb8, 0x01, 0xbc, + 0xe0, 0xf1, 0x75, 0x12, 0xf3, 0x64, 0x3b, 0x28, 0xa3, 0xc6, 0x64, 0x2c, 0x6a, 0x9c, 0x87, 0x8c, + 0xe3, 0x3a, 0x06, 0x11, 0xd6, 0x91, 0x37, 0xd4, 0xaf, 0x27, 0xe2, 0xd6, 0xaf, 0x1c, 0x3e, 0x8c, + 0xb2, 0xb4, 0x59, 0xcb, 0x0d, 0xc2, 0xee, 0xd0, 0x3d, 0x28, 0x77, 0x1b, 0x35, 0xdc, 0xe8, 0x55, + 0xdb, 0x5f, 0xd6, 0xba, 0x95, 0x8d, 0x6e, 0xe5, 0xce, 0x6d, 0xad, 0xd3, 0xde, 0xf8, 0xf0, 0x8d, + 0x37, 0x6f, 0x7f, 0x5e, 0x49, 0x94, 0x57, 0x8e, 0x8e, 0x57, 0xae, 0xb5, 0x2a, 0xb5, 0x0d, 0x7e, + 0x66, 0xb7, 0xdd, 0xc7, 0x5d, 0xdd, 0xf6, 0xf5, 0x3b, 0xb7, 0x3b, 0xae, 0x7d, 0x48, 0x69, 0xd0, + 0x67, 0x01, 0xad, 0x35, 0x70, 0xab, 0xd1, 0xd3, 0xa4, 0x89, 0xad, 0x55, 0x6b, 0x4a, 0x92, 0xc7, + 0x62, 0x6b, 0xc4, 0x73, 0x48, 0x50, 0x69, 0x74, 0xdf, 0xb8, 0x73, 0xb7, 0x56, 0xad, 0x51, 0x2b, + 0x51, 0x8c, 0xdf, 0xb7, 0x71, 0x37, 0x22, 0x71, 0xae, 0x1b, 0x11, 0x79, 0x23, 0xc9, 0x73, 0xbc, + 0x91, 0x35, 0x98, 0x37, 0x3c, 0xd7, 0xf7, 0x35, 0x1a, 0xe0, 0x10, 0xf3, 0x4c, 0x08, 0xf5, 0xdc, + 0xe9, 0xc9, 0xf2, 0x95, 0x1a, 0xc5, 0x77, 0x19, 0x5a, 0x88, 0xbf, 0x62, 0xc4, 0x40, 0xac, 0x27, + 0xf5, 0x4f, 0x52, 0xd4, 0x57, 0xb4, 0xf6, 0x2d, 0x9b, 0xf4, 0x89, 0x8f, 0x1e, 0xc2, 0xac, 0xe1, + 0x11, 0x93, 0x46, 0x2e, 0xba, 0x1d, 0xaf, 0xc0, 0xff, 0xdc, 0x44, 0xb7, 0x2d, 0x64, 0x5c, 0xad, + 0x85, 0x5c, 0xdd, 0x21, 0x31, 0xf0, 0x8c, 0x31, 0xd6, 0x46, 0x1f, 0xc1, 0xac, 0x4f, 0x6c, 0xcb, + 0x19, 0x3d, 0xd6, 0x0c, 0xd7, 0x09, 0xc8, 0x63, 0xf9, 0x20, 0x78, 0x99, 0xdc, 0x6e, 0x63, 0x83, + 0x72, 0xd5, 0x38, 0x53, 0x15, 0x9d, 0x9e, 0x2c, 0xcf, 0x8c, 0xc3, 0xf0, 0x8c, 0x90, 0x2c, 0xda, + 0xe5, 0x5d, 0x98, 0x19, 0x1f, 0x0d, 0x9a, 0x17, 0xa6, 0x8a, 0x59, 0xbc, 0xd0, 0x14, 0x5d, 0x83, + 0x9c, 0x47, 0xfa, 0x96, 0x1f, 0x78, 0x5c, 0xcd, 0x14, 0x13, 0x42, 0xd0, 0x22, 0x64, 0x63, 0x65, + 0x2d, 0x14, 0x27, 0xda, 0xd4, 0x06, 0xf1, 0xaa, 0xbc, 0xf2, 0x4f, 0xc3, 0x99, 0xb1, 0xd0, 0x63, + 0x6b, 0x5a, 0xbe, 0xbe, 0x2d, 0x3a, 0xcb, 0x61, 0xd9, 0xa4, 0x7b, 0x79, 0xe4, 0x87, 0x2e, 0x28, + 0xfb, 0xa6, 0x30, 0xe6, 0x2b, 0x89, 0x1a, 0x45, 0xe6, 0x0d, 0xc9, 0x4a, 0xf1, 0x74, 0xac, 0x52, + 0x7c, 0x1e, 0x32, 0x36, 0xd9, 0x27, 0x36, 0xf7, 0x52, 0x30, 0x6f, 0xb0, 0x3d, 0xff, 0x25, 0x77, + 0x5b, 0x5c, 0xe4, 0x6b, 0x50, 0xfa, 0xc8, 0xdd, 0xd6, 0xac, 0x80, 0x78, 0x51, 0x85, 0x5a, 0xe1, + 0xce, 0x0b, 0x93, 0xf4, 0x2b, 0x0a, 0xc6, 0x85, 0xab, 0x54, 0xfc, 0xc8, 0xdd, 0x6e, 0x4a, 0x36, + 0x54, 0x81, 0x19, 0xe6, 0x01, 0x92, 0xc7, 0xc4, 0x18, 0x31, 0x41, 0x97, 0xbf, 0xdc, 0x96, 0x28, + 0x47, 0x43, 0x32, 0xa8, 0xdf, 0xcc, 0x80, 0xc2, 0xcb, 0x5d, 0x2a, 0xac, 0xae, 0x95, 0x65, 0xa6, + 0xef, 0x41, 0xc6, 0x37, 0xdc, 0xb0, 0x1c, 0x72, 0x62, 0x4a, 0xfd, 0x2c, 0xd3, 0x6a, 0x97, 0x72, + 0x60, 0xce, 0x88, 0xd6, 0x60, 0xda, 0xdf, 0xd5, 0x3d, 0xcb, 0xe9, 0x0b, 0xf7, 0xea, 0xf5, 0xa7, + 0x93, 0xc1, 0x79, 0xb0, 0x64, 0x46, 0xeb, 0x90, 0xd9, 0xa6, 0x31, 0x9d, 0xb0, 0xc6, 0xb7, 0x9f, + 0x4a, 0x4a, 0x95, 0x72, 0x70, 0xe8, 0xfa, 0x14, 0xe6, 0x02, 0xa8, 0x24, 0x56, 0x54, 0x27, 0xae, + 0xb2, 0xa7, 0x93, 0xc4, 0xca, 0x58, 0x22, 0x49, 0x4c, 0x40, 0xb9, 0x04, 0x85, 0x58, 0x0f, 0xe5, + 0xfb, 0x50, 0x88, 0x91, 0xa1, 0xe7, 0x61, 0x7a, 0xc7, 0xd7, 0x62, 0x3f, 0x20, 0xc8, 0xee, 0xf8, + 0xac, 0x16, 0x69, 0x19, 0x0a, 0x8c, 0x5f, 0xdb, 0xb1, 0xf5, 0xbe, 0x7c, 0xb6, 0x03, 0x06, 0x5a, + 0xa3, 0x10, 0xd5, 0x80, 0x0c, 0xd3, 0x21, 0xba, 0x09, 0x85, 0x6e, 0xb3, 0x75, 0x7f, 0xa3, 0xa1, + 0xb5, 0xda, 0x75, 0x6a, 0x19, 0x59, 0xd5, 0x19, 0x97, 0xcf, 0x28, 0xba, 0x96, 0xd3, 0xb7, 0x09, + 0xab, 0x64, 0xbe, 0x01, 0xb0, 0xb9, 0xb5, 0xd1, 0x6b, 0x72, 0x52, 0x51, 0xf1, 0x13, 0x23, 0xdd, + 0x1c, 0xd9, 0x81, 0x45, 0x29, 0x85, 0x57, 0xf9, 0x7b, 0x09, 0x98, 0x16, 0x5a, 0x46, 0xcb, 0xa1, + 0xe9, 0x7d, 0xee, 0xe8, 0x78, 0xe5, 0x8a, 0xe0, 0xe2, 0x48, 0x56, 0x97, 0x72, 0x83, 0xd5, 0x02, + 0xd7, 0xb5, 0x76, 0x6b, 0xe3, 0x43, 0x25, 0x31, 0x36, 0x0c, 0xb1, 0x50, 0xa2, 0x50, 0x10, 0xdd, + 0x04, 0x68, 0xb7, 0x1a, 0xda, 0x23, 0xdc, 0xec, 0x35, 0xb0, 0x2c, 0x29, 0x1a, 0x23, 0x6d, 0x3b, + 0xe4, 0x91, 0x47, 0x77, 0x3c, 0x7a, 0x11, 0x52, 0x95, 0x8d, 0x0d, 0x25, 0xc5, 0xcb, 0x5c, 0xc6, + 0x88, 0x2a, 0xb6, 0xcd, 0xc7, 0x59, 0x2d, 0x41, 0x81, 0x17, 0x5a, 0x33, 0x55, 0xaa, 0x77, 0xa1, + 0x28, 0x08, 0x79, 0x8e, 0xf2, 0xc9, 0x84, 0xdc, 0x42, 0x98, 0x18, 0x95, 0xcf, 0x77, 0xac, 0xa5, + 0xfe, 0x4e, 0x0a, 0xe6, 0x38, 0xab, 0x78, 0x22, 0x89, 0x9c, 0xe9, 0xcb, 0x5f, 0x00, 0x6a, 0xe3, + 0xaf, 0xdd, 0x9f, 0x3b, 0x7f, 0xd3, 0x8c, 0x09, 0x1f, 0xcf, 0xc4, 0x9b, 0x30, 0x2b, 0xdf, 0xa9, + 0xa4, 0x3d, 0xe5, 0xe1, 0xf5, 0x7b, 0x4f, 0x2b, 0x4e, 0xb4, 0x84, 0xe1, 0xe2, 0x09, 0x4d, 0xf9, + 0x44, 0x16, 0xb3, 0x66, 0xf2, 0x8d, 0x3d, 0x33, 0xf6, 0xc6, 0x5e, 0xae, 0xc0, 0xdc, 0x04, 0x01, + 0xcf, 0x94, 0xd3, 0xfc, 0xaa, 0x7c, 0x39, 0x98, 0x83, 0x59, 0x91, 0xef, 0xd7, 0x3a, 0x5b, 0xd5, + 0x8d, 0x66, 0x77, 0x5d, 0x99, 0x42, 0x25, 0xc8, 0x8b, 0x46, 0xa3, 0xae, 0x24, 0x50, 0x19, 0x16, + 0x24, 0x0d, 0xdd, 0x94, 0xda, 0x56, 0x4b, 0x92, 0x26, 0xd1, 0x73, 0x70, 0x45, 0xe2, 0x22, 0x70, + 0x4a, 0xfd, 0xeb, 0x24, 0x00, 0x9f, 0x38, 0xfb, 0x55, 0xc0, 0x75, 0x98, 0x31, 0xf4, 0xa1, 0x6e, + 0x58, 0xc1, 0xe1, 0x58, 0x95, 0x60, 0x49, 0x42, 0x79, 0xa5, 0xe0, 0x97, 0xc3, 0x9a, 0xe4, 0xe8, + 0x9e, 0x3a, 0xf7, 0xb7, 0x34, 0x91, 0x78, 0xf1, 0x39, 0xa6, 0x4d, 0x51, 0x9d, 0x2c, 0x95, 0xf9, + 0x1a, 0xe4, 0x85, 0xe4, 0x30, 0x14, 0x61, 0xbe, 0xb7, 0x10, 0x52, 0xc7, 0x39, 0x8e, 0x6e, 0x9a, + 0xe7, 0xff, 0x94, 0x20, 0xf5, 0xa3, 0xfc, 0x94, 0xa0, 0x7c, 0x0f, 0xd0, 0x93, 0xc3, 0x7b, 0xa6, + 0xb5, 0x7a, 0x04, 0xa5, 0x9a, 0x50, 0x13, 0x66, 0x4f, 0xd5, 0xd7, 0x61, 0xc6, 0xe3, 0x3f, 0x1e, + 0x33, 0xc7, 0xb5, 0x29, 0xa1, 0x5c, 0x9b, 0xcb, 0x50, 0x60, 0xf9, 0xd1, 0xb1, 0x5f, 0xb3, 0x01, + 0x03, 0x31, 0x02, 0xf5, 0xef, 0xd2, 0xe1, 0x55, 0xe1, 0x53, 0x4f, 0x86, 0xa5, 0xa8, 0x16, 0x20, + 0x19, 0x9e, 0x20, 0x16, 0x91, 0x37, 0xeb, 0x38, 0x69, 0x99, 0xe3, 0x1a, 0x4c, 0x5e, 0xa8, 0xc1, + 0xe8, 0x05, 0x30, 0xf5, 0xd4, 0x2f, 0x80, 0x5f, 0x7d, 0x62, 0xe9, 0xb9, 0xc2, 0xff, 0xdf, 0x05, + 0x66, 0x3d, 0x1c, 0xf4, 0x53, 0x6c, 0x00, 0xfd, 0xc9, 0x33, 0x9b, 0x39, 0xff, 0xb5, 0xe8, 0x89, + 0x0e, 0x9e, 0xe6, 0xc0, 0x36, 0x42, 0x0b, 0xc7, 0x82, 0x5a, 0xee, 0xda, 0xbf, 0xf2, 0x34, 0xd7, + 0x12, 0x06, 0x3d, 0xba, 0xab, 0xdf, 0x85, 0x69, 0x6e, 0xe9, 0x7c, 0xf1, 0x6b, 0xa1, 0x95, 0xf3, + 0x45, 0x88, 0x10, 0x58, 0x32, 0x7c, 0xfa, 0xcd, 0xf6, 0xe3, 0xb0, 0x2d, 0x5f, 0x09, 0x77, 0x55, + 0x58, 0x15, 0x72, 0xee, 0xae, 0x7a, 0xc6, 0x9f, 0x5c, 0xa8, 0xbf, 0x98, 0x80, 0xb9, 0xf0, 0xb8, + 0x45, 0x3f, 0xa0, 0x44, 0xef, 0x42, 0x9e, 0x6d, 0x7e, 0xdf, 0x62, 0x0f, 0xac, 0x97, 0x1f, 0xd5, + 0x88, 0x9c, 0xe5, 0x49, 0x59, 0xda, 0xd4, 0x23, 0xa6, 0x30, 0x38, 0x97, 0xf0, 0x86, 0xe4, 0xea, + 0x2f, 0x25, 0x20, 0x27, 0xe1, 0x68, 0x0d, 0x72, 0x3e, 0xe9, 0xb3, 0x1f, 0x74, 0x8a, 0x31, 0xdc, + 0xbc, 0x48, 0xce, 0x6a, 0x57, 0x10, 0x8b, 0x32, 0x11, 0xc9, 0x5b, 0x7e, 0x0f, 0x4a, 0x63, 0xa8, + 0x67, 0xd2, 0xfe, 0xf7, 0xc3, 0x43, 0x4d, 0x8d, 0x86, 0xf8, 0x85, 0x50, 0xe8, 0x75, 0x25, 0x2e, + 0xf3, 0x95, 0x22, 0xa6, 0x4b, 0xbc, 0xae, 0xe4, 0x33, 0x48, 0x9a, 0xe4, 0x75, 0xa1, 0xce, 0xf8, + 0x71, 0xe1, 0xa6, 0xe2, 0xd6, 0x53, 0xc9, 0x9b, 0x7c, 0x72, 0xfe, 0xaf, 0xfc, 0xb8, 0xf2, 0x7f, + 0x27, 0x00, 0x62, 0xce, 0xf4, 0xba, 0xc8, 0x5a, 0x71, 0x5f, 0xfa, 0xad, 0x67, 0x1c, 0xf1, 0x6a, + 0x2c, 0xad, 0xf5, 0x5b, 0x09, 0x48, 0x33, 0x91, 0x63, 0xa5, 0x3c, 0x0b, 0x80, 0x62, 0xde, 0xa2, + 0x74, 0xc1, 0x12, 0xe8, 0x05, 0x78, 0x3e, 0x0e, 0xa7, 0x8e, 0x5c, 0x03, 0x73, 0x57, 0x2e, 0x49, + 0xef, 0xe8, 0xc8, 0x6d, 0x1c, 0xc3, 0xa5, 0xd0, 0x35, 0x58, 0x8c, 0xe1, 0x84, 0x0c, 0x21, 0x36, + 0x4d, 0xc5, 0xc6, 0xb0, 0xfc, 0x53, 0x20, 0x33, 0x67, 0xbc, 0xb6, 0x9b, 0x5f, 0x80, 0xa2, 0xfc, + 0x21, 0x26, 0x53, 0x5d, 0x0e, 0xd2, 0xbd, 0x4a, 0xf7, 0x81, 0x32, 0x85, 0x00, 0xb2, 0x3c, 0xb2, + 0xe7, 0xc5, 0x9b, 0xb5, 0x76, 0x6b, 0xad, 0x79, 0x5f, 0x49, 0xd2, 0x6f, 0x51, 0x93, 0x9f, 0xba, + 0xf9, 0x6b, 0x69, 0xc8, 0x87, 0xa5, 0x84, 0xe8, 0x2a, 0xa4, 0x5a, 0x8d, 0x47, 0x32, 0x4d, 0x10, + 0xc2, 0x5b, 0xe4, 0x00, 0xbd, 0x14, 0x15, 0x21, 0xdc, 0xe3, 0x4e, 0x65, 0x88, 0x96, 0x05, 0x08, + 0xaf, 0x40, 0xae, 0xd2, 0xed, 0x36, 0xef, 0xb7, 0x1a, 0x75, 0xe5, 0x93, 0x04, 0xf7, 0x77, 0x43, + 0x22, 0x6e, 0xb8, 0x89, 0xc9, 0xa8, 0x6a, 0xb5, 0x46, 0xa7, 0xd7, 0xa8, 0x2b, 0x1f, 0x27, 0xcf, + 0x52, 0xb1, 0x47, 0x75, 0xf6, 0xb3, 0x91, 0x7c, 0x07, 0x37, 0x3a, 0x15, 0x4c, 0x3b, 0xfc, 0x24, + 0xc9, 0x6b, 0x23, 0xa2, 0x1e, 0x3d, 0x32, 0xe4, 0xee, 0xf5, 0x92, 0xfc, 0x85, 0xda, 0xc7, 0x29, + 0xfe, 0xfb, 0x81, 0xa8, 0x2e, 0x92, 0xe8, 0xe6, 0x21, 0xed, 0x8d, 0x15, 0xa4, 0x32, 0x31, 0xa9, + 0x33, 0xbd, 0x75, 0x03, 0xdd, 0x0b, 0xa8, 0x14, 0x15, 0xa6, 0xf1, 0x56, 0xab, 0x45, 0x89, 0x3e, + 0x4e, 0x9f, 0x99, 0x1d, 0x1e, 0x39, 0x0e, 0xa5, 0xb9, 0x0e, 0x39, 0x59, 0xaf, 0xaa, 0x7c, 0x92, + 0x3e, 0x33, 0xa0, 0x9a, 0x2c, 0xb6, 0x65, 0x1d, 0xae, 0x6f, 0xf5, 0xd8, 0x0f, 0xe8, 0x3e, 0xce, + 0x9c, 0xed, 0x70, 0x77, 0x14, 0x98, 0xee, 0x81, 0x83, 0x56, 0xc2, 0x32, 0x8c, 0x4f, 0x32, 0x3c, + 0x4f, 0x12, 0xd2, 0x88, 0x1a, 0x8c, 0x57, 0x20, 0x87, 0x1b, 0x5f, 0xe2, 0xbf, 0xb5, 0xfb, 0x38, + 0x7b, 0x46, 0x0e, 0x26, 0x1f, 0x11, 0x83, 0xf6, 0xb6, 0x02, 0x59, 0xdc, 0xd8, 0x6c, 0x3f, 0x6c, + 0x28, 0xbf, 0x9d, 0x3d, 0x23, 0x07, 0x93, 0x81, 0xcb, 0x7e, 0x57, 0x93, 0x6b, 0xe3, 0xce, 0x7a, + 0x85, 0x2d, 0xca, 0x59, 0x39, 0x6d, 0x6f, 0xb8, 0xab, 0x3b, 0xc4, 0x8c, 0x7e, 0x20, 0x11, 0xa2, + 0x6e, 0x7e, 0x15, 0x72, 0xf2, 0x5d, 0x02, 0x2d, 0x41, 0xf6, 0x51, 0x1b, 0x3f, 0x68, 0x60, 0x65, + 0x8a, 0x6b, 0x59, 0x62, 0x1e, 0xf1, 0x17, 0xa5, 0x15, 0x98, 0xde, 0xac, 0xb4, 0x2a, 0xf7, 0xe9, + 0x99, 0xe0, 0xc3, 0x90, 0x04, 0x22, 0xb9, 0x5e, 0x56, 0x44, 0x07, 0xa1, 0xcc, 0xea, 0x2b, 0xdf, + 0xfa, 0xc1, 0xd2, 0xd4, 0xf7, 0x7e, 0xb0, 0x34, 0xf5, 0xf1, 0xe9, 0x52, 0xe2, 0x5b, 0xa7, 0x4b, + 0x89, 0x6f, 0x9f, 0x2e, 0x25, 0xfe, 0xe5, 0x74, 0x29, 0xf1, 0xcb, 0x3f, 0x5c, 0x9a, 0xfa, 0xf6, + 0x0f, 0x97, 0xa6, 0xbe, 0xf7, 0xc3, 0xa5, 0xa9, 0xed, 0x2c, 0x8b, 0xae, 0xdf, 0xfc, 0xdf, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x15, 0x67, 0x77, 0xf9, 0x97, 0x43, 0x00, 0x00, } func (m *Version) Copy() *Version { @@ -6685,6 +6690,10 @@ func (m *HealthConfig) CopyFrom(src interface{}) { m.StartPeriod = &types.Duration{} github_com_moby_swarmkit_v2_api_deepcopy.Copy(m.StartPeriod, o.StartPeriod) } + if o.StartInterval != nil { + m.StartInterval = &types.Duration{} + github_com_moby_swarmkit_v2_api_deepcopy.Copy(m.StartInterval, o.StartInterval) + } } func (m *MaybeEncryptedRecord) Copy() *MaybeEncryptedRecord { @@ -10172,6 +10181,18 @@ func (m *HealthConfig) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.StartInterval != nil { + { + size, err := m.StartInterval.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.StartPeriod != nil { { size, err := m.StartPeriod.MarshalToSizedBuffer(dAtA[:i]) @@ -12647,6 +12668,10 @@ func (m *HealthConfig) Size() (n int) { l = m.StartPeriod.Size() n += 1 + l + sovTypes(uint64(l)) } + if m.StartInterval != nil { + l = m.StartInterval.Size() + n += 1 + l + sovTypes(uint64(l)) + } return n } @@ -14044,6 +14069,7 @@ func (this *HealthConfig) String() string { `Timeout:` + strings.Replace(fmt.Sprintf("%v", this.Timeout), "Duration", "types.Duration", 1) + `,`, `Retries:` + fmt.Sprintf("%v", this.Retries) + `,`, `StartPeriod:` + strings.Replace(fmt.Sprintf("%v", this.StartPeriod), "Duration", "types.Duration", 1) + `,`, + `StartInterval:` + strings.Replace(fmt.Sprintf("%v", this.StartInterval), "Duration", "types.Duration", 1) + `,`, `}`, }, "") return s @@ -23363,6 +23389,42 @@ func (m *HealthConfig) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartInterval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StartInterval == nil { + m.StartInterval = &types.Duration{} + } + if err := m.StartInterval.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/types.proto b/api/types.proto index 2eb6f34375..2508d1a5b6 100644 --- a/api/types.proto +++ b/api/types.proto @@ -1103,6 +1103,12 @@ message HealthConfig { // which health check failures will note count towards the maximum // number of retries. google.protobuf.Duration start_period = 5; + + // StartInterval is the time to wait between checks during the start period. + // Zero means inherit. + // Note: can't use stdduration because this field needs to be nullable. + google.protobuf.Duration start_interval = 6; + } message MaybeEncryptedRecord { diff --git a/manager/controlapi/service.go b/manager/controlapi/service.go index a58eae2f8f..4897590ca1 100644 --- a/manager/controlapi/service.go +++ b/manager/controlapi/service.go @@ -222,6 +222,16 @@ func validateHealthCheck(hc *api.HealthConfig) error { } } + if hc.StartInterval != nil { + interval, err := gogotypes.DurationFromProto(hc.StartInterval) + if err != nil { + return err + } + if interval != 0 && interval < minimumDuration { + return status.Errorf(codes.InvalidArgument, "ContainerSpec: StartInterval in HealthConfig cannot be less than %s", minimumDuration) + } + } + if hc.Retries < 0 { return status.Errorf(codes.InvalidArgument, "ContainerSpec: Retries in HealthConfig cannot be negative") } diff --git a/manager/controlapi/service_test.go b/manager/controlapi/service_test.go index bf3f262b2d..b3b92ddb8a 100644 --- a/manager/controlapi/service_test.go +++ b/manager/controlapi/service_test.go @@ -349,11 +349,12 @@ func TestValidateContainerSpec(t *testing.T) { Container: &api.ContainerSpec{ Image: "image", Healthcheck: &api.HealthConfig{ - Test: []string{"curl 127.0.0.1:3000"}, - Interval: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration - Timeout: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration - Retries: -1, // invalid negative integer - StartPeriod: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration + Test: []string{"curl 127.0.0.1:3000"}, + Interval: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration + Timeout: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration + Retries: -1, // invalid negative integer + StartPeriod: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration + StartInterval: gogotypes.DurationProto(time.Duration(-1 * time.Second)), // invalid negative duration }, }, }, @@ -395,11 +396,12 @@ func TestValidateContainerSpec(t *testing.T) { }, }, Healthcheck: &api.HealthConfig{ - Test: []string{"curl 127.0.0.1:3000"}, - Interval: gogotypes.DurationProto(time.Duration(1 * time.Second)), - Timeout: gogotypes.DurationProto(time.Duration(3 * time.Second)), - Retries: 5, - StartPeriod: gogotypes.DurationProto(time.Duration(1 * time.Second)), + Test: []string{"curl 127.0.0.1:3000"}, + Interval: gogotypes.DurationProto(time.Duration(1 * time.Second)), + Timeout: gogotypes.DurationProto(time.Duration(3 * time.Second)), + Retries: 5, + StartPeriod: gogotypes.DurationProto(time.Duration(1 * time.Second)), + StartInterval: gogotypes.DurationProto(time.Duration(1 * time.Second)), }, }, }, diff --git a/protobuf/plugin/deepcopy/test/deepcopypb_test.go b/protobuf/plugin/deepcopy/test/deepcopypb_test.go index f542bb67d0..12e30be428 100644 --- a/protobuf/plugin/deepcopy/test/deepcopypb_test.go +++ b/protobuf/plugin/deepcopy/test/deepcopypb_test.go @@ -713,6 +713,88 @@ func TestOneOfProtoCompactText(t *testing.T) { } } +func TestBasicScalarStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedBasicScalar(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestRepeatedScalarStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedRepeatedScalar(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestRepeatedScalarPackedStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedRepeatedScalarPacked(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestExternalStructStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedExternalStruct(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestRepeatedExternalStructStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedRepeatedExternalStruct(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestNonNullableExternalStructStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedNonNullableExternalStruct(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestRepeatedNonNullableExternalStructStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedRepeatedNonNullableExternalStruct(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestMapStructStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedMapStruct(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} +func TestOneOfStringer(t *testing.T) { + popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) + p := NewPopulatedOneOf(popr, false) + s1 := p.String() + s2 := fmt.Sprintf("%v", p) + if s1 != s2 { + t.Fatalf("String want %v got %v", s1, s2) + } +} + func TestBasicScalarCopy(t *testing.T) { popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) in := NewPopulatedBasicScalar(popr, true) @@ -1050,86 +1132,5 @@ func TestOneOfCopy(t *testing.T) { t.Fatalf("copying nil should return nil, returned: %#v", out) } } -func TestBasicScalarStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedBasicScalar(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestRepeatedScalarStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedRepeatedScalar(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestRepeatedScalarPackedStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedRepeatedScalarPacked(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestExternalStructStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedExternalStruct(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestRepeatedExternalStructStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedRepeatedExternalStruct(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestNonNullableExternalStructStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedNonNullableExternalStruct(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestRepeatedNonNullableExternalStructStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedRepeatedNonNullableExternalStruct(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestMapStructStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedMapStruct(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} -func TestOneOfStringer(t *testing.T) { - popr := math_rand.New(math_rand.NewSource(time.Now().UnixNano())) - p := NewPopulatedOneOf(popr, false) - s1 := p.String() - s2 := fmt.Sprintf("%v", p) - if s1 != s2 { - t.Fatalf("String want %v got %v", s1, s2) - } -} //These tests are generated by github.com/gogo/protobuf/plugin/testgen