From 4852f56467ba7ad194386c7ebbddc90fb185d374 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 10 Nov 2022 10:08:53 +0100 Subject: [PATCH] add fat error encryption and decryption --- attributable_error_crypto.go | 141 ++++++++++ attributable_error_crypto_test.go | 410 ++++++++++++++++++++++++++++++ attributable_error_decrypt.go | 216 ++++++++++++++++ attributable_error_encrypt.go | 173 +++++++++++++ go.mod | 1 + go.sum | 14 + testdata/attributable_error.json | 25 ++ 7 files changed, 980 insertions(+) create mode 100644 attributable_error_crypto.go create mode 100644 attributable_error_crypto_test.go create mode 100644 attributable_error_decrypt.go create mode 100644 attributable_error_encrypt.go create mode 100644 testdata/attributable_error.json diff --git a/attributable_error_crypto.go b/attributable_error_crypto.go new file mode 100644 index 0000000..69e42a2 --- /dev/null +++ b/attributable_error_crypto.go @@ -0,0 +1,141 @@ +package sphinx + +import ( + "crypto/hmac" + "crypto/sha256" + "io" +) + +type payloadSource byte + +const ( + // payloadIntermediateNode is a marker to signal that this attributable + // error payload is originating from a node between the payer and the + // error source. + payloadIntermediateNode payloadSource = 0 + + // payloadErrorNode is a marker to signal that this attributable error + // payload is originating from the error source. + payloadErrorNode payloadSource = 1 +) + +// AttrErrorStructure contains the parameters that define the structure +// of the error message that is passed back. +type AttrErrorStructure struct { + // HopCount is the assumed maximum number of hops in the path. + HopCount int + + // FixedPayloadLen is the length of the payload data that each hop along + // the route can add. + FixedPayloadLen int +} + +func (o *AttrErrorStructure) maxHops() int { + return o.HopCount +} + +func (o *AttrErrorStructure) payloadDataLen() int { + return o.FixedPayloadLen +} + +// totalHmacs is the total number of hmacs that is present in the failure +// message. Every hop adds HopCount hmacs to the message, but as the error +// back-propagates, downstream hmacs can be pruned. This results in the number +// of hmacs for each hop decreasing by one for each step that we move away from +// the current node. +func (o *AttrErrorStructure) totalHmacs() int { + return (o.HopCount * (o.HopCount + 1)) / 2 +} + +// allHmacsLen is the total length in the bytes of all hmacs in the failure +// message. +func (o *AttrErrorStructure) allHmacsLen() int { + return o.totalHmacs() * sha256.Size +} + +// hmacsAndPayloadsLen is the total length in bytes of all hmacs and payloads +// together. +func (o *AttrErrorStructure) hmacsAndPayloadsLen() int { + return o.allHmacsLen() + o.allPayloadsLen() +} + +// allPayloadsLen is the total length in bytes of all payloads in the failure +// message. +func (o *AttrErrorStructure) allPayloadsLen() int { + return o.payloadLen() * o.HopCount +} + +// payloadLen is the size of the per-node payload. It consists of a 1-byte +// payload type followed by the payload data. +func (o *AttrErrorStructure) payloadLen() int { + return 1 + o.payloadDataLen() +} + +// message returns a slice containing the message in the given failure data +// block. The message is positioned at the beginning of the block. +func (o *AttrErrorStructure) message(data []byte) []byte { + return data[:len(data)-o.hmacsAndPayloadsLen()] +} + +// payloads returns a slice containing all payloads in the given failure +// data block. The payloads follow the message in the block. +func (o *AttrErrorStructure) payloads(data []byte) []byte { + dataLen := len(data) + + return data[dataLen-o.hmacsAndPayloadsLen() : dataLen-o.allHmacsLen()] +} + +// hmacs returns a slice containing all hmacs in the given failure data block. +// The hmacs are positioned at the end of the data block. +func (o *AttrErrorStructure) hmacs(data []byte) []byte { + return data[len(data)-o.allHmacsLen():] +} + +// calculateHmac calculates an hmac given a shared secret and a presumed +// position in the path. Position is expressed as the distance to the error +// source. The error source itself is at position 0. +func (o *AttrErrorStructure) calculateHmac(sharedSecret Hash256, + position int, message, payloads, hmacs []byte) []byte { + + umKey := generateKey("um", &sharedSecret) + hash := hmac.New(sha256.New, umKey[:]) + + // Include message. + _, _ = hash.Write(message) + + // Include payloads including our own. + _, _ = hash.Write(payloads[:(position+1)*o.payloadLen()]) + + // Include downstream hmacs. + writeDownstreamHmacs(position, o.maxHops(), hmacs, hash) + + return hash.Sum(nil) +} + +// writeDownstreamHmacs writes the hmacs of downstream nodes that are relevant +// for the given position to a writer instance. Position is expressed as the +// distance to the error source. The error source itself is at position 0. +func writeDownstreamHmacs(position, maxHops int, hmacs []byte, w io.Writer) { + // Track the index of the next hmac to write in a variable. The first + // maxHops slots are reserved for the hmacs of the current hop and can + // therefore be skipped. The first hmac to write is part of the block of + // hmacs that was written by the first downstream node. Which hmac + // exactly is determined by the assumed position of the current node. + var hmacIdx = maxHops + (maxHops - position - 1) + + // Iterate over all downstream nodes. + for j := 0; j < position; j++ { + _, _ = w.Write( + hmacs[hmacIdx*sha256.Size : (hmacIdx+1)*sha256.Size], + ) + + // Calculate the total number of hmacs in the block of the + // current downstream node. + blockSize := maxHops - j - 1 + + // Skip to the next block. The new hmac index will point to the + // hmac that corresponds to the next downstream node which is + // one step closer to the assumed error source. + hmacIdx += blockSize + } +} diff --git a/attributable_error_crypto_test.go b/attributable_error_crypto_test.go new file mode 100644 index 0000000..d34dd1f --- /dev/null +++ b/attributable_error_crypto_test.go @@ -0,0 +1,410 @@ +package sphinx + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "os" + "testing" + + "github.com/btcsuite/btcd/btcec/v2" + "github.com/stretchr/testify/require" +) + +var attributableErrorTestStructure = &AttrErrorStructure{ + HopCount: 27, + FixedPayloadLen: 8, +} + +// TestAttributableOnionFailure checks the ability of sender of payment to +// decode the obfuscated onion error. +func TestAttributableOnionFailure(t *testing.T) { + t.Parallel() + + // Create numHops random sphinx paymentPath. + sessionKey, paymentPath := generateRandomPath(t) + + // Reduce the error path on one node, in order to check that we are + // able to receive the error not only from last hop. + errorPath := paymentPath[:len(paymentPath)-1] + + failureData := bytes.Repeat([]byte{'A'}, minOnionErrorLength) + sharedSecrets, err := generateSharedSecrets(paymentPath, sessionKey) + require.NoError(t, err) + + // Emulate creation of the obfuscator on node where error have occurred. + obfuscator := NewOnionAttrErrorEncrypter( + sharedSecrets[len(errorPath)-1], attributableErrorTestStructure, + ) + + // Emulate the situation when last hop creates the onion failure + // message and send it back. + finalPayload := [8]byte{1} + obfuscatedData, err := obfuscator.EncryptError( + true, failureData, finalPayload[:], + ) + require.NoError(t, err) + payloads := [][]byte{finalPayload[:]} + + // Emulate that failure message is backward obfuscated on every hop. + for i := len(errorPath) - 2; i >= 0; i-- { + // Emulate creation of the obfuscator on forwarding node which + // propagates the onion failure. + obfuscator = NewOnionAttrErrorEncrypter( + sharedSecrets[i], attributableErrorTestStructure, + ) + + intermediatePayload := [8]byte{byte(100 + i)} + obfuscatedData, err = obfuscator.EncryptError( + false, obfuscatedData, intermediatePayload[:], + ) + require.NoError(t, err) + + payloads = append([][]byte{intermediatePayload[:]}, payloads...) + } + + // Emulate creation of the deobfuscator on the receiving onion error + // side. + deobfuscator := NewOnionAttrErrorDecrypter(&Circuit{ + SessionKey: sessionKey, + PaymentPath: paymentPath, + }, attributableErrorTestStructure) + + // Emulate that sender node receive the failure message and trying to + // unwrap it, by applying obfuscation and checking the hmac. + decryptedError, err := deobfuscator.DecryptError(obfuscatedData) + require.NoError(t, err) + + // We should understand the node from which error have been received. + require.Equal(t, + errorPath[len(errorPath)-1].SerializeCompressed(), + decryptedError.Sender.SerializeCompressed()) + + require.Equal(t, len(errorPath), decryptedError.SenderIdx) + + // Check that message have been properly de-obfuscated. + require.Equal(t, failureData, decryptedError.Message) + require.Equal(t, payloads, decryptedError.Payloads) +} + +// TestOnionFailureCorruption checks the ability of sender of payment to +// identify a node on the path that corrupted the failure message. +func TestOnionFailureCorruption(t *testing.T) { + t.Parallel() + + // Create numHops random sphinx paymentPath. + sessionKey, paymentPath := generateRandomPath(t) + + // Reduce the error path on one node, in order to check that we are + // able to receive the error not only from last hop. + errorPath := paymentPath[:len(paymentPath)-1] + + failureData := bytes.Repeat([]byte{'A'}, minOnionErrorLength) + sharedSecrets, err := generateSharedSecrets(paymentPath, sessionKey) + require.NoError(t, err) + + // Emulate creation of the obfuscator on node where error have occurred. + obfuscator := NewOnionAttrErrorEncrypter( + sharedSecrets[len(errorPath)-1], attributableErrorTestStructure, + ) + + // Emulate the situation when last hop creates the onion failure + // message and send it back. + payload := [8]byte{1} + obfuscatedData, err := obfuscator.EncryptError( + true, failureData, payload[:], + ) + require.NoError(t, err) + + // Emulate that failure message is backward obfuscated on every hop. + for i := len(errorPath) - 2; i >= 0; i-- { + // Emulate creation of the obfuscator on forwarding node which + // propagates the onion failure. + obfuscator = NewOnionAttrErrorEncrypter( + sharedSecrets[i], attributableErrorTestStructure, + ) + + payload := [8]byte{byte(100 + i)} + obfuscatedData, err = obfuscator.EncryptError( + false, obfuscatedData, payload[:], + ) + require.NoError(t, err) + + // Hop 1 (the second hop from the sender pov) is corrupting the + // failure message. + if i == 1 { + obfuscatedData[0] ^= 255 + } + } + + // Emulate creation of the deobfuscator on the receiving onion error + // side. + deobfuscator := NewOnionAttrErrorDecrypter(&Circuit{ + SessionKey: sessionKey, + PaymentPath: paymentPath, + }, attributableErrorTestStructure) + + // Emulate that sender node receive the failure message and trying to + // unwrap it, by applying obfuscation and checking the hmac. + decryptedError, err := deobfuscator.DecryptError(obfuscatedData) + require.NoError(t, err) + + // Assert that the second hop is correctly identified as the error + // source. + require.Equal(t, 2, decryptedError.SenderIdx) + require.Nil(t, decryptedError.Message) +} + +type specHop struct { + SharedSecret string `json:"sharedSecret"` + EncryptedMessage string `json:"encryptedMessage"` +} + +type specVector struct { + EncodedFailureMessage string `json:"encodedFailureMessage"` + + Hops []specHop `json:"hops"` +} + +// TestOnionFailureSpecVector checks that onion error corresponds to the +// specification. +func TestAttributableFailureSpecVector(t *testing.T) { + t.Parallel() + + vectorBytes, err := os.ReadFile("testdata/attributable_error.json") + require.NoError(t, err) + + var vector specVector + require.NoError(t, json.Unmarshal(vectorBytes, &vector)) + + failureData, err := hex.DecodeString(vector.EncodedFailureMessage) + require.NoError(t, err) + + paymentPath, err := getSpecPubKeys() + require.NoError(t, err) + + sessionKey, err := getSpecSessionKey() + require.NoError(t, err) + + var obfuscatedData []byte + sharedSecrets, err := generateSharedSecrets(paymentPath, sessionKey) + require.NoError(t, err) + + for i, test := range vector.Hops { + // Decode the shared secret and check that it matchs with + // specification. + expectedSharedSecret, err := hex.DecodeString(test.SharedSecret) + require.NoError(t, err) + + obfuscator := NewOnionAttrErrorEncrypter( + sharedSecrets[len(sharedSecrets)-1-i], + attributableErrorTestStructure, + ) + + require.Equal( + t, expectedSharedSecret, obfuscator.sharedSecret[:], + ) + + payload := [8]byte{0, 0, 0, 0, 0, 0, 0, byte(i + 1)} + + if i == 0 { + // Emulate the situation when last hop creates the onion + // failure message and send it back. + obfuscatedData, err = obfuscator.EncryptError( + true, failureData, payload[:], + ) + require.NoError(t, err) + } else { + // Emulate the situation when forward node obfuscates + // the onion failure. + obfuscatedData, err = obfuscator.EncryptError( + false, obfuscatedData, payload[:], + ) + require.NoError(t, err) + } + + // Decode the obfuscated data and check that it matches the + // specification. + expectedEncryptErrorData, err := hex.DecodeString( + test.EncryptedMessage, + ) + require.NoError(t, err) + require.Equal(t, expectedEncryptErrorData, obfuscatedData) + } + + deobfuscator := NewOnionAttrErrorDecrypter(&Circuit{ + SessionKey: sessionKey, + PaymentPath: paymentPath, + }, attributableErrorTestStructure) + + // Emulate that sender node receives the failure message and trying to + // unwrap it, by applying obfuscation and checking the hmac. + decryptedError, err := deobfuscator.DecryptError(obfuscatedData) + require.NoError(t, err) + + // Check that message have been properly de-obfuscated. + require.Equal(t, decryptedError.Message, failureData) + + // We should understand the node from which error have been received. + require.Equal(t, + decryptedError.Sender.SerializeCompressed(), + paymentPath[len(paymentPath)-1].SerializeCompressed(), + ) + + require.Equal(t, len(paymentPath), decryptedError.SenderIdx) +} + +// TestAttributableOnionFailureZeroesMessage checks that a garbage failure is +// attributed to the first hop. +func TestAttributableOnionFailureZeroesMessage(t *testing.T) { + t.Parallel() + + // Create numHops random sphinx paymentPath. + sessionKey, paymentPath := generateRandomPath(t) + + // Emulate creation of the deobfuscator on the receiving onion error + // side. + deobfuscator := NewOnionAttrErrorDecrypter(&Circuit{ + SessionKey: sessionKey, + PaymentPath: paymentPath, + }, attributableErrorTestStructure) + + // Emulate that sender node receive the failure message and trying to + // unwrap it, by applying obfuscation and checking the hmac. + obfuscatedData := make([]byte, 20000) + + decryptedError, err := deobfuscator.DecryptError(obfuscatedData) + require.NoError(t, err) + + require.Equal(t, 1, decryptedError.SenderIdx) +} + +// TestAttributableOnionFailureShortMessage checks that too short failure is +// attributed to the first hop. +func TestAttributableOnionFailureShortMessage(t *testing.T) { + t.Parallel() + + // Create numHops random sphinx paymentPath. + sessionKey, paymentPath := generateRandomPath(t) + + // Emulate creation of the deobfuscator on the receiving onion error + // side. + deobfuscator := NewOnionAttrErrorDecrypter(&Circuit{ + SessionKey: sessionKey, + PaymentPath: paymentPath, + }, attributableErrorTestStructure) + + // Emulate that sender node receive the failure message and trying to + // unwrap it, by applying obfuscation and checking the hmac. + obfuscatedData := make([]byte, deobfuscator.hmacsAndPayloadsLen()-1) + + decryptedError, err := deobfuscator.DecryptError(obfuscatedData) + require.NoError(t, err) + + require.Equal(t, 1, decryptedError.SenderIdx) +} + +func generateRandomPath(t *testing.T) (*btcec.PrivateKey, []*btcec.PublicKey) { + paymentPath := make([]*btcec.PublicKey, 5) + for i := 0; i < len(paymentPath); i++ { + privKey, err := btcec.NewPrivateKey() + require.NoError(t, err) + + paymentPath[i] = privKey.PubKey() + } + + sessionKey, _ := btcec.PrivKeyFromBytes(bytes.Repeat([]byte{'A'}, 32)) + + return sessionKey, paymentPath +} + +func generateHashList(values ...int) []byte { + var b bytes.Buffer + for _, v := range values { + hash := [32]byte{byte(v)} + b.Write(hash[:]) + } + + return b.Bytes() +} + +const testMaxHops = 4 + +// Generate a list of 4+3+2+1 = 10 unique hmacs. The length of this list is +// fixed for the chosen maxHops. +func createTestHmacs() []byte { + return generateHashList( + 11, 12, 13, 14, + 21, 22, 23, + 31, 32, + 41, + ) +} + +func TestWriteDownstreamHmacs(t *testing.T) { + require := require.New(t) + + hmacs := createTestHmacs() + + test := func(position int, expectedValues []int) { + var b bytes.Buffer + writeDownstreamHmacs(position, testMaxHops, hmacs, &b) + + expectedHashes := generateHashList(expectedValues...) + require.Equal(expectedHashes, b.Bytes()) + } + + // Assuming the current node is in the position furthest away from the + // error source, we expect three downstream hmacs to be relevant. + test(3, []int{21, 31, 41}) + + // Assuming the current node is in positions closer to the error source, + // fewer hmacs become relevant. + test(2, []int{22, 32}) + test(1, []int{23}) + test(0, []int{}) +} + +func TestShiftHmacsRight(t *testing.T) { + require := require.New(t) + + hmacs := createTestHmacs() + shiftHmacsRight(testMaxHops, hmacs) + + expectedHmacs := generateHashList( + // Previous values are zeroed out. + 0, 0, 0, 0, + + // Previous first node hmacs minus the hmac representing the + // position farthest away from the error source. + 12, 13, 14, + + // And so on for the other nodes. + 22, 23, + 32, + ) + + require.Equal(expectedHmacs, hmacs) +} + +func TestShiftHmacsLeft(t *testing.T) { + require := require.New(t) + + hmacs := createTestHmacs() + shiftHmacsLeft(testMaxHops, hmacs) + + expectedHmacs := generateHashList( + // The hmacs of the second hop now become the first hop hmacs. + // The slot corresponding to the position farthest away from the + // error source remains empty. Because we are shifting, this can + // never be the position of the first hop. + 0, 21, 22, 23, + + // Continue this same scheme for the downstream hops. + 0, 31, 32, + 0, 41, + 0, + ) + + require.Equal(expectedHmacs, hmacs) +} diff --git a/attributable_error_decrypt.go b/attributable_error_decrypt.go new file mode 100644 index 0000000..f49454e --- /dev/null +++ b/attributable_error_decrypt.go @@ -0,0 +1,216 @@ +package sphinx + +import ( + "bytes" + "crypto/sha256" + "errors" + "fmt" +) + +// DecryptedAttrError contains the decrypted attributable error message +// and its sender. +type DecryptedAttrError struct { + DecryptedError + + // Payloads is an array of data blocks reported by each node on the + // (error) path. + Payloads [][]byte +} + +// OnionAttrErrorDecrypter is a struct that's used to decrypt +// attributable onion errors in response to failed HTLC routing attempts +// according to BOLT#4. +type OnionAttrErrorDecrypter struct { + AttrErrorStructure + + circuit *Circuit +} + +// NewOnionAttrErrorDecrypter creates new instance of an attributable +// error onion decrypter. +func NewOnionAttrErrorDecrypter(circuit *Circuit, + structure *AttrErrorStructure) *OnionAttrErrorDecrypter { + + return &OnionAttrErrorDecrypter{ + AttrErrorStructure: *structure, + circuit: circuit, + } +} + +// DecryptError attempts to decrypt the passed encrypted error response. The +// onion failure is encrypted in backward manner, starting from the node where +// error have occurred. As a result, in order to decrypt the error we need get +// all shared secret and apply decryption in the reverse order. A structure is +// returned that contains the decrypted error message and information on the +// sender. +func (o *OnionAttrErrorDecrypter) DecryptError(encryptedData []byte) ( + *DecryptedAttrError, error) { + + // Ensure the error message length is enough to contain the payloads and + // hmacs blocks. Otherwise blame the first hop. + if len(encryptedData) < + minPaddedOnionErrorLength+o.hmacsAndPayloadsLen() { + + return &DecryptedAttrError{ + DecryptedError: DecryptedError{ + SenderIdx: 1, + Sender: o.circuit.PaymentPath[0], + }, + }, nil + } + + sharedSecrets, err := generateSharedSecrets( + o.circuit.PaymentPath, + o.circuit.SessionKey, + ) + if err != nil { + return nil, fmt.Errorf("error generating shared secret: "+ + "%w", err) + } + + var ( + sender int + msg []byte + dummySecret Hash256 + ) + copy(dummySecret[:], bytes.Repeat([]byte{1}, 32)) + + // We'll iterate a constant amount of hops to ensure that we don't give + // away an timing information pertaining to the position in the route + // that the error emanated from. + hopPayloads := make([][]byte, 0) + for i := 0; i < o.maxHops(); i++ { + var sharedSecret Hash256 + + // If we've already found the sender, then we'll use our dummy + // secret to continue decryption attempts to fill out the rest + // of the loop. Otherwise, we'll use the next shared secret in + // line. + if sender != 0 || i > len(sharedSecrets)-1 { + sharedSecret = dummySecret + } else { + sharedSecret = sharedSecrets[i] + } + + // With the shared secret, we'll now strip off a layer of + // encryption from the encrypted error payload. + encryptedData = onionEncrypt(&sharedSecret, encryptedData) + + message := o.message(encryptedData) + payloads := o.payloads(encryptedData) + hmacs := o.hmacs(encryptedData) + + position := o.maxHops() - i - 1 + expectedHmac := o.calculateHmac( + sharedSecret, position, message, payloads, hmacs, + ) + actualHmac := hmacs[i*sha256.Size : (i+1)*sha256.Size] + + // If the hmac does not match up, exit with a nil message but + // only after finishing the constant number of iterations. + if !bytes.Equal(actualHmac, expectedHmac) && sender == 0 { + sender = i + 1 + msg = nil + } + + // Extract the payload and exit with a nil message if it is + // invalid. + source, payload, err := o.extractPayload(payloads) + if sender == 0 { + if err != nil { + sender = i + 1 + msg = nil + } + + // Store data reported by this node. + hopPayloads = append(hopPayloads, payload) + + // If we are at the node that is the source of the + // error, we can now save the message in our return + // variable. + if source == payloadErrorNode { + sender = i + 1 + msg = message + } + } + + // Shift payloads and hmacs to the left to prepare for the next + // iteration. + o.shiftPayloadsLeft(payloads) + o.shiftHmacsLeft(hmacs) + } + + // If the sender index is still zero, all hmacs checked out but none of + // the payloads was a final payload. In this case we must be dealing + // with a max length route and a final hop that returned an intermediate + // payload. Blame the final hop. + if sender == 0 { + sender = o.maxHops() + msg = nil + } + + return &DecryptedAttrError{ + DecryptedError: DecryptedError{ + SenderIdx: sender, + Sender: o.circuit.PaymentPath[sender-1], + Message: msg, + }, + Payloads: hopPayloads, + }, nil +} + +func (o *OnionAttrErrorDecrypter) shiftHmacsLeft(hmacs []byte) { + shiftHmacsLeft(o.maxHops(), hmacs) +} + +func shiftHmacsLeft(maxHops int, hmacs []byte) { + // Work from left to right to avoid overwriting data that is still + // needed later on in the shift operation. + srcIdx := maxHops + destIdx := 0 + copyLen := maxHops - 1 + for i := 0; i < maxHops-1; i++ { + // Clear first hmac slot. This slot is for the position farthest + // away from the error source. Because we are shifting, this + // cannot be relevant. + copy(hmacs[destIdx*sha256.Size:], zeroHMAC[:]) + + // The hmacs of the downstream hop become the remaining hmacs + // for the current hop. + copy( + hmacs[(destIdx+1)*sha256.Size:], + hmacs[srcIdx*sha256.Size:(srcIdx+copyLen)*sha256.Size], + ) + + srcIdx += copyLen + destIdx += copyLen + 1 + copyLen-- + } + + // Clear the very last hmac slot. Because we just shifted, the most + // downstream hop can never be the error source. + copy(hmacs[destIdx*sha256.Size:], zeroHMAC[:]) +} + +func (o *OnionAttrErrorDecrypter) shiftPayloadsLeft(payloads []byte) { + copy(payloads, payloads[o.payloadLen():o.maxHops()*o.payloadLen()]) +} + +// extractPayload extracts the payload and payload origin information from the +// given byte slice. +func (o *OnionAttrErrorDecrypter) extractPayload(payloadBytes []byte) ( + payloadSource, []byte, error) { + + source := payloadSource(payloadBytes[0]) + + // Validate source indicator. + if source != payloadErrorNode && source != payloadIntermediateNode { + return 0, nil, errors.New("invalid payload source indicator") + } + + // Extract payload. + payload := make([]byte, o.payloadDataLen()) + copy(payload, payloadBytes[1:o.payloadLen()]) + + return source, payload, nil +} diff --git a/attributable_error_encrypt.go b/attributable_error_encrypt.go new file mode 100644 index 0000000..22e68d4 --- /dev/null +++ b/attributable_error_encrypt.go @@ -0,0 +1,173 @@ +package sphinx + +import ( + "crypto/sha256" + "fmt" +) + +// NewOnionAttrErrorEncrypter creates new instance of the onion +// encrypter backed by the passed shared secret. +func NewOnionAttrErrorEncrypter(sharedSecret Hash256, + structure *AttrErrorStructure) *OnionAttrErrorEncrypter { + + return &OnionAttrErrorEncrypter{ + AttrErrorStructure: *structure, + + sharedSecret: sharedSecret, + } +} + +// OnionAttrErrorEncrypter is a struct that's used to implement +// attributable onion error encryption as defined within BOLT0004. +type OnionAttrErrorEncrypter struct { + AttrErrorStructure + + sharedSecret Hash256 +} + +func (o *OnionAttrErrorEncrypter) shiftHmacsRight(hmacs []byte) { + shiftHmacsRight(o.maxHops(), hmacs) +} + +func shiftHmacsRight(maxHops int, hmacs []byte) { + totalHmacs := (maxHops * (maxHops + 1)) / 2 + + // Work from right to left to avoid overwriting data that is still + // needed. + srcIdx := totalHmacs - 2 + destIdx := totalHmacs - 1 + + // The variable copyLen contains the number of hmacs to copy for the + // current hop. + copyLen := 1 + for i := 0; i < maxHops-1; i++ { + // Shift the hmacs to the right for the current hop. The hmac + // corresponding to the assumed position that is farthest away + // from the error source is discarded. + copy( + hmacs[destIdx*sha256.Size:], + hmacs[srcIdx*sha256.Size:(srcIdx+copyLen)*sha256.Size], + ) + + // The number of hmacs to copy increases by one for each + // iteration. The further away from the error source, the more + // downstream hmacs exist that are relevant. + copyLen++ + + // Update indices backwards for the next iteration. + srcIdx -= copyLen + 1 + destIdx -= copyLen + } + + // Zero out the hmac slots corresponding to every possible position + // relative to the error source for the current hop. This is not + // strictly necessary as these slots are overwritten anyway, but we + // clear them for cleanliness. + for i := 0; i < maxHops; i++ { + copy(hmacs[i*sha256.Size:], zeroHMAC[:]) + } +} + +func (o *OnionAttrErrorEncrypter) shiftPayloadsRight(payloads []byte) { + copy(payloads[o.payloadLen():], payloads) +} + +// addHmacs updates the failure data with a series of hmacs corresponding to all +// possible positions in the path for the current node. +func (o *OnionAttrErrorEncrypter) addHmacs(data []byte) { + message := o.message(data) + payloads := o.payloads(data) + hmacs := o.hmacs(data) + + for i := 0; i < o.maxHops(); i++ { + position := o.maxHops() - i - 1 + hmac := o.calculateHmac( + o.sharedSecret, position, message, payloads, hmacs, + ) + + copy(hmacs[i*sha256.Size:], hmac) + } +} + +// EncryptError is used to make data obfuscation using the generated shared +// secret. +// +// In context of Lightning Network is either used by the nodes in order to make +// initial obfuscation with the creation of the hmac or by the forwarding nodes +// for backward failure obfuscation of the onion failure blob. By obfuscating +// the onion failure on every node in the path we are adding additional step of +// the security and barrier for malware nodes to retrieve valuable information. +// The reason for using onion obfuscation is to not give away to the nodes in +// the payment path the information about the exact failure and its origin. +func (o *OnionAttrErrorEncrypter) EncryptError(initial bool, + data []byte, payload []byte) ([]byte, error) { + + if len(payload) > o.payloadDataLen() { + return nil, fmt.Errorf("payload exceeds maximum length") + } + + if initial { + if len(data) < minPaddedOnionErrorLength { + return nil, fmt.Errorf( + "initial data size less than %v", + minPaddedOnionErrorLength, + ) + } + + data = o.initializePayload(data, payload) + } else { + if len(data) < + minPaddedOnionErrorLength+o.hmacsAndPayloadsLen() { + + return nil, fmt.Errorf( + "data size less than %v", + minPaddedOnionErrorLength+ + o.hmacsAndPayloadsLen(), + ) + } + + o.addIntermediatePayload(data, payload) + } + + // Update hmac block. + o.addHmacs(data) + + // Obfuscate. + return onionEncrypt(&o.sharedSecret, data), nil +} + +func (o *OnionAttrErrorEncrypter) initializePayload(message []byte, + payload []byte) []byte { + + // Add space for payloads and hmacs. + data := make([]byte, len(message)+o.hmacsAndPayloadsLen()) + copy(data, message) + + payloads := o.payloads(data) + + // Signal final hops in the payload. + addPayload(payloads, payloadErrorNode, payload) + + return data +} + +func (o *OnionAttrErrorEncrypter) addIntermediatePayload(data []byte, + payload []byte) { + + payloads := o.payloads(data) + hmacs := o.hmacs(data) + + // Shift hmacs and payloads to create space for the payload. + o.shiftPayloadsRight(payloads) + o.shiftHmacsRight(hmacs) + + // Signal intermediate hop in the payload. + addPayload(payloads, payloadIntermediateNode, payload) +} + +func addPayload(payloads []byte, source payloadSource, + payload []byte) { + + payloads[0] = byte(source) + copy(payloads[1:], payload) +} diff --git a/go.mod b/go.mod index d274362..f049b44 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f github.com/davecgh/go-spew v1.1.1 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 + github.com/stretchr/testify v1.8.1 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 ) diff --git a/go.sum b/go.sum index fe83050..449e1a6 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,7 @@ github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= @@ -53,6 +54,15 @@ github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= @@ -85,9 +95,13 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/testdata/attributable_error.json b/testdata/attributable_error.json new file mode 100644 index 0000000..1796032 --- /dev/null +++ b/testdata/attributable_error.json @@ -0,0 +1,25 @@ +{ + "encodedFailureMessage": "0140400f0000000000000064000c3500fd84d1fd012c80808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808002c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "hops": [ + { + "sharedSecret": "b5756b9b542727dbafc6765a49488b023a725d631af688fc031217e90770c328", + "encryptedMessage": "e88935bf7c9a374ba64fd9da3aa2a05e6cf9e52cfb1f72698fd33b74b9c79346284931ea3571af54de5df341304833b0825fb7e8817fd82a29c0803f0a0679a6a073c33a6fb8250090a3152eba3f11a85184fa87b67f1b0354d6f48e3b342e332a17b7710f342f342a87cf32eccdf0afc2160808d58abb5e5840d2c760c538e63a6f841970f97d2e6fe5b8739dc45e2f7f5f532f227bcc2988ab0f9cc6d3f12909cd5842c37bc8c7608475a5ebbe10626d5ecc1f3388ad5f645167b44a4d166f87863fe34918cea25c18059b4c4d9cb414b59f6bc50c1cea749c80c43e2344f5d23159122ed4ab9722503b212016470d9610b46c35dbeebaf2e342e09770b38392a803bc9d2e7c8d6d384ffcbeb74943fe3f64afb2a543a6683c7db3088441c531eeb4647518cb41992f8954f1269fb969630944928c2d2b45593731b5da0c4e70d0c84ad72f642fc26919927b347808bade4b1c321b08bc363f20745ba2f97f0ced2996a232f55ba28fe7dfa70a9ab0433a085388f25cce8d53de6a2fbd7546377d6ede9027ad173ba1f95767461a3689ef405ab608a21086165c64b02c1782b04a6dba2361a7784603069124e12f2f6dcb1ec7612a4fbf94c0e14631a2bef6190c3d5f35e0c4b32aa85201f449d830fd8f782ec758b0910428e3ec3ca1dba3b6c7d89f69e1ee1b9df3dfbbf6d361e1463886b38d52e8f43b73a3bd48c6f36f5897f514b93364a31d49d1d506340b1315883d425cb36f4ea553430d538fd6f3596d4afc518db2f317dd051abc0d4bfb0a7870c3db70f19fe78d6604bbf088fcb4613f54e67b038277fedcd9680eb97bdffc3be1ab2cbcbafd625b8a7ac34d8c190f98d3064ecd3b95b8895157c6a37f31ef4de094b2cb9dbf8ff1f419ba0ecacb1bb13df0253b826bec2ccca1e745dd3b3e7cc6277ce284d649e7b8285727735ff4ef6cca6c18e2714f4e2a1ac67b25213d3bb49763b3b94e7ebf72507b71fb2fe0329666477ee7cb7ebd6b88ad5add8b217188b1ca0fa13de1ec09cc674346875105be6e0e0d6c8928eb0df23c39a639e04e4aedf535c4e093f08b2c905a14f25c0c0fe47a5a1535ab9eae0d9d67bdd79de13a08d59ee05385c7ea4af1ad3248e61dd22f8990e9e99897d653dd7b1b1433a6d464ea9f74e377f2d8ce99ba7dbc753297644234d25ecb5bd528e2e2082824681299ac30c05354baaa9c3967d86d7c07736f87fc0f63e5036d47235d7ae12178ced3ae36ee5919c093a02579e4fc9edad2c446c656c790704bfc8e2c491a42500aa1d75c8d4921ce29b753f883e17c79b09ea324f1f32ddf1f3284cd70e847b09d90f6718c42e5c94484cc9cbb0df659d255630a3f5a27e7d5dd14fa6b974d1719aa98f01a20fb4b7b1c77b42d57fab3c724339d459ee4a1c6b5d3bd4e08624c786a257872acc9ad3ff62222f2265a658d9e2a007229a5293b66ec91c84c4b4407c228434bad8a815ca9b256c776bd2c9f92e2cf87a89ed786194104eba6b7973491f04d0b924c10e6fcff336d037b6e53fe763919da946a640960978994e8d0e5a2d555c9a897ce38a324c766fd01e9416acd91f18b4e7756c913d2e754de226592f367f2309f4e43378adef150392ee38af70f888c7bd802f2523bed7ef9fa12dcf5b9214c974c51563d5fe81c4f7e352c7235811b5fc117cb2bcbbe70cc67356e2b3a97adc7a8fe8f4755a2f93bef3926f57bbcff17956c4031a2ae8c88d57dd9235b49a0253e86a7f173d96907aa2e162c82f1626dd5c07188e5e01d79724a546bedb6ee8f1928aad2c789f82bdf6e514bc1cd503156c4696c7d42e1cc3e6972ea8f7620c6abf8aeada6a0f0ca43b104672fa7607a832c86dcdaea34e902a09deae803b3d36403e3ae591b00e5b9e9b66be3b77b29547efde4c1a1a53ad62d22340c59a4599490be8e94cd44f848d5f6aa7aebae870f4286568f4fb70f89ac11ac3385aeab64617f74000aef3378745efad4e48e241374b0d04630eed292713cacda6c3070ef079e4f492e26b249a060f50c2b97164e735fd72060a676d104fce869421604bf4088d52114ca255610f2e87494ff2f83642b108e26fa9952df3d6d0a211fb3aca11104081ba4372078cda10415fdac35f34ec4f0087ceb1395ce6609ad56e5b026bfef33270e45ca0c68faa663f05cdc2293306ea3a672ee58830b42dc52518d0a06c53df06d29fe4994693c86f8c5d4c070fef091e22478ea2a5685c383c9dc1cc6162d9617f4962925da640b1860df6c53fee5970d9f56a2529897f9f01bcbea135c943f279621b1dbd621c3d436288e1885b621ee382dd40548bea39228eb094167a0564390ef281325beb3efbed3b0b454b4302c032567e0b4aa8f35d6600a97cf446f8bca0480ba5ca1ae47d50e52d86cdf47cfa1be8cb39fcdc9f485a7687e4909c74bc801a33fc2cc5cf29ed746713ebc1a59e8bdc1e971666fbb5cdc0f9680a1ea0376736625a83f7599cebe7255c1198e69b24124f58875df8daafb6dd4792cbb7a3e03c361e4f79ee26aeaad79c6d9bde36c832d736e0617594c3278156ee1a2b72442b4c6e03935d7ec9f6e1386aa7b98cddaf4d16a567695eb82b8f2a4eaa3cef82bc85ab458648f21eec12bad795e58596b04acec3078fe954050e5e0d45fb01bb796eca589f8d83f3bdf27a4ad820d215b00806500884a0358f735be1284d4e132d7c316b18df8f256b0c86ece0d0f82b5a652ed3d707e6ebf0fee70dc9985ef8d50c1c2facd96ee21628221dd62ebf0038f9f84df9f836649a29a9c0fa3a8715a94aa0311af930aef6eeb358fc58affca20470f8ed4d04c8f8d8bd0a681188a472c2193e7cc5c5ee7c5271791fd19bafec7dc21dd4551d7cf5e76ba2d34389778392d865dab78b562ad446313a834416a8c537929be951599d6779ce37eaa567d13686306d707b0c7005844d522cb1c6a674f837fd484e34ede64af17fc983950e5886a1b4ef759ca53d9eed9d6d53de02089e248ab1a9af126d6bcd2e34f3f21fe3d429978efac0ae5663fce2cf2516891073ad2787d60c6fd2fcfd33b95e7f4b3c2df0d722b9f7453d54b3b0481d75ce0ca02128a9ba02428b89bc7ad030bc0f93eba6a9154bf620af1352d9b21099688a950e3ec28b8cb6658cc84a26721b60646792bdd43b05b14c408c4447d573066fc5952d3bcda01a7d6856374ed14118204b87384a265c0c2992be89b704fc1b9a593b6ec7b774cdb0f550dfde429605f31a562f7d91c4eb7525c9f8acc64844bfd1e83a61b38631848584e69f2aa7da9f6c666f19321016ad9325a70178b2135fdb81574b7e13d101acbe60b58a886352585f2451578058f7b0ead8402d0b580b0c0b193a8c7573038b668b512757ee5c690cebda7be15b990ebdaf9b71180a7f140bfae18f69568b7abe76714546aaa58348500c5490f7fc37eafae9a9d2007429637d4e2b768115dc7d22174838869be9c689c705b6f9efb58433010a1d13bac7f0079a0395490fe8fb53857118e90c7e809791c91863254ad2ac1cad183b928051b2d693db651a80812b135dd232da162082cbbf958c7fda06a751846ec180364ebd5d2c3e1175fe490506e6707de6e2b19c19698d7660b0cfe4c556edf0ce9d468e7df6e2267632d26e50af9b68546e4c88c3ada0539beb41753dd5d2f3ad8808239d330a0b330dda8790c8e4ee99e50c6350b203b77faae51b6cdb422509db32596cce4ca4ce1d0664239aebab7fb5cb9a2f7026578d2a0ed1f4796890e749ad568e30bb5418e60045d311d492bf86a23c9cdade0035b4ad9d94bae2b2527ebd191ce354df349c14fdb59a011e543fddc181d6ef5e125c58c50a1461e85f49f89af2e4e7f9cafd14c379704bb6b73c56b004ab9b395597681d6a3d6d65ea14beb86312ef6c9f2b6b7265a5dd3e8a8aae7ab28181e031484f35a153b6f7caf520c1a865457a87178c45ca2e6c0ed8a1eaf489d038b84ee36a464c6c6124b947bb2a92c1c3241216f98021ecbdbb0cc5f5da767272b910ef662707b6c87a38439c5185c27eafe5a873d2b972392e0361ec696fc313b807aaae4921ef5d9d87cd1ba5514a415ccfc1597ff94fc62d67b003951ce11151338a56d349f1a937192799dd0e0050ee9d4f3a6a8b13572e40a6bd6e6deda67e7f9caafe3e1a80cd446d1e46eccdc355ef797fa099e011d0bf005458cf10537abdff11792755934d8393ac67fea23f612c388f2a52b6c463e0bd1575a719adca6c79825c6b5a5128f0bc6f88c945c085499c03090897fd4eeaee39c9f0b5ecc11f8ed18f4f8fa306ba49953ade1c43aad33eda08b2c0a6b0afb572a320b6a870563216a569128fcc3c6f03eb68df70be50b869ee1f6ae7f4130e98af08609133f33a217fee3877ed2ae1e40f31b649070cdf019b99b7ccca5ab518f2a2ff9f389f0f8bc8ceb71d3028f11e28cd4624eff4d01797369cfc89ab9b1d02c033e09a20edd404e2d3838fcf9385fa750779d1da3624048ec7d71830c84b1d2cc49bd2a6c87c1c4533cd217222798d7711a688954a439cf27bc7bd1c8ea2abb8e32dfa2dfbc601d55e0e46d8142a5e69e3e71add6c569cacfe4db40f219416aa7d3da3f1c3c045da54acbd58bf505e17ae9c535e03af2f2acd8e290a7f5a6615353cbcf92da140844711c5f2d56c4ae6505c4761c5d6dcd8489acf8404118150ea6ca9c5f6d3d46faaeab4dbb97572ad1f908713a0d93999d4c9040e221af562945906b68ee8387320baa0451bd564396562cdf14050e51be5a176b36b11219844141fed9962c7350ebe9980050c81448015460960ec0c23fff33567cc057904eebaa5be1e36bfb05ad3ef78f722021783869d4ed1a98d6f95167b9d650ba88db4dfb41ebcaee6d362a62e24dfc4694cf7250dad6ecbd1d102619303c63bfd06769ac975f57a45f2eded4dc57d5093ae4a82c8619bd8f21f7e38cb7f7d70dfb54aa36e6a1afcbbe6ab864d5497af305415ac2dc04aa49071295c381377b568b955366084e9c619cef2b02ed8d9837e454fb2cecc6773b0d077963856ddc057c4d0abe0e08eeac42eeb9b64913c73585e4979fd4745112a17b34046991a4e61d0d59964e298146ef79caf0bf0254fa38bbff147e4225b2c279a483e0f36ce0e6190ea65d65c8106554666709664ef5688a851ab3719d01a7de113c2f945629fb6d658f46fca949848d9f66b6324ea4577fe3d4be10f23dcd226108aa63553c10d448f8510ee16bd3e2d6fd121558788feb09afc82b055ee9858e496766ad58deee99078badd3083309b5cc8a29d0b93204d800c52b2fd226b735e5bde669824b0b6cfaa5ea03b34fe0b96c47cb399de1d6b92625cec5418772cea4500e7a16a17a53d36bf669eb1370dd7557cf8fed3bca71ea16d72bfc6206061226f0eecffecef9f5dcfd8465c05d3600c76a70c0b8913e70e7f5977cd7f1269178bb7548a25d54387eabc1af7ed465548ca5dc70d609412d19c834e4700a652b21876c98948b16e0981a35fd39893799dc5a22eea85756591d588ac464d2928bb45837c50f660f6abc0c8c76176221da95214dec82d0432bd04609e25f622a91a44eb562f4612f14dfb14c23dbded031c073306c3b03212c094f6d24cb52399952cf5f44afdde70e98fa98c25ef9eb1cad57d44fcf186fb3fad437f5dd5ce5c06de8e51c98ec48c66008ab451cd60388bc50f01aae895702ee47b85e84e8bd5da9da6c4588ac251defa73e9a2a326477a9c6be498532bbbfbeec15a6710c893c7d3f6c9402c4545389f9903a82e0163e48c8b566d3a25b7aa0ef4e2c50df8a8e4a3e92ec7830afe5b7099a30852fb3f1233ce228b75e137b7d7b89361ca5e9a1d5907e817dd2421aab4edb7cb31149141341b93a5a401977875e7a4dd473c5e75d31c8a852528fd92c9b99d39d6efbad9d0a21a44bfc42126a402bf8fc94de55c777ffa2463426ccd59ea3414440046d0f5de396bf5385de3a0d5a52ce63aa2e0d1168dde36bdee89f6a2f38614a884694b014f6bbb5a92b4339b37cb3c5f6d9aa80937e27e3ba5c2f1256445107cfe53d529aa8d71fb84f6a83a3b825ccef955e1e1c49e5312fc6e8ec3c17bdc09e05234bbfb54daa253ebc27b14f35dac3b9802d0f2cc0694a137e44bffbf770141a0baf9118e59c75c75c50bd4fb6dc74bc32e20b7479a8fdcfd7c440ef7a85086d77a0de3ec5ec1e88d1c04ad9283f218e04aec74fd3f6cc269054794dc2d9fae74e49c67d20b3b047e417fbcd6e8d657ab4e28b7c1cd3354748048e598230992c11e6be9012c484d373541863db31c189d19c31c53080d76f07c2444873c9b3d539a053843e8db3bc2dc8c75d312226bd5119331cbdfb55382634d79de4e4b431f82d0e4e0982c6984b3bef9eb0d5db53c395d7dad990a416dce9ca1442b7b3796ab3ad88b12ac05ab8caa098724dd954419957dc28d4bd96d0303b5b2104bdce0e615a57de7bbd48322e69eae01c46ef4551728f228db0e29397269422efa44ce21fb3f8bc4494454a8a4e81cafa9c01fed0c9da5830526346e8586da45729f0f3756f2a2b78af73c177c1325b0a6aea57edc5f30c646c21935975eb8ab0f1c1dd27d43153000e3195acace6e2186262746640810d6321d8ea75d40464a42a97625cbc5bf8684ad856e5ffd1099013e90959db87984dc94ad08ab0677e052d59acdbc3de31ab16ea176a60adfc27347116ba8d6c020c097a5d733cab6c034356147e845680bcf7de13ead9e319bf6be8790758281d97c084a6029ebed597bcbc83d59251d3b99e712596e751ec682b02f17f142ffb711070feeaae1a1b7e6f1ba01ae1e51cd4a0c0018601179553e362768a9e6ec5228082611bc47a9d669c293ca495930b1eb9c9f55e63eefaa2ca69d85be9801eedee83c704092de2cc59d56fbc8a4c13d07351703dff858b881bbcbf529a2cc6012450853ac28c73593d65d0dec43cfac2e6f1ea1322529e790c2b0e1d275859b52420583c4d7808728b05cee0a615e9820e4250db84d9751d846006a34c654151b0b8e43e141eaa3d892d1f9437a10f350b497a2e62ddcc83db01a79f40343e9a8d66ab670f11862262da4f482e9e3c23c2182b82887b72bd02fd08d21526e1f4e71488179027bda3fbeeda0b2c80969ecfe2ea3c20748b251b9af757b3d1b690524c2c4c9e2890f4c7a174b3ea1748b0a6c2b8dec98fbb222162fc1b6fad1d18c8f8778f809cea0772549814f8ce91ced32c0366acf05c2f55fce9671dca3396540148d30354b6bf3a0dc683d3989cab1ecee499ab27137c180d8a5a886f18454f324326259720e729a53247ff6b746342a4fdae9c78fc5da03ed0407f73d61ca1a465ce367508532872552c68e754a0b2b753eaeb19c170fa179b20083a7a0ce07478324b58148d3a028a58ae8b163264b0affee840db55cd4da9bb1170db1792120a967fc8ffb7b84afd3e9590bf5efd525987e5100e43ad66b0f877c6debf2ca9f2c1de43a5d62b9c5bcf68c5712bd78793f2759afd2d9818551ac0832cc3ee58a925a051a1f2474e6e6f3ce03e0623b7bd885d3e069dc2521348ff9222588ed26b255eaf5b71cd32d41943de424745382ba0613400a4760bfedcedd3e037815c91d5501ff20bd32f11fa92f718de55f4637d7f486e65015453abdf66e4043af56e9682a65a4cdaaa0073e7a3a356762e3f3503e0c835d3a9660d6d828fab75aa6b99cdb6658606489e12ca6f88da681675e244353040888e1f956585e1778b6792c60cb0ca7cb76fe54b7a328febe5704641553d5ea4bbfe5d3c8b687d332289d2463024fa50822ee5f6961dce006a44f2617938848c291a9bc49bdb44427dea0b038d38f68334d5472abf1ddde77b8e5b7db843741f12d3e6e9475d2acb0bc5430e9a6c91706659f9f9017838b1bb40e6c584c0fa055259cecc643695ad579703b01e3d54c329db31ad1486b888e8bf250e741ea20e1bfe385416dc2eee2fd9c3eef914c4421d1d9de4dd042da04c0e6ff8bf46823b2d131267138b63b66e5c6d86c6d2abdd59b47d4c2da2b1ac840971413f761b148cf8f0b8925d74def433b4ddedc91e78164e01d72259d4298991c27499216729854cbe6e692b72c4c726b6a31b234770aa90806f81b6436656093c525f867821b96f944d91320aa38942959f90dabde0fd5fc92f181d9ca70761b4b8d2d5de36dbd5dd44aaada53fb37663d601cc792a342defe9166cf42adfff0ebc0218373176c56b059c792661a842f8c92abf2fdf91766d95d6782fa6d855ac568a7023ecd6805d0b30f86aa757be0480c338faba1ecdc425fc1dc7b1942a41cd2d8e3ba971c5911f185c4395f020667a7e390f66932c69411dde0c2fae676ded1c384182e6cdf5f1cd8c8ef8e805540a2741be25bdc240cfb8edaf2c8944a44ccca542d632c616e528b929eea8932ccfcb44a758a6e04230d15e4ab321916f65462e5e536898a14afab59d7490ba913d29bac587e66196cb70ab9f2aa687e06c3c2b23066f17dd65eddd5f1be4428a6d9d56fa0d9d21b45f7d7ad8a7b12c9693e68045979105732e3f5a946d662ffe59ddb2aa8b65aef07319e1aef7e62dd3e94860efb1cda6ce064c0470727229bfada1b6c5368203f7511393a3f189c201790591494e8a5d4421f3df32dca345e13b60a8a8ef53c04a8108ccec3c04c0bb688d877f5b91467b628f4e1ccaa63348439a5013bc937ff0186e7db4a0da26b6974f76264fe408fa56763c8e31a45b934c13c371dd82d25a441d79649cc553591ba2dae194e356668a6affdd71f0b87909ca5a490f73183e886f4eb094c01c6d36bbbbe897c3248591de3a6e80e1e3ca6e97fd6adc179279584025120e6ff4c8d276d242735ff43daf7904f2c35acc05742a3fd56a5584b0d55d734505860e1b4d3e7d1504aec47ab142f3b376cbd2cba4c1ea427e026982896e86909f12a1701b745b7305494130b25cef2c99143dce81ba37d6efa401c4fac69164241290c4fdf5887f0eced3b0656201c138d351c6c23c9dd3788a583ba98e520b8090402e3e308f626d7d270c897aa98a53052a1657528ef2d370fabc5fadcb6e4b118c42891ba9bc5c09af81b4b70c953149f30d65144e520284f0c698be112b1ed628e0647e5b1c2662ff94828fae3eecfe0217bf9a4d203ef2105a43b7d2b10480d735d8c27d449d2164924debe6c7f24f09ceb304d5883bf9c310a06d31e8fa8446fec3b9325ef8669e6134c00be761a0e52ecb7f3e4977e6e874ecbd4699bd246c60b33bc30d6bf214e505e7070b1aef5035031dc329c9bbd711e376a1addd5f4b6278fa297182c2e0499e34e43b874670266a70f951045b2ed3dff4e725b9e063c19a7e68ac027aab525ea9ebfcc39fa0bf7520a25528d3a8714d73eb6b0ca36e023f466d4ab01f219e734dfaa188d3733c41b26babcd51c4fdb5257e137f98a5d588817d55a24033a38cda4beff7f4fecf1e7b89bcb4980f93edc166b565fd054ddc54fc83088dbdb47885b8929aaec6b4638bfe671a7cab9d6109f860946bff1aa3918802656db7369e75df038e6d60af2f29788e8020614d71317fab1e265da9902e9aff65be017a8abe42a43df0ba690c0c4178e2ce73abf58c667107ea316706f9f68a76994f9318b5e2187ae6775977cee4a2e51b613d1a5939e07123e5c9055ad5c83f7daef6ef435fd307d54f68d0f12dfab1787d81233ac02a6a808b5ddb306f323cb31148942f14a0a8dec2d99fb0fe96a3fa7c8fd64b6902dbc7b03060952036e098fdd2a71a29d6d76f5745e39f095bdecc524cbfca696e56b9a07162f490ac6bb029c4e6fcd78cc67e2555d746c5dfb9ce6e53ddb721c375f93ec1fecef76717dcf59832ab7c377270e19ea6c3ab64f7028be9ef195921079b09fab77c7664a75372714fae50095cee4e0f92f0bdd41d008fc0b8a7dba2cfcc2cac845ca354d1a71bbc1fb3ed0aabb4c31c14d9c84be47ab08b3c0fc53835ce01a91d41aa40c1cacca78c9ae2ddf669bea1eb97161e01b98e4f1a073cb78080052cebc627ac0067aa538c9bd6c4d284863e36d25fc3b2e9ba28bae6b63bd186a4999de48a0ca2da1517cdeba18e2048bb5baa36205cc096e3e9e441765e126f7b4e3ae03cd623fdab5f3743c2b5d311187aaac536178b23711450e7c4df83ad105c3f2ab0d4ddf104cce2210a6e41fb8ac3b29f8a67fb695320fbf9bd5e0ce79f5ff8f867a16bb212af4ec6f1cd3a7ccb058eb302e79c560cfafa324385e545f85b51f00eea802545ffb5c63332068faaecfc23e478340bb096c3173dab48d93988840e7df0f4b98987a51f4e1a07f94063b06a1e8c6bc3845a78b924ae5979dc314708fb3de3852569dfc0ed8a92d2798b60f085fabc64ecfc8bff9f02cd1df102bd4a2fcf89b711eb19a4b7934668bb7489b47b122ba755bf8e5ee28294e604152dab50b1958e9f464e66976447b4ac8f10cbc686e39df4b8499539f156a264dc5c93a5cce9202e1faa3879ad4f34a66533c220f624b5786a23ab62f7dad8d82554e94482d28d87b9601e97ce2270fdc5b3f385cbaee5f878ada5e4842ba4402ac279eac575cc4cbd84c12ae19831e31b1d998003a8451a15693c406c19a00bbf16e1fdb96d957f08390e0b50098eb71dbec1b08337dc5a502e103031c197c404fe726eafd72b8aeda2f3a19b8e7d2ff4be16f3f07aac2e8a26a90900be1142a87818b119a6b58a37630eb486147434ef44c9ec5d31b3ae67e26f6cfc273ceb46e40cf773aae28cd5a85ae7a6e2d5df008c34b19ab19448002300619f43985e27dfe6bd4509dd86af3322b6ed811c466c7023777bf84af70e5ce8fbbd404106f44726a2858c96783b510a3e1b2655f97eb5f9fa0594de9fd7d4e4aa4ccf7ca8251e29884f7cd3b8e530324c3a09d366e844d3e927b1e3a60231f8a7bf67e630cc7043ab7e7cc9585c96c41099d7bdc9f57abe6966bd94aff39db2d726c05cbaf2e36f0353e5b79ae89aea33b578e84ca3f283ef8a6928765d9da5b9d21d33178e2b17d1acb9ab75eeb9ecdc4349e15a3a8311ef804c2948ef702c17438bea81430feceeb8393b149caed9fd4bb207161f5d72fabb4465dc995eb552521f08c07e0b3df7533715310cf3e4ab0fab9e273d6d9106589601a1c9bceea8c8f8a652ce7cb7f1f06deb5239b44e44f84a8f909084bab391abc315b01acbf8e2f444f75bbdb9a96767b943aa376dca5e16674829fd04faf7cb659cc70fe7f4824ae9bc8b334141dfedc4cb4b8a290b5f539030df501075656f457d69a6400dfb47cebc48fd9b8624abfb163e556ae506bac544ebb825a7f67ec9fc7ba4318beadfd6699635d90d25045cdf4fdd4dd1356adf6b7d0a4e6ff20cc4e955d4bad18675db23015e241095b9497b0c145db1d32edd3f12255e32c4494231b154f2dc2036809abfffbb09f017486c0f914aa42f225f5bc21be9f9c2d4606632fbb546c5f441e507a673bb320fecfe49142136cad047aef36e4b1dd43446e5255869f1133420141ba5478adc9cde03efb84678f8958f8deb8fbf64778d29e69000a1d8d3a3a3a40baa17537c3ec0649a56d68fa848cf533deff807cd7767d5ef358042543962f9c7dc41c8d82643addb6d217870f67d0267f9e3febfafef8515cdd6d89dd795d16e899e938accd4e1f23f5b7c95ac23a547f7cbf431aa9f039a8195ef8147d27aa52c4b3a2fdc447fe9ca813c97373b2c9faeeb6b9d1dbbdc7f343b0cfa5a73e507cbd2001ce77617a669fb9a430d0eb13d078a9324802f27b07e74380aad059a3e6eaf16d58a188c9fc449790b3f954f947a2399804c288886e41703769d861a9f3459210ae0d45e9e03b4feaa0a4b1f27ce3f669b343cc786e64772abfa5743a47b7e1e4f679e53e300947c112be1814ac02d0cb4d1020716554614f5e31f66c50cfa8d9ff851be0bc4fb5e631e30dcb928885c9929fbeb5b9929b53d46d6b24498c72fb2827c4e1e5076f1fd6dcc9c50b025de8201f6c25a61743980719b19a7d79f65cf8c65673230b1d72605b698260956377c5704e64db000e887dc016d0e08b5bc76197cc5cb52b1532fa17044d315969d668519aedf583c72e90abea5c46194e988a8107ae7891910c56ab1a095a2ffd5402a924c21196ef1f54f880abd6fbc8f84152b42a3279c938ec9c026053b4a06dd1d5258a2e3a782d1f80b094cbe3cd66851882c7efd92d7f5fcd1f92522fbd51cb7e1bf9f810c9989351ddabc33ebf472248ad0606841e7cbd3f9b3eeca7d3e341a7f70676af5af97f66c4808493a11854ab46feaf38a329b490428a2daf2c0ec0392ec063a3674ce0ec8205af29d967b1627cf98c22421e657e8f04b88adf88cb3200a5f4326e1a85fa19cc2bd91d0743fb717434bfd5a3fc6b867feab13a6cff47889d95fb9545bfe5b16331bf88e3e82cc302f735586d165a00e81276e430b7040562a21b241c018553391f6d2b73586fe931104aae7dcdc75f8f0f00e033996f24279831fcd4d04485b25929d6e4183488a3783c242c5d5d5d6d1ce02b53e82de77c5ebae14bb3fbc8c0598fd6a6067b2a4ab235638dd7231f03628352b411b5b2a55c7a27d11b9a5c2161dae3620a73909c22ce94602dc81d4d26ed1662d99a0fb00b311f5a2275e94928abd8ecf1734958041a151d75acb236c4e89cba9b9831b1a376cfd284f4ccf964e7778cce1b611e9045272655d4e825b1c5ae7f63eb9c14214441d323ced9a5847fddb2ebf8c08af8d66ed7d1764c6157b0eb186481162f8321782709c9122a686e56e37ccdd7ce91ed1b5fac1bc01128a6f9fb52680a5629c12ce477fc3041344e002d5cba90d11d662d6e57c22f356eb4d0429c48a924c60bdbd19d904d2847e24393e95edda5a149c8a33d2a1341a5c18249b41bac58fc2fbbc153bf7e42e8a40de51d4bf227d8038f5153a1d49d58ae39292a0f8f35635d4938aff64326d77957a533c772d67141ea3a6640a6bdeae04fb053cf7cf4c547cfb3380fd1a07b4ce273bfa52f8e962d10908d1ff3a431dc0babd12f48c9ff8be976d838ac0e1d5644c3b372fe86fe271a6366df38bca122bd0e3fa48b7c61b22d0da68d8d1f97fa427a722fde459b50b3896feaa70989be8726de532e8b9f634ceda1b327eb4dd4d26a28f220274f96a7b2a3edfc425106d90320da2b050f34621c47a227b302604f3d81ac7c7d15c6f6707e8f9dba13762c2f301872104d1e87839336edb1d79a042009afbca81f72105b57d80eb245380b552aa9f36d302896a815f2b5dfb5e3280e5661c01864e3eaa10b6c730ebf8ea28756d14ba4fab7ca3d9446dc010bcc74425356a879d4bb5699565b0739062d0c441056793b78959ac428c22d0b88e2fb074875abe834bab42d5d300b688b13cd548278420b11f1a0484bb1ee8937fb6451c0e90bd589f27f02f4cc5eba83236a1abcef30273af34cea2c3524f89248f41df3d0cfaab54e430e805f5639a4393db4875b5ab9671cc98ed48e8a3957bbdfa3ef1f8f6584756c351305d09f72140c6d2ac8400efb33162e86763a37f8d4e66795443792c4f6273b87744184d607fad2cdfb5f3d5897c12821a91927be1afe2c60a1325c917669fa0f77752c8325ec7d102774107ce14e7567c3a667ab4e1609b2783b3eb46c07890b990476087d32cb91636a7dc002432ee9ebd991d92ef60c2a2059774cfb13392445eaa4c9eb0f5284816e0b80f4969dab8f881092b9ea3ba151cf66ab34359a376b63614f84ea9c81c2cfd1cb4812b46018ab4106aa4c4f588530e5382b9a5ab4ace11f2f4d69b5c488577278264c358e6ea08bdb2eb17b428af99b209e40181b91699c442b7f2944457c90cbb0456a2cfebaf36ce31096907a02b5a2dd2a76d93adf23fdb7eee3333357aa02c7b98492cb81b44c28357280fa1d0c1a4c9f73998c96e3c63df7708304773abfc7c0acd91988a97a4c8b61d0b031d44c433407796a90ebb10795d706a53a8d0330c34e7423c2e094a9ab2ddad7cefda0c77974888a8aaa1bb9050f1d64ccabf5ec3e892b8b1243f9ca94e401020854d277283f06bd1b94df436a63c0929fe0a33e08dba6c24955d544d2756a5cb87799779e3e0aa68e022dcf56b8295dc4e60e1b6a093eea40e7690ff2dd1fe3049cbfaa8d4a99f5a42ec71bcd3165c79798dc4d4ec1a7b16cf63504533b2004a13cd7f4fe89009064dc34dc46712ed46204ba01489e5c36010b940b3f2e38782ac5e211107b12fe6f1495e41e77b53f858c8ee98b5073a9ca1576a9e2179678c1ee6e7040bd17247281c99fe6ff2506496f53c2bbd2aad8af4e50db4cdc38cc51a0a84f6156aadf1e4a85c180d8e0bc80be3195264c62f19f0433cb1998911cfedf3517140db47d4caf1d7e10a39af8d6f51eb799f834659caaec9b0e7135221f17ce1c1e7e49b07cf63304c5502642a533cdf6ba6596eed50e93ec016f9ebe93a6b62291e3d640fb3e9e33cb88697fb6fcd28489c9a6c3a35a986be0dbddff898a856d9ba7ee252ea0694ad9e7e40fa4edb3a9f5599a4b19a8509eae21263079c674957f3913458ca43f1ac5e3b7e5d58ae1c3db8a15d2e8e59362dab3fd404747edad74dfd13efc329df0063ab64c48732dfa70918026dd9e0f0cf897ea2b499b3b3c45feb194b65248c83062eb03bc18c1ee07595c21f90dc83fe189a48c41e54e9622ed44ed77b2400c3781f24869e633abb0b12c09fd28015f59b4d169dbc76a841a3f0443fc7117bf3b54e2c2269e2b5126bb0d1eaef458ae3d7db9e271ea99811559d73e518e2e9e7dfabf7218c5b6b4dd14d88fb4a3014b43711d6a98dc0387f351d0961e453d473ca7953f9a985e3d5664326fd922baac1bd1132f05165949610db0b89cfd4544b1ccecf0e2d91c78489b938418035b67b4bdd55e6592f4df0604df867b62504a6273981e25232287c2253a8ed9767453c01ab6d3cef8ca8c68f93caa73ad6a89ea5a62f564b602d8529d238768f360921c1f8ffeabfd91ca3cfabee30771e006c1176e01018c4170b4077449d80ee29b72b5d73ec1b05b81c6a8ba02244f7c739ec5bd84e5a1f2f815327313d7a5644cf0b44a8b79949363711e8f947ee7a56b40ad59ed0ce5d729630384c839c9556e09125b1b19f7d6ccee119088a85f5a2e7662347ec07a6431d81592945faa50368105ea0a8b9a6bcc60bbc80b0cdb074e1217a2915c00a20145d0a802ae6b35d5c74df929c50da9088e4eb76a46956b53887ae8bca08f05163be72d56faa22aa4b26c271092059f5795386e34946aff407be89021c9680f8ea123d2bc11be72b59b7db17f5f1ec9b58fb6e2cf7f9920ff0385eeb1d55b1cde0c9866f841c5aa2f2ca5b254eeff44530ee2a3240f1c56a280daf76fc9cb0f68210d0c112441755d6b7ffda9703cca374ce8c82cfb271811a81f5dbdda09b64547aa874a8a39bc65b9a3255bd25636ecc0125271e6db92f89cac59256bb0f3d18f3dd381b18efe6ee1d0b3ca2e5fa4ee903b429f6b1241dba75401ae50c02ec267c72e0cfa23c568ea54855a91a7461ac514f27c43a6b7da023224092cab19901e87eabe340f64582852ee7e89df92be4ba1a56467f26b71e0976e6d413c390bf3b3a7bfca782168d5d8c9789bb9e92c0fc8e0282702e3f528e65d9fbd98145ce64c98f771e9f3ed23f932246e9d1dfb0032685eb10202d17ba437d030b8ac651b75bc935abd2274bb34225a299c0d8f4eee3345dc8db51a148b6b277659f5afa6a4088d6da4120a2520385c67e2e9f7879a2e60191b89494d7eb522351d710f97fc078e93e0b7fbb40683e79d53f37792b8aba2d289ba38612a789ca7f430129757f0d1029ec18e52add01d3a3525604c58f8f0770f2b56a1b42d8d89ea8cf490f132f6381f359d24d69167c74e3280bae88dbee8bdc1c0b6d96d36607bcc38f328100d95e4783bf24a1be4b25c21af2b8fc8218e45a080cc2742721f3f3f6ca8f34f7f2df87d1fc6be8c8f5738b35af8e70f22fb6c35a7a424c197b2aee9318db19c18d86d30ad5f3810a41c1d10af431dcbb8500aebae9da4f374028290bf6cc3b58e9924ff7f50cdef6b2a49fc766be5c099df11ae2bc197ee184a4b7b041b543cce6eadef26e7313682644b9a6bcfd34598ef73b7f5de3744b0c9c67432ca6d03094a3ff865431bb726b47e70742b42eadf7d5e8dc642f347577a4a44574309072ab80647911701b6724bc77392ade5c4ca49902e987dacb4630021cce5f62d261607e26f8d47729222d3d3cc1041906c341730253aa75ebcfb3073a1d2156b143f7347babb8d828f8e7517ead6df279207590418b5c8a5018c56603a39fc28a8edd66865722854e35e21aa3be6604ad95ff2e016493abdf1260d3e525bfff7035267ff90cc2afd67f42bd3ff1cd919e06948e9aa78fbe9ed0d85e0b368d202fc19e9952aa4c7e989d4f5296b936d278b88b50d2905b4f9090e520bc57e736ce7006c5494a1522b3894362d4dfe83a5a070a332a7369e6073f1f5c26f1afdcfe1baed70044caee0e5e24cc3d56ca99e1601deebd63f69b154f74a4927ab7085cad260b16e6251d9cb1f6bdfeed60b4f9309e2e4f5029d8ceca026d4e1d3152c83090bba6b84b47cbed204baa78fa900b2dc34de574b4fa46b51871d51f02a22a0da4d6a3bf12be3f18ce40816595943e04f33a9df3d338225c20bc08f07c4092d43fc8cd8ad610215119f0a78c017dc7113b8860d5139bde3b86ae942e54f16c7561915c08eaf6a34af36b48994ddb6a5c9de4459d6542a53936d377acc7af178b9d360436c006e09051be05cbfd1024639c822daff8cb80d03d1c2d76927cb69cbdb48b58bb8c1426f2d4bd1fa92e32ecc104045455fafc6f05d000ba9420b41a806d77aa5d2e4378292279e9f07f6dc6684fdc3759df2e4edb5f93c6f2085ef3987b60283f54254be9516b0d1ee52e5d839c00a4493554432c24ffe0ae91ad2772314912f1ec5611c4e8e245d7628903b62a06f8d1f0ace601be6bb7511690aa9c5a83402d5d93f6cc04a75f2abe9ed312b4101143c9dae34b51e998322b5be86e7a7e8088bcc85ef9561d640fd2fd4de318fae0e9759bf29836fc0c23b09b1e5e8331e0f89ad7c4e49c26cbd964be519cbe086ccf35b6e5804cc833336f8825e572cc6172c59861b15e722d90ff3b1c447bb31cfa77fa89f9a76be632e44a90c1da084817182df62b195d3550bec029212078b1adef1e0fffc94a50cc2a104f3e0e5e12fc72e6a294ee0289b5d0f1cda17e8970310e0793876bdbf0cb6e964f9053ca42be0504a814bc6c43f33f3d256330f0ab4eb1c2158cc6eaee2c8b238f46f1a0cf96bc1f7a563baf4e4139c75bc5fa8fa3fb1f656a7aa53756580109c52ff214f877eb883b6e4d031eaf3eb21c36a7c707db60e2f2f8852a9a6f0ad9f3509b923daff9614b8ae2ae238caa66000a79ef637211e5a3343736eef0baeef2ace798e586df6e2de13f20c93b249cbf8e8745cc88abad72c24c0b4c075847ff820d7006adc966cb6bf3332f12bc13b031b91e434aee954e3f83ef678a274acd416d86e1f2592dc8e6cc8763d1d83f4e2df62b18b76e2a39e8984be9c6833295783c295b685c6a229fc9c683cf3d3736a0bb2941a9421733d35dcabd3d2b0357183a987c054b7d53e5c18753fc9fafc72d59d50c8bff5f47fd234d0eb40135d591387ad869f7df5a69b5be738a379e96e043e93e8424584476566528dab6591fda39ca32cba3a073acdf89da466acc7393b58a69175ad2bf62b7b2eb1c9b7e6189e1d98e260062e33112003dafc289728842e57ad66be5b10dfb28aa28e8a670fb1a07ae1b384f9a263609f90cf9b025c205d8ba94f3b3892090da6e3490c894c61506215bf937d5195f30198794fa3d7e204307ddc67eb6e6a6a36677f97a1003338608a680a021f5b480b3974987618e4467240f8b5290bf4dd4411469dbcbf85b7419841ee52bc1c46201b42425e1e7a72dcfa42ffb739caf8bace2bd14417b9477c5d3cf442aea3414fefd7e4f927282d74f7f270e017b78579122f11229418ca21fc9ba11d08d5e2dab263a77fcb7ae34c7389ba2f855a9926e24e9dd2cb8eca07106ad3bc52a23c4b585cc2971b01205105f2f2d8191baf68f3198643c460dca090d380514ce34b957609a1fac5075aaad4338ddb1dcd00c4f689ed97fa28b245baded336e40476e00dd084be5e54ba2d03b41d2668b0789f1300021e95ac6f7a0322a84cb03f3039ec8ddc0e9f9a1159bd3793b35fc896a297527aa8fc5a969c13a3f701000df582172e4ee3c9bad7b0d63a82e75cc0ca30c23f118632fce5be32516f4effa591e833748af96d5f6146859f0dc3a82329d4dba0e513cfebc0b026d1b9ce85f14cf00d04bb043e47226716da7393cbe912c8d2e0a4b3613237f34b3ff76bf13c57766d1984a3dac56f2300072f9fe96cbfb47492f8dc42b10a1fdba6f4e371c5f27fb15aaaeabef6aecb5b2fe51d4b952713a12e7c712037f8a5c6d5774a4380406f74da8186ec1cd4dac5f8b358cde7b28a14c447dab917ae0db99d34ad3851e8904176d7f7bfdbda70ff7f893d68c71f06d610f13a52786aba561c777274fafd15fda914a97461cb2c121672d7b6e63ddda96c3ac9ed59d392f689e2f2d8039fb716bed5a8dc265c2a980ceb4de0c59a7ad7bf755a9661783127fbec041f3635ed43dc96e8b2bc9140f62d372c75c94c1dc653583576328486c4e383e7aaf7d2b4b9a396e54026f747a1cc9516b42608f916d59c0cdaca15de360214551cd1be3326ae952e249f3a0ff3d5bd4d121d87841208e" + }, + { + "sharedSecret": "21e13c2d7cfe7e18836df50872466117a295783ab8aab0e7ecc8c725503ad02d", + "encryptedMessage": "89f5945b1ed1f4bbe9a33a706089c10f7c0dc4c0995fff7f4b5d9db50e04aca120031a33e1148091d8d3a3138f25397a6048d7f022a71f751e44a72d9b3f79809c8c51c9f0843daa8fe83587844fedeacb7348362003b31922cbb4d6169b2087b6f8d192d9cfe5363254cd1fde24641bde9e422f170c3eb146f194c48a459ae2889d706dc654235fa9dd20307ea54091d09970bf956c067a3bcc05af03c41e01af949a131533778bf6ee3b546caf2eabe9d53d0fb2e8cc952b7e0f5326a69ed2e58e088729a1d85971c6b2e129a5643f3ac43da031e655b27081f10543262cf9d72d6f64d5d96387ac0d43da3e3a03da0c309af121dcf3e99192efa754eab6960c256ffd4c546208e292e0ab9894e3605db098dc16b40f17c320aa4a0e42fc8b105c22f08c9bc6537182c24e32062c6cd6d7ec7062a0c2c2ecdae1588c82185cdc615a346e11eaf8f32cd44d5f1213d4738768f081978420697b454700ade1c093c02a6ca0e78a7e2f3d9e5c7e49e20c3a56b624bfea51196ec9e88e4e56be38ff56031369f45f1e03be826d44a182f270c153ee0d9f8cf9f1f4132f33974e37c7887d5b857365c873cb218cbf20d4be3abdb2a2011b14add0a5672e01e5845421cf6dd6faca1f2f443757aae575c53ab797c2227ecdab03882bbbf4599318cefafa72fa0c9a0f5a51d13c9d0e5d25bfcfb0154ed25895260a9df8743ac188714a3f16960e6e2ff663c08bffda41743d50960ea2f28cda0bc3bd4a180e297b5b41c700b674cb31d99c7f2a1445e121e772984abff2bbe3f42d757ceeda3d03fb1ffe710aecabda21d738b1f4620e757e57b123dbc3c4aa5d9617dfa72f4a12d788ca596af14bea583f502f16fdc13a5e739afb0715424af2767049f6b9aa107f69c5da0e85f6d8c5e46507e14616d5d0b797c3dea8b74a1b12d4e47ba7f57f09d515f6c7314543f78b5e85329d50c5f96ee2f55bbe0df742b4003b24ccbd4598a64413ee4807dc7f2a9c0b92424e4ae1b418a3cdf02ea4da5c3b12139348aa7022cc8272a3a1714ee3e4ae111cffd1bdfd62c503c80bdf27b2feaea0d5ab8fe00f9cec66e570b00fd24b4a2ed9a5f6384f148a4d6325110a41ca5659ebc5b98721d298a52819b6fb150f273383f1c5754d320be428941922da790e17f482989c365c078f7f3ae100965e1b38c052041165295157e1a7c5b7a57671b842d4d85a7d971323ad1f45e17a16c4656d889fc75c12fc3d8033f598306196e29571e414281c5da19c12605f48347ad5b4648e371757cbe1c40adb93052af1d6110cfbf611af5c8fc682b7e2ade3bfca8b5c7717d19fc9f97964ba6025aebbc91a6671e259949dcf40984342118de1f6b514a7786bd4f6598ffbe1604cef476b2a4cb1343db608aca09d1d38fc23e98ee9c65e7f6023a8d1e61fd4f34f753454bd8e858c8ad6be649cc7c5ebeb85c907cc6560be67e24d56e73b2ea3a8555226326e081a7f517262f036ad6050c3bd7fc0b8e830dc0fa46b029c2637b59192909c6d273ca4e0da21a2dcef88d94f57ac8f87f432b044e744e978f450744c29fa02a5af4e64d0f5bb3004ba4dc4e551e73840c6884c62d3f7d20d9ac9059dbd0e0b71b27eb9dc2829fbddc264031e9a605faedeba7693245d2bc48773552e3f8fedcc0f312ddf2c0daa1d16381eca2698c0a6b1a0d7c383c72e2c05ac9972c441929a90cd7ed0aad453fbe4cdbe777e7e11f5e67162fc685bf854357c162e630d53b425da91ba1f5be2f6ef092d741647b6e90de7c5fc24aa4e92ff63445a0351e05ee2115aae664a3c2da9530f0f45d81d13411a7acba3af97666320a807b5601fb8c0e3fb390b22163edadd5477102a92c09fb304fd8acca889b82fac099a0fbe1a147baea7684db8e83b1d7f756e80cfd40615851b8ef9d1fc7a86dde62c453c2cb96a7f22ec7be2b0f5e5561cbca1396501c8a0724f619574dd647390c673b80a935a943aec40031243117d5a6d6b425fa3bd65b84b5f3a583e91fed9a808fa137b3f1db119b1f5a51229a3c0de4bfa509bb0d2278630511292b460b289f10f421e10ba6d42861bd95ec68e2e29ca4b95b9e34e7047462d0867443c8d3ba59602d9a6f210e22a066eaca7531f78b591cdb9768d8a6279640ea4c28b67542cceae7695175db4f59981cff3e929482f59f032319f9cf0623bca44a067cf4de49eb1e0dd1c72419796507b47e4e809d1f4b4a7c447745b3e7e21c4e16254f3ef59d86f7a15ab5ed2b0e5388712abc1ab043a307913ef0755b0dd31af0cfad78bc88d641deb5f2a3f2d0826865c95b9758c67af17ee3bce38bf80d01f4dcbf4d3d3fa7d4919ac80f3df67f892f46a455a3024d335b433ff43b763664902bd593ca2ec2c1719a63c3b675f16ba6fc1effc2bb96b6c0f18174dce3ab0f01c9ea88d2784274a9926c128d979360e290ec1e9a29610097d6d5b5779dc157183662cb5ac1f74eaff46d930c44ef9d353c739f51fd66f0b4bab389c19e83b668c6295aba7f26fd9801633bdb18657f59c02f985009c1dcf750712e68c0e196c00e6abc3c8ed6cd4dc41b6adbe18b9b12bac2f8ee281e3f7a92668bac1acd95bf945b5bbc8f668cb5b181e4ee227e0aca97ec20f4eb2f9b91ec0c9d8d3b3b95052a9fb5c26463a477f10c3dfbd11135b3d5ee33394a7b03052db5faa8ac1cb29bbd2f855adc5318cc2022aa05b47e88bae75d5b36c5cb4f7505b3bf7b2da46167e888dc90eaf16109a6314809ede96e6b483a833cdd543ff7a21220aed31a6091ff9d380bdcf7d2909024ebc851bc681b2bc34667e1c1546c7b97d57dfb18da46c94043b04ad8008681207d721ea67580d7517e1f9989ceec967af0f649f5fcf6acc272f8aad5fb9c14302b73b6afcf7de01e88e305971cf5d64047bcd116d20c205663c63e4a9115cd907ba4f7088c4c7f42e003e33286564f063f1d28c1fe8ad358323d00a1bee7e6f8253af447c96d04f3205d2f5b09baaa1bd73090109af43157c5a6d27654167f6407a47e24c61a871a363f49ea6024b264833063429959d6ef072073dd4c7e606372b287e7923659875796a279c54449b5ebd72553396935e902a8325b958f2b1c4a1e6971301834c5ec4e4378d52fade81ff73732b735d6b7b9bfcee0a2d58bc19b7443dfaa4e021c25c3521d70d862316748b3ad61de8f954619d0e2fddeb8a203c510c9b7c1cdc8bd3fe0e3927800164e86de19dde073bab57333260c9800334413204584e5cde6b2312a69e2d350f89d4e0726cdebdec8cd5c97f1b11c8bbcacd897c05e62081c467cffc7fdd12ff2a4f321b0ba59238fcfc39066c2abc150fdbe279d48fcc21e0888ac2572b4616973842333f38ee274acc33a36ec46586abb0cfc67303dae386e3fae45e3a5191768c67f7e8a811d9aa6664f27a6304f61b8c58a147c3e6e810b4d022f4317fc6caa0643b496773bd753907f2c77ef83ed34ffae855f695e534e3e2ce2a8ca124116cefbb04680c0f881c90ffb5a6984f142108b216f9e684b73a478484dfe68c1e2920846f268e8ad43ae93e25b72cc44263c31a898d5fa58a7105bf9a2f85c1b20eed0f70f3ddff86eda9d15d03419c0fe08a773ce6bc99ba02f7b1ab1cfab9ef59c802a34dddf1b8bf3c379e3170ae8f710e1757b08870dbeb8d3caf45e38ca816bf889d7e2d7ba2df2eb408bea0eef506c3cabbc58d885d71817358173a8e4ffb63208224c63167ad21c7d63efdc30fd8321d89b95351010b8708fb0801f770b7bbe32f9c61e4719e38f7f2dcebeb9f31345b3dfb7f304d0f1f01ddb2b4e6756c6f74d0b055080247d8b54b31c5b82b5ecdf5d401e0e84fc80add57109c3a415bfb26a4bfa96b944a4f6b5666ef1bc3ab34de12250b4269e8a5827a332ca709ee3e99354aad9ea689860114c744f819c95a311c6d4653026a6ca76ef116accda3f5dc7c0c1aaf10b82ae642f46d091752db9bfcf88eae0bd9680ba6d1e77679c3b9fedc9b17788dd85cc79d1e3482804ca637356104a3de3148198bfb9d05cb4381a5ef4197829659ffd3d04572b72af3c3cbf065b65b7d854d3b7dd30c6a79fad78cbc77e362f5d5be81b2a5126bc388ab52201dc9da1710d64d0674da7134f402b3dd302b4ccc4e302e423aae01f2c82d9b6b1ac4c7d4daf281a7d2ceb48c718428f2fbbd91e6fa6514c106af2c1e56b4b493f96ad87adb5a47741397649cdabd20626ef5efa4083f982e90771eec0581dc6e715a42e5e5f01dbd5ab066ef13827b905efdf84107e7306a5caec27bfe058214ce5b41ad2cb25261666b598d975daddf65fd20209828bab754919a8fd388b9b05f6ef4ca90d67276157504e4e010076f648830682de6c2d88092da092e846bd08c6823744c798fa21b4492dcb0304356ea8d1dc48ad92329e955d1ccc7191f6191697556157321dd2aad6c041b13c04e2514b5f6a20e8a21b891c3711291d033dedd1e7602072893b8b217481330a42a6624392a351e71787ea08b72aa0dafd6552a99469086ab2743b68dd29c45a7187b63523e50915874b0294caabd75c8b5c3ac88875ea987045eba481ff05a0818a027d322f99257ca89b14b630095dfa20780452c916dab1c4b03a23103edc88653c2ca6c613a986169e6ba35af2b289bcb00c77f55ebed6f14c3514d17a603d85c81d7e36e80633683b68529685183fda5084a9fe840089368cc2307be09b09560f1a5d6400540393bcf256e8c1188cd0060687f0be5599bd047a2242a80f577a85fde66eb5e453d6eb313ff00e0302928603ab466ca79678881a04098bba89f368a57a601474fabc1a056eab768f6cf539e76029511883f73161631d5397508ab9538aaf12f156f492382d4d9b571bee076defeca40dbcc8d8db2b2cd90ac35c8431efbcd45fbb6ab457e8bb0287d7409ec6cf0ca04bcb75a7a881a7ffc0eeb05487478738b696a67886673c305088860440af819ac20bdfce9a81e550a27c239205d6fbfb76c7d90b0c733524815165285f4d21db9cbd03b40bb91b7d47c31e7b2368a83b14e180620bb787db6f1b49782087195ca216c4f1d6643cfdc6cff25ed5036c620d591e29d815f33ee2f311f8dabc52550066e8b77e10fe831a436f19f14214471539993a7f39ac1e2f1085b7096e7564691ea6a887274667adbe218267a7f970f83845a9a06941e195388ce6af63d3a6f347316dd781df6afe8576463be3a4d74012caf5193684524607c1cce2d64a5775567d01b22e128c4fe4ac43f7c16328064ca698407af1ffd2c6f6265e3356d153bd1992c2ae33c8728554060a2c9be0902ed8a57671651cc01ad8bf6e9a5ef57c61f1b7d8e14993a07f61dfe1ed26d1313eb1193c198ab93d481d19acaed40e5d91e81c4f17d6bce1a91347ac916c39396f81219e009a565a1abd32ef8d67c8a6422470902a39838bd29415270389e626da3b57a27ff10e92c4e53e393c39b2f5ae4b7e743c10caf16027066a1ac0d886736105896521f82da4a9549d7fa229150ed5544f1c453510e311a92c4dd101f9297c50da34b92983f3dc60ad6ea58ccf529f83a6765dea5159188c6afc30604bfdc521b8f756b4ef354e5a72f639e97b4ac17b6a651a0f8c757948b1ad57becb82051284a4d1597643830633fcb20777a6d2664e50c4b252e36eb1ab6982a7caf6fe755125a02ac7b391b6e2caf5d0a28ba6e18e06b35fb24e9c4ce992a2d422abd19e991440893771e4a22fcb167f23615dab9ac87ab18d24031bbd1ba26cc047ad9dcea2088c6414d7a1aafa22e1e58c938cec27e59c7da3807a3f0614b0f654728933577584233afdca24c18bf6487597760724e6394bf13206a032049dfc0c33516c3de2068a21567050158246712636914f78232868e6dba32b6b2ab473de6bae563c7dbb05a1db0f7f3ba02c3ca4bfb6d3bdd2e69911ebc6b87c8e47cbef6228976015796fd8677b58c6ff9f69341c5cf3ae2009fb8704ea5be00715313542f8e19ba63f215e06c324515506f1545ff91f9763b344379020cfccb506c6afc855532e1db744787cdd72e7429c151c9975bc75fe8b239eb6cedf5c02e10413cb4d79488222ea3a4b4bf9f076cfe7d09ecb7f34ba01f492060e2426e8179dfc00daa589ccc8a17c793e7bf1d920ca56d89b04ac3511e08e14fa1a9637f3bf0e1aee21344375c708564d0e96073646682d4b190a18f0330161f88e1496e3dccd82a9a22ef4d40e353efb12732ee5a52cef43c4ec900edd2dedf2eb45d147d4450e048a67c01424cf6402d6a0f46dd98ef19fd23d554fc9050939ee503adba626905d45c83bfe9407605aabc0c92de845a16ba224944333884a24897a35a84378bb513887c6708629fe7d1d2fce6c1f9a2f90429724dbae20e96f37609f90034bef2062a5639087249ee6123d21bf3aa19fe74023f16c0c33d514e720718e4df48a669e6c5a6acdb0c7dfd28d3cb4ee753c6e9fff583afd706fba3c1f2931679d1f3fce993a4893a5a87dc3fa0037f4dac6edaf6a0d48390164517cac86106f5d2c55ee1b69b44ee3e1523d75a4d99d8f6414539c4fc556425a7ce0cabd0d1f0c748ecc497e5e0071f674831558e22a1384917a81daa0ab77c2f06ea744374c41a71af8d0a0d477c68659736164f4ff09263de7e72266dad50323711bcef4f6d9e744f0b6edab7be61dcde82cf83554fd242f10a73b1c697c3621063568097e2635f5c806b20bd8d2796d230348197e52ecbb10133d6b412fd13278defde7c055bbacf038fb05ec87183ec4620e720fe407b2a7dd67c5723e1d932c3069ee9edc381f93cfda85581e540a8fcdbf1e53b2a3eedb80f8c114b97284d30d177023667ef177593d33a7e985c824bf66412b2736743203432487f01f1e14c13e6276aa04ee19e2aa6595bb5d0de0690704fe846c399696d28a7e71744252e66b5d90d4e784d7f705e06aac6df1b8ba1a298a7d2450ecb3dc568a244cb964f3b315e3d6f89c3b913a5649c8f96b8c926c8b3b7c3bd714b7bca81957da229142dc152ee32d52ace4e55dad1e8076b0a8492623795964101ff4abf3f40bcf25e0043289999b1ccf1aaf271d1025038ae82fa3d731e8bdf3db420c1e5f397a69581f52e082084fa7d27c5689ab1e3678090d5f1d62c5a73fb8e914fc42757c4aa342accf596ccd372424b6f20c8d69a0d26424a182eefd5b55c95cf20cd605c1361abd84ae18c88384fddbc2a2a52c7936b9602699ef8ac500a0b9e4bd800dfdc81a22d555bb3773068e88a61cf93553f6cfe39ce8d0b564ad87aaac757fb2dd4c57bf51b28a1e0c42f018f28fa370870e1574b91d600b50c26ec7d629ce575b68e084d8b66234cd188271d6fcb632e43109407850961bb8cb0c9dcb993a74a61b335a2fbbb623c22ccad26b29fefdb24bf4b363ad42b58ce070f40e43151781a0bfe401df3f902eca31386ac2675ae019a52f7b2e7b1f92e0d1e902e80b667cc917f8e4c62c365785d2bb0e74dd2ae74d6b7e1b744fe0424960315412d3a8d9e12e86d6e398125e72a03878ca75a232c0e998bcebb25d767059ca09ff3d6d82edc9ed5cba02c761d675715a05161393e65da93fd52814ca34eaeaac2d8a77bb7d780189496c050f299e064b0088e48a649b26f41b702f991eec53fe02365b92439d2acd3754dcf803b61aaf424835ad35abd0322b635ea2c370c759d64c2371b5b72b75a9e3afc1ed5e8bed0cba1d12c6cecdf3d776383c62c492d0fe494af34a4a9afc7bccde779d174006c17c8716b998ab139469c8b63d9eeb321145c5ba0de7c94634ce4a851f61cc0066217d7d9ad3584eaf10a12997b5c4eff93c6c5923e4170e1e7ec007a97b591f92dc3a3223c5a23d89c31f3f816f8cf3fa9791f9f96a3273ebdea0f213ecf683ee0c53c2bd8598133164e5f435aa4442b499d8ceaa07a617e05d1ae3a88d942b0cdf4c6f94ab036a5c0cba0297c78a8bb061a58859d9ebbb448e1420716eb230d46487e1f70686eb3418691523b9079130afa5284782c82c3f3143fae0e8117475043d059caa7c0c5e45e5f140f9f79eebf942fdca7ba1bbad47aabc9d19247fa238052aa295869d363c64b8f746b77da59ecc09227dc1b11367f7f685c48ce7420d809a665c1453f296e79b385e4bea0639617c6570c25dbae76f2d202cfdfadbfedc354caff9d706a418e24bbf6b5c879277d7986c44074d26b0687c4abe329194488df0b9bba7649b7871fbd335a0e31155adc27be48bc98a06fc37bc8e270ff805ed91fa58b6c0e0831ea7058f37d7b5c370b25c6fb6250a020cb8025806fc2965a29b67597d9c1f16a2e65f51ee215c4295b7653dbb4aa9f98eabb1f1c86387a9d45ddd22d185b452f90876531d5fe42349278cbfd3a26a04781e4a146159c726bfedb2fc54e5a620f1ba85033b0735bd5e5e67061f7a256a2fe8c328e4e1e859387a36b64c0a788b68fb49d75642866c54d31d587e76e9de41db7425baab2c05b3e84303003caaa55b507ba3dd414c8135f9679f42fb2c3430eccb81733e1d048832ba8d7bbb57803f248e8a60ec053517361a2dacbc60aabe565013cd77f3e7176355b0e215c1f1dc676c2f4477f6f45e98e6ffd86256db457ca7bdaa1403ea1b11961f53a93eaf3a7489049e6d9dab948927feb06557d67d4d24ba8a4c580299acae2384a107425d6472373ed5a798002674ec2c88f33dc9478088c1564749a940728ea9c805e6c62e80703ed04c83f48df9e8068087b47875bbf58a6204ce1ccab31baa760907e650e5261ddcf74ff37ca3dc60efad0f915ad0098c79e4d9157048c32ce90769a3fb2a89a8a8b0bf26027d3fb6e8e55022ccc2016c441c4c3d6a3757cd6854485b5914c8f12633a7e9be494872f053b95d53774ac9d3b5ff5a1de7868da303798f28e36bd6540ac026406546eadb360693fa99c86538972ef5198976e95d053e399fef8f183e208487551118aabe3f69758a0d0f6c6faea62f79d23b2c208bfe44299d9a41f7371295f679c125b039c50a47a48825501c2bf4bc54564c32c6dc8be16492e966ab768fe9f58d033a8bbe162ba183e551eb92ac6016e719848c12d869c0da9b1c74460cd5e635f64f4caa4c967f6cddbfffb9f3ba0e329a472a16653cf523eb4f7f896336c138391079f8139fe2279a198152cf9375730eeed3cff424d68865cd1503b0b80ac791d71b5c3ef0d6ed3fd453eaae36957893c66278f513f523c836a4441dc926fab95269c893333fa46672b20f272422d4394cebb8e3bf88f075aba0ebc9f4864943bc5d61ce46f27d133ceac571c98070e26fd1a5d05f911175868844c90bae808f053ba38ece946a48711234cef503740e4cb1ca7f19057b3fb65eb6344584a9cd08e9bd600c739e76c206bebc15244c24867c3409390b8b37d17c433fd67c919c98dbe4cfb3e2b8b18ff44bd03e593f4af8c91322b22ba46b82be76216c2ef75c5caa83b1349fead85ca5bc8e5ec07603f2f5c943fe588594c567faafe6d0c83e2076c8dfd750a9dfef693ba3ae097283d9e6580f0aeda0990e3f67d358b41a3846a35f5cdb121ca445f097da15a7cd540949ec74796ad02cee9cac383b892fd033153e9e858d2b9aba8be334ee2976249a4a2447838d7206b31a0032205b3d7d4b9479bf8e7a1f0f73ca13f9c2c343f8a1c07394845e567432d0b7ad89efc749ee24abdab128a839f13ef70ef5cd2af827665ad9e581dab0036483d9748264688a52a803c80a10e0cfc8ed20680ad6deae18b810f0381672fadc24d4b1fefc8b82af9cfb20ac96012e998389b4d193ced1d16910b4f13c4a5e8ea98b3905a39248c96a3adc09df945f58866879c5d79e02d4737fe815c054ef0a1c30556fb1b5d6a90a8e06e1243254d047464cbe1e01199977169a9d34c37065fdb08316a3b4e091fb2862a189774c344b7ef29bae35cf0abdc23508521e7fbe170a04a5acbb5fed6e9b53d14ce25533b4978b4ba2ac3ce61e0822628c177ab6c5cec604b3d024169c9debd3bcb777e11f009f016adf54a579055335dde45602baa7ee85d8f12b2d52c175a47e8fb6cd900a09062545f17852fe19f455e766ffbec92119706f5b1c7a235ac2fc03ee6df1725c17d5143136ff18f323b01da6d3b874b16757e4befed4f1cda4da3dbd3b6d58cce4c799f6afc443a4959d70b6f986d16086051a168873b4668a5f57bd819263b54ce6779f5ecc966dfc77340136812c4f86f501a4ebf41805348a4e0809dbf874a3f22866401a438f851803f3e18a1ca6c18ae99fa07e85d0bff18df2777f1191c952dddfc2a06f8a35c4f39b11967e5966aaa414a70c635ab2ad3f9d0b11f59d508e8166539540dd10ec047aa417fb1d7113cc0ebc63880e644a17fd0a499fbbab92688253207a3da4ce0eb2f9598a1519e748979c155032d741236061de402c0a932ccc607f84cfce3306a9068b19e8bf2267a07c8f6ce6e826e4a1807fab5231b33b8580c30d32abb1ab5550761ad0ad55e3a5d0846fcbad2cd40380ae700613001831db68b42dbadbbc8700b502bc7398e2c9a7da1c2c6ed19fa368edb2b5d8a45788592c3114bbbb1d983b74de1a78193e4ca295a2b15503e147bd92c752a379759ebca9b08248b1c55864a03fd462f0d755c06718e71d4fb883c532b4bc6e31481fc2e3958add77b73c9c2e5280a872de14e851d796651635d6318185984d5cba69fc0978fc828fa3fdaa8fbf4ecc661b79665cb46adc24f8dd8e116f75273dd6338f8400bba41bec39a8ccc0014a53aa932ec26b804d8a90f32614853cb8ea46edce52fbeecb4dc55a365fa323fcb49b27a07aabbdf342eb9dfde17fe05196707edeb2aa7c8ee1b693a12b6c62f50e9323ccd69024432d79227f236b2f6a2944290e550f9331fc62216d7c3275e1e42ae4b4cfe1b00549c378d802266018fa0ee77b6ab3bd59ea48e0d884e8a45443b2a8df193b358c137b12b9f1af9570509a85133bea93d8eae0a66a4e9ce32de9f7e50e7039f9a008179667b28912c7b7557ac6ee1fa567308e5be54e18b84a34b9e854e53730a1b59f05b04e77fc362a57497f1e1b53ccb718013c23ea76d47b24f08a61f1243920a0bef1c588d3e6cd13e6a387da987dd0f289bbf1fc97ae19f6e464c778d2f1ef9c28b4779440b3fd21120b09588faf2ec274e6a5dec18d3ab78b696a37c429cd5b28847158d2579ef297a34962318f979bba326593a01ffc0114d8d070e221cc0cf2b56ba1623e1be90a69c8562423cfd6a8c678c59efdcfe8099d5990509fc8ee9d7c13a90d4d450814c28fa653f0591ce698d8f72c8a6e5da0c9650e81c4d4f72b0b34f3dd76c49674d3de5d06fd3aaa7138889ea06734370ff1f1439a0dc52899850ee30f19310034d462b52ab4cf287e5320fc614aa6f4ba02889e0d24d11452f6cd0b57ecf7e24cc2f060539b4ed07959ad3012aefd8dc542d597406e5a07e701a7e24f9c7b30956f9544f0c44b8e139b3f4b79de6405e2a94af88f8709af3bd471e5353cbc3372e75d751e799d01a132c5a4ecc02565d47aa9fc7a968ddd733f4b010a4b4016a3c7e35b503207c5eb0984793d307cad0ccc6678e35e0b3080b46e3131328101743ae4bb89b4a6d3a9af221ae72a8f9f20007865fc6e12d37ae3888bb0618982e273fc35ad063c55bd9bbcbc73b354262d27aafbf92ecf3e9770a8b63958c3be80b84d785eb8b2a7112961e5ce86830ef1fcd80514fa7d2bf740e83cb5634d8ad84357fc86b7669fc3ead8bea9a2cd975423acbf2b5e72069bc1ba1c9183dff852696fd6cb7acf340c1f069d8e1d5f1fd7261a0b96710ddd2ea887bbd21a59b0e7af718bfd358d3f8970df932886aa95a33473d6ebb80e1bf501802af116666c7231de57bb811ddf8c341736e97bfe9b35f04c74d57826c5b1bc4aa9c2bfce8060b50df9f592d84f9fef082a50963e5864897144e0056e907a380ac8a012aa68c3b0e8a7594b71597a1638a9ed8ceda0060b9b0e8438ec71cca2837f71adcd692d6a4caa172111d2876ff2c7e1231bdaf9e4cbf8827523646607cf20803a29daffaf1b2e5f82b2d0efbe8e021363513ef4db3aacdbc8555a3463913038a573268bd5538e1c857573339fbb80df3b52b6b81a233f2e797fc8ca6e99a7c66408d87cd638fb93cb66b09f552d540768b38666b309f76e685758cccd71a438162f7aa27971669f4b722bd00382299382d3b9356db16985eb3bf0a52e1ffb930927c0e39151089bb2f2293a5e8f15aa8db1cb0ecdf171baf7ae651c34bd50a1b054f658d3cd7f7aa462cb29a2d0d1d1c1ae0d5238d272c1f47317d698452e1b4e010908795160bf9ae6b89e60a8995dcfa45f67b5c12dc53e0b301e12ac8d9917d3a812ef85c8e35aae3f18bd768abf5d3838d19c7ea35d3d6a572940ce1a5f7e175c282cbf3a86dd7898f67c4047961fad06b02afe39b4430da74d6fb6d289c87b73f2011ed36b884ec49f6884cd4ab27fc8c91fccfd486e8f1f97f5c29bb57c580b323ad05e36c9f8833285d1375ff4e0260a4b46d53a8539975197321ee5b1baa740b068c9cb89ff63fe1d7eba7e6976ced9a2322eabe25c4a6ff026b60b77ca42a3aa394bcdf2b27063af107e57af43131d5604ab981f4180f33d7f9f26e44c4cd7df7fe7e9f360592bccfc99484f2ae992a02c7aadd433d32f66b2cb47e7e7fc63450ca8b6e25787a927097fb20656314331768792fa18fff6f039c15cdfb29cc13bc77b0a46e5121e556f6bb4b4223e3e54f37f454599b09245c1b73cf5ce9177c0f76c6dc07eedb980fa701865c999e8e4b53f2891320ab00c47b8e5cc44dc7524d3e21f2078561b462d47353ab672789e926d50413d8adcf8bfb3484877bb66e8809977120ce370a57a9254255c2a2175d490d7d6d69d39d90c35327699e4bf4972cd02afe1abc0c8c069797416aeea696881ad3523b3ef3d06118748c88089c6e6cb0dfc1526785cf807396837e3165d0caf9f3bbed89331a3a3a916f7c34408ae484852c27bdd4b31ec372f64187eb6804f0f0b5c6afa08738c08a8cad5a4cbb5cc10b60376123201c4ed2374b674818e9c0caee8f0b8fc2d1eaf345b75e6c3ba1f13e5d5f2fa9e3b7788de494995c059f35914a6595b3e715902de876d562968fe46b8e4a9c58cc1b6e3f297369ed5d7c3edfb441dc1f02828df9658692d3c4d5f90607bf54a4966783a5c07376f7afad63332a87d98af73b04c71f20e66b185cc28eabdeebcf74a322a01af09fe1ea8789c40b46c58f330617f8183d2e266eff22b7b34312c8a91b9aa87c51a29707cf218b6a4e9e957ab3a2d4dd3be0b680ee6505033bf7ce228442739fdf3b302f30aba165514572271884fe82e51e1b1d642df5a7bdb79615d31750027b59ebb5e69333113fedcee7afe91f71e56f0ec23a483e75d8f1e83ba2b1863c52d50b8051081ba9b3ec0eee329deed9290d4050531b02036b7b45ff5fa6e95e73941e1600731c3b3dd8dd6981341af1051482dc4c0fd28088b16c4f3cec046639167c11106f76f53098e841d000bcce37820570bb54d7a4cd6525eb9bca6dd588708148d82bb7c8fbb297e58ac879566c67dc883bbb1be9526a0f58f9ff760407115eb6fd25e0fcc02398c28ed643fde65d7dcc71f56028f5d73700db997e001a94bcdb84953c436ac353a99a737f5da345f83013f80626f8234f79cd1193a6c3c136b82c7edbb0156561b8f3e3658ee3b6cfbbd3d035ae238d91258f5bf946e664ce64a1f679a8b8d3772f20488e5d1701a890341130610dd29b0f39ab2507227f9436ffd09432723acc6417401649d120b1ca5448735dd3b8c948f1b1b90c4c34350561f82a772de705af6587715f0b69d84c6e65d6c60b0cdf0559e4aae08a048aaa749b9b369f3222568e25a35203fac6146d4d2c75f4f80f3c2915de2e6eddff21f6a1b1c5112a103b0fc394d3712c60184247b1bdcabccdfa1719e97f746232531c48d6d97af74e4af9bee9443b90d3c290106e01190ab51a7d00f3becf98a69b88bbb0252bed18da5ffe1de7bddd9871287fbfda68488462678d90e2580477a8f744d3271eb3e0956ab7c5d692953af8cee17282f5b129a084a3b95b95a706824a7f4e7db53e81c1b2593d25b71f8695b09398b5caa1af74c08f2a3094a965eb567647f137c621b3c490106954da922216ffb746869555dcdac7dfa484e487cd8943fadbaa0880ea1e7fa16e7e20dcd81aa7edaca172920225b44941ada1d07c4eef47e5607b766ec8c97cc94bae60b5d9968410cd543d3027104b2401d8c5a4cd6f2c5701ec1f2d110b49f6834423c697649ec7a0920f454d0caae7a6dccfeab5bf8aa164e82c22d7ef7190d59e82f3df12a789956d8e322316cf323d48ffeba00932f1c168f43449b76a65d263cf894d0fe337c7853d9861659e0b404453c6a08ecd5c1121ace5d3eec412a780e8f1ee50b5e2cdd7e360fc1bf8d830c95e4e1a1e8a253821e2835f3614fee7f47178041ada63f5d2652c15b11501f0179c9aa9fff513cfb8f3b905a850314ef3c46257c9ec24e0d69470b4a8b947332b66e7519ffb642d3ac4da12835148f3c652a4a061fb5352e66006d5574f3b931da56310ad8bd8a31341cc63e98b5b2fa35063f3485b66fcfbf905f6af5171729241b55b64565500a3f4e58f2b4a1df7ab08c0de6dd7d50d73d8c101af3acee68afe048190cd577e69d5d87b8b2aa318c3d3b8532f5313c15a3dfc8b51a5dd971d6ff0fe7161455ffb0634fde46e61b20fd73e1695979be7a447ce5bafa0fa5be395db6f8c8460677509219a7ef0644be40e10db1da518fdb49fc3653fc3150ffb687ab8cfae9f319959437638ce79ac75a83d1bcc6d2f897aaf066bada715cce2bff36d935ce6f862789036716c152deb337b44260d203533a5a7e57817cc3bce9b74cc7966d5ca9e51eb4537ada8766318f808ac94ff2ad7cd2aeeeb9234e8826844737b898a8ecff5ce444414e58c292d15f352c193fe6f232b4df27c9426eb428a37f279c5cdab0b64ad8c44b1cc9d58129cd52e399df22a3e2bd881d0f5be8d7c317d858ab998328a2c48e0124efbd8c6f896f34b370dd3e5ad6650c66c3f44d4109cf48e2d58c3c3c50ddd8b106fe616e69de8f83e8fbd902d6362c4cc8e06d56edb4326bf847b82823d45fba3779674a7a2e61625bf73628196a84c86bb0d9d0e065ab2303e8c22696b72127edca59466d059e8d006784df1ae1d64b9de91f0ae69d80a76fed4f6ed196a24ba08a6627007229d5352ea7b3b391bb2739f271adf9b756d0d0173f441ae3d398ad9c287fa447bc02eb0e2ee88c974b777c7457e4ad40491543ee3ef4f00024586f0f09bf555e41d07ed32ab0758572b6f153855ca02cf4d03e51c41af5b3f6eafe1b31d4c25e22261d16e690db35e0e7f391b93972ddb21c42e5897482a6b6d14cf77d268ab70684254b074f8f0d9ef8f5ca369e4e81cbdeeccf16650125f9cbb312f90f8041e7c13a02823362c4b91077d9cb095e0313bd66daf866a143b598fce71f2d4a973750d8fe8871723385426eb4de41cd9b9b5f099c19b6e3b0527384eb49546701e38481d1727118fb8dd736b7b0918d290e37531e9843f9cbf615286bb353318ecc1ff0ca96dd7211c9950b2e0d919f6862d0eb1e1690ad3eddc11ec43ad39ae22ab769a9cff6c60d133d425f1b0ef8988e61db79c572b5fe5332260d66d7e8ac9aeaddb895dc8fb6f904966a3301fc0a0b141bf383e7480070401ae519c8e9c44b3f70da8b316e2c07349d54d1ac987e0634e498a1330dfcf62907ef6aa41bb659e455c73561f3a26109e440f0873fe01f8edec265daaa131ad7137228476ffc794b5f95279dca7eeb15d677c1f844e9bfa93a4c0d71486297d8529dc9f8174db33009c9715c472ccffe16b10d8ee045877279641607396ab32aaa8b68f4cf318edc309e8de1fabd059d46a1a68502d2013d04bc09b4c4577ae4f38dd440746c894d5a173f69e231c81a3648e9e53ac522d8e6eba1181f001ff919fc4a44c69a34ae21a894d11342bae1c484fe5b8ea3d80e74599be41b55dd002ffc53ef7a41b0fabee0ef13e2d6c77dd2c873051ce6fde413352436238a3b16ba4ac1fa1eda4520afe1c8473a5fc581a8602d50406b30844a6c5d7b084eca9399769dc0d09d72f6084cdc604fdfd08af73570ed12d2e47361c2a39c77196b6d168713e66efc12f01caa6e7b406ba4958bd19268f43ea51a610dc477a84ff7eecbe2775793bab7d9d8198009eedd8553eac3e521f7b1331f14859b152ee17396f414d0b86da04b373041788db9adcb4c6626219bdfa23784a397660a59defd3f5013a86906e8f572cb447da0dc4d6fb762c60f4eb5289d62cffaf51f717d80136977284812d7131285ba2035348b8aa774a62398f73039ef6a7e65661e2c77cbf02a38faac10b973cc64c2229ef591f8b5bc40fe6c96f8a18ef97f8ca5aa635dbbd81cfc1c88abba36882b17cab3303b58669cecc3c5c39ba10759554e05acc2796b20a9819415d9d21f9c49173bbbc458d125409a5e5d65fe1eb83503108384be45af8c68d6e52f26617b1c8295b6b62142c3914c97309d0497762a135ce7b82045a5f41bc269afaae9b0eabfccf04e20362d508b226af743b3e1b3e28f55bb56f019ef2f43310a3b0bd9615c1f8a290ac0d4b62d059113e9abc1e2a77f16a4605b6d9a4107abf118f1ee725de05468a0bd84b765fbf0b2c1eaaf9f3e560d7051ff7d8109ad200a754074c6e322c6eae2646db126818a59332af5a68e21b54c94e002bb0c8e960e2b1621ed6c1507eb5dde73961c76767e5239154aef91949ce2c29abbee83b98bb11f33889679576cc843105a3d14349e2ad551caa6c0e95369fb80271aea57239e8825844ebed1c69d32e2fe363b0ea81d8b786c3c9f79207ba9ec40dab045ac0d8a203c57be8d62b573b8e49d7dedaace0dea1c51e19d615a9b36c13cd89904cca58d2c5c508fb29a86672669d6eda27388107c54da2a1fbc28dd7ebf6f05e787c894eee8ee7938be61d5199a8dd9b6fc3c45fc3db8152f397d85ff345776f3732ccde991b35b9c6613867ac5f13ff2ca49fb5e1bb0a6f4cff999a89c83b676a025c6b41532590f035bf3fa6feb8384de749dfcfe055ae2bc6eb3d6a29d78d3e8beb340fba562c1df6fa50f79cf2aa3fc7fde885f07390bdc42900db383ff5dce21533e3b089ee2e0e405c49dfcfe243581b6b5372ee59e3373cc82f9391f10ccb09468e1445193cddfee4e9a4fce2f648c34147371038f8a15207079f56e63030803332e639c5ae458f36a3a7cc1ac52b2c9c169e0796dde7ec1922989b2ba7cbfbfef7a8912fc20aa00bf517b2d424fb41019e716e0aa6af72a5e6c88539b8b344a0404bf7f85aff07826dcce741d2b3bf1cbd0c950ae602a0ab779489642bec43646073ce079257e6bb11dff6a5ef9374099e67a708d926a8b343b379be5ec8d8731740f2dee7fa2cf9fcc4f3761a51d09d84de18169021013e9490b4b02d83ac9e5aa347aead96fa059d05b0b8ea953c0e9069eae996a60a11ab146e58ad697ac70c9e65c49de015f4ff0ed4f1553f4ecb42e7e51357a6bd1bab048c88faac22cd0444ddfd20ca326695bb5d93c6c68ff47855fe2adb19aaf2f52d0ce31c23167e6a3766635f57b0b0ee2e580108bfbdbaf5b840859fc6892bac2f9850b381331a6e8269d39ef1ff2be7e25903134af69ad908c79352bad07b29b5455bf3c5ddf957c523aa4c2930d006a4b3cb7f35152be50801a215c2652010ac5f06640f2b1542f77bf125d3d9db877c4b50dff5819ed4d0f79a53655375e1de36d58b901972a0416885cf94ce6ec627e751847625564ab68906d77325ea4df2b09dcc5b0b22319c6edf2812bddac19cefc70450df5871a18ff69ac99c5774c644ba8fe7cc55892fe45088bb389e078a53ad2d67099d119aaa465b8c8da92eb158e0ee88028675ab3a98245dbd92606c3b025ea1f10bf12f4b1e1f922fb5b315e91925f249fb7307daa5a0c6097c484d91066a1c2e8b6bf8e915e41da17be0782be76d13d829fa9278c4208eeb794fbe578cf0dbb7e4d713c6565a34f3c9abcb2c48a0d8a3b0279a64a650c283826c94408ad1a59dda514366636a1166e3d7b013f127ac7e5eea9468671fc8d6fdfd6f088e6bb1d7e71122d21ed5e16663b4749a87abeed8499343bb45c5bb254da93428cbc8ec562aeac203a6f9cf41d98f77d263d72e0336e80423755715cc57b3e5ac65308d5050bbe3bb10bc54a169e844d772e0cb1191f1712a94929fc024c7239bc6c0779fb06ca6b20e65ef64c93a20afe1870bcde2c02e57938ca21a9a92823c75654f36d822d6b9ca761d24ce5597d9394c3164e5e022a41e8cb30bfac8641bf5f31994ea0c5aecc8e3bf3f07a903b378138e99ed2394ef5e3b90c0999edccd40e00ee948545a50bd6e933651ab714867d280e51c76891130d80424bdef3e3c7423f8f6710c4a405153cd62cc8ab95ce439137519d6a3a1d0f7c8a9b04c37f3794661d0e7c41700d5f93abf14ea8d54d79cfd7f07796b2e7cc8c835a2ec47c0e626346b762437b6db258d3b468b14d367eed9cac57398d5663c0855c0f722abdaf3fcabc843d30d22dd37ffcaa701f86979cfed73a35c0cd54d944964a524d44f474e614e7c9ef65c6fda55da4a79b6a43450e178eb21d389041ca1857602693ae52c1a47fee35906435e0732a946bac1d92086dceffe883699cb705e0668bd826e90e3746e77e66e691e2144dc5b8cb7ab1daf92eff3579423eaca8b8589af10365a92d775b542fc7418dc5c49b7c77a8fec81" + }, + { + "sharedSecret": "3a6b412548762f0dbccce5c7ae7bb8147d1caf9b5471c34120b30bc9c04891cc", + "encryptedMessage": "e8bc60d044af7b8686febd7b1ae04f2f30fb809233ebb730ba837bc4f06751ea7f1862ddc1535f37c6eef4789bbed4d5e34d5875d2cd2e07bd669dfb5f4c54162fa504138dabd6ebcf0db8017840c35f12a2cfb84f89cc7c8959a6d51815b1d2c5136cedec2e4106bb5f2af9a21bd0a02c40b44ded6e6a90a145850614fb1b0eef2a03389f3f2693bc8a755630fc81fff1d87a147052863a71ad5aebe8770537f333e07d841761ec448257f948540d8f26b1d5b66f86e073746106dfdbb86ac9475acf59d95ece037fba360670d924dce53aaa74262711e62a8fc9eb70cd8618fbedae22853d3053c7f10b1a6f75369d7f73c419baa7dbf9f1fc5895362dcc8b6bd60cca4943ef7143956c91992119bccbe1666a20b7de8a2ff30a46112b53a6bb79b763903ecbd1f1f74952fb1d8eb0950c504df31fe702679c23b463f82a921a2c1155802b8866064f7bad07a50da5cf31f8c3151c4c52e525fb22ecf48f8fa39bb5adf932b50c12c10be90174b37d454a3f8b284c849e86578a6182c4a7b2e47dd57d44730a1be9fec4ad07287a397e28dce4fda57e9cdfdb2eb5afdf0d38ef19d982341d18d07a556bb16c1416f480a396f278373b8fd9897023a4ac506e65cf4c306377730f9c8ca63cf47565240b59c4861e52f1dab84d938e96fb31820064d534aca05fd3d2600834fe4caea98f2a748eb8f200af77bd9fbf46141952b9ddda66ef0ebea17ea1e7bb5bce65b6e71554c56dd0d4e14f4cf74c77a150776bf31e7419756c71e7421dc22efe9cf01de9e19fc8808d5b525431b944400db121a77994518d6025711cb25a18774068bba7faaa16d8f65c91bec8768848333156dcb4a08dfbbd9fef392da3e4de13d4d74e83a7d6e46cfe530ee7a6f711e2caf8ad5461ba8177b2ef0a518baf9058ff9156e6aa7b08d938bd8d1485a787809d7b4c8aed97be880708470cd2b2cdf8e2f13428cc4b04ef1f2acbc9562f3693b948d0aa94b0e6113cafa684f8e4a67dc431dfb835726874bef1de36f273f52ee694ec46b0700f77f8538067642a552968e866a72a3f2031ad116663ac17b172b446c5bc705b84777363a9a3fdc6443c07b2f4ef58858122168d4ebbaee920cefc312e1cea870ed6e15eec046ab2073bbf08b0a3366f55cfc6ad4681a12ab0946534e7b6f90ea8992d530ec3daa6b523b3cf03101c60cadd914f30dec932c1ef4341b5a8efac3c921e203574cfe0f1f83433fddb8ccfd273f7c3cab7bc27efe3bb61fdccd5146f1185364b9b621e7fb2b74b51f5ee6be72ab6ff46a6359dc2c855e61469724c1dbeb273df9d2e1c1fb74891239c0019dc12d5c7535f7238f963b761d7102b585372cf021b64c4fc85bfb3161e59d2e298bba44cfd34d6859d9dba9dc6271e5047d525468c814f2ae438474b0a977273036da1a2292f88fcfb89574a6bdca11bb685616874e251f3ad6eec2b842b3cb8076d3746724c6d34ecb911a9169ae724e713c32ba566712b5532b7a88a9dbc39162363ad6e0822382337b7cdce1ddbb529494af8d2deb3815c7b3ffd466ff1c4cac82f3659fb1f2bc365d8cde3488250b0bac646dbfd81c5432d35a436b8a42c5e19e3e4c1d3ded2efa687cbc16ae1eead1513add578da9ed5581bc7d0175e61abd5d6e4341f6a3e3d8f9a0312d7663ee6b14e79aab0fbe3684916e8b8d47f513ffdb774f7abdd2f99d7c3c9acd8d9fe89175c78dfcead6a02eef49f16169413fb029c5218ef7712c6349e3a7596c6fc0128c409587ca39fdaf384ec496c6f01cd0283f48c4906c3dd2f4140661a31a46e6e4f2822184cb79284c42a98cba68bb72f678e3269d4f46976d87830502f99d43b67c40f8f66da84fd4a643d073421491cb799a3f0d5f74b961a4fe661c0f141e5955f9ca99c7bf862591e3aa474f1af256114c5bb24b97b8ee44bb756c30f977d4fa60be0b78aa8a345b6c1824bb0a09d6d67f0d91d028675005bfb4a4e0f644baf5ff32e3da4c4615e98ceccbdeac6e987a3c5449fee9f920ff7303c9ea0520e9d48e44066bb73cd3dc087eb17e543bc2077524ee7b6e95b3964620f84a8b977e00b9b593c2d7f01dcd7eba29f7c6abc0bdc8f287926d67abc6ab37d87b533b445d12fdf026d3e2056efd0ff5c5481bb1e66fd8b1d360fec6a6c5676895b21bdaff1fe9d34f23308a225b7a191a6c9ccb0618cb5e69aa018190f4be5e011f06b58b3e5b4b1364affa79b343b10fe6910a63cfa3e7e304966ee0186930c472c24ba5372dbe4c374443ca9dc88d6599eeb1916cda0d0b67b63b1fa97a5b38f0a1f6283e8daf48102f2ee50cd9630686f00f436ea4c839348452578c564d59460a16a175862be3dfdd487c51b171d4e239a9ffea31cb3505fe75b4f9b81a321856f5af4c429ad30c86437eb00f254a773945f1a5de8c51f129eca61b0e63128ebbb4ddeafad407c99ebd12cadd608973a48a7837814e2d6718ed9f8ab5ab793b30593aed4d885892a08c73e7c3c0ed5473d7b55da62a85da134f070386cd50c89af1cd11a1a0b2ff280c0be53ecaf5f0cc2f8da50c57ae6757800d2572470b553a49d1d5cb8b41cc04ce363848181cb5a247cfa1a46bce8ab6ddd10b36226fae755c091f66890212024e8c19c2b8271a92b8d18c70cc7de81ec47b83f1b597e2ac5d03e7223515b0f1e8dfe7636ca9bd9e9a2eae77a3bc504a35e66c08d5b0c27043870d1ddf252f26a088456968563b7d0a0e96d04e661aff46aaebac8c3661bfe17a97c5a6bce401346deb15708e8f9602b9838e410aeed248002cfa852527fcc1d7dce5280a06488e86f277d99bce31fa677d44b6c7d7ec3c551ab6c371ba13fbff114e31cbd41082d5061f0654c431f56372de0b1070748a0c97746666a48e80101578e308e6bbe2e3a46fea535092884973db577d3cd293a1aeef6cdc99411fba778be7e3e503bf3ad2418857b8276a22fdf0ef190ae60db20816be7c1456dc6ee8c79d385f5be7dae022f7db15cc69f507907340ecd0e75ab21ae62b0b006464289a7fb79177d8404995898312b652f6ea22a2450352cc1d55bd6af77396f52e6903fc5fa6e1d50287329b1ffaec80634557ac1fcbc716a73889bea2470e0103df97aa1ae2090fc0d332ed88173e4b54b02d7c1bb7a3c16103b274cec44f8ef020bd5afcb667d56ef0ce77977f4b40efb02b5fdfb862929dcc96505e3168fa8c34e93cd0f99843d578e2befe2ab4000aeb9df572d3b9c2cf21098ea66d8b3d81ed917b75bf22a66da3e00e26b543e6edb89812b6343ee84a4f01f567d0eee987bbd166df39869ff64ca98fc77eb0ac0d1e4e9ea63c3f770c380d6fabeb2bf39589fa1418c15e6e645d01abb2eb013b2ebc38991ede0ededee6d799451cddb9c02c0a0619b8f9da8c3281530bb4ab19ee633257fa64cb8491fe9a558e5362bfe45d5b7f2d40bbe48a36ed79c17a62ee60907fed4c5a46ac645ae859076798078482d2bec4e490708115871021079aa92c81d60ecc4d71edcf0da401114346d617b987090b1df0d50f90fa1442c58815be33e71e0c347dbf040b05d6fc6db890b5b9d5f6b7404ad01e89e86215d1c1f8e93f4ef7b0ee0765b45e013fcbb820881a77e0557708fb4f1e94067761edde42547e219530e318a9597a11ab0a3d6233acb9f0f020ed407b124ddb17acda308e57dc5d50a64630eb1718deb0311c7dce8c2351d0a8f39a9b0b3a341ab86684fe94154609bcc84e4efdb4cc2d4c15eedc671490f99f75e977b56be3f3dfc6df50e4cc77445805367b31b170344b84fee3028c9163f9dbc6fda471488efda354a99ff363718165854b2f707368719c64024e2968246e3184ec287437234c66bd869d22c6b8551a18bfb1b858a58ac8a7c63e6e7c2ef20d95555e1cc119ad09f8ee6004127a08998ccc73b824fef010b03b38b9ca8ed7067c9c8e3bd42a6c81b6fb43631cfa87b44b01348e0fbff84ea869d5a1378d87c612583698502485ba98b5f1059d7aaf9cbd2486f8543fcfaf23574d7ffe6c98b85030561b9cbca7b71287596411d3030cb9bd69c059edaab0cecee07221da289e4706275ce6a8f2dbb19c9167cfca293e22db33ec29e0a2d162a97312d81396e43a324e1e11dc95ade6e7af24127aadb550dc069491a9e93b550d17504006867449dcbdb25280072d13bbcdd5d682db40c3972e3d8416d4f6c3d6b451f1ef509cd046766032c205ae43e61fe37a7e858311e9bbb9a0403ad96acfed31765c532cd242c301127ebf122263f3f4de7ef9b6142895e2e8c5da39cb940106b09450621a987b9e9c60dafe6a23cb711fdd7cf730f6b3a5724a35c608e480dbc93adf999cbef4269d59fcbd78bc84bd4931edd5e42a6aa8ecffcf8ea1b15bb0dfbf77b598cb5144c077770bb5d7726961c58fa792b010af899c6520ebaf2746c823cddca893e44946c37ed920f757aed3c3392cfba1fc01a15ab9b44a379b32ee8bdc06ba368e56e6333eda3b83e4803bf8fc258de037937d7d966dc08664a36d65ee3015b279d7677af9c9e169f738d75694f73f83ebd0f27a96c25855b547ae7cc64d185bbb23dc92f2b834e229cef966bb297f72dd15a492955760bc936e8e660e27e7b2899b44af418289cfd58f50f8d21e193730b81e5dedf2b7e5629bb757ab43b80a84f5c415bad433bf2f74e4c82c697c7a4562fe1c42252cb0101e3e90c38da0c69fdf38ad52c4423ac2859c86a29edf7f7248c020d341a0624c8542c3788d973a86a7956c814816f4113675a03d86a540431c68e2f4ed612574e2766233e73305036d0fcd67802847929acfe6ed1dcc375e5738e179a98bd07e9559c589d9fa795eb71e009e81a500720ffe3404b292e52993d872b81a2bc53c31ff97cf2bb68c65ae14cf5b98468806dfdca5fb5b8cec4c7fff65d0428f66a8d78a981597bb8ad68b01dbcb10396a44681bd50826c07c67e26dd59881f9567e856ed0d4e4980302ab132060a9c6aee4f9538f6a01695b1cf3e3f66035560b2161c07f6d79f50781306cc46cd1395b7cdbce136893b7605d944965207e2d198b6193065a634954bb601fd228b6b2c90fa623004ae44ffd96c4738ff4aa0ea710173701aaccfe1f002c82f4373f9efe70f158cda9650c2c499acbabed996f256c3627874f741a3e5499a71adb53044ea63f1e94d23db0735f3d6f3430d0e9153b302ba1b1eaf8c207f52fd8163fefad2d2f70451fc7c426868ce6094764dd7d41781fa03cf677a3bb8ec0b9c8cd07b97e62b193d03e0d3c16ece08f9ce54046641b2f1cb100a336246021afff51e5e6dcacea94294aa5f23ab96d86db20b9ee2a3dcbde9072fcb72bab630db1b34033521e8468c9bcece53d31743309aae1458113d8e626d73b7dcb368fdad61add96e13407d332a9e7438e0c3cf7d9aec42d4a5258190a730de55d16ac0dc8f7ddbfd032fc6d274e7e68a84eb2591d420dc636b786c8181ac57fde397c7a1a9fb99794a9c87b82a45de5a08a6d34a46b3776ba2b543d98118f5eb5ea06a5cd8cab75ce2cd77addf106b17b8041bd9028d08b41028db4d3fc31745fa1c16c0cbc4dcddefffa21f4cb3a1df8e1032fef2380fe7c9de7d8f2994522bb245c21be41e504dc3fea95a0cbdf600c6c46298bf5f8f6ca7f44108bcedea7ab4eff132b8939852b8ac9ab4e935ee34943a1847471a238b17d6af2e9976d3a329910a0bb238fcfe56c87e5bf01f5d5f83d2213914de5d1bcd13b58cd5ceb4521bb6cbdfde68fd515abe3b5b5e6569cca85788371c794c0a614231c872639ee4cd3320a6daf443681d1880f282a47801a5c9a15ae4e29635e102d34251faf493ed1795cfcf712f66514855027b0a70c5eb7e4891835b6d1e517a04196166405e17690f0f930b5064d3fe41fa362395ed45e6138443e4e23a4becc4066e827b4c454b84f1b38e30ff908ccc8f3c7e1abff876734bba5d4899c511e5e4fed2e5ee2de96b38b5b5229382cc699c2f69b79c0b4c38e95486ada0e37b9c2c0aeb48d196672607fa90e0134db4e14467a679d69c677445ee504a4063f411d647910188f4dcdbe02fbd7fa5b50c51d4b0096db6886890e931752842822246c6550baba50174b60b889c0589c1c54fcb67c154d96c3a306d7f4f0267cdaa21d3265b637089979a532489332791137164d2d55ff5619f9431cd2b5d0b285fc4371c9d6c85a030e6d8d872a178ef9dbcc62ca50186fea69b14dc0ca5399928176867f0714201fa9c8e30cb1e063bfb65041a3fdb94460e4ef683c9068928c0236de7ae8488ff1593caf1260a03f9dcb5ba139158cd82226c8b7d647591cb787f5153629c2b918ca2b5972c874440243bd46a0afa5129a5f99c7399599c72797c7d541904c0a0d97a6f514cc87812efd291c31ce9886ae5ccdf53b8082aeed4e9deea20cacc8a554392a00a8d35ad4b33514377fd809bd49bb9655f98a46079a7371ea22dbe7c7be8b12811f7f4311f07a91db575c30c9a62ed7152eb46cf5503a0436af1ca547675a0c716a68885ade4de91434d7ad0149fac2380329f2c1a71d38a185768b0f6ffe6c1d4ac8487a8c3e6b965cde9fec1ccbe594298f8266050541ec8da5352ed7bfa20fba230efd42610fc548513e6ddddb8c5693bcae0b0f9c3f9c9ac6f03570ad2e999f8b7a88c0bbbda39a27ab85233047ec63e62f54e63351e019d65939e731e691f6f50cca778a169dfd433dc5eabde5f6931e59ab543facbed58e1c5154c45b9798752ea7577fb314358a7157e29959da92369e98ccfdc27a7fc6e572f14ca331ea3e07f4994e3ea1a061e5be4ed32c53017315e45c81c30529a1c6177549f26ba34e1ff955f04e562b1d21759c94b11a22e68abe828751aae86ff19116ce6005b533f6625abfb954133771ac294474bb8e1b0c7e16dc2cba8206cf1475b5bbee1634e6eab9abaad9b41851ab48982a143374d517c4d968f1b2aa414f1cf9d174bf2f8d4adcbd43aa47c18058992ef9f181475fea3b6b4ecb52f5e69434034903a3349ba88a388827f4ecdbdc40289e66a154395d069d50bca7d7a912ee2f0a08512b3770141e1e35e44feaa9aa82eca21336ae7c7b6c2a6c028714d7f0861957d41a758c5f1ce28ce8225e9ad9088f189f8ce8de0ffa7a816109b46712eb8d5d4a23d7fc713553b9eb167f4949790a519b07fdc29ce5d77c7a58a916e9850702d5452403c392af4fe7983562bfa033af9ff0558384d428ff7be029c379628e6be463922c324aea0421e025da62521637d48028aca64a910fcf3bd2256f0d3d11f17eae820419b25dc0dd966b3150f74adcd9e1071d253543597bd3dfb1a0258e95a379370a1d730846919b3ffac79b0db6e7f7ef2726af9afbd87de39593d8e03ad6499cf928c85711aaf07a9a4fe2191d402ba8f30c068255462916ff4275e6a7594d6f6719a2d12c8b2a86d161750c2505ce64b0d495ed2df21c78eacf1cbd67747fef2dd22ff60f20a6e620ae39a728109222bd549e4a5e4781247407f3255f2c902e4515f9278bd2e61896ed72c0fbcbabc7ae1431c2ea643b6bc777d4a17c4d96e7168749d6eb2cb8c5404505e9577d88867dcccfe67c600668dc78477fce3634c6442ff91107a384693ef139449ab2a46de4d2486a37ca63bc5e4dba63bf442f5f676e71e235bda800eafa70d448cc324d74251bd6b41634e489a36f9e5f4f57c891a194b81947cf241cb3ed8fb0ee1dacba0a6b34293c0cc07fcc3281578091d71df8414ed000766ac7841245605e4380becc5816b6e6ae61879b0968d4950ae8f49abf485307c0d145b117a2b30c5824e90c8be36ea10965e734335403c0df6305abe9f4a8b9e8eb9049ef7c1389836579a0117a50b34591cef98f9a7d684376c84ae081ca587be547599c49514314a9d180ccd90bedfd79c1ae40173567bdb5541a6bb173bee06e4bea85dd4706e7a2ef131f6db877dbf45aa0cb9627633dfa2e4bde1aed82f57cefcd9d45a0e4245ec4fbb6897df941553daa312cebc336581af7d421bd63539bbbfae63b6143d5ed52055f9ee881da94995c0ab4fa0b41b4e240a4c327d005a59f3305606842735fad6c15888d949b076a99a3de5b834d727841ed488c5d2216629d895327e151725c0f2c92385c08d3328a1ff388ca5b18069e1a1ac36d65ef3954307e65b363d1c2ba00e7fb68a5fef096e2a67c2a892b8509958c7195ffa1635c0bf4d5e07d3a394f6e1e5b669331bbc808f832f2e49051dc7354b00331cb0843645611bae648a5868880e45715cb1147b165a2dbd8e48696afd3ed35567d4ea8c66b56ad02b87ba1db05f1fe73a2a3c0e6f0ce40b6bf6c1275c393ea2aab951d9d9153db81916b08cdf156a5444b1f096d0fab9be625001d727cc36ee1d9bb26d47e115c37f477bc3d78dfa707147e2d25679f74ee09c4a23f56cbdc38f66e0005c79bea047c949aea8a1bbe6b94cbdc8949fed4b50cbe2e4c68eeb15192034c27ab79d8caf315ecec5e1b1ed840040bbff607ac8624350daed85c85c8c1d27707ad04c99fa6b0547318ee1e92a3793fa2c4035092d84839aa8d9a884e8d10b65676b3065fc627e15444dbd86148d98f2166192fef423b5e4557111303490b77b5132faa57b5c1ba28598fd5696c393d63c90dca212e17fcaf75ea2630566b15371045404ac5f874373bb3c09351fce504d00697f3faa328ce58a6418f9248f1043ac1fa3c663b76948a4047dfa638d97157a8773cac0712ca14e58a743a0491702e5c2d6d1712d98d764b15404839a7964d9cab03e8c7614ecfe0c3bfdbd06b872b10736c49277a42a2381392f93f1103403c403d1d77f372ba72d0b6b85a048fa8eaaf85906efe75da753c87c5823dfd3aa7435ffe38912d1064620c1f201b94a3ac356cc405e054e422b326a15de96a8960369ccfdc5ec16e5f065fe0a51e3eb489e3097373b64bd0818afce26633a335ff4894836eddc8e1d6ebde1fb78322516bd7aaebf914df71920f17cc04509f67912ebcef7097e5d5831425c1dc5ffd08309da7d2f2e27b45cdd9c25910079a4248e62a33c8e6527383cc49bcd9758a4ef7393111b60d3c83dc869bfcfb8bae463eb0392bd47e89791df51c56bc302278847da865f7943093a6fe28b3ee7c4ec9392d440e492a96a4a34ec1ef7632434f7455b3586879c6d38589aeef8d50042a2b8fa85c72b7bf290af59edaf1424e4ebb34ffb2f5439bd020758416fb37eb9b966233b1f08d6c32f4e04d513a036b94498187324abdbc131161506567e2d7c55868fa8de28ac99573825f581daee2b906bf363d8d9491adcf2802974073a71d7d2957ad267c11b7b5e9117172217113cc2e7eaacf9e82b676a759dc2ff3f3e2413f405ded0c6d1c73ea0b2db7faf702357918fa612e94e0d3e70043bc3b05cbd7229887701918d08b66a37e499cc62b54275f7aa14ed9082d8e9838f6007d2f9ad655bd7cb33a6f3521962f5c9c3faf91a5222bfb307f7ab02a9d0615150dfbd36110e5f4e829019f8b261642d83559c636ab76bdf3c5828f3bffd4a24473c9b8191af70ef40b6045f9e307edea165a196b070772819e861483c375cfb83614965372eeaa0a7fd271b9672ee8e894270ab8cc6fa39f38ed69e99dd5f4139df75d2d9a4b706388a461d1cb52aae8e2b9a738fa37760c4bcb61d96df00972cda775bee0467144c60be9f8457ba6950491be5bf62df0887d2ddcfd802682059e89c11d497928a9809989a4dadf9ef9c226b9ef152a0e67e87fc04b38fe1706257936d4e619b7a55ab15dbbc053e187c0614efcf5673ba7c1f1f424b63aac30ef1af08f679a1c348487921ca68a88e5f0bb36cfe4c2b95b3949c5af2f452ba0527b2225102987a8f9a6cb4a3fdc6f523b6ba41656cbd497a1f04567e232a5f7d9e5d053eebb66ec405a195ec5f65fec22951de0445f3d5684dad3073a6400cfc0d21c00e2d9c403342fa792e6a72c6a81be00751fcbafbddf6de410a315ece59d7619d86d1990c3bf6fb52f986a24b81bd29e53591fb1426c53ac71ce36d52eda88c7f49999378de70e3c1f55aa2cf2924f69e73000419588302465ddccc73ec5ea3363ed812f686847c21ce9bc0d88322ac807ad89db6cc74877dc7b0e7923cd58b1336442be71f5b1a8635a4a1d12be63ebcdee1a8b9f963122f070ef065ecdf912c4178672eac4d594b52c315aa16ebb4853614d40561462f7c76dad688dfa1254630644c527097aee776ca220eaa147ffc8a6d94999bf109c94a9ed33b067228cebf971734c701ed043f6483ac99162fdfaac60248cd93eb8282d7d04e4e0ddc46e7c43f30d22bc00a1928a54fbc623a09d0580533ce75e5d3cc5102267cfed8595ad2f0c31e118ad29af255c80f15ce6395dbdfc1cc8939298e5e9d7a98cbbc590abde537e043dd47022adc655de96bdbbf15d164576b94aa92ac0a3e6e03154f5e61ba8b390427cacd39ba4a4c946406cdb0b7cb98a3b180452aad7be31a1f88ddd28cf5de72345ed8a73d5d5fa4e3b87473e95e29d7c11f1a3c00f3e6fc0f7d43822bf2da0bad5d7505b277b16d02acffb8a20c789670310344462d30bcc78034bbd1e277b7f24ef4a23a713c25366e085caf6871efadf8121700c7f8f8ba97da0908ff5547d68476324f6077efaca4755c60c78ed0b50cf58bd8d9b1a4ac006ee95895954eb1c388a175b1a808e528d2dbea57da3bb8c04c22cd5a8949be28be727de00e60de34e924b79b8edbd736c5ef3ef05daa2844dcc93f6373921d22952150734e396f251acad39f084f36ff0f5ca30c3ef4a7e8f3a89d77c9db302443e23e2bb2a90e6abbb29132c646d97fb361fb2ba3134427300de0e8a8fdd3ccbdbdef086bc3790451519c3106906f0592fb8439ba29c43a9d589ddd56427cf2872fb9c761379ed9c00a9d4bf33e172c22e6dc9e44a1df4b3891c30868fa3832b0fb88b986673f230549842e540583c9dc463f318b3e720682ec304c7ef64c1bc5f2bb786640da6b76bcd3a42b1c579054c3e91eb3c50ba85a71967371bf2ec043e56c709e8d4a139e868fc403e4a888dd474b838ce96657b0b7bd1890825ab84453c63d3b2053fb75e6487c13718c48478c83670c4db9013d953e18604d78581c078d2cf1508c267b2f811962a4d90c69cc2a7f3839099053d31c3777e0b5f5a14d855bcb44e6dd4e419a05d668999b9a99f652798c266e681b704020867637cc410b23c51ce5425b8b61972977883d5941d8669c1f4d40056ad716af5f1ad0c42bef66a69f64569469ebcb8541971615d41b18d74d0091a8b4e9acaae451e1139569e2d619828bbf331bb21c2e868faf582af60ea5ccda9fc747ff9d8f15cb940beaa1d38a70f2a1152a18f27f300660e805e761bb5ce979deaf76660347c2475c9e9247f1a37f4c493751a34f32a0edc893e006ca04a803fe1bc0be403e7e8c472c152598d9c3026342843ba97977d075dfcf779b4c0605fe1c94da501019f2dae3dce07bc7ac7dfb8ce932e4821fc35f15ceba0345ba4709ba21671e5fc461660d63012e2583b6d684b55fabe9604458976eb3f8241b4af146a994525be9b8014dd5d110a1fb77e8e5ef877e6ee4be171aeddbcaa1f8fdf835042b23301f7b2ce759b2abf0bfe09cda39c9b4eaee643b02a1a157410ed819ad0f041daf1430343810c92bb8eb0d8fc6604333e71906baabbcc3a8e50ead55fc48387826c440fd6856f98db165fed50ad49a62ee112780d10cf5803d3641894f0d0f7cba299aa0ac68a30aa1cea2b232d0d67c3316d37c34c92a5a03c83534aca8d28cbe306cfd5c883b1c7edc86e303e401dee0fc4ffd57fbbdadd459c02bff7a2e85f23810001f2ebdc0de295794e4c1758d561e8e65c2f383cec339a70cba0809d99547788baee58cb80cdbf9ca77b39833ab5fd0fe732da76bce3a72f5661c53b1aabf68f3cfecc9083371d56b112f73fbc866f21b2200627e921c8aa456a815bf8132757c7fc65b078b205d5820acedf2930dcd38a58ee903936baf2ef394842c7cb7f7e78726e742d7bcf62e9f0157c2be27173317287b38f8bba030d0e50d9d94b783895d677491a2f845f98cdc3be6fbf6b5cbe8abb5f7383f0908f7ecc580dd5b44f5298e97e190bee191bee75e8d7a6e4ddc19e7b9fd4daa9d3385f2fa80fdf8ba2539bf228705887d64d00c03b9270949b3eebccabbe0e86bd2ae714705635f52c507edfc9c6be5a337bbf2d75e499d76ecd255b426a0aeb5fd7a9455bbe5db54cf80a8ef69bd83a3981e0f325247f7240ed05721bce6582ad9d9cd2c474d48f96f24a70b69760e8165d256dd0c99991488a78361cf54e9abda232d4aaf8f2965e2f43a1298abb573393ca01bb152844b98659252af14acf80e58eb08f2551244d56ab7ba31d3d5415cad7bab57861250b4a14673a841534251518fa1cd89d00a8a4c35ba4d14e6430959eeb8af37181985642555dcf320d6d670dd25abad5f3bf30e29ac3b521437d4a06340eb0b61d0507791c5c5c3be3d4497c73157568fdc8630b125e0e5375750116e6af9dba156d98b4f0bebdde6347ce8f8062b5e829c6c2404499e167b6b93b671d6bfb4ec7609c789c69d0a2d822e75719a50f14fcdf7d1db17c836a53a119ccbf85789db4f583381bfb4419eaf8e45ab8ca399155e51d33125a3e6e5fcf025fd785af6d08b3ecdefa607a8372fc4dfcec160ab900a0b82aab071da368faec77087b91498f6fe90c8bbedc79ec9dde5872f3c9fc5852202b95974eeecef7ddfe6793d09be01a53b464e00199364ecf71bac6e090cb8f7b547831850a120569d2f13fcfb5aac698fecb232e7476d469f21d7ae632da6cc7fe9b3056ea8e013b88618f295f2701d02268523c2cd84bcada1517ccc2fdc0ae06721901c8dce0e3d894c7ca5a7dc983a782c2ca6ff555e73043c85356939335329717e1b0d68d4d4eee5aa41b5201ef46602c994217fafee81eaff139d86dfc7acb492c29e42c3d92779f38a4e702da053cf4bb318ef17de19a2f6d04b60872f9fcbb2ed41a6348b01ae8dddfc66f45488ccbafe51ed02aa5703c4fe655cf60840fc270533aa6a42239aaad564f0e4ce23e0950903169b9e715a5e08a629b2ac4ec1ea3e7772dcb9ef4d877099735b746253f292c4d4db7ed209695a16d994c77ed414c446939c4e63fe1bc24bb0f7f35a8a75aee2c11891805c92276191ca263797aa5ce5a75a6ed5f3c1e01f149605db96ea4b787108cb87eed236a1766c9026f787e568ed1112b82e7114db5d4903bdd4e474b498a2af8c79bf447ba29a48000298f4a3e68e41f05a8c7e62850efca43ba62363cae604e991f078fe495388d6e55e9f37c94be5b2ecc75467f2d3d39c6c8d02391f1bf581bba3d8a2777153ad07869f2a0a5f2293d927950514a9f5f1179c83e4334729eee381b2300cc1bd2d462e49b0c5af5c7c53ca1268ec866a7688d552b031ccc044c21027ef735b9fa4dba0e9de615c32d0cd6c58e15978ac80dd3b940234defcd540818dbb04e866eac8081c54cc9a27be7c084f6912f04d4494c5f8e4d36851a63addd451cf5c72be7877edcd1d235989e2607c4229313db63c916ee3df15d4dbeab3b61e29a66d1c5cb2b3a930225c8fc32fa0f4777e044b74f554011c70f6f9ab4644df6da0107559b0eaab87eb249f07bda1923a16a5c0eff85f9ff42bad253712f5ff60e5837ea859936adfe32f911b3cbb3149635c6d8de7c2fb44d57cb08e355a62b46ca55b3266325d43a74cf8ef714cf515e82d63830b616b7256f8550dcde4c940ed8e31c55ce98b90034816b037db1d1ff9bb2eb88b1be4d5f4d2548ab3df6589ea38dc8d3eea285985aff8112ba9d5f23f634ea1a266e949567f33aaab3fae1ce1623610fc2f180731b4b530a78eded7c2becb835635c848d84e335d2185022a93a73a0c3677f845caaf69f3115f058ecde4964cd9b833d2717b65b27a3e263ab9577e42f1e842d96bb8a16aed64abc795e21b90330c0f0736e4c25afc6c11ed29e31e9f74486994531de3f98fcf7481938462d794886df7e84ced56692fb7d3c156befd8b26894a98b70f107acf43783301d672f67cf5e48e7cb82f367d921b47ab1357ef3b52b144e000a32ed295265df96d15ca8eb5389d24020505b2f9869bd55acd20048ae72e8cb0939ecbf1b982fec653afd17d6969eab8d4aa6e1f12d86d9d0704f5e6560b6950983ab9d81d786ab42ca0f61aa407e80c407d50e4e795107ca713f6a5a659de6c2fcd5127579d32108d2f9c362c0cd349ee86c80c30316757888cb3d021c09576b30d86ef8249d3862cf8ab592524ec13baee482c2af59190612dda905b2a9603963264ea5040ac84e96dfc29da8120813d3f894618a0777de36bba107e11c0c65c69a3c0f31c9a69d50c6e9934b54f4444d3ca670a67d7436779d813954a2099f118537bdb9707f721fdad1ad10e819019a3cd112c80ef8ef2d9fede68f227d9ed8d2d966593cafdea94aa291d3432815671381a8ba9a4c434d943f454f47c81c8381cbb25746207194fc77017af3ec8fbb17c811f1129796b4097766b6866c99b53a5b435bc5b4248c3db0fbbfbcd35301ece90175d5e7d1270a09241c8f05c9c03abf8de84049ec5c2c8480b89252b6575023d9a78909b457bca82289faaf76549405879db67ccbff40637db9a6ca520d2b27c91b36f50c4f125ac08c4a549c7c69ebd82dc5591d5aae5d256acf47787c57a5b66ccebc6d13d6bd51a331e78afc4274a25e17a5b37f5275aadf68503fdc46828ddec51eed9ef417bcb4e42f0ce4f3cb80477d15759c46e95724579df463521584704973f748b0e54add3d9f00d567dc2b94f874a7d51f6903539ab44557979224ea9b9d9d83c56e160bb1105e9ea84bdfdad273d089c1b102154861df4c9ddb18d5250b1c91956a8b216623b137485a6a1da7f85c69c5ed49d8845f8bfabca5dfb180bdbb2b90ec682185ebef93ee184e39a3821d5d750f3ef9db155532e48a1c440daced441e80116553148b3f661e54a7107cd67c82324c66ad9e6fd9918c3895991d8ea09dbebeea2edc12b79c8da5d38efa0befa4fb3fb50e5d6ca61fa990ec841d63009a1d1baa96dc8d81837bfd9a3d1396c2b18b1a0113d4e1a3147ac4cd05b1d4f8f4b6747c193e6a0f7e489d8be29e3e3eb49363382ed9ec3a97cfef334a95bab2af8dc4b38ac5b06f055ee3e5c6151d996cd66bc02be37e3c767ee17227be2128c21859fb169b1c749e09449be931ffdbe3aab9110f21537afafbed49a29c70fe40aecc36f234c392679c1f75d1464146af788b7cf555dbcac316c17c9d47583c025354fd9e827281b6f11d2b655fc483fc88d5925942c6cc5909e9e0d168717ce35e7503a0db17211d2bc49304c18cee8233a7404aeb6e3bbc36ce183892a3a0c26ed1ff20cbdd87d58cbb1391a70c98a7118af062a15d95b7d5fe450bb2166086a95fa05b37417477d8fbc99ab449080607915288db911500764fdb7bd66c256b106fbcf519b4b516e50ffbfb138d304e7b85e954ca112e4a67c96a7c87921423cfe3a6fb8f43e6df9c978b2bf5e11088cda07bb5e55007341fe6a2c0b45652a551caa5c2157bf4c8f1861952033569d33ab2ec9a787ee62cbfefcee383f1f1683014570ee7aa417658ceeec19b64018d12d6ea2322fadbd90b76a20a84feac27c61046361ff392a4a8120213bf21b56fc603fd65aa549357fa1000211a349455f46620da65547c6988f52109238c20fff5e8c27cff78465c1dd86cc23cbacdf339bba0810f84f0160a5ac65630361951bdda999f6b0a2408e26b15f59e4e64c659cafcb374582d3b4d97e33683a1c3d3a590ccd9bbfd42975cc36864cc5170a66fb8b1c536db378cbad9661ad3090fc34da5b32ed52174c9ea2919900cc45cce0666e836b4cdecdad0b5e437157ea08148de4629ba68c5736cf986d1fb0aa5ff9d65e0d4270f52af60ed848b92f2d8eb9021a24a8b3ecd41b53384b735b8d3f4376ff84e8ac858c4e132cc831e1b7ef837991105f2a7dca904399699d6abe61da19ac4cd8aac031582bf459ec8b12d2b715a37345f777bbeb4c4a9d6a5198cae6221c8aebae263b88ca26e4d924fe19fabc4e7d3ef3e55aa44fb8357e894ec44b59e3d65618a5437e43c49a68f770482ebe5bffe6fd37729523e6a46378129375620a9f44c14bb4b738da20b8d5fec69219a15d6491e4788c34437a02202fb64cc5c2fd451c75cb96cc07a3eb5c601e4781269e6cf6ea452887cd42b79bf5900337aa3da6c4cca1c63ed07642effe016c1d1b62d615ac50b9c9e0fde309c495af752586b70bbd993e00d1729bd178620ff527b9324d08a6e0bbaacb8f920b1cf61d02f02d85e22c2441ac4733058ec9a6ac2284c3bf63253f9cd8a656e27054954ea9af0ebfd6d8bc91abe0a4ec779b5858e0d6c5c1f2d0f8053c64142280be4c25fda606f06eaf7250b7519db8df2c223bc86d18db25368678a78580cdf870c645105dc5bd8c12df024bd1afdefa70cb32e74e037d8b02adeabdacd2dff6c90d1448241a651fffee0f9bf7fab47f6cb5c0dbd2a8c410527ce95dd350ca8655bb5249b8915a81dec693d1e43c797f1c2db10b0cf633f44ea8f15f8745656bf97636319defabcd02388200e674c2bbb12154fbe7272d50eccaff38618a449350c67e369983c343216a65658888cbab5dbfb462c60e46cf066ef637aaeb918852503ecff049e1986ab2e666ff2594efc20e1b5e6ba8624c410367a67aae38e7a7a0cc93d36f89e1ac27ff565e5a52169ce5348b305b519eabf3411f67f9e68ad4a7b97db1a25c2fc0f59084de6226a74c5732d0de281b42517dea495306379b80f8693678691d9bcc6cb73279186fdf9f8bc8fb0356de6cd985307766591ab580c4513700fc463be627e34c11ab4a87450b6cf42f6237f22d12622beb85d5b643e86e135465e4035e4277cd4bf5d09c38aa957a450f0527b1f8e49488a2910abcb8f1274ca9e8890b0ff4ebb1b449db19a227698a50d59c18c65d2781313d461a8855415b5d0f0c13d25aee83f649bde66670b9c81011dfad8297bba18f2fb027ead18cc7eb50f345e5729eb69a8274b277d38238fd22bf2888abaaf41b0dc69fb1ceab59780836487b32e395f83457e594b6e62283b356d914b29d6fc1ba276650ab0e82e0441ddad7d878aac95d8f5ba9b91c1449e9c5050b1fce8b946a0ca9fcb44202375519ca4776cf78402c3c476be69bc058f4bf5582b4c7fcc9b38168b6b0473c7233ccc9137949e7775ec8a058b03cec714979517883a9683f1f727814044f731f0818164aeb85959078ab17b831675e5cfd580f5ef63cbcdd47abd93158a70c92b16822e746305319783a627a1a1e73a7e6940a67defa51e7eb59cf864d8a46b2a9aca0a8175d43db9011115d8b20300ee59dcaccc9064d6773c0db472e210c666baf7ace2880c648fa4ac80896ca41ecd98d65d95a9a9b8d0e606e61a46f3ac3490e0a6cf90123ba5114177c4e429c9368cde8f164cfab0e83873550867a98aa116e07379e836f252d221f7e442b367790eca0a0fd14ea3d7e0bc4f8d4bb74549291eae58f00c2644023c666aa67244b74ef4a43fb93cccc99118644d452f134c945329eb1c24f5a6262a539a08398fd6cc9141a39bed3c2d7331999e8ad9996c45999571465f7160d5d784b56bc520c16ea12b6114b83a6ee92772268888f02b1b4fda774820dbb6bf97318ca7d2164dec67a85e8e4f0899a121432a7a71a2d20e16de675d0be5567c865c811e5ce11c51c21e7a37cac741eeead3ebfa80ec5d0db69b57fba7352bc982563749e9301a2b5eff01520883cdc5b1aefbf1e426053cf28e392f80536a5cdfb4afc2012dfb0207d7a7959d7c133ca7a63d3ef19c72bb576dd8161aef0fe7a0c46de5e53732d3759aaf4a0cb0ee2463715e3c87f04e55a69fcd78937a82bb3d783b8e8c2d69d2b0a2d2ec5518c0c7dee59c835e06357843b80ae85c79b06b62ebf0ad4119fcf88af77cb38dfb4504653c367ab3436448542f069a940ee8f1e8d5346a75f539e31dee583d9766ce6e36fc2bfdea8a20a876feb8653b0795bf84cedbb542b62975c05445e9c409b8ca149259afc71400d200ca85950766d9512d70a12809323c5ec1b95b85b08a0bfdddcc9424e60bd2547e3fe5ad5c244c0526ce46aa013f8f55bda77f683c357378f0846f2db1c3afcea165c5e5384ef2fdd6a0c0e517167f3a6fbd24fbdb1b7b4512e3e66b812626cea276eea6eac9bbb1ac061cd3985cb250b150d85c30da3e312fda460ddae19883018db530e96f38536a346f700f52d9f833d40d0292a178a95f4a3675a8a0130a17ac99669cd037bbf9794b108de123a0262a3a9df0532dfbb625dc04593aaadc82eb78fe8d062ecf1cf00c1504e957506c9d00d6ae9e67cc23890f52d6c16e5081f24b849ac62d2230276b2d1e623b960d938618f08c8998d7d986d9bb26cdec89f335ea09f8f349d04f63e069d63e1f6b05ddc13a4d9f0276dcc44ef17980dc635ce1e715910d7cc6270dbb086e16ac070d3beaaa94bc63cb7715588af706febc4da0d0c93b681c3351818f7674252ecb38a25c9a712eda88d3a7a9266c4a6f4dea84ad8ffa231e78d75b7b8add68e3f99da9db3ddac5966805e269507f8d2f921b05712a72b9088a4d0bf47aa7aa45528de71dec2e0359834ebef63e887406bc7748145ff12209c635f449389d2fd7391ff8f031bd118a3af91410dfbc844ffbb38e18327c712822ceb85919bc2c719b22917a610d0d6264970d73ce63ddfd3ac6e26933f1eee7f9d0791772bd0c31704eb42" + }, + { + "sharedSecret": "a6519e98832a0b179f62123b3567c106db99ee37bef036e783263602f3488fae", + "encryptedMessage": "e7aca8bf4139f65f977604e3f4a593f2cb031f7b9a711107e6c19691d0c5060a375d0d39d6920d2e08d72d59cee7827bccbacd62aeaee61e9e59a630c4c77cf383cb37b07413aa4de2f2fbf5b40ae40a91a8f4c6d74aeacef1bb1be4ecbc26ec2c824d2bc45db4b9098e732a769788f1cff3f5b41b0d25c132d40dc5ad045ef0043b15332ca3c5a09de2cdb17455a0f82a8f20da08346282823dab062cdbd2111e238528141d69de13de6d83994fbc711e3e269df63a12d3a4177c5c149150eb4dc2f589cd8acabcddba14dec3b0dada12d663b36176cd3c257c5460bab93981ad99f58660efa9b31d7e63b39915329695b3fa60e0a3bdb93e7e29a54ca6a8f360d3848866198f9c3da3ba958e7730847fe1e6478ce8597848d3412b4ae48b06e05ba9a104e648f6eaf183226b5f63ed2e68f77f7e38711b393766a6fab7921b03eb2a6bddfc370eb45c1699c856969e2d574fdd155945ed727fdf2aec4f056a4d49fdefc3abafe41c365a5bd14fd486d6b5e2f24199319e7813e02e798877ffe31a70ae2398d9e31b9e3727e6c1a3c0d995c67d37bb6e72e9660aaaa9232670f382add2edd468927e3303b6142672546997fe105583e7c5a3c4c2b599731308b5416e6c9a3f3ba55b181ad0439d3535356108b059f2cb8742eed7a58d4eba9fe79eaa77c34b12aff1abdaea93197aabd0e74cb271269ca464b3b06aef1d6573df5e1224179616036b368677f26479376681b772d3760e871d99efd34cca5cd6beca95190d967da820b21e5bec60082ea46d776b0517488c84f26d12873912d1f68fafd67bcf4c298e43cfa754959780682a2db0f75f95f0598c0d04fd014c50e4beb86a9e37d95f2bba7e5065ae052dc306555bca203d104c44a538b438c9762de299e1c4ad30d5b4a6460a76484661fc907682af202cd69b9a4473813b2fdc1142f1403a49b7e69a650b7cde9ff133997dcc6d43f049ecac5fce097a21e2bce49c810346426585e3a5a18569b4cddd5ff6bdec66d0b69fcbc5ab3b137b34cc8aefb8b850a764df0e685c81c326611d901c392a519866e132bbb73234f6a358ba284fbafb21aa3605cacbaf9d0c901390a98b7a7dac9d4f0b405f7291c88b2ff45874241c90ac6c5fc895a440453c344d3a365cb929f9c91b9e39cb98b142444aae03a6ae8284c77eb04b0a163813d4c21883df3c0f398f47bf127b5525f222107a2d8fe55289f0cfd3f4bbad6c5387b0594ef8a966afc9e804ccaf75fe39f35c6446f7ee076d433f2f8a44dba1515acc78e589fa8c71b0a006fe14feebd51d0e0aa4e51110d16759eee86192eee90b34432130f387e0ccd2ee71023f1f641cddb571c690107e08f592039fe36d81336a421e89378f351e633932a2f5f697d25b620ffb8e84bb6478e9bd229bf3b164b48d754ae97bd23f319e3c56b3bcdaaeb3bd7fc0369b609e1970c91ffda6af9926467f10b99bb97cca2154c464eddb54c54e3f099baea97dcdfa0a0836de9a5b764cbbf397ef3f7bf3b9b5e040ef05e8e18d5903a7def13f4ea94b38ed64b5aefdc94bc022165571fe00abb52ebc4163e0f8efc206c379f7b32fceae158063177613c892fe6a664cf0a0977f2d4238d4d68dcd2790ca88bfea6bcdb62eac3a824707449f32e474e88da9cd3639d4d243f216b09406fba410ee0d957ad0e00cf699aafcb7d9be2975355280f6b103cbb5c919cb0b2c792fd168be7b8a4a843012e184d1cd8e48fd544f984e51f8cdfe89005e8e0247d858740ad0641877cb00a06545a3699830030b0543019e9584254b3fb2e671fa804746f40ea4cbac6843d700d38a62d1483f1bd8d29f254f707c5c741ff815062fcf4529a9f85b6ffdbcb54ceee008e12b49dbc8f25a187896b61e603689fc465f5d8db27a0a56cd1199cae206cd9903722a6c82ee2896071f9dfb1b41b6a1aca1e48e2cc8f14045781c21fc0b6fd62b4a7c51c702d599c85951204a93032fc19ddc90f8f2e95b93d97ecc8de8056b64fbf96a15651fccb54bfc55c8679500c8e9e6a32c38f6d0737c8404c07ce396c1d0406dbe2b6ff7f46daf74d37c258201a0eaf529110d9239d31afea4d5a4e5724725118445bd57fa8684c5d35bca74aaea6f9eedbd41a2c191f1dd977ed574d6ed418ad6fa2d192551df732f04f21d33d34b503367a0e36828ce5b1e64d4c9a8122f829bda3ca60b8800f927f7e0f3b29de75e1ed381ce972023e7024705bcf96c342c1cd790e974dc75c4bfdebde3b0cd14e19dc94dc17e6e775d30651b17f9b292bfb34f11f373eb4b5dac9b727b3b27d4d1e70473d5002bb8215232110d6a947b72330eeeff749a28fe0f3d0a62f10d8c3487436616650215e83aa5fbc3ed0c3619edba63cdd9cc49634a9d5613c17a04927adf3f79fb6819b07fd32270ec357d9fe5bf737c033040707336074075be57f435fb1cf817bc818a27d84053eb602f98495b74a78f9917558f84e7531a1413c11f1631e1f498f1f7b495c0c3a4b05fa05016e878ca5ff6db7526d5a370b8b66d4c5090fbe957b65ed9c1ebc17f222c2fae4453fb230fe671c03ca56baee3dec4fdec1fe95c6fc03d8a3846229c0550aa6cdb61bcd9b72a2e3c44cd4800353fc19f6ed43064ff56fb5a266ecbe828a678a55f20f35d044e598d5fe701214f542a726574f2279563696456405ce03d27b7da409190aeac491ed1084f10f9ae36fc80f79d9494cfa5f5ddd2a93ececa1d1044b025921a3dcbff008b1e52a5717ec22510e0a522bac12987b6ab53e24f3029a9a92d59ea6013eec07e73dc6be4b8e2c4697315db8cd20b31a32d1a8f15802f90fe321083da241b899f0b6762df58f8f54a0da540e13b4771b6c553d4f7a93daa5186eaa1e5ab4fcf2f041e6d8899979d62e88f7bbb71578807ac402c6085904ff7073c9c26b95aa2ed02a1f2ddb6c018147754ed0b00caf6877c079ef9c725b3847b5c29fd79c4fef870251ff0c364853061c48667ebcd0cc1bc7b287a70c1f9a6e24e3133918838ffff63b37eed1cc4d85c3afebd3a79dbff699691d68bdd9a9d996e6373cd90d5e4f26bfd32dd18e53fc6df1fab0ccfc91095f57b8f74de8276821d0b2b6792334d3fe7927f38aa003e570c0f66cf6036e07d5dbeb4af08e5d0781066fb34163e8a9244b779bd37f76a017aea7d0df196f9cb2858c957bcfd497ac37e50fc133ec5f1330cd80afac73df933f537fe38edad618c0797e11db0782fd5e9a099576e08aded39faab62d795958e88636ee9cc90efdc0b3d6e97ba3f4d851ebc1f87d524bfb93e5ea6d50d7d82d36b09b652a25bda4b766277c800944b62fefe6c95b24c9fac40bc16e32b6bb84549a9b7b72947de931738e6004fd46fc368ea19aed840ef639c5c1876f6b9adad84f36bdea8fd27d25928e0c7033908895c7f10d93b8d82e0d8db97a999e5a35ca41f67a1ec7e309da9b2cc27bef366de059e65ab5eda1737b434e3af747c1889952afea0b79feaf67211e726b7d5bb84e78b3160ed1da344cf48b505e409b67da6a2cb89f9dfc1a00eced3c28032b588fed8ca13f3ba9d25e6f016e148d6da053caa2fe4af33d4a80bc73db99f6f2c1f4fdeb8be0a77aadd973da21f3a60fcbd3d81fe8fd0ae647aca00d753c93b8f03c32de229546910d323beb0c16678a5b8c1eb7f9c9d5d43edbaeeb8b9128a8c043c62def879300be198dfac9e3ccef3dfe82706db191e34b295384b926562b122dabf08656bd6fd4d7d43e7216628b90e72ff5806ca03b80c461ac6fd986ff66283c0c5222c2b35acdada8c014c8207aa34a564161d7720abc854cc59c0b4b412c836ade631e69b300d4ca0d39465d934abb9dd7ea9cdccbb00c67fac96417616ffed4633560fc8fbaff2a372bd25e62888cb67c93e72a272ebde77d2eced7b0f01cfd583bf5cf4f7dff092bc75c38ef280331b82e3774f1c17f2f68f749f82707c6f57c134fb77fd32ace3c4fb4aa23a5916e7f9f68c106a44eb3f9a6c4abe08617ad92391daafbd2842bb61cd6d140260f232a5e6fdf0d138fb7f11533a4f2da7e9c9a60ae483ca16c1c89c9fc1e31f09344c4d4ce3acd6165c0adbfb4f2953ce09153ba129fc54ac00b1ae8644465ad56550f1a95617eaa6177de9e40ba5ff2404c567a44dbf6a43717d64ac778f7448c2e5a589ca3d8720ba33318566067e69c15281f72ed418458cea5cda7b86e8ea6308999129ac8c749fbc7e3be7b58c1b64e447c0a54b61ccbe5b6d7842a22639b77ce44fb5d596f17ee349df63837118deea60e70469372333688f934e016479e2aa3f7c3bacf2ace88456184f77ec4a0276f16ac41a1dbfdc6a71e4563192333ca2ccd9a6b3903d5641b5afb9cc857bc34ae0800016a9ccb97b62441664a3868688a4a9e0b8727b99333b879983a9b9399ada421782c29f48e09c0955b077323698903855cf2eb572865f46552a085e6a85b857237156d6b78f8f7abc83b9f9f4ae4d63607cf4bb6068311d5f76e6ec0c79729611a9a96dad548273209e3f3dce5c2a102f79dc3002dde21d8a5fa25d1ccfbb9dad9160aefbcce740420c63945f24d173dda5980936ecace0e88c974a851ef3232fda1c77272983896df5db9f0746a806127ab5745c1ca54c975dda42befe3d78c25f5bd830799ba9d8159af96fcebb4f1d312c42088ff23141d08f8636696ccf11b5e74823665ad8d830f4c7d831e9c860b76da0a447d3db72e309d6a5d10bdc3d46b848abc1b4243cfbbe097c20fd9c1365de7e5fae69b1fe61c77fcd5c9a618a4b79533df5087ace0765fb8175223e2e5af3b254d38452464d58ab1c13b3b808bc2a1c137207e3b178689d7e250babf2b96eaefda98ec732a76011ab1bfbfedfacf81916f207db17190733cca0882c62af49935ef012dde49ba4cf616d9d87e36ff4e12e9c839b5f855b35a685f0bfff1cdc3c59cdc29d81044accdab105d377d1f970fe6014b4a8cce7cf728cdae51cd9fd4295eba0ff669602dcfd85a8b8434ccf773a54cc1f225ddcf10954ff54229f7a0c49fc2fe1aa11852e217caac3579137e7920a867cfdd368a61c90b59f5a75235474ae09709fad1a3ff3f83fddd3e484329caffac5e405684d64b593a9447afe6f1e01063dfcce50d7b32f070a7631e03dd84da1111b2c2ee13004b8d3e082fd3215968e5ab16c2cc339a39920623a07080b2fa298d546d8aca6b70be6d13f3bc04ae3dd7377a093643f27557f5d09708459bdedf0efb9c804795e6c09e686432f2ca563e1734ce1e2de5822f6b9b387fa304fcb59c98728de38252eb81727d7206fbaa190336c09fb1b973f0cea944dd37f35958db559dd3ba24b849f958221637fa5ff64de98efb70c6c197dca5c9232e80196b077b5e70baa58616a312a093d926ad658d2991e07faaaebece4c846fd5ace0d3ce8b3a8218c89c9c8026671cfc60eef4809796bc3159ff25369dd96e70bdad2f5e304a3ad25b9587664e963a8fe4ff2840d1bf2cf2b61c1569275898aee815037c552f6bc5ef457c35cc06675c7e0dd73e3f496c20755341dd16fb68676beb03c033fdbb1903da5c44fc8c3dad006051138c166891665a2117e382ade1715929dd19b4e7b6542f5a982b69e055834fb3769069025a33fab0012276b95b02c2833218684d4cd8ab632fc7e0b99b1c5f1e7d138e27630564bcde63eb006c6409183cadf89b7250d0fb14534bd77d4fe345a135de6f4d6c25699f7e653fceecfc81b477f4d9154586c08508e2ca6cd25c919a8baaac2da9e4b2bb406963b97eefd1c44a82c67507d9b6a3c92ded6eeaf8c15d1ed3e478e07507e30311824ff1ca6e65b17fe87731687dec0cdba549ba3be400f59cded80b861b32fd5e9be2275eb3b612d7ed260e85316377d659c6b2363ac9998d0af999ad89cc2e35eccb276d778319eb426965f0c127b1321d3943c10ba1d9857a5094e4b0b5fcdbb90d3cc0333ba5c3c89be312b77c00f0ff7ef2289304f006a5b7450f84763b1667f13909b7878e470daad9263997c35caa31e78fb8ba0ed8704cee004e5c138da11827dfee62461b1b0c5dc552b3888c6532496feeda8cb399db1e0e5736af958bc9d214d2de4a9248fcfb358bed0555224b1d993580da2ce5cfccc03fef106fb38aefad46b9c97e92e583d23ee642a2a89050bff1067fccc09a4145932d0d482974bd3117f22029da34b6eb797622c5e76eb6f7765603d872986c8afe236c8f7813968779c4cc7c8cd3bef7fa51b0c72cea1fe977306fda4c5d48471b759dca4450ddfc5827af7a72229a6f35c571f2225a38567af5d60ecf8e514f9ad4073addec701c7633bace97db12e06527bbfafe15b17d0bac90f7858d113c2d553a53c30f7aa32fa7b4740c1e9ca6f80eae49510373ee76b2190516ccaa6caca7a57129268be869885e3fd025d035efaebf6431f1f33459c191dda66a35b8b72dfeb8367e87682e16e9dc4bb14407f913ce2c27a149ff717756d7dfe5511e3e14ac77c625b36f7c3658fccd896b0e579f526d001f6eb284765cd4237bdce6027f413772f8a611810d18c377248c220ec99e8cdb7ae020c40e9d970752d8bfd3d4645e5b75dd3f067f698e7341c1e859d4383a6347aa4c4cdc11753ac5a088f5998c118daedbff6be7887911de0e3e176c4c0feb1a461a003f839e8fcf42f7e116328ef02a6dfde52163d14114dde438c16b75b4fa5cb2c09e01c0662dc22b4e2e51c2206933deea8e89f7104827f8916129a033a0709c8688756c03367e7e1711cf461863e20f254d37fc94806048e04280732d3a8960d7ddff8ff2324454cb09c397e7ef5410335a81d7dc8ba44cb04d74f50e0c51c0f006dfd87b1059fae2a4a9d5a41fecdc16bd16643e75a91b54ef88cf66ce4c02a05cc0241c83318e137dc11e2f1e3bcea71690b541b086845047d1837bcab3ac0c92b5cf01cf98d506b519d2065164f2e5ac08f71e6d27a81801e0cc4f7d3a0f8ea40d4a1a0b428eaf3ce78f9e7ded31545931d01c2ee67ef8682686f2926992d00d13796c7e608b7821b7f94e70531719224f6c58d1ced60eb2fabf055bfd5f802533e58b82e146237596207eca421c05b8e7adcdc2c8ee01017fe72ac99d81f774ec97d9d6209c5268fa5abb6d99ee9672e5a361dba023e13783b8d509764533a34291a273116bd695fa22b30ac748e904c4591f640e3780ef063b30e071c048c8b41f03965642fef2cd310662c9924a2bd4d9792035f6f5fb7998abf00c3a6fbfd352bd1a967ca5a9905435d35d4de0c55e9813e9d34ba24eddf5ed059468ece513d17fe39f45c22120c9f9aa4f3a1fc2e659c2827db411ccb1244b205700558d89de4a87441fdb80e77e7c725443384519408d0eafb4e789d20524377720f6384bdc93633cc3a633b187ccf6512f96fe27a67d14ed5ecd8c73a739179dea157aa601a9f68d36d031b6f23a6cbfe2dd80fc7d51def94a55e1592d3512034892c1b4c4146f8464e1f6616bcbdb43c0c4fee0235109e31960e69459972a727db158ccf85a572880bf10c6a034d67c34cbcb0081a1ce368b1686f5967ddbbec7df93f39ebf5d3ad1b9e8eb42ae3dfab663c62aea3a4ef384207bfa1956b369c10b8b5fcb5d007c2e7ac2b6ed4d60e323399efd6e48d2086d2399e1789d49e7580cbe167a0be3b7fbd6fcfa6a2122dcd327ae7c33cb22d5326992b1336303651ea3b3004a74b8aa168046f94232cfab08a618613cc3215f2dfff680bde8c4460b99e28187752e2c82d8cdeed5d522440bffcb51c5cf6415d79995e25c92c208c2a3e6ef5ffdbe4cf0e40951669cca70cd611905b6c3446095b2b602fa1e4d5169ab307a629d918434f703c6199f2468a1c97e71df09cf6d704f1238e715f470ff11f4c03060d56208337a9a64172127d17a439c958e611d0d2bca4062e857bc00a703312845e91b9c939940972b572d8852003811ca01f7956c51fa352b02608355daa19b4fc123eac610b3592c9625f31b22a10bf3cb8a5b6d7716f555d10d1d6098f3d9d919158f735d5e6b1829ab7218b3416bb7c0ca4f8f5aab38fa44bea3ea4133fba90bce8cfaa6dc3c09db114ef8565042bb044fb3563a1bb9441c2d822fdc1c9948c434a037e4879cfe09ff047f6298bc364888948563ad034f24fe84b19b2aefec4fc97de5e0d94694affc3f400c43394119a07306cb6240a2555738e33d9fe862856ad6a3a41fbb26379de05b79321e0665c189fc6f47e5d535fbfd86d73c66cbe2c4167a2088018e62464d02a4d3c533af942c35bfed8b2ca6d84ab743c4b63cdc094f6b51e3c7e53b5eb3bde3cf8e9444a1f6d7fc1412a12ad88b0919ba02f4899832cc94f178f5a9242d31f33d6b0c16a905081d9edae79853eb4796f8f0775daf6ed9c01b6291bc96171ad56bac7a5ff518e10a7d8100b82d0283d980ab0ccb8847d6696b8df606c5b686d18066b8523b56c62003a6b81963f284c6dc9abb5258e2d496b3747f623b36e97f92cdd72ae8d59d86c5800d36952dff856ee63bddcd0363cf82ad6ac93f4d42bc59e923d6923b7fe78e749f830a59077cef7aa026d56150b39835e5c87c50ddcfd63358e05b32bdae99fd3809539d81385db105fb18aa11e247b76707820e8fc4fb8352473452c1e6f4602ae49e9f2dcebb29e7e9c9bef8042aa7b8af45fd573febe52b0d6423cb0abc0856de139e0bfe15a53738404be519dd05861a8dfd98dceabc25bb5955300bbad42ca842e1c4a3cb17ddde082138da80e1143d783fd7e34567b2bbd6d5026d0dc08ae13b1e90662df583d92fe6f7523ac3d549a864495d145a86aa4d52f05ce4bacfab03709408fba688aff821121954393a38dbfa36dd275a98ff0b85f02f8b7215d0df4f01f3e740902314dcdd0c77e5110bd20351b5edd384dd53f43e34f5c5901e4d2f9c66b068c989aa0067a9daa3d991b4a994202061e871666ca5739ba50c259d822fc9b5d8789c04b485efb789fefb5ed53ef7ed5da3bd5eefa77a230d86f034921dfea9419066cfc7aadb5249083321915ee736b331f21c8bf9dd7c8d9fb0f9a3b9dd7f02b02ead5590b69c98850dfa5b9a8ff192cdad990959c7fd74bf4012c8bc80011a9d4fe072c6a0e5c078a0d755edc5aa69093f014f16ab789f89aa130f3a8b4964bda83e468c9ef25089cae52172e0eb6eebc64d377de1193b4509cfa1bae6ca72d037ae0a26521dfecf6c36df053d634a504ca371ca4e0431a5db9491c52e77fe87c30080eb791a51f6ab3025f1e7b3b04c6df9d31f9b63e0b23403e070ef4919215a89447fffe975024a43a888d6e19d8485fff78eea6f052b98cf93bb757e087d6bba8190e30f36dcce0238d41e1c6baad9993aadf0bef321c13a7439272fe9298214e5441978fa932c03a483957cfb61f00ed5011f42b2119070efc31fb66d286fabc240e51389fc8d7a78f384652b396f1f7cc05bb92889fceb0b1583bb4ffff7d9116d246e9a0023846f5b1da0678ee4a04c685ba4b192d17c5e719f1544b59c42ecea01254bcafe89f2e39731239b7f80f3f889eeba5c8b1a85b9580d40f09921cf90648c6d6aa2c6d4b839565105daa6aa904e5cd2121e9fd3dfc204d77ff3c2ed2ebf6e6fc844eee6783c35683f2ded3e49b60bf2ea8717c8ee45694cb6601f551f387b9c1c5035d6c03aeba220bbadd6168174f7efae4bf363a9a25387469339ebc2536c24af1dd02019aaad1d05994e13a2038268dddee84d0dc8854c61f5a5905442df8a417e43b6d47c8e657cf47d11d5720d7f2ba5c98421ddd9b6e5ef614cebbec8b1bba13f3dd29bf7a5a46029c06d72518a865c7a7417c73074db07f27cb20be4e93f92d4949e02e54dac0182d11ac383a9ed5f092de485e4dfe0a2cf7ccf6c5a7d2230ff5190bd794d631e4ac364d7dfa78836a7e33b3cef58cf3e3cdbdcda75474556464dd137d61d1fd77f830a3ce20e0a08ed57998b28350fc5175922578b1b0aaf851cee1aefcd16f0bf2373f7b2da469d954de07f30b8e704fa52a4b8c1b23ed4a502f2683048b8cd8c5d9a0c5ca764eb84605e294425dfccc68f9eb84a98089cefc85a7a817a73a294c96692a8ccc8c33f72520c54407825005a0d43eeff6a9995ac16e19274481846b41f6edf0e05cf2f5228b33f738112b69ccae3cfdb1abc0bcae5d6e5e512c1b911c283258d4f606b3d27d93e27c736f16e76801a2312cd718d63150e5334307aaa374c8475437dec335f002d62aab917f51e57544905464563fe5bfdc708334896c2925072f45f5d9573d103893f99e10c193072a182157e1989a44a11c66a5a97caa41ac7eecaaedb10b57bad412c45777a64b26bdb232ef42f79e19b3b893d5ad2e67c5bcdeb535dc29347f09a344becd821e09a183c8ca2f566b164f879cb1143e26854515c082904315ce727fe02d568a7878d00ea1573ec6a8cba14c94cb23bf598b4ad0f79a4657c1e70f06789b276ebb6f8d9966a6a9c150af2ee9c702bbbc6f2412886ec202fd1b91a35e86e45bc59774be38ac4bccb0e6f21f862421f9097570520a10629923d17c4f75e6deb27f7ffb6d22aa102bed0fc3e77007a2f7df6947cafca8a264322bcb2d71b7ae38fa9ade94547ca66f931601b71f541b781db8d17ca3f3125aa8c2b942bf4958ae1c199bbe3156d15d769773c886e8197add8b1592d97081a370e0c16b0094170fc3c1e05bec43adc134492f46699200e8aa7cddbf5df74e20c167ec530eae65007cc33516a8c16ca437c6d3f30087c2aea8684a60f341d9518912c24495d4c8df8e34a6db71c810f966660822dbb97cfd3622a6a2ed274ef9b70ca40ba73359c2139c660afab05d08b22a6e16c657ee21d45ed37ce4024fbc1b382e6522038ae9c7776fb04bf00764ff92fd5450829e0454d8d64f428cf0754db088b51d7c8183e12da455f009156c34b7b14526bb704cee33dd8b026a12401175467f98af09129b32515baa0494b00908c690f112695b5e9742d139756eb5079efe20ab251178b982f1d0152b613c01fe8c3dad0a6627e892732bbcbfa476901aedd0d0616f160d2909ae60b1268e70935eb60e37342b10c05dab55f1a5135cae3a3d935928f3ef13b8a0fb1f92ccfafd81640ebb9a7a900f58499bff6573c51d0999cd82abd33c6373359bab604fdfdaf81556e64d15627b0bb80686e3a9247fb1f9419ebb445bb17c3fd170d54a1fba6309e053c4e73db5e619fba7294bea1de1d4d075635f23c06428cd714b533a70b4bafbfcb82b847f61a2aaa75353ea5512e35f60022ed6b50d41c0287d8af3eca86353213c819eca5f0a6f242b8fe1dc16937abd4c304af261a53c8fa1f786f7a84fab2a75cf9c13a47b2f52f8d1270e78da77a4ae8722b836656e44eb15931b6fb7e94af8229c4cc417d9b1aa3c67f2c43f6d48fd134b68ae9b79cec417cb81fe5d095269df1a84aef9890b3620f71a941eaa8010036f9d175a4ad29678dd124165b974e31413662be15fcae1ddf8ca4abdcb3c3e062ab3ee03da0d935e3d43b8af5ad10755230a2e0130ca6425123f264155a4ea70cf858ca20896e45d62a39c1dd9a45d84b06cd251a18640093fec2ac2ace7d95c735cf6fd31d801042aa3bd1ede1c545e83593ca2c1fc86fe74adf8751bf948d254e02cb1bba18b58a4f4c62a72914ea2610af5efb9846fa3f17eaff8453716f2ba2cc99f3e03984029ec93e4299ab9292708487c8dc4d4bceb6c6c1b28e90346506898d72f5d3c75178bd0afaf36ca5b91cd0d258feff7ef890c927fbedda5951a56d2e46c0309f86f09b4df36c93c9134e53a1fa284ed7844fe9b2c4625272f56168ac97b07748bb29be0071f52052426a0af72ad4293dd4addd8f9c2970a19beabfead98d4ff057dd3d4cb794e0a70424d4c35d5ef94f3729a57803c56c9252c0e7a0c77d8195888ce1eda9469a2bc355294b46ed4433f7dff864a42fb792c021c077b358b9f4e20656db45b4d23d11abf1f8c81775aa2794bfee69e39793a0155ea700a88e87172c4258896fc427a0a5555eec975a67d2d02abe621501e263e37c64e6a241012d40e721b57c96b9d8608a441055ba3507b0ebaabc8be83cf11391ed229fe7a0fd5af1051f1f822e8d014a2c96d99299af66ee63d26575bef020901f0695fa5289df98dd8466cb74b047fd0a05461ae99c92ee7281890ac2f535277123899b6f2b9c97b71b65b6263fc0a63c59239ea150f7ee47a5fc2873e01be82a1c7e3ccdafc9242af1dad409f5f7aedf3a516c833b80dda083eeb92d35407a217dafde5b1a8926fc19c0c1cfacf20348e8286e2971de78b85495c0b921452de5e21e6bcf5f7af9995177f02a2bd1e9804b0f2c656d01974ccd781f40fff839a9458af6e5e02264226b370d8d8ff5fe3f31739ba88bb3b8393020f5fcb10ec076aea2c4816c2f12c2beda5367e3892913bda6d88494a87e45b411578c9c089a02c155d75636954b390fe22ff5b620e53ac0ca70fa21cb6bc39e64e7bf128b33196b147ec010c270478ac57afd3391042a577b1612a37f1acf40a7592f4794ad6940df24a6c740362a0b4db517feac379c81b6115364dfa42a7522cdd9c4ff2cd7ce939c439f80452b369a3fe156e0be72bdebea08e63700cdb46fc4cf05a9108e24dba4864f37a54cbc6272e31a3a4780bcc419b2bfa9f440e3abb462e0f9db5dc44904a8b46a99656464ca3ea9ff528b2a3be100132e94bb0247e5a2055f3b24468d76591290c5374d93ada3676429e85cd6e4c074d1ab1424ef2443832e8f00d63eee473b602a9103815c90ebe96aca38e79c941636bd21a1c697f1eb2673df0e3b6b02cfec30e367822fba39f0d643a4dabcfda83b2c528249f48470e714ff45a8682abde8939ff01872b86489b713e25cd62a582545f2685fe98b9f5e5ef0f46ad5a051c4fda59e1863efcdf0de7173bf778a23bf305fe39edb8c9462de60a0270dc7e7e3f8792c05b7e744d9cc167608f69881fee2985a6d3179adfe87a3894ee3223bf69e0eb13050163e047234562b7d57eaab10e1dc905277d861b058112b02098f4e5c6f650c6852a46c9e3f36e3fea2e5d60059628653badf26b932d6962b9db22690cf8ad4f38e77e0ec85040ae68079b4b305246538d8d56457f01efa79b298f9e6eec5836e5889d83af25e8d4c93e0f30411c5a26dc4315662574b39396d5c6e2e51ccf17550bfae8be70c0b130d50d2c17dc984405b20e6a3131fe9cd26cd6e6f6aa53e31711f964967ad1663b98cebda3b9384b950402ec3ee755139c371f135053fcdd42eeded37b0f8e630394aed030d3413bfe0aae3d8d79a3c4f0283dff86d70a87f89dc5331f06ae71c3579d2e8825280dd4635c9a3857e02fb37d3dde2108a74e864cf0fd8703005336f3b0738680e34d2f840f13f21fd8374366d4d587b9be34efbec0710524e9095c48437a8d9d0c9678bcae7351662a48fa2f6cbaa2d767a70e69f381cabe627a652a15db7473fd9f039cca25dd02596f60d02d462ae87b6ddcde816a40f043c8ee1d47e8d2bc8a897405e9747f5a7f26c02528e18f8aef52117933ec746eaa7ac3abf498a63be1b8a79f00028de14de66f810cdafc06052939a56e740c8d99378694a74df8325fe7389e63bb7a741b8bdfc7b54ba39b4c77c365b62840a38938885bb9f074ac812e9e4fa743e88067d96450a295e9d614df3e834b7565e87b16a0c5cf261b192170f63f61b5527db6e559f030793c0d032e704dbddcaf0ea2953f32dfbed8d95cab73ffd7031f4948954fe708a2de3cf357f60f9e55942007d5df03e526fb5a377659c45b95f605000210d1e0ba5eb48ba8783d5ca3cbccb5b464414f8af008ee4075e580b05b1f428b8e18e5e0541fbd8401d375dd44bd9494654696c437952fc5ce3cec51ec9a6a3cedc46e373348b4c0db1edc1af66c7973d7e6d2a713c04aee11f6dd48247233609547e2d492b08c12f644759dbfa4a5e86e3fca90d9c086d1c1fabd9b77284ee382a383eecfe4e740b6ea0988b689bf751ad9c39244e0f337e24f3830c2490661333b25e984522aaf6bd34b4edda1972a71f14a83eef156c22c4495687bfa1a8dbb0d325500a641b1905ba60dac7b17f0c0156eb1cebcc1d166f6bf139763f2abb186db6fbc3f7ac1d8253e038bd682e5e1d9d2b6d0107f4d48be82bc241a34c2c895660424c563cdde69980484387ec975123eceef3c8aba87ca18c9d1082155a49affab3d6e345e391a61bcbd9b8c5301f119f2e7340bcdeb034bd9c44975fb304f31a02f842e339f285fb4d603319e681963921856daab0ecc5dd515cd475e30a7ca5ab1f0b9e4e144289b57794d64df09c06ec4de950ec027cdeb4c5f4d0d830d105321494fb7f9d5d572d558578a21ec9adec67b9651da978be8e99d138f29c2369ecaa32c75db82e33504081055635267a514ad92fd05aa59fd6f5d2ecf057d6b0506d5a37a58892c53ee0536f7b408483fc19419742f7dbb54102dc38f11f86865f885eada40bb72f9853cf0d79a7883a3be76a71c0f9bfa96f6c0d858ae6311f905fd0008632c02f720a014aa840c81733c90b88396244fa9ca291d9506a56d3c96d20c6a08e0dc7a036e2313d1d597d37c20b4e37c8a4c0d544bd825980d4fb68753ba3bf746a9ff60cae9c321dca19b76325fea1a9c9e9b7fdf87a7cb29f5ebd57538bb7cec8213aa8e3c01bfb37ce7c0c04c3494457495fb99aa07ea90410fe8ebde0e32c3dcf9ad3e1a55ed44ccdfc41a6637f41e2e0f2db37a0228ce67601c2c8f1c20e1b531f561392fd7d17416a016525603aa04ab6a583b799241af4a4b008a2cf9da208f9f6b429778520663132f610c24a82a4a40251cc945b52f3c9d4777f3c4bd593363e6388a1f72d28a602e4a551519f6a433b618cf51c38fdd4743bfe2eb0bc65814442a7d86a62b81187a61a172056ad3f94a74d7b8873f927ac00265d9971d28f2a7668b54584d5c97f5d0afb282625c19fe056776b457b59ebfc837bde15d349f5c05277e03eb2b6b641e0d7438b1b3d0bcd3b3d2b3ea4907b8f88e4d07ce77fe39ba4109a5bd177ed5fe91af08ddd246302ddeb1b002f251ed57ea0f9a0bd0940a115e8c78f7955dfd2a979f044c4d379dce4b3ba386a9634f9accac7b89b74cc622a2645841d7af570de52628cd8d9837ae184794ae224ab5b3782c9a3d16fa66de73f9a4a56a00eb3e58e7b0704069d40152d90741bba21f4905934f92a02d8bc2de9b76933d639337b380bbbd30e6087a4f20bc996a3fd74f730c1ec8a4ef52d905b241b23b1eab79be81f210f54c071608211943959f70f5336e89adf3ba82ac3b5deeaea7a8d7ae12f9ed889a1191a31cdedf5e488d22992976fb5a6d947e8c2fb3ca4feaecced72a637e444e48447dab70702e547d992d2d04657e1796aa9beede94e814c45f49f5c4eded8e5dcd6feb4e2686dbd40dc4c0f395774a86dc1625b4dcdd55cae9479ba2db76d5c8d666135086885c22bc1dea2205bc6403720521f2f702c74fdcfeceb560f0559996bc18ab11f66165768633c079e3c9ac1aeb46f95064dae671fa357c916e15f7259d3055ffe2315dd978bd06bd1fa73677b42f1fca814357807f5a10a37574b851f311f26e84e62d8e403b7ea589ddd26b591cf0c8577dccf9897691a114eade2c761151c84bbfccaac2b16e31c29f36d9298c455fcbcd5ffda0f30380740dbf68c1f210ac8458a2f2a60240a4b41f85a9464924c613462d9aad7525f3fc547d82bfe38a6b6b66467c9c870ed308a4aace436b8b22954dc08066347a73dd3d0fe76cd6a639c2b9d95f343ae65217d4ba7e44d3dacfd74f83299a1d4eecb5e0b78f43246dd6b8ab182d1b84cd9af45c3814e3b84b0019a7089509053b2c873019b92eb928fb856fa1f7ffa9bdbcaef2d3c065afb0ea80d8ff697f2190155b99f636954143bd75291369a76d67b69b7e24e391397ee79597cce90776373c37760400644265021bf2c9604aae88fddeb69fd97cf518c847041cd9bd692e3358213956928abf182fb7bcc84ed3b6fd28f1c92a396f3a80a6a7bc5261227522d7558a723348054c19edad94295d4eacf117c4bdcbd9d6987e5d364d0a43c361cf220e4fd0d08ac49bfe9d641a6716d7cf0cf6a746756229a6584cea998d0fec70fd9b5a2ba771b1f09fba78bd8eb1b3eaa8070e57afb0d583e3613efd566d9bab7ba5d07109dff98789eac29ce3ad53f0017900fda38d509d997313674595c08a1b035b3b40116bd5180352a59bb3dc1400c3848ab4ca1b086891e5fd6e000868523541ecf09aa62cd8835ab4e283571881bfc01636a3c5d7575907c93192603e10a70f8fc88c409fe86ae5eda24271c342a5364b5d1d8e0874c8c58e027b08225e7d1bebcc88cd6ae6ed2e4ab17e7831daa6eb82be014bb186bc1e83e71344a7e2e7a6529c7c3c91f1d2a8735911ffdeb7eafd97d82bb81dcef44a4d974f4d58d7ba923f43d778ba96afbb91c8b3f28a191a91479f6b8066b780f741f30b4d8c3fbac99b506308063acef4c101a2d49db7ba04412ca15df3180d89f90b85158f34f646b10318c0912e098bcfa3c07f1ac907411f716d8e7a92a72ec74af025bfee343eb60f58a72481483aede4bcb5369b712ec3d65a496fa5d4869bf4d2e623701d3dbea85f6b5f0aff5c3a0f755a17c02b22bc95765c3611e2f76abee2bafd4817284904d7c042320a484ebac9d01dafb1c00125237d0d9cb17ccf5023727f1d7ecc82ef51384297e889795c0bc0cc8c0840a9a917cb7f75548d139cd8c2c0369c6062b17a42ff69cd4f19c38c86d04c085c930df0a29ab6f55982be44c30f5ea6b48524a64c252dcee523f2ae8a9e6838a6f4c9f3a924cc914956a5799745e71b614a9a183402bdefc2833cd9720e8125d017af673ab77d738534eb84e8d0066adb7f75de7a170b38eb6ba4ee1cf248e27295ff2ddbd66a597066a8616584a88f018b24d057e0aa54975d1ea2cd251bfefafad0921989b32037da3ca2f7a4462e2b80a01137aa14028e17345776051a03edf84c503a89bfbe98f976f6efe010b05723b869a0a85dce75cfaa4ea9725e6b93420d126ed7b8f10e0792b6c7735c31760c83e8324c90e0c508386567e343c5f71d2c69355027b359a1a67582a9f2db16ade6b0e8f335cfebd65857abb9a138c5fff9f41d588cc7ea4203e2722c37410cae8ab4e1f3fcd8d59abedd24e7d7b6bf2723bd1ca8c5eb293e118654be512bc9c2531e7e395cc1a507878ee6b419d368f6286900aace47ab45e3198d78a8129803983519102d0b65d2b89d351d82880a2ef6a0480a2b0cdce7ac271381bca564f8c92f802a161e4e9329c20eb68af53ea9f70b134d5f27156f3a3db8581e6da5f7ced9d1151683d53b1a73aff8314a782b9d3d31945d52698823b85fcbbfffc93bac3d2746a7e44ba599eef943c1527877760cf4bcb9814511bcb8a187685989a907d319007ac49cd2e4a18f46ef2edd5d0d49c0732ad4ae88d3ed3bcc7e1cbcebb750e0f659a1a34b236c2a22a06b7db142f6b9b047d51f37e53d905bf4cf4f736ce04ad9ea7f2ca47304d30201b692d6a668758f8d7d2e8b9dcd9a9cad008e158bb0ef38741609e343f6b45d7dd94cb40ee59ae4ab7fc321e33b763f3e5f36f01cd27b75866b088e0169bcfc378be605714f954723754cb36fd32b4875fa5ed975d48795f72d60b5005f05467d15c184ade5033da3af4891538c135cf00e5876f3defb8325661d3c572228ef8ea7ae00cc29c86bbc581c8e64c70e8a274356826d1acc9d2f78a765102242d63792ae9e6cc49d340dae77ae9ee654d065a022c3d13f973ed7691556ec2c622a57cd22df02b02ad57b825147e32bc16584dba4b9ec643715809055a3f300ea3c608e0f2880ca9ab8f75d57616fb2b8017914df8517a3a4850fe937625835a7b02a88d76697960d7c8801bd80e542407383b2f755502a96f043cd7a25aacb09aa97b69c6cabacaf0549df5306473b7db264d53a96ca8e9b76560ba4ef87060ae64804358a090e07d525247c9c4da78c72eacdf161ffa5c75c2c6095ba18b70df9c7b38e80e9c9e6891f16fbb5ad6c5292fa65bcce449772055ddc56c46b98b6fcfc2a880fab0577aa114cd24df5142f631ce43374b898846538171360f7fd086deb8f5da7c2cd5a513cb7ef488fedaa260494bb30dba62af778dff9f19aeec3daf68d715269f35b467b51c036ef0a4ab3450fc952a5adf1fd52ca3b373a6c1479f878c1fabbc2e7a887c2735086b5042bcae32ba4436c78d9709dceb3993aed247f245554d8dc7d5ca62a1c39e937ba114ebeab76d4ff93250bb34c56fb9e7569b2d2493d85f3275e9f70ea0358153159bf392d0def0c164adc1c362f9515d7e247ed7e9665e89322672254a3590c0c39314653f1f92c43f35dd7a729338d0dffcae520ff63460fadea2b507b013b349ea31dc327dea285e2092a340185b4514bee5bb735423683d3e2f095759d9ee926ae3d9a30238004026696d1f9557d7087d027ded9fb222c7fdf9d3c318e021748cb57073558fd729a92dcb7588e3ca04578e478f98cab4835d3adf76c74c9d1b1ca0a936c2a814749f3a5708b6be7825e8c10f053ce61c5b9da1f1cadb10ba664605000e694d7c3dd500a5016808d67cff8e45dc18d95a30d7693710179983a0ba565c19544657f7493f17c351e4d57211d22d520b48c716c355ec011a288478f68f76afc40d30fa8d213d33b166002760590dbf212d1d17d619c643b1fb100a1ccd697c2ab6b2aa99fa09dae23cbad7ec390b38a345a38e5b74a5f0f3e1ef206aefe0513f11a25c15a37799213e7f47a914ffcb1f9" + }, + { + "sharedSecret": "53eb63ea8a3fec3b3cd433b85cd62a4b145e1dda09391b348c4e1cd36a03ea66", + "encryptedMessage": "d135558a6bad7c5a617272dfff6fba9a1ee9d5509b697129b42407b020959566ba84011d09efc5e187c148ba548bf7922e7a5d6c0ceb2ff3a559ae244acd9d783c65977765c5d4e00b723d00f12475aafaafff7b31c1be5a589e6e25f8da2959107206dd42bbcb43438129ce6cce2b6b4ae63edc76b876136ca5ea6cd1c6a04ca86eca143d15e53ccdc9e23953e49dc2f87bb11e5238cd6536e57387225b8fff3bf5f3e686fd08458ffe0211b87d64770db9353500af9b122828a006da754cf979738b4374e146ea79dd93656170b89c98c5f2299d6e9c0410c826c721950c780486cd6d5b7130380d7eaff994a8503a8fef3270ce94889fe996da66ed121741987010f785494415ca991b2e8b39ef2df6bde98efd2aec7d251b2772485194c8368451ad49c2354f9d30d95367bde316fec6cbdddc7dc0d25e99d3075e13d3de0822e4d8e15a7c521d67ce2cc836c49118f205c99f18570504504221e337a29e2716fb28671b2bb91e38ef5e18aaf32c6c02f2fb690358872a1ed28166172631a82c2568d23238017188ebbd48944a147f6cdb3690d5f88e51371cb70adf1fa02afe4ed8b581afc8bcc5104922843a55d52acde09bc9d2b71a663e178788280f3c3eae127d21b0b95777976b3eb17be40a702c244d0e5f833ff49dae6403ff44b131e66df8b88e33ab0a58e379f2c34bf5113c66b9ea8241fc7aa2b1fa53cf4ed3cdd91d407730c66fb039ef3a36d4050dde37d34e80bcfe02a48a6b14ae28227b1627b5ad07608a7763a531f2ffc96dff850e8c583461831b19feffc783bc1beab6301f647e9617d14c92c4b1d63f5147ccda56a35df8ca4806b8884c4aa3c3cc6a174fdc2232404822569c01aba686c1df5eecc059ba97e9688c8b16b70f0d24eacfdba15db1c71f72af1b2af85bd168f0b0800483f115eeccd9b02adf03bdd4a88eab03e43ce342877af2b61f9d3d85497cd1c6b96674f3d4f07f635bb26add1e36835e321d70263b1c04234e222124dad30ffb9f2a138e3ef453442df1af7e566890aedee568093aa922dd62db188aa8361c55503f8e2c2e6ba93de744b55c15260f15ec8e69bb01048ca1fa7bbbd26975bde80930a5b95054688a0ea73af0353cc84b997626a987cc06a517e18f91e02908829d4f4efc011b9867bd9bfe04c5f94e4b9261d30cc39982eb7b250f12aee2a4cce0484ff34eebba89bc6e35bd48d3968e4ca2d77527212017e202141900152f2fd8af0ac3aa456aae13276a13b9b9492a9a636e18244654b3245f07b20eb76b8e1cea8c55e5427f08a63a16b0a633af67c8e48ef8e53519041c9138176eb14b8782c6c2ee76146b8490b97978ee73cd0104e12f483be5a4af414404618e9f6633c55dda6f22252cb793d3d16fae4f0e1431434e7acc8fa2c009d4f6e345ade172313d558a4e61b4377e31b8ed4e28f7e3d387988c566f7b19962a9ca0623e108e4ad98cee785a49b02302aaf8691a2c96666b2883eadbcf904a7e98f6f8480d89457414e7c2f9a491de4e1e91d8becbd46d13f716b10a2f68c64c6c55e50e97893ee805123d6ce373e0d8ae791efc410413f8e0379e1c6f83e5c2a8a3dd2adb13f15c7e7f508dd9e949dec89bb6b25e8654c0df89e376950f34f3ba0c9303324e1340a142298a0b9c7773b6352966948ec8e21a82e0a1eee50ac1b22b92c77a37b258a64bb3eac67ffab832c99746982a1308873baefb4ddb0e91651bcd63ea3720d78066f0439f6686a1333e463989ca843cec72a3e9076ed367cf994b6a66b039088dd3498150f0bba138f03a9a8fbb9bae52502a1d5158ab4ac470c2c62d5bb1c4dc961eed76caa1e7027e6f150a436c15eaf016da5c9bda70904df652e2151b9d3f8aca750cc99957c1ea4a1f44af68a6dfaa92d4d812cc15f49da7133292c7eb2e99f72a5fea43f75368fcd139a58cd70c27a7c22b462b930f8a0ca885cd740a96cc5d5d89215d2598f4ab0f6894cd69896af4e99128906c2f056951cc8749493c088ae4c086acaa53563921003bdbc186b4a140c6a49099d115606392f20896b96a6fb8d08ce56b2406856fa7a09b779a37bdeb918ad7a20ed5005eb29c3754faad67209939acf9fdd4342184a79415a7bfae48388fdfeba9092aedd30149a0a87935cf197b7f209a5302896a65b21021b5a9607526bb2aa3b97654c84a7ae2ff17b3b475f26a640710afc3ee98236548193f8a199d875372743090e0443ee793451ec49c5099deef4f8963b9bf475058eab38a2a290ebe25456687af5e61fb4fe8451f1ed8812ca2f31ce5a78cbbe67303e7aa3d96489314826b66b1606914977106c9c01657810d8587b9f85cc3022aaa4fd0e199663216104a1b54b8060f41c6abc3d06855c4a9037b5116760374d342ade3fffc73ef60c4a8cabad7eaf531e06291a8be9801ebdb3e3b369dc81dc8c83f10ebdc9636df4b891ad692b193ef4ea79ae764003d8db725173ded31c700204f720e35a8d3978dcca85ad0087d07ceb485b392fc5e9255c557cd06fcba09ca4eaf8094d8801b39298436f2134fe963bee37ecedec35979d39845f36764622d340d97ac700ea8f3f24fdc43d67132d45d00e12e7f3f1dcb4954cad9d11055b450862a0f2e46782d079d686107b3ea8289fc21edfaa142b56837e6e87642366c90f4a1cfc4b3d25c069f9cb8fa0de477fb8ea1079894f4602cd6ba53989dceb23b0acf17bac5fee3f1f26b0329824d21efc853978842956c6e3ede6cf37e3a3e603f7f56fc68a4666c2d80e50adfb7da504512447a675d47bd9e27c0ded46a9582034061e87f3faa9996cf5245af67e42056017c461630aa1805d0f76905d814f6b1146f4f6694bc2a49d1c0987d8b9946b7045af9e7b96c76935d10c7415d2c2ee45ca951495093065b769f497fae1ed7ce94dde71aa6712619247b6d10f3ffc28f527a2207794437b8965a5aa670ebe2e9fcb6e51eab335e1ac3ef6f76940b0dab602630c1b3b7e6012291435a9eaade4fef4947e75bc5f8b95275d0aaebfaaa6a033fd6d08f5c1ed2ddd9757546b285696e87f649afe79028a8e3555b8372d9f84cdb29b9811771f8b6998ffcf15951123a527bffd8abf273dd491cc4479e8f6d15f9f6cc3062b2d608dc2cb018adf1b4ab224d0a8598581c925cfa71438089fb44500083df54f14bda7ff80cb6b8bc9d1b225485c296621c5bef7f459b50b9e84635fbea7f3441a293eed32fbc608e861900a3e7e1cec9aef3e9e2b6bcc35d8315ab160a0b6abfc65f6d3fd696ce57a9c3789c3f821b57ecdd44b468ec3ac4258fdd9bdf7a6896b35e3fd87249ce0ad53aec6b390248fbbfcde2ba1cbe2bf7524cc96b76ddfd6687a6194c53916604ca4cbb319300d1b9a181305b2c3d57986a568a457a32e75b5caabbce763c5d94dfed7937978ea896b3d188332e9279a0ad31851012cb4491479e0d9bca34c71c4b8e07449ab40a249465e2af775157541187826ee147fdbef44f08ba26e8f50dec6faa5b643a685130c2fb46bfa1664049497de61f24663f11c79dc7fe81d36a21415dd41d2cc1ea5854429a16f1ac989f2f6ee1ad680f3ad013de9c16f733714e048231bbde7f5fbe1a2f346c8ef6f55f62ce35f1eb2b7fbd9d6e8d30e7ca7a5bc4086b8a4679f587a7524e831ce8dd95e4103d591e049192c6304e33234f4791547ce9f06c538429de011be8f63d3c1e2e59c9521d29ecab37f8e2048aebd640f5184e01ba66d6962bf314f2e106079605f093f4b5b5c6f044ee20991748a866aeddc6a3bd56151678186deff32b12f9ddc0863165a52c3632e5c1b987e8855edcacadd3d998620f42c5de375ddd1bbcf8fdf164964dda4e3fab7e6dd61938bf3fec94bdafdfcf8ce5c9912f57aebca30234931b19f393d2a7a75b1b014bb31dc73b6a34c2c01437b16dbe69f04180b97aab6f312b6bd1c75ea3868861f946bea56291bfc2b7b2a3cc1618a58fda2452c57c3700c74f39710e27f7ce4c66e0922962d59c54ef1833b9cecae75e34b335f0f05c12a9b919b7231553e28d2856d6dc272861f446eefc9304b70878353cb4417c09ba1b2ea507474a421db3671ab9ec38848e40020853efbff9f0a4db21083793cc17722bfaf6c77460c78196720c465bc362d29998acf84edaf9819bd14d2061b1cdb802d5d4d2dc7a4cb65f4b5ad499f5bc998ec0f54e71758ceef7fdcd8bb8800ccbe52b33d7a3bc8ac1680426f584342fa47527e52d0cfd2effa405fe67955203f1ad8d5432044a7291709fd48893160e1cb1039793cdc9eafa5e343d46acc3c6e43575164fae09f91b0571abf54b5d04ccf96f6d3126c13c8bc466e3f6c4cca2840638624fcf383fb3254ca15e978ae1b29798e3a7a7c9d1ebb7e12e25ab6d6bee3932d4c46627abff46e1abbde39de1282832a8779aaf90d1bc804c47574a5b338174ca5ab01bb90a5e177812bd31ca437c245823de06208d7a68bdf77d1993d33e764dbebbbbcc167ecdd5252e090b9b8c90164801c64751d9f8f4783c254cc0e07dd81194b99b82e2aa0cb9cbe3e0aea8daed13987d1ff204bad3c4c32c7ddc3a6e72b76d43ed78d79dc54d2af5c4591d4b45cb6078fba1d9cb97a41b83866ec780bee863ab02a4048182f2421acb8319b86c4ef4b21ba5a2ac4b226ef1d6f00fda9d88969832b65df86f4f5da3dc6af9586ba4d9fc94399281f91a5ecf407d0e35209b4503c3be46b85a8206aaae1d6be871a898b847add3d0ba6ef62e08faaf94ecf0cb568011cf9bafabfc8152f6166caa7d5d27d381a1abfc39ce6767bf287971b8a5604d1a309aad6c344a1dd71c6dac380e384b16b0d1d177e4f2a41512db6d02d115b54cefc24bb6452ca42a635186773c608ad890c8691d9bf6a817ccf0e54d534637ebda46bbacf7db5f18a231577fe7c7b544fb97af691b77e0d4f0f7e0a76f94c17a10ac9c084112b596a2b3353556323b7772d212164ba29d97c7672809331ba64e80868bba570640cdc0e4e6694aced924285b6dcd9001a2a443e9ced543d4e29ab5968e49eadef9930c27c26c91e247ee8a06778bb9570c749d1c511fff347230841719d6b9fc6d70bbe240b6952f25fe838baa8bf4dbf70e3b1a3073ec7b8e48ea8410f47b2723c8906ade00c04efbee06f5f245247bac9e99fb5dfe45709f8a154caa38121141b34813c4900d001b528563aa22c52629a3caff5adaf6c26bdc943701e944bd076a3a73b6267ad2dd5e5310c9c989b06f4a837d771812d13d48f6d6e44ce3dadaabcc43c0c86bd122a683ae261e354cb7ca8bcbf131a608f29346692208d6d961e32fc3aaabad609734ee8fe6664eed4c84b9cd5b0e806a44137a0dd4b834bbb341da93ab6900d1898c8592e945d264847309b9b6aa0ed5523867039dae17ca8be0b12efe1940700f9c8d9175242605ecb4ecfa402c0885daafa778f3f925b07043e700c266bccde692b745223703694bf8513c7f9f71199e977a09837e0180a9280f90b6aca2b7aa6b6eb9596c48fb38788d16ab3cac3ec11be9c2b9e5ea8d2d20c832a3b8316a23ef92037d8d30ed8dc805f945be3a3338547afbfccf4f31308f48b1f5c4d73f3703b81fa52498900e1dc980a24f47b3133dd2f7cf24a02ca2a162e5e5f3ef61d453cc9cc6cc6a30322c4e90c57c1c4e0434da8c8d27847876d3f69219906ecba8915615352a75741bbefd3ad1ddaa35f638c94777d5e1aade91935b1b406641a8801798903699618e8233ed4df234963ef7c52f88568ba7fdd7166b1629e3fba54daa9f9868dcd97c0f572d33f4526f2626181f813fbb91425bc092bbcc9660ac2177bfa05b7ac7ccb69cd6db3e5586e916681646c7e8b586f45b0e29c12682bbb5bdd4b383dfd32856246295599046198486ca98b732b1bd881f5bf205629cfac6b2f1223ba8e33f51eea991717dd05a76963ff35c96aa8e99a27a855269e5df355d80b529b3c9007f12d6e3e07bb713a830ea53430c479d5b69921508a6e322b7ecbf1754c113960f66a6b2695f4b886380fcab62a646c7da5091fc5522504e7a803e0b5037854ee0611ed1920b94fccef010be61f2e53b8f4bdaccf40cb4638a7b3aaa9fd6cca207be6accbb0f8ca3dd9f0f5dd89e0101bb80a7313aba0cf4c252f8b28c11661b065d47c0eb09222395bba420ec01eb3317845ed7869e862354f830efe0f93034d2d9efb44585fda6a7905763077c656fa98bbc962ef00c8a91bd6ab3ba6f4c2d56b4fbde478ef128406093dd0184c0f5e250883a7e9330f866076ce7c14192f6fb7b04d507252a3c00ecb921685eeeccf9407574a5df8ccce6d46d9b8d18d78fa69851e816d84d1e1b8d3378c58128ca58dc8979fcd4a10fdddc7ec7026653a8cab93b93f7d252691f49e1b3c454f1d1c553ecc9374d2a32ddb1d73f57ef8fc48bbeaae341d6777af6fbea43ed641472391c4ab8738bf0e01061682b3e4ffb54a268f99cbc7665998c16d0771927db89ac87253d53c7e969977e5bb42466edcc68926f448a64fb0e968038bde4a6343c7aad7a1164256e9a8db9889c22826fcc44d924cf27d308642a37bfb87aaaa345efb1dd85d0c664653a04b6268329e08d029e9a4a718e882e5ab0f648edbf37e32427f1b0e01e941dff32ceb7135b5e24fde7b58628275e0e9b8d3badbf55f8694a392b404cda30913b6ef1ed01b97f6e415743a37e1a807d08d3ed9c11dd12d6737b753e129087151614c4f107ca621383908cde2feaf45414cc4777f0716563f530b66ad75d37c72c0e01f9787727fe0185f18cc4e71b36df350608c8844e4ee8625bc05a32fc4cc8d39c591b7e8617e17abba67ee17c02ca6db4c8045b2f2d3c82380d846f867ca1e75d87da4ce26cc14df50bd00a34b31ad08abb7861c87509b6ae9cadac38baed511c64d73f69bfef019a97a580887445ab9617137777ca4a95ee26f1b34c991d4c5b66d1d553ca97e1e13c11d7ce49c9f75e3fcab56876b1cfac92ead285bb624d2aea0e614957c8c85bb6de365f429089325ea0e655795ab9cd5096e791162b4c01c468e3fecefa74d693d570586ca3ba345f7f8065c667bd06c8e374fb7d65435c272a48c93a228484495b5e8b7547656ce8c2e46878c6557e8a95a3300ff3562e2349f9d696d4dd553cb32dec1b8be78916569c297a175bbc6970c6f62fd6d76d199651b4dd5ae510451e0c888ad6c9450aaa99eb6a2eeac38d42cdbe0e7b60a91d171bec9ca0864a4e2b0b90c442d9b95aee3a636851548a421c7a8716311fe366633604eea6c701c64883c35b7d2e4d95b4acec0b26bf07a50d9f775b4e2fee707e0ed708f310d8a8907af8c8b9ac16d342fe76af4c68f63cdf89aea88de789d38f0682da51891ccdb98f87d60915d4910e48550eb7a7363dcc45983bcbcec50c40152a2b2cbfa71ae47d9f9f6573e9c930ffa4b476a2735b4ade21aadc5658bf8ef5e23359c35d937706ea9495f94491717af3d1a337a9c1acb4f11a74cc90c325843c30f255fbf09bf5856cb542c5d2dc02ed726a491ac2f5dcda66cb58632d9b597daaff788dace11aa59f2d95394412b26e90611fc53452007e8e7dc5f42753e5cf057e189566fb1c30e60f2658e134c0137e56e52d3c9ad5976015ecb64e037a7293cff87f7732e2f8b6603631105966003121596740e2a344c1b0ea2d117020dadffb14c14e72a0a0873b7038874facd39f36ecbf231b978c89d067330062f1038d7e1f44d27d91f1a7e26292cd24ef853e9d7f138bc11fd3fc8bc4b976442caa9d1fb950d5e8f8fb7746bd652770b15856ce69748cfd929530c13a1a4d627d41c5afb2e8358cb2412e7eed689089cfb769554f9e780c09ce65a93f6b481c26be9a6ba7be3c9500e6b3da756cae3413dd13b1ce351545e037bc5dc5244c2716d1a95dcedad8e34795b961a9c18c2a7784d580b4622e5af6d1c3de2846cb3132abbf301613eee48762e21f4d36742ba3705f6fbd7a56bfe5e6ef97439b247471d48ad8a361feb3d36c1f309c371fe6215d70c26e680dca8555e6fc40a8b529360c744dec45932c1c8bd6b8435253f84c6e2ffd9e73eb24d168e0f296cf4cf1806a5b909aa32cc7f25176f2478681c9f644d6a8b9018d303110ff8946ed5b2fce39593f9e13fbaa24f1fcaa2db9a004d4f5e1cbca6be150e49276b207fed898daeb5cc5c201b7cdb5c10df373e003709a132a19f25cfe83296ec398a0ce35b8cb6de098bd89109db5f9f5803560e23e57476b07ff213e0d2ad22167a79faa8e61301d3dc82e5a5f059914cebac4950e58d821600535241cace223da73257c0022e07166d56ec62f3099c4ce86a8fbf891516a580948b3644a1fb8be0eb2f3636dec8b9cfe0b1417b70f035070e52646bb170c4d9243fd3212740c8fba5d382b775704d0de2fa5267d283f3ba22a22bfd15459e00b684bc39b6c3b2e5260461b612047fa4ed9d0347c8ab60e53b2ef965730b29f664b5cc372484b3c7c71bfaf38d70734b03faa0b8ac4c66d4dfafc4062629424bba0b02d411961882706fcb40ddc4678c5f830e6c0b091848ac135db1c5a531a37cda32eb5d649a1c082d307ffad40ae1774c1558c2421ae330e262b69dedbe369b2bb7a8a13250f44bcedf02d2a47d4a6f9e324e14f4eb1660d771561732a7cafe4da5efabde7e6519ef772a208483b29c7f7070dc9bcd5b0d665d95aa3423f0f90d5d40b2ef9708cc5c14c86b59770fbf05fccc8be63029eaf9c78180079f23d5ab121e2451243b0d3ef55e94259c57b338b368cc46dc8eb65752c9e0335571ef77efbfccfb9d045ce5417ce6738658888dc2cfca5e958084f816c24a1cea612e972726bc50fd6f9fd65476fa591ee189dc442b56f4064879ff88337cc020423f8f403a2bbe64d01af3671f2da780dd92d96cc92a1ded193d20ce6ff0c345ddb029da81a26ababb6d80478021779ffd266e512bcdb8b703404f8069bddf047bfa66eec519bdda2e388779bb2be4c1c3c8b26fca1432527e39b7f5010718d9d497d2cbd5160ee4dcb0e91e0520261c91d60f56924a4de937007bd6e8409135f9eb70fcd36542d21430c366db4536a2854225ebdcb0266e005828dc2bfd897ccad190f457afcf863754e9a6cd301625ebde2af5662a36155fcf3e277c264201d5e8ca00ecefac6bf6d8445559fb435c98022629d8161bdda05577b58afc8adf52c388e84e9220fca36f93d27c04e9853d8eed20d180da8298b53527cc6f506707419592ab785f49200d5cf8affb16f85d6805f06d7064a75682c6df64bc61b5c7ca7b8568c023d2eecbf20cd20451a40a21d62999afd49231e3fa529f33ec7d154ee5b6f7bf2d4d5466ebbcfd6e7d7dea927fb57e525adcc649298ac35187a75be1ee8aed4cb67bed3d9eabf8a6ba6dbb181da58fa19e622b4c757b78e10a575949a200d14dc108cf7d17b714204a18e2aaff16578ff55e6e7dbd5aef8bff27a8e05471a629e1ce86d224d10dc531af351734097f311c4fa18d10ff93590b192392682d30c76a8d9af548b7dd4b9d233d8b3759a61a0117246dfd7353d527fbb1a74ea2971835cac11fcd29f7d7af0112b184ce73a4ebc7e80b0bbb221415b8fb483bd97166b348a672203fc5348d77a3bc7024136d094b65e01f04bc61dc4cc5d46ee8493c259b063e04a444840d41f0733d96b4f227ed4a09f3522c3a08a0866103088b4032bfbdd89c0f27f0a8c6161a481eb3e0040d434158f32bcb9b4649b87115ed8151aaab5c748321e31d2693720483b8f83431695182d83cbac6743af825df9b753bd235fb0038ce0b018ac9bd52393965c6084ac480cf53a4b16f777b56098086d49e2dc78b1d4a61c5fb72fc51585ef5b426afd1681bb7729d6db5f146a884f78443d8dd2006186a324bf53c3a9da02b244241b52ef269c7992005216a4d92fe178f87a9abd642563b95f2f30051ab89e89bf1b38a669659dd5dd60dd9dda43454a5d23e1d6114721f2139a3dd437023d91ef5b452e8e037c335e6ced532caad35a653e6f16afafe4a1a69dcca29971ad8cfd3b99954873899aa92fd62578fad08ce255541ea5246ad47cf0f3571d02387859da1d436a49a0002687f1875fd30f353b3ea7eddd8cbc7c7702e27c61ec8ece0f4f2fac73972e0f62250ca63eb35e19f5ba867b5167402b4542c054a81423323275941587f9d68815e6e696bf5607833d35f821c2ce6e95bb3d4e3fdc9959abcbc58503144561764d97edacc860763b43e8751ff0bc9acc36f1ff5cf66158dabb4052efb74e37d16395e7d26098624084860458ff38bad5c16b7fa3cbc370513e486a3fffc08765b0ad8c2583c0a14f649c1306f6fb18f34d4b282010f35dc13c3dfdf69c084e28eff264b9805021bccac64fb2722b9026a422ac56646b6530b6e090f63511c0387cf668cc39a81a83f2d1e05cecd189bbb33cccdd371c9ed859f903348b0f6f3d9034a5643aaca1b28b7255d7604c65ef7e965dee98b55655434770efb6b143003ff5caa9b4e9388740121bc78aa4887a71a830aecf3bd38f595bb2c61a97da0a8bf6bca3d9797263adbb3f34dcee0805449eb1e0cb8d7bd4f7da4f7fadf9f559e5badaca205aff945b8892ac02cf91ae9b283f74958574502e5bd56fb91c54e616f18f3e398ad06db7a45dcf4827470174f19a1baf8b748b648f5d1a10b60b62055a01c49f57616efc16b6cdf8012024ac8754749df206440900cc7ad305329e5014c31b5f0fe66c4d0473fb3e4b7a39b218a790ce3068b629e3006cc34db422917902d68847f7176b793a96addb6c84222211e56c337ec11435ee15ab377c200ba7b48d3fbfd31397e95735360377ac41a4c6e2e3e669ffc63b22941e5c574f60850f292cf783e192a7a79b5319c6204b199582d22edfd5bc1bc92ac1f72b5e70eaff45f7dadd4c101e8517241b5f5596d8f71785e4432f2aa41b50b1bf39e16de18fbd058bb920823f5e63179494ee162db8da24ae8394e33604051957416968f82167c33777225ea805f1f530ce66a42cac6cdff82f4eb5ccc260069a55d92c1491a888047b717228fc44d8165f7180b29bcd007f0dca56668d3fc7c65f4889a0acc0d10a0b62d71108aa7a35dbda1de89f151a662b8a607702c9288b0cbe3a9279c6670a2929650be4334c2c475224354e6e26b2e8c78009e24744ed083a559be200768785f71533a333c8294609ed1cfed16d6d64fed5b1ef833f52fdc65d4f0a74d7c495193adb1d46ff89b56528464a37e12c8d902183b897927de7df96d0c8004e8e6c04634dd8f3f0da2c662cfd2bb5c7cf66efd64af1b890c0f2584c576820d9732129b54be06f1ad4776103de6a82120018aaf43275f846a147aa8d9850482ecf70568ebbceda1a165a7bc60c7672c00408bc7ae24e57ffc3e27318dd5409d0f245d0fa1f1b5c590a0fe6f06cd8f5df4db08cdc297947b087254e1ca3e57929c9cb136cb630128d445be2547c04b8e4779accef0a5f0bcda482941c4b238f1544f525784d81cd221ee8072acacd66fa079dc8ea710708d27f9a4dbe6bd929a64b463613891f689c51cd98f362c36eb80bc957e542acdc2b9c96624c5cee3618f539c12c53d600aaf7a322ccb96f9df43b61e6ee82a91be263dfb53a69b1d47fb030e43183b18e32071f2dc66753e37e166b7b90801267e3cd49ea164fd8d680c0dd76135b2b880f2ade5e42cb0dd0497b8c13ca71c57ab0b8c4a47d46bc37ae32773e95d8d25d74092ae2cab86a4a02c05fbbc3773039662d244945a78d14b1fe27d6b9571821333e771614867411dbcd7e4747888df7a962886d29a8e95e22755bbca4337d6f4f4f00d519959c5a43768b9a1bbcee76a42f827a5e7742e55ff6e076b428ad98186ad66b73d28e19830e2bec091c5a2bbd0d5bc6db302b05514ca80484a2985ef7b940d4dff8662256534adb48464dfe362bad7a2a02731477fa7635a50202c104098cb2703dab8d689be3231ea186f58b193fc4a7c82c50e2db6e2aca5900fefa627f7a970c83eb1f8646ef0808f09943df7b6063638a5db13ca5a4aa82de56123b82342a085dc4dd8f6e9c8d12a9e572c7d97e36f8c5e2b084dd0922d99feae64f532c6cbb8d65eaa6438cf70e730365812751cd2509c8000ffb6f456db494bf15c1f8b7a6bdb88badb5db8bf74952b1e7df42a880adfed5cdb9292ed179fe8befad6dbf0f75b5c3776c57c469af02ae2718cda3a493bf9aacfe5cf54c1ada871c9d1285dd19ed311df1850e98aaac3fa23db85f49dd2f5d84e930b958f6eb19b36ac3422d5133a70667e1c786b417732ff167900ab801f59e2481ea666aba7631c6683a624d4179be7f7e27cb933c24db729af78dd64cc280e6b47353a9a099009f4413162468325fb48a30d48e774b37a2c9a4f07dd85b5df0993947c44f41f593f74b9c54dfd17e240dd296c93b7ae3241a4d3a4375e9470f94f4aabba177b7f612c0e0463cd9fa6b3632560c42aee8978e55f89966b8d0a4d07c75f5e41945aab966f965621a44b6ec0f2a2d2dbf0875c4877eb0558badc16d3de841237e181201499293dcfccbec30077d10a58f3be8eea05b87628b65ed7ca1f0cf3414c14831631817efcf5294c18f01bef9bfb20845c396e9a2f3b619f0418850a1208bbde8c6a8c367019128a945c460495fc0e8196cbbee846ec1ed5a20f6fd72cfaa9870babe283ee282468002ec6bfdd28426df86f91bf1e92b5ac20a4c535bfb84949f1cd23621a016bebf85043ba3316b8b8b19c27c455f624746c20d978200a98bdd49461e7512133d81c457d308f8cc4c2e4159108ed0272495257818d22c42f45d2a860a1aea006f89cd502d792c5f6b489a2836e603175698970ea022f060385e5310397ad5d5b619ec3ed11a20845466f54ca5f891a77a2610955f1d4e0cda3e6539156842a2545a460aa2ec84b5238dc0a294516f02640381bf7b6b4cebe20e0abe8c7b1cf2388a150043d4449fda02ced551557f6d739f0aa576c96739bb6398db1d9c569cb9a2d3427cd8f8642d651f239dcf1006bced33ce2ab2a6cb07ffc931e07a4eddac2d237624bc00485d1aef0279459051353cf73d8a4f53983f8a0efa1335b455f51e621ae9ab05bc0ede53f00f88259232cc94ad3085089b89a7d9a6ceff11e8f90efe2dbbcff2a958b26ec3457ebca7e57e22bcc42a493f66792bf1f84f6ed870c9321fca6d87cc6630c97017e9201ea250030f752ecf833c416c48eb1462799a79c302104e204555ea08feceecc85960d1e37b4554a5c0a41c042514aecb4aba009af0f5e17ed4a298891b2b77c0b1ccffc6cf88df97ae79759c40cd8ac64713f39e072265dcbbf89b00f46a2c447d390985defda9154fa04b1d684fcc1f61b7094b0e15078ec079da66004300624590f41bfa6630cbe581c6f15a52385d58a282f38b9e654498a7ab0f576a7aaf155efac3a52cc55f86abcb945b18420008350bb2b1a7bce89885793a1e5ff2163d4036aaa03356c374c08de7d03e1861d3d05f511ec7e742038ec356aa9d6a16ca0f1f2e896a3bbfc8bb1c1b9215fdb087b86f0cbca2a5e1fed73f4ac183e365f7175cfd9175bf9b6199a0b2724a7b592841e0a321f4970570b09899e8f0cc1b65a8cf9f8403a9bd9dd4d751df4d646ad8d0de384c4440bf3999112ad924de823dbad31e66c49c6cec4e020211804e189d2f868411eadc0799c4170b7569d31a4372b241bf0e8cf04c267cc75b57fa61e07e389fbb6cfeec4e53f1f449ce0b344bca74726ed038fe5aa6c4118cdd5d59e6b128fc2c8b3d4ebd99dd8a3f977dee18bab28795c9a0967f37dcf4f72ea7711a031723d44991f491d37231bb0b840bf922d04ea8b8cba5801a3c7f4dcd24896ed324697b932776269532085c4de3e793bddcfe3925c8aa747595ba3a8be912ece160e1a1cf268bfed686fe14cfc893de7440cd79794f207a748859b21134896f596251c111680e5706c368486a9c0ef05d8e5a9b488be9e41f6547085894be18fd6f3549a42e98fed735c7df23bbf4a11cb073257d6e9521a52c8bbbb3ca02bc56d772df0cbac72fde03dca6397e2642e11469e468f54e1b9ca79c6a2c3aba001312e88b7ad184f4df04fb1aacbf8d2e35e662ef520012e6acb76543e3cf5b809829757357b28abfecca98fc44bfa4a5ed0c29efe096b0762e625d5b8a2616fbb1bbf6dbf80b840d0f90d3499684862478672ba354bf8ce1705fb68e51c4408eb8962221547bc58d4ae99d685e1c065c809efee22a8e2f341c44c81b4700657f6258e06e228a7001a63fad3799852ce56a10a20352223f318a451e20383a53e0704b87ad78fe50c9fc5e39bc463a2d854b866e5b8631f1d061d05c0a6c18db051f3bd02c93df5f544a5f73c08e5a8e7a8707e3726160820bb0dcc42b56fb21ef7e48ecf02b4fad53dfadfed64e10b45dd0be872a60d604777341d94f8c44982fa0fb3364fe1f7a5b03df2bda3be2362a46f3859dfc2f454c54417c526e8dfacd26a7d5e34d833d00a8ca7c6eca590c063826502f63e1d935da395174eebf1f1cb79b5a53949db90e16aa599b95ed37ad919616e2eaf2cf0c3b85333e9f5be2d4992cd8802782ff865804c9db134b138367ec9ddae43834ca8f07ee68103b7756e231508e56c1090786206488f36c7886aace0f983c0caa9a6a786d570b4be5dfa2a4d194d53fa4109c93ec575b841c30cd1c4c564391f7d785f70a324c932f03d62ef544b134faa2bfcabb733af0fe752e1d07f69509280ee28a56e9e7913e662225b684815e64aa9363400bbd4017324d9dfec0a5aaed433aee0d50e98255899b5f156627f38c7bf9d52cf3e1f5a3c49d6fbde119633a1885ad2d3e226247c06a62a64a9ac3f277e1bb21f091ed0d9e8e2e03837834d6e18812f584e0d34942a2d3c1cbcdd3874ebe5a89f4efe6db43fd64874a3f651231f5607633ce89593ad435fbf8c212709b53f1204e11b65533117fea73efda17e3f7354217b286c500a9061e2da93d9194be328fdd0cf4574a8743c35806bc2b8675f0c587de1e51ae46452df9a49fff421928885b10e04a4267413a34a74a8f08a23ad6ef0121235d152377a238a3c24fef2cc3fd7bf55772cbc956c5c7b8673e58ce51068fcf60bbecd21c4938f3b72b7c9a27ee7cc4ab90480437d7d24edd9a902bce53b8f5d8d61ed03dd3aaa21dd1ab08aa8286ab5f8905243fbb7b9d2408108a37771950356431f8ef70a97001b0d27895f0fd6c7ae06d31b71bbaee704372ddb4fea7a365e8afd9f93e5b77d4aef0701673b11769d4077a1989cb148bede6760786866bc28ab217057bd9ea377b0fb3327713aa48a146b3ed3db8a11d45166cd438d285adc66d79985957fccea18f9fc6ddeceb53a6d0e10b2a6afd7c6e74fb527af459e3f35b0c1b2beac0666cc9e1066d9044199d5e84f31f72f75631bd640d30efec589f3de7fa393a5585a6491c0ceb53811bbfca95eae5a444f74b422f94371fd970aa536ac529b5531b0f7b65eb414e0359c20a7916f267159206e956690abf1115987f2a7c0b876501cf1e5a0ab0be3c020b8671300eb71e66be014af37ae44a201ffa4e17e8f3bfbf8bb22626fa066bac282c3a864c29855cbf0b24d81ef88ea45d586cb5d62dedf1887d526660884344b99e211599dd0f6ff5bed7a5c7beae5bea130a5936728b5f038714e85e976bde4d14291b60851b254619add521437c080fabe2d66d7aae80563075ada2d4bfe4c6d57f13458da80c8926e28412a84a1cb3cd5b9c83fc0cfbf409eda42beae2e6b31bd5ad42019ec318cc73bbf79f451bc2318e13b521d3a0ff129d62c671138215a424ef73502705ea1fd7d6ff3cd03accaf4071c1b2e766ebe1b764942d9efcc1e6161bfd90647453c6d31a499d7b18585df96f447c64b3634074fa24c50464c27b27e37fad380c011293680406281c5bcaa26a5a6b72f15670d136c71b33b4bcb4d53cd4a63597543219324d9baaeed4104c23cc7f6b335cd571c8706619fdd517e40028a18a11840b43be02ae7a941aa2b7b98a8b813a8b294b4c6a59c431b9c731d28decc00a3637f30765234db0bd0a644759c978aeeae8cb999ff765d55683e9aa1794665fdc447e10c72ea198e55f36a899e2201e460fbb9504d0eb050f643d775f13e810ffc0085ac10d7f598b2630327b64f2cf8513fab497d0ff38c6641f25ca79ce50ecbfa95d2bb3d425fa38709bea8ff2b3990877813a770857469f01150fa7258715df9db85bcaa7c0145d1a08d991b8ca9fd8de369ed045383606af12fc54f6da77c011e84a95726eab652831b2f0317f7dce23861cef132eb03001165781093d76b7cda70ccf51714d8d045c50c84135b9ac3a6a0b48470f4afc4e67a6a668bca0242fe4c3ca6ca0d1ae56be1df2acad0599bed22078eb51e8b96665134f8161a9d58096b3a08e1f8cda7a2d32c08a14586c2e69c4befb5d92087cda23c3db1c194945355180bf1f66c832b9569dde8e98656218fabd6f6edb74d584f3383884109e276c5a9d3c1cd695947489b6083f1d2a25fc6a19fb99c3a3c58983eae205698ff7dbbb2684018bad16a07cdefc51e6d0e5f62c07015ecd0a9c0efe52fcb3c03b5fda2d510b7a05df3491434e744271b935a131213c9a32881b71a21ca2cb2cb8d370fdcac05df1fad77f5f50e78265a82004e8f3d544d252043f37b130b20faadb7442adc0f8aa18602aafb865b0e70c103066a31010e8a3bc2730d289e3c97a1f1a35aee07b2110d728e5d80559a0a12b92d30d036e43b129f0faf52aa9aa200f78ffbe4326a1adc4e71a1909181d85a41a367562388663eee968582fac484b23bc57721aaf10fe044dbdac26158d067bbab1e8b4981060f6a9c3ef3150d4cfdae01c86fcd117062c0abf678e9a38ab3392c9dc74ba0519fdcff97849a05ebb5372194ffa878ebd3be5e3bb36d0a6b3e3e8575c71e63cf7d6c367227bec3cedd3ce3399ff84fd593c52e5d0e971a8e7697c2ff2cd314a2b2e7df947eb974ef5d71e94bd1714c3731b57248aeda55838adbd35a6553bf1ccd2df90247d7f0aa71193a89e46805189457f170aa6755c4feb265b8b3677265898d618b5efb55e6c9a2d3b4d4315c247df6df0e51d550eb50c55d2cef9bbcd9bec1b5e0fc9c22ba45e4b517eb060fe2231801b0d78d2f3140232b37884c62127e3aa561a5b6d9966d3588e38d71cc3547d8f2965936699d95939999be3d4155196796363865dabc817401ac8af8563364417209a58077cf852bf8958434a83b887d1907a235575644f0679fed74d41b0f2f8f3c4bb55025725409ec93e6c0816f5297d976a51e1e903dd7863014ae33eaa90dd8b0a140ba138f0172f6a0ad9957204cc4ce959a386aee37fb5237501db2115017dfbaae45f9b435dc3bc4654a36757661f608bb2cf42d5b1d2aa5f5254f09c27225c682582bee6e75ed80fe468b6587ec6b61a136ca12c89ea976d0f2628a815ac7dca54c40de39c83587e2e45a199df6920212db399b0fa5525146995934e2d15f4554dc29ef72aac9b6eb63753dd2b3cca910dc37263345f0cb7f464c41acea8d8c3b2e1abddf74884b96f77410442254d4b5df2e16c044ff909a376fd6b770a86e3730099aaee2a837fdc730aa157a6273b1ab2c421c471542802af9f206153a21a9beb768660bd20b157b81ff95e3e84203a64cc4ba73c0735de356204b8c070fe9eea69ccfec7bd149a16d53ae4409c2e4dd54fc7cb84f630c8d0830333c1d5d93477e1d373dd84000375cfcd3d4bd74e303c70b579f3d378d6888a5251aa34938a18852746fc6454d29fff759d7fbe858670ffdf39580e4d6e334dbe63d2207af233ef8bd97403a917eaa96cca836f32a9df11fb8ab691f256af93b5636c233760605f4831c4bb4ffe05bfd0650129763ed9fe161a5c624900daf7973ebf2f0b4d3981b2d74e1538b12be30126078343d4bddb744f621ae1b8033e78ca44030e5135676706f6207bc3f8534e2a1d3fb82a844fd87bac68d4831c74c36d206370d7bf4f009b9ba1e9fc56db1ac483777d5926de5a322868d59948cee1485f74040f940f46370a620229b1220fda00e8f42329799326a07d3b37418d909ea92332104f65f31c9b8b197d73a3460c85c96baae845a011545c3fc3748fadafbb895c1b75fb1257a7e8048c0228e8068dc863e04ab9c21c3f5d07888e3df272b3dfdbfa96e8b4ad1c7f4bae6380edb40b1a5e58631c823eb90b8b9153e8846e617066b70a9109d556ffe227fbcfdd761cf72610964b9e39b21d2ce77351d9f8f1d17f93350532dea2afeb9ca4995cea965541c18eb752e60511ce20da3c56fb9a6fc6f039e878aefa40420b3b4c6bcf689811d1b303e3c81ed2437461cac9c8abc24a3579a8f63ae512aabb516e1a0783ddaeac279a8138e460ffada816b3c986460bd5f6d56972753bc9c39d52a8f3b00ffea329da76e78d3c290523a511bd3af5eb7fbc93524f603ca634b2edab1b9179995a331cb3b26f2b226c11a459c39824e7d62818ee94758280298f7bfbb0ecdd93b4ff76b4e05fd306919fab92a29f757b13460ad831630c66383f7c8bda45588b6cee83617d1625191c4d3799415655aae88cc20e9e7a59231958f97ffc68a80e4321d8dd69287c609817e962b7b22aa12e5df9428126c868b0e10abe712d797161eae2c8f5abe3069a051234abe72ea06fb4a4a752e3ec909b9a3277c11bf3c899aa2b1bbd62e1d39bae4c476ee190590c1abd26121ba3e2397676e2ddbb4eead1b6283b75ed470d9b1261678e5b2b062b9ba060d02dbcc598de2bcfe020e90e46595215168ea677e885cf" + } + ] +} \ No newline at end of file