diff --git a/pkg/peerprotocol/fullnode.go b/pkg/peerprotocol/fullnode.go index cc9a9e7..4933ea7 100644 --- a/pkg/peerprotocol/fullnode.go +++ b/pkg/peerprotocol/fullnode.go @@ -20,3 +20,8 @@ func NewFullNodeProtocol(connection *Connection) (*FullNodeProtocol, error) { func (c *FullNodeProtocol) RequestPeers() error { return c.connection.Do(protocols.ProtocolMessageTypeRequestPeers, &protocols.RequestPeers{}) } + +// RequestBlock asks the current peer to respond with a block +func (c *FullNodeProtocol) RequestBlock(data *protocols.RequestBlock) error { + return c.connection.Do(protocols.ProtocolMessageTypeRequestBlock, data) +} diff --git a/pkg/protocols/fullnode.go b/pkg/protocols/fullnode.go index 7cfad67..ad14b76 100644 --- a/pkg/protocols/fullnode.go +++ b/pkg/protocols/fullnode.go @@ -11,3 +11,24 @@ type RequestPeers struct{} type RespondPeers struct { PeerList []types.TimestampedPeerInfo `streamable:""` } + +// NewPeak is the format for the new_peak response +type NewPeak struct { + HeaderHash types.Bytes32 `streamable:""` + Height uint32 `streamable:""` + Weight types.Uint128 `streamable:""` + ForkPointWithPreviousPeak uint32 `streamable:""` + UnfinishedRewardBlockHash types.Bytes32 `streamable:""` +} + +// RequestBlock is the format for the request_block request +type RequestBlock struct { + Height uint32 `streamable:""` + IncludeTransactionBlock bool `streamable:""` +} + +// RespondBlock is the format for the respond_block response +type RespondBlock struct { + Block types.FullBlock `streamable:""` +} + diff --git a/pkg/protocols/fullnode_test.go b/pkg/protocols/fullnode_test.go index 3e996d8..d012e27 100644 --- a/pkg/protocols/fullnode_test.go +++ b/pkg/protocols/fullnode_test.go @@ -38,3 +38,24 @@ func TestRespondPeers(t *testing.T) { assert.NoError(t, err) assert.Equal(t, encodedBytes, reencodedBytes) } + +func TestRequestBlock(t *testing.T) { + blockHeight := uint32(2347) + hexStr := "00000000000000000000000000000000000040340000092b000000000000000000000001adcac4c82bc188b377ded9d77e4ba90ec871f9c0b8e4798a1d23a65900e0c10d3d9bd31d291abb6b4c6ed7c151032ddf690745b22d2f6f10f2c0ac3f8e14f5150e18f115f00182fd324dffdf8c57792e9d26adc9841ea0d8214afae9f44c5bd3f06af06bcaee17dca035be794c36c423288cef2fdf5900b66a2f7e9c163da148e9101ca260b084f678b4ae0ca5772b5750b7f44394efcfc351800f21eac65d900ddebbbf8e47732000000100b18870d5b5fcd7baa9445c1f8458beac4dcd10fa9254646a5c6b11d018be82a803487d8518448052600935b18943f7e7db758db3ac1631018e3d18336505e452c768506d44094bf209c2b015ff2cedfd7aa6e9256e13b4652adb8c1452c501a933404761806f4e11ce2e138602fb17ee0383c071b8fb7f47679501b77a1d53c18093ebf53269a43650bb78737e3da4150d34927b5c3cfd994d77b34f061376d104e64dfafbf9eb313f0b0aa88059b7d95af5c8ee0e4ea4737a7172109fa990e5587917e5c6b07237de592d4309c319095311b920cf5963c4e7243c9de9fc3d3cadc69bfcc503fe28551e6886f4a308cc9383eb552516908323ca4bb7a006c70d01c188b377ded9d77e4ba90ec871f9c0b8e4798a1d23a65900e0c10d3d9bd31d2900000000056000000200ae256619f34f64c60b9c3821ea69e178cc601e49cc4b246176c17c51ed694b8584da0393e82142029f717214e0b44a31aaaf9875f27079f40de19ddec6b3360269a5161c2f2769f675f8e7ce8b457fa7bcc0a86e1f9330b9dd4e559b38137a0d010083b3a189e345f2af24515e39ea92b13bacd6dd8c14b257725bd93cdbb63ea88f135e3acf7e6ae5b960a6cd8db0cb3d020512990bba2ce011ea58cad1262b28e0db72e4309c7a2695908bfa3aefeb89335407626f7da8dbe10ca6f926de15a981c188b377ded9d77e4ba90ec871f9c0b8e4798a1d23a65900e0c10d3d9bd31d290000000005cac4c80100424506b6b6957111f455a922fcc02a6456170c2d2a9a77a58f35d95bc14e0d91be5efb9d73b4c3142b2d9ca8445697164088fb2f3b7569239820e62166c58b2009ac1c20347fec68b93fbeba55080cdf09b671b17b29360464a22785fff5b81a010001103b14520e67df9edf58dcd3028c37d779b20e2a9a1d8870cd8d34b81305e92d0000000000028f1202001d872926b6b4512e9f86240409a4dcb529a789f33bd45d5c3403d8557d20731122d457feb0a4c2ba79411e4213a14a9437a4fa71c88bdf2f60085c0a6b154f2790325aeade83148ce0138a1df6479010ad831be24942d2effeca810d0f1baf37020195489a1064ce6366a92284e10eb4bacd284f7d7e085ecd62782fc7b1703d4bd395f65a469c5c37ae8a16b0756a1f5ad80407bf1c588749e90f68150ef14a407551eecccc329849f48e161aebf55d7085129e307588d1853e5e037fab7259df29cf4d9ef9dac40874f3a589f8eeaf10825bcb9e9b90074adc72cf6f3382ae65e900000000001b78cf00003e7378f866dabdd35ee5e2c5cfb7115b725c2e90df25dbba2590ff6d4b4e56feebdc774d01aee49e95e529e6979e6f47259c3611b3396fbdca3a2c4dd82fac68836eee4a71bc7f75a12f3febcdc1f80bf201b2ff5b9d994df9c3fda9df0a5b17010001adaa67a9a870fd370fe16fcbb65c4be294dfb6579600323d6e1e597b11256dee00000000001b78cf03005e37c168d5761771d986f4766c6972ef9b0653f3adf917d335e7cefd790cbecddecf021f9df463a6a801e8eedc73aa569f5c027bdec416813f2ff334c88fe72051f1568e27811b011d35da29099004eb09ba6a038844832bd725009d18a1b81701000001000000006403002c6a887316e81f4273ab2beb3ac84f31825a31f4afd0e723545b75acea10caf64b5dda4ddffa13b985086b2ee88fa5a1d4748d34f9b8ccd8b40418a8291d3e0491b4ad5433d7e9e1902f9e73398cff543372d6ba60bf07c21161e236da73f7010e05010000000064000057b0969c023691431262bd495c50cb005f3388a4750566a98b35761827e5f94a5673cb0bd89013313db595e51dc0c19cd3b426806d79420320f4e84031bd3f0befba686e74483ddc8ea239d27a37048474a09dd920d0b5f2fb91571f63d7762401000101020000017e0000d09482e77fb1dcf7c0229a46692a4f38f991688149f676a876ba0c3e166f3994646381a763404f5584d76283ecafc2fe678a0a81b1e75e73a36d19159182600395ac30168044f5f427071e76d97dd4b70eab06be6fa3ac24793a4488780e6509010000000000000091b4ab6fab4f3e3f7912e28e385a195a4a4e65b325bfbe313114da885eaf74e642179d0200889b70e2b2032c4d44406a4e9177f4158fb7609b930876137437ef3de3af1c8e7e8500273ab77a3f6e40cceccd5d491ac291ec8af137c100aff9504007e1de0aeb572d73cb348d529da8defef95b8bd815e2f2814b7b528596fb1a6a48f26b130100000000000001b454bca04db73ba1c4c19c470866e511a71a73600837ac8467cba42b57705132b16c050100908b4e5520fdf9edaaf02fa81e54a1b59aacc90195ed7f96456b56f5d606b2d70d99f3270c8de66a19526d221f1b003e23e4b90def8b62f2c764861c61d724779fa7d397e5ab91c30106fe4957e674a3d2ff65c06d1808a91b32c23c08c9c312010000020000017e02001f906ed8f095bad9d70c3d5b792b7b3d6a50ee8f6f3fab32876e99910d4be748f01e450030e237dc7aef7380d266179a98a6305125e1f3ac2cacab93dde0402e6e4ae45d445d9cbe59026d1229cf241bd7e8486dcf3d20a2d2f01e48370ce14502010000000000061ae4907e5e332380a2689e77ea9a485fbb5d6a3dd84c5aa179d3d9a003fecc43f35b270300aca0158c98ff464f7942257f901ea60f2a95ad1f9376c17b42a0bba97bd86e5b65ed9e93526334c6ed0ceb1b2032d2af24547573569c2801fb2d8f42b0ad8c5daff72f0bc62dc2503f9385f00c719a7ddf9261166fef6114afbea3966ce1af050100000000000012504890a945b69bc719b5cc9c5059a348d5034c5401f0267d6a1128837178a10b3afce301002b418db30870754b5d0abaa3a4fd1060591a85ff964997ca4d29e42a71d019c22e1e025397642a89c0e13bb1f742c5ed97de55f97c0ab63e640e10be2b2ebe1bcbd629b8906cbb0420a1f5ab1583090ec08a341217d85756ccf2815846f7fd2102010001020000017e02009a50a6536d487c9a7fad852bc3ab9ed2dca8d633164a647f2cdf20468fb02ab4445dd6ce85d16641aee46e1340a530e0917caadc0f5ec9fc7fc1b928698c4a12ff306deb3689d18bf6c90af772bba1151cb1b82c4f319b86b0def633bd80c51805000000000000061ae4d251d5e5e51661e483dd39862ecfbed6ef3a48529b2b522a431c67862d9bb6548b0200d42a2de42e351a2b5b0c3e9aa3adc3806033f233147e1cc8e77984601e2fdb888712f45bdec670e65b9a38825f0e84a91ae4606b548a55a19cb4336dd2e5b569ff6867f1c28714cfb06314849e55896a025ae0d57c751864b5c8ca1d35e3245701000000000000125048e8c5405ea099da345f6f8fe9d092f9ea51b6a7fe48b37be3891b05c051db9393e101006a30c805895b64dc89886fe508c3c3f0fa2a25e4bc17f9be12a37ec32e03ce7c5548130ff2bc98e8a19452e5da259ba95b1c3b7e687463dc70e704948b9709097331606e05dbd94aea96017668943475f160cc3e91de3448dde4ed81cec2d0130100008416fadbf6c13544d2be22bf69ac81679c237e3852972af2694c1c26466025ce2a0b38d5feda302fb27579e85bbe01ae70ea0871d20601d0ed7f3abc25ebf9989825bc9b4470bf03fe10007531435dc7b5332552800aa120b36f3baa02abf9e1cea41d2961b6132fcaea28ca35b425cb9bb2a23c71fa8af3c44509dfbb4e64670000000001aee44571244f660c4c22e0e2f85d51c2bbdd75e8217e04afa159b603739aa0ab133cae0ef53fbcb5a2ad59cd976bffdf18cd2cd96c64790c9a11549a873e99db22e6ce56e2105ea2c37a6d1cafc1cfc3cc03bdcc8eea62bee18ed99de59fb828cea41d2961b6132fcaea28ca35b425cb9bb2a23c71fa8af3c44509dfbb4e64670000000000000000000000000000000000000000000000000000000003a2c7c9b14fca84c30a94fddee8dbd01327103f6f3db7b45ed493603ff39edd2c0702c1404ebdbf1216619572fe54d4320919a60be60dea18928fbc108e638a7edf8df714ce1b708dada423602913cd59be9e018dc128ed51c32e959e87a2a3e603cb49000000000000000000" + + // Hex to bytes + encodedBytes, err := hex.DecodeString(hexStr) + assert.NoError(t, err) + + rb := &protocols.RespondBlock{} + + err = streamable.Unmarshal(encodedBytes, rb) + assert.NoError(t, err) + + assert.Equal(t, rb.Block.RewardChainBlock.Height, blockHeight) + + // Test going the other direction + reencodedBytes, err := streamable.Marshal(rb) + assert.NoError(t, err) + assert.Equal(t, encodedBytes, reencodedBytes) +} diff --git a/pkg/protocols/messagetypes.go b/pkg/protocols/messagetypes.go index 2bfc4cb..eea20f7 100644 --- a/pkg/protocols/messagetypes.go +++ b/pkg/protocols/messagetypes.go @@ -9,6 +9,15 @@ const ( // there are many more of these in Chia - only listing the ones current is use for now + // ProtocolMessageTypeNewPeak new_peak + ProtocolMessageTypeNewPeak ProtocolMessageType = 20 + + // ProtocolMessageTypeRequestBlock request_block + ProtocolMessageTypeRequestBlock ProtocolMessageType = 26 + + // ProtocolMessageTypeRespondBlock respond_block + ProtocolMessageTypeRespondBlock ProtocolMessageType = 27 + // ProtocolMessageTypeRequestPeers request_peers ProtocolMessageTypeRequestPeers ProtocolMessageType = 43 diff --git a/pkg/streamable/streamable.go b/pkg/streamable/streamable.go index 1c465b0..f7316a7 100644 --- a/pkg/streamable/streamable.go +++ b/pkg/streamable/streamable.go @@ -3,8 +3,10 @@ package streamable import ( "encoding/binary" "fmt" + "github.com/chia-network/go-chia-libs/pkg/types" "reflect" "strings" + "time" "unsafe" "github.com/chia-network/go-chia-libs/pkg/util" @@ -60,60 +62,13 @@ func unmarshalStruct(bytes []byte, t reflect.Type, tv reflect.Value) ([]byte, er return bytes, nil } -func unmarshalSlice(bytes []byte, t reflect.Type, v reflect.Value) ([]byte, error) { - var err error - var newVal []byte - - // Slice/List is 4 byte prefix (number of items) and then serialization of each item - // Get 4 byte length prefix - var length []byte - length, bytes, err = util.ShiftNBytes(4, bytes) - if err != nil { - return nil, err - } - numItems := binary.BigEndian.Uint32(length) - - sliceKind := t.Elem().Kind() - switch sliceKind { - case reflect.Uint8: // same as byte - // In this case, numItems == numBytes, because its a uint8 - newVal, bytes, err = util.ShiftNBytes(uint(numItems), bytes) - if err != nil { - return bytes, err - } - if !v.CanSet() { - return bytes, fmt.Errorf("field %s is not settable", v.String()) - } - - sliceReflect := reflect.MakeSlice(v.Type(), 0, 0) - for _, newValBytes := range newVal { - sliceReflect = reflect.Append(sliceReflect, reflect.ValueOf(newValBytes)) - } - v.Set(sliceReflect) - case reflect.Struct: - sliceReflect := reflect.MakeSlice(v.Type(), 0, 0) - for j := uint32(0); j < numItems; j++ { - newValue := reflect.Indirect(reflect.New(v.Type().Elem())) - bytes, err = unmarshalStruct(bytes, t.Elem(), newValue) - if err != nil { - return nil, err - } - sliceReflect = reflect.Append(sliceReflect, newValue) - } - v.Set(sliceReflect) - default: - return bytes, fmt.Errorf("encountered type inside slice that is not implemented") - } - - return bytes, nil -} - // Struct field is used to parse out the streamable tag // Not needed for anything else // When recursively calling this on a wrapper type like mo.Option, pass the parent/wrapping StructField func unmarshalField(bytes []byte, fieldType reflect.Type, fieldValue reflect.Value, structField reflect.StructField) ([]byte, error) { + var tagValue string var tagPresent bool - if _, tagPresent = structField.Tag.Lookup(tagName); !tagPresent { + if tagValue, tagPresent = structField.Tag.Lookup(tagName); !tagPresent { // Continuing because the tag isn't present return bytes, nil } @@ -127,7 +82,7 @@ func unmarshalField(bytes []byte, fieldType reflect.Type, fieldValue reflect.Val var presentFlag []byte presentFlag, bytes, err = util.ShiftNBytes(1, bytes) if err != nil { - return nil, err + return bytes, err } if presentFlag[0] == boolFalse { return bytes, nil @@ -161,6 +116,29 @@ func unmarshalField(bytes []byte, fieldType reflect.Type, fieldValue reflect.Val fieldValue = fieldValue.Elem() } + if tagValue == "SerializedProgram" { + length, err := types.SerializedLengthFromBytesTrusted(bytes) + if err != nil { + return bytes, err + } + newVal, bytes = bytes[:length], bytes[length:] + fieldValue.SetBytes(newVal) + return bytes, nil + } + + if tagValue == "Timestamp" { + newVal, bytes, err = util.ShiftNBytes(8, bytes) + if err != nil { + return bytes, err + } + if !fieldValue.CanSet() { + return bytes, fmt.Errorf("field %s is not settable", fieldValue.String()) + } + newInt := util.BytesToUint64(newVal) + fieldValue.Field(0).Set(reflect.ValueOf(time.Unix(int64(newInt), 0))) + return bytes, nil + } + switch kind := fieldType.Kind(); kind { case reflect.Uint8: newVal, bytes, err = util.ShiftNBytes(1, bytes) @@ -201,27 +179,67 @@ func unmarshalField(bytes []byte, fieldType reflect.Type, fieldValue reflect.Val } newInt := util.BytesToUint64(newVal) fieldValue.SetUint(newInt) + case reflect.Array: + switch fieldValue.Type().Elem().Kind() { + case reflect.Uint8: + for i := 0; i < fieldValue.Len(); i++ { + optionalField := fieldValue.Index(1) + optionalType := optionalField.Type() + bytes, err = unmarshalField(bytes, optionalType, fieldValue.Index(i), structField) + if err != nil { + return bytes, err + } + } + default: + return bytes, fmt.Errorf("unimplemented array type %s", fieldType.Elem().Kind()) + } case reflect.Slice: - bytes, err = unmarshalSlice(bytes, fieldType, fieldValue) + var length []byte + length, bytes, err = util.ShiftNBytes(4, bytes) if err != nil { return bytes, err } + numItems := binary.BigEndian.Uint32(length) + + sliceReflect := reflect.MakeSlice(fieldValue.Type(), 0, 0) + for j := uint32(0); j < numItems; j++ { + newValue := reflect.Indirect(reflect.New(fieldValue.Type().Elem())) + bytes, err = unmarshalField(bytes, fieldType.Elem(), newValue, structField) + if err != nil { + return bytes, err + } + sliceReflect = reflect.Append(sliceReflect, newValue) + } + + fieldValue.Set(sliceReflect) case reflect.String: // 4 byte size prefix, then []byte which can be converted to utf-8 string // Get 4 byte length prefix var length []byte length, bytes, err = util.ShiftNBytes(4, bytes) if err != nil { - return nil, err + return bytes, err } numBytes := binary.BigEndian.Uint32(length) var strBytes []byte strBytes, bytes, err = util.ShiftNBytes(uint(numBytes), bytes) if err != nil { - return nil, err + return bytes, err } fieldValue.SetString(string(strBytes)) + case reflect.Struct: + bytes, err = unmarshalStruct(bytes, fieldType, fieldValue) + if err != nil { + return bytes, err + } + case reflect.Bool: + var boolByte []byte + boolByte, bytes, err = util.ShiftNBytes(1, bytes) + if err != nil { + return bytes, err + } + fieldValue.SetBool(boolByte[0] == boolTrue) default: return bytes, fmt.Errorf("unimplemented type %s", fieldValue.Kind()) } @@ -311,6 +329,24 @@ func marshalField(finalBytes []byte, fieldType reflect.Type, fieldValue reflect. finalBytes = append(finalBytes, util.Uint32ToBytes(newInt)...) case reflect.Uint64: finalBytes = append(finalBytes, util.Uint64ToBytes(fieldValue.Uint())...) + case reflect.Array: + switch fieldType.Elem().Kind() { + case reflect.Uint8: + // special case as byte-string + for i := 0; i < fieldValue.Len(); i++ { + finalBytes, err = marshalField(finalBytes, fieldType.Elem(), fieldValue.Index(i), structField) + if err != nil { + return finalBytes, err + } + } + default: + return finalBytes, fmt.Errorf("unimplemented array type %s", fieldType.Elem().Kind()) + } + case reflect.Struct: + finalBytes, err = marshalStruct(finalBytes, fieldType, fieldValue) + if err != nil { + return finalBytes, err + } case reflect.Slice: finalBytes, err = marshalSlice(finalBytes, fieldType, fieldValue) if err != nil { @@ -323,6 +359,12 @@ func marshalField(finalBytes []byte, fieldType reflect.Type, fieldValue reflect. finalBytes = append(finalBytes, util.Uint32ToBytes(numBytes)...) finalBytes = append(finalBytes, strBytes...) + case reflect.Bool: + if fieldValue.Bool() { + finalBytes = append(finalBytes, boolTrue) + } else { + finalBytes = append(finalBytes, boolFalse) + } default: return finalBytes, fmt.Errorf("unimplemented type %s", fieldValue.Kind()) } @@ -344,7 +386,7 @@ func marshalSlice(finalBytes []byte, t reflect.Type, v reflect.Value) ([]byte, e // This is the easy case - already a slice of bytes finalBytes = append(finalBytes, v.Bytes()...) case reflect.Struct: - for j := 0; j < v.Len(); j++ { + for j := 0; j < int(numItems); j++ { currentStruct := v.Index(j) finalBytes, err = marshalStruct(finalBytes, currentStruct.Type(), currentStruct) diff --git a/pkg/streamable/streamable_test.go b/pkg/streamable/streamable_test.go index 432dd2c..ac411d6 100644 --- a/pkg/streamable/streamable_test.go +++ b/pkg/streamable/streamable_test.go @@ -219,3 +219,18 @@ func TestUnmarshal_Remarshal_Handshake(t *testing.T) { assert.NoError(t, err) assert.Equal(t, encodedBytes, reencodedBytes) } + +func TestUnmarshal_ResponseBlock(t *testing.T) { + // height 5,109,110 + hexStr := "00000000000000000000000000000003f57cd690004df576000000000000000000001c2ced0ea40a08a8cf2107cd7971d7d2dc630a7b2dd3be7ca4a5d13fb18ca92a4a74361d295f9eaf2b8cf2d16ee51d1ca0c14d3ddf48ce6b1598267311caa4c168cd13c7d773bf01864ec0e64eeb8d1ed12e974a521b07f48ebdba596372cb8253005772e77638748f8ada84b2add1a39a85d0f24a27a543008fb38bdea4ac25d3a3678e860f4660aa06b9b48bc0264e304b2900f8b928878d560c62f4c2466aa8a69f4d1ca19d090d20000001005b05b6e68b7b4e10a21385b64923f6758d6988a7f73e31028357e6f69a55f8fc2d659b7f9573213ff2f69d7f158133e7b551d789aff3f6ab57aab097e53ae1a12bdedaa93524d481e47a295deade3aad7788053df5ac38fa8ff09f97fc4e496d7fa35ef18442962035e18295e8b09b7eb353834baf0d8df8656e2e97d5473a91db70c041f6550d34a5316ed9cb649cc1b2eb621f55f416cd1c87dab36c1b02da65fa71b6304f278be98b4ef1170dd55cd43c361a5cfeadfdf10dc59c141c6a4b223f3ea83953994cc4eb5c3a467a24ca56333a52d7492aa98ffe59ba2f7efefae8ba0ac905634c86ac475dbbc36816bf518af958e4a0dac01c9c47346043fdba01a8cf2107cd7971d7d2dc630a7b2dd3be7ca4a5d13fb18ca92a4a74361d295f9e00000000045800000000bb24b61d8b566ce125232a0c0dd1f3cd4c2ace92a4b4e54966c45a216b37813f4fec55647762172d0b44af60d0f2ce057db01d3a92bff8c5433a077975d39b704e1a60ea1bd2e9c6f5bfca5ea77669542ca4c4c5ded3d42751bb235e489c4a1001008e791267e5c8c166745c86493c240e54f7585e8cce81e7828b25d3e1094ca6a1e85431df54b59f2eb7aee2c9055009661400714e938fbe1c9fc393844b065c751b1c5113e38e29a2fab64ed2a49d213728a08150e777dabfa83fc629c961041fa8cf2107cd7971d7d2dc630a7b2dd3be7ca4a5d13fb18ca92a4a74361d295f9e00000000064ea40a0100e0cc01385f93e6ebe663827fe924295a922631e6b59ae243cd3405ee0c402e0c17bb29b7170080bdb0b2501d04749b12f08f220975bd6a893eecd7857d998317bf87a84ea4f6ae9da1157ce4014ec8e5fc330809a795632fe72a023bd8efed0c0100017e6a035916292ed17ad9def33dc5281c7c8e0631aba9fded2598ab22aefe2ae400000000010bbee50100d28ea2ea876b61bff6ced34fcc2aea7645419e7a39c7c13a16c879b8922f36846efdc0dc8fca76b842fdc520f254ac4c21cb9d674815453a077c03422a14341889700b5c66a70bf7f39c012f37f01993cc3881896f14cdfde3628b6914609c170403b12c9d88ebdb2374ae611f48259e985e77ee26379c9a91362067f6f2033f497303a804bb70793aad71c5612c398a20c30c37db50acf3fa4721973b8374603c1ffd30719006dd430b764ac86acd290b073a048c3ed720976df3e6bde24559b1d27e6a035916292ed17ad9def33dc5281c7c8e0631aba9fded2598ab22aefe2ae400000000030262ef0200f7b3ba0428ea2a18a178c4d7391100b9856c0ea203fb003afa2b85871458c0449689acfb68e6c301406e60860ccb85253ebd030b54e5da92922e800122c2d50411cbd95299a83aa6af5bd3be989ceacc6cfd01838ddbb6ffbcee97d11fbb5f04010001474015693d396b34b27bbfacff7a6eb7e620975124c835b78443f5a17f35d4b200000000030262ef010028ff98cce279e271a4b002015adf16c41b4d398682ea6dbb979116a0bbcdaa8477e380fe644dfb8337ad6ffe3cf12535c7fe6593cb8964a6d0ad87dcc337254b6f42a650c25c34e5021526e36641dd7aa7ec917b617934220508606dac404a1c01000101040000029800008f1da7c7d8a3d38844b4d092bee390681e3659d4ec51d32e8900d6fc7b97f4ad52046a834b14dbd74d1dd266dba30fb83b3e572236b2bc61a8e0c00e55c7d8029cb7157c2ed702687ef10d83fc89a7e3a1f0258a1151f9571a7004396bb1b6040e000000000000225ce0b9c6930e1b67f9fac378386902f96589017606e465fb0a34a6730dd9cffcd2e39302003ecc02211d40c9ba3354fce9fe063302ad519ec657e9e492a30ee308a45012fd75db0bf4df00353b1022a10a9e268c52f026dbf54864087114cbdbf1bccaeb30e729f36f19a3802e07eff1ce99ea113b2fead729a801c9aa1501a5c7866de52801000000000000670700c273721ff66471c076fa75bc325c0a28bcac5a21ee1ad7ec01aac499710719fc810200b9e6fdeeddefc05d2b3a2bce83bcc867c4624429bf6e2715fe75c76cc779bbcbf038d6a66bf49320c0b438ccee5a747a4677e3c0ce9df77acba2239958a85d46ad2a64d2e9297fc7a2032eafd52ed56aaaea5fb82a16e49409d186454b89e444010000000000001d9a20b3aea666586a7c268d2899f244d8b3aeca1845a5dfddab6cb8fe26e16429fa39810200f1648877803f9b415304ce9d0e520688ceda1a410bf8fa16be503e4d6b8c6d13f1a90726470238e19616397af0a289b819cbfdf9f6528a9bfc50cb93b053d400afa73aa73c0c0c553f0d40775ed2d735f98f7fedfe99b8c234fd53430ad2bc002903000000000058ce60e5a414a2ae07824e9a154df91975f41af5f324aa3cae28ac567b6960c745a6ea970200ac9bafa25fc19f5e5e68e405d3c88c9a9aec1093f31b4c717c0970816e8e8df353a25c8077d9b3048998e8aa1d5ec7f96a1e1fc06a79723c046d49f830296c3ed5cbb8c2932707dcbded5fab7403557e985b15361c0937ad5e8cded4f4a00e150100000c0000070000002f1647a60bce99f7fc9bd5e26348723be49b7fad5ae8b375ec7b091b3f31a76bd62b0aa8902b9a05093ce6c1b190201710d7964cb0dab2ac6c21c0a145ec3b21ba55784dc6bea4acb3df4f6249f76d6072d3713fad98eaa510c562c40d8cda0402000000000000167600d21d04474cf6fa7f56e0ab00cb202b9183adb792cb1bae8110e500a0c76ae803f50300ce371cb60caaaf91b504d4399c42dcd3abe0d5a6704eccde3f9a03783f851fe89f5589b55eb5d69b0b4b04147d4e0ed4e266764c6cc19d28b66179998aa6e563738b2bdb5927529fd134630709fd8ee5570c2365b71dd3f9881abc8ddf540318010000000000004371a0a28356ec0314e2bacb228cb138376c7c3c12ef9f4c94b0dfb96da6d9762957b5c101005265b41a82055ddec3ae6197666c67e242b256b009617ffe4130d6156e0106c0d1465b33a49d10e29e26e1d6b99205bb52e79316a352f21d58e840d89219181dc1e2f7f40aa7779cd831bfb2af35a65512b19a2a4893b330075da62834b65a4c0100000000000022baa0da1f6f5e7e1aa6a93f570f77943e2507635a8e17af1828581af04079a6dd82a43d0300aaeaac664d785e000e37fe071decd0328248d2f326a1d8b9bc740a53e9e0e5fb3402b961c51ea868cbe1f155e4e8af8fc7dca7543c450097ee5e174fd520835513c0b7552c6d404b66df30f3ed58933d0d43e7ca9f4e1bc20051dfeaec53475f01000000000000683f80a3a824f5f2cbee20420fb31067761e97b1bba21b339359bdefedac04678b7af38f030025e454274e97f131a563bada7ecf1b9799915b62a4924f3f8e7323c3986e74fcaffb8e7465fb59abc0bacad5b172ef55997fd1df27cb47a2de1a1ec3e2b1db30fea4801e8ff5c59cfd95bc0a084f7cd79286bcff84bbe01c61f233dcd4102c430100000000000022baa0e5e10cb0a2ec03eed10bc54fbfcdd0021d77fbd325095801608fe49f66023531a90300fbacf6e31d6ef8f8a6951add80536085f28e1826cc0d900fd455d47bdc63971de9ed45ad306ee291f3f68b81c8f6375643c006ef7c6fbffe7be70b3dd893e8050464aa6b97fda56f3540ef20e288404ed08d4e7ff161c26413dddd5b7fb19a07100b0000000000683f809f64b5d037441e9b8ae91ecf1915e592b80fbbb5fdcf0a9d365296469b51ba4e970300feaca579a4b9cf9d467c547c0e4285267b259899bb4249933be0a726f70620d58f947eeb7eae6342aee0d5b2b28c46ca1879d7118ec2a9341af9e619e66e140a896e2c7e913ca5aa27697281e2ecf2ee89e384b5e1e619c9fbc98777280fb9000705000000000022baa0de92f912c41edcf6d613b8ed22f51a0e5f461ed1d4351691e018fb2a3d6ec9d04700002ab03157333c875c660375fff210242efd6d3f718c7d4e6a5abe849a2e677fcdfaad47ba24f74295ca6194a30bd34164a8309bd88f7d5e58a99e16bb3a23323be57f765aff50ead4fffc9bf34882a68557d38847758ed3a3e1fd0b604292652c01000000000000682040e878a0590b51b0d6efb22519c4e69f53729355945a88014f0bcc9e62c06298e01d0300d0062a2aa7c0d641a5920fdb246d7bd3b3f4893b290320b1ed6b17d5b05e9fa66c9fe9d8d1950fbd0c87631f190f5f01941ff56877407e63129465ef763d61193902f84a90a8fd5dcd6ce16a2235fe6b0753b7c92cec7514397d00dd6ce8f10d01000000000000225ce0b9c6930e1b67f9fac378386902f96589017606e465fb0a34a6730dd9cffcd2e39302003ecc02211d40c9ba3354fce9fe063302ad519ec657e9e492a30ee308a45012fd75db0bf4df00353b1022a10a9e268c52f026dbf54864087114cbdbf1bccaeb30e729f36f19a3802e07eff1ce99ea113b2fead729a801c9aa1501a5c7866de52801000000000000670700c273721ff66471c076fa75bc325c0a28bcac5a21ee1ad7ec01aac499710719fc810200b9e6fdeeddefc05d2b3a2bce83bcc867c4624429bf6e2715fe75c76cc779bbcbf038d6a66bf49320c0b438ccee5a747a4677e3c0ce9df77acba2239958a85d46ad2a64d2e9297fc7a2032eafd52ed56aaaea5fb82a16e49409d186454b89e444010000000000001d9a20b3aea666586a7c268d2899f244d8b3aeca1845a5dfddab6cb8fe26e16429fa39810200f1648877803f9b415304ce9d0e520688ceda1a410bf8fa16be503e4d6b8c6d13f1a90726470238e19616397af0a289b819cbfdf9f6528a9bfc50cb93b053d400afa73aa73c0c0c553f0d40775ed2d735f98f7fedfe99b8c234fd53430ad2bc002903000000000058ce60e5a414a2ae07824e9a154df91975f41af5f324aa3cae28ac567b6960c745a6ea970200ac9bafa25fc19f5e5e68e405d3c88c9a9aec1093f31b4c717c0970816e8e8df353a25c8077d9b3048998e8aa1d5ec7f96a1e1fc06a79723c046d49f830296c3ed5cbb8c2932707dcbded5fab7403557e985b15361c0937ad5e8cded4f4a00e150100000104000002980200d6a86119d29ba0c85bcfd0177c1d328eb98d046945499136cdf341f09eb28f78520d6e68326ea17b0479b12d072b1f928a0ea8b3fa33ed1333a45185ff2db715d1ae878fea9d4aee4058123c2d58f7310d935a812bb03d4e7753e3cb7b1f310202010000000000225ce0afa61ac5956f5ec3ce045c8ea22ff097cc9c0f16cb9353e4be60ddb816f43c211703001c4a890e385ab36b3a66e95d562af9253d5c0fb6d32d23fa259bb5b6da0847e747e5a7458775ab4adcaa056ae7958c4deb765c3a2ca180c1942504dcd1bb4d0e9fde117775958c21ee170300007787bf0bb5e88f65a3ebdb8ace6f469f79e10e03010000000000670700ea909ea3cf93d7120faf6647710df2da4af17b33b9bd84ebc6f276a73d5c354f5d000077ba729cdf81e630d963f825961db076438216a700ec7deb2c909737f0a0860298af9494c2a002230be229ac9b82e7b1845fadd04c0df58bd064ea374bc0ad1e39d4f19c0bbc0c17f2948d447c471f0589069e1718aa2715a766fce48b69e548010000000000001d9a20a192b5a6555b1fc2c8a628205d140172383c554bfe8adb01cf848691abc956b1790300d8fa69586b012d615f9dae48471282dc06670aad707187370b13d77eac91dd4076b7a3f05f53175bd05919adcf362619f0219abfd2e5e66893222a356d4601007726be835c0c5d9bf9b8a34fead3bd3d91fa6fc69e242d079c82066c3cd815003913000000000058ce60dce29c00a51839e11de98b655a1ed8860efff5ad93080e6c6af241300bb88641550000f49f452ca1600cdacb149466ef999667d422a08e14cdf1c731dda894be785e4ef09ad8a32903b45a6fa2c2176f1c724daa7ec20f9429adead3638aff348e3249857ca023a64ef1ce9a11b0b35ee9c4944cdbe19e4b929c92b1690ecbf1fe926a0100000c000007000200c2822515f0b670534fa606553272f93f467e9048cd14503e7c2eb07b19561a00965252d12099810c527dc83c6259a5df3cd4a12af1da58fc6256e9df069cd3393746601d7627aca73590adb2c3ec24bbb61093adb11a8a3b251c63ffb1ca550c01000000000000167600cccc92a69908d4da791b4b5d758ffd435dac03fc2a1004f4ffc81045c2b217c015010008dc3020fbc57d808e7bbe200c8bf42d793c40cf8979ee8600b7b21ca2a32dca95ea4fa71dc2e080e3001fa47c437d1775da6bc9a3532f63ea7013d28fe18e1f0b5a82ff89ba875eca5c8242a44d8e7080bec9c5dacf654439bc586240bbb610030000000000004371a0ad548dc505c5eaeec8621ed6e19d848adb36e6e438263a6fc07bea5154eed173170000dda2e94b8da51b6990cf07959800fc838ac23005454ef9fa433d2c308ddccb744e2690a03151049c2dc66959f02b213d202311c1e7518132bc7d6d05b759a3019221b60c4630bf499ed7be3d85a8551f85aeb1e1135cc9da8b9e1d76ee2297000a09000000000022baa0811a68e72d3e102ea6cfeb29b3fde1d07e4f1f6589a588449affe1e9f3ef1c4f9f02005963b3e50dbc36363e085a6bce2201ad92dba2d9ca41d2eaae3804253a0b6dcc16b9e74e29209cc441f2405199535f85e436e3d508c96b98eeef22691b3ea9044bec813a8945605949cd37d24b23dde76ce850ba0e1e220d573ec76397c09b0411020000000000683f80d342a7ffbaad3b19302e2654e566a42c2990edd8b73d643fb109806d716ac7201700000ca0725717616ca3578925eb947c24e5a9aaded9c45d030293f1152d649cb10539718348d6403dd3ba90bfd07c9048e93180d2508e0759ae1f1af0b673bff10e074ff9347a462dbd5b6ba8136d8e86cf36327a55e01dc80b57b9a11a0fe1cf0a0100000000000022baa0daed98cbee5e06d97514540ecb4351c6037e759ebd8ba3501c7738b88fd51f73050100efc288240d2910b5618334e001c4f2e9bbb541f33a9aef959bd21bb22f46a6001180145ef99e6a9bbc6aa03b6a3b6e52c076bd99ef5d2000c6669e303caba20a78a8be60d496480cee3b569c551601a146a675a53ba0b9dff1cf2af19b017b0604030000000000683f809d6ae2ef1709ce467771f369e494fd4e8d6ba48b2b321be68c3abd0c958bb14a7502003d06d91f1728ec16b1581c782f6aaf49675b7c6c68068b40e379787170fbff5580bd8242ccc0ffa0c695f92afc0e183af24217850d6ebdef936bbac1fe9fa303e62ae086d1b0ff6d8a4df18d198b7e1b43ff2a63d5dd172cd318682aa1d327110200000000000022baa09338cd287dafb989ffc90874c16851b37dbbb15d749eafe76d37dcaa6ca5d4f06f00006b5cf384c114290384e38a937349866c8be519452c1a468de4cab384a67b4e1f3310dc601afa64ac75eaef4f0881cb4088c05e4b8a7100178fbff225c373bd48db622775aad1ebeb5ab98440e5b19111c222c1c2df59562e5e76a33c15a9bc2901000000000000682040ea3b1310dfea22c04d14f00a328474c4d9b9c74cb7c672b1dd89a5dbd69f43da8903005443bbc5c041d14ea801fc88dc1b1294b6446915e4118e71d616d0da6c2192aaf7d2262d1a5b551a301145dd1974c9dd6b94ed81b1b78abcaf71815aeae13e07ad0c3cee680c57877cf6079e59d43c24494d25da0d32408641eba9ae39abf60509020000000000225ce0afa61ac5956f5ec3ce045c8ea22ff097cc9c0f16cb9353e4be60ddb816f43c211703001c4a890e385ab36b3a66e95d562af9253d5c0fb6d32d23fa259bb5b6da0847e747e5a7458775ab4adcaa056ae7958c4deb765c3a2ca180c1942504dcd1bb4d0e9fde117775958c21ee170300007787bf0bb5e88f65a3ebdb8ace6f469f79e10e03010000000000670700ea909ea3cf93d7120faf6647710df2da4af17b33b9bd84ebc6f276a73d5c354f5d000077ba729cdf81e630d963f825961db076438216a700ec7deb2c909737f0a0860298af9494c2a002230be229ac9b82e7b1845fadd04c0df58bd064ea374bc0ad1e39d4f19c0bbc0c17f2948d447c471f0589069e1718aa2715a766fce48b69e548010000000000001d9a20a192b5a6555b1fc2c8a628205d140172383c554bfe8adb01cf848691abc956b1790300d8fa69586b012d615f9dae48471282dc06670aad707187370b13d77eac91dd4076b7a3f05f53175bd05919adcf362619f0219abfd2e5e66893222a356d4601007726be835c0c5d9bf9b8a34fead3bd3d91fa6fc69e242d079c82066c3cd815003913000000000058ce60dce29c00a51839e11de98b655a1ed8860efff5ad93080e6c6af241300bb88641550000f49f452ca1600cdacb149466ef999667d422a08e14cdf1c731dda894be785e4ef09ad8a32903b45a6fa2c2176f1c724daa7ec20f9429adead3638aff348e3249857ca023a64ef1ce9a11b0b35ee9c4944cdbe19e4b929c92b1690ecbf1fe926a01000001020000017e010072afaa976d087d937d9b8237d2e1855a1b4d22392d9c734ab9c2b30dd1b37d8a6f642a18541965b34255d133e40fb75f82b2ea579cbfa81c36b2a43c9b92b40d5582e0890315c755a2524b66fa6c21542186a066d2647b9ef120f78a197cbf1201000000000000b12f60d4a6e5eff8c991b8b057772028c66fa42866885bb4845807907627e6ffb07defb30100309bd8c59e4f797e1e6f36d6ecb6ca97917864fdd5115de5a36cf54a48e64a8fbee482a9262935182947eeac545baebe29c358a65ec89d26bee4c48745e0670ad72cff1673caca80a674dc48ef46dd02be83683eb07decdc1f9b27026d411a2901000000000002138e20f9846a2de8ad8254ca50f2c9dfc6a24097be43fe83d4c60c7682411f9bf42727230300b495db1de00e08ec31ab57d2ac321229a36eaa54c16dee0aa5f8f894b369f118e3dc3da2f3f8ad0a0f8778870201180d0dfd1e7a196ad5918f73cbb4d539421019eb9eecc681a7d0806c7ef382646c9ead1c531b1ee117290854ea24cd062c210200002cccfff4540e7184ddb9fcc37a6ccc1040ff794f67ccfdd17ba998cabb396af10100e4cf58dd546462254ffffde70d45f521ebfb0985f72f8e9853d818fbfea79cad10cb53df974d5556306e27bc061e956ffc9f7f364b80b72dfc478d88079a9fbde16e03f55c85ecf94cb226083fcfe2737d4e629a981e5db3ea0eb9907af40000000001a7b94594355533b7b2651e52f365b1bad42c3ef127a959eaa2bdd197b142404f28e5c06f227a7be97830981fd0e7330a0a48ccbde4df1a8511d2d8bfdb947e287a081bd052807a228a51fbbe7c1e0d36a340ff0fea76a5332ef0476d837019979fbde16e03f55c85ecf94cb226083fcfe2737d4e629a981e5db3ea0eb9907af40000000000000000000000000000000000000000000000000000000003a2c7c9a07868cca2ea135b0d5ed61f7ecbdf5500afaa3dd5ca7713d51438e99f72afc795b5987ffaa38d30f7ec6eb880815fb501606b0cd48ab55e51d57ddb1792d48d5ca997b8804b0c9500ccf79eb70534e8b1a11b29fa996fc7c29c3ff3da6875da014be5a3a79133f6c65f0c8c1c3a2a5421b480da2eb0798a02c65b8e0b9ed687d5018489de4dbe89123e08b6c508501f63c79b1fcf14d3965ad65639bd25a70d84e6277d3d6d9f40570269aa7e7ced1b4a0010eb9d239b0602007f4529d8f450eb42d129f43bb74af8641d2565067c639b88778aac18bb898e65504ae5a7ad5c7c4f012cccfff4540e7184ddb9fcc37a6ccc1040ff794f67ccfdd17ba998cabb396af10000000065fc2120911e1eb03c103d88735fa2bcc8c39c0ddc7e1c3a33b089eb4d0db39fe9a7b6362db1475f3d4fa9137b98895331539264096c510b6830e7437367d4d8ff61b6c47a0b4279f9011bc57872480644ec0736c07af0f6c5e20afb28833c24f3ac39133b05dfdb51acb2f50f762e41dd4bc5de0b720b80035312f0ff42ccda6723b7a501a0bd8ac7b7e21b73943106fca32dd612e9490dcf65086bf9335636dd223b07de0101010101010101010101010101010101010101010101010101010101010101b1a5404013da17b61a182079e7d985c6079d9358e7c8e85f70c973de9de0aaea56728d3da4617aceaf907a6dee29ebe914910484a7f655383563f5c0596125a2cae56b81d6ea335000f7149cae5ec133d8f060d3e877322bc2b5777f305a22ef0000000023f74394000000000ccc645700000004ccd5bb71183532bff220ba46c268991a000000000000000000000000004df5757c3485d76941216875ec1a4450dc75ac16d5b543075464f50058b1fdc4fed53a000000cbba106e003ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df575bb1edee41e6419fd48678606312e402b9c88a98db49d5fd11ae62b6a71b0c88b00000020bb99e705ccd5bb71183532bff220ba46c268991a000000000000000000000000004df5749fbde16e03f55c85ecf94cb226083fcfe2737d4e629a981e5db3ea0eb9907af4000000cbba106e003ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df5749fbde16e03f55c85ecf94cb226083fcfe2737d4e629a981e5db3ea0eb9907af40000001d1a94a20001ff01ffffffa0c0644439d16b2afb2ef1c1616404e60fcfc8fa42fcd7dcb6ef29a4d162aa9f7bffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a769f0ad14205910ebca9e401c394d00fa8ca3fa8fb8ae5f49f176218b3e721754eb5152fc7ef9ed88bdd12c401dadc3ff018080ff823987ffff80ffff01ffff33ffa0aa5d03137d15adcdcf167a099d1ed90111c8a075aafea91d2efe176443489846ff823972ffffb47b2770273a2778636873272c276f70273a276d696e74272c277469636b273a2763686961272c27616d74273a273130303030277d8080ffff34ff1580ffff3cffa019c9b23f470c7ecf4165d25b60865d02f19be0f40893b14547b76e88a89752dc8080ff808080ffffa057df78f44490015f377cdb1374fe43e98eb967da9ac03dfc590057f81ff98fecffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a769f0ad14205910ebca9e401c394d00fa8ca3fa8fb8ae5f49f176218b3e721754eb5152fc7ef9ed88bdd12c401dadc3ff018080ff823e2bffff80ffff01ffff33ffa0aa5d03137d15adcdcf167a099d1ed90111c8a075aafea91d2efe176443489846ff823e16ffffb47b2770273a2778636873272c276f70273a276d696e74272c277469636b273a2763686961272c27616d74273a273130303030277d8080ffff34ff1580ffff3cffa040550e6c716f008ecdd765b3433ec7268523afbc7b59c67e33f31c50b354fe928080ff808080ffffa01f87c98a348eeef49ec19a641e4deb449ff39ccc81c4ba32031f920f911f578affff02ffff01ff02ffff01ff02ffff03ffff18ff2fff3480ffff01ff04ffff04ff20ffff04ff2fff808080ffff04ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff2affff04ff02ffff04ff27ffff04ffff02ffff03ff77ffff01ff02ff36ffff04ff02ffff04ff09ffff04ff57ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ffff011d80ff0180ffff04ffff02ffff03ff77ffff0181b7ffff015780ff0180ff808080808080ffff04ff77ff808080808080ffff02ff3affff04ff02ffff04ff05ffff04ffff02ff0bff5f80ffff01ff8080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4947ff0233ffff0401ff0102ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ff02ffff03ff0bffff01ff02ffff03ffff02ff26ffff04ff02ffff04ff13ff80808080ffff01ff02ffff03ffff20ff1780ffff01ff02ffff03ffff09ff81b3ffff01818f80ffff01ff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff808080808080ffff01ff04ffff04ff23ffff04ffff02ff36ffff04ff02ffff04ff09ffff04ff53ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ff738080ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff8080808080808080ff0180ffff01ff088080ff0180ffff01ff04ff13ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff17ff8080808080808080ff0180ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffff02ffff03ffff09ff09ff3880ffff01ff02ffff03ffff18ff2dffff010180ffff01ff0101ff8080ff0180ff8080ff0180ff0bff3cffff0bff34ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ffff21ff17ffff09ff0bff158080ffff01ff04ff30ffff04ff0bff808080ffff01ff088080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa01f87c98a348eeef49ec19a641e4deb449ff39ccc81c4ba32031f920f911f578aa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ff3effff04ff02ffff04ff05ffff04ffff02ff2fff5f80ffff04ff80ffff04ffff04ffff04ff0bffff04ff17ff808080ffff01ff808080ffff01ff8080808080808080ffff04ffff01ffffff0233ff04ff0101ffff02ff02ffff03ff05ffff01ff02ff1affff04ff02ffff04ff0dffff04ffff0bff12ffff0bff2cff1480ffff0bff12ffff0bff12ffff0bff2cff3c80ff0980ffff0bff12ff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff0bff12ffff0bff2cff1080ffff0bff12ffff0bff12ffff0bff2cff3c80ff0580ffff0bff12ffff02ff1affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff0bffff01ff02ffff03ffff09ff23ff1880ffff01ff02ffff03ffff18ff81b3ff2c80ffff01ff02ffff03ffff20ff1780ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff33ffff04ff2fffff04ff5fff8080808080808080ffff01ff088080ff0180ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff0180ffff01ff02ffff03ffff09ff23ffff0181e880ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ffff02ffff03ffff22ffff09ffff02ff2effff04ff02ffff04ff53ff80808080ff82014f80ffff20ff5f8080ffff01ff02ff53ffff04ff818fffff04ff82014fffff04ff81b3ff8080808080ffff01ff088080ff0180ffff04ff2cff8080808080808080ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff018080ff0180ffff01ff04ffff04ff18ffff04ffff02ff16ffff04ff02ffff04ff05ffff04ff27ffff04ffff0bff2cff82014f80ffff04ffff02ff2effff04ff02ffff04ff818fff80808080ffff04ffff0bff2cff0580ff8080808080808080ff378080ff81af8080ff0180ff018080ffff04ffff01a0a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2ffff04ffff01ffff75ffc06f68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569636b67366a67677562717362353237676171756c65323265727a716c716c766a6f676e6870706a62786d716f766e6575736a7a6d2f5065706542656172732d25323028343038292e706e67ffc059697066733a2f2f62616679626569636b67366a67677562717362353237676171756c65323265727a716c716c766a6f676e6870706a62786d716f766e6575736a7a6d2f5065706542656172732d25323028343038292e706e6780ffff68a0928d7f2c093eed7c41fc61117e25a8797d2f846c68f29cfc336d3b48e721db61ffff826d75ffc07068747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569636b67366a67677562717362353237676171756c65323265727a716c716c766a6f676e6870706a62786d716f766e6575736a7a6d2f5065706542656172732d25323028343038292e6a736f6effc05a697066733a2f2f62616679626569636b67366a67677562717362353237676171756c65323265727a716c716c766a6f676e6870706a62786d716f766e6575736a7a6d2f5065706542656172732d25323028343038292e6a736f6e80ffff826c7580ffff82736e01ffff82737401ffff826d68a0c6eac33887b5da58b34a2e7d6304c2c05a7bcc82cd1ffef0b16b7aad8ee64e5380ffff04ffff01a0fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78bffff04ffff01ff02ffff01ff02ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff17ffff04ff0bffff04ffff02ff2fff5f80ff80808080808080ffff04ffff01ffffff82ad4cff0233ffff3e04ff81f601ffffff0102ffff02ffff03ff05ffff01ff02ff2affff04ff02ffff04ff0dffff04ffff0bff32ffff0bff3cff3480ffff0bff32ffff0bff32ffff0bff3cff2280ff0980ffff0bff32ff0bffff0bff3cff8080808080ff8080808080ffff010b80ff0180ff04ffff04ff38ffff04ffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ffff02ff2effff04ff02ffff04ffff02ffff03ff81afffff0181afffff010b80ff0180ff80808080ffff04ffff0bff3cff4f80ffff04ffff0bff3cff0580ff8080808080808080ff378080ff82016f80ffffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff2fffff01ff80ff808080808080808080ff0bff32ffff0bff3cff2880ffff0bff32ffff0bff32ffff0bff3cff2280ff0580ffff0bff32ffff02ff2affff04ff02ffff04ff07ffff04ffff0bff3cff3c80ff8080808080ffff0bff3cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff5fffff01ff02ffff03ffff09ff82011fff3880ffff01ff02ffff03ffff09ffff18ff82059f80ff3c80ffff01ff02ffff03ffff20ff81bf80ffff01ff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff82019fffff04ff82017fff80808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff0180ffff01ff02ffff03ffff09ff82011fff2c80ffff01ff02ffff03ffff20ff82017f80ffff01ff04ffff04ff24ffff04ffff0eff10ffff02ff2effff04ff02ffff04ff82019fff8080808080ff808080ffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ffff02ff0bffff04ff17ffff04ff2fffff04ff82019fff8080808080ff8080808080808080808080ffff01ff088080ff0180ffff01ff02ffff03ffff09ff82011fff2480ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0122ffff0dff82029f8080ffff01ff02ffff03ffff09ffff0cff82029fff80ffff010280ff1080ffff01ff0101ff8080ff0180ff8080ff018080ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff8080808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff018080ff018080ff0180ffff01ff02ff3affff04ff02ffff04ff05ffff04ff0bffff04ff81bfffff04ffff02ffff03ff82017fffff0182017fffff01ff02ff0bffff04ff17ffff04ff2fffff01ff808080808080ff0180ff8080808080808080ff0180ff018080ffff04ffff01a0c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726ffff04ffff0180ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff81bfffff01ff04ff82013fffff04ff80ffff04ffff02ffff03ffff22ff82013fffff20ffff09ff82013fff2f808080ffff01ff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff09ffff04ff8205bfffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff82013fff1d8080ff80808080ff808080808080ff1580ff808080ffff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ffff01ff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ff0180ff80808080ffff01ff04ff2fffff01ff80ff80808080ff0180ffff04ffff01ffffff3f02ff04ff0101ffff822710ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff2cff1480ffff0bff2affff0bff2affff0bff2cff3c80ff0980ffff0bff2aff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ff17ffff01ff04ffff04ff10ffff04ffff0bff81a7ffff02ff3effff04ff02ffff04ffff04ff2fffff04ffff04ff05ffff04ffff05ffff14ffff12ff47ff0b80ff128080ffff04ffff04ff05ff8080ff80808080ff808080ff8080808080ff808080ffff02ff16ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fff8080808080808080ff8080ff0180ffff0bff2affff0bff2cff1880ffff0bff2affff0bff2affff0bff2cff3c80ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa01f87c98a348eeef49ec19a641e4deb449ff39ccc81c4ba32031f920f911f578aa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01a0bbe0136bf68faefe5caf81f01e19bdd5d58884c57dc02da04d6da4af1cc34939ffff04ffff018209c4ff0180808080ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0963ee959e8b0d4e96e0bbe7be0e3f97ebfdebd9d1924c0b055d3788872a153816d5ac9c07cb64b224fdb580685e3faf4ff018080ff018080808080ff018080808080ff01808080ff01ffffffa023ac8689d156d86ed90b29a0e3ec2000d6b2aebc37cdc593dc8d017a9134dce0ff0180ff01ffffffff80ffff01ffff81f6ff80ff80ff8080ffff33ffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9ff01ffffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9ffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9808080ff808080808080ffffa03c66ccc3842026034acdc478af60f84fb65fbeed77eab37bc97160471d6315d1ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a9937c0ef586f14c48255dc02cee81f3a2024a7d4aa62fa28d86b15c713b840c526e858aeb778fc7c19c5098808db40bff018080ff8508af40d4f7ffff80ffff01ffff33ffa062b14ce2e2b9b60d1304a61a68265d0d351f8d447a125d72152bcb46859ef96eff85089d5f31f6ffffa062b14ce2e2b9b60d1304a61a68265d0d351f8d447a125d72152bcb46859ef96e8080ffff34ff8411e1a30080ffff3dffa03ce20f78a47c528d62b2654da72d70ab3f6e8f24e96be269967a981954fa7f738080ff808080ffffa023ac8689d156d86ed90b29a0e3ec2000d6b2aebc37cdc593dc8d017a9134dce0ffff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa039617ec308adeff2027e3a4216d5d59a899701815a90374fed0327f0260766eaff01ff808080ffffa08a05f5bab3bdbaa45d0ee2a61955229482f27b7fd7962bdde30feabf5e4a302bffff02ffff01ff02ffff01ff04ffff04ff04ffff04ff05ffff01ff01808080ffff04ffff04ff06ffff04ffff0bff0bff1780ff808080ff808080ffff04ffff01ff333cff018080ffff04ffff01a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0101ffff04ffff0101ff0180808080ff80ff8080ffffa032923916f1173790dc4b431495936ac771127b78a19c7ea7f90f38210c7a1795ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fff3480ffff01ff04ffff04ff20ffff04ff2fff808080ffff04ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff2affff04ff02ffff04ff27ffff04ffff02ffff03ff77ffff01ff02ff36ffff04ff02ffff04ff09ffff04ff57ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ffff011d80ff0180ffff04ffff02ffff03ff77ffff0181b7ffff015780ff0180ff808080808080ffff04ff77ff808080808080ffff02ff3affff04ff02ffff04ff05ffff04ffff02ff0bff5f80ffff01ff8080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4947ff0233ffff0401ff0102ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ff02ffff03ff0bffff01ff02ffff03ffff02ff26ffff04ff02ffff04ff13ff80808080ffff01ff02ffff03ffff20ff1780ffff01ff02ffff03ffff09ff81b3ffff01818f80ffff01ff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff808080808080ffff01ff04ffff04ff23ffff04ffff02ff36ffff04ff02ffff04ff09ffff04ff53ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ff738080ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff8080808080808080ff0180ffff01ff088080ff0180ffff01ff04ff13ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff17ff8080808080808080ff0180ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffff02ffff03ffff09ff09ff3880ffff01ff02ffff03ffff18ff2dffff010180ffff01ff0101ff8080ff0180ff8080ff0180ff0bff3cffff0bff34ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ffff21ff17ffff09ff0bff158080ffff01ff04ff30ffff04ff0bff808080ffff01ff088080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa08f22e7dc0e9ce05f8dee8fb3b7888dff5b877ef54a4d588ee77f428cd018b1dfa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff81bfffff01ff02ff05ff82017f80ffff01ff02ffff03ffff22ffff09ffff02ff7effff04ff02ffff04ff8217ffff80808080ff0b80ffff15ff17ff808080ffff01ff04ffff04ff28ffff04ff82017fff808080ffff04ffff04ff34ffff04ff8202ffffff04ff82017fffff04ffff04ff8202ffff8080ff8080808080ffff04ffff04ff38ffff04ff822fffff808080ffff02ff26ffff04ff02ffff04ff2fffff04ff17ffff04ff8217ffffff04ff822fffffff04ff8202ffffff04ff8205ffffff04ff820bffffff01ff8080808080808080808080808080ffff01ff088080ff018080ff0180ffff04ffff01ffffffff313dff4946ffff0233ff3c04ffffff0101ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff22ff3c80ffff0bff2affff0bff2affff0bff22ff3280ff0980ffff0bff2aff0bffff0bff22ff8080808080ff8080808080ffff010b80ff0180ffffff02ffff03ff17ffff01ff02ffff03ff82013fffff01ff04ffff04ff30ffff04ffff0bffff0bffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ff82023fffff04ff82053fffff04ff820b3fff8080808080808080ffff02ff7effff04ff02ffff04ffff02ff2effff04ff02ffff04ff2fffff04ff5fffff04ff82017fff808080808080ff8080808080ff2f80ff808080ffff02ff26ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fffff04ff5fffff04ff8201bfffff04ff82017fffff04ffff10ff8202ffffff010180ff808080808080808080808080ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff37ffff04ff2fffff04ff5fffff04ff8201bfffff04ff82017fffff04ff8202ffff8080808080808080808080ff0180ffff01ff02ffff03ffff15ff8202ffffff11ff0bffff01018080ffff01ff04ffff04ff20ffff04ff82017fffff04ff5fff80808080ff8080ffff01ff088080ff018080ff0180ff0bff17ffff02ff5effff04ff02ffff04ff09ffff04ff2fffff04ffff02ff7effff04ff02ffff04ffff04ff09ffff04ff0bff1d8080ff80808080ff808080808080ff5f80ffff04ffff0101ffff04ffff04ff2cffff04ff05ff808080ffff04ffff04ff20ffff04ff17ffff04ff0bff80808080ff80808080ffff0bff2affff0bff22ff2480ffff0bff2affff0bff2affff0bff22ff3280ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff22ff2280ff8080808080ffff0bff22ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff7effff04ff02ffff04ff09ff80808080ffff02ff7effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b875d062b9386ce3fbe399e63965354dd5f51a227a00a2979d35d35be9ebf1b3cab5cc3071c4faf0021ac728a3021effff018080ffff04ffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459affff04ffff0180ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa08f22e7dc0e9ce05f8dee8fb3b7888dff5b877ef54a4d588ee77f428cd018b1dfa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0180ff01808080808080ff01808080ff01ffffffa053366c5bff1de1da9177c20df4b26996e20afdac1d4bc689237dca36e49e5f49ffa0b05ce694c89b4cb5729d95e21278b45a54f549d480924359c7459bfe74be3302ff0180ff01ffff01ffff80ffff01ffff33ffa0b05ce694c89b4cb5729d95e21278b45a54f549d480924359c7459bfe74be3302ff01ffffa03282eb9a3b9c882ef3c06828087d17b7c2ed47360ccb2adc4557648f741eacc28080ffff33ffa01c41411ed10859907f4fc54b1a63c2bed458eb1ba06dad08a4876a3d1c1fe878ff80ffffa01c41411ed10859907f4fc54b1a63c2bed458eb1ba06dad08a4876a3d1c1fe8788080ffff3cffa0dbd6c1500510618e3680d17bbcca634886ee2a698a1f97c18d0c858ed30f8df080ffff3dffa0299f25f89333bea791c56f83760d5674c34c13f81238033caf6266549014410380ffff3dffa020caa1c75c789629f67789552745366b6294a1f70d814149540ebaf7df80d1b480ffff3fffa0d0576a0d56a28e9c8c18890ca6d4990ff1ecd8d6f3e38272da64b8ee250da1fc8080ff8080808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df56effff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff851d1a94a200ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df56fffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff8600cbba106e00ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa0622f2f8a2a86c6e7af64a2fc783aed66f866de7838fa5634f185cfce69583bd9ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff8702fda659062d4affff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df56dffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff851d562f91f5ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df56effff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff8600cbba106e00ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df56fffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff851d1a94a200ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df56cffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff851d1a94a200ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df56dffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff8600cbba106e00ffff80ffff01ffff3dffa01480b30fc004548f337ed5e6ebfb8558db5021e2c80800251a5591907d1b889d8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df56cffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b6602b125a068e91ca3026fe8ec5c2905452ee739d263258eed4d67c1db6b6947699ef14aed5b0216181762cbe1ade56ff018080ff8600cbba106e00ffff80ffff01ffff33ffa0dd0cd74e3b3ffbb1e479be2acf3c4c989b1dc00dbc47ca473cfc0561ee774af7ff8600a8b675408380ffff33ffa09fbde16e03f55c85ecf94cb226083fcfe2737d4e629a981e5db3ea0eb9907af4ff870300a11eaa7c5280ffff34ff841215a06a80ffff3cffa068abc27915aa1da3430c54f72d2eae4f0b04653d116034e158c62e4ec7ba0b548080ff808080808000000000" + + encodedBytes, err := hex.DecodeString(hexStr) + assert.NoError(t, err) + + respondBlock := &protocols.RespondBlock{} + + err = streamable.Unmarshal(encodedBytes, respondBlock) + assert.NoError(t, err) + + assert.Equal(t, 5_109_110, int(respondBlock.Block.RewardChainBlock.Height)) +} diff --git a/pkg/types/block.go b/pkg/types/block.go index 4329cfa..93747df 100644 --- a/pkg/types/block.go +++ b/pkg/types/block.go @@ -42,41 +42,39 @@ type BlockRecord struct { } // FullBlock a full block -// https://github.com/Chia-Network/chia-blockchain/blob/0befdec071f49708e26c7638656874492c52600a/chia/types/full_block.py#L16 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/fullblock.rs#L13 type FullBlock struct { - FinishedSubSlots []EndOfSubSlotBundle `json:"finished_sub_slots"` - RewardChainBlock RewardChainBlock `json:"reward_chain_block"` - ChallengeChainSPProof mo.Option[VDFProof] `json:"challenge_chain_sp_proof"` - ChallengeChainIPProof VDFProof `json:"challenge_chain_ip_proof"` - RewardChainSPProof mo.Option[VDFProof] `json:"reward_chain_sp_proof"` - RewardChainIPProof VDFProof `json:"reward_chain_ip_proof"` - InfusedChallengeChainIPProof mo.Option[VDFProof] `json:"infused_challenge_chain_ip_proof"` - Foliage Foliage `json:"foliage"` - FoliageTransactionBlock mo.Option[FoliageTransactionBlock] `json:"foliage_transaction_block"` - TransactionsInfo mo.Option[TransactionsInfo] `json:"transactions_info"` - TransactionsGenerator mo.Option[SerializedProgram] `json:"transactions_generator"` - TransactionsGeneratorRefList []uint32 `json:"transactions_generator_ref_list"` + FinishedSubSlots []EndOfSubSlotBundle `json:"finished_sub_slots" streamable:""` + RewardChainBlock RewardChainBlock `json:"reward_chain_block" streamable:""` + ChallengeChainSPProof mo.Option[VDFProof] `json:"challenge_chain_sp_proof" streamable:""` + ChallengeChainIPProof VDFProof `json:"challenge_chain_ip_proof" streamable:""` + RewardChainSPProof mo.Option[VDFProof] `json:"reward_chain_sp_proof" streamable:""` + RewardChainIPProof VDFProof `json:"reward_chain_ip_proof" streamable:""` + InfusedChallengeChainIPProof mo.Option[VDFProof] `json:"infused_challenge_chain_ip_proof" streamable:""` + Foliage Foliage `json:"foliage" streamable:""` + FoliageTransactionBlock mo.Option[FoliageTransactionBlock] `json:"foliage_transaction_block" streamable:""` + TransactionsInfo mo.Option[TransactionsInfo] `json:"transactions_info" streamable:""` + TransactionsGenerator mo.Option[SerializedProgram] `json:"transactions_generator" streamable:"SerializedProgram"` + TransactionsGeneratorRefList []uint32 `json:"transactions_generator_ref_list" streamable:""` } // RewardChainBlock Reward Chain Block -// https://github.com/Chia-Network/chia-blockchain/blob/0befdec071f49708e26c7638656874492c52600a/chia/types/blockchain_format/reward_chain_block.py#L30 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/reward_chain_block.rs#L24 type RewardChainBlock struct { - Weight Uint128 `json:"weight"` - Height uint32 `json:"height"` - TotalIters Uint128 `json:"total_iters"` - SignagePointIndex uint8 `json:"signage_point_index"` - POSSSCCChallengeHash Bytes32 `json:"pos_ss_cc_challenge_hash"` - ProofOfSpace ProofOfSpace `json:"proof_of_space"` - ChallengeChainSPVDF mo.Option[VDFInfo] `json:"challenge_chain_sp_vdf"` - ChallengeChainSPSignature G2Element `json:"challenge_chain_sp_signature"` - ChallengeChainIPVDF VDFInfo `json:"challenge_chain_ip_vdf"` - RewardChainSPVDF mo.Option[VDFInfo] `json:"reward_chain_sp_vdf"` // Not present for first sp in slot - RewardChainSPSignature G2Element `json:"reward_chain_sp_signature"` - RewardChainIPVDF VDFInfo `json:"reward_chain_ip_vdf"` - InfusedChallengeChainIPVDF mo.Option[VDFInfo] `json:"infused_challenge_chain_ip_vdf"` // Iff deficit < 16 - IsTransactionBlock bool `json:"is_transaction_block"` + Weight Uint128 `json:"weight" streamable:""` + Height uint32 `json:"height" streamable:""` + TotalIters Uint128 `json:"total_iters" streamable:""` + SignagePointIndex uint8 `json:"signage_point_index" streamable:""` + POSSSCCChallengeHash Bytes32 `json:"pos_ss_cc_challenge_hash" streamable:""` + ProofOfSpace ProofOfSpace `json:"proof_of_space" streamable:""` + ChallengeChainSPVDF mo.Option[VDFInfo] `json:"challenge_chain_sp_vdf" streamable:""` + ChallengeChainSPSignature G2Element `json:"challenge_chain_sp_signature" streamable:""` + ChallengeChainIPVDF VDFInfo `json:"challenge_chain_ip_vdf" streamable:""` + RewardChainSPVDF mo.Option[VDFInfo] `json:"reward_chain_sp_vdf" streamable:""` // Not present for first sp in slot + RewardChainSPSignature G2Element `json:"reward_chain_sp_signature" streamable:""` + RewardChainIPVDF VDFInfo `json:"reward_chain_ip_vdf" streamable:""` + InfusedChallengeChainIPVDF mo.Option[VDFInfo] `json:"infused_challenge_chain_ip_vdf" streamable:""` // Iff deficit < 16 + IsTransactionBlock bool `json:"is_transaction_block" streamable:""` } // BlockCountMetrics metrics from get_block_count_metrics endpoint diff --git a/pkg/types/classgroup.go b/pkg/types/classgroup.go index 7d62f31..4e5049b 100644 --- a/pkg/types/classgroup.go +++ b/pkg/types/classgroup.go @@ -1,8 +1,7 @@ package types // ClassgroupElement Classgroup Element -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/classgroup.py#L12 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/classgroup.rs#L8 type ClassgroupElement struct { - Data Bytes100 `json:"data"` + Data Bytes100 `json:"data" streamable:""` } diff --git a/pkg/types/coin.go b/pkg/types/coin.go index 7185220..ee3f980 100644 --- a/pkg/types/coin.go +++ b/pkg/types/coin.go @@ -8,9 +8,9 @@ import ( // Coin is a coin // https://github.com/Chia-Network/chia_rs/blob/69908769e7df0ff2c10569aea9992cfecf3eb23a/wheel/src/coin.rs#L16 type Coin struct { - ParentCoinInfo Bytes32 `json:"parent_coin_info"` - PuzzleHash Bytes32 `json:"puzzle_hash"` - Amount uint64 `json:"amount"` + ParentCoinInfo Bytes32 `json:"parent_coin_info" streamable:""` + PuzzleHash Bytes32 `json:"puzzle_hash" streamable:""` + Amount uint64 `json:"amount" streamable:""` } // ID returns the coin ID of the coin diff --git a/pkg/types/endofslotbundle.go b/pkg/types/endofslotbundle.go index e7954ae..7af35e8 100644 --- a/pkg/types/endofslotbundle.go +++ b/pkg/types/endofslotbundle.go @@ -1,8 +1,12 @@ package types +import "github.com/samber/mo" + // EndOfSubSlotBundle end of subslot bundle -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/end_of_slot_bundle.py#L17 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/end_of_sub_slot_bundle.rs#L9 type EndOfSubSlotBundle struct { - // @TODO + ChallengeChain ChallengeChainSubSlot `json:"challenge_chain" streamable:""` + InfusedChallengeChain mo.Option[InfusedChallengeChainSubSlot] `json:"infused_challenge_chain" streamable:""` + RewardChain RewardChainSubSlot `json:"reward_chain" streamable:""` + Proofs SubSlotProofs `json:"proofs" streamable:""` } diff --git a/pkg/types/foliage.go b/pkg/types/foliage.go index 1143869..51adfd3 100644 --- a/pkg/types/foliage.go +++ b/pkg/types/foliage.go @@ -5,48 +5,45 @@ import ( ) // FoliageBlockData FoliageBlockData -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/foliage.py#L41 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/foliage.rs#L31 type FoliageBlockData struct { - UnfinishedRewardBlockHash Bytes32 `json:"unfinished_reward_block_hash"` - PoolTarget PoolTarget `json:"pool_target"` - PoolSignature mo.Option[G2Element] `json:"pool_signature"` - FarmerRewardPuzzleHash Bytes32 `json:"farmer_reward_puzzle_hash"` - ExtensionData Bytes32 `json:"extension_data"` + UnfinishedRewardBlockHash Bytes32 `json:"unfinished_reward_block_hash" streamable:""` + PoolTarget PoolTarget `json:"pool_target" streamable:""` + PoolSignature mo.Option[G2Element] `json:"pool_signature" streamable:""` + FarmerRewardPuzzleHash Bytes32 `json:"farmer_reward_puzzle_hash" streamable:""` + ExtensionData Bytes32 `json:"extension_data" streamable:""` } // Foliage Foliage -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/foliage.py#L52 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/foliage.rs#L41 type Foliage struct { - PrevBlockHash Bytes32 `json:"prev_block_hash"` - RewardBlockHash Bytes32 `json:"reward_block_hash"` - FoliageBlockData FoliageBlockData `json:"foliage_block_data"` - FoliageBlockDataSignature G2Element `json:"foliage_block_data_signature"` - FoliageTransactionBlockHash mo.Option[Bytes32] `json:"foliage_transaction_block_hash"` - FoliageTransactionBlockSignature mo.Option[G2Element] `json:"foliage_transaction_block_signature"` + PrevBlockHash Bytes32 `json:"prev_block_hash" streamable:""` + RewardBlockHash Bytes32 `json:"reward_block_hash" streamable:""` + FoliageBlockData FoliageBlockData `json:"foliage_block_data" streamable:""` + FoliageBlockDataSignature G2Element `json:"foliage_block_data_signature" streamable:""` + FoliageTransactionBlockHash mo.Option[Bytes32] `json:"foliage_transaction_block_hash" streamable:""` + FoliageTransactionBlockSignature mo.Option[G2Element] `json:"foliage_transaction_block_signature" streamable:""` } // FoliageTransactionBlock foliage transaction block -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/foliage.py#L29 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/foliage.rs#L20 type FoliageTransactionBlock struct { - PrevTransactionBlockHash Bytes32 `json:"prev_transaction_block_hash"` - Timestamp Timestamp `json:"timestamp"` - FilterHash Bytes32 `json:"filter_hash"` - AdditionsRoot Bytes32 `json:"additions_root"` - RemovalsRoot Bytes32 `json:"removals_root"` - TransactionsInfoHash Bytes32 `json:"transactions_info_hash"` + PrevTransactionBlockHash Bytes32 `json:"prev_transaction_block_hash" streamable:""` + Timestamp Timestamp `json:"timestamp" streamable:"Timestamp"` + FilterHash Bytes32 `json:"filter_hash" streamable:""` + AdditionsRoot Bytes32 `json:"additions_root" streamable:""` + RemovalsRoot Bytes32 `json:"removals_root" streamable:""` + TransactionsInfoHash Bytes32 `json:"transactions_info_hash" streamable:""` } // TransactionsInfo transactions info -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/foliage.py#L17 +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/foliage.rs#L9 // @TODO Streamable type TransactionsInfo struct { - GeneratorRoot Bytes32 `json:"generator_root"` - GeneratorRefsRoot Bytes32 `json:"generator_refs_root"` - AggregatedSignature G2Element `json:"aggregated_signature"` - Fees uint64 `json:"fees"` - Cost uint64 `json:"cost"` - RewardClaimsIncorporated []Coin `json:"reward_claims_incorporated"` + GeneratorRoot Bytes32 `json:"generator_root" streamable:""` + GeneratorRefsRoot Bytes32 `json:"generator_refs_root" streamable:""` + AggregatedSignature G2Element `json:"aggregated_signature" streamable:""` + Fees uint64 `json:"fees" streamable:""` + Cost uint64 `json:"cost" streamable:""` + RewardClaimsIncorporated []Coin `json:"reward_claims_incorporated" streamable:""` } diff --git a/pkg/types/pooltarget.go b/pkg/types/pooltarget.go index 52682ba..2f600c5 100644 --- a/pkg/types/pooltarget.go +++ b/pkg/types/pooltarget.go @@ -1,9 +1,8 @@ package types // PoolTarget PoolTarget -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/pool_target.py#L12 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/pool_target.rs#L6 type PoolTarget struct { - PuzzleHash Bytes32 `json:"puzzle_hash"` - MaxHeight uint32 `json:"max_height"` + PuzzleHash Bytes32 `json:"puzzle_hash" streamable:""` + MaxHeight uint32 `json:"max_height" streamable:""` } diff --git a/pkg/types/program.go b/pkg/types/program.go index c51393c..9c14ad8 100644 --- a/pkg/types/program.go +++ b/pkg/types/program.go @@ -1,13 +1,31 @@ package types import ( + "bytes" + "encoding/binary" "encoding/json" + "errors" + "io" ) // SerializedProgram An opaque representation of a clvm program. It has a more limited interface than a full SExp // https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/program.py#L232 type SerializedProgram Bytes +// MaxSingleByte Max single byte +const MaxSingleByte byte = 0x7f + +// BackReference back referencee marker +const BackReference byte = 0xfe + +// ConsBoxMarker cons box marker +const ConsBoxMarker byte = 0xff + +const ( + badEncErr = "bad encoding" + internalErr = "internal error" +) + // MarshalJSON custom hex marshaller func (g SerializedProgram) MarshalJSON() ([]byte, error) { return json.Marshal(Bytes(g)) @@ -25,3 +43,108 @@ func (g *SerializedProgram) UnmarshalJSON(data []byte) error { return nil } + +// SerializedLengthFromBytesTrusted returns the length +func SerializedLengthFromBytesTrusted(b []byte) (uint64, error) { + reader := bytes.NewReader(b) + var opsCounter uint64 = 1 + + for opsCounter > 0 { + opsCounter-- + + var currentByte byte + err := binary.Read(reader, binary.BigEndian, ¤tByte) + if err != nil { + if err == io.EOF { + return 0, errors.New("unexpected end of input") + } + return 0, err + } + + if currentByte == ConsBoxMarker { + opsCounter += 2 + } else if currentByte == BackReference { + var firstByte byte + err = binary.Read(reader, binary.BigEndian, &firstByte) + if err != nil { + return 0, errors.New("unexpected end of input") + } + if firstByte > MaxSingleByte { + pathSize, err := decodeSize(reader, firstByte) + if err != nil { + return 0, err + } + _, err = reader.Seek(int64(pathSize), io.SeekCurrent) + if err != nil { + return 0, errors.New("bad encoding") + } + } + } else if currentByte == 0x80 || currentByte <= MaxSingleByte { + // This one byte we just read was the whole atom or the special case of NIL. + } else { + blobSize, err := decodeSize(reader, currentByte) + if err != nil { + return 0, err + } + _, err = reader.Seek(int64(blobSize), io.SeekCurrent) + if err != nil { + return 0, errors.New("bad encoding") + } + } + } + + position, err := reader.Seek(0, io.SeekCurrent) + if err != nil { + return 0, err + } + return uint64(position), nil +} + +func decodeSize(reader *bytes.Reader, initialB byte) (uint64, error) { + _, length, err := decodeSizeWithOffset(reader, initialB) + return length, err +} + +func decodeSizeWithOffset(reader *bytes.Reader, initialB byte) (uint64, uint64, error) { + bitMask := byte(0x80) + + if (initialB & bitMask) == 0 { + return 0, 0, errors.New(internalErr) + } + + var atomStartOffset uint64 = 0 + b := initialB + for (b & bitMask) != 0 { + atomStartOffset++ + b &= 0xff ^ bitMask + bitMask >>= 1 + } + + sizeBlob := make([]byte, atomStartOffset) + sizeBlob[0] = b + + if atomStartOffset > 1 { + // We need to read atomStartOffset-1 more bytes + _, err := io.ReadFull(reader, sizeBlob[1:]) + if err != nil { + return 0, 0, err + } + } + + var atomSize uint64 = 0 + + if len(sizeBlob) > 6 { + return 0, 0, errors.New(badEncErr) + } + + for _, b := range sizeBlob { + atomSize <<= 8 + atomSize += uint64(b) + } + + if atomSize >= 0x400000000 { + return 0, 0, errors.New(badEncErr) + } + + return atomStartOffset, atomSize, nil +} diff --git a/pkg/types/program_test.go b/pkg/types/program_test.go new file mode 100644 index 0000000..9904859 --- /dev/null +++ b/pkg/types/program_test.go @@ -0,0 +1,118 @@ +package types + +import ( + "bytes" + "encoding/hex" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSerializedLengthFromBytesTrusted(t *testing.T) { + + hexStr := "ff86666f6f626172ff86666f6f62617280" + encodedBytes, err := hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err := SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + assert.Equal(t, 0, len(encodedBytes[length:])) + + hexStr = "ff86666f6f626172fe01" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + assert.Equal(t, 0, len(encodedBytes[length:])) + + hexStr = "ffffffffff9b615f766572795f6c6f6e675f72657065617465645f737472696e6701ff0203ffff0405ff0607ff0809ff0aff9b615f766572795f6c6f6e675f72657065617465645f737472696e6780" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + assert.Equal(t, 0, len(encodedBytes[length:])) + + hexStr = "ffffffffff9b615f766572795f6c6f6e675f72657065617465645f737472696e6701ff0203ffff0405ff0607ff0809ff0afffe4180" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + assert.Equal(t, 0, len(encodedBytes[length:])) + + // height: 5,109,115 + // https://xch.dwd.com/info/block/0x27b47bd91041582316377d23632b614278b384ca2fbc955b35bd1fbf54e8391e + hexStr = "ff01ffffffa08a05f5bab3bdbaa45d0ee2a61955229482f27b7fd7962bdde30feabf5e4a302bffff02ffff01ff02ffff01ff02ffff03ffff18ff2fff3480ffff01ff04ffff04ff20ffff04ff2fff808080ffff04ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff2affff04ff02ffff04ff27ffff04ffff02ffff03ff77ffff01ff02ff36ffff04ff02ffff04ff09ffff04ff57ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ffff011d80ff0180ffff04ffff02ffff03ff77ffff0181b7ffff015780ff0180ff808080808080ffff04ff77ff808080808080ffff02ff3affff04ff02ffff04ff05ffff04ffff02ff0bff5f80ffff01ff8080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4947ff0233ffff0401ff0102ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ff02ffff03ff0bffff01ff02ffff03ffff02ff26ffff04ff02ffff04ff13ff80808080ffff01ff02ffff03ffff20ff1780ffff01ff02ffff03ffff09ff81b3ffff01818f80ffff01ff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff808080808080ffff01ff04ffff04ff23ffff04ffff02ff36ffff04ff02ffff04ff09ffff04ff53ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ff738080ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff8080808080808080ff0180ffff01ff088080ff0180ffff01ff04ff13ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff17ff8080808080808080ff0180ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffff02ffff03ffff09ff09ff3880ffff01ff02ffff03ffff18ff2dffff010180ffff01ff0101ff8080ff0180ff8080ff0180ff0bff3cffff0bff34ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ffff21ff17ffff09ff0bff158080ffff01ff04ff30ffff04ff0bff808080ffff01ff088080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa08f22e7dc0e9ce05f8dee8fb3b7888dff5b877ef54a4d588ee77f428cd018b1dfa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff81bfffff01ff02ff05ff82017f80ffff01ff02ffff03ffff22ffff09ffff02ff7effff04ff02ffff04ff8217ffff80808080ff0b80ffff15ff17ff808080ffff01ff04ffff04ff28ffff04ff82017fff808080ffff04ffff04ff34ffff04ff8202ffffff04ff82017fffff04ffff04ff8202ffff8080ff8080808080ffff04ffff04ff38ffff04ff822fffff808080ffff02ff26ffff04ff02ffff04ff2fffff04ff17ffff04ff8217ffffff04ff822fffffff04ff8202ffffff04ff8205ffffff04ff820bffffff01ff8080808080808080808080808080ffff01ff088080ff018080ff0180ffff04ffff01ffffffff313dff4946ffff0233ff3c04ffffff0101ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff22ff3c80ffff0bff2affff0bff2affff0bff22ff3280ff0980ffff0bff2aff0bffff0bff22ff8080808080ff8080808080ffff010b80ff0180ffffff02ffff03ff17ffff01ff02ffff03ff82013fffff01ff04ffff04ff30ffff04ffff0bffff0bffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ff82023fffff04ff82053fffff04ff820b3fff8080808080808080ffff02ff7effff04ff02ffff04ffff02ff2effff04ff02ffff04ff2fffff04ff5fffff04ff82017fff808080808080ff8080808080ff2f80ff808080ffff02ff26ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fffff04ff5fffff04ff8201bfffff04ff82017fffff04ffff10ff8202ffffff010180ff808080808080808080808080ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff37ffff04ff2fffff04ff5fffff04ff8201bfffff04ff82017fffff04ff8202ffff8080808080808080808080ff0180ffff01ff02ffff03ffff15ff8202ffffff11ff0bffff01018080ffff01ff04ffff04ff20ffff04ff82017fffff04ff5fff80808080ff8080ffff01ff088080ff018080ff0180ff0bff17ffff02ff5effff04ff02ffff04ff09ffff04ff2fffff04ffff02ff7effff04ff02ffff04ffff04ff09ffff04ff0bff1d8080ff80808080ff808080808080ff5f80ffff04ffff0101ffff04ffff04ff2cffff04ff05ff808080ffff04ffff04ff20ffff04ff17ffff04ff0bff80808080ff80808080ffff0bff2affff0bff22ff2480ffff0bff2affff0bff2affff0bff22ff3280ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff22ff2280ff8080808080ffff0bff22ff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff7effff04ff02ffff04ff09ff80808080ffff02ff7effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b875d062b9386ce3fbe399e63965354dd5f51a227a00a2979d35d35be9ebf1b3cab5cc3071c4faf0021ac728a3021effff018080ffff04ffff01a04bf5122f344554c53bde2ebb8cd2b7e3d1600ad631c385a5d7cce23c7785459affff04ffff0180ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa08f22e7dc0e9ce05f8dee8fb3b7888dff5b877ef54a4d588ee77f428cd018b1dfa0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0180ff01808080808080ff01808080ff01ffffffa032923916f1173790dc4b431495936ac771127b78a19c7ea7f90f38210c7a1795ffa0b05ce694c89b4cb5729d95e21278b45a54f549d480924359c7459bfe74be3302ff0180ff01ffff01ffff80ffff01ffff33ffa0b05ce694c89b4cb5729d95e21278b45a54f549d480924359c7459bfe74be3302ff01ffffa03282eb9a3b9c882ef3c06828087d17b7c2ed47360ccb2adc4557648f741eacc28080ffff33ffa01c41411ed10859907f4fc54b1a63c2bed458eb1ba06dad08a4876a3d1c1fe878ff80ffffa01c41411ed10859907f4fc54b1a63c2bed458eb1ba06dad08a4876a3d1c1fe8788080ffff3cffa00bbe7be278f0f9a15b8eb702c0f080e3572c1a6c0e03283a8cbddeebac16ea9d80ffff3dffa094bc8a602f43dec34b1952bb5e8e2ea933e2cd330f234d57b49ecc0cb1dd571d80ffff3dffa0743871042625a0ae203e7ec679f25ded154ec590f18f01c5895c1ef86f383ee380ffff3fffa0bd369fe42f66de5d838026324c826f9db66ad1784e3afa5b568fed836bfaff618080ff8080808080ffffa0b6ebf9ed5ee0d507d65b5eff08ccfd12a2d4c7d62fb201b1ecb0ca1d040b0708ffff02ffff01ff02ffff01ff04ffff04ff04ffff04ff05ffff01ff01808080ffff04ffff04ff06ffff04ffff0bff0bff1780ff808080ff808080ffff04ffff01ff333cff018080ffff04ffff01a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff0101ffff04ffff0101ff0180808080ff80ff8080ffffa056d2d52174fdd8785adcd2a8195c54a1969c01529eabecca6c40905de3b8368effff02ffff01ff04ffff04ff04ffff04ff05ffff04ff0bff80808080ffff04ffff04ff0affff04ffff02ff0effff04ff02ffff04ffff04ff05ffff04ff0bffff04ff17ff80808080ff80808080ff808080ff808080ffff04ffff01ff33ff3cff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff0effff04ff02ffff04ff09ff80808080ffff02ff0effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff01ffffa028854612865a15d80b9122df819de9cb6c45117e699bbf94ce80e13c97183ff5ff01ff808080ffffa0b591e45673591c7fb8c836ce4ce4f1be3b80a6063248b06cb8a12450991c363cffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a9937c0ef586f14c48255dc02cee81f3a2024a7d4aa62fa28d86b15c713b840c526e858aeb778fc7c19c5098808db40bff018080ff85089d5f31f6ffff80ffff01ffff33ffa062b14ce2e2b9b60d1304a61a68265d0d351f8d447a125d72152bcb46859ef96eff85088b7d8ef5ffffa062b14ce2e2b9b60d1304a61a68265d0d351f8d447a125d72152bcb46859ef96e8080ffff34ff8411e1a30080ffff3dffa09d8b7a2b33b0c783fc06d2db3d684e0235dbc14638bce9dc00615135f89f61d68080ff808080ffffa0b59fde942b868b2b30be06caf1f2573d83324490a4294f6ce9de6672d70f35c4ffff02ffff01ff02ffff01ff02ffff03ffff18ff2fff3480ffff01ff04ffff04ff20ffff04ff2fff808080ffff04ffff02ff3effff04ff02ffff04ff05ffff04ffff02ff2affff04ff02ffff04ff27ffff04ffff02ffff03ff77ffff01ff02ff36ffff04ff02ffff04ff09ffff04ff57ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ffff011d80ff0180ffff04ffff02ffff03ff77ffff0181b7ffff015780ff0180ff808080808080ffff04ff77ff808080808080ffff02ff3affff04ff02ffff04ff05ffff04ffff02ff0bff5f80ffff01ff8080808080808080ffff01ff088080ff0180ffff04ffff01ffffffff4947ff0233ffff0401ff0102ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff3cffff0bff34ff2480ffff0bff3cffff0bff3cffff0bff34ff2c80ff0980ffff0bff3cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ff02ffff03ff0bffff01ff02ffff03ffff02ff26ffff04ff02ffff04ff13ff80808080ffff01ff02ffff03ffff20ff1780ffff01ff02ffff03ffff09ff81b3ffff01818f80ffff01ff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff808080808080ffff01ff04ffff04ff23ffff04ffff02ff36ffff04ff02ffff04ff09ffff04ff53ffff04ffff02ff2effff04ff02ffff04ff05ff80808080ff808080808080ff738080ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff34ff8080808080808080ff0180ffff01ff088080ff0180ffff01ff04ff13ffff02ff3affff04ff02ffff04ff05ffff04ff1bffff04ff17ff8080808080808080ff0180ffff01ff02ffff03ff17ff80ffff01ff088080ff018080ff0180ffffff02ffff03ffff09ff09ff3880ffff01ff02ffff03ffff18ff2dffff010180ffff01ff0101ff8080ff0180ff8080ff0180ff0bff3cffff0bff34ff2880ffff0bff3cffff0bff3cffff0bff34ff2c80ff0580ffff0bff3cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ffff21ff17ffff09ff0bff158080ffff01ff04ff30ffff04ff0bff808080ffff01ff088080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa0b59fde942b868b2b30be06caf1f2573d83324490a4294f6ce9de6672d70f35c4a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01ff02ffff01ff02ffff01ff02ff3effff04ff02ffff04ff05ffff04ffff02ff2fff5f80ffff04ff80ffff04ffff04ffff04ff0bffff04ff17ff808080ffff01ff808080ffff01ff8080808080808080ffff04ffff01ffffff0233ff04ff0101ffff02ff02ffff03ff05ffff01ff02ff1affff04ff02ffff04ff0dffff04ffff0bff12ffff0bff2cff1480ffff0bff12ffff0bff12ffff0bff2cff3c80ff0980ffff0bff12ff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff0bff12ffff0bff2cff1080ffff0bff12ffff0bff12ffff0bff2cff3c80ff0580ffff0bff12ffff02ff1affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff0bffff01ff02ffff03ffff09ff23ff1880ffff01ff02ffff03ffff18ff81b3ff2c80ffff01ff02ffff03ffff20ff1780ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff33ffff04ff2fffff04ff5fff8080808080808080ffff01ff088080ff0180ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff0180ffff01ff02ffff03ffff09ff23ffff0181e880ffff01ff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ffff02ffff03ffff22ffff09ffff02ff2effff04ff02ffff04ff53ff80808080ff82014f80ffff20ff5f8080ffff01ff02ff53ffff04ff818fffff04ff82014fffff04ff81b3ff8080808080ffff01ff088080ff0180ffff04ff2cff8080808080808080ffff01ff04ff13ffff02ff3effff04ff02ffff04ff05ffff04ff1bffff04ff17ffff04ff2fffff04ff5fff80808080808080808080ff018080ff0180ffff01ff04ffff04ff18ffff04ffff02ff16ffff04ff02ffff04ff05ffff04ff27ffff04ffff0bff2cff82014f80ffff04ffff02ff2effff04ff02ffff04ff818fff80808080ffff04ffff0bff2cff0580ff8080808080808080ff378080ff81af8080ff0180ff018080ffff04ffff01a0a04d9f57764f54a43e4030befb4d80026e870519aaa66334aef8304f5d0393c2ffff04ffff01ffff75ffc06f68747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569687478796637737462356b78787473756d77326e6f34326766736871676a687837646d696e706776627468697433616a70336f792f5065706542656172732d25323028333437292e706e67ffc059697066733a2f2f62616679626569687478796637737462356b78787473756d77326e6f34326766736871676a687837646d696e706776627468697433616a70336f792f5065706542656172732d25323028333437292e706e6780ffff68a0699bf6a1e8394fd9605b31d7e68da08b7bc3f5dbdd7ce3b67cd940366d5cc518ffff826d75ffc07068747470733a2f2f6e667473746f726167652e6c696e6b2f697066732f62616679626569687478796637737462356b78787473756d77326e6f34326766736871676a687837646d696e706776627468697433616a70336f792f5065706542656172732d25323028333437292e6a736f6effc05a697066733a2f2f62616679626569687478796637737462356b78787473756d77326e6f34326766736871676a687837646d696e706776627468697433616a70336f792f5065706542656172732d25323028333437292e6a736f6e80ffff826c7580ffff82736e01ffff82737401ffff826d68a04bf17e94784294108fae5e1f0269634ad7ea38968a99f9db8fcbba0a97d1c97c80ffff04ffff01a0fe8a4b4e27a2e29a4d3fc7ce9d527adbcaccbab6ada3903ccf3ba9a769d2d78bffff04ffff01ff02ffff01ff02ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff17ffff04ff0bffff04ffff02ff2fff5f80ff80808080808080ffff04ffff01ffffff82ad4cff0233ffff3e04ff81f601ffffff0102ffff02ffff03ff05ffff01ff02ff2affff04ff02ffff04ff0dffff04ffff0bff32ffff0bff3cff3480ffff0bff32ffff0bff32ffff0bff3cff2280ff0980ffff0bff32ff0bffff0bff3cff8080808080ff8080808080ffff010b80ff0180ff04ffff04ff38ffff04ffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ffff02ff2effff04ff02ffff04ffff02ffff03ff81afffff0181afffff010b80ff0180ff80808080ffff04ffff0bff3cff4f80ffff04ffff0bff3cff0580ff8080808080808080ff378080ff82016f80ffffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff2fffff01ff80ff808080808080808080ff0bff32ffff0bff3cff2880ffff0bff32ffff0bff32ffff0bff3cff2280ff0580ffff0bff32ffff02ff2affff04ff02ffff04ff07ffff04ffff0bff3cff3c80ff8080808080ffff0bff3cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff5fffff01ff02ffff03ffff09ff82011fff3880ffff01ff02ffff03ffff09ffff18ff82059f80ff3c80ffff01ff02ffff03ffff20ff81bf80ffff01ff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff82019fffff04ff82017fff80808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff0180ffff01ff02ffff03ffff09ff82011fff2c80ffff01ff02ffff03ffff20ff82017f80ffff01ff04ffff04ff24ffff04ffff0eff10ffff02ff2effff04ff02ffff04ff82019fff8080808080ff808080ffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ffff02ff0bffff04ff17ffff04ff2fffff04ff82019fff8080808080ff8080808080808080808080ffff01ff088080ff0180ffff01ff02ffff03ffff09ff82011fff2480ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0122ffff0dff82029f8080ffff01ff02ffff03ffff09ffff0cff82029fff80ffff010280ff1080ffff01ff0101ff8080ff0180ff8080ff018080ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff8080808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff018080ff018080ff0180ffff01ff02ff3affff04ff02ffff04ff05ffff04ff0bffff04ff81bfffff04ffff02ffff03ff82017fffff0182017fffff01ff02ff0bffff04ff17ffff04ff2fffff01ff808080808080ff0180ff8080808080808080ff0180ff018080ffff04ffff01a0c5abea79afaa001b5427dfa0c8cf42ca6f38f5841b78f9b3c252733eb2de2726ffff04ffff0180ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff81bfffff01ff04ff82013fffff04ff80ffff04ffff02ffff03ffff22ff82013fffff20ffff09ff82013fff2f808080ffff01ff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff09ffff04ff8205bfffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff82013fff1d8080ff80808080ff808080808080ff1580ff808080ffff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ffff01ff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ff0180ff80808080ffff01ff04ff2fffff01ff80ff80808080ff0180ffff04ffff01ffffff3f02ff04ff0101ffff822710ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff2cff1480ffff0bff2affff0bff2affff0bff2cff3c80ff0980ffff0bff2aff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ff17ffff01ff04ffff04ff10ffff04ffff0bff81a7ffff02ff3effff04ff02ffff04ffff04ff2fffff04ffff04ff05ffff04ffff05ffff14ffff12ff47ff0b80ff128080ffff04ffff04ff05ff8080ff80808080ff808080ff8080808080ff808080ffff02ff16ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fff8080808080808080ff8080ff0180ffff0bff2affff0bff2cff1880ffff0bff2affff0bff2affff0bff2cff3c80ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01ffa07faa3253bfddd1e0decb0906b2dc6247bbc4cf608f58345d173adb63e8b47c9fffa0b59fde942b868b2b30be06caf1f2573d83324490a4294f6ce9de6672d70f35c4a0eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9ffff04ffff01a0bbe0136bf68faefe5caf81f01e19bdd5d58884c57dc02da04d6da4af1cc34939ffff04ffff018209c4ff0180808080ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b1547c91c3ca0e6aaca8e07c99440b4124276f617851b499aed5e59d4f373ec601754bdd124ae0172380f0655ac7d545ff018080ff018080808080ff018080808080ff01808080ff01ffffffa056d2d52174fdd8785adcd2a8195c54a1969c01529eabecca6c40905de3b8368eff0180ff01ffffffff80ffff01ffff81f6ff80ff80ff8080ffff33ffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9ff01ffffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9ffa0b929f538850788664054489ea02166794bc858676f2eadc92d404769142c16d9808080ff808080808080ffffa08197832a8339c346d8478589bf695fff2f247e6417101047e58030746e5fefe7ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b08e705fd53eecbe32a03916f971ab795f165d50ea8cd79eb719897343c5bebe6112672bc470293d7482c3a01ffefdca56ff018080ff8600cbba106e00ffff80ffff01ffff33ffa049605a307376b8f218ab0e595c859f6e83a93f6716ad18331423267f3ac841b5ff8502494154ff80ffff33ffa02c95f4975ffb703e19bbffd602edadd8fc6beb7107dd96996ddb725264289dfaff850225c028c580ffff33ffa07eb9de9ed16f8d01fb1b013117ac277e84ca6cb28cb15304f1b79d703513c9c0ff847c4a0b3e80ffff33ffa05c35733ae323117aa23e4754626248923b6580e26185af305152333d1ec81e4cff850150a8c72f80ffff33ffa09a51d7c43abe29131887bacf416e34cc1448a8fbe9fd5b5683065d8c7a0faaf7ff8408e926ae80ffff33ffa0fdc12d1c7f511d54e3b56832598a6a24e4236f1a5d1dcf6428e6cdcdf03b26ddff85010862b76d80ffff33ffa03ac74ddb0e891c5dcd64cf3e1cd92d367b5d7027a1b25fed045d34176e1b52f7ff84533e296e80ffff33ffa0ffd61d0ce5b25e6af26e83d2a7ce523a634c818c1380891a513476eae93a36ccff8409d0add380ffff33ffa0dc1fa12ce35b133739b5b9d9a49ff24dd8fa983b0ac5a8c5d2c7550a9221d5b9ff8501b1ff40f380ffff33ffa0e20580c6995792413ea8b552f0b9646562af18970299828d9ab796123297773eff85011c6c645e80ffff33ffa014cfad4a666787228453a683a11526e4010196fefc1603c9e479e94e98c1f199ff844be9268c80ffff33ffa0978593b58351c852ae23fd556fccb3f9bd82ec053b71e094649702523ff0700aff84262ab41480ffff33ffa014849df9d40cc5e67b1cc8530af5aad132dada0bf474c022b1fdcdf0bfe24c80ff85034aac256b80ffff33ffa0ea569c1968f763d930d5c6de2ec00682edeae255afb0b1eb216c5f00158c09bdff8507a8254e5f80ffff33ffa02b032095961c078ab899d4476229be4a3abbcfc2bd0d9e423bb9a0938d6216daff846b14c29180ffff33ffa09cce807f1d26074909dc9526eb6a505d5d8ea74b593103fb05fd7b2bacd696fdff85038837f1f580ffff33ffa0352b4561f5a6da468d0c4cc9ae951775aa153e639f95f0f4c0edbada3cac4525ff844e01708380ffff33ffa0588dd21bc9d7f0b846e56a2ad8893010bfa3a8161829f583fff17e233ab05d08ff8444d4dd2480ffff33ffa095ecfdffadf93169b5411751fed61fd5efbb6b4cc60965ea12c0bee4ed09dce2ff842d4d777f80ffff33ffa0c37bcc0b1e28db84d6d3d7d525f855897e24faafd97e298d5930e67f0843bb4cff8407ef7fd580ffff33ffa0a815fa63dd0196fdabedf9c7fa5c8e26210e232da51c34a9ab1e7f1d0c100441ff8406da1bc880ffff33ffa02ed03ac71121c9b15b60ee256d910f07417894da1a9f9dff60189a9cbd29e4c6ff850087b91fcd80ffff33ffa0044af3b517604bf6665100ca09af1ad953628021ffe4fabf8ffbcd450420835dff85039e31ef7b80ffff33ffa0f9a3dc86878bb15e4e3bd766dda2bf5ba4094391b9463ea076241bca7ec1f4a1ff8409ec485480ffff33ffa0e47b49273bc1bf909a6048ac2626c850eb428c9b85cb12bb4c3bfb27ba0f58afff840686e42a80ffff33ffa05b55b931c80ee89e39b515d982144be942b271b0eddcc25869ff68f8470c061bff8500e7bba1f680ffff33ffa0b8865d1e5e2bc2572ceb3e8fc464109fe561b53da715acc69905165f920cd05dff8500dfe37dbe80ffff33ffa0e65df84ecfe8331793ffb6fa898be279380878fd0d519853dc984e687a6d722eff85032498853b80ffff33ffa04fb3df91e631cd56bb6b7e83ed5c67644e756184352a6a9b8bb1d9ee7de7ed6fff850085ebbd7b80ffff33ffa066c4045230e8ea7d53f86fca3e6596b20196768508086535607deab221f26b82ff8500977829fb80ffff33ffa0dea248bdec7cc1523f9765268552b1ad00583ce2a180cfe5aae0fd36f4b673c2ff840e9e137c80ffff33ffa02e8de30774a82b0c1fda7a45ddc563d55938a9fcb4d2bc0d0fdbab7bd223381dff8500b9ba327c80ffff33ffa07740b295bc6e58451421ad1e0a9832700de50fd2f622d13a88b3b2871364d212ff841d9f1ed880ffff33ffa03f42542333653b38f71b1cf7fe18a1c7448abe363dccee994c11973ad716ef71ff8500db972c9b80ffff33ffa0a4ab1355edded93bea48744174c96b859d504068fe93b24e4f3a48ae42088025ff850086f6f35d80ffff33ffa02e136df21735d2b784dc58fd652af5ee5570515bdad951953497cc7c17d5072cff8500d4defa3f80ffff33ffa0bc08086696a30b6c5c4be9af3c737878651dd189aaa8e2e80c47a3123444aa34ff8504515d7d4980ffff33ffa088e27275eed1ee737586407f6de373e6ef43da4324f67676641ddd670df41462ff8500cb4d10c380ffff33ffa0168820e343723d5a4b7b9842d315c54249edb198c283737aefc55af896596341ff850089adbc3b80ffff33ffa079ef87d88b061734d40c40ef72624b7635183ce9c0369cb0dc8ac7b9854c52abff84549d860780ffff33ffa0b4238c21fba2a28cd4948f088c92a78a74a937d448d51caabd2185a3d26a043dff8417776f3e80ffff33ffa022b3dfec3a950abfb026b5622263635b8b524ec5995f17c1762c783d637aae3dff850197d467ed80ffff33ffa08823849c747e04e63e2b2cdb22d0cf2e95d6d245785d2a7272120a4ad798140bff850136ef389180ffff33ffa04f6a2eef60c1936344295327d5dfd094d26d4150e0bca8fe5b2ce76f9d6ceb82ff843ac1210f80ffff33ffa0b9ba2c668d637fc523c865b9f4721ae48a5189cc65c75db9c9e7ccce5f370cfeff84198fb93580ffff33ffa0ffbc39e19ba31001fc54bb9ede6ab71b7c2b75ea486a3de02d32e30d7f74acbcff843fd8ddb480ffff33ffa04a609436ea8c22aed7eec2cbd7de279d6b6cbee318d198f7823427b774be5992ff840917620680ffff33ffa07a0b0ac29318700064065a96822a456ad3908fa9157f8d1c512f7d2eeb52eb0cff8508741b819380ffff33ffa0f6dca61072a38d3b173594a22b2ee1e9d6a2df61c905bab2ae94a90f2cda4198ff8503cf02d00180ffff33ffa017088e69b570cd7c2dce9243b1a8f88f16a291a9d9d635b4129065488b4f2f2aff8502801e8de280ffff33ffa001aa2065c0eb1a2e0d7852dae014f7b3ef5b10f185c915f51973f8740b5ca7d6ff8500a87b92d580ffff33ffa08fe34d2e149a9a90fbcf981c389ecc5dd3b1b30c14240eb8dfb60a95773b70d6ff847c24af5480ffff33ffa0e45f25143cad15b4159b44c84d3280d4a9038c0d3cb3ce4deab9caba354f7facff85009265f00480ffff33ffa0db90c714c940b4f2a146a4fdb14c6a5241c0df8f38f7072eb51ff8779f4b972bff85021a720c5d80ffff33ffa017be4fa4959c6dd111a4be2665ebeaddf407f7f6413133012defd32b6f79851aff8501111aeb3580ffff33ffa0f4b11702c3293fb842653f88becf8c43cb878e3d9792802da536f448e2774c13ff85322333d97280ffff33ffa079c1161c19dd355f2df8e7c735a5034ea6046379e256c16d8d5aad69cc0acac4ff85031914e48580ffff33ffa0103fd9094b60187b598fc3700ac9de1e44154efedf5661d3c4122db2b9ab55f0ff847257475080ffff33ffa0ee142f6fda7aa5051cc70d1a4486dec45ba472f6202a73c840e7033b09d91dd3ff844334c71080ffff33ffa045ad34ef188e8cc052f787c60b1942ec2043c0cf69b24b35517c59b1042c1760ff8420478bee80ffff33ffa0a785aa84769f90fc477dde73cd1c313f002d08474a3cfea045dfba1dac730bd8ff84060a808780ffff33ffa0a5d4624b6b7131713861a0a21d1a390d82d3d95524371a5f112098315656d8f9ff850495a02d7380ffff33ffa06cb630c28fd1360af83e2e3ad175ed030914d63698a875e3637ed47604ac9b85ff8500d6bb4e2280ffff33ffa09ecf526a2f98b3fad126cf6fede2a4ca96783ba4bb41d1cbfe7daa3dc52b4b4dff8502d7be39cd80ffff33ffa0f388067400d818b67478656f3aa84fadd461bfb97aeb4a5822a0a6d63154567fff85008bd4c7f180ffff33ffa08481b61a53b0aa1bb7257e5f0c608a0d6a560cc0fcf2672a89bbac4c4e30392fff8409ec0c9880ffff33ffa0b2b807fd94e71b34d5f44cb0e7642f38293c50994d2cae158588aafcd82dc547ff8415e9d74d80ffff33ffa04b4901e5715f61b8e068d9fd3280f5967726b8d0e4a929966a81b105ff069f13ff850536a0882080ffff33ffa0c3e5bf3c0842332c9a56f80e3383529cbf7cf016b93497c0026ade8333575620ff850ac74e19c680ffff33ffa0eee2aaad391883a6231ade2c2d6191e793a16e4624dfa94f489d0e6a515403f9ff85372753b7f480ffff33ffa0892a03e8b0c2c075a1a17bbb047fc13b198e8cb2e6998dd2b39eeb1ef997c435ff840899cfbf80ffff33ffa0e604b58c57766784f5cf5ac652988447bef2baae1fd5f05dfd1047fd33dd5a91ff845b4ee6f980ffff33ffa012314253b116fc8e36d1b4f43216bc429f13b63d8a041e65372990aa190d16d3ff840189e96a80ffff34ff8405f5e10080ffff3cffa0ad740c68d993b9b7a990587f408e295f0d87bb4981b43922adcf2770f6a9e1e68080ff808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004debfdffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b099a778ca0f7f54ba213598d4d1b09701b1c89c1744e5f7db24ffab01aa03ca889b19d3fa4dccac9f3fc507f667412f6cff018080ff851d1a94a200ffff80ffff01ffff33ffa0f5c5f266edc17c8303668fbbbb3c13364c096536020c64586b93d57682b09057ff8601d1a94a200080ffff33ffa08f2a2bfa7ac12cc1023e88d3fb2873466501c55ebbb269f1223e108d21f3739aff840b532b9580ffff34ff840098968080ffff3cffa05e156bc09de8afedaaa62cf973944ba6ba594f4c4579a10595ccdfd875dad9d88080ff808080ffffa03ff07eb358e8255a65c30a2dce0e5fbb000000000000000000000000004df56bffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b099a778ca0f7f54ba213598d4d1b09701b1c89c1744e5f7db24ffab01aa03ca889b19d3fa4dccac9f3fc507f667412f6cff018080ff851d26806415ffff80ffff01ffff3dffa0660f960e7c0e834c1ce086a29e857e253dfb8356b10214687deb043e3f1add9f8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df56bffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b099a778ca0f7f54ba213598d4d1b09701b1c89c1744e5f7db24ffab01aa03ca889b19d3fa4dccac9f3fc507f667412f6cff018080ff8600cbba106e00ffff80ffff01ffff3dffa0660f960e7c0e834c1ce086a29e857e253dfb8356b10214687deb043e3f1add9f8080ff808080ffffa0ccd5bb71183532bff220ba46c268991a000000000000000000000000004df366ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b099a778ca0f7f54ba213598d4d1b09701b1c89c1744e5f7db24ffab01aa03ca889b19d3fa4dccac9f3fc507f667412f6cff018080ff8600cbba106e00ffff80ffff01ffff3dffa0660f960e7c0e834c1ce086a29e857e253dfb8356b10214687deb043e3f1add9f8080ff808080ffffa0d7d2b151b9efd679534b243c4f3c9515e15dbe6cd690903cd388bc97ae826e42ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a05fd27391e6385e5d4bdc5b7b2df67b2e8698e337d49b94302a3551deda565e58ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0815f019a2cb3701e9db8aefa313fcfffa7ad055b2dc9ad4cc4301f885e3b6ccf84464dec5580dee3eaab1ca7c8c6a830ff018080ff0180808080ff830347d8ffffff80ffff01ffff33ffa046162d8fd3bb487f589a26b1f820b4f8f6df87bf207a2a2961880e368f652c26ff820fa0ffffa046162d8fd3bb487f589a26b1f820b4f8f6df87bf207a2a2961880e368f652c268080ffff33ffa02ba11898c3df495199df735a8ae022c09b18919889b4d4c57b3b18070127af17ff83033838ffffa02ba11898c3df495199df735a8ae022c09b18919889b4d4c57b3b18070127af178080ffff3cffa0c254d3faeb8084c9bc31271b228c148a7bd9c5d5cee29eb75787226cd7a9888d8080ff8080ffffa04ce1f6179227a09ae8034d958631c615ea74c3bee45b4d221a62e4f07ee6c451ffa0c084270b35762a47e2dbef68e52fd6e65d95a434e7b915395a0589cfbcc27279ff8303865880ffa03d0696c9d164a92ff834423300fbcb379565f52165c134a63241a9048ea9cbc6ffffa0d7d2b151b9efd679534b243c4f3c9515e15dbe6cd690903cd388bc97ae826e42ffa0de6616c2a755df351f72b46483b29bb7a49d883217d3ae1d413c8d510be24eadff830347d880ffffa0d7d2b151b9efd679534b243c4f3c9515e15dbe6cd690903cd388bc97ae826e42ffa0b7fc162eabfb36cb54a5dae94da94271da560cb170ea9415e69399ad0100783dff830347d880ff80ff808080ffffa0bbf4b6516cb98d3e16c5d974faedebcef69bb159c7c51a82c60099d6e1dda522ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b4a45785e34968e5ce9b11faa83f709b85f7a244b32987f2d2709ae7ac50c12149da1a7cf5225991b6225c384a332182ff018080ff8505436c2f80ffff80ffff01ffff33ffa014ad7ae9dd175b161c12a356c2da387020079e644c3106c7c720da090c653a7dff85054310a20080ffff34ff835b8d8080ffff3cffa01effc54071d51e0301fa30dcbbe9d8cba62a8d2bbf5feebd5531de6e4cddf0e880ffff3dffa0c0a15942b11a27e22f958e9bffb8d9c98282ef7521de7d34bfdf0da24c65ab4f8080ff808080ffffa0a3b24a3162461db88496a9dcb4e2288a7a224e2de7c3c23045f82bef9f7fd951ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a04c9c99becbb2b4de99e2faf7e1d79789f0b8d91e7986b18f5de73b5957a0c65bffff04ffff01ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff02ffff03ffff15ff29ff8080ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff01ff088080ff0180ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff0180808080ff84016e3600ffffffffa01fb2c946971bbc188029460e9bfa4d04c2d1e4f71b77c4b925a5209e13f5cdddffffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff84016e3600ffffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d6780808080ffffa0236e1c441191df7f945e13e733e346b0791a76dfa648814cb94711dee91158f4ffa033fca03708a91d802f3136d0c26313e6ed6248848b62fa578f3ee95dbe2ce3b6ff843586648080ffa02a274b06bb12d2e84f8720a7af0e25db6aae8d5b2ff42b58417f2c87257f994effffa0a3b24a3162461db88496a9dcb4e2288a7a224e2de7c3c23045f82bef9f7fd951ffa0fbaaa99431c9ad73b08cee73b8765dcf3ca9f917b2eff52c34cb3cf705b0bd76ff84016e360080ffffa0a3b24a3162461db88496a9dcb4e2288a7a224e2de7c3c23045f82bef9f7fd951ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff84016e360080ff80ff808080ffffa099cf360c7c5676614fdc852eeb6d1c543803b3ea6dddbd9298fd543dffb28712ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a05c8eab03c9f7e58881539363c15afedbfe884e3b3d57fa96d2607780d7b0b419ffff04ffff01ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff02ffff03ffff15ff29ff8080ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff01ff088080ff0180ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff0180808080ff8303a980ffffffffa01fb2c946971bbc188029460e9bfa4d04c2d1e4f71b77c4b925a5209e13f5cdddffffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8303a980ffffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d6780808080ffffa060bac75c73a8a3d0e9ca235e83de6034c81d4344aedd9949db74e069cdc25bc2ffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff83703a7880ffa02464bbc3d10fcb0167157c182defe8b0cc509ccb42f69bef6916893ad5c802caffffa099cf360c7c5676614fdc852eeb6d1c543803b3ea6dddbd9298fd543dffb28712ffa0fc2e6cb47f750829ed4afeaf6181f27153301e1d81251a0c9624f2427ec4b0deff8303a98080ffffa099cf360c7c5676614fdc852eeb6d1c543803b3ea6dddbd9298fd543dffb28712ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8303a98080ff80ff808080ffffa04820e1b42009bd640783dce88815f1ac97ee15759f42c51528e60b0b8b20f5a3ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0dc77ba1f5599fa63c126b8e512573eacd3496b3e4f6712d1252b119f1e6bec2dffff04ffff01ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff02ffff03ffff15ff29ff8080ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff01ff088080ff0180ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff0180808080ff8336ee80ffffffffa06e2175973032431f279720ee4facd249bae4d47032732b651cfb5b36ce22cb52ffffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff8336ee80ffffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2b80808080ffffa09f6b9d03530b25a21fa677a80f260857d88f40a3de848f74220f5244d1f18a2dffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff832a8aa080ffa008119d17a0af0a0df8b37c2d33634a63f2f955dc98684bc50913773a66e617b2ffffa04820e1b42009bd640783dce88815f1ac97ee15759f42c51528e60b0b8b20f5a3ffa0a9394728d6b737fd71f034ffa893be2e30e68b96c5fd6b9ddfd6d4638a60f2d6ff8336ee8080ffffa04820e1b42009bd640783dce88815f1ac97ee15759f42c51528e60b0b8b20f5a3ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8336ee8080ff80ff808080ffffa049d2d9851d93795f33fe1ecc4f43f2f3456455f6bf40b3cab9a35db7b4df0b6effff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a04275bd94b6913028adc4b183288a873c7cabf65c163e6db7d5686e4ccdc0bb35ffff04ffff01ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff02ffff03ffff15ff29ff8080ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff01ff088080ff0180ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ff0180808080ff8400b71b00ffffffffa06e2175973032431f279720ee4facd249bae4d47032732b651cfb5b36ce22cb52ffffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff8400b71b00ffffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2b80808080ffffa0c26aac047b1d45ec3f7278e17e932c7a7cd7250633868afcab57c30984956871ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff84021c294080ffa09588fa5a77d2f4dc1ae40031069f5cabdfabc9a276fe98e5c87c97ba6fda6d56ffffa049d2d9851d93795f33fe1ecc4f43f2f3456455f6bf40b3cab9a35db7b4df0b6effa077cf942a4717d868638a00631b40f075d75a9919640ec307e4160a856d2dc27eff8400b71b0080ffffa049d2d9851d93795f33fe1ecc4f43f2f3456455f6bf40b3cab9a35db7b4df0b6effa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8400b71b0080ff80ff808080ffffa09f6b9d03530b25a21fa677a80f260857d88f40a3de848f74220f5244d1f18a2dffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0dc77ba1f5599fa63c126b8e512573eacd3496b3e4f6712d1252b119f1e6bec2dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff0180808080ff832a8aa0ffffff80ffff01ffff33ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8336ee8080ffff33ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8300bb8080ffff3fffa0f450e2600fffff58ed1401a8b1df38d973bbb930dd6c5c6cb9fae6c742010a0580ffff3fffa0a6c85633e8c0afece6320d56daf95651e058db3d77a82a28291a3fbc7e6d0a4180ffff3cffa0be1e5c5de72f67cd05a3cd36da8dd2d8540bafe34730d2565a50419d8f029ced8080ff8080ffffa098bcbac8f5ab667c3423453f2fd4db939bb385ae3083fde931784f4215a3c76dffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8354d6c080ffa0ffd51e21f39d460d3665d6628ffac740320d2c980a3590f8f009aea8438f7510ffffa09f6b9d03530b25a21fa677a80f260857d88f40a3de848f74220f5244d1f18a2dffa0aad2c320592220970f7fabb50bdc9bc80c4e6c922d4c7f04b3f6b9d0ce4215b1ff832a8aa080ffffa0926140fe6f7b1d55eca7b84814f77058f6c00e8c1a085a737f8e27ed837ab96fffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff83057e4080ff830d1f60ff808080ffffa0926140fe6f7b1d55eca7b84814f77058f6c00e8c1a085a737f8e27ed837ab96fffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0dc77ba1f5599fa63c126b8e512573eacd3496b3e4f6712d1252b119f1e6bec2dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff0180808080ff83057e40ffffff80ffff01ffff3dffa0b6d3ccf59856fe6fe20fe3ae249620f22506a7cb195d6b1a40830eb6fd9e39c08080ff8080ffffa03de65eb3588edfa888f4f2231aaf559291d3486334406a7d90fb88e83ddcd14effa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8315f90080ffa04820e1b42009bd640783dce88815f1ac97ee15759f42c51528e60b0b8b20f5a3ffffa0926140fe6f7b1d55eca7b84814f77058f6c00e8c1a085a737f8e27ed837ab96fffa0aad2c320592220970f7fabb50bdc9bc80c4e6c922d4c7f04b3f6b9d0ce4215b1ff83057e4080ffffa028a9d4295c3bc6b0e8d495ca48b5d9f16462898299f284c045ff72869aa2d028ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8305302080ff80ff808080ffffa028a9d4295c3bc6b0e8d495ca48b5d9f16462898299f284c045ff72869aa2d028ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0dc77ba1f5599fa63c126b8e512573eacd3496b3e4f6712d1252b119f1e6bec2dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff0180808080ff83053020ffffff80ffff01ffff3dffa0b6d3ccf59856fe6fe20fe3ae249620f22506a7cb195d6b1a40830eb6fd9e39c08080ff8080ffffa0aa7771a2de42eedeebd3e60437a14314acaca6e7685ecfc979e9253a4079368cffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8316e36080ffa08d013f5bb2ef055ae3d266eb339000d1bcb17016253a4c7b32072ba7a3c50d0bffffa028a9d4295c3bc6b0e8d495ca48b5d9f16462898299f284c045ff72869aa2d028ffa0aad2c320592220970f7fabb50bdc9bc80c4e6c922d4c7f04b3f6b9d0ce4215b1ff8305302080ffffa09a3dac3e9b028144cbc31b4b9742b7729c15ea03371cb7000db7f9f9c664b4adffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8302710080ff83057e40ff808080ffffa09a3dac3e9b028144cbc31b4b9742b7729c15ea03371cb7000db7f9f9c664b4adffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a0dc77ba1f5599fa63c126b8e512573eacd3496b3e4f6712d1252b119f1e6bec2dffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff0180808080ff83027100ffffff80ffff01ffff3dffa0b6d3ccf59856fe6fe20fe3ae249620f22506a7cb195d6b1a40830eb6fd9e39c08080ff8080ffffa0e84ef3af70ef86b9868cb776f4e8ae5cb7496643f6bc427b845e307f3df4d2cfffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff830afc8080ffa00b400ea6d6562f7ceccc060787f81a99310e6030b6d3c97f336d90332601f0f2ffffa09a3dac3e9b028144cbc31b4b9742b7729c15ea03371cb7000db7f9f9c664b4adffa0aad2c320592220970f7fabb50bdc9bc80c4e6c922d4c7f04b3f6b9d0ce4215b1ff8302710080ffffa09f6b9d03530b25a21fa677a80f260857d88f40a3de848f74220f5244d1f18a2dffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff832a8aa080ff830aae60ff808080ffffa078279de080c60fec36e84f15001871a569ec8f03f9188ee1119790bb60e725a9ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff841e048024ffff80ffff01ffff34ff8402faf08080ffff33ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff841b098fa480ffff3dffa0b6d3ccf59856fe6fe20fe3ae249620f22506a7cb195d6b1a40830eb6fd9e39c080ffff3cffa071220382d2fd8a38f500a853e7a98e1cf662765f24f8ed4b63c1d0c9724da8cc8080ff808080ffffa0c26aac047b1d45ec3f7278e17e932c7a7cd7250633868afcab57c30984956871ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a04275bd94b6913028adc4b183288a873c7cabf65c163e6db7d5686e4ccdc0bb35ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0941b7a3d387e320291f62f44d714c465f3d8c032f1d4f87532dcc8136826e9ab367346c04a530f314145f7ca0991263bff018080ff0180808080ff84021c2940ffffff80ffff01ffff33ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8400b71b0080ffff33ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff8401650e4080ffff3fffa0f450e2600fffff58ed1401a8b1df38d973bbb930dd6c5c6cb9fae6c742010a0580ffff3fffa0a6c85633e8c0afece6320d56daf95651e058db3d77a82a28291a3fbc7e6d0a4180ffff3cffa0b50e32e4e28fd27e6a41353337dcc4082f1d9a0845f44f57d60b20cddba579aa8080ff8080ffffa0967e8b162a13f9423cd1318fcc28284337d32416e9126018f344c006af6654faffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff84021c294080ffa049d2d9851d93795f33fe1ecc4f43f2f3456455f6bf40b3cab9a35db7b4df0b6effffa0c26aac047b1d45ec3f7278e17e932c7a7cd7250633868afcab57c30984956871ffa08605c15b1575782e84da0f67f3192c1ed3518e6aa4f05640f3da58754ef61fe2ff84021c294080ffffa0c26aac047b1d45ec3f7278e17e932c7a7cd7250633868afcab57c30984956871ffa03dcd5c027bfd0f77f7fb67b5adebd6c9b915f5decd36ef6c99ca016982e79d67ff84021c294080ff80ff808080ffffa0236e1c441191df7f945e13e733e346b0791a76dfa648814cb94711dee91158f4ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a04c9c99becbb2b4de99e2faf7e1d79789f0b8d91e7986b18f5de73b5957a0c65bffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0aa7db090f8879a2b8415acff00ba6a15cbba698da67e1eac4b4b11f744022efefae24902e52268cf911a656cb8e457afff018080ff0180808080ff8435866480ffffff80ffff01ffff33ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff84016e3600ffffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e78080ffff33ffa033fca03708a91d802f3136d0c26313e6ed6248848b62fa578f3ee95dbe2ce3b6ff8434182e80ffffa033fca03708a91d802f3136d0c26313e6ed6248848b62fa578f3ee95dbe2ce3b68080ffff3cffa0444301d9bde67013c636682df549ed736e59a7c05b28f8186668f286fe5b401780ffff3fffa06e3161c692e974f96fee5e5ebe08d6e22f6796824678c987b5019c00406a7f2680ffff3fffa0650d470a3caf60ee6984de373bbede671ef7bdfb56901e182684b7f9f35fae9d8080ff8080ffffa0706bbbff88b489c91c9a51fd40fc8070efb17e331348b511d52edafa20343022ffa033fca03708a91d802f3136d0c26313e6ed6248848b62fa578f3ee95dbe2ce3b6ff843598b40080ffa0a3b24a3162461db88496a9dcb4e2288a7a224e2de7c3c23045f82bef9f7fd951ffffa0236e1c441191df7f945e13e733e346b0791a76dfa648814cb94711dee91158f4ffa09fd101324b3a05c8f664ac39557f0b86d14be5f0a89a3fa29541d591a82d6fb7ff843586648080ffffa0236e1c441191df7f945e13e733e346b0791a76dfa648814cb94711dee91158f4ffa033fca03708a91d802f3136d0c26313e6ed6248848b62fa578f3ee95dbe2ce3b6ff843586648080ff80ff808080ffffa060bac75c73a8a3d0e9ca235e83de6034c81d4344aedd9949db74e069cdc25bc2ffff02ffff01ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff34ff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff02ff2affff04ff02ffff04ff82027fffff04ff82057fffff04ff820b7fff808080808080ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff3d46ff02ff333cffff0401ff01ff81cb02ffffff20ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff7cffff0bff34ff2480ffff0bff7cffff0bff7cffff0bff34ff2c80ff0980ffff0bff7cff0bffff0bff34ff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ffff22ffff09ffff0dff0580ff2280ffff09ffff0dff0b80ff2280ffff15ff17ffff0181ff8080ffff01ff0bff05ff0bff1780ffff01ff088080ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff56ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ffffff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff7affff04ff02ffff04ffff02ffff03ffff09ff11ff5880ffff01ff04ff58ffff04ffff02ff76ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff34ff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff7880ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0121ffff0dff298080ffff01ff02ffff03ffff09ffff0cff29ff80ff3480ff5c80ffff01ff0101ff8080ff0180ff8080ff018080ffff0109ffff01ff088080ff0180ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff5880ffff0159ff8080ff0180ffff04ffff02ff26ffff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffff02ffff03ff05ffff01ff04ff09ffff02ff56ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff7cffff0bff34ff2880ffff0bff7cffff0bff7cffff0bff34ff2c80ff0580ffff0bff7cffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff34ff3480ff8080808080ffff0bff34ff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ffff04ffff04ff30ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff26ffff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff02ff2affff04ff02ffff04ff8204ffffff04ffff02ff76ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff34ff2d80ffff04ff15ff80808080808080ffff04ff8216ffff808080808080ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff5affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff02ff2affff04ff02ffff04ff27ffff04ffff02ff76ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff34ff81b980ffff04ff59ff80808080808080ffff04ff81b7ff80808080808080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff78ffff04ffff0eff5cffff02ff2effff04ff02ffff04ffff04ff2fffff04ff82017fff808080ff8080808080ff808080ffff04ffff04ff20ffff04ffff0bff81bfff5cffff02ff2effff04ff02ffff04ffff04ff15ffff04ffff10ff82017fffff11ff8202dfff2b80ff8202ff80ff808080ff8080808080ff808080ff138080ff80808080808080808080ff018080ffff04ffff01a037bef360ee858133b69d595a906dc45d01af50379dad515eb9518abb7c1d2a7affff04ffff01a05c8eab03c9f7e58881539363c15afedbfe884e3b3d57fa96d2607780d7b0b419ffff04ffff01ff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0802b37de39c08f04828c289cbb4a805d962638d7e58d32e2411d996f9ade87a4dcbaa6ed3ab08fe0257d994eac9c01fdff018080ff0180808080ff83703a78ffffff80ffff01ffff33ffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7ff8303a980ffffa0cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e78080ffff33ffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff836c90f8ffffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2b8080ffff3cffa0628c24ec37c76cc7f8d7f08f21a73e0444890a0d6e45543f48f934314a1f259a80ffff3fffa06e3161c692e974f96fee5e5ebe08d6e22f6796824678c987b5019c00406a7f2680ffff3fffa0650d470a3caf60ee6984de373bbede671ef7bdfb56901e182684b7f9f35fae9d8080ff8080ffffa0ff180b23890864309a00c0d331a9070c9772d674f21656aac83d273c53896c0affa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff83705da080ffa099cf360c7c5676614fdc852eeb6d1c543803b3ea6dddbd9298fd543dffb28712ffffa060bac75c73a8a3d0e9ca235e83de6034c81d4344aedd9949db74e069cdc25bc2ffa00462c9b7f73788d40b71a7f6961107dc07018dda24cb660e935eaa340bd2bcc7ff83703a7880ffffa060bac75c73a8a3d0e9ca235e83de6034c81d4344aedd9949db74e069cdc25bc2ffa087c2dff907bb739a7c3b4bf0a6f6f4fca2387bbb449b88c02a1ad4c87de13f2bff83703a7880ff80ff808080ffffa0148ab9806253a094d9db2c2847336c38a4a87b252064d3a91b2a124c3aa92248ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a769f0ad14205910ebca9e401c394d00fa8ca3fa8fb8ae5f49f176218b3e721754eb5152fc7ef9ed88bdd12c401dadc3ff018080ff8268d6ffff80ffff01ffff33ffa0aa5d03137d15adcdcf167a099d1ed90111c8a075aafea91d2efe176443489846ff8268c1ffffb47b2770273a2778636873272c276f70273a276d696e74272c277469636b273a2763686961272c27616d74273a273130303030277d8080ffff34ff1580ffff3cffa03ca34d073a08e86fe29eea0930a6a39446542cdb8cc7b40301507d7e8b52a4298080ff808080ffffa0a4a01433528ddfdb676af8c1eb9af2c77ee8aafb3168e4c3ad4e189457b5b442ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a769f0ad14205910ebca9e401c394d00fa8ca3fa8fb8ae5f49f176218b3e721754eb5152fc7ef9ed88bdd12c401dadc3ff018080ff83008753ffff80ffff01ffff33ffa0aa5d03137d15adcdcf167a099d1ed90111c8a075aafea91d2efe176443489846ff8300873effffb47b2770273a2778636873272c276f70273a276d696e74272c277469636b273a2763686961272c27616d74273a273130303030277d8080ffff34ff1580ffff3cffa0d3b99814ba9e36c28dad4e316864888bd19447cd8b777bc124465636d30285a18080ff808080ffffa099f6e121f227593a40799b8b990356ad10398d03d1698b29a77b9c16311cea80ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0a769f0ad14205910ebca9e401c394d00fa8ca3fa8fb8ae5f49f176218b3e721754eb5152fc7ef9ed88bdd12c401dadc3ff018080ff840966f8a7ffff80ffff01ffff33ffa0aa5d03137d15adcdcf167a099d1ed90111c8a075aafea91d2efe176443489846ff840966f892ffffb47b2770273a2778636873272c276f70273a276d696e74272c277469636b273a2763686961272c27616d74273a273130303030277d8080ffff34ff1580ffff3cffa004fdd951323b3d845772ab03f6a97ec98b1a6b73171ff3cef407b3cb1077a5208080ff808080ffffa0d1171ebaa89e1a9636c6b8e4c231ef6cd07664f7a5cbd4e087104f985dd906a6ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b34ce3f6a716400a042b53724fcf57c085c5d68570426d7167146d32ee0ad85bb93c6e8261006b51c93b71f6085c38a9ff018080ff86015c473cfba0ffff80ffff01ffff33ffa08afefa8b9382715c536eeeace7d84e24429d4eea6cc9ef39d61956135541b43fff843682a2d480ffff33ffa0ef4dfc9df3a638fafcfe2d5c24293f9971e31468bad1a2bae049f5262e19259fff85020cc7233b80ffff33ffa0e473f91d847d8363e1c4a4868e26db23c3e3d6d71a414840e1394ae9352db6c0ff8500aab7511c80ffff33ffa0836e865041d36e86bccfffa79bc1d671575e526256422f2b067451d4158661c3ff850bca973b3680ffff33ffa0c031c6e6c0c3414578249bce33301b5c0da433e1e7e4f21080a9638592912ea2ff85047396bf0880ffff33ffa05a72ae711e4b7c751c7f62a41f758471036ee6e768fbf9fca469f19b555d32a8ff8466b5df6380ffff33ffa0bd16987dae95d922a8aa548f0716d9d231bf04546f6596f386449230f0bafc05ff8524216cd1a180ffff33ffa0b8d840fb560e9e5d49cf7fa86d3df8c41f2c1e94fd6eb975191cc353aeada5c6ff846fa796f380ffff33ffa0a224f3b804eca462df749eb12cf3b1443ed0f3ebbdeac7c2b4a3951497714bfdff8500a8ca49fc80ffff33ffa057f4b1a19e99a2c3b4ff2c598997d0dbae64f28be091dcea3b159ee662061df6ff85035c981f5380ffff33ffa0dd65c4f4adabde9d76b97ba0367eb3e77c5f9e87af648c84c072cf9f830ab2d0ff84523ef32880ffff33ffa0062cb8cd7d47159ecf1a1c9b3f45fa3d42c769da5822dced171983aeddef3472ff8502f7a6ef4980ffff33ffa046999bcd5db7d7d13edc5438032fad4b8033551ebf0ced22504bdf4bf5eeb6caff85044f26345c80ffff33ffa0ba322e4631a1c232c7508e800b9a6169ae583d56cb04e999e132e3cc7428fccfff8508f532ba0b80ffff33ffa0ac4804ecd2885655c4adcc00910e29b1ffc7aa81f9ccfe623b402ec3dc13ad1aff84780f644f80ffff33ffa09b8e85850a1dca4ddab22279735884560939b77bffee0d04ec354c490096b6e0ff84776e1b2a80ffff33ffa0e4b28d4da8be15dcadc5389d7492fcdb1487617d1712fe5e9ebdb75bf4ac5acfff846fe941b380ffff33ffa0743d5bd40595ab16e63b1ace73bd33dafb98082dfad6b06bf30ffabdef782fa2ff8411cc9c2380ffff33ffa0f49d4d54b1da67f205fa698c6a09a0a8d8016c5515b75ac3810a9dacf88ec4d8ff84016a22bc80ffff33ffa01cbbc3babc74cf5fc21289bba69d85a377cc5ee62067058d3dd3707727ac1ff3ff8408e9018b80ffff33ffa0f0b59ad2d2ef5e2f1e11e565b303408ca14fcd852158db788b809fe2de1454ecff8502566838d880ffff33ffa0c9b877a761db98f14301f4eda52f445da362e8f29d613a6e391493f6488fc1dbff850105ef5a8680ffff33ffa043dd26694539a71c930d12d5e5eff753ba859b18d74a08aa8fb8b07613e016a7ff85060f96e90b80ffff33ffa0f04e39a27d773f20630d2502719f91a61ff5bab0a9946e53ec9277f8b114a8b1ff8507f69ebafd80ffff33ffa092860712ffc3b82c3389520adf55be872adbe091ab6d1da2c1ef94be03319279ff845cd8242480ffff33ffa0be9a3e0817f482386e4c11b62b5a587208a435d4707290d70e62007ff5d828e7ff86009831b76f0680ffff33ffa09323b54c55ca92ba65b49362a27dd9e99a7d9dd7e7eb48fc4e34375cbc432768ff85034ef9fc4380ffff33ffa0095fc0cd195cbe2e05fff0c0d6a4cf166a936e91514352e562d2580b91787a17ff85009be8674580ffff33ffa03f26870886deb5dbccdf2fa8fdcd3fac2bad757e43e6fcdf394bfff7802d20b9ff8500882aa93e80ffff33ffa0d28c171825f739925dd71a5cccce5128fd6f52319eac0a9e47120c17b07a2283ff850082f671ae80ffff33ffa03bff91d04c159bc69138fc980b367ad8d12bb1e4e0f8516c119bb6d70b9fc1e6ff85095a9306dc80ffff33ffa07221c905ba77dae0c21ecd0d9e2a4b4f5fcbc43f8a23c8ad029de67dcd291c61ff85076557fb1a80ffff33ffa00d0331195c0e2c380a0173f53b87bd950c0241388fbdcaa245519dc65b6b67ecff8501cd9a3a5b80ffff33ffa0ee1782435d0bd83a3ebfc025e438f8941cdacc866e0f4530716685c7f312dd44ff847e57f29880ffff33ffa07cfb7e38cb8a7a396d10c80d8c1b6abb7b9ca39bece6e7f62f0fa7bc21c20065ff850180bdb32f80ffff33ffa0509f8d7fa857d34d60efe3d765a4f5c71fbf82130b1ea2cf9f37cccee23e4d6aff852fa23b75a080ffff33ffa09a42344835e84cc122d7582549e903cd8db2cb2f0cf63e0605fd6a804eed0c6fff851991597c6f80ffff33ffa0d146dfcc2a4a86b216c7d5f6fb9d227f648b1a8b69a931c5b556f665cebb0a73ff8500e3fbfa3280ffff33ffa04d502867599fdfa37955bdb4c478c02c82cd2f6c7ec1131e327920cc3047787aff851430a7b42d80ffff33ffa04b540a048ad9fbcdb8005383e24044f428aed4cf73c87e56d50c32c452cfbfeeff840fe9eecb80ffff33ffa0184ce1c2011bf0da74c1e3e20aae2c3dc08ad96046e51cef73b69d280f3f515cff840cb861ae80ffff33ffa06bb6e871679abf300d55e04d3dfebff87dd8e3f798f22747453d24c94a7eb071ff8322860d80ffff33ffa0e8eba13c979ec1b9fe18553956980b32d0c03ad0332010a388f195f96519e08eff8514df3d77ea80ffff33ffa064aec1e7f07951f3e73f71c2392cc255caacb3fc1bd0d68f9399d0e0a443c8beff84247f88d780ffff33ffa0f3a3881251ca52c8c40cc19759778c8e6b263df9c1f03666ec08aa447db92188ff85010ca52a8d80ffff33ffa01939430b25c36ef1a86379d5f0343b10117d147bee675a4ae6054f6c1351107cff85048c82655080ffff33ffa095cc70d3f7243b042b45df3a3bcfa7ef6bf85515f28a3cdef3059a3dfd1deeebff85043f123e9b80ffff33ffa05ea1ad762a76693b3c4b66e53302348b3cd5750148d87acb4f1d53e6cce19c06ff8405f1507a80ffff33ffa030bcd27a48b944ed834debcfebbc916d1fe8f3b3c5dcbcd0831ca2beffa0927cff85031e3a06cc80ffff33ffa0e352305df89ffa0e9c8b2d59cb0dcf753d9ae63241980b1e0f43916e70f1ca13ff8509813b61b380ffff33ffa06179455d716a6d24f612aa394e0be4f2c2a676b9145888996148ca44d005f25dff851d6027dcb280ffff33ffa0d544baf5fc43086a5773b8c6fea6b3cf47417439a4a6dcb9d430b4932042123aff8507f1e1392680ffff33ffa041d14a042259f40d7c41aff1404b5586802e43c7b0c6918445cfa2c3b8f184f7ff8500c210ba1080ffff33ffa064aec1e7f07951f3e73f71c2392cc255caacb3fc1bd0d68f9399d0e0a443c8beff84335651f580ffff33ffa0d4e255038a0009497415e517105ce01acabcea945d532e691c7851abd7bb2ec1ff8502681bcf7880ffff33ffa031d51787024d2738694f6baf3ca5fc03d972ac018db332448b1b456e75f6e02aff8446c1b8a580ffff33ffa04a188518b1c13bc6629aad9cd990cbea0ffe709bf6eb39a72b83bb76da46a62bff841718ed2e80ffff33ffa0ebd83c3f8a34fd30218f95be2e03e524b44bb317c1385dbf21952e94fedc8d57ff8504e6bdcf2680ffff33ffa0926ab2e5e4903294cd78e56e622f39b93b2dc2059f55d850f74d7ca17d07f453ff851f5287614080ffff33ffa06702904a040b442f596c5960cdd3111d8aab8558e929bf83080420883028bcc0ff84062e2cac80ffff33ffa017e1a5dd169c710e87af6b287c474daef800073c944f9980c69dbd43a21b2e55ff85030509dcaf80ffff33ffa00e1121425244df43723d0483003e96fd6237bf84fbb2ed1ef59f8dfee44feb66ff841ac1537a80ffff33ffa0902ae05491f48bc37a3984d341ea2c65bb1fbc9efc4b684afe864d7283bf6087ff8447c8e4c280ffff33ffa0ca202eed68a5c4620ecf52c5754dda69235aff95ab32ffc8954afcc6dc33660eff84057832b480ffff33ffa0914ac0e6893998df2e6fc4d1229cf935c8e47f8f76c39e3c874f2ec7e98a1264ff8501fe4d810f80ffff33ffa07cb95a30111ec570d57f396a980a6cca7b3642dbdc49a02b52697e13307f45ebff8500c8fa408d80ffff33ffa05e2073f8701db34cdd89e8093db94a557859dafd818ad420cb8fbe477644ede9ff840c90fd8e80ffff33ffa091ac02a6e2a728bc1cef93b93189cef8508cd4fce780c13767a184e476d4c991ff85019e6b788180ffff33ffa02f5a6646bf447cb93437e3d253f7cb1e6af0751a0c9225d64861968b182ea8adff85051ec00d6b80ffff33ffa02d112dac9a7e61359a4c4fa2a1cb358565f3844c5bcacaca91c77444b33eb4e7ff8521233045ff80ffff33ffa06fb4155fd43e61ad313255ff6d2d83cb2a9e790226d3b6a0816c69b27bf94d10ff8507fc64f61d80ffff33ffa0394fc4efd6455c872da775a09e2f73920ea88839a7f3de0510acfea479a348deff8506562747e680ffff33ffa05989b1e35fef7f788b05684d530b1f69a645185c8993479bfd2ea167f487c0fdff8503a1e63b9b80ffff33ffa08559bbeba31f53c0e67669e7acc68140b5f828f2edd2662c34a8fefc44891de3ff841451a13180ffff33ffa043e0ec264c5fde9e81c9eef4addf615368f62e77fea2ae623a4860e3cca118a9ff841633aefe80ffff33ffa012188c67e446884f00e1281beb1bbe40637151801e1bf3f7996ad807ee27e13bff843582ce4c80ffff33ffa073e53e63419314982302977db7d68c8b4d881b586d73404041940fe073b30c18ff844eedae2180ffff33ffa04646049c3d927883d6ce6bd7c2d7219c16c170a5380c2dff19f80c262bc1d724ff8502fd392b5380ffff33ffa030bcd27a48b944ed834debcfebbc916d1fe8f3b3c5dcbcd0831ca2beffa0927cff85036c1ebb3680ffff33ffa0ac05f368d4ce2acd58891d9d9bd1416288b67ed75f963526c8e14b68c8d11ea8ff8501e6fbcd3480ffff33ffa0d4df6a4d953cf85bd9ae96692dca49f98c96562d32481338a62535763c146e33ff850739d05d7680ffff33ffa0c553ddae65a94d3140299062e8542eb270af90a9a56200cd28d1235d805a27a4ff840965388680ffff33ffa0329eeba16fafd9c49e6c0a174050877a09c22a24e6a8f04bc1cc60500cea7dd8ff84109413b080ffff33ffa00fa5bcae8ba3fd8dd27dc813cb042c4c30eea03c9f3df879576f184c735298afff8500c8d0850c80ffff33ffa06b8671e4299aefb177ae57301ae6ff47be7def14f29184ab92ea8c97e862311bff8502d96af7f980ffff33ffa0391b453611d536f238a3dab4ffaea9c310abf94c9c02680572f88d169d13838aff8501783ce61b80ffff33ffa07869caa93881d04e08b40bcbc6fa24c5465bb0499adf3205505557949a703631ff85053ce306d780ffff33ffa0380ae0f8eee787a0137b823a113a3f6c750b03ea84487de15d51ab33c7b08006ff841591195d80ffff33ffa0b425e1f99ab2eda362076bf912b93e5586c44c98cec8994519e7a322a2becc32ff8517b63b01fb80ffff33ffa0205fc251369f3a5d2cc6aa2dc67fe28f05eaab8f67047b253da04b94b98b540aff85013e88398780ffff33ffa00c0b8dea4cbaf1116e8a8e57161b2b6f7b5179f3a67cba4cd18a87c98de774f4ff8600928d60936080ffff33ffa02c289d490affc5b251ecffbba6bd8e94457b2d4fe98962c3d77ac980eff9782eff85008448474580ffff33ffa00c6b15f3112307e07d0320d9142639b35b59439f2479b34ce8ea77248812cc34ff8502ff27f2f580ffff33ffa05f12d6c4d1830f3cdc0bebc5513070e24cb4db3733105956d034861c1fcd380dff8508610ab1f780ffff33ffa0d04fd6c02fc54a3a7ee91d767f54728f4fa462050c0d41822d4dd577fbcd4ef5ff85098a3f6b7e80ffff33ffa00d19ca16fd4b07aa2df682acf277c3b74d0b718d8e4c4f3fb4b27a79ec0cc8daff841c80da7480ffff33ffa00e9365f0ff3389edcdbd1ff66dcf23083ee057f1d1f764c2cadc395341e221d7ff854b5a08799680ffff33ffa05629a8d545a052574dffe1fc0e621f2268c7d69826160bfb7be6a3bdbd847916ff8461f8454280ffff33ffa00793009a04405080d4e15a96aefb4b849b279847694a7b49bdad5fa89bffe7eaff853792aaad6c80ffff33ffa00d466552c48a77810228d970703aa2c63b3f3e473301c87e524157b7a0bad24eff850083343a2d80ffff33ffa0853a00f43145b3f19e4e981faa9d3005aafed361e23234df72027daedf2ec1e6ff8500ede9b99e80ffff33ffa09b8686c39afb0f0717c965fdc7cbb51a77f2bf89400b80a501b33c74a2ae6cd4ff8455a2f0b980ffff33ffa059fabbbaca4dc71a02ce597c6402450183438f34a7a55746026469af5214a8d5ff850500e2686380ffff33ffa06fc89363367ce3654797b4b19995c483deefe2900e601eac8af56c0273fa586cff8406b758fc80ffff33ffa0323bee5f62c916803393cdf3b0c0466c84c8ea2f79a6a4d350c73d29702e13c1ff850144f9423480ffff33ffa043806c1a10b435655b2659d0d54a1bb41936e0c19390826b6888f94570f1def2ff85033765e3c980ffff33ffa0a8e94891581581a4aa09f16797bd09fc80ec753c034bef754d90825d329592f0ff850108824ff080ffff33ffa0428760c9045a92bb802e972a0f6ac1c238e15f724aee7acf5e68ab655c2851caff85022c7b34e680ffff33ffa0342620d3142bdcd4fcd6a044cf3cce5dab0dffeea0690f5c85af69efc0e47631ff8500b6c1751580ffff33ffa06d90578218369d5d6149b66f4f70ce716f783f4c850ebcd8f821033855f4460dff84114da61780ffff33ffa005225609416aa6cc4314a4f4b15572134f0d9a5c92e79abe2bc53150b8de70f9ff8500a0d8cedb80ffff33ffa06168fb6088efe6811a54e4c416035a113e9a5d3ce5afae060c8ab93cc9b5ec30ff845edf9ab980ffff33ffa0f3625e5402d621f8a27ad5583ded81d402b8592938e344225a500388e77018e2ff85127825310780ffff33ffa07f60c890fe565317cd2633e4aa74b7bc10ec1a81e6646076679f6b51b317436aff85028a29bad880ffff33ffa0d904525a8867d7487c8e9cd3b2326c696c0c5646154867d6e11d5d8807d495f2ff85107f2ac93c80ffff33ffa0009d87faa2e639fced8fdcea2ec2a42287d720b2874e536165cf52ba1cb70e62ff850f33aea1e880ffff33ffa0d91ef0a2dcf3c12c01a86f0f3a858f626cddf31ec66b85ceb5bb4b6c4a3c6c3aff8536a5e5932380ffff33ffa0bdb1ab144c0c6c6b1403f62eb63f034bf2352cc87bc3a4d58e862eba8c23839fff841c5152ce80ffff33ffa029cade4ebcadf328ee61e4aa98c1d7f0d00e936ae31c2a16a94b6d089ae51557ff8503477ad37a80ffff33ffa0f719b42736092079275608b4e29a375ce1551901a314b7f4a05afa194dcce959ff8501f60ead6480ffff33ffa064aec1e7f07951f3e73f71c2392cc255caacb3fc1bd0d68f9399d0e0a443c8beff841d83b16180ffff33ffa008aa3ca24e31dd1f74bfda9d4d04837ef7c35bbaebba89336d2ac643ab624e4bff840b2d6f9780ffff33ffa083cb31e68727f9ee08906fa6b8cd4934cb5fb3db8b25fbe91e15b638f104cddcff8500801a42ad80ffff33ffa079886e1494e367cea6324f25183072bb5ef1545dabb3a72ffbff890f945d30b2ff85062b8c624e80ffff33ffa0ef4dfc9df3a638fafcfe2d5c24293f9971e31468bad1a2bae049f5262e19259fff8501b5803dfc80ffff33ffa010006c57d6f82be9181e9c7f6c69fbbe26964e4fffce2e30346c5ae3612cf340ff8504c46fa49b80ffff33ffa0ce549551217ec27860ac1bdd6c8e709c884283f53ccf0b4e477c543854c31019ff85148c53490980ffff33ffa092860712ffc3b82c3389520adf55be872adbe091ab6d1da2c1ef94be03319279ff840d3a786180ffff33ffa010416c19a61bde37f72042b4d6b26319e81931f7171e3e3ea97856dc31e8f939ff85012227009780ffff33ffa09408d59a2b6f24063b698b478f16abb912effb4a17f4cc1d430e160aa1f27affff84034438ee80ffff33ffa0e5d9f1a0629a95e9e7413d0e2b2284752101c822260a6978aecbefc64bf29a73ff84015f4b0a80ffff33ffa0867524c48e604e120f609b2967e9422365fcf278be6d86cca4a890a34ed9f3e6ff846d3b2afb80ffff33ffa04f81d307039b7d10cd891187e52536c49b56c5322c7f347e5842979d84a21ab4ff85012a92222c80ffff33ffa063fb1974d1d773fd897670fbea3db8fc62da46c14aeba83274868c876e74af47ff8505c3a5cf5b80ffff33ffa0c761907f1d9a9604ae2cd008f6d3d31bdd6d12311143b437963f7164dda85443ff850f6332efb880ffff33ffa092860712ffc3b82c3389520adf55be872adbe091ab6d1da2c1ef94be03319279ff844cb3d7e180ffff33ffa04f22547d06ff5205cf7a95fa32464991574df26679a956e06c2d8d601b466fc0ff85198d763f6b80ffff33ffa032825210b8dbb7c180114875068b60ae48128e734b5e02238869ac387fbf15d4ff85008b332f5e80ffff33ffa0341340087c37e483a59fb5082ebb40cb17b84329c336a0d533ae21b64b1549c6ff840918655680ffff33ffa0029699ae4e7c91ea4f9e63d5149f8b89247fcf26b51f5e3a17d3d70e6b5c79f7ff85016fdab4ff80ffff33ffa0ffade508233278c5c6d231b155b879797bc9aa09fa82440cd1b5290cc508464aff8503a49c2ba880ffff33ffa00f0b9d36734a551850f58f3538ea95bb6a4521b53d3a6c6de2c0ed0de99fa9bfff840dccb54b80ffff33ffa04935e9f68f9e2000d3c68d205c07097912f116b99ffd414b7a99deb0f1a8ea8eff85042b18e2d380ffff33ffa0ce71f6680466000cfdcac7b6f04da2a22350ffbf3d54d2e8fe8d2b2105f8fabeff85032c78799080ffff33ffa0422aeb096cc3cd90daa15f6f587f7c092a3e1fa96b98462d5f91ac7be8850e44ff85037c74ae4580ffff33ffa0c8e717e016cf9db6b6cbd888b91d1c79330d73ea1c6a53e31578471746a78f79ff840094a23480ffff33ffa061dd63c0a6a0b5faddc8996a991f4af4e95ae1137c37574ee20774a6add027d6ff85009127933280ffff33ffa000f20c2170cebf7027feb094ed1acde6f66d2ee860d8265664f9028342659822ff8501b76781bd80ffff33ffa0064db957126a64219e3cdce1389c06ca2a12b472a5e4b5f5b1b69db1dc8447caff85288197d4c880ffff33ffa04acf0b787b39ee4a39225adf590d0eef240da4e6a655cedb609dac343950c9eeff8400fedf1a80ffff33ffa061c7027aa449f48ca1ffadfae03e7857ee02c91964964e0dbe38046bf92b3fd9ff8501ab2d63c580ffff33ffa077de7fefff8b6947d3c9ee3388b3e39090ce2d4394bf166e08c7b418e8899376ff84083cde1e80ffff33ffa02e3901238bfd1eafccd587b248ffc696cd783cfa6d70ffdd24d1987055f6f6fbff840c81718680ffff33ffa07f7e880a262597f39f1406c4d197cc45d5047545709c3116f1ccce68ef5949ddff842046cc2780ffff33ffa0394fc4efd6455c872da775a09e2f73920ea88839a7f3de0510acfea479a348deff8504ad55e54880ffff33ffa09bd8ea466b822b7d7a4c61f607c1311474c2d55727b43c6a99885666154f8321ff8501d03b852580ffff33ffa03eae33f0efa5c96286cb62e922dfce698f0b0ba4dbd01586e1b3a9f972a5c9efff84040ff65280ffff33ffa01817a35c9daaf323ce683734673bb76a8b16ec3af446f67a190e029e563b400eff841a28bda980ffff33ffa08081a4445a1da60839dd088326228f57a88b0422bfb41a3cd57d75a44378c627ff85018a744bf780ffff33ffa012b0015c29436ca36ea3af84065f525b45c5ff959d38718c68bbf1f16cdd98eeff850323ff636d80ffff33ffa02de5226084c4be592968c34b9afd169d57808e95109530e9b3b894fbefa94b72ff85033e5623ef80ffff33ffa08a4ce44aeb6244cee78db683a9b1459c051023e139a1f22bdb6cf0982dd9a97dff85074bfc510780ffff33ffa08ef48c1dfb22a2bb18fc52d45cb4e5245e62f27eb178cddad976398aa0aa74deff85013a24f9e380ffff33ffa0ea4e5262476b05e54e508c628e0d8d48e468e603e1e214b0923c8dc9c83008c5ff8500ae595c9080ffff33ffa0eb2a4d2a919b39b9ee02efe51081c28c0967313e69914f149a2224829b7d23ccff8501758625e280ffff33ffa02eab634554bfb94f096ef821565b3724c1fe18fdc8c0c17d58d241e4cccb62faff85048cc286d780ffff33ffa0a96c50dca6c4d5330fb653f9bec615d75967fc39892b6e91ef1b68220c43f65bff8519363e10d580ffff33ffa057462515d6a1fa09f7c5823ff96536e467b1932cf53701fa27dde994ec6e7eadff8409b42b1280ffff33ffa0eb1340690f55a4e0b81c18dc5b5a75cab9a06ec220ea3d705d82095c6ad9be5aff8501b5d2b96080ffff33ffa059674c825f08a3f847cbef10dc55932498f94c5c54b48e8934919a4e2db2d2e7ff8501b6b5be2c80ffff33ffa0b1da3ddc7cfd88f8eafc1a501ed7a0a068c0d2d57d8b75d5eda235dd61b64227ff840eba0d9f80ffff33ffa0149fcb916287119a3a824f998af4643ee926d2049d22459e17d66532532a73e1ff842a118cd180ffff33ffa09ec67fe90adbd4b5d5a3010b373410f0d896c56295053a7d99bd8dfe1c8cfbceff847278406480ffff33ffa054a013692443b5245bb113eee37fe1f399e87987b36ce83538deed6d1c0b7e60ff85237a2ee11880ffff33ffa0149fcb916287119a3a824f998af4643ee926d2049d22459e17d66532532a73e1ff8500db5935a380ffff33ffa04a188518b1c13bc6629aad9cd990cbea0ffe709bf6eb39a72b83bb76da46a62bff8423a2829380ffff33ffa0d5ed72948f98be4a4f8b1d78afe704b9dd22fb9bb5c74fbd040e03bca2f3a4baff846d1b3dcc80ffff33ffa030bcd27a48b944ed834debcfebbc916d1fe8f3b3c5dcbcd0831ca2beffa0927cff8502ba9f0ab780ffff33ffa002491276ba0c8867706d8a7971d8fbbc7020b6f2739036e68b2e6c9056c24022ff842b715c2580ffff33ffa0f2ec4f223a5357d6b367722abf0503b4a39097510320b445a6b6b01b9433ed0fff84534bfe8c80ffff33ffa0a896789f5d4ab3c0d238d162f6c1d6d8d2dbf9eeb5b3e8b00138ab001cffe832ff85011d89f6b380ffff33ffa072e64383922b68beffaf58623c6338d90de8a07cdf89f4474605b6da7f46e665ff85023a7252d280ffff33ffa080b97f7544f593b21b20c0693409ffecd7bfaed0bdf4b22ba9c9a87140f85578ff840d50788980ffff33ffa08cab3a77bbe0c1f75565704b593698593d91381d2b4b2ff629923c01975e341dff8502a096915f80ffff33ffa0158d39d0a505b997977732016428aef60da78139d89ddbc6f7e0e4c15d7666a2ff840234dd0180ffff33ffa0a5783bbdce6b99cd11b54def80e5306cdc3afea2b61a3875c9b488b0db6f5a2dff8501652f112a80ffff33ffa0e1c658c5bd3665a7964cb25d09d067d92452670a15e29509bb74c54982aea1e5ff85026cc1abc580ffff33ffa09ddfa45e0a29ddc73aa34162ca8859387f7b769121a14544650706edf635d03cff8500a3b4432780ffff33ffa07d03c429b9b2f2b52c639b35084a600c2e7e34dc6e0e660f5c1271b29f458c43ff8475ad914a80ffff33ffa05fcd2dfc318a6029171b785a47034038f315ec840bf44832debe3830dac5b9b9ff85037bcd1fb780ffff33ffa005844d82d8672c8de13457db91a9a5265e42cf5e97ebb3cc2f85de8b0a7d5952ff8402e7cb1e80ffff33ffa03eb49d76fb2907c1f3ac2f981f4933145c43fbaa0c974aef75048b737b2b7dbcff850090b2761080ffff33ffa0fb83e4f8b85df2e777510262b283ebf64f9c5da8c96b368e3c044ebc7f0102c3ff8557411ed20180ffff33ffa0225735c13783e96059ebce821be51ea7c1e58bdedb97f2af4c3f7a7df02f8d22ff8512d9c02e0880ffff33ffa007431551f6b189c6828357eb64157e7ebd919236a5a564feb6aeb291bf877f1eff8500ba08a90980ffff33ffa0727aaeea1bcacdeca70b3fd4563321d700c7efe5403750e6fb28382c49791fceff8500fe09f20180ffff33ffa04c4d8d74a82d3b719d2417dc9465a4af748fddf56538d144c673feaf0e45cbb3ff85087545f77c80ffff33ffa0a8da4bb01c32b9cb64e3c785550e2c42c41819633e4ba8b3f794d25e134515a9ff8500e442543080ffff33ffa06a2ee17d0e72ed1208a7209063ee41ee38cd374b756278e601cba7f319a4494cff8600843a2cc36780ffff33ffa0ba319fb06fb5d77eb24071f3b403752a5c567053949b4358e67fd5f0989c78faff8501020de33380ffff33ffa0835389cc287ea87229fce0136599b6ab2c64888445915da3ba17db635e79a00cff8502786f960880ffff33ffa07b819930c5f5d41f02bc9fb4bce35d2d98eea1bda75a22d29cd72c8efcda6248ff8465af41c880ffff33ffa0c1f4a6f85855ed5d8b3e83854ee9ea89e178bab1dc4b738212c516a74bf90cb0ff84050ff03b80ffff33ffa092860712ffc3b82c3389520adf55be872adbe091ab6d1da2c1ef94be03319279ff8406afb4ef80ffff33ffa0ac3b0df0c1e214c6bff3a0a70802d0a03c3afa295185f52928c8249372768e9cff85010298fca280ffff33ffa0a224f3b804eca462df749eb12cf3b1443ed0f3ebbdeac7c2b4a3951497714bfdff85013063f48180ffff33ffa0f821b07e32bca885e996f288503f52558ce063bab6ee38db63aeb7e3506bcdbdff85008d9fafb780ffff33ffa0fd42aa18c5930cba0e756fbcdfaafedc8f2fe2a98988f504d329ca6e8b4856a0ff8450a8b2db80ffff33ffa08ba744d8996fa206d9aca58f1fec537bebae6fcb6b04ee521c4993518bd10a89ff8523ec0611bf80ffff33ffa02eab634554bfb94f096ef821565b3724c1fe18fdc8c0c17d58d241e4cccb62faff85060583330180ffff33ffa09a54d41a8bd5da18f4d65d23bc63ba19382ab75e9989cfcd6ec1c325b5c24f05ff850360171b3d80ffff33ffa08540397874edbc4b9621c14ae28a78c759a028b77a5adafe2953b6bdea202317ff85025f9b303480ffff33ffa09a54d41a8bd5da18f4d65d23bc63ba19382ab75e9989cfcd6ec1c325b5c24f05ff85042397bcf780ffff33ffa0571c09192e0da7c29a06ad41ddfe4673cd96c1c4a7678fc009ef981f8df7d4e2ff8534e508d71880ffff33ffa0259121bd92536ed2bd8aedaca18629735c09e0251f33d56bf4ff17491ae4fcb2ff85013554f1fe80ffff33ffa0c0af4722f0822aa9229188e3dae9330b970a2426219d4c30d15ec60fe5e42a3bff8500f4fc4e6180ffff33ffa0add18bb7e6f211997fac9bf53b09e3984940c0466cfeffe76989c1a28781c184ff84065c2fdd80ffff33ffa08c9ef4e8e497668e7e2756d1adadd40fe3d35a15c6a8c9dd87e1da02c4353f45ff850920859bf080ffff33ffa0a2991a893b06353ecd1a45885bc855654760abd1294e7d6817748c30aa1a7807ff850d6811e04c80ffff33ffa09a1c5abaf47df91849df748a24db0221cdc19b8c0899ebb81835eb17d44c1cddff840a937f4980ffff33ffa0a7b5704816b4dc68a9a6a25a3a06213a2dfcc2202eca76ef6add2812a76f095cff85027ed59b1e80ffff33ffa04c44b23d725c3dadb5e5a0a2e8e1581680052bd03b302a563b477e4fffb383a4ff85030dd613ab80ffff33ffa09f4dc9053934e4792c23403c81e83e491e6be6b97691852cd7a6d81ea2adc070ff841970113780ffff33ffa0c42cff84f7747e6eb0e6865f420ff482dae6ee20addcd9ab25d08d56e4faf264ff8600c161e56f6880ffff33ffa0df3319fed9113108d15ead1ef4f22602f7edd5f51ac6fa63f0b251f092c64351ff851e553e3ba580ffff33ffa0c880d7d61499f4510083a8133d518cf86e3606a3205494e840032dc37f54b904ff840b11a8af80ffff33ffa08f225b4ce31f9edaa4a8e4d2719d1505cebaa4128f78175ce4fc5b20e86fa121ff8423570d8a80ffff33ffa02f7c1ab47fae082970c6d74c5033f47f88eac8402530fc53c4c91960e15f3ffcff8403740cf280ffff33ffa03d41a6f843d84d0c5101e608d9952f083f4aa58dee8d73565dc57bc54cbcb7a9ff84761e761b80ffff33ffa0c9f8eb9390d6d6da4b9c9592bd2a7fdf679461ee9d7f5099b63fb68c60f15144ff845b3c875d80ffff33ffa04be4be52af868d5987c50857299b970752ea34688c58d07b1168d844838bc00dff843fbf1ab780ffff33ffa0eab196a10beb5887f77ee5f680ac2c5ef02524717a82fe9f25b072e3641d0de8ff840b93288f80ffff33ffa087a9fac9fb214fccab34af56b74ec1d4fe0e5cf12fdd0579254e6d27851788fbff84030c4e6080ffff33ffa09a54d41a8bd5da18f4d65d23bc63ba19382ab75e9989cfcd6ec1c325b5c24f05ff8502e57dfb8380ffff33ffa008aa3ca24e31dd1f74bfda9d4d04837ef7c35bbaebba89336d2ac643ab624e4bff8501f1969aa480ffff33ffa06117c723dc5fbbb471345ebf50f7d53d71b92e225594536420f2a7b48e830ddbff8503d161545a80ffff33ffa0a4556415391a458fee8673c0d6cea9e7e03f3b7a119792fc52c8af20286f7e37ff840238bdbd80ffff33ffa0c8075d2389cd611285a90668da795c1b437650449fbd6ae37c1a7b1f3413a24eff8502cb106ed480ffff33ffa0ef4dfc9df3a638fafcfe2d5c24293f9971e31468bad1a2bae049f5262e19259fff85020724a25e80ffff33ffa08e9a1e193c2569583c5771c3de481bf3116a996d1eb596a2876c24a323efa0abff840c82386980ffff33ffa019ff59a17591a76c645cf5e8bfeb9c084efa6e9362a15779480058858f26f6ebff85012de0e3cc80ffff33ffa00a4f2bb179843d10881738abbf4cccff48e90236b23be1327762eeb2a65106a8ff8505fce9aaee80ffff33ffa0c0cbdbd4e9e2b6bd0e37c8708fc14d8800fdca934cdd465666053623df1e5d98ff8416ab257580ffff33ffa06fabff462d2dc566a5c57544c5bd4abc9b3980a0b91d9f61dca389e25e47d2faff85039ab937a180ffff33ffa01cb6944c280c2d820f6d8d8aa78a08ff2f200c28151ee6de33c348fba7676750ff8415b13a2a80ffff33ffa0b536f179ba7bad340fdfe435bea0d8838c4aedb860d88943db097ec8ff95a8f9ff8500b619179380ffff33ffa06ce2f686e19c1b1813064f6e6cad1ef8e7a3e55937db57b485da70c43069761dff8400dea4b280ffff33ffa06eb57549579b8843c30e7e285fbd0449c429b788482e645d3765b293c3d2561aff844ba0536580ffff33ffa0ef254c3931ebaa7c89e948dfb2821ef28cfde48ed56dcac424ad2c73ae657c6dff8403d93afd80ffff33ffa0f12bbad74f8d21fafca86e8143dc64fe9a0b768cd0f07516cea8a502fda6bc34ff851a9123e65e80ffff33ffa0668e6aa6dbfa455b6c31155aa58dc027c231f3d11eec053b4eef890964e1a68bff850112426f6e80ffff33ffa09b60727779a57a2823b19b196ea5648a42b2ae859b84e032a60b65135df8a209ff85019a2a3e5880ffff33ffa0a91d3bd34d2f0e2f6922b404d6d99021d836c06de8815e42fb6a2036a7a5ff12ff85033e033f5780ffff33ffa06db168b04c2febdaa8642dc5afd3622f8034bd1800b73903d91ede04952950dbff850405160a2980ffff33ffa0f9dc1119815024dc92202ad5428f52d33d6368eab3dd7dc89e7ea2bd7a7b4c62ff850e14abcfee80ffff33ffa056b113c73949c772d7383665d43fbb3460bea5aa956dfa372daf884917eaa591ff850f76a4b59280ffff33ffa0f7a6c5a31019786dea02042466e26926fb2211ceed32d7aa8017bee6a203e79aff850166ea654180ffff33ffa05b4a4bad6f84f7052577a19633d1e4c4db2ffd890c19b1d3773925a863f8b409ff8432508a9880ffff33ffa0f5ec12e45ce7398e5d5e43034b9105a7c4dd8cfb5a6afd89208ac0aa81cf4530ff850125998ad280ffff33ffa03a538b796557747031f5274917535d41b4d01c78ed75240aaa86743806f1f172ff845f85c21880ffff33ffa0ef4dfc9df3a638fafcfe2d5c24293f9971e31468bad1a2bae049f5262e19259fff8501ed3794db80ffff33ffa0f914aa6c2c499af6140f50f905b44506e34a56c4ae9fc8a971168b4de3999400ff8454ba281a80ffff33ffa09340c5b54a00a7f4763509984af2fcc63553e33b166bec7572b2722da1d9dbe9ff8502a105720680ffff33ffa0e330398b73174f3e9726f83a55181c8fab3dd3772bf8fa4f1da85b4f62968713ff8400eafff980ffff33ffa08ff8c559917e89f7f9962521fea6612dc026c284cd25995b46a866480d46d719ff8501d8eaafef80ffff33ffa002491276ba0c8867706d8a7971d8fbbc7020b6f2739036e68b2e6c9056c24022ff8444251f8880ffff33ffa0cd2a1003bdffe8b5ff1e553bacb15c62142d1395670d8acc5e4469af2c2ce1a6ff8500c7ba57be80ffff33ffa0ebb73b2c4c67119a8504e2e55b2e54ee1d6689f50ede1c906a6e6819c1ff7481ff8400b5cdae80ffff33ffa0e88fd930adee40d00edea90b12ec4d80f343cadb3ccc6dad683477c7d36f2e24ff840949556a80ffff33ffa0c1db4cb8cd712c6e0e3a14640fc061dea53788640ddd8b7277ac4cb299a0a8f8ff8442b2db6280ffff33ffa023baac01865f4a3e3d3e9ad65964808029e39e8b10691366b28709bab82aedf4ff8503dd61c33780ffff33ffa05de9e05253856f6164624ce34b8c3678a9fddba79efb8d63d3dedaa23f97e869ff850278509bc180ffff33ffa03a64028e6d2d52a56e763414e479a8fbc863f3138403fe8d8ba1e6d3b4191033ff843350c14e80ffff33ffa0571c09192e0da7c29a06ad41ddfe4673cd96c1c4a7678fc009ef981f8df7d4e2ff8556a6e982a680ffff33ffa0baed4068d6047c7a94db8312919bef99b4b041dc43c9d4be5015869c86b58c87ff850747ed522780ffff33ffa0b6cfe4e7bb15b08d50224ac60ce7845e6395050961b0180c6b4255ddc8be6f7eff84055d8e2b80ffff33ffa0243a2cb84d671674275d69374be459b0d5092646c2c57e2781afcb1864e17565ff85068ff6344e80ffff33ffa064aec1e7f07951f3e73f71c2392cc255caacb3fc1bd0d68f9399d0e0a443c8beff841aa5b4c280ffff33ffa0f58efa6d3b8b29d48454b6bfb8e0cb07d10017e855579a47b0e4a6043c790367ff84306e6b5980ffff33ffa057fbf071ed2e40f321752aac1ecbb7f71928a0316f64e1ec8bda8e6028f6484aff8501b055802c80ffff33ffa030b75bace37b5c534eabf78098cad9a52010d55d46c022a34b9ca91a15273f56ff8500c747906c80ffff33ffa0546d06c25450c77f85a0a6cf7e48dcd83b4c6ab56d2ec587fefa1d960fad0fbeff8403c59d9780ffff33ffa0e125e4d0d674c79ec7d98b9c232872628026de6aa328d1c44b60fe2bd1067469ff850191bcef3680ffff33ffa09842db5ae3d7df3c68f868e54c96b6defc99017181ce361995da5f699ad7457eff844131e4a780ffff33ffa0f9692cbfb9081946539df261ebb590c81ba36d2b1b230846846eb9b908641939ff8500ae32f3d880ffff33ffa09c90d925cb78a3c98879cc8a8f6743b4555490ab5f80472ba753a008e6a9aad9ff840096c8fc80ffff33ffa0b2f1ab773bd1d144fea2c21008f4704deacfa1fc6d905acfdbf0d474640edc9fff8500cba1a4dd80ffff33ffa002eb76e1847f31b2bea96051d4f06811fe00f45e2d7bdc84612ba09bb967743bff845bc2f6c280ffff33ffa0fa5867e9089d933c215f9556f799fee5a6bfb76ea0be0f64bbbdabd742324051ff8405a5580f80ffff33ffa0214998d57d8ff7f2fa9f6e867f6a22033e54dca6d65a09aaca680e03398b0988ff8500b801042480ffff33ffa01d3701aa4dc30982218ddae7030d59100265e4d40caad4c8f3bc29be87dd2e74ff85039286d2ba80ffff33ffa0ee154ef6794798c6de5a1b17cced3dc86bb0b0a271ec82ff776da7e3f62d4d7eff850132a65bee80ffff33ffa01fe7660049aef154cbc7522ea7946c25339a3b851a401ce903785cda9a1d89a7ff850267519ef480ffff33ffa01c2b9faf9652a0e98e22f35ed4ca26598cdde4818df99a0eecd1547a6e1fdfc2ff85469ada42c080ffff33ffa0d09139455465470c36199400a6816340422bf7508c346be5c9ca1fe4d35bc727ff8600bacad48eb280ffff33ffa0f4073d8c2c761a2c52832aa42bed0c748337d8a93fd0c7b599909a6c29e52971ff850b5e0d4f7d80ffff33ffa0b6868e9b8998c3d941facba87773b02a9275dfcbaf55e410f48ff312f02e82b5ff850b1a7ea59080ffff33ffa099937e01ac7c03ea98f4e4dc674501614a978b79e91825fe9e0b42b75ffa00e5ff85038e1d471280ffff33ffa0ea7f1ca91d7085da54315c80db7a5f0eb4e2b9ab924cc79201a1c3e87456d4fdff845a1727cf80ffff33ffa00f8a37ebf07bdf012af440f5eb10f89dac12f710322b3d1ab7425330c73a4b7dff8500818fdadc80ffff33ffa0e6d54d85412e121b11ae7c3723e50b9c649a84eafa8209d25bec4d54723d13d1ff8500a253add880ffff33ffa033129c8f7bf12e7ed45e2171e1570d4209cd34dae2a45b43c1b0488bde488b01ff8502ebdc620280ffff33ffa0e88c0c3106f1110cc8b925576e5f83839f05838fd6e18d9bf1f07a08e952b157ff85059ead441980ffff33ffa08805b5a1cdeb8923cd13e2c5b4712a3707a2667be6633f81b03ec0cb13fcdb6dff846bcbd1a980ffff33ffa0738fdc1ea404f109bbd2db29ed08e66c6cf39bb11ec4c8647dcce0788210de80ff850089411cea80ffff33ffa078a2196910b2e6fd5a87ec5dae59fff5a597066d09d58c6a9550e5d487eb590dff85015d4d87c780ffff33ffa0259b6a7b78714f13953ed22c527cee0fbf9176dde50b69ef731ac1330e4c41ebff85010794c6b880ffff33ffa07f4ac208a39abdff8ef9caf7317d978af66ccb1bdb58ea63436797cca6b3d0ceff8504569b691f80ffff33ffa0a6dcc3244fd48d18788d073075545e93db510b5ea2cd3fac8318cc39b8f6cef0ff8501414f6a9680ffff33ffa0b4a9c4a0de545f06ede9f5bc529af3a29d130446af0a800580023ab1f69aee8eff840084afad80ffff33ffa09c68bc374d6d91edc235eef7e5a7395dbffd18bdb4931321bfa23e2fe1f6c989ff8474e5c1bd80ffff33ffa0204617dd4e85f18fd76a7b9767ad1a6b192fbb6043acf247e5d5ef2da9dae8a9ff85010252c4a680ffff33ffa0c011bd0d46aa0c04671fe3ddb85b0cac75946334757d32993ff175eb7891ffcbff85025cd981d580ffff33ffa01224d6fe7359955114fc8b6956a97869d10076ac814b7bc262a5016bc9a22949ff85246b864a3180ffff33ffa0ea7f1ca91d7085da54315c80db7a5f0eb4e2b9ab924cc79201a1c3e87456d4fdff8467f8147c80ffff33ffa079ed01b17ab9e40f423c4331b8579431899dda7b853ba3fe636b35d28486599dff85036846981180ffff33ffa08abfa77d668671a122e04adc28e4f40769863ee8743f7038c3a94c43b7b174d6ff8455335de980ffff33ffa0ee4ba732f2d89d881c230a9479b0f4b82b1db7bac59fc07f8070651fa2453539ff8502619d42b180ffff33ffa058a784eb4d75c4b19cc0d07a64b7375b2140e7a1778d1f41405c4505ac4e9b5fff84067f11e180ffff33ffa0dd47b701d55829289e883649bdba27c12d17430aaf90e0f22bb497887cdbf7e1ff8479e2941780ffff33ffa00ed827b1838b32d815c39f3f7d9e89d00d6a2570ca50d13713a98bf10afc9a28ff8502b714a7fd80ffff33ffa013cefc151e12c8d822411127550934a262d94c4b924e17baea7071a8e2ee12b5ff84105133fe80ffff33ffa028688698f438ca515b9c45804eff5b0b074424e8d6928a8b1de950c3e9130913ff85022e576ea680ffff33ffa02f04e46ca314e4267c644d50c080d339ee83553909871ce3f77b45a8f4d792dfff840d5a752d80ffff33ffa0bebf28749f2dc9805501b287ecfcc5eb82987a2ea8b8dd8ccc4cd53a4245c74dff85045ce380fd80ffff33ffa055fb8e3f76f28d046bb4845558723b8f4406ffcb29c720c4a28736645aee6290ff8501d1cbec0480ffff33ffa041477dc2c70837d5cffe1685b0e89d1b24f4a9e8b9254344e5a603bce44bd2eeff8506ed58e23280ffff33ffa0f6e1906ed753659ad898a5c43e53ccb5f503788219913f641dc787eedcb84366ff8504692cd30280ffff33ffa030bcd27a48b944ed834debcfebbc916d1fe8f3b3c5dcbcd0831ca2beffa0927cff8504e824371b80ffff33ffa0ef4dfc9df3a638fafcfe2d5c24293f9971e31468bad1a2bae049f5262e19259fff85020e3c7f8180ffff33ffa0e6830e9f9c8434a09c3c7c88075510444569e918f098f44afdbfa28d68ba13fbff85030d82cb6c80ffff33ffa0a6b9832a6f5f41bb977ab606b3a9ace000543983d76ad5618977bde49f30078cff85070edf543180ffff33ffa0709a1af3779368d37d75fc13f9d73058a3be7600bc556117497e5f5c895555ffff8504018993a880ffff33ffa0b25647d484d574e291b842cc4f613f673b23f3c32a2d1d84bc200f0feb6a7bcfff8503aa8b927180ffff33ffa0dbe31e7706e8bf5f56864c515a0f4963bed4c07b51b93f7a7296230e226cc26aff850465d1d21180ffff33ffa0533da8afc4de251887b9e8cb889f55353cd1ef5daed363b8ba353584e49da247ff8500a9b62d9780ffff33ffa0ace89aa8a47d13ebd8682442bc6d6d327e3259ab851ad960a1d808d20dd8a4c4ff8500c5c52dd080ffff33ffa0f85da8b8d3e9d342f3d4768973a3e494c640a91f6ca5b193130485868a5b8ec0ff8420a16cf980ffff33ffa02f732ccbf962a297f4ed8ff1ccf8b9f862c3dc8060fcede4be213ff24a98835dff850ace25a02b80ffff33ffa096bbedb7b4c0a2fc1cbbf4a9ec5a90f49e20ce867f6b0f18449db2927b993088ff850b1c6586f980ffff33ffa0a5915b4833f2ba0f3445d4a297e064836892b22c869bab8d8eb5bd9509c3d463ff847b29cf7e80ffff3cffa06e7dfdb670032adefb0d81afdbc7d6f649ee60424078ca0e9a2ba6dae182a3118080ff808080ffffa0f6395d33921109107b444062acf76277d671d77785ea7e1b2105fbb1548dde28ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0abfb70ff83a1305929f6b2a011f5bfa721d8d5d75ca752c072197bf51e80558e4f6fd0045e3a552be2611ee3fa09e01dff018080ff8601777deac189ffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff808080ffffa0a445cf66d8574ad41970e41c7a16c6304492fba89762e86fda80e2eff9427c2fffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b34ce3f6a716400a042b53724fcf57c085c5d68570426d7167146d32ee0ad85bb93c6e8261006b51c93b71f6085c38a9ff018080ff86018bda38fb3fffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff808080ffffa045560b65265752770084cb3bfd4b466ec032ea21e4a55101fd642dc79d61dbe0ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b34ce3f6a716400a042b53724fcf57c085c5d68570426d7167146d32ee0ad85bb93c6e8261006b51c93b71f6085c38a9ff018080ff860161224d87c3ffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff808080ffffa0afbecabbe0b1e8269f74a274b5e5804c0e180438695c1e2688f17b0cb45a6b18ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0abfb70ff83a1305929f6b2a011f5bfa721d8d5d75ca752c072197bf51e80558e4f6fd0045e3a552be2611ee3fa09e01dff018080ff860154b3a62849ffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff808080ffffa07256cd796b25e098eeebe25599cec23d303bc2bd7b84bb33c18ef69be65c8e19ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0b34ce3f6a716400a042b53724fcf57c085c5d68570426d7167146d32ee0ad85bb93c6e8261006b51c93b71f6085c38a9ff018080ff86015141b4abfaffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff808080ffffa03946915ba84146cfcb225bf6b6a958af84490f5051f0e1eeebfce641b273b2e5ffff02ffff01ff02ffff01ff02ffff03ff0bffff01ff02ffff03ffff09ff05ffff1dff0bffff1effff0bff0bffff02ff06ffff04ff02ffff04ff17ff8080808080808080ffff01ff02ff17ff2f80ffff01ff088080ff0180ffff01ff04ffff04ff04ffff04ff05ffff04ffff02ff06ffff04ff02ffff04ff17ff80808080ff80808080ffff02ff17ff2f808080ff0180ffff04ffff01ff32ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff06ffff04ff02ffff04ff09ff80808080ffff02ff06ffff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080ffff04ffff01b0abfb70ff83a1305929f6b2a011f5bfa721d8d5d75ca752c072197bf51e80558e4f6fd0045e3a552be2611ee3fa09e01dff018080ff860197726a36a8ffff80ffff01ffff3dffa070a5700b8ab6fe157f835bf035ac1bcbb67fab3cf54c65dda52693fbb1c25e378080ff8080808080" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + + hexStr = "900cecb8f27d268c2ac73fe5b520db3813" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + + hexStr = "c059697066733a2f2f62616679626569687478796637737462356b78787473756d77326e6f34326766736871676a687837646d696e706776627468697433616a70336f792f5065706542656172732d25323028333437292e706e67" + encodedBytes, err = hex.DecodeString(hexStr) + assert.NoError(t, err) + length, err = SerializedLengthFromBytesTrusted(encodedBytes) + assert.NoError(t, err) + assert.Equal(t, len(encodedBytes), int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0x7f, 0x00, 0x00, 0x00}) + assert.NoError(t, err) + assert.Equal(t, 1, int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0x80, 0x00, 0x00, 0x00}) + assert.NoError(t, err) + assert.Equal(t, 1, int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0xff, 0x00, 0x00, 0x00}) + assert.NoError(t, err) + assert.Equal(t, 3, int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0xff, 0x01, 0xff, 0x80, 0x80, 0x00}) + assert.NoError(t, err) + assert.Equal(t, 5, int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0xff, 0x01, 0xff, 0xfe, 0x10, 0x80, 0x00}) + assert.NoError(t, err) + assert.Equal(t, 6, int(length)) + + length, err = SerializedLengthFromBytesTrusted([]byte{0x8f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) + assert.NoError(t, err) + assert.Equal(t, 16, int(length)) + +} + +func TestDecodeSize(t *testing.T) { + + length, err := decodeSize(bytes.NewReader([]byte{}), 0x80|0x20) + assert.NoError(t, err) + assert.Equal(t, 32, int(length)) + + length, err = decodeSize(bytes.NewReader([]byte{0xaa}), 0b11001111) + assert.NoError(t, err) + assert.Equal(t, 4010, int(length)) + + _, err = decodeSize(bytes.NewReader([]byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}), 0b11111110) + assert.Error(t, err, "bad encoding") + + _, err = decodeSize(bytes.NewReader([]byte{0x4, 0, 0, 0, 0}), 0b11111100) + assert.Error(t, err, "bad encoding") + + length, err = decodeSize(bytes.NewReader([]byte{0x3, 0xff, 0xff, 0xff, 0xff}), 0b11111100) + assert.NoError(t, err) + assert.Equal(t, 17179869183, int(length)) + + _, err = decodeSize(bytes.NewReader([]byte{0xff, 0xfe}), 0b11111100) + assert.Error(t, err, "bad encoding") + + _, err = decodeSize(bytes.NewReader([]byte{0x4, 0, 0, 0}), 0b11111100) + assert.Error(t, err, "bad encoding") +} diff --git a/pkg/types/proofofspace.go b/pkg/types/proofofspace.go index 9a6edda..0b89592 100644 --- a/pkg/types/proofofspace.go +++ b/pkg/types/proofofspace.go @@ -5,13 +5,12 @@ import ( ) // ProofOfSpace Proof of Space -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/proof_of_space.py#L20 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/proof_of_space.rs#L6 type ProofOfSpace struct { - Challenge Bytes32 `json:"challenge"` - PoolPublicKey mo.Option[G1Element] `json:"pool_public_key"` // Only one of these two should be present - PoolContractPuzzleHash mo.Option[Bytes32] `json:"pool_contract_puzzle_hash"` - PlotPublicKey G1Element `json:"plot_public_key"` - Size uint8 `json:"size"` - Proof Bytes `json:"proof"` + Challenge Bytes32 `json:"challenge" streamable:""` + PoolPublicKey mo.Option[G1Element] `json:"pool_public_key" streamable:""` // Only one of these two should be present + PoolContractPuzzleHash mo.Option[Bytes32] `json:"pool_contract_puzzle_hash" streamable:""` + PlotPublicKey G1Element `json:"plot_public_key" streamable:""` + Size uint8 `json:"size" streamable:""` + Proof Bytes `json:"proof" streamable:""` } diff --git a/pkg/types/slot.go b/pkg/types/slot.go new file mode 100644 index 0000000..1473cfc --- /dev/null +++ b/pkg/types/slot.go @@ -0,0 +1,42 @@ +package types + +import "github.com/samber/mo" + +// hhttps://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/slots.rs + +// ChallengeBlockInfo is a type of challenge_block_info +type ChallengeBlockInfo struct { + ProofOfSpace ProofOfSpace `json:"proof_of_space" streamable:""` + ChallengeChainSPVDF mo.Option[VDFInfo] `json:"challenge_chain_sp_vdf" streamable:""` + ChallengeChainSPSignature G2Element `json:"challenge_chain_sp_signature" streamable:""` + ChallengeChainIPVDF VDFInfo `json:"challenge_chain_ip_vdf" streamable:""` +} + +// ChallengeChainSubSlot is a type of challenge_chain_sub_slot +type ChallengeChainSubSlot struct { + ChallengeChainEndOfSlotVDF VDFInfo `json:"challenge_chain_end_of_slot_vdf" streamable:""` + InfusedChallengeChainSubSlotHash mo.Option[Bytes32] `json:"infused_challenge_chain_sub_slot_hash" streamable:""` + SubepochSummaryHash mo.Option[Bytes32] `json:"subepoch_summary_hash" streamable:""` + NewSubSlotIters mo.Option[uint64] `json:"new_sub_slot_iters" streamable:""` + NewDifficulty mo.Option[uint64] `json:"new_difficulty" streamable:""` +} + +// InfusedChallengeChainSubSlot is a type of infused_challenge_chain_sub_slot +type InfusedChallengeChainSubSlot struct { + InfusedChallengeChainEndOfSlotVDF VDFInfo `json:"infused_challenge_chain_end_of_slot_vdf" streamable:""` +} + +// RewardChainSubSlot is a type of reward_chain_sub_slot +type RewardChainSubSlot struct { + EndOfSlotVDF VDFInfo `json:"end_of_slot_vdf" streamable:""` + ChallengeChainSubSlotHash Bytes32 `json:"challenge_chain_sub_slot_hash" streamable:""` + InfusedChallengeChainSubSlotHash mo.Option[Bytes32] `json:"infused_challenge_chain_sub_slot_hash" streamable:""` + Deficit uint8 `json:"deficit" streamable:""` +} + +// SubSlotProofs is a type of sub_slot_proofs +type SubSlotProofs struct { + ChallengeChainSlotProof VDFProof `json:"challenge_chain_slot_proof" streamable:""` + InfusedChallengeChainSlotProof mo.Option[VDFProof] `json:"infused_challenge_chain_slot_proof" streamable:""` + RewardChainSlotProof VDFProof `json:"reward_chain_slot_proof" streamable:""` +} diff --git a/pkg/types/uint128.go b/pkg/types/uint128.go index 0383af3..2f7fd73 100644 --- a/pkg/types/uint128.go +++ b/pkg/types/uint128.go @@ -41,7 +41,8 @@ var Uint128Max = NewUint128(math.MaxUint64, math.MaxUint64) // A Uint128 is an unsigned 128-bit number. type Uint128 struct { - Lo, Hi uint64 + Lo uint64 `streamable:""` + Hi uint64 `streamable:""` } // IsZero returns true if u == 0. diff --git a/pkg/types/vdf.go b/pkg/types/vdf.go index f5706e4..a1762c4 100644 --- a/pkg/types/vdf.go +++ b/pkg/types/vdf.go @@ -1,19 +1,17 @@ package types // VDFInfo VDF Info -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/vdf.py#L49 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/vdf.rs#L7 type VDFInfo struct { - Challenge Bytes32 `json:"challenge"` - NumberOfIterations uint64 `json:"number_of_iterations"` - Output ClassgroupElement `json:"output"` + Challenge Bytes32 `json:"challenge" streamable:""` + NumberOfIterations uint64 `json:"number_of_iterations" streamable:""` + Output ClassgroupElement `json:"output" streamable:""` } // VDFProof VDF Proof -// https://github.com/Chia-Network/chia-blockchain/blob/main/chia/types/blockchain_format/vdf.py#L57 -// @TODO Streamable +// https://github.com/Chia-Network/chia_rs/blob/main/crates/chia-protocol/src/vdf.rs#L14 type VDFProof struct { - WitnessType uint8 `json:"witness_type"` - Witness Bytes `json:"witness"` - NormalizedToIdentity bool `json:"normalized_to_identity"` + WitnessType uint8 `json:"witness_type" streamable:""` + Witness Bytes `json:"witness" streamable:""` + NormalizedToIdentity bool `json:"normalized_to_identity" streamable:""` }