Initial commit
This commit is contained in:
commit
ae683087bb
19
LICENSE
Normal file
19
LICENSE
Normal file
|
@ -0,0 +1,19 @@
|
|||
Copyright (c) 2023 WeebDataHoarder, PhytonUtils Contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
38
README.md
Normal file
38
README.md
Normal file
|
@ -0,0 +1,38 @@
|
|||
# Phyton Utils
|
||||
|
||||
These are utilities and documentation for devices commonly released by [Phyton / Фитон](https://www.phyton.ru/), [AlmaCode](https://almacode.ru/), [AngioCode](https://angiocode.ru/), [RadiaCode](https://www.radiacode.com/);
|
||||
a group of Russian companies that provide embedded devices for healthcare, industrial and military applications.
|
||||
|
||||
Most of their products, software or hardware, are undocumented and/or heavily obfuscated, encrypted, or worse.
|
||||
|
||||
These utilities allow researchers to inspect the devices and work with them directly, allowing, between others:
|
||||
* Decoding of Firmware files, both `Phyton` format and `AlmaCode` format
|
||||
* Decryption of Firmware Blocks
|
||||
* Encryption of Firmware Blocks
|
||||
* Decompression of Custom compressed data
|
||||
* Compression to Custom compressed data
|
||||
* Calculate custom CRC of data
|
||||
* Decryption of device Memory dumps
|
||||
* Custom Firmware files
|
||||
* Device debugging, repair, unbricking
|
||||
* Decode `RD_FLASH_AREA` messages
|
||||
|
||||
### Disclaimers
|
||||
|
||||
Note this repository does not include code to communicate with devices via either USB or Bluetooth.
|
||||
Other projects are available for that purpose.
|
||||
|
||||
All information and data in this repository was produced without physical disassembly of devices,
|
||||
using publicly available information, files and software.
|
||||
|
||||
### Tested devices and firmwares
|
||||
* RadiaCode RC-102
|
||||
|
||||
## Documentation
|
||||
|
||||
Some items have been written in text form. For others, please refer to the source code.
|
||||
|
||||
* [Encryption notes](doc/ENCRYPTION.md)
|
||||
* [Compression notes](doc/COMPRESSION.md)
|
||||
* [Firmware notes](doc/FIRMWARE.md)
|
||||
* [CRC notes](doc/CRC.md)
|
230
buffer/buffer.go
Normal file
230
buffer/buffer.go
Normal file
|
@ -0,0 +1,230 @@
|
|||
package buffer
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
"math"
|
||||
)
|
||||
|
||||
type Buffer []byte
|
||||
|
||||
func (b *Buffer) ReadByte() (uint8, error) {
|
||||
if len(*b) == 0 {
|
||||
return 0, io.EOF
|
||||
}
|
||||
defer func() {
|
||||
*b = (*b)[1:]
|
||||
}()
|
||||
return (*b)[0], nil
|
||||
}
|
||||
|
||||
func (b *Buffer) Read(buf []byte) (int, error) {
|
||||
if len(*b) == 0 {
|
||||
return 0, io.EOF
|
||||
}
|
||||
if len(*b) < len(buf) {
|
||||
defer func() {
|
||||
*b = nil
|
||||
}()
|
||||
copy(buf, *b)
|
||||
return len(*b), io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
defer func() {
|
||||
*b = (*b)[len(buf):]
|
||||
}()
|
||||
copy(buf, *b)
|
||||
return len(buf), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) Skip(n int) error {
|
||||
if len(*b) == 0 {
|
||||
return io.EOF
|
||||
}
|
||||
if len(*b) < n {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
*b = (*b)[n:]
|
||||
return nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadInt32() (int32, error) {
|
||||
var buf [4]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int32(binary.LittleEndian.Uint32(buf[:])), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadUint32() (uint32, error) {
|
||||
var buf [4]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return binary.LittleEndian.Uint32(buf[:]), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadUint32BE() (uint32, error) {
|
||||
var buf [4]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return binary.BigEndian.Uint32(buf[:]), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadFloat32() (float32, error) {
|
||||
var buf [4]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return math.Float32frombits(binary.LittleEndian.Uint32(buf[:])), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadInt16() (int16, error) {
|
||||
var buf [2]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int16(binary.LittleEndian.Uint16(buf[:])), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadUint16() (uint16, error) {
|
||||
var buf [2]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return binary.LittleEndian.Uint16(buf[:]), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadUint16BE() (uint16, error) {
|
||||
var buf [2]byte
|
||||
_, err := io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return binary.BigEndian.Uint16(buf[:]), nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadBytes() ([]byte, error) {
|
||||
l, err := b.ReadByte()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
buf := make([]byte, l)
|
||||
_, err = io.ReadFull(b, buf[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return buf, nil
|
||||
}
|
||||
|
||||
func (b *Buffer) ReadString() (string, error) {
|
||||
buf, err := b.ReadBytes()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return string(buf), nil
|
||||
}
|
||||
|
||||
type PanicBuffer []byte
|
||||
|
||||
func (b *PanicBuffer) ReadByte() uint8 {
|
||||
v, err := (*Buffer)(b).ReadByte()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) Read(buf []byte) int {
|
||||
v, err := (*Buffer)(b).Read(buf)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) Skip(n int) {
|
||||
err := (*Buffer)(b).Skip(n)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadInt32() int32 {
|
||||
v, err := (*Buffer)(b).ReadInt32()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadUint32() uint32 {
|
||||
v, err := (*Buffer)(b).ReadUint32()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadUint32BE() uint32 {
|
||||
v, err := (*Buffer)(b).ReadUint32BE()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadFloat32() float32 {
|
||||
v, err := (*Buffer)(b).ReadFloat32()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadInt16() int16 {
|
||||
v, err := (*Buffer)(b).ReadInt16()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadUint16() uint16 {
|
||||
v, err := (*Buffer)(b).ReadUint16()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadUint16BE() uint16 {
|
||||
v, err := (*Buffer)(b).ReadUint16BE()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadBytes() []byte {
|
||||
v, err := (*Buffer)(b).ReadBytes()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
||||
|
||||
func (b *PanicBuffer) ReadString() string {
|
||||
v, err := (*Buffer)(b).ReadString()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return v
|
||||
}
|
68
compression/compress.go
Normal file
68
compression/compress.go
Normal file
|
@ -0,0 +1,68 @@
|
|||
package compression
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"github.com/icza/bitio"
|
||||
)
|
||||
|
||||
func FirmwareBlockCompress(data []byte, exhaustive bool) (output []byte, err error) {
|
||||
if len(data) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
if len(data) > DataMaxSize {
|
||||
return nil, errors.New("out of bounds input")
|
||||
}
|
||||
|
||||
windowIndex := WindowInitialIndex
|
||||
|
||||
window := CreateWindow()
|
||||
|
||||
outputBuffer := bytes.NewBuffer(make([]byte, 0, DataMaxSize))
|
||||
w := bitio.NewWriter(outputBuffer)
|
||||
|
||||
for len(data) > 0 {
|
||||
// Find maximum pattern in window
|
||||
|
||||
offsetIndex, length := window.Find(windowIndex, data, exhaustive)
|
||||
|
||||
if offsetIndex != -1 {
|
||||
// write false for not encoding a literal
|
||||
if err = w.WriteBool(false); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// write index in table
|
||||
if err = w.WriteBits(uint64(offsetIndex), OffsetBits); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// write size of match
|
||||
if err = w.WriteBits(uint64(length-MaxUncoded), LengthBits); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
windowIndex = window.Set(windowIndex, data[:length])
|
||||
data = data[length:]
|
||||
} else {
|
||||
// write true for encoding a literal
|
||||
if err = w.WriteBool(true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
literal := data[0]
|
||||
data = data[1:]
|
||||
windowIndex = window.SetByte(windowIndex, literal)
|
||||
|
||||
// Write literal value
|
||||
if err = w.WriteBits(uint64(literal), LiteralBits); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err = w.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return outputBuffer.Bytes(), nil
|
||||
}
|
23
compression/constants.go
Normal file
23
compression/constants.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
package compression
|
||||
|
||||
const DataMaxSize = 0x8000
|
||||
|
||||
const LiteralBits = 8
|
||||
|
||||
// OffsetBits Number of bits for the Window offset. From this the WindowSize will be calculated
|
||||
// In other LZSS implementations, this is usually set to 12
|
||||
const OffsetBits = 11
|
||||
const LengthBits = 4
|
||||
|
||||
const WindowSize = 1 << OffsetBits
|
||||
|
||||
const MaxUncoded = 2
|
||||
const MaxCoded = MaxUncoded + (1 << LengthBits)
|
||||
|
||||
// WindowInitialIndex The windowIndex needs to be set to this before compression/decompression
|
||||
// In other LZSS implementations, this is usually set to 0
|
||||
const WindowInitialIndex = WindowSize - 0x10 - 1
|
||||
|
||||
// WindowFillValue Initial value to fill Window[0 : WindowInitialIndex]
|
||||
// In other LZSS implementations, this is usually set to 0x20, but Window[] is filled entirely
|
||||
const WindowFillValue = 0x20
|
54
compression/decompress.go
Normal file
54
compression/decompress.go
Normal file
|
@ -0,0 +1,54 @@
|
|||
package compression
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"github.com/icza/bitio"
|
||||
)
|
||||
|
||||
func FirmwareBlockDecompress(data []byte) (output []byte, err error) {
|
||||
|
||||
windowIndex := WindowInitialIndex
|
||||
|
||||
output = make([]byte, 0, DataMaxSize)
|
||||
|
||||
window := CreateWindow()
|
||||
|
||||
windowBuffer := make([]byte, len(window))
|
||||
|
||||
r := bitio.NewReader(bytes.NewReader(data))
|
||||
|
||||
var buf []byte
|
||||
var isLiteral bool
|
||||
var length, literal, offsetIndex uint64
|
||||
for {
|
||||
|
||||
if isLiteral, err = r.ReadBool(); err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
if !isLiteral {
|
||||
if offsetIndex, err = r.ReadBits(OffsetBits); err != nil {
|
||||
break
|
||||
} else if length, err = r.ReadBits(LengthBits); err != nil {
|
||||
return nil, err
|
||||
} else if length += MaxUncoded; DataMaxSize < (length + uint64(len(output))) {
|
||||
return nil, errors.New("out of bounds output")
|
||||
}
|
||||
|
||||
windowIndex, buf = window.GetSet(int(offsetIndex), windowIndex, int(length), windowBuffer)
|
||||
output = append(output, buf...)
|
||||
} else {
|
||||
if literal, err = r.ReadBits(LiteralBits); err != nil {
|
||||
break
|
||||
} else if (DataMaxSize - 1) < len(output) {
|
||||
return nil, errors.New("out of bounds output")
|
||||
}
|
||||
|
||||
output = append(output, byte(literal))
|
||||
windowIndex = window.SetByte(windowIndex, byte(literal))
|
||||
}
|
||||
}
|
||||
|
||||
return output, nil
|
||||
}
|
103
compression/window.go
Normal file
103
compression/window.go
Normal file
|
@ -0,0 +1,103 @@
|
|||
package compression
|
||||
|
||||
type Window [WindowSize]byte
|
||||
|
||||
func CreateWindow() (t Window) {
|
||||
_ = t[WindowInitialIndex-1]
|
||||
|
||||
// prefill lookup table
|
||||
for i := 0; i < WindowInitialIndex; i++ {
|
||||
t[i] = WindowFillValue
|
||||
}
|
||||
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *Window) Find(windowIndex int, buf []byte, exhaustive bool) (offsetIndex, length int) {
|
||||
_ = buf[0]
|
||||
|
||||
firstData := buf[0]
|
||||
|
||||
offsetIndex = -1
|
||||
length = -1
|
||||
|
||||
var t2 Window
|
||||
|
||||
for i := range t {
|
||||
// Applying this offset compresses better in non-exhaustive mode
|
||||
currentOffsetIndex := t.Index(windowIndex + i - 1)
|
||||
if t[currentOffsetIndex] == firstData {
|
||||
t2 = *t
|
||||
|
||||
var data byte
|
||||
lookupIndex2 := t2.SetByte(windowIndex, firstData)
|
||||
|
||||
matchSize := 1
|
||||
|
||||
for j := 1; j < len(buf) && j < (MaxCoded-1); j++ {
|
||||
if lookupIndex2, data = t2.GetSetByte(currentOffsetIndex+j, lookupIndex2); data != buf[j] {
|
||||
break
|
||||
}
|
||||
matchSize++
|
||||
}
|
||||
|
||||
if matchSize > length && matchSize >= MaxUncoded {
|
||||
offsetIndex = currentOffsetIndex
|
||||
length = matchSize
|
||||
|
||||
if !exhaustive {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (t *Window) Peek(offsetIndex, length int, buf []byte) []byte {
|
||||
_ = buf[length-1]
|
||||
|
||||
for j := 0; j < length; j++ {
|
||||
buf[j] = t[t.Index(offsetIndex+j)]
|
||||
}
|
||||
|
||||
return buf[:length]
|
||||
}
|
||||
|
||||
func (t *Window) GetSet(offsetIndex, windowIndex, length int, buf []byte) (int, []byte) {
|
||||
_ = buf[length-1]
|
||||
|
||||
for j := 0; j < length; j++ {
|
||||
buf[j] = t[t.Index(offsetIndex+j)]
|
||||
t[t.Index(windowIndex+j)] = buf[j]
|
||||
}
|
||||
|
||||
return t.Index(windowIndex + length), buf[:length]
|
||||
}
|
||||
|
||||
func (t *Window) Set(windowIndex int, buf []byte) int {
|
||||
for j := range buf {
|
||||
t[t.Index(windowIndex+j)] = buf[j]
|
||||
}
|
||||
return t.Index(windowIndex + len(buf))
|
||||
}
|
||||
|
||||
func (t *Window) GetSetByte(offsetIndex, windowIndex int) (int, byte) {
|
||||
data := t[t.Index(offsetIndex)]
|
||||
t[t.Index(windowIndex)] = data
|
||||
return t.Index(windowIndex + 1), data
|
||||
}
|
||||
|
||||
func (t *Window) GetByte(offsetIndex int) byte {
|
||||
return t[t.Index(offsetIndex)]
|
||||
}
|
||||
|
||||
func (t *Window) SetByte(windowIndex int, data byte) int {
|
||||
t[t.Index(windowIndex)] = data
|
||||
return t.Index(windowIndex + 1)
|
||||
}
|
||||
|
||||
func (t *Window) Index(i int) int {
|
||||
return i & (WindowSize - 1)
|
||||
}
|
63
crc/crc.go
Normal file
63
crc/crc.go
Normal file
|
@ -0,0 +1,63 @@
|
|||
package crc
|
||||
|
||||
var CRCTable = func() [256]uint32 {
|
||||
polynomialDivision := func(polynomial, input uint64, len uint) uint64 {
|
||||
mask := uint64(1)<<len - 1
|
||||
|
||||
for i := uint(0); i < len; i++ {
|
||||
bitOut := input>>(len-1) > 0
|
||||
input <<= 1
|
||||
if bitOut {
|
||||
input ^= polynomial
|
||||
}
|
||||
input &= mask
|
||||
}
|
||||
|
||||
return input
|
||||
}
|
||||
var table [256]uint32
|
||||
for i := 0; i < 256; i++ {
|
||||
table[i] = uint32(polynomialDivision(0x04C11DB7, uint64(i), 32))
|
||||
}
|
||||
return table
|
||||
}()
|
||||
|
||||
type CRC struct {
|
||||
crc uint32
|
||||
}
|
||||
|
||||
func NewCRC() *CRC {
|
||||
return &CRC{
|
||||
crc: 0xFFFFFFFF,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CRC) Update(buf []byte) {
|
||||
const chunkSize = 4
|
||||
remainder := len(buf) % chunkSize
|
||||
chunks := len(buf) / chunkSize
|
||||
|
||||
for chunksLeft := chunks; chunksLeft > 0; chunksLeft-- {
|
||||
index := (chunks - chunksLeft) * chunkSize
|
||||
c.crc = CRCTable[((buf[index+3]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
|
||||
c.crc = CRCTable[((buf[index+2]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
|
||||
c.crc = CRCTable[((buf[index+1]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
|
||||
c.crc = CRCTable[((buf[index]&255)^byte(c.crc>>24))] ^ (c.crc << 8)
|
||||
}
|
||||
|
||||
if remainder != 0 {
|
||||
var paddingBuffer [chunkSize]byte
|
||||
copy(paddingBuffer[:], buf[chunks*chunkSize:])
|
||||
c.Update(paddingBuffer[:])
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CRC) Sum32() uint32 {
|
||||
return c.crc
|
||||
}
|
||||
|
||||
func CalculateCRC(buf []byte) uint32 {
|
||||
crc := NewCRC()
|
||||
crc.Update(buf)
|
||||
return crc.Sum32()
|
||||
}
|
31
doc/COMPRESSION.md
Normal file
31
doc/COMPRESSION.md
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Compression notes
|
||||
The algorithm used is mainly [LZSS](https://en.wikipedia.org/wiki/LZSS) with the following constants:
|
||||
|
||||
```go
|
||||
package compression
|
||||
|
||||
const DataMaxSize = 0x8000
|
||||
|
||||
const LiteralBits = 8
|
||||
// OffsetBits Number of bits for the Window offset. From this the WindowSize will be calculated
|
||||
// In other LZSS implementations, this is usually set to 12
|
||||
const OffsetBits = 11
|
||||
const LengthBits = 4
|
||||
|
||||
const WindowSize = 1 << OffsetBits
|
||||
|
||||
const MaxUncoded = 2
|
||||
const MaxCoded = MaxUncoded + (1 << LengthBits)
|
||||
|
||||
// WindowInitialIndex The windowIndex needs to be set to this before compression/decompression
|
||||
// In other LZSS implementations, this is usually set to 0
|
||||
const WindowInitialIndex = WindowSize - 0x10 - 1
|
||||
|
||||
// WindowFillValue Initial value to fill Window[0 : WindowInitialIndex]
|
||||
// In other LZSS implementations, this is usually set to 0x20, but Window[] is filled entirely
|
||||
const WindowFillValue = 0x20
|
||||
```
|
||||
|
||||
When initializing the _Window_, up to `WindowInitialIndex` are filled compared to the whole Window as usual.
|
||||
|
||||
Additionally, the initial _windowIndex_ needs to also be set to `WindowInitialIndex` instead of 0.
|
5
doc/CRC.md
Normal file
5
doc/CRC.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# CRC notes
|
||||
|
||||
Uses 32-bit "MPEG2" polynomial 0x04C11DB7, data is fed in chunks of 4 bytes, little endian (swap order of each chunk bytes).
|
||||
|
||||
End chunk has to be padded with \x00 to fit into 4.
|
145
doc/ENCRYPTION.md
Normal file
145
doc/ENCRYPTION.md
Normal file
|
@ -0,0 +1,145 @@
|
|||
# Encryption notes
|
||||
|
||||
## Mangle Block Cipher
|
||||
This cipher is used on encryption of firmware and memory data. The name Mangle has been arbitrarily chosen.
|
||||
|
||||
### Mangle Key
|
||||
A mangle key is a 128-bit sequence of bytes, either fixed or dynamically generated.
|
||||
Some of these keys are stored in Tables listed below.
|
||||
|
||||
Each Mangle Key is split in 4 `uint32` sub-keys. These are selected depending on the round number.
|
||||
|
||||
Some of these keys are organized in key tables. This is a collection of 8 128-bit keys in an addressable way.
|
||||
|
||||
### Design
|
||||
Mangle is an iterative, 64-bit block cipher.
|
||||
Directly, 128-bit keys are used, but several of these are combined in the full Mangle construct.
|
||||
|
||||
The round function is composed of two parts, that mix the data of the two halves.
|
||||
|
||||
For each block, 48 rounds are applied consecutively, with each round modifying one of the halves alternatively.
|
||||
|
||||
```go
|
||||
package mangle
|
||||
|
||||
type Key [4]uint32
|
||||
|
||||
const Rounds = 48
|
||||
|
||||
func Encrypt(key Key, block uint64) uint64 {
|
||||
dataA, dataB := uint32(block), uint32(block>>32)
|
||||
for round := int32(0); round < Rounds; round++ {
|
||||
// Swap dataA and dataB
|
||||
dataB, dataA = encryptRound(key[(round&3)<<2], dataA, dataB, uint32(round))
|
||||
}
|
||||
return uint64(dataA) | (uint64(dataB) << 32)
|
||||
}
|
||||
|
||||
func encryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
|
||||
dataA = round + roundKey + ((dataB >> 8) ^ (dataB << 6)) + dataB + dataA
|
||||
return dataA, dataB
|
||||
}
|
||||
|
||||
func Decrypt(key Key, block uint64) uint64 {
|
||||
dataA, dataB := uint32(block), uint32(block>>32)
|
||||
// Rounds run inverse to Encrypt
|
||||
for round := int32(Rounds - 1); round != -1; round-- {
|
||||
// Swap dataA and dataB
|
||||
dataA, dataB = decryptRound(key[(round&3)<<2], dataB, dataA, uint32(round))
|
||||
}
|
||||
return uint64(dataA) | (uint64(dataB) << 32)
|
||||
}
|
||||
|
||||
func decryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
|
||||
dataA = (dataA - dataB) - ((dataB >> 8) ^ (dataB << 6)) - roundKey - round
|
||||
return dataA, dataB
|
||||
}
|
||||
```
|
||||
|
||||
### Mode of operation
|
||||
The cipher operates in ECB mode. As such, blocks containing the same value will encrypt equally.
|
||||
|
||||
Attacking this cipher without knowledge of key material or algorithm is trivial,
|
||||
given access to an Encryption Oracle and starting knowledge of a full 64-bit block in target material.
|
||||
|
||||
|
||||
### Hardcoded Mangle Key Table
|
||||
|
||||
This table is hardcoded in firmware, and seems to be used across all devices known.
|
||||
|
||||
It gets used on the Outer Mangle and the Inner Mangle, depending on the selected Mangle Index.
|
||||
|
||||
| Offset | Identifier | Key Data |
|
||||
|:------:|:----------:|:------------------------------------------------:|
|
||||
| 0 | _Firmware_ | `0x0539c06f, 0x3a235801, 0x1bb4da80, 0x44916a65` |
|
||||
| 1 | _DeviceId_ | `0x5b01cb35, 0xb498a4fb, 0xe9486d82, 0xf4945010` |
|
||||
| 2 | | `0xe8babcec, 0x2aa73df8, 0x4cf9f79c, 0x886d73e7` |
|
||||
| 3 | | `0x25483503, 0xb1a0a8af, 0x24a745b2, 0xf5e21339` |
|
||||
| 4 | | `0x42d89088, 0x37a379af, 0x422689e0, 0x636239e9` |
|
||||
| 5 | | `0xabd061f0, 0x7f710579, 0xbd626b51, 0x2af22c15` |
|
||||
| 6 | _Memory_ | `0xb341bc06, 0x6e6e4674, 0xb3eb7b01, 0xf1965b32` |
|
||||
| 7 | | `0x52f33e6f, 0x4d69a2f9, 0x77ab77c4, 0x468f4508` |
|
||||
|
||||
Several offsets from this table are used for either the outer mangle or other purposes.
|
||||
* #0: _Firmware Outer Mangle Key_
|
||||
* #1: _Device Id Outer Mangle Key_
|
||||
* #6: _Memory Outer Mangle Key_
|
||||
|
||||
### Alternate Mangle Key Table
|
||||
|
||||
This table is hardcoded in firmware, however, seems to be set to all zeros. No usages in the wild have been found.
|
||||
|
||||
It gets used on the Inner Mangle, depending on the selected Mangle Index.
|
||||
|
||||
| Offset | Key Data |
|
||||
|:------:|:------------------------------------------------:|
|
||||
| 0 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 1 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 2 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 3 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 4 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 5 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 6 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
| 7 | `0x00000000, 0x00000000, 0x00000000, 0x00000000` |
|
||||
|
||||
|
||||
### Data Mangle Key
|
||||
This key is randomly generated via various methods. It is 512 bytes long,
|
||||
and includes the CRC of the original data being encrypted (before compression) twice.
|
||||
|
||||
Structure is as follows:
|
||||
```
|
||||
Mangle Index (2 bytes)
|
||||
blob[0:2] = Mangle Index uint16
|
||||
Mangle Key Block (24 bytes)
|
||||
blob[2:18] = random() Data Mangle Key
|
||||
blob[18:22] = CRC(data)
|
||||
blob[22:26] = CRC(data)
|
||||
Unused Key Block (486 bytes)
|
||||
blob[26:512] = random() Unused
|
||||
```
|
||||
|
||||
Although the blob generated is 512 bytes long, only `blob[2:18]` is used as the Key, which does not include the CRC.
|
||||
|
||||
### Device Id Specific Mangle Key
|
||||
Data can be coded specifically to a given device id, which is local to the device.
|
||||
|
||||
It gets used on the Inner Mangle, depending on the selected Mangle Index.
|
||||
|
||||
Slot #1 from the _Hardcoded Mangle Key Table_ is used here.
|
||||
|
||||
```go
|
||||
package mangle
|
||||
|
||||
type Key [4]uint32
|
||||
var HardcodedKeyTable [8]Key
|
||||
|
||||
func DeviceKey(deviceId1, deviceId2, deviceId3 uint32) (key Key) {
|
||||
outerKey := HardcodedKeyTable[1]
|
||||
key[0] = outerKey[0] ^ deviceId1
|
||||
key[1] = outerKey[1] ^ deviceId2
|
||||
key[2] = outerKey[2] ^ deviceId3
|
||||
key[3] = outerKey[3]
|
||||
return key
|
||||
}
|
||||
```
|
74
doc/FIRMWARE.md
Normal file
74
doc/FIRMWARE.md
Normal file
|
@ -0,0 +1,74 @@
|
|||
# Firmware notes
|
||||
|
||||
## ASFileHeader
|
||||
| Field | Type | Size | Notes |
|
||||
|:----------------------:|:----------:|:--------------------------:|:------------------------------------------------------------------------------------------------------------------------------------:|
|
||||
| *Marker* | `[8]byte` | 8 | Can be either `Phyton\x00\x00` or `AlmaCode`. |
|
||||
| *Header Size* | `uint32` | 4 | Size of whole Header struct. Fields may be omitted if they exceed the size. |
|
||||
| *Date Time* | `uint32` | 4 | Release time in _FirmwareDateTime_ encoding. |
|
||||
| *Buffer Size* | `uint32` | 4 | TBD |
|
||||
| *Serial Number* | `[16]byte` | 16 | Firmware coded for a specific device S/N. Usually all zeros. |
|
||||
| *Version Low* | `uint8` | 1 | |
|
||||
| *Version High* | `uint8` | 1 | |
|
||||
| *Version* | - | - | Derived from _Version Low_ and _Version High_.<br/>`fmt.Sprintf("%d.%02d", VersionHigh, VersionLow)` |
|
||||
| *File Count* | `uint32` | 4 | TBD. Only used if _Marker_ == `AlmaCode` |
|
||||
| *Firmware Header Size* | `uint32` | 4 | TBD |
|
||||
| *Compressed* | `bool` | 1 | Set to `1` on files with compressed FirmwareBlock. |
|
||||
| *Reserved* | `uint8` | 1 | Set to `0`. |
|
||||
| *CRC32* | `uint32` | 4 | Contains the [CRC](CRC.md) of _Data_. |
|
||||
| *Data* | `[]byte` | _len(buf)_ - _Buffer Size_ | In case of _Marker_ == `Phyton\x00\x00`, `[]FirmwareBlock` follows until EOF.<br/>Refer to source code to decode `AlmaCode` format. |
|
||||
|
||||
#### DateTime
|
||||
```go
|
||||
package radiacode
|
||||
|
||||
import "time"
|
||||
|
||||
func DateTimeToTime(dt uint32) time.Time {
|
||||
high := uint16(dt >> 16)
|
||||
low := uint16(dt)
|
||||
|
||||
year := ((high >> 9) & 127) + 1980
|
||||
month := (high >> 5) & 15
|
||||
day := high & 31
|
||||
hours := (low >> 11) & 31
|
||||
minutes := (low >> 5) & 63
|
||||
seconds := (low & 31) * 2
|
||||
|
||||
return time.Date(int(year), time.Month(month), int(day), int(hours), int(minutes), int(seconds), 0, time.UTC)
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Block
|
||||
| Field | Type | XOR Key | Size | Notes |
|
||||
|:--------------:|:-----------:|:------------:|:--------------:|:------------------------------------------------------------------------------------------------------------------------:|
|
||||
| *Header Size* | `uint32` | - | 4 | Denotes the size of the header.<br/>Should be 12, but some weird cases exist in firmware to pad it, 0 value, or 0xFFFF?. |
|
||||
| *Size* | `uint32` | _0xCE27A932_ | 4 | |
|
||||
| *Addr* | `uint32` | _0xB2D5A864_ | 4 | Denotes the location of _Data_ in Flash. |
|
||||
| *Size Aligned* | - | - | - | Derived from _Size_, 8 byte alignment. See [Size Aligned derivation](#size-aligned-derivation) |
|
||||
| *Key Data* | `[512]byte` | - | 512 | Encryption keys |
|
||||
| *Data* | `[]byte` | - | _Size Aligned_ | |
|
||||
|
||||
After each _FirmwareBlock_ a new one follows, or EOF. So far each new one addresses the next memory block sequentially, without gaps.
|
||||
|
||||
Note that if _ASFileHeader_ has _Compressed_ field set, the Data will be smaller than the actual region.
|
||||
|
||||
#### Size Aligned derivation
|
||||
|
||||
```go
|
||||
package radiacode
|
||||
|
||||
func AlignSize(size uint32) uint32 {
|
||||
if (size % 8) != 0 {
|
||||
size = (size & uint32(0xFFFFFFF8)) + 8
|
||||
}
|
||||
return size
|
||||
}
|
||||
```
|
||||
|
||||
## Encryption of Block Key + Data
|
||||
See [Encryption notes](ENCRYPTION.md)
|
||||
|
||||
## Compression of FirmwareBlock Data
|
||||
See [Compression notes](COMPRESSION.md)
|
171
encryption/block.go
Normal file
171
encryption/block.go
Normal file
|
@ -0,0 +1,171 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
|
||||
)
|
||||
|
||||
const EncryptedBlockKeySize = 512
|
||||
|
||||
const EncryptedBlockMangleIndexOffset = 0
|
||||
const EncryptedBlockMangleKeyOffset = EncryptedBlockMangleIndexOffset + 2
|
||||
const EncryptedBlockCRC1Offset = EncryptedBlockMangleKeyOffset + MangleKeyDataSize
|
||||
const EncryptedBlockCRC2Offset = EncryptedBlockCRC1Offset + 4
|
||||
const EncryptedBlockPaddingKeyOffset = EncryptedBlockCRC2Offset + 4
|
||||
|
||||
type EncryptedBlock []byte
|
||||
|
||||
func (b EncryptedBlock) MangleKey() MangleKeyData {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
return MangleKeyData(b[EncryptedBlockMangleKeyOffset:EncryptedBlockCRC1Offset])
|
||||
}
|
||||
|
||||
// MangleKeyBlock Includes inner MangleKeyData and CRC1, CRC2
|
||||
func (b EncryptedBlock) MangleKeyBlock() []byte {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
return b[EncryptedBlockMangleKeyOffset:EncryptedBlockPaddingKeyOffset]
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) KeyBlock() []byte {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
return b[:EncryptedBlockKeySize]
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) DataBlock() []byte {
|
||||
return b[EncryptedBlockKeySize:]
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) MangleIndex() uint32 {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
return uint32(binary.LittleEndian.Uint16(b[EncryptedBlockMangleIndexOffset:]))
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) CRC() (crc1, crc2 uint32) {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
return binary.LittleEndian.Uint32(b[EncryptedBlockCRC1Offset:]), binary.LittleEndian.Uint32(b[EncryptedBlockCRC2Offset:])
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) Reset() {
|
||||
clear(b)
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) generateKeyBlock(generator KeyGenerator) (mangleIndex uint32) {
|
||||
_ = b[EncryptedBlockKeySize-1]
|
||||
|
||||
crcValue := crc.CalculateCRC(b.DataBlock())
|
||||
|
||||
binary.LittleEndian.PutUint32(b[EncryptedBlockCRC1Offset:], crcValue)
|
||||
binary.LittleEndian.PutUint32(b[EncryptedBlockCRC2Offset:], crcValue)
|
||||
|
||||
generator.Fill(b[EncryptedBlockMangleKeyOffset:EncryptedBlockCRC1Offset])
|
||||
generator.Fill(b[EncryptedBlockPaddingKeyOffset:EncryptedBlockKeySize])
|
||||
|
||||
return generator.MangleIndex()
|
||||
}
|
||||
|
||||
const (
|
||||
mangleIndexNormalKey0 = iota
|
||||
mangleIndexNormalKey1
|
||||
mangleIndexNormalKey2
|
||||
mangleIndexNormalKey3
|
||||
mangleIndexNormalKey4
|
||||
mangleIndexNormalKey5
|
||||
mangleIndexNormalKey6
|
||||
mangleIndexNormalKey7
|
||||
|
||||
mangleIndexAlternateKey0
|
||||
mangleIndexAlternateKey1
|
||||
mangleIndexAlternateKey2
|
||||
mangleIndexAlternateKey3
|
||||
mangleIndexAlternateKey4
|
||||
mangleIndexAlternateKey5
|
||||
mangleIndexAlternateKey6
|
||||
mangleIndexAlternateKey7
|
||||
|
||||
mangleIndexDeviceKey = 0xffff
|
||||
)
|
||||
|
||||
func (b EncryptedBlock) Encrypt(material KeyMaterial) {
|
||||
|
||||
mangleIndex := b.generateKeyBlock(material.Generator)
|
||||
|
||||
// Mangle of data
|
||||
b.MangleKey().Encrypt(b.DataBlock())
|
||||
|
||||
// Inner mangle of key
|
||||
if material.AlternateMangleKey != nil {
|
||||
material.AlternateMangleKey[mangleIndex].Encrypt(b.MangleKeyBlock())
|
||||
|
||||
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], uint16(mangleIndex+mangleIndexAlternateKey0))
|
||||
} else if material.DeviceKey != nil {
|
||||
material.DeviceKey.Encrypt(b.MangleKeyBlock())
|
||||
|
||||
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], mangleIndexDeviceKey)
|
||||
} else {
|
||||
HardcodedMangleTable[mangleIndex].Encrypt(b.MangleKeyBlock())
|
||||
|
||||
binary.LittleEndian.PutUint16(b[EncryptedBlockMangleIndexOffset:], uint16(mangleIndex))
|
||||
}
|
||||
|
||||
// Outer mangle of key
|
||||
HardcodedMangleTable[material.OuterKeyOffset].Encrypt(b.KeyBlock())
|
||||
}
|
||||
|
||||
func (b EncryptedBlock) Decrypt(material KeyMaterial, verifyCrc bool) (err error) {
|
||||
// Outer unmangle of key
|
||||
HardcodedMangleTable[material.OuterKeyOffset].Decrypt(b.KeyBlock())
|
||||
|
||||
mangleIndex := b.MangleIndex()
|
||||
|
||||
var keyData MangleKeyData
|
||||
if mangleIndex <= mangleIndexNormalKey7 {
|
||||
keyData = HardcodedMangleTable[mangleIndex]
|
||||
} else if mangleIndex <= mangleIndexAlternateKey7 {
|
||||
if material.AlternateMangleKey != nil {
|
||||
keyData = material.AlternateMangleKey[mangleIndex-mangleIndexAlternateKey0]
|
||||
} else {
|
||||
keyData = AlternateMangleTable[mangleIndex-mangleIndexAlternateKey0]
|
||||
}
|
||||
} else {
|
||||
if mangleIndex != mangleIndexDeviceKey {
|
||||
return errors.New("invalid key number")
|
||||
}
|
||||
|
||||
if material.DeviceKey == nil {
|
||||
return errors.New("unsupported hardware key")
|
||||
}
|
||||
|
||||
keyData = *material.DeviceKey
|
||||
}
|
||||
|
||||
// Inner unmangle of key + CRC data
|
||||
keyData.Decrypt(b.MangleKeyBlock())
|
||||
|
||||
// Unmangle of data
|
||||
b.MangleKey().Decrypt(b.DataBlock())
|
||||
|
||||
crc1, crc2 := b.CRC()
|
||||
|
||||
if crc1 != crc2 {
|
||||
return errors.New("invalid CRC pair")
|
||||
}
|
||||
|
||||
if verifyCrc {
|
||||
calculatedCrc := crc.CalculateCRC(b.DataBlock())
|
||||
|
||||
if calculatedCrc != crc1 {
|
||||
return errors.New("data CRC invalid")
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewEncryptedBlock(size int) EncryptedBlock {
|
||||
if size%8 != 0 {
|
||||
//TODO: auto adjust
|
||||
panic("size must be % 8")
|
||||
}
|
||||
return make(EncryptedBlock, EncryptedBlockKeySize+size)
|
||||
}
|
283
encryption/block_test.go
Normal file
283
encryption/block_test.go
Normal file
|
@ -0,0 +1,283 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/compression"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
|
||||
"io"
|
||||
"slices"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestEncryptedBlock_Decrypt_FirmwareUncompressed(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
data := slices.Clone(sampleBlockFirmwareUncompressed)
|
||||
err := data.Decrypt(NewFirmwareKeyMaterial(nil), true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncryptedBlock_Decrypt_FirmwareCompressed(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
data := slices.Clone(sampleBlockFirmwareCompressed)
|
||||
err := data.Decrypt(NewFirmwareKeyMaterial(nil), false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
rawCompressedData := data.DataBlock()[:sampleBlockFirmwareCompressedSize]
|
||||
|
||||
decompressedData, err := compression.FirmwareBlockDecompress(rawCompressedData)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
crc1, _ := data.CRC()
|
||||
|
||||
if calculatedCrc := crc.CalculateCRC(decompressedData); calculatedCrc != crc1 {
|
||||
t.Fatalf("decompressed data does not match, %08x != %08x", calculatedCrc, crc1)
|
||||
}
|
||||
|
||||
compressedDataExhaustive, err := compression.FirmwareBlockCompress(decompressedData, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
decompressedData2, err := compression.FirmwareBlockDecompress(compressedDataExhaustive)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if calculatedCrc := crc.CalculateCRC(decompressedData2); calculatedCrc != crc1 {
|
||||
t.Fatalf("compressed and decompressed exhaustive data does not match, %08x != %08x", calculatedCrc, crc1)
|
||||
}
|
||||
|
||||
compressedData, err := compression.FirmwareBlockCompress(decompressedData, false)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
decompressedData3, err := compression.FirmwareBlockDecompress(compressedData)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if calculatedCrc := crc.CalculateCRC(decompressedData3); calculatedCrc != crc1 {
|
||||
t.Fatalf("compressed and decompressed data does not match, %08x != %08x", calculatedCrc, crc1)
|
||||
}
|
||||
|
||||
t.Logf("Decompressed size: %d", len(decompressedData))
|
||||
t.Logf("Original compressed size: %d", len(rawCompressedData))
|
||||
t.Logf("Custom compressed size: %d", len(compressedData))
|
||||
t.Logf("Custom compressed size (exhaustive): %d", len(compressedDataExhaustive))
|
||||
|
||||
originalRatio := float64(len(rawCompressedData)) / float64(len(decompressedData))
|
||||
customRatio := float64(len(compressedData)) / float64(len(decompressedData))
|
||||
customRatioExhaustive := float64(len(compressedDataExhaustive)) / float64(len(decompressedData))
|
||||
t.Logf("Original ratio: %.08f%%", originalRatio*100)
|
||||
t.Logf("Custom ratio: %.08f%%", customRatio*100)
|
||||
t.Logf("Custom ratio (exhaustive): %.08f%%", customRatioExhaustive*100)
|
||||
t.Logf("Change: %.08f%%", (customRatio-originalRatio)*100)
|
||||
t.Logf("Change (exhaustive): %.08f%%", (customRatioExhaustive-originalRatio)*100)
|
||||
}
|
||||
|
||||
func TestEncryptedBlock_Decrypt_MemoryData(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
data := slices.Clone(sampleBlockMemoryEmpty)
|
||||
err := data.Decrypt(NewMemoryKeyMaterial(nil), true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncryptedBlock_EncryptDecrypt(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
b := NewEncryptedBlock(64)
|
||||
_, err := io.ReadFull(rand.Reader, b.DataBlock())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
data := slices.Clone(b.DataBlock())
|
||||
|
||||
var seedBuf [4]byte
|
||||
_, err = io.ReadFull(rand.Reader, seedBuf[:])
|
||||
material := NewMemoryKeyMaterial(&SecureRandomKeyGenerator{})
|
||||
b.Encrypt(material)
|
||||
|
||||
dec := slices.Clone(b)
|
||||
err = dec.Decrypt(material, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if bytes.Compare(data, dec.DataBlock()) != 0 {
|
||||
t.Fatal("data does not match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncryptedBlock_EncryptDecrypt_WithDeviceKey(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
b := NewEncryptedBlock(64)
|
||||
_, err := io.ReadFull(rand.Reader, b.DataBlock())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
data := slices.Clone(b.DataBlock())
|
||||
|
||||
var seedBuf [4]byte
|
||||
_, err = io.ReadFull(rand.Reader, seedBuf[:])
|
||||
generator := BorlandRandKeyGenerator(binary.LittleEndian.Uint32(seedBuf[:]))
|
||||
material := NewFirmwareKeyMaterial(&generator)
|
||||
material.DeviceKey = sampleDeviceMangleKey
|
||||
b.Encrypt(material)
|
||||
|
||||
dec := slices.Clone(b)
|
||||
err = dec.Decrypt(material, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if bytes.Compare(data, dec.DataBlock()) != 0 {
|
||||
t.Fatal("data does not match")
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncryptedBlock_Encrypt(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var err error
|
||||
|
||||
b := NewEncryptedBlock(0)
|
||||
generator := BorlandRandKeyGenerator(0)
|
||||
material := NewMemoryKeyMaterial(&generator)
|
||||
b.Encrypt(material)
|
||||
|
||||
d1 := slices.Clone(b)
|
||||
d2 := slices.Clone(sampleBlockMemoryEmpty)
|
||||
|
||||
err = d1.Decrypt(material, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = d2.Decrypt(material, true)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if bytes.Compare(d1, d2) != 0 {
|
||||
t.Logf("generated %x", d1)
|
||||
t.Logf("expected %x", d2)
|
||||
t.Fail()
|
||||
}
|
||||
|
||||
if bytes.Compare(b, sampleBlockMemoryEmpty) != 0 {
|
||||
t.Logf("generated %x", b)
|
||||
t.Logf("expected %x", sampleBlockMemoryEmpty)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
func TestBruteforceSeed_Short(t *testing.T) {
|
||||
data := slices.Clone(sampleBlockMemoryEmpty)
|
||||
|
||||
seeds, err := BruteforceBorlandSeed(data, NewMemoryKeyMaterial(nil))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, seed := range seeds {
|
||||
t.Logf("seed = 0x%08x", seed)
|
||||
}
|
||||
|
||||
if len(seeds) != 2 {
|
||||
t.Fatal("seeds not found")
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
func TestBruteforceSeed_FirmwareUncompressed(t *testing.T) {
|
||||
data := slices.Clone(sampleBlockFirmwareUncompressed)
|
||||
|
||||
seeds, err := BruteforceBorlandSeed(data, NewFirmwareKeyMaterial(nil))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
for _, seed := range seeds {
|
||||
t.Logf("found seed = 0x%08x", seed)
|
||||
}
|
||||
|
||||
if len(seeds) != 2 {
|
||||
t.Fatal("seeds not found")
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func BenchmarkEncryptedBlock_Encrypt(b *testing.B) {
|
||||
const dataSize = 64
|
||||
const keyOffset = OuterMangleKeyOffsetMemory
|
||||
data := make([]byte, dataSize)
|
||||
|
||||
_, err := io.ReadFull(rand.Reader, data)
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
|
||||
buf := NewEncryptedBlock(len(data))
|
||||
var material KeyMaterial
|
||||
material.OuterKeyOffset = keyOffset
|
||||
generator := BorlandRandKeyGenerator(0)
|
||||
material.Generator = &generator
|
||||
|
||||
for pb.Next() {
|
||||
buf.Reset()
|
||||
copy(buf.DataBlock(), data)
|
||||
buf.Encrypt(material)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkEncryptedBlock_Decrypt(b *testing.B) {
|
||||
const dataSize = 64
|
||||
const keyOffset = OuterMangleKeyOffsetMemory
|
||||
|
||||
b.ResetTimer()
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
encryptedBlock := NewEncryptedBlock(dataSize)
|
||||
_, err := io.ReadFull(rand.Reader, encryptedBlock.DataBlock())
|
||||
if err != nil {
|
||||
b.Fatal(err)
|
||||
}
|
||||
|
||||
var seedBuf [4]byte
|
||||
_, err = io.ReadFull(rand.Reader, seedBuf[:])
|
||||
|
||||
var material KeyMaterial
|
||||
material.OuterKeyOffset = keyOffset
|
||||
generator := BorlandRandKeyGenerator(binary.LittleEndian.Uint32(seedBuf[:]))
|
||||
material.Generator = &generator
|
||||
|
||||
encryptedBlock.Encrypt(material)
|
||||
|
||||
buf := NewEncryptedBlock(len(encryptedBlock.DataBlock()))
|
||||
for pb.Next() {
|
||||
buf.Reset()
|
||||
copy(buf, encryptedBlock)
|
||||
err = buf.Decrypt(material, true)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
587
encryption/block_testdata.go
Normal file
587
encryption/block_testdata.go
Normal file
|
@ -0,0 +1,587 @@
|
|||
package encryption
|
||||
|
||||
var sampleDeviceMangleKey = DeviceMangleKey(0x003B0056, 0x4D4B5002, 0x20323455)
|
||||
|
||||
var sampleBlockMemoryEmpty = EncryptedBlock{
|
||||
0x2D, 0x01, 0x3E, 0x61, 0x52, 0x5A, 0xDF, 0xED, 0xF4, 0x1F, 0xA0, 0x40, 0xE3, 0xC2, 0x24, 0xDF, 0x4C, 0xD6, 0xF6, 0x98, 0x5B, 0xB7, 0x99, 0x27, 0xBE, 0x18, 0x88, 0xE8, 0xA5, 0x78, 0x29, 0xEB,
|
||||
0x2C, 0x3F, 0xB6, 0x21, 0xD8, 0x62, 0x9A, 0x21, 0x1B, 0x42, 0xD0, 0xD9, 0x44, 0x04, 0xEB, 0xE3, 0x31, 0x7E, 0xBE, 0xD4, 0x47, 0x6D, 0xA8, 0xE1, 0x2F, 0xE4, 0x81, 0x84, 0x7B, 0x04, 0xC3, 0x60,
|
||||
0x05, 0x83, 0xA1, 0x21, 0x3C, 0xBF, 0xD7, 0x2E, 0x4D, 0x0A, 0xAD, 0x0D, 0xBC, 0xDF, 0xBA, 0x61, 0x08, 0x6B, 0xDD, 0xDE, 0x7A, 0x4A, 0xC9, 0xC9, 0x38, 0x34, 0xDC, 0x4E, 0xD0, 0x10, 0x82, 0x45,
|
||||
0x28, 0x6F, 0x7B, 0xDE, 0xB4, 0xB9, 0x2A, 0xDD, 0x63, 0x1A, 0x71, 0x91, 0x6F, 0x13, 0x59, 0x10, 0x7D, 0x21, 0xA5, 0xF4, 0x63, 0x31, 0x1B, 0xD7, 0xDB, 0x8C, 0x68, 0xEE, 0x2E, 0x28, 0x34, 0x4C,
|
||||
0x99, 0xC3, 0xCC, 0x58, 0xCA, 0x22, 0x4D, 0xB3, 0x54, 0xD5, 0x64, 0x3B, 0x04, 0x5D, 0x94, 0x6C, 0x8E, 0x78, 0x80, 0x01, 0x25, 0x0E, 0x0F, 0xA2, 0xFE, 0xAA, 0x9D, 0xF9, 0xE1, 0x6C, 0x5E, 0x9E,
|
||||
0x6E, 0xB1, 0xC5, 0x83, 0x6E, 0xDA, 0x5E, 0x58, 0xF9, 0xE1, 0x2D, 0x5D, 0xE4, 0x53, 0xAF, 0x4D, 0xCD, 0xCE, 0x4E, 0x8C, 0xD8, 0x6A, 0x7C, 0x24, 0x6D, 0xEC, 0x5C, 0xF6, 0x90, 0x32, 0xF7, 0x89,
|
||||
0x43, 0x67, 0x09, 0xBB, 0xBB, 0x88, 0x28, 0xDB, 0xD1, 0xAB, 0x81, 0x22, 0xD3, 0x16, 0x5B, 0x5E, 0xEF, 0xBE, 0x9F, 0xAC, 0x6B, 0x7B, 0x97, 0x37, 0x48, 0x89, 0x9F, 0x09, 0x09, 0x88, 0x35, 0xCA,
|
||||
0x28, 0x15, 0x25, 0xDA, 0xCF, 0xAE, 0xB0, 0x4D, 0xA3, 0x82, 0xD3, 0x70, 0x89, 0x35, 0x3C, 0x50, 0xB2, 0x05, 0x92, 0xF6, 0xCA, 0xF5, 0xC9, 0x08, 0xFB, 0xE8, 0x4E, 0x89, 0x1D, 0x06, 0x65, 0xE5,
|
||||
0x7B, 0x36, 0x1C, 0x11, 0xA5, 0x63, 0x51, 0x99, 0x5D, 0x8C, 0x93, 0xAC, 0x22, 0x56, 0x2E, 0x56, 0x88, 0xE0, 0x6C, 0x85, 0x35, 0xEE, 0xA0, 0xDA, 0x2A, 0x1C, 0x66, 0xC8, 0x6B, 0x16, 0x87, 0xF9,
|
||||
0x05, 0xB5, 0x1B, 0x3B, 0x8F, 0x92, 0xF6, 0xE4, 0xFD, 0x53, 0x23, 0xDA, 0x07, 0x1D, 0x4D, 0x7B, 0x06, 0x0F, 0x1E, 0xD1, 0x0B, 0x5C, 0x01, 0xA8, 0xB3, 0x79, 0x6F, 0x4D, 0x5B, 0xD6, 0xC5, 0x54,
|
||||
0x70, 0x34, 0x24, 0xC6, 0x4F, 0x4D, 0x2B, 0x66, 0xBF, 0x01, 0x73, 0xF4, 0x01, 0x50, 0x5E, 0x8E, 0xE2, 0xD6, 0xBC, 0x68, 0x9B, 0xDB, 0xE2, 0xCB, 0x43, 0x26, 0x50, 0x1F, 0x2E, 0x2A, 0xA8, 0x4F,
|
||||
0xAB, 0x42, 0x25, 0x0A, 0x5D, 0x0F, 0x8F, 0x8B, 0xDF, 0xBD, 0x01, 0x7C, 0x5D, 0x93, 0xFE, 0xA8, 0xA1, 0x9B, 0xEB, 0x5A, 0xCB, 0xE0, 0x01, 0x89, 0x0C, 0x42, 0x3B, 0x7A, 0x1B, 0x16, 0x5C, 0x9E,
|
||||
0xB6, 0xD5, 0x4A, 0x96, 0x06, 0xC0, 0xCA, 0x19, 0xB2, 0x9B, 0x5C, 0x57, 0xBF, 0x01, 0x10, 0x7A, 0xC3, 0x1F, 0xF9, 0xFD, 0x18, 0xE1, 0x20, 0x3B, 0xCA, 0xF8, 0xC0, 0xCE, 0x59, 0x30, 0x15, 0xDA,
|
||||
0x70, 0x62, 0x3E, 0x39, 0xE9, 0xCA, 0x90, 0xBE, 0xC1, 0x7F, 0x0A, 0x93, 0xF2, 0xD7, 0xCC, 0xAC, 0xA1, 0xF8, 0x7F, 0x31, 0xBA, 0xC4, 0x05, 0x69, 0xE3, 0x3C, 0x3F, 0x35, 0x33, 0x72, 0xBF, 0xAF,
|
||||
0xE7, 0xC0, 0x99, 0x8D, 0xD7, 0xEF, 0x32, 0xB9, 0xDF, 0x77, 0x08, 0xD0, 0x77, 0x8B, 0x71, 0x4F, 0x05, 0x7F, 0x37, 0x5F, 0x55, 0x28, 0x2F, 0xC7, 0x8D, 0xAF, 0x79, 0xB3, 0x9A, 0xEF, 0x76, 0x65,
|
||||
0x02, 0xBE, 0x06, 0xF7, 0x6E, 0xCB, 0x5B, 0x46, 0x45, 0xDD, 0x8A, 0x2D, 0xF1, 0xD3, 0x78, 0x92, 0x61, 0x03, 0x00, 0x40, 0x64, 0x72, 0xC4, 0xA5, 0x16, 0x25, 0x57, 0x75, 0x97, 0xF1, 0x07, 0x88,
|
||||
}
|
||||
|
||||
var sampleBlockFirmwareCompressedSize = len(sampleBlockFirmwareCompressed) - EncryptedBlockKeySize - 3
|
||||
var sampleBlockFirmwareCompressed = EncryptedBlock{
|
||||
0x4E, 0xA1, 0x65, 0x14, 0xE4, 0xD8, 0xEE, 0xB6, 0x99, 0x58, 0xF3, 0x54, 0x81, 0x49, 0x15, 0x51, 0x0C, 0xD9, 0x88, 0xB8, 0x75, 0x00, 0x96, 0xAC, 0xC8, 0x11, 0x4C, 0x96, 0x12, 0x23, 0x5B, 0xAC,
|
||||
0x07, 0x67, 0x5E, 0xEE, 0xC0, 0x05, 0x14, 0x15, 0xE0, 0x4A, 0x07, 0x34, 0x07, 0xC5, 0xBA, 0xD5, 0xDC, 0x6C, 0xE8, 0x58, 0x39, 0x27, 0x5F, 0x0C, 0x79, 0x58, 0x27, 0x62, 0x95, 0xAF, 0x3C, 0xF9,
|
||||
0x91, 0xA1, 0xD5, 0x6B, 0x9F, 0xE5, 0xE8, 0xB0, 0x73, 0x55, 0xBE, 0xFC, 0xC3, 0x7B, 0x88, 0x9B, 0x6F, 0xED, 0x4A, 0x3D, 0x99, 0x98, 0xF0, 0x11, 0xCB, 0x9B, 0xB1, 0xC1, 0x52, 0x8C, 0xB3, 0x0A,
|
||||
0x18, 0xBE, 0x90, 0xE4, 0x26, 0x0A, 0x89, 0xE0, 0xE6, 0xA0, 0xB4, 0xC6, 0xFA, 0x64, 0xED, 0x3A, 0x49, 0x28, 0xC5, 0x2D, 0xB6, 0xB1, 0x74, 0x03, 0x0F, 0x4D, 0xF1, 0x68, 0xDC, 0x72, 0xEB, 0xC0,
|
||||
0x8F, 0x41, 0x6F, 0xD4, 0x31, 0x86, 0x21, 0x79, 0x59, 0x9C, 0x3C, 0x2A, 0x86, 0xAD, 0x48, 0xB7, 0xFC, 0x5E, 0xEF, 0xCC, 0xF3, 0x06, 0x70, 0x73, 0x34, 0x0E, 0x83, 0xF7, 0x74, 0xB5, 0x25, 0x76,
|
||||
0x08, 0x5F, 0x8C, 0x2B, 0xD4, 0x8E, 0x83, 0xE4, 0xFB, 0xCC, 0xC6, 0x08, 0x6B, 0x8A, 0xFD, 0x88, 0xCD, 0x05, 0x4E, 0xEA, 0x86, 0xA4, 0xAA, 0x05, 0x10, 0x19, 0xDB, 0x83, 0x9B, 0xB4, 0x97, 0xBD,
|
||||
0x3A, 0x82, 0x58, 0x8C, 0xF0, 0x96, 0xF2, 0xB8, 0xD1, 0xA6, 0xA9, 0x5A, 0xBE, 0xA0, 0x54, 0x5F, 0x64, 0x21, 0xE9, 0x1A, 0x87, 0x2D, 0xCF, 0x3F, 0xD4, 0xD5, 0x02, 0xE3, 0x1F, 0x54, 0xC7, 0x41,
|
||||
0x4F, 0xF7, 0x0C, 0x98, 0x4B, 0x58, 0xAE, 0xAB, 0x15, 0x1B, 0x4B, 0x8E, 0xD7, 0x1E, 0x2F, 0xDB, 0x4E, 0xF3, 0x60, 0xC7, 0x4A, 0xC8, 0x4E, 0x4A, 0x15, 0xF4, 0xAB, 0x06, 0x71, 0xBE, 0x2C, 0x71,
|
||||
0xF7, 0x9E, 0x47, 0x13, 0x4A, 0x5C, 0xAD, 0xE7, 0xD3, 0x30, 0xB4, 0x8A, 0x10, 0x2C, 0xCF, 0x4D, 0x7D, 0x5F, 0x74, 0xC4, 0x87, 0xD5, 0x0C, 0xF0, 0x7D, 0x05, 0x3A, 0x0F, 0x8F, 0xB9, 0xBB, 0xC6,
|
||||
0x06, 0x80, 0x84, 0x80, 0xBC, 0x95, 0xEB, 0x2A, 0xE9, 0x23, 0xEC, 0xE8, 0xC2, 0xF8, 0xE5, 0xC7, 0x50, 0xAE, 0x8C, 0x49, 0x3D, 0x9D, 0x13, 0x9A, 0x62, 0x75, 0xC4, 0x3D, 0x45, 0x3A, 0xED, 0x33,
|
||||
0x11, 0xCE, 0x53, 0x9D, 0x44, 0x2D, 0x82, 0x14, 0xA1, 0x86, 0x1A, 0x38, 0xF2, 0xA3, 0x89, 0xC3, 0x1E, 0xC9, 0xFE, 0x8D, 0xFC, 0xE2, 0x1D, 0xEE, 0xE8, 0xD1, 0x9D, 0xA7, 0xC7, 0x2D, 0x34, 0x8A,
|
||||
0x07, 0xD4, 0xA3, 0xFF, 0x37, 0xFD, 0xAD, 0x81, 0x79, 0x8B, 0x8B, 0x76, 0x40, 0xDC, 0xF3, 0x91, 0xC8, 0x19, 0x84, 0x4F, 0x9E, 0xBF, 0xED, 0xFC, 0x1B, 0xB3, 0x0C, 0x8A, 0x19, 0xBC, 0x7F, 0x5C,
|
||||
0xD9, 0xE9, 0x4A, 0x24, 0x5D, 0xB8, 0x4B, 0xB0, 0x25, 0xC6, 0xFC, 0xF8, 0x83, 0xB1, 0xB0, 0x39, 0x43, 0x7A, 0xA6, 0x15, 0xDA, 0x9D, 0xC8, 0xD5, 0x4F, 0x59, 0x3D, 0xC9, 0x50, 0xDB, 0x7E, 0xF5,
|
||||
0x1C, 0x2C, 0x9C, 0xEB, 0x49, 0xBA, 0xF0, 0xCB, 0x2F, 0x38, 0x95, 0x59, 0x52, 0xEB, 0x76, 0x59, 0x6E, 0xB9, 0x17, 0xFE, 0x73, 0x65, 0x74, 0x63, 0x5C, 0x15, 0x27, 0x8D, 0xA1, 0x39, 0xEA, 0xF2,
|
||||
0xD8, 0xB3, 0x16, 0x19, 0x2C, 0xC3, 0xFC, 0xD5, 0xEA, 0xB3, 0x1E, 0xC6, 0x1B, 0x21, 0xCD, 0x45, 0x03, 0x69, 0x0B, 0xAD, 0x3D, 0xE5, 0xA3, 0xBA, 0xD8, 0x4C, 0x8A, 0xE3, 0x1B, 0x40, 0x5E, 0x11,
|
||||
0xF4, 0xFE, 0xFB, 0x35, 0x3B, 0xDF, 0x34, 0x26, 0x6F, 0xF9, 0xD7, 0xE5, 0xEA, 0xF1, 0x97, 0x99, 0x45, 0xA8, 0x1A, 0xD3, 0x5B, 0x61, 0x58, 0x22, 0x85, 0xCE, 0xBF, 0xC4, 0x6F, 0x49, 0x60, 0xEF,
|
||||
|
||||
0xFA, 0x6E, 0xA7, 0x25, 0xE4, 0x88, 0xB5, 0x9D, 0x21, 0x1B, 0x93, 0x33, 0xBB, 0x62, 0x0C, 0x9D, 0x70, 0x46, 0x00, 0xFE, 0xA8, 0x74, 0x4F, 0x44, 0xA0, 0xF8, 0x73, 0xD8, 0x95, 0xA0, 0x0D, 0xEE,
|
||||
0xD0, 0x25, 0x6B, 0xE8, 0xDB, 0x62, 0x8B, 0xE2, 0x8C, 0x4F, 0x04, 0xC8, 0x56, 0xC2, 0xED, 0x25, 0x17, 0x5A, 0xAE, 0xE6, 0x07, 0x03, 0x84, 0x1B, 0xED, 0x0E, 0xBA, 0x12, 0x3B, 0xCC, 0x9B, 0x95,
|
||||
0xC0, 0xF7, 0x9A, 0xF5, 0xA5, 0x14, 0xC2, 0x44, 0x97, 0x8A, 0x03, 0x9B, 0x22, 0x53, 0x5B, 0x74, 0xE7, 0x66, 0xA5, 0xBC, 0x12, 0xB7, 0x94, 0x41, 0x45, 0x34, 0x9F, 0x97, 0x70, 0x83, 0x53, 0x7F,
|
||||
0x2B, 0x62, 0x5E, 0xB7, 0xF3, 0xF0, 0x41, 0x23, 0x87, 0x69, 0xAF, 0xF5, 0x05, 0xD5, 0x23, 0xA4, 0xCF, 0xAF, 0xDD, 0x18, 0x8E, 0x0B, 0x13, 0x07, 0x35, 0x6E, 0x89, 0x25, 0xE7, 0x69, 0xA0, 0x15,
|
||||
0xA4, 0xD3, 0xB2, 0x32, 0xA9, 0xF2, 0xD3, 0xAB, 0x46, 0x11, 0x8D, 0xBA, 0x07, 0x95, 0x64, 0xA7, 0x5F, 0x36, 0xCE, 0x33, 0xF0, 0x7B, 0xAF, 0x88, 0x13, 0x35, 0x85, 0xA6, 0x1F, 0xA9, 0x62, 0xA1,
|
||||
0x82, 0x96, 0x56, 0xD3, 0x99, 0x77, 0x95, 0xFA, 0xC3, 0xED, 0x9F, 0x7D, 0x73, 0x90, 0x3E, 0x82, 0x4D, 0xBC, 0x37, 0xA6, 0xF2, 0x6E, 0x56, 0x34, 0xAF, 0xD8, 0x90, 0x38, 0x33, 0xCD, 0xF9, 0xDD,
|
||||
0x2E, 0x01, 0xDC, 0x14, 0x5C, 0x7A, 0x6D, 0x2F, 0xD8, 0x1A, 0x39, 0x95, 0x33, 0xA5, 0xEC, 0x91, 0x37, 0xA1, 0x8F, 0x22, 0x12, 0x87, 0xA4, 0xED, 0x2E, 0x92, 0x98, 0x73, 0x7D, 0xA4, 0xB9, 0xFA,
|
||||
0x5D, 0x27, 0xA8, 0xF9, 0xCD, 0x5E, 0xF9, 0xF5, 0x64, 0xF1, 0xC8, 0x02, 0xEB, 0xBC, 0x14, 0xA8, 0x00, 0x2D, 0x55, 0xDE, 0xDA, 0xA4, 0x76, 0x35, 0x58, 0xA3, 0x32, 0xB9, 0xAB, 0xD7, 0x48, 0x2F,
|
||||
0xD4, 0xF7, 0x5A, 0xCA, 0x72, 0x88, 0x58, 0x7C, 0xCF, 0x2C, 0x64, 0x10, 0x5E, 0xCB, 0xE4, 0x59, 0x6F, 0x18, 0x6D, 0x78, 0xFA, 0x78, 0xB1, 0x31, 0xDF, 0xBD, 0x9A, 0x05, 0x33, 0x84, 0x9C, 0x66,
|
||||
0xFA, 0x4C, 0xE1, 0xF3, 0x5B, 0x83, 0xAD, 0x56, 0x9E, 0x42, 0x1C, 0xFC, 0x3D, 0xBD, 0xDA, 0x33, 0xDE, 0x90, 0x5B, 0x70, 0x80, 0xFD, 0x9B, 0x89, 0xEB, 0x62, 0x20, 0xAF, 0xAD, 0x8D, 0x70, 0xEC,
|
||||
0x2D, 0x99, 0xE5, 0x54, 0xE6, 0x66, 0xA2, 0xE5, 0x0C, 0x5D, 0x18, 0x40, 0x97, 0x13, 0x77, 0x8E, 0x48, 0xED, 0x69, 0xD3, 0x5A, 0x3A, 0x34, 0xB5, 0x31, 0x56, 0x6D, 0x7D, 0x57, 0x58, 0xE5, 0x7E,
|
||||
0xE9, 0xB0, 0x45, 0x3F, 0xB8, 0x24, 0x63, 0x9C, 0xD4, 0x73, 0x2B, 0x12, 0x54, 0x07, 0xDB, 0xEF, 0xC3, 0x0A, 0xC0, 0x17, 0xCE, 0x09, 0x9B, 0x3D, 0xA3, 0xA1, 0x04, 0xE5, 0xC1, 0x5B, 0x8D, 0xD0,
|
||||
0x6D, 0x2F, 0xEB, 0xDD, 0x79, 0x8B, 0x46, 0xB1, 0x38, 0x4F, 0xFB, 0x11, 0x08, 0x4E, 0x4D, 0x60, 0x04, 0x3F, 0xF5, 0x19, 0x5C, 0x81, 0x6D, 0x8B, 0x34, 0x61, 0x72, 0xD3, 0x59, 0x15, 0x55, 0xA1,
|
||||
0x42, 0xBD, 0xF2, 0xBD, 0x74, 0x6A, 0x39, 0xBF, 0xEB, 0x31, 0x95, 0xE2, 0x2A, 0x4F, 0x31, 0xC8, 0x51, 0x57, 0x2C, 0x5E, 0x3E, 0xD7, 0x8B, 0xEF, 0xA9, 0xEB, 0x1D, 0x22, 0x13, 0x19, 0x54, 0x18,
|
||||
0x5D, 0xB6, 0xD8, 0x56, 0x8C, 0x72, 0xC5, 0xF6, 0xB1, 0x6B, 0xD6, 0x85, 0xCB, 0x94, 0x30, 0x00, 0x6A, 0x31, 0x54, 0x2E, 0xCE, 0x40, 0xA3, 0x40, 0xA1, 0x17, 0xAF, 0x8E, 0x5E, 0x4D, 0xDF, 0x47,
|
||||
0xA2, 0x9F, 0xC2, 0xF3, 0x50, 0x76, 0xEF, 0x1D, 0xB3, 0xA2, 0x7B, 0x0A, 0x1C, 0x01, 0x71, 0x65, 0x0C, 0xAB, 0x13, 0xD5, 0x46, 0x7F, 0xDA, 0x95, 0x1C, 0x82, 0xF8, 0xF2, 0x06, 0xE7, 0x66, 0x34,
|
||||
0xAA, 0x6A, 0xEC, 0x61, 0x86, 0xE3, 0x5C, 0xB1, 0xAB, 0x76, 0x43, 0x29, 0x1A, 0x09, 0x4B, 0xE5, 0xBA, 0x9D, 0xD1, 0x25, 0x35, 0xC9, 0xB6, 0xF3, 0x87, 0xB7, 0x29, 0xF0, 0x83, 0x29, 0x61, 0x9C,
|
||||
0x52, 0x95, 0xF4, 0x8D, 0xFD, 0x47, 0xFD, 0x06, 0x7C, 0x6B, 0xB7, 0x2A, 0x21, 0xB3, 0x0F, 0xEB, 0xEC, 0x3D, 0x9C, 0x3F, 0x0B, 0xFD, 0xC4, 0x1E, 0x9B, 0x50, 0xB7, 0xFF, 0x69, 0x91, 0xB2, 0xD0,
|
||||
0xBB, 0x4D, 0x7D, 0x88, 0x7A, 0x49, 0x77, 0x31, 0xEE, 0xAA, 0x6C, 0x63, 0x62, 0x1B, 0x33, 0xA5, 0x46, 0xB3, 0x6D, 0x8C, 0x75, 0x25, 0x01, 0xE7, 0xEF, 0x4E, 0x3E, 0x0E, 0x90, 0x64, 0x08, 0x44,
|
||||
0x8A, 0xAC, 0x0C, 0x94, 0xDD, 0xBD, 0xE8, 0xD1, 0x2F, 0xF1, 0x8A, 0x50, 0xF0, 0x50, 0xF6, 0x00, 0xC9, 0x9F, 0x39, 0x72, 0x24, 0xD2, 0xFB, 0x45, 0x74, 0xFB, 0xC6, 0xE1, 0x9F, 0x19, 0xFC, 0x69,
|
||||
0xA9, 0x3A, 0x70, 0x1A, 0x0F, 0x10, 0xBA, 0x81, 0xE4, 0x79, 0x5D, 0x0C, 0x23, 0xAD, 0x65, 0x8D, 0x25, 0xED, 0x7F, 0x5B, 0x6A, 0xA0, 0xCA, 0x78, 0xA7, 0x23, 0x2D, 0xB1, 0xA2, 0x63, 0xBD, 0x14,
|
||||
0x87, 0x56, 0x47, 0x88, 0x3C, 0x0D, 0x73, 0xE1, 0xCA, 0xE6, 0x2A, 0x66, 0x02, 0x17, 0x2A, 0x98, 0x44, 0x0A, 0x3F, 0x0B, 0x55, 0xE3, 0xE7, 0xF6, 0x05, 0xE5, 0xAF, 0xA9, 0xE6, 0x6D, 0x85, 0x69,
|
||||
0xDA, 0x93, 0x29, 0x60, 0x3B, 0xB9, 0x62, 0x6E, 0x65, 0xB3, 0x3C, 0x34, 0x5E, 0xCF, 0xFF, 0x24, 0xC4, 0xF0, 0xDF, 0xFA, 0x8B, 0x7F, 0xBC, 0x04, 0x25, 0x6C, 0xEF, 0xBE, 0xDD, 0x48, 0x2A, 0x97,
|
||||
0x73, 0x95, 0x48, 0xA6, 0xA8, 0x1A, 0x76, 0x36, 0xCF, 0xB0, 0x1A, 0x72, 0x54, 0x00, 0x85, 0x1E, 0x2A, 0xAC, 0x9D, 0x1C, 0xAC, 0xA1, 0xC5, 0x41, 0x33, 0x58, 0xD3, 0x2D, 0x6C, 0xFB, 0xDA, 0x4A,
|
||||
0x76, 0x5E, 0x11, 0x95, 0xE8, 0x4E, 0x14, 0xAE, 0x83, 0x72, 0xB3, 0xA1, 0x8E, 0xC6, 0x25, 0xF3, 0x33, 0x2F, 0x66, 0xAE, 0x47, 0xA0, 0xEE, 0xDB, 0x26, 0x9E, 0xC9, 0x20, 0x0F, 0x9A, 0x79, 0xDE,
|
||||
0xB9, 0x60, 0x9C, 0xBF, 0x6E, 0xD9, 0xF1, 0x58, 0xB1, 0x90, 0x4A, 0x1B, 0xE7, 0x6A, 0x3B, 0x97, 0xD6, 0x6D, 0xF1, 0x31, 0x0C, 0x6C, 0x96, 0xDC, 0x4F, 0x1C, 0xF8, 0x54, 0xC5, 0xA0, 0x89, 0xB8,
|
||||
0xB8, 0xC2, 0x0D, 0xC3, 0xA3, 0xB8, 0xA6, 0x52, 0x3B, 0xAB, 0x12, 0x3B, 0x72, 0xB3, 0x3F, 0x52, 0xB9, 0x6B, 0x6D, 0x1D, 0xCB, 0x2A, 0xD3, 0x41, 0xD8, 0x56, 0xF0, 0xF2, 0x27, 0x32, 0x92, 0x70,
|
||||
0x3C, 0x0F, 0x4D, 0x0A, 0x10, 0x4E, 0xFA, 0x40, 0x6E, 0xBC, 0xF5, 0x7F, 0xD3, 0x88, 0x8A, 0x86, 0x6E, 0xFC, 0x6F, 0x4B, 0xF2, 0xA3, 0x10, 0xE5, 0xD9, 0xC2, 0x7B, 0x19, 0x62, 0xA4, 0x88, 0x04,
|
||||
0xD0, 0x11, 0x28, 0xFB, 0xC8, 0xFF, 0xD2, 0x02, 0x39, 0x9F, 0x8A, 0x5D, 0x00, 0x0E, 0xE7, 0xA0, 0x14, 0xB5, 0x11, 0x7B, 0x81, 0x81, 0x8F, 0xFC, 0xAC, 0x8A, 0xBF, 0x7D, 0xE8, 0x49, 0x11, 0x0F,
|
||||
0xB7, 0x66, 0x73, 0x77, 0x82, 0x5F, 0x49, 0x55, 0xBE, 0x01, 0xFE, 0x87, 0x66, 0x17, 0x4F, 0x27, 0xA1, 0xC4, 0x09, 0xC6, 0xCE, 0xC8, 0xA2, 0x5D, 0xFF, 0x4B, 0x9B, 0x10, 0xB2, 0x0D, 0xD7, 0x1C,
|
||||
0x86, 0x45, 0x32, 0x04, 0x16, 0xCB, 0x54, 0x34, 0x31, 0x64, 0x26, 0xB3, 0xE2, 0x6D, 0x58, 0x1A, 0xA1, 0xB6, 0xE1, 0x48, 0x16, 0x3D, 0x04, 0xFD, 0x3E, 0x61, 0x31, 0xB5, 0xE5, 0xDC, 0x57, 0x06,
|
||||
0xC8, 0x3D, 0xFE, 0xFD, 0xF0, 0xCA, 0x4F, 0x93, 0x75, 0x93, 0xF8, 0xEA, 0x19, 0xF3, 0x56, 0xCA, 0x25, 0x39, 0x0B, 0xC0, 0xC2, 0xB8, 0x93, 0xF9, 0xBA, 0xEC, 0x5E, 0x1F, 0xD0, 0x52, 0xA4, 0x55,
|
||||
0xF7, 0x97, 0xDD, 0xC8, 0xF5, 0x08, 0x93, 0x31, 0x60, 0x7A, 0xAD, 0xE6, 0xFB, 0x25, 0xA3, 0xDF, 0x85, 0x79, 0xEF, 0xC2, 0xA6, 0x44, 0x98, 0x7F, 0xD7, 0xF5, 0xB1, 0x0F, 0x0B, 0xA6, 0x95, 0x78,
|
||||
0x61, 0x6B, 0xEC, 0xE7, 0x60, 0xA1, 0x82, 0xFA, 0x2D, 0xD0, 0x60, 0x42, 0xAF, 0x3D, 0x6D, 0x21, 0x2C, 0x40, 0x11, 0xF6, 0x3D, 0x5C, 0x7A, 0x43, 0xEC, 0x62, 0xE0, 0x4E, 0x63, 0x41, 0x73, 0xB7,
|
||||
0x03, 0xDA, 0xB9, 0x64, 0xFC, 0x5D, 0x11, 0x6B, 0x31, 0x99, 0x32, 0x03, 0x1D, 0x74, 0x52, 0xCE, 0x4E, 0x27, 0x7A, 0x45, 0x51, 0xF5, 0x52, 0xFB, 0xC8, 0x1C, 0xB5, 0x6C, 0x9A, 0x18, 0x9F, 0xAD,
|
||||
0x71, 0x53, 0x70, 0x6A, 0xEB, 0x76, 0xCA, 0x30, 0x22, 0x62, 0xF5, 0x84, 0xEF, 0x4B, 0x94, 0x7D, 0x7D, 0xC6, 0xF1, 0x36, 0xF3, 0x05, 0x0D, 0x8E, 0x9E, 0x01, 0x9B, 0x26, 0x56, 0x01, 0xEF, 0x4E,
|
||||
0x7E, 0xE0, 0xF2, 0x73, 0x88, 0x8A, 0xA9, 0xF2, 0x73, 0xCC, 0x7B, 0xCA, 0x29, 0x1B, 0x1D, 0x5B, 0x73, 0x82, 0xC6, 0x23, 0x48, 0xFE, 0xB0, 0x03, 0xA6, 0xAF, 0x30, 0x51, 0xB1, 0xAE, 0xB1, 0x1C,
|
||||
0x57, 0xA6, 0x74, 0x3F, 0xFC, 0xD8, 0x13, 0xC9, 0xD8, 0x96, 0x13, 0x24, 0xE5, 0x7E, 0x5F, 0x3E, 0x2C, 0x62, 0xE5, 0xAB, 0x48, 0x5C, 0xE3, 0xD3, 0x22, 0x16, 0x93, 0xDD, 0xD7, 0x12, 0xE3, 0x15,
|
||||
0x11, 0x95, 0x10, 0x19, 0xF2, 0xB6, 0x6E, 0xEF, 0xBB, 0x70, 0x2E, 0x59, 0xF2, 0x10, 0x91, 0x81, 0xF0, 0x58, 0xFE, 0x95, 0xBC, 0x6F, 0x1E, 0x1E, 0x73, 0x00, 0xC8, 0xD2, 0x84, 0x68, 0xE5, 0x89,
|
||||
0xEF, 0xE0, 0x76, 0x78, 0x22, 0x5B, 0x68, 0x8D, 0xE9, 0x83, 0xBF, 0xE3, 0x5C, 0xF6, 0xBA, 0xF4, 0x4C, 0x68, 0x78, 0xC6, 0x5B, 0xD6, 0x0F, 0xE9, 0x85, 0xFE, 0x6B, 0x99, 0x60, 0xBF, 0x15, 0x04,
|
||||
0x6A, 0xD7, 0x30, 0x1F, 0x87, 0x48, 0x5E, 0xA9, 0xF3, 0x19, 0xD5, 0xD1, 0xE1, 0xFE, 0xC3, 0xC8, 0x05, 0x61, 0xE9, 0xC1, 0x03, 0x9B, 0x83, 0x63, 0x7C, 0x7E, 0x6D, 0x83, 0x71, 0x03, 0x23, 0x12,
|
||||
0x1F, 0x97, 0x7A, 0xE0, 0x87, 0x75, 0xED, 0xDB, 0x06, 0xD1, 0x8F, 0xC8, 0x4F, 0x7E, 0x93, 0x93, 0xF5, 0x3E, 0x37, 0x56, 0x8F, 0x29, 0x7E, 0xCB, 0xA6, 0xAB, 0xB6, 0xA3, 0x7E, 0xFD, 0xE4, 0x60,
|
||||
0x31, 0x86, 0x1A, 0x9A, 0x26, 0x53, 0x3C, 0x32, 0x3B, 0xAB, 0xB2, 0x7A, 0xF5, 0x7D, 0xE6, 0x88, 0x48, 0x8A, 0x5A, 0xCA, 0x42, 0x50, 0x56, 0x6B, 0x2B, 0xBB, 0xBA, 0x94, 0x9A, 0x0F, 0xDF, 0x76,
|
||||
0xAD, 0x4F, 0x3C, 0xA2, 0x29, 0xB2, 0xBA, 0x0D, 0xFD, 0x95, 0x0E, 0xB6, 0x1F, 0xC3, 0x4E, 0xA2, 0x59, 0x9E, 0x37, 0x66, 0x22, 0x22, 0x88, 0x7F, 0xA9, 0x78, 0x21, 0xE7, 0x7F, 0xFC, 0x17, 0x0D,
|
||||
0x18, 0x5E, 0x9C, 0x7C, 0x06, 0xDA, 0x7A, 0x52, 0x77, 0x5C, 0xD3, 0xE8, 0x85, 0xF0, 0x2D, 0xF7, 0xBA, 0x8C, 0x95, 0xAC, 0xC9, 0xCF, 0x64, 0x2C, 0x35, 0xEA, 0xF7, 0x70, 0x9D, 0x3F, 0xE0, 0x3C,
|
||||
0x98, 0x64, 0x33, 0xF1, 0xD9, 0xCE, 0x18, 0x60, 0xB5, 0x83, 0xE9, 0x16, 0xAC, 0x1F, 0xF0, 0x54, 0xAB, 0x38, 0x3B, 0x7E, 0x25, 0x30, 0xCA, 0x91, 0x71, 0xDB, 0xD7, 0x12, 0xF9, 0xDF, 0x2E, 0xEC,
|
||||
0xB7, 0x0F, 0x1D, 0xBF, 0xE7, 0x08, 0x12, 0x44, 0xCE, 0xDA, 0xEE, 0xDA, 0x22, 0x9A, 0x1B, 0x52, 0x8E, 0x8D, 0x5F, 0x68, 0x7B, 0x73, 0xCC, 0x99, 0xB3, 0x8F, 0x2B, 0x9F, 0x0F, 0xA2, 0x5F, 0x8A,
|
||||
0xF5, 0xB2, 0xC4, 0x85, 0x05, 0x73, 0xFE, 0xB5, 0x72, 0x1B, 0x94, 0x34, 0xDB, 0x5D, 0xAF, 0xA2, 0xB8, 0x7F, 0x89, 0x4B, 0x37, 0x22, 0x56, 0x35, 0xCC, 0x75, 0xE7, 0x21, 0x8B, 0x9A, 0x6D, 0xEB,
|
||||
0x9B, 0x63, 0xDE, 0x1C, 0x00, 0xA9, 0x53, 0x58, 0x4A, 0x0E, 0x35, 0x80, 0x59, 0x2A, 0xD6, 0x37, 0x4C, 0xD4, 0x73, 0xCE, 0x41, 0x6F, 0xEA, 0x83, 0xAD, 0x6A, 0xFD, 0xB2, 0x07, 0x5A, 0x46, 0xC3,
|
||||
0x1E, 0xC1, 0x45, 0x15, 0x1E, 0xB7, 0xBE, 0x2E, 0xF8, 0x2C, 0x44, 0xA4, 0x54, 0x42, 0x2A, 0xF8, 0x51, 0xDA, 0x3B, 0x1F, 0x91, 0x8B, 0xCB, 0x32, 0x5D, 0xD8, 0x0A, 0x60, 0x16, 0xEE, 0xB8, 0x2E,
|
||||
0x8E, 0x3D, 0xA9, 0xFC, 0xCC, 0x0A, 0xE0, 0x68, 0x73, 0xB3, 0x72, 0x1E, 0x7F, 0x5C, 0xD3, 0x1C, 0xAC, 0x86, 0xF0, 0x8C, 0x8A, 0x19, 0xC7, 0x0A, 0x45, 0x31, 0x4C, 0xD5, 0x45, 0x4E, 0xC4, 0x91,
|
||||
0x27, 0x94, 0x52, 0xF5, 0x55, 0xD3, 0xC6, 0x18, 0xB0, 0xF4, 0x61, 0xAD, 0x5B, 0xFF, 0xA3, 0xCE, 0x26, 0xB9, 0x9E, 0x59, 0x77, 0x0B, 0x40, 0x3E, 0x67, 0xBA, 0x69, 0xA7, 0x00, 0x16, 0x41, 0x3B,
|
||||
0x06, 0x24, 0xB2, 0x01, 0x64, 0xF0, 0xC4, 0x7C, 0xC9, 0xD8, 0x44, 0x6A, 0x60, 0xCC, 0x0F, 0x4C, 0x1E, 0x46, 0xA9, 0x94, 0x7D, 0xF1, 0xAA, 0xE4, 0x3E, 0x50, 0xBA, 0xA7, 0x9C, 0x27, 0x9A, 0x2A,
|
||||
0x51, 0x29, 0x50, 0xC3, 0x02, 0x00, 0x29, 0xD4, 0xA2, 0x2E, 0xFC, 0xA1, 0x6D, 0xF3, 0x8A, 0x4A, 0x0E, 0x25, 0x1F, 0x64, 0x90, 0x01, 0x96, 0xFE, 0x50, 0x72, 0x35, 0xB9, 0xB3, 0xE0, 0xBE, 0xF2,
|
||||
0xE6, 0xC4, 0x1C, 0x33, 0xBD, 0xEC, 0x64, 0x11, 0x49, 0xE8, 0xEA, 0xBE, 0xD4, 0xEE, 0xAF, 0x9B, 0xBE, 0xCC, 0x43, 0xCB, 0x50, 0xC5, 0xEF, 0x06, 0x83, 0x63, 0x9E, 0x9C, 0xDE, 0xD9, 0x39, 0x19,
|
||||
0x20, 0x44, 0xFF, 0x08, 0x02, 0x52, 0x9C, 0xCC, 0xC1, 0x66, 0xFC, 0x94, 0xB4, 0x03, 0x7F, 0x9E, 0xF3, 0xC0, 0x5C, 0x12, 0x56, 0xF0, 0xDE, 0x6A, 0xC1, 0x5D, 0x38, 0x59, 0x59, 0xA8, 0x02, 0xDD,
|
||||
0xE2, 0xCE, 0x62, 0x7E, 0xA0, 0x53, 0x5C, 0x43, 0x31, 0x4D, 0x1A, 0xB2, 0x9C, 0x02, 0x79, 0x6D, 0x41, 0x4E, 0x5E, 0xD4, 0x43, 0x1C, 0x54, 0x80, 0x15, 0x2D, 0xD8, 0xCE, 0x38, 0xA1, 0x56, 0xF0,
|
||||
0x4D, 0xCB, 0x57, 0x09, 0x21, 0x8F, 0xD7, 0x06, 0xD6, 0x8E, 0x71, 0x22, 0xB2, 0x19, 0xD5, 0x57, 0xB9, 0xB2, 0xB4, 0xA6, 0x7F, 0xC4, 0x7A, 0x80, 0x7E, 0x78, 0xCD, 0xD2, 0xCC, 0xC0, 0x43, 0x7C,
|
||||
0x1D, 0x61, 0x26, 0xB7, 0x57, 0xFC, 0xA6, 0x9D, 0x67, 0xA2, 0xE2, 0x51, 0x9A, 0x18, 0x0A, 0xF4, 0xD7, 0x67, 0x73, 0x27, 0x27, 0x66, 0xFB, 0x42, 0x30, 0x20, 0x56, 0x23, 0x96, 0x2D, 0x85, 0x34,
|
||||
0x0C, 0x71, 0x6E, 0xF4, 0xC8, 0x40, 0x40, 0x34, 0x8B, 0x78, 0x9D, 0xB0, 0x34, 0x0D, 0x24, 0x86, 0x19, 0x85, 0xED, 0xC5, 0xBF, 0xEC, 0xD4, 0xAD, 0xC5, 0xFC, 0x03, 0xCF, 0x55, 0x37, 0x98, 0x94,
|
||||
0x8B, 0x6E, 0x00, 0xD9, 0xF4, 0x3D, 0x76, 0xDB, 0x44, 0x4A, 0xCB, 0x7B, 0xD5, 0xA1, 0x7C, 0x00, 0xFF, 0x80, 0x02, 0xF6, 0xE8, 0x28, 0x21, 0x00, 0xB4, 0x48, 0xEA, 0xFC, 0x26, 0x07, 0xFE, 0xE0,
|
||||
0x57, 0xC1, 0x66, 0x38, 0x63, 0x31, 0xA1, 0xE8, 0x61, 0x39, 0x1B, 0x28, 0xDC, 0xCB, 0xE9, 0x99, 0x84, 0x84, 0xA2, 0xC9, 0xEE, 0xF3, 0x70, 0xD3, 0xE2, 0x83, 0x7E, 0x77, 0xCD, 0x95, 0x5A, 0xF7,
|
||||
0x1A, 0x18, 0x77, 0x9A, 0x29, 0xCA, 0xBA, 0xA8, 0x5B, 0xF4, 0x28, 0xA8, 0x43, 0x61, 0xE0, 0x03, 0x23, 0xE8, 0x90, 0x86, 0xC7, 0x78, 0xB4, 0xC9, 0x43, 0x16, 0x09, 0x07, 0x50, 0x66, 0x60, 0x8F,
|
||||
0x45, 0xA9, 0x7D, 0x86, 0xF8, 0x14, 0xA9, 0xCC, 0x42, 0x27, 0xF7, 0xED, 0x57, 0x10, 0x50, 0x66, 0xA8, 0xAB, 0xBC, 0x20, 0x1E, 0x69, 0xBF, 0x4E, 0xA9, 0x4E, 0xBC, 0x4B, 0xBB, 0x4F, 0x10, 0x5D,
|
||||
0x61, 0x09, 0xB0, 0x3A, 0x0C, 0x09, 0x37, 0x5F, 0x43, 0x2C, 0x33, 0x9C, 0x08, 0x12, 0x54, 0x1B, 0x58, 0x4B, 0x2B, 0x2C, 0x78, 0x4E, 0x52, 0x40, 0xEF, 0x34, 0x22, 0x1C, 0xD4, 0x32, 0xE5, 0x80,
|
||||
0x72, 0x6E, 0x4D, 0x00, 0xB1, 0x53, 0x51, 0xCC, 0xE3, 0xB7, 0xE7, 0x98, 0x14, 0x3D, 0x91, 0x91, 0x88, 0x9F, 0xDA, 0x06, 0xE6, 0x6D, 0x25, 0x2A, 0x6D, 0xA6, 0xFF, 0x98, 0xD7, 0x2C, 0xBF, 0xC9,
|
||||
0xB2, 0x0E, 0xF0, 0x79, 0x3E, 0x01, 0x7C, 0x86, 0x09, 0x9A, 0xA5, 0x22, 0x75, 0x0D, 0xB8, 0xB2, 0x11, 0x9B, 0xE3, 0xF9, 0x45, 0x7F, 0x8C, 0x31, 0x09, 0xEC, 0xC1, 0xAE, 0xBF, 0x09, 0x68, 0x8C,
|
||||
0x95, 0xDF, 0x48, 0x4E, 0x8A, 0xBE, 0x26, 0xC3, 0xE9, 0x97, 0x54, 0x9B, 0xCC, 0x1B, 0xA9, 0xD3, 0x90, 0x4C, 0x27, 0x85, 0xB4, 0x8F, 0x65, 0x01, 0xD4, 0xA8, 0x69, 0xE3, 0x07, 0x39, 0xA3, 0x23,
|
||||
0xC4, 0x85, 0x64, 0x6E, 0x17, 0x72, 0x9E, 0x76, 0x4D, 0x07, 0x06, 0x68, 0xE4, 0xEF, 0x14, 0x41, 0x5A, 0x96, 0xFA, 0xC3, 0xF9, 0x8F, 0x9A, 0xA1, 0xD5, 0xB6, 0x39, 0x82, 0xEC, 0xB2, 0xD8, 0x9E,
|
||||
0xDA, 0x4D, 0x0A, 0x77, 0xD9, 0x9F, 0x25, 0xBF, 0xDB, 0xFE, 0x9B, 0x62, 0x0E, 0x20, 0x81, 0x06, 0x4F, 0x24, 0xAA, 0xDA, 0x6D, 0x51, 0x16, 0xCF, 0x4A, 0x8A, 0x8C, 0x0E, 0xE7, 0x6D, 0xF3, 0x35,
|
||||
0x9B, 0x4B, 0x91, 0x9F, 0xB6, 0x2B, 0x7C, 0xB3, 0x4F, 0x56, 0xF8, 0x95, 0xD0, 0x56, 0x12, 0x51, 0x6F, 0x26, 0x30, 0x13, 0x78, 0xC0, 0xA1, 0x9F, 0x9B, 0x30, 0x7F, 0x7C, 0x84, 0x9B, 0xEE, 0xD6,
|
||||
0x17, 0x64, 0x73, 0xDA, 0x2C, 0x82, 0x01, 0xFF, 0x40, 0xC6, 0x44, 0x78, 0xED, 0x90, 0xED, 0x24, 0xA0, 0x89, 0xC7, 0x7F, 0xDB, 0x34, 0x4F, 0x9A, 0xB6, 0xA8, 0x33, 0x22, 0xA1, 0xF5, 0x4C, 0x2F,
|
||||
0xC2, 0x57, 0x87, 0x4C, 0xA6, 0x72, 0x52, 0x41, 0xE4, 0x5D, 0x3C, 0xF6, 0xA0, 0x67, 0x08, 0xD5, 0xC2, 0x17, 0x92, 0xBF, 0x90, 0xE3, 0x65, 0xA3, 0x1D, 0x7F, 0xDB, 0xE0, 0x0B, 0x47, 0x2B, 0xC2,
|
||||
0xDD, 0xF8, 0xCE, 0x7E, 0x8F, 0x78, 0xFD, 0x77, 0x07, 0xF8, 0xBE, 0x83, 0x18, 0x8F, 0xFA, 0xB3, 0x53, 0xEC, 0xD6, 0x0B, 0xFD, 0x55, 0x93, 0x5C, 0x26, 0xB5, 0x31, 0x8B, 0x19, 0xDB, 0x20, 0xFD,
|
||||
0xFC, 0xC3, 0x1C, 0xC3, 0x3A, 0x82, 0xC4, 0xB1, 0xBE, 0x90, 0x9F, 0x30, 0x21, 0x3B, 0x10, 0xEA, 0xFE, 0xA8, 0xD6, 0x3A, 0x3C, 0xC4, 0x63, 0x36, 0x69, 0x23, 0x5E, 0x3E, 0xF1, 0x19, 0xD0, 0x8C,
|
||||
0x82, 0x7E, 0x0E, 0x60, 0xE7, 0xFF, 0x6E, 0x09, 0x90, 0xBF, 0xD4, 0xE5, 0xDB, 0x3E, 0x0B, 0x64, 0xD6, 0x83, 0xDE, 0x05, 0xC5, 0x18, 0xE2, 0x52, 0x79, 0x2D, 0x7E, 0x49, 0x17, 0xBF, 0x35, 0x22,
|
||||
0x62, 0x07, 0x10, 0x59, 0x3D, 0xAB, 0x80, 0x09, 0xFC, 0xB6, 0xA8, 0x99, 0x81, 0xEF, 0xFE, 0x8F, 0xDE, 0x4D, 0xF5, 0xB9, 0xD4, 0xD1, 0x00, 0xE4, 0x31, 0x5D, 0x1E, 0x3A, 0x4B, 0xDC, 0xCF, 0x58,
|
||||
0x77, 0xC2, 0x4A, 0xD8, 0x0A, 0xBA, 0xDC, 0xB7, 0x6F, 0x60, 0x53, 0xA7, 0x42, 0x3B, 0x3C, 0xE5, 0xE5, 0x3E, 0x1F, 0xF1, 0xA8, 0x40, 0x21, 0xED, 0x2B, 0x10, 0x55, 0x8C, 0x2F, 0x2F, 0x3E, 0xE5,
|
||||
0x46, 0x5B, 0xA5, 0x9D, 0x0E, 0x5C, 0x38, 0x33, 0x10, 0x90, 0x1F, 0x2E, 0x5C, 0x08, 0xA2, 0x2B, 0x70, 0x8B, 0x45, 0x33, 0x11, 0x5C, 0xA7, 0x74, 0xBC, 0xA4, 0x79, 0xC8, 0xC0, 0x7D, 0x53, 0xF4,
|
||||
0xBF, 0xAE, 0xA5, 0xDA, 0x11, 0x90, 0x2B, 0x06, 0x1C, 0x28, 0x54, 0xE6, 0x0D, 0x5D, 0x27, 0x33, 0xDD, 0xB5, 0xB4, 0x2D, 0x44, 0x73, 0xA8, 0xE9, 0x2E, 0x71, 0x56, 0x77, 0x0E, 0x59, 0xCA, 0xFB,
|
||||
0xC0, 0xDF, 0x43, 0x74, 0xAE, 0x9C, 0xA0, 0x62, 0x77, 0x47, 0x24, 0xA3, 0x99, 0x16, 0x47, 0xD8, 0xCD, 0xDE, 0xBA, 0xF4, 0x1A, 0x78, 0xDB, 0x59, 0xEC, 0x96, 0x4B, 0xC6, 0x56, 0x7D, 0xE1, 0xF8,
|
||||
0x58, 0x05, 0x37, 0xA9, 0xCC, 0x00, 0xAD, 0x84, 0xE8, 0x11, 0x2C, 0x75, 0xF8, 0xBF, 0xC8, 0xCA, 0x15, 0x18, 0xB2, 0xDE, 0xF5, 0xD4, 0xA6, 0x90, 0xE9, 0x11, 0xAD, 0x8E, 0x0F, 0x6A, 0x9B, 0x20,
|
||||
0x8E, 0x45, 0xD7, 0x69, 0xBF, 0x7C, 0x0D, 0x3F, 0x90, 0xDD, 0xFC, 0x0B, 0x70, 0x45, 0x5C, 0x40, 0xD3, 0x55, 0x10, 0x57, 0x25, 0x58, 0x82, 0xD0, 0x3C, 0xD4, 0x5C, 0xB0, 0x02, 0x62, 0x36, 0x07,
|
||||
0xE4, 0x83, 0xEF, 0x79, 0xCA, 0x24, 0xD9, 0x3E, 0x2C, 0x3A, 0xA2, 0x39, 0xC3, 0x14, 0x7C, 0x69, 0xD4, 0xB7, 0xF7, 0xCA, 0x02, 0x4F, 0x8E, 0x88, 0x78, 0x77, 0xE0, 0x11, 0x9D, 0x9F, 0xEB, 0xF0,
|
||||
0x4D, 0xA7, 0xC8, 0x1C, 0x92, 0x98, 0x8C, 0xDA, 0xEA, 0x30, 0x98, 0x68, 0x77, 0x26, 0x3E, 0x18, 0x61, 0xAA, 0xC8, 0xEA, 0xD6, 0x5F, 0x88, 0x8C, 0x8B, 0xE8, 0x5F, 0x6D, 0xB8, 0x3D, 0x61, 0x01,
|
||||
0xEF, 0x0B, 0x99, 0x66, 0x5A, 0x0B, 0xBC, 0xA3, 0x0B, 0xF1, 0x81, 0x18, 0xF1, 0xE7, 0xDC, 0xFB, 0x69, 0x0E, 0x60, 0xE9, 0x82, 0x82, 0x5E, 0xAA, 0x88, 0x2E, 0xD2, 0x5B, 0x60, 0xA0, 0x48, 0xF6,
|
||||
0x48, 0x18, 0x61, 0x09, 0x69, 0x52, 0x5E, 0x11, 0x88, 0x65, 0x02, 0xF2, 0xCE, 0xF0, 0x55, 0xF3, 0xC8, 0x8E, 0x4C, 0x1D, 0xEE, 0x47, 0x40, 0xC8, 0xE5, 0x62, 0x87, 0xF3, 0x5E, 0xEB, 0x6D, 0xB6,
|
||||
0x20, 0x82, 0x3B, 0x1F, 0x35, 0x12, 0x69, 0xC1, 0x26, 0xDC, 0x19, 0xAA, 0x2F, 0x9B, 0xEE, 0x77, 0xF0, 0x88, 0xF2, 0x46, 0x64, 0xFB, 0xA4, 0x88, 0x72, 0x79, 0x27, 0xA6, 0xD1, 0x20, 0xE6, 0x62,
|
||||
0xA5, 0x74, 0xF8, 0x0D, 0xE4, 0xE4, 0x8E, 0x9D, 0x31, 0xDA, 0x05, 0x1E, 0x75, 0xE3, 0xD4, 0x09, 0x21, 0xE3, 0x03, 0xD8, 0x0C, 0x97, 0x75, 0xB9, 0x3B, 0x91, 0xEB, 0xFA, 0x77, 0x7E, 0x35, 0x21,
|
||||
0xFA, 0x22, 0xA3, 0x70, 0x84, 0xCC, 0x5A, 0xE2, 0xA5, 0x2B, 0xB3, 0x39, 0x05, 0x78, 0xB0, 0x47, 0x23, 0xF5, 0xB4, 0xB2, 0x1A, 0x77, 0xB8, 0x90, 0x2D, 0x93, 0xF3, 0xF9, 0xB0, 0xDF, 0x39, 0x59,
|
||||
0x7E, 0xAF, 0x14, 0x5E, 0xE5, 0xAE, 0x0B, 0x87, 0x60, 0x36, 0x2E, 0xFE, 0xC9, 0x73, 0x98, 0x1E, 0xC4, 0xAB, 0x49, 0x77, 0xDD, 0x80, 0x0E, 0xBC, 0xF6, 0x2D, 0x3D, 0xA3, 0xDB, 0x4C, 0xE5, 0x25,
|
||||
0x64, 0xC2, 0xED, 0x06, 0xD6, 0x09, 0xFF, 0x09, 0x5F, 0x83, 0xBF, 0xA8, 0x62, 0x84, 0x44, 0xC7, 0xEE, 0xB0, 0x72, 0xBF, 0x5D, 0x0E, 0x94, 0x1A, 0xBF, 0x7C, 0x18, 0x9B, 0x95, 0x58, 0xE6, 0x19,
|
||||
0x7A, 0x74, 0x5C, 0xD7, 0x4D, 0x87, 0x18, 0x11, 0x39, 0xE2, 0x75, 0x2B, 0x5E, 0xEB, 0xCC, 0x9F, 0x41, 0x60, 0x20, 0xD1, 0x7B, 0x90, 0xF7, 0x98, 0x80, 0x47, 0x95, 0xF7, 0x3F, 0x7E, 0x67, 0xF1,
|
||||
0xC9, 0x11, 0x8D, 0x37, 0xBF, 0xF5, 0x10, 0xD9, 0x5E, 0x03, 0xA2, 0x26, 0x3A, 0xA1, 0x68, 0x35, 0xEA, 0x61, 0x5A, 0xBF, 0xAB, 0x5B, 0x81, 0x65, 0xA2, 0x8A, 0x85, 0x75, 0x78, 0xA8, 0x49, 0x46,
|
||||
0x39, 0xF8, 0x76, 0xC5, 0xDD, 0x4D, 0x28, 0x7D, 0x9D, 0x7B, 0x08, 0x5B, 0x66, 0x06, 0x3C, 0x1C, 0x76, 0xDC, 0x78, 0xAA, 0x09, 0x87, 0xFF, 0x1C, 0xC8, 0xD9, 0x49, 0xD8, 0xF4, 0x93, 0x1D, 0x03,
|
||||
0x29, 0xA9, 0x5B, 0x9E, 0x5A, 0xBF, 0x3C, 0x38, 0x35, 0x5A, 0xE9, 0x55, 0x91, 0xA6, 0x78, 0xA7, 0xC8, 0x62, 0xDD, 0xDE, 0x3F, 0x43, 0xEF, 0xD5, 0x9F, 0xF5, 0xFD, 0x5C, 0x01, 0x17, 0xC4, 0xE5,
|
||||
0x5E, 0x0F, 0x17, 0xBF, 0xFE, 0xF6, 0x9A, 0x68, 0xD6, 0x0B, 0xFF, 0x96, 0x34, 0x25, 0xBA, 0xD7, 0xBC, 0x27, 0x98, 0x20, 0xA1, 0x8A, 0x4B, 0x7C, 0x8C, 0x96, 0xCF, 0xA9, 0x6C, 0x9A, 0x82, 0x47,
|
||||
0xF6, 0xFC, 0xD6, 0x3B, 0x0B, 0xD4, 0xCE, 0x45, 0xFB, 0xBB, 0x89, 0xC4, 0xF3, 0x8F, 0x26, 0x14, 0xD0, 0x70, 0x62, 0xF5, 0x97, 0x4B, 0x9C, 0xC7, 0xF7, 0x95, 0x60, 0x07, 0xF5, 0xF1, 0x3A, 0xCF,
|
||||
0x1C, 0x5D, 0x4D, 0xF3, 0xA3, 0x07, 0x9B, 0x1E, 0x5E, 0xCA, 0xDB, 0x73, 0xBD, 0x35, 0x70, 0x92, 0xB7, 0x07, 0x18, 0xBE, 0xF5, 0xD7, 0x1B, 0x85, 0x2A, 0x02, 0x9E, 0xE5, 0x13, 0xA3, 0x4F, 0x79,
|
||||
0xFC, 0xA4, 0x95, 0x64, 0xB3, 0x91, 0xE9, 0xE5, 0x89, 0x26, 0xE0, 0x41, 0x6F, 0x14, 0xAD, 0xF3, 0x6B, 0x08, 0x32, 0xE4, 0x20, 0x65, 0x7C, 0x93, 0x61, 0xDB, 0x33, 0x15, 0xAE, 0xA2, 0x56, 0x9D,
|
||||
}
|
||||
|
||||
var sampleBlockFirmwareUncompressed = EncryptedBlock{
|
||||
0x53, 0xAC, 0x9C, 0x3E, 0x05, 0xC1, 0xAF, 0x8A, 0x74, 0xE1, 0xDE, 0x10, 0xE8, 0x96, 0xCB, 0xD4, 0x04, 0x6F, 0xF1, 0x49, 0x32, 0x1D, 0x5A, 0x04, 0x2D, 0xB7, 0xBA, 0xEA, 0x83, 0x8A, 0xA7, 0x3F,
|
||||
0x9B, 0x59, 0x54, 0xFB, 0x9F, 0xC5, 0x3C, 0x6A, 0x87, 0xC9, 0x2C, 0xBE, 0x33, 0x9F, 0x6D, 0x2B, 0xA5, 0x79, 0x0B, 0x16, 0x7A, 0xF1, 0xC0, 0x01, 0x53, 0x23, 0xC2, 0x53, 0x91, 0x98, 0x28, 0xD8,
|
||||
0x56, 0xBA, 0x4D, 0xBE, 0x45, 0x7E, 0x7C, 0xD6, 0xA4, 0x0E, 0xCE, 0xC0, 0x9E, 0xAD, 0xFD, 0x62, 0xF7, 0x88, 0xA7, 0x61, 0x22, 0x54, 0x79, 0x09, 0x0A, 0xE1, 0x23, 0x3B, 0xFA, 0xB6, 0x7C, 0x5D,
|
||||
0xDD, 0x8E, 0x56, 0xA6, 0x27, 0xC9, 0x66, 0x2D, 0x96, 0x13, 0x1F, 0x9F, 0x50, 0x75, 0xF4, 0xBA, 0xC1, 0xE6, 0xEB, 0x7A, 0xEC, 0x05, 0x35, 0x4D, 0x12, 0x24, 0x67, 0xC6, 0xB6, 0xF7, 0x81, 0x02,
|
||||
0x5E, 0xB9, 0xC6, 0x7F, 0x37, 0x63, 0x94, 0x82, 0x92, 0x02, 0xD5, 0xBB, 0x76, 0x1D, 0x88, 0x0B, 0xC3, 0xC0, 0x36, 0x18, 0x9E, 0x0E, 0xFB, 0x8B, 0x94, 0xC1, 0x76, 0xFB, 0x2F, 0x5B, 0xCC, 0xEF,
|
||||
0xA9, 0xD7, 0x44, 0xF2, 0xCF, 0x18, 0xF8, 0xB7, 0xBA, 0xD4, 0x69, 0x74, 0x7D, 0xBD, 0x9D, 0xA8, 0x62, 0xAF, 0x00, 0xDF, 0xDE, 0xD6, 0x5C, 0xAC, 0x2E, 0x4F, 0xA0, 0x4A, 0x83, 0x2D, 0x4F, 0x7C,
|
||||
0x92, 0xDB, 0xE5, 0xA8, 0x81, 0xA9, 0xBA, 0x1E, 0xAF, 0x29, 0x89, 0x76, 0xFD, 0xF4, 0x3B, 0x38, 0x97, 0xB7, 0x2D, 0x60, 0x34, 0xEC, 0x30, 0x97, 0xA4, 0x78, 0xC8, 0x58, 0x4A, 0x0B, 0x4B, 0xB0,
|
||||
0xCF, 0x02, 0xD6, 0x86, 0x9C, 0x92, 0x29, 0x15, 0xFA, 0x91, 0x11, 0xE1, 0x06, 0x5A, 0xCC, 0x4C, 0x42, 0x38, 0x4E, 0x80, 0xF8, 0x03, 0x5C, 0xBA, 0xD4, 0x72, 0x80, 0xFA, 0x82, 0xA3, 0xF7, 0x36,
|
||||
0xF6, 0x0F, 0x09, 0x71, 0x10, 0x1D, 0x2F, 0x1D, 0x56, 0xAD, 0x21, 0xD2, 0x87, 0x66, 0xF4, 0xB0, 0x89, 0x16, 0xB8, 0x7D, 0xCF, 0xBF, 0x85, 0x4E, 0xBA, 0xC6, 0x50, 0x53, 0x91, 0x09, 0x31, 0x96,
|
||||
0x7E, 0x7A, 0x50, 0x60, 0x90, 0xC1, 0xD1, 0x53, 0x29, 0x9B, 0x74, 0x0C, 0x2A, 0xFB, 0x0E, 0x6E, 0xDF, 0xC9, 0xC1, 0xF7, 0x5A, 0x88, 0x2C, 0x46, 0x4F, 0xBF, 0xF4, 0x2A, 0x62, 0x63, 0x39, 0x52,
|
||||
0xB2, 0xD3, 0xCA, 0x8C, 0xDA, 0xFB, 0x7F, 0xFF, 0x1C, 0xDC, 0x0E, 0x8C, 0xCB, 0xA9, 0x3E, 0x00, 0x0A, 0x1C, 0xE3, 0x23, 0xD6, 0x74, 0x8C, 0xA7, 0x8D, 0x83, 0x0D, 0x34, 0x9D, 0xA7, 0xA7, 0xBA,
|
||||
0x4F, 0xEC, 0x18, 0x15, 0xF8, 0x1F, 0xEC, 0xB2, 0xBE, 0xE5, 0xF7, 0x58, 0x72, 0xEA, 0x48, 0xDD, 0x2C, 0x4A, 0xD4, 0x25, 0x99, 0x53, 0x16, 0xF5, 0xA4, 0x28, 0x7E, 0x1C, 0x83, 0xA8, 0x83, 0x20,
|
||||
0x3C, 0x88, 0x96, 0x1F, 0x4B, 0xEF, 0x74, 0xE1, 0xB7, 0xA9, 0x8E, 0xFD, 0x85, 0x23, 0x57, 0x7D, 0x80, 0x57, 0xC6, 0x47, 0x8B, 0xFE, 0xF4, 0xB7, 0xD4, 0x7E, 0x24, 0xC0, 0x61, 0xEA, 0x79, 0xAD,
|
||||
0x52, 0xE9, 0x9A, 0x33, 0x30, 0x3B, 0x89, 0xDA, 0x9C, 0x97, 0xB5, 0xD0, 0xA8, 0x15, 0x38, 0x58, 0xDD, 0x36, 0xE2, 0x10, 0xAE, 0x0E, 0x28, 0xB1, 0xC1, 0x23, 0x80, 0xD7, 0xFF, 0xED, 0xB5, 0x75,
|
||||
0x78, 0x3B, 0x25, 0x7E, 0x4C, 0xD9, 0x61, 0x6C, 0x39, 0x20, 0xB5, 0x71, 0xA2, 0x49, 0xBC, 0xA7, 0xA7, 0x7A, 0x4A, 0x4D, 0xC4, 0x5A, 0xFC, 0xC9, 0x59, 0x4E, 0x3F, 0x54, 0x66, 0xC4, 0x76, 0xA5,
|
||||
0x87, 0xEA, 0xCE, 0xA8, 0xC8, 0x03, 0x88, 0x49, 0x0C, 0x68, 0xD0, 0xA9, 0xC2, 0x56, 0x5C, 0x0D, 0x4E, 0xC8, 0xC6, 0xBB, 0x66, 0x68, 0xF7, 0x65, 0x7B, 0xDC, 0x90, 0x69, 0xFB, 0xD0, 0xA3, 0xA2,
|
||||
|
||||
0x76, 0x36, 0xF5, 0x63, 0x28, 0x10, 0x5A, 0x82, 0x0B, 0x80, 0x6D, 0x70, 0xA1, 0x05, 0x4F, 0xA2, 0x7B, 0xFD, 0xC3, 0xBA, 0xFE, 0x38, 0x87, 0x7A, 0xBE, 0x9A, 0xA6, 0x41, 0x19, 0xFB, 0xC4, 0x31,
|
||||
0x98, 0x55, 0x69, 0x50, 0xF2, 0x78, 0x9A, 0xF4, 0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08,
|
||||
0x1B, 0x44, 0x47, 0xA1, 0xC0, 0x47, 0x22, 0x7F, 0x6D, 0x99, 0x05, 0xB0, 0x36, 0x3E, 0xD8, 0x45, 0xB7, 0x76, 0x23, 0xDF, 0x73, 0x79, 0x87, 0x6F, 0x39, 0x85, 0x08, 0xAE, 0xC4, 0xCB, 0xAF, 0x1B,
|
||||
0x48, 0xA8, 0xFD, 0xF1, 0x8D, 0xD0, 0xE7, 0xF1, 0x4A, 0x96, 0x82, 0xDA, 0xA4, 0xB9, 0xEC, 0x11, 0x5F, 0xD4, 0x47, 0x39, 0xA8, 0xB8, 0x93, 0x31, 0x58, 0x1A, 0x17, 0x1A, 0x89, 0x27, 0xB0, 0xF7,
|
||||
0x28, 0x1F, 0x7D, 0x91, 0x74, 0x92, 0x35, 0x00, 0x11, 0x19, 0xDB, 0xCB, 0x2C, 0x40, 0x00, 0xA8, 0xDA, 0xF0, 0xF5, 0xE9, 0x04, 0x2A, 0x68, 0xF7, 0xB4, 0x22, 0x3F, 0x91, 0x32, 0xB5, 0xFA, 0x8D,
|
||||
0x74, 0x75, 0x01, 0x10, 0xF3, 0xAB, 0xC2, 0xAC, 0x3C, 0x30, 0x5E, 0x83, 0xFC, 0xAC, 0x5A, 0x64, 0x6E, 0xDB, 0x6F, 0x79, 0x1A, 0xA6, 0x10, 0x3F, 0xB3, 0x67, 0x94, 0x86, 0x24, 0x39, 0xCD, 0x68,
|
||||
0xB9, 0x9A, 0xF0, 0x84, 0x20, 0xE4, 0x4B, 0x0F, 0x36, 0x0D, 0xB4, 0x86, 0x98, 0x1E, 0x00, 0x98, 0x0E, 0x9E, 0x2E, 0x67, 0x94, 0x9F, 0xB0, 0x0F, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0,
|
||||
0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x07, 0x9B, 0xD1, 0xF5, 0x0E, 0xBF, 0x3D, 0x55, 0xE5, 0x57, 0x6E, 0x05, 0xAF, 0x70, 0x80, 0x1C, 0x8C, 0x8D, 0xFC, 0x7A, 0x1B, 0x58, 0x09, 0xA1,
|
||||
0x0E, 0x9E, 0x2E, 0x67, 0x94, 0x9F, 0xB0, 0x0F, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x07, 0x9B, 0xD1, 0xF5, 0x0E, 0xBF, 0x3D, 0x55,
|
||||
0x58, 0xCE, 0x00, 0x61, 0x9F, 0xAA, 0x41, 0xE6, 0x86, 0x39, 0xA0, 0x89, 0x07, 0x9C, 0x6D, 0x18, 0xD8, 0x2D, 0x3C, 0x66, 0x6E, 0x60, 0x61, 0xB9, 0x52, 0x6B, 0xFD, 0x2C, 0x7D, 0x60, 0x31, 0xC0,
|
||||
0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93, 0xCE, 0xCB, 0x77, 0x3E, 0x85, 0x85, 0x70, 0x1F, 0x52, 0x21, 0x7C, 0xD9, 0xB8, 0x5A, 0x18, 0x34,
|
||||
0xE2, 0xF1, 0x11, 0x11, 0xB1, 0x74, 0xF3, 0x27, 0x2D, 0x10, 0x22, 0x64, 0x03, 0x29, 0xCD, 0x67, 0x36, 0xCD, 0x90, 0x10, 0x1B, 0x47, 0xF9, 0x25, 0xB6, 0x04, 0x0A, 0x6A, 0x5C, 0x63, 0x4B, 0x8F,
|
||||
0x3F, 0xFB, 0xA4, 0x36, 0xCD, 0xF2, 0xB5, 0x5F, 0xAF, 0x2C, 0xBF, 0x25, 0x5D, 0x31, 0x44, 0x29, 0x29, 0x09, 0x21, 0x9B, 0x28, 0x32, 0x1D, 0x4D, 0xE7, 0xC5, 0xE1, 0x9E, 0x67, 0xF9, 0x9D, 0x4F,
|
||||
0x29, 0x09, 0x21, 0x9B, 0x28, 0x32, 0x1D, 0x4D, 0xE7, 0xC5, 0xE1, 0x9E, 0x67, 0xF9, 0x9D, 0x4F, 0xAF, 0x9E, 0x5D, 0x61, 0x55, 0x49, 0x78, 0x3D, 0xA1, 0xE8, 0x80, 0xB2, 0x69, 0x0A, 0x5F, 0xB3,
|
||||
0xD0, 0x5E, 0x06, 0x23, 0xAE, 0xA6, 0x7D, 0x78, 0xF9, 0xCC, 0x3E, 0x64, 0x70, 0x1E, 0xB5, 0x90, 0x20, 0x8A, 0x69, 0x70, 0x01, 0x3A, 0xF5, 0x2F, 0x81, 0x3D, 0x47, 0x57, 0x19, 0x6A, 0x77, 0xF5,
|
||||
0x8B, 0x06, 0x83, 0x0E, 0x17, 0x8D, 0x51, 0x86, 0x98, 0x55, 0xF8, 0x3F, 0x5B, 0x34, 0x53, 0x63, 0x8D, 0xA4, 0xE3, 0x37, 0x44, 0x2D, 0xC6, 0xA3, 0x97, 0xC5, 0x9B, 0xFE, 0xCF, 0x93, 0x75, 0xC5,
|
||||
0xDD, 0x6C, 0xF3, 0xD5, 0x7D, 0x3A, 0xCC, 0xF0, 0x6F, 0x42, 0x99, 0xF6, 0xF6, 0x05, 0x65, 0x07, 0x0A, 0xD1, 0x8C, 0x04, 0xA2, 0x38, 0x4C, 0xDA, 0xA9, 0xB7, 0xAD, 0x54, 0x02, 0xEA, 0x54, 0xB4,
|
||||
0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08, 0xDE, 0x48, 0x0D, 0x83, 0x77, 0xB3, 0x3C, 0xBA, 0x86, 0xBE, 0x42, 0xCC, 0xDF, 0xCE, 0x44, 0x7E, 0x16, 0x69, 0x28, 0xFF, 0x40, 0xA8, 0x5E, 0xEA,
|
||||
0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0xBA, 0xB2, 0x8B, 0xAB, 0x69, 0x2F, 0xF7, 0x08, 0xDE, 0x48, 0x0D, 0x83, 0x77, 0xB3, 0x3C, 0xBA,
|
||||
0x86, 0xBE, 0x42, 0xCC, 0xDF, 0xCE, 0x44, 0x7E, 0x34, 0xB0, 0x5A, 0xBB, 0x9A, 0x8F, 0x74, 0xB6, 0x5F, 0x5E, 0x15, 0x79, 0x14, 0xBE, 0x84, 0x55, 0x12, 0x5F, 0xBD, 0x25, 0x97, 0x21, 0x41, 0x3B,
|
||||
0x00, 0x2A, 0xC6, 0x7F, 0x2E, 0xBC, 0xD9, 0x69, 0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x8B, 0xDC, 0xC4, 0xFD, 0xE0, 0x0F, 0x5B, 0x48, 0xCE, 0xAA, 0xC3, 0xD8, 0xCF, 0x59, 0xBA, 0x47,
|
||||
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x51, 0x6A, 0xD7, 0x7A, 0x35, 0xD4, 0x0E, 0x7F, 0x60, 0x01, 0xFC, 0x25, 0xF3, 0xAF, 0xEE, 0xEF, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93,
|
||||
0x93, 0x18, 0xBB, 0x2F, 0x04, 0x3D, 0xA2, 0xE1, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x02, 0xAE, 0xAC, 0xFE, 0xBC, 0x6C, 0x63, 0x0E,
|
||||
0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B, 0x0B, 0x93, 0x17, 0x72, 0x90, 0x90, 0x14, 0xBA, 0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF,
|
||||
0xC2, 0xEE, 0xBC, 0x4B, 0xD3, 0xAC, 0xB7, 0xF6, 0xDA, 0x5D, 0xA3, 0x8A, 0x52, 0x63, 0xFD, 0x09, 0x71, 0x7F, 0x16, 0x45, 0x90, 0x7C, 0x9D, 0x24, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E,
|
||||
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B, 0x13, 0xF7, 0x6D, 0x51, 0x1F, 0x7A, 0xD5, 0x2D, 0xA9, 0xE5, 0x91, 0x0A, 0x3E, 0xB6, 0x41, 0x67,
|
||||
0x65, 0x19, 0xBD, 0xEB, 0x2F, 0x10, 0x7F, 0x2F, 0xBD, 0x4B, 0x9B, 0xFF, 0x81, 0xCC, 0xAD, 0x6E, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26, 0x3D, 0x83, 0xA2, 0x2F, 0x83, 0x45, 0xE7, 0x84,
|
||||
0xA7, 0xF9, 0xA6, 0x2C, 0x9E, 0xC2, 0x7B, 0x8E, 0xB2, 0xFE, 0xCB, 0xF5, 0x82, 0xFF, 0x47, 0xD4, 0xC2, 0xC6, 0xF9, 0xFE, 0x46, 0x6B, 0x27, 0xC6, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60,
|
||||
0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F, 0xDE, 0xC4, 0xB1, 0x0F, 0xFC, 0xC2, 0xE1, 0x4C, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x4A, 0x62, 0x95, 0x04, 0xD5, 0xCD, 0x72, 0xFF,
|
||||
0xD9, 0xED, 0xB8, 0x81, 0x9D, 0xDC, 0xEC, 0x8B, 0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0xDA, 0x53, 0x3F, 0x37, 0x25, 0x83, 0x84, 0x94, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51,
|
||||
0x8D, 0x9A, 0x5D, 0xEB, 0x31, 0x26, 0x16, 0xF4, 0x3B, 0x65, 0x3B, 0xCD, 0xCC, 0xF3, 0x32, 0xBE, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2,
|
||||
0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50, 0x52, 0x8F, 0xBD, 0xEE, 0xAB, 0xB4, 0xA6, 0x3F, 0x1D, 0x0D, 0x41, 0x73, 0xAD, 0x14, 0x0E, 0x52, 0x3B, 0x65, 0x3B, 0xCD, 0xCC, 0xF3, 0x32, 0xBE,
|
||||
0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB,
|
||||
0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xEC, 0xB5, 0x61, 0x02, 0x55, 0x5B, 0x92, 0x52, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xE1, 0x0B, 0xEA, 0xDC, 0xD7, 0x80, 0x55, 0x15, 0x92, 0xB3, 0x18, 0xD9, 0xBD, 0x1F, 0xC0, 0xCC, 0x03, 0x9C, 0x05, 0x3B, 0x9D, 0xFA, 0x59, 0xD2, 0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x52, 0x30, 0x8A, 0x52, 0x81, 0xD5, 0x09, 0x38, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
|
||||
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x57, 0x7F, 0xF9, 0x07, 0x3A, 0x64, 0xBE, 0x46,
|
||||
0xB3, 0x39, 0xA1, 0xB6, 0xFC, 0xD9, 0x17, 0x26, 0xE5, 0xE9, 0x75, 0x6C, 0x4E, 0x1B, 0x03, 0x1A, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x20, 0x02, 0x06, 0xED, 0xBB, 0x83, 0x76, 0x35, 0x86, 0x5E, 0x24, 0xFB, 0xFB, 0xA9, 0x8A, 0x96, 0xAE, 0xB4, 0x34, 0x07, 0x06, 0xB5, 0xC1, 0x3C,
|
||||
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0A, 0xB8, 0xF4, 0x86, 0x8C, 0xEB, 0x07, 0x9F, 0x43, 0x00, 0x53, 0x82, 0xA6, 0x6F, 0x03, 0xF1,
|
||||
0xD5, 0x86, 0x8F, 0x7E, 0x0A, 0xF9, 0xB1, 0x0A, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
|
||||
0xD0, 0xDB, 0x30, 0xF5, 0xC1, 0xB6, 0xE3, 0x31, 0xFA, 0xDD, 0xB4, 0x9B, 0x9C, 0x4B, 0x52, 0xAA, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xDD, 0xF6, 0xFB, 0x53, 0x91, 0x67, 0xD1, 0x78, 0x3E, 0xE8, 0x0D, 0x6F, 0x3B, 0x08, 0x22, 0x81, 0x5F, 0x56, 0xF5, 0xEF, 0x76, 0xC7, 0x94, 0x13,
|
||||
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0xA7, 0x6B, 0x81, 0x83, 0x2B, 0xDA, 0xC6, 0x38,
|
||||
0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF9, 0x9B, 0x03, 0xD0, 0xE4, 0x08, 0xA1, 0xF2, 0x0B, 0x99, 0xB4, 0xFE, 0x86, 0xE9, 0xFA, 0xD3, 0xE3, 0x60, 0x90, 0x6F, 0x90, 0xE4, 0xC4, 0xF8, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0xBD, 0x94, 0x4F, 0x6C, 0xA1, 0x9A, 0xEB, 0x0A, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
|
||||
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2B, 0xC7, 0xBC, 0x8D, 0x58, 0x1D, 0xBA, 0xB9,
|
||||
0xEE, 0x86, 0x71, 0x2E, 0x64, 0x9F, 0x05, 0x15, 0x66, 0xF2, 0xC3, 0x90, 0xF9, 0x29, 0x8E, 0x2D, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xCF, 0x3A, 0x4C, 0x24, 0x49, 0xD8, 0x03, 0x6B, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6,
|
||||
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x09, 0x9A, 0x4E, 0x8C, 0x99, 0xCF, 0xAA, 0xCB, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B,
|
||||
0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
|
||||
0x81, 0xF2, 0xA7, 0xF6, 0xD4, 0x52, 0x7C, 0xA7, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0F, 0xE3, 0x20, 0xEA, 0xAA, 0x6C, 0x0C, 0xFC, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40,
|
||||
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xF5, 0xD1, 0xF9, 0x1E, 0xAD, 0x80, 0x8E, 0x78,
|
||||
0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xD4, 0x42, 0xBD, 0x30, 0xF6, 0x19, 0x69, 0x74, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x1A, 0x3E, 0xA4, 0x74, 0x07, 0xFC, 0x04, 0x97, 0x3D, 0x2A, 0x55, 0x30, 0xE2, 0x7E, 0x40, 0xA5,
|
||||
0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x7B, 0xE6, 0x68, 0x59, 0x30, 0x08, 0x3D, 0xED,
|
||||
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x22, 0x40, 0x27, 0xDE, 0x76, 0x9C, 0x1E, 0x08, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38,
|
||||
0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x28, 0x18, 0x6B, 0x5D, 0x89, 0x17, 0x61, 0x32, 0xA4, 0x7C, 0xCD, 0x30, 0x06, 0x7C, 0xBB, 0xBA,
|
||||
0x24, 0xA7, 0x17, 0xE8, 0xF1, 0xD1, 0x02, 0x31, 0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C,
|
||||
0xFB, 0xB9, 0x86, 0x16, 0x24, 0x03, 0xD6, 0x8F, 0x20, 0xDF, 0xB5, 0x62, 0xFC, 0x1A, 0xF5, 0x71, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x04, 0x33, 0x50, 0xF8, 0xC6, 0x53, 0x38, 0x3F, 0xCA, 0xB6, 0xA8, 0xF0, 0xEA, 0x72, 0x90, 0x23, 0x18, 0x05, 0x08, 0x4C, 0x18, 0x6B, 0x4E, 0x33,
|
||||
0x3D, 0x6E, 0xE6, 0x57, 0xB4, 0x94, 0x12, 0x47, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC3, 0x89, 0xE7, 0xF1, 0xFF, 0x10, 0x63, 0x7C, 0x0C, 0x98, 0x39, 0x25, 0x02, 0xCF, 0x6D, 0x6D,
|
||||
0x59, 0x25, 0xB9, 0xB2, 0x99, 0x99, 0x3B, 0x04, 0x51, 0xCF, 0x28, 0x11, 0x8E, 0xB2, 0xA3, 0x38, 0x06, 0xB4, 0x9F, 0xEB, 0x0C, 0x4F, 0x0E, 0x6B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xAA, 0x9C, 0x55, 0xB1, 0xCD, 0x65, 0xF6, 0xE1, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x68, 0x4C, 0x2D, 0x38, 0x47, 0x29, 0xC5, 0x64, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11,
|
||||
0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x7E, 0x59, 0x60, 0x8C, 0x42, 0x3B, 0xD8, 0x5B,
|
||||
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x62, 0x4F, 0xC6, 0x8E, 0x51, 0xEF, 0x68, 0x6F, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6,
|
||||
0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE7, 0xA2, 0x47, 0x18, 0x21, 0x48, 0xD2, 0x78, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B,
|
||||
0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
|
||||
0x99, 0x51, 0x22, 0xA7, 0x50, 0xFF, 0x39, 0x4B, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x37, 0xCA, 0x91, 0x80, 0x3B, 0xB8, 0xB9, 0x6B, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40,
|
||||
0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xBC, 0x71, 0x73, 0xF7, 0x0E, 0x82, 0x9C, 0xD6,
|
||||
0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11, 0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x05, 0x6F, 0xF4, 0xC7, 0x38, 0x64, 0x11, 0x72, 0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0xA4, 0x0E, 0xA6, 0x08, 0x9B, 0x4A, 0x99, 0xF1, 0x7F, 0x23, 0x66, 0xEF, 0x70, 0x69, 0x19, 0x11,
|
||||
0x4C, 0x06, 0xF8, 0x98, 0xE8, 0x17, 0xBE, 0xE6, 0xCB, 0x00, 0x24, 0xB6, 0xA7, 0xD0, 0x06, 0x99, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xDB, 0x4D, 0x60, 0xC6, 0xA6, 0xA3, 0xD6, 0x54,
|
||||
0x27, 0xFF, 0x3C, 0x88, 0xC3, 0xCD, 0xBD, 0x3B, 0x4C, 0x27, 0x7B, 0x97, 0x5E, 0x44, 0x82, 0x40, 0xCA, 0x38, 0xAD, 0x12, 0x9F, 0xB8, 0xDE, 0x25, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17,
|
||||
0xBC, 0x2A, 0x59, 0x20, 0x11, 0x10, 0xEA, 0xF8, 0xEA, 0x24, 0x72, 0x67, 0xF9, 0xB2, 0x86, 0xE6, 0x8A, 0x0C, 0x73, 0xF9, 0x29, 0xD3, 0xF6, 0x95, 0xBE, 0x44, 0xBD, 0x6C, 0xF2, 0xCA, 0x2E, 0x39,
|
||||
0xA4, 0xF4, 0x71, 0xE7, 0x4D, 0x67, 0xED, 0xC0, 0x62, 0xED, 0xD7, 0xA0, 0x87, 0xFD, 0xF3, 0x2F, 0xD4, 0xA4, 0x42, 0x61, 0x7A, 0x38, 0x32, 0x43, 0xBD, 0x03, 0x6E, 0x22, 0xF8, 0x10, 0xEE, 0x58,
|
||||
0xF2, 0x82, 0x34, 0x03, 0x21, 0xB6, 0xDD, 0x24, 0x49, 0x1A, 0xD4, 0x00, 0x1E, 0x71, 0xE3, 0x0F, 0x84, 0x27, 0x00, 0x24, 0xCF, 0x8C, 0xB7, 0xF0, 0xB2, 0xFE, 0xCB, 0xF5, 0x82, 0xFF, 0x47, 0xD4,
|
||||
0x80, 0xEF, 0xC1, 0xF5, 0x17, 0x39, 0xC5, 0x91, 0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x2E, 0x35, 0x75, 0x1E, 0x18, 0x5E, 0x8A, 0xCC,
|
||||
0x20, 0xEA, 0x0F, 0x9B, 0x28, 0xE0, 0xD1, 0xF1, 0x58, 0x0C, 0xEB, 0x2B, 0x1F, 0x13, 0x67, 0x28, 0xC5, 0x2A, 0xD3, 0xBF, 0x75, 0x15, 0x3E, 0x21, 0x86, 0x39, 0xA0, 0x89, 0x07, 0x9C, 0x6D, 0x18,
|
||||
0x00, 0x2A, 0xC6, 0x7F, 0x2E, 0xBC, 0xD9, 0x69, 0xE2, 0x44, 0x84, 0x24, 0xD2, 0x65, 0x07, 0x2A, 0x32, 0x3F, 0x2C, 0x5A, 0x15, 0x6B, 0x91, 0x0E, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82,
|
||||
0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0xDB, 0xB7, 0x65, 0x2C, 0xFE, 0xBA, 0x49, 0x01, 0x14, 0x75, 0xB4, 0x77, 0x15, 0x11, 0x72, 0xE9, 0x90, 0xD9, 0x8D, 0x5E, 0xEB, 0xA1, 0x2A, 0x09,
|
||||
0x55, 0x00, 0xCF, 0x26, 0x63, 0x26, 0x31, 0x90, 0xCC, 0xE4, 0xE7, 0x88, 0x5C, 0x08, 0xBE, 0x86, 0x84, 0xA9, 0xB6, 0xBB, 0x15, 0xC6, 0x8F, 0x6C, 0x9D, 0x6C, 0x4D, 0x45, 0xED, 0xEB, 0xD3, 0x10,
|
||||
0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8,
|
||||
0x01, 0xB5, 0x14, 0x89, 0x4F, 0x54, 0x03, 0x9C, 0x94, 0x5E, 0x3C, 0xE5, 0x71, 0xD1, 0xB7, 0xB7, 0xE0, 0x7D, 0x14, 0xFB, 0x1D, 0xBE, 0xB5, 0x58, 0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F,
|
||||
0x93, 0x52, 0x84, 0xAA, 0x76, 0xA5, 0x45, 0x6D, 0xA2, 0x35, 0xDE, 0x5C, 0x53, 0xE2, 0x3C, 0x67, 0xF1, 0x4D, 0xD8, 0xA9, 0xB6, 0x2C, 0x97, 0x43, 0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD,
|
||||
0x47, 0x9C, 0x47, 0xF2, 0x33, 0x1D, 0xD7, 0x98, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46, 0x15, 0xDE, 0xA4, 0x74, 0xA5, 0x30, 0xC5, 0x7B,
|
||||
0xE5, 0x57, 0x6E, 0x05, 0xAF, 0x70, 0x80, 0x1C, 0x47, 0x9C, 0x47, 0xF2, 0x33, 0x1D, 0xD7, 0x98, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
|
||||
0x15, 0xDE, 0xA4, 0x74, 0xA5, 0x30, 0xC5, 0x7B, 0x58, 0xCE, 0x00, 0x61, 0x9F, 0xAA, 0x41, 0xE6, 0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0xB3, 0x3B, 0x70, 0x57, 0x6F, 0xED, 0xC4, 0xCF,
|
||||
0xAD, 0xAE, 0x25, 0x58, 0xF1, 0x06, 0x0A, 0x1D, 0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0xB2, 0x1E, 0xC0, 0x1C, 0x92, 0xA0, 0x63, 0x3C, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35,
|
||||
0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13, 0xD0, 0x25, 0xCB, 0x89, 0x00, 0x8E, 0x7B, 0xFF, 0xDD, 0x41, 0xE5, 0x3C, 0xFD, 0x39, 0xA3, 0x9F, 0x1F, 0xA7, 0x32, 0xB5, 0x10, 0x81, 0x02, 0xC7,
|
||||
0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0x08, 0x9E, 0xDA, 0x6D, 0x8C, 0x74, 0x16, 0xA7, 0x00, 0xED, 0x4D, 0x76, 0x76, 0x06, 0x3E, 0x3A, 0x79, 0x16, 0x38, 0xFA, 0x23, 0x17, 0x92, 0x8B,
|
||||
0xA6, 0x3E, 0x1C, 0xE0, 0xDB, 0xC3, 0x30, 0xE3, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2, 0x82, 0xFF, 0x09, 0x71, 0x5F, 0x0E, 0x95, 0x12, 0x6D, 0x16, 0x29, 0xEE, 0xE4, 0x8B, 0x2B, 0x91,
|
||||
0x7A, 0xA4, 0x0E, 0x99, 0x04, 0x87, 0x3E, 0xD2, 0x78, 0x79, 0xB5, 0x42, 0xF1, 0x05, 0x4E, 0x83, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x5F, 0xF3, 0x2B, 0xC2, 0xAA, 0x4C, 0x38, 0x6B,
|
||||
0xCE, 0xEF, 0xA6, 0x10, 0x51, 0xED, 0xB9, 0x7E, 0x7C, 0x20, 0x39, 0x8A, 0xBF, 0x1D, 0xA3, 0x86, 0x3D, 0x83, 0x17, 0x68, 0xFF, 0x60, 0xDB, 0xE3, 0xA1, 0xE8, 0x80, 0xB2, 0x69, 0x0A, 0x5F, 0xB3,
|
||||
0x97, 0x6D, 0x24, 0x32, 0x40, 0xC5, 0xDD, 0x7B, 0x87, 0xAF, 0xFA, 0x1C, 0x45, 0x05, 0x09, 0xF1, 0x0B, 0xAF, 0x9C, 0x67, 0xF7, 0x37, 0x44, 0x83, 0xD2, 0xA6, 0x95, 0x61, 0xA7, 0x79, 0x2A, 0x50,
|
||||
0x98, 0x3A, 0x00, 0x54, 0xA4, 0x1A, 0x6F, 0x1B, 0x9F, 0xCC, 0xE2, 0x06, 0x55, 0x73, 0x3E, 0xDF, 0xD9, 0x8B, 0xAD, 0xA5, 0x4A, 0xEB, 0x8D, 0x40, 0xAA, 0xD7, 0x26, 0xDC, 0xD5, 0x42, 0x3A, 0xD9,
|
||||
0x4D, 0xA3, 0x2D, 0xE0, 0xD7, 0xB5, 0xFA, 0x5B, 0x3D, 0x43, 0x05, 0x7C, 0x3B, 0xB6, 0x01, 0x20, 0x5D, 0xAC, 0xBE, 0xEE, 0xCF, 0xD4, 0x33, 0x50, 0xD9, 0x8B, 0xAD, 0xA5, 0x4A, 0xEB, 0x8D, 0x40,
|
||||
0xAA, 0xD7, 0x26, 0xDC, 0xD5, 0x42, 0x3A, 0xD9, 0xC7, 0x1E, 0x1E, 0x69, 0xE4, 0x92, 0x2E, 0x9F, 0xE0, 0x89, 0x34, 0x7F, 0x4E, 0x66, 0x69, 0x72, 0x9B, 0x73, 0x8D, 0xB6, 0x4D, 0x9D, 0x8A, 0x6F,
|
||||
0x1E, 0xB2, 0x8F, 0x87, 0x53, 0x26, 0xF4, 0x36, 0xA5, 0xEC, 0xCA, 0xB2, 0xFA, 0x71, 0x44, 0xC1, 0x8E, 0x02, 0x14, 0x21, 0xCC, 0xB8, 0x00, 0xB6, 0x34, 0xA8, 0xA2, 0x6C, 0xCB, 0x32, 0x44, 0x4C,
|
||||
0x37, 0x77, 0xB6, 0xBB, 0xBD, 0x78, 0x6D, 0xF6, 0x63, 0x39, 0x14, 0xCC, 0x61, 0xD7, 0x66, 0x7B, 0x26, 0x34, 0x3C, 0xEB, 0xB8, 0x7B, 0x04, 0x7A, 0xEC, 0x63, 0xBC, 0xC1, 0x11, 0x6F, 0xD3, 0x1B,
|
||||
0x82, 0xF0, 0x70, 0xFD, 0x07, 0x65, 0xC8, 0x73, 0xDC, 0x12, 0xE9, 0x25, 0xB2, 0xEC, 0x78, 0xE1, 0x1B, 0x46, 0x06, 0xE3, 0xED, 0x27, 0x69, 0x04, 0xDC, 0x14, 0xA9, 0xC2, 0xA2, 0x93, 0xD5, 0xB3,
|
||||
0x2E, 0xFF, 0x18, 0x57, 0x1C, 0xC2, 0x02, 0xEC, 0xC9, 0x98, 0x22, 0x18, 0x92, 0xDE, 0x72, 0xD0, 0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82, 0x47, 0x97, 0x19, 0x5C, 0x4F, 0xC0, 0xAB, 0x93,
|
||||
0x10, 0x7F, 0xFF, 0xDD, 0x0E, 0x0B, 0xF7, 0xDD, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0xDC, 0x73, 0x06, 0x9E, 0x18, 0xA3, 0x96, 0xAB, 0x61, 0x13, 0xAC, 0x59, 0x29, 0x28, 0xC9, 0x81,
|
||||
0xBD, 0x9E, 0x16, 0xA7, 0x72, 0xB0, 0x21, 0x3B, 0x85, 0xE5, 0x94, 0x97, 0x8D, 0x2C, 0xFD, 0x09, 0x0E, 0xEA, 0x82, 0xD3, 0xFC, 0x08, 0x99, 0x81, 0x41, 0x17, 0x0D, 0x51, 0xE6, 0xCF, 0xAE, 0xA2,
|
||||
0x1B, 0x7A, 0x09, 0xDB, 0x56, 0x1C, 0xDA, 0xB7, 0xF7, 0x4B, 0x7A, 0xB6, 0x2A, 0xDF, 0x43, 0x58, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31, 0x6C, 0x5A, 0xF6, 0x57, 0x79, 0x4D, 0xC3, 0x87,
|
||||
0x5D, 0x38, 0x2F, 0x96, 0x16, 0xF9, 0x32, 0xD4, 0xEB, 0x6D, 0x66, 0xC0, 0x5F, 0x36, 0x64, 0x47, 0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x95, 0x67, 0x7F, 0x23, 0xA7, 0x5A, 0x08, 0x99,
|
||||
0xA6, 0xFF, 0x34, 0x02, 0xD1, 0xD3, 0x67, 0x17, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E, 0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
|
||||
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0xA3, 0xEC, 0x38, 0xC0, 0x6F, 0xD5, 0x8E, 0x4E, 0x71, 0xF3, 0x8B, 0xBC, 0x8D, 0x16, 0xDF, 0xF4, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26,
|
||||
0x51, 0x6A, 0xD7, 0x7A, 0x35, 0xD4, 0x0E, 0x7F, 0x60, 0x01, 0xFC, 0x25, 0xF3, 0xAF, 0xEE, 0xEF, 0x80, 0xEF, 0xC1, 0xF5, 0x17, 0x39, 0xC5, 0x91, 0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89,
|
||||
0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x71, 0x7D, 0x81, 0x2C, 0x67, 0x53, 0x76, 0xA8, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED, 0x65, 0x43, 0xB4, 0x98, 0x25, 0xFE, 0x6F, 0x40,
|
||||
0xAD, 0xF6, 0xF1, 0x24, 0xB0, 0x7E, 0x5C, 0x2D, 0xAA, 0x16, 0xD9, 0x79, 0x45, 0x0B, 0x9D, 0x78, 0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0x5C, 0x8E, 0x67, 0x3D, 0xFB, 0x4D, 0x94, 0x4E,
|
||||
0xF5, 0x03, 0x3B, 0x26, 0xE5, 0x8A, 0xAE, 0x36, 0x2D, 0x78, 0x9A, 0x84, 0x6B, 0xEF, 0x0C, 0x43, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7, 0x9F, 0x2F, 0x30, 0x24, 0xA4, 0x30, 0x74, 0xE3,
|
||||
0xEF, 0x19, 0x26, 0x91, 0xE3, 0xB2, 0x31, 0xC6, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x58, 0x8E, 0x81, 0x02, 0xCA, 0x8A, 0xF5, 0x42, 0x62, 0xAC, 0x55, 0x90, 0xE8, 0xD2, 0xD6, 0x2A,
|
||||
0x58, 0x3C, 0xAC, 0x66, 0x4B, 0x32, 0x7D, 0x39, 0x6C, 0x36, 0xCA, 0x2C, 0x5C, 0xF7, 0xE1, 0xAD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x6B, 0xC1, 0xEC, 0x43, 0x30, 0x7D, 0x03, 0xEA, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0xC3, 0xF6, 0x7B, 0xA3, 0x09, 0x25, 0x3E, 0xAE, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2, 0x76, 0x64, 0xA3, 0x3B, 0x4D, 0xE3, 0xB4, 0x04, 0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0x7D, 0xB9, 0xE1, 0xED, 0x51, 0x22, 0x9F, 0x8D,
|
||||
0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2, 0x02, 0x56, 0xFF, 0x61, 0x89, 0xBC, 0xF3, 0xA8,
|
||||
0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42,
|
||||
0xB2, 0x21, 0x3E, 0x94, 0xC6, 0x74, 0x86, 0xC3, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x32, 0x64, 0xE0, 0xA3, 0x03, 0x54, 0xC5, 0xF2,
|
||||
0xC4, 0xB3, 0x15, 0x7A, 0xBA, 0x7E, 0xFF, 0x64, 0x48, 0xAC, 0x92, 0xDD, 0x23, 0x85, 0xC9, 0x5E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49,
|
||||
0x45, 0x17, 0xB3, 0xBB, 0xBC, 0x1D, 0xC9, 0x42, 0xF5, 0xC7, 0x2A, 0xA9, 0x0B, 0xD5, 0x62, 0x89, 0xF4, 0xF4, 0xFF, 0x0F, 0x8D, 0x86, 0x5B, 0x71, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x4F, 0x58, 0x01, 0x0B, 0xFF, 0xC4, 0xF7, 0xC0, 0xDC, 0x8B, 0xAF, 0x18, 0xA6, 0x8E, 0x73, 0xB1, 0x89, 0x58, 0xBC, 0x0D, 0xF9, 0x34, 0x14, 0x8D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xC9, 0xBD, 0xC0, 0xD4, 0x91, 0x36, 0x49, 0x9F, 0x4E, 0x0B, 0x84, 0xFE, 0x0F, 0x86, 0x7C, 0xB0, 0x14, 0x6B, 0xBD, 0x99, 0xDF, 0x66, 0x17, 0xCD, 0x95, 0x8A, 0x69, 0x4F, 0xAA, 0x0D, 0x7C,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xBB, 0x21, 0xD4, 0x73, 0x34, 0xDB, 0x5B, 0x74, 0x08, 0x71, 0xF7, 0x69, 0x9A, 0x12, 0xB6, 0x4C, 0x6A, 0x11, 0x51, 0x56, 0xDA, 0x0E, 0x0E, 0x25,
|
||||
0xC4, 0x4B, 0x1B, 0x64, 0x2F, 0x84, 0x24, 0x94, 0x87, 0x67, 0x20, 0xD9, 0x39, 0x78, 0xE8, 0xA0, 0x09, 0x1D, 0x6B, 0x1C, 0x70, 0x82, 0xB9, 0xA2, 0xDE, 0x3E, 0x01, 0xAB, 0xAB, 0xD4, 0xF7, 0x68,
|
||||
0xF1, 0xE0, 0x11, 0x7F, 0x19, 0x96, 0x0B, 0xDC, 0x2A, 0x46, 0x80, 0x53, 0x80, 0x0C, 0x80, 0xCC, 0xB8, 0xCA, 0xC0, 0xCF, 0xD0, 0xFA, 0x3D, 0x26, 0x61, 0xB1, 0xC6, 0x2C, 0xA6, 0xE5, 0xF0, 0x66,
|
||||
0x96, 0x39, 0x1B, 0xA0, 0xE9, 0x0C, 0x23, 0x4B, 0xA1, 0x41, 0x57, 0x84, 0x0D, 0xEB, 0x9E, 0x40, 0xB4, 0xC0, 0xE7, 0xC8, 0xEA, 0x64, 0xAB, 0x24, 0x8B, 0xDA, 0xBC, 0x3C, 0xA3, 0x8B, 0xF6, 0xCB,
|
||||
0x03, 0x08, 0x1C, 0xFF, 0x24, 0x27, 0xF4, 0xF9, 0xF1, 0xE0, 0x11, 0x7F, 0x19, 0x96, 0x0B, 0xDC, 0x2E, 0xD5, 0x8A, 0xFD, 0xAE, 0x60, 0xA5, 0x2B, 0x2E, 0x6E, 0x8E, 0xCC, 0x52, 0x3D, 0x29, 0xA2,
|
||||
0xE7, 0xCF, 0xC0, 0x75, 0x7F, 0xDB, 0x4A, 0x06, 0x28, 0x92, 0x67, 0xAC, 0x56, 0x4E, 0xD2, 0xA3, 0xEA, 0x60, 0x6C, 0xD6, 0xAF, 0xF3, 0x2E, 0xB2, 0x41, 0xFD, 0x38, 0x11, 0xD2, 0xB9, 0xF5, 0x8B,
|
||||
0x6B, 0xF7, 0x04, 0x53, 0xC2, 0x1F, 0x18, 0xD5, 0xF5, 0xE1, 0x7F, 0xD3, 0x7D, 0x4E, 0x0F, 0xF3, 0x63, 0x5F, 0xE1, 0x7D, 0x64, 0x29, 0x1E, 0xB3, 0x35, 0xE7, 0x8D, 0xD8, 0x1B, 0xF0, 0xFE, 0xBF,
|
||||
0x22, 0x1D, 0xEC, 0xC6, 0x1C, 0x27, 0x06, 0xCB, 0xF3, 0xDF, 0xB5, 0x3E, 0xE2, 0xBB, 0xB8, 0x6D, 0x1A, 0xD5, 0x48, 0xBC, 0x8F, 0xD7, 0xE5, 0x63, 0xAA, 0xBC, 0x16, 0x10, 0x87, 0xD1, 0x6F, 0x89,
|
||||
0xCD, 0xC0, 0x8B, 0x81, 0x76, 0x30, 0xF1, 0x84, 0x23, 0x20, 0xE6, 0x28, 0x40, 0xC0, 0xF3, 0xA9, 0x2F, 0xB2, 0xE4, 0x57, 0x38, 0x8D, 0x4F, 0x75, 0x48, 0x7B, 0x82, 0xA4, 0xF4, 0xE5, 0x9F, 0xBC,
|
||||
0x41, 0x31, 0xF5, 0x00, 0x43, 0xE6, 0x07, 0xE5, 0x03, 0xE9, 0x3B, 0xBA, 0xCB, 0x63, 0xBD, 0xAF, 0x6F, 0x32, 0xF3, 0xEB, 0xB2, 0x03, 0x20, 0x89, 0x46, 0xC8, 0x0C, 0xA2, 0x6F, 0xDE, 0x68, 0xC0,
|
||||
0x24, 0xCB, 0xCE, 0x94, 0x92, 0x39, 0x6F, 0x8C, 0x4E, 0xAC, 0xAE, 0xD4, 0x28, 0x15, 0x19, 0x7A, 0x5E, 0x10, 0x75, 0x30, 0x8D, 0x30, 0x48, 0x8B, 0xD1, 0x63, 0xCF, 0xBB, 0xBA, 0x09, 0x5C, 0x39,
|
||||
0x8F, 0x9C, 0xDB, 0xEA, 0xC7, 0xD4, 0x10, 0x2D, 0x90, 0x47, 0x15, 0xB6, 0x4D, 0x58, 0x87, 0x36, 0x46, 0xA6, 0xD6, 0x4F, 0x6E, 0x8F, 0x2C, 0x4B, 0x78, 0xCD, 0x9B, 0x7F, 0x97, 0x6D, 0x28, 0xFE,
|
||||
0xBB, 0x4F, 0x3B, 0xA7, 0x78, 0xD2, 0x30, 0x1D, 0x3E, 0xB8, 0x01, 0x74, 0x9F, 0xE1, 0x3A, 0x9F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xC9, 0xE2, 0xDE, 0x72, 0x20, 0x65, 0x9A, 0x74, 0x94, 0xCD, 0x8B, 0x8A, 0x90, 0x00, 0x8B, 0xF7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x58, 0xE7, 0xF3, 0x69, 0xC9, 0x47, 0x0E, 0x80, 0xA4, 0x54, 0x1D, 0x7C, 0xB8, 0xC5, 0x65, 0xFA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF4, 0xFA, 0x70, 0xDC, 0x2F, 0x79, 0x0B, 0x1D, 0x2A, 0xAE, 0x5B, 0xAC, 0xD8, 0x27, 0x95, 0xE0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xF6, 0x69, 0x33, 0xAA, 0xD9, 0x1C, 0x58, 0x8F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x1E, 0x2D, 0x4C, 0x13, 0x7B, 0x17, 0x38, 0x7D, 0x15, 0xD1, 0x2B, 0xEF, 0x7B, 0x97, 0xA5, 0xB6, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x21, 0xD3, 0x0D, 0x30, 0xB2, 0x4A, 0x72, 0xC1, 0xED, 0x05, 0x00, 0xBB, 0xF3, 0xDE, 0xF1, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xAA, 0x13, 0x3B, 0x49, 0x73, 0x8D, 0xFD, 0xC0, 0x73, 0xEC, 0x7A, 0x3C, 0xB5, 0xC6, 0x17, 0x8F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x98, 0x9C, 0x67, 0x25, 0xD0, 0xB3, 0x53, 0xB7, 0xCB, 0x9D, 0xBE, 0xA9, 0x57, 0xA1, 0xD7, 0xE0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x06, 0xAB, 0x1E, 0xE4, 0xE0, 0xDD, 0xAD, 0x2F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x6B, 0x3F, 0xD5, 0x48, 0x93, 0xAE, 0x12, 0x65, 0x78, 0xC7, 0x94, 0xE2, 0x13, 0x22, 0x66, 0x3F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xB6, 0x97, 0x11, 0x2F, 0x00, 0x6A, 0x23, 0x7D, 0x5F, 0xE9, 0x1C, 0xE9, 0xF6, 0x67, 0xC5, 0xDB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x0B, 0x25, 0xD6, 0x93, 0x3A, 0x97, 0x29, 0x0F, 0xF6, 0x0F, 0x5E, 0x87, 0x9F, 0x61, 0x53, 0x49, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x4F, 0xD7, 0x70, 0x13, 0xD7, 0xEC, 0xE0, 0xA8, 0x9E, 0x02, 0xB0, 0x48, 0xBF, 0x86, 0x37, 0x44, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x1D, 0xAD, 0x58, 0xD4, 0x95, 0xDE, 0x0C, 0x30, 0x23, 0x33, 0xCE, 0xD7, 0xED, 0x3F, 0x40, 0x22, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xD0, 0x1F, 0xB3, 0x76, 0x55, 0xD0, 0x99, 0x97, 0x94, 0xCD, 0x8B, 0x8A, 0x90, 0x00, 0x8B, 0xF7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x35, 0x9B, 0xE4, 0xDF, 0x94, 0x8C, 0x67, 0x7F, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x87, 0x8C, 0xE5, 0xC4, 0x7C, 0x45, 0xD9, 0xA3, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x71, 0x94, 0x10, 0x7A, 0x94, 0x7D, 0x1E, 0x32, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x12, 0x7D, 0x63, 0x93, 0x33, 0x62, 0x4C, 0x18, 0x43, 0x23, 0xFD, 0x9E, 0x5A, 0x33, 0x46, 0x14, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xE1, 0x39, 0xE5, 0xE3, 0x21, 0x66, 0xF1, 0x95, 0x83, 0xBE, 0x16, 0x7F, 0xD5, 0xAC, 0xE2, 0xEA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x1E, 0xD0, 0xF0, 0x4D, 0xAA, 0xD2, 0xD5, 0xB2, 0x18, 0x2E, 0x12, 0x4A, 0x8E, 0xF5, 0xF9, 0x78, 0x32, 0x39, 0x91, 0xFC, 0x9B, 0x8E, 0x87, 0x35, 0x22, 0x59, 0xA1, 0x0B, 0x52, 0xFC, 0x89, 0x71,
|
||||
0xF9, 0x80, 0x55, 0x43, 0x6E, 0x40, 0x4A, 0x74, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53, 0xD6, 0x0A, 0x65, 0x93, 0xDB, 0xE9, 0xC3, 0xC7, 0xBA, 0x60, 0x11, 0x1E, 0xFE, 0xC8, 0x64, 0x45,
|
||||
0x37, 0xCA, 0xEE, 0xC5, 0xDF, 0xC8, 0x35, 0x53, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81, 0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85,
|
||||
0xE6, 0x42, 0x04, 0x06, 0x08, 0x60, 0x50, 0x08, 0x7F, 0xB4, 0x9E, 0x33, 0xEA, 0x63, 0xE0, 0x18, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81, 0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85,
|
||||
0xE6, 0x42, 0x04, 0x06, 0x08, 0x60, 0x50, 0x08, 0xBF, 0x2D, 0xF1, 0x2B, 0x3D, 0xA7, 0xE4, 0x35, 0x9A, 0x78, 0x20, 0xA9, 0x70, 0x3A, 0xC6, 0x79, 0x13, 0xDC, 0xF0, 0x6E, 0x51, 0x2B, 0x87, 0x44,
|
||||
0x28, 0xCB, 0x60, 0x01, 0xDD, 0xE5, 0x04, 0x69, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0xD3, 0x4B, 0x9F, 0x21, 0x18, 0xB2, 0x75, 0x46, 0x5F, 0xA1, 0xF6, 0x84, 0x6B, 0xEC, 0x2A, 0x82,
|
||||
0x8D, 0xFF, 0x38, 0x69, 0x35, 0x2F, 0xEF, 0x60, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F,
|
||||
0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0xD6, 0x25, 0x0C, 0x4A, 0xE7, 0x84, 0x05, 0xBB, 0x07, 0xD5, 0x8F, 0xEF, 0x79, 0x29, 0x8B, 0x4E,
|
||||
0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50, 0xE5, 0xCD, 0x9D, 0xB2, 0x4D, 0x45, 0xFD, 0x3F, 0x3C, 0x38, 0x5C, 0x1F, 0x01, 0xBB, 0x32, 0x91, 0x6B, 0x99, 0x04, 0x83, 0xE0, 0xEC, 0x30, 0xBD,
|
||||
0xE3, 0xE5, 0x8F, 0x05, 0x3A, 0xFF, 0x6A, 0x1F, 0x97, 0xDC, 0x50, 0xD6, 0x08, 0x82, 0x18, 0x45, 0x27, 0x9C, 0xD0, 0x27, 0xAA, 0x9E, 0x3A, 0xCC, 0x86, 0x62, 0x90, 0xB2, 0x3A, 0xB4, 0x87, 0x92,
|
||||
0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD, 0x77, 0x9B, 0xDE, 0xB3, 0x74, 0xC6, 0xA7, 0x17, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7,
|
||||
0x9C, 0x71, 0xC7, 0xCB, 0x0C, 0x2D, 0xED, 0x3B, 0x7F, 0xB4, 0x9E, 0x33, 0xEA, 0x63, 0xE0, 0x18, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7,
|
||||
0x9C, 0x71, 0xC7, 0xCB, 0x0C, 0x2D, 0xED, 0x3B, 0xBF, 0x2D, 0xF1, 0x2B, 0x3D, 0xA7, 0xE4, 0x35, 0xEA, 0x6F, 0x7E, 0x90, 0x6A, 0x88, 0x71, 0x20, 0x18, 0x1F, 0x1B, 0x4B, 0xEA, 0xEF, 0xD7, 0x12,
|
||||
0x68, 0x05, 0x0A, 0x9C, 0x3F, 0x12, 0x20, 0xCE, 0x77, 0x9B, 0xDE, 0xB3, 0x74, 0xC6, 0xA7, 0x17, 0xBE, 0xAF, 0x61, 0xC0, 0xA6, 0x3E, 0xDE, 0xC2, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED,
|
||||
0x35, 0x24, 0xED, 0x5F, 0xBC, 0xF3, 0x3E, 0x40, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x82, 0x45, 0xF3, 0x16, 0xEA, 0x07, 0x43, 0x85, 0x9E, 0x90, 0x7D, 0x19, 0xDB, 0xA3, 0x9A, 0xED,
|
||||
0xAF, 0xFB, 0x9B, 0xC7, 0xCE, 0xD5, 0x55, 0xA1, 0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41, 0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
|
||||
0xFD, 0x56, 0x6E, 0x42, 0x2C, 0x33, 0xED, 0xC7, 0x6E, 0x86, 0xF4, 0x38, 0xAB, 0x51, 0xA6, 0x9A, 0x23, 0x75, 0x03, 0x83, 0x2C, 0xF3, 0x7C, 0x30, 0x62, 0x75, 0xD4, 0xC2, 0x9B, 0xCB, 0x16, 0xDE,
|
||||
0xE7, 0xA2, 0x47, 0x22, 0x7E, 0xBC, 0x71, 0x59, 0x88, 0x4C, 0x47, 0xE9, 0x6D, 0xB7, 0xD1, 0x28, 0x20, 0x68, 0xC2, 0x62, 0x39, 0x04, 0x50, 0x12, 0x5C, 0x68, 0x66, 0x7D, 0xE9, 0x42, 0x77, 0x39,
|
||||
0x07, 0xD5, 0x8F, 0xEF, 0x79, 0x29, 0x8B, 0x4E, 0xAD, 0xF6, 0xF1, 0x24, 0xB0, 0x7E, 0x5C, 0x2D, 0x97, 0xF2, 0xAA, 0x08, 0x13, 0x6E, 0xF8, 0x74, 0xE1, 0x4D, 0x7B, 0x34, 0x5E, 0x59, 0x90, 0x4B,
|
||||
0x41, 0x3B, 0x07, 0x60, 0x56, 0xDD, 0x95, 0x8A, 0x7E, 0x3F, 0xB0, 0x40, 0x2C, 0xBA, 0xEB, 0x2C, 0x02, 0xFD, 0x19, 0xAB, 0x2E, 0xDF, 0x26, 0xF8, 0xFB, 0xF4, 0xB3, 0x8A, 0x80, 0x94, 0x39, 0x29,
|
||||
0x4E, 0x06, 0x10, 0x14, 0x17, 0x3A, 0xEA, 0x61, 0xA2, 0x1B, 0xEE, 0x71, 0x41, 0xC6, 0xD3, 0x91, 0x02, 0xFD, 0x19, 0xAB, 0x2E, 0xDF, 0x26, 0xF8, 0x71, 0xD5, 0x2F, 0xD7, 0x69, 0xA5, 0x3C, 0xD4,
|
||||
0x4E, 0x06, 0x10, 0x14, 0x17, 0x3A, 0xEA, 0x61, 0xAC, 0x36, 0x65, 0xB7, 0xBF, 0x7B, 0xBE, 0xCB, 0xD5, 0xB5, 0xA9, 0x1C, 0xC5, 0xCE, 0xB3, 0x06, 0xC5, 0xED, 0x96, 0x2B, 0x39, 0x21, 0x9D, 0xDE,
|
||||
0xA2, 0x63, 0xF8, 0x3F, 0x16, 0xA2, 0x0D, 0xCD, 0xF7, 0xFF, 0x28, 0x77, 0x57, 0x27, 0x8E, 0x0A, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
|
||||
0x07, 0x94, 0xD8, 0x1D, 0x8A, 0x74, 0xD4, 0x40, 0xBD, 0x78, 0x41, 0x7C, 0xBD, 0x63, 0x23, 0x71, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
|
||||
0x6D, 0xB9, 0x7D, 0x98, 0x90, 0x73, 0x77, 0xA0, 0x0D, 0xD8, 0x82, 0x1B, 0x1B, 0xD6, 0xF1, 0x96, 0xA6, 0x0A, 0x9E, 0xCC, 0x3E, 0x56, 0x31, 0x90, 0x5F, 0x18, 0xA0, 0x10, 0xDC, 0x8C, 0xB7, 0x17,
|
||||
0x4F, 0xD3, 0x44, 0x8A, 0xC0, 0x1A, 0x58, 0x80, 0x78, 0xC7, 0xE8, 0x5F, 0x59, 0x90, 0x38, 0x03, 0xA9, 0xC0, 0x03, 0xB7, 0x18, 0x50, 0x4C, 0x9E, 0x86, 0x0D, 0xB8, 0x53, 0x19, 0x27, 0x33, 0x14,
|
||||
0x1F, 0x30, 0x05, 0x90, 0x1F, 0xAF, 0x9F, 0x0A, 0xF2, 0xA6, 0x5F, 0x84, 0xE6, 0xCA, 0xCE, 0x57, 0x89, 0x2F, 0x2A, 0x9B, 0x38, 0xCE, 0xEE, 0x1A, 0xFD, 0x0F, 0xF8, 0x46, 0xA1, 0x13, 0x31, 0x38,
|
||||
0x03, 0x32, 0xE1, 0x44, 0x84, 0xA5, 0xE1, 0xF6, 0xC5, 0xB4, 0x22, 0xA4, 0xC0, 0xF7, 0xFB, 0x1E, 0x98, 0x61, 0xFF, 0xC2, 0x61, 0x4D, 0x5B, 0x7E, 0xD0, 0x2E, 0xD0, 0xFE, 0xBD, 0x12, 0xA1, 0xEE,
|
||||
0xFF, 0x9E, 0xAC, 0x62, 0x4E, 0x0A, 0x02, 0x64, 0x81, 0xA5, 0x2B, 0xC9, 0x16, 0xB3, 0x6A, 0x8F, 0xDA, 0x9C, 0xC4, 0xF4, 0x97, 0xED, 0x0F, 0x04, 0xFF, 0x1B, 0xC8, 0x6A, 0xAC, 0xD6, 0x50, 0xCE,
|
||||
0xE4, 0x3D, 0x9C, 0xF8, 0xE5, 0xAF, 0x9D, 0xD1, 0xBC, 0x3D, 0x44, 0xF9, 0x2B, 0x12, 0x22, 0x8A, 0x44, 0x62, 0xDE, 0x91, 0x54, 0x56, 0xAC, 0x1D, 0xFB, 0x33, 0x11, 0x96, 0x23, 0x2C, 0x9A, 0x01,
|
||||
0x22, 0xAD, 0x74, 0xC4, 0xE7, 0x3F, 0x56, 0x16, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x36, 0xCF, 0x6F, 0xE9, 0x00, 0x0F, 0xB5, 0xF2, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
|
||||
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x4F, 0x86, 0xF1, 0xBC, 0xA0, 0x64, 0xA2, 0xAD, 0x64, 0xC9, 0xF2, 0x3B, 0x5C, 0xFB, 0x7E, 0x92,
|
||||
0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x3C, 0x38, 0x5C, 0x1F, 0x01, 0xBB, 0x32, 0x91, 0x18, 0xA0, 0xB3, 0xB3, 0x21, 0x1E, 0x81, 0xFB, 0xE0, 0x4F, 0x91, 0x65, 0xE9, 0xD4, 0xCB, 0x83,
|
||||
0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x7D, 0xDF, 0x22, 0xF2, 0xF6, 0xBD, 0x71, 0x7C, 0xD8, 0x26, 0x5A, 0x1D, 0x93, 0xE1, 0xC3, 0xC5, 0xF4, 0xE2, 0x26, 0x45, 0x7E, 0xDD, 0x56, 0xBB,
|
||||
0x39, 0xE1, 0xCB, 0x8F, 0xB7, 0xF7, 0x05, 0xD5, 0x1C, 0xB3, 0xB9, 0x44, 0x69, 0x67, 0xD2, 0x9A, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
|
||||
0xAB, 0xB9, 0x52, 0x8E, 0x69, 0x19, 0x2C, 0x10, 0xE0, 0x4F, 0x91, 0x65, 0xE9, 0xD4, 0xCB, 0x83, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0xD9, 0xD7, 0xD6, 0x0E, 0xCC, 0x4D, 0x13, 0x81,
|
||||
0x6E, 0x91, 0x88, 0xEF, 0x86, 0x96, 0x09, 0x85, 0x52, 0xEF, 0xA6, 0xB4, 0xA4, 0x16, 0x46, 0xF5, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F,
|
||||
0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83,
|
||||
0x96, 0x6F, 0xA4, 0x1D, 0xFF, 0xE1, 0x53, 0x1A, 0x2E, 0x69, 0x3D, 0xD7, 0xBE, 0x94, 0x9E, 0xC9, 0x9C, 0xF4, 0x43, 0x49, 0xC2, 0x4F, 0xF8, 0x52, 0x75, 0xBC, 0x1C, 0x14, 0x4E, 0x09, 0x7F, 0xB3,
|
||||
0xE5, 0xCD, 0x9D, 0xB2, 0x4D, 0x45, 0xFD, 0x3F, 0x0A, 0xD0, 0xE1, 0x48, 0x1E, 0x8D, 0x2F, 0xA4, 0x33, 0x9B, 0x4D, 0xE7, 0x61, 0x3B, 0x0B, 0xF8, 0x9F, 0x2E, 0xB4, 0xDC, 0x7C, 0x56, 0x11, 0x46,
|
||||
0x5B, 0xB1, 0xCB, 0x92, 0x78, 0x1D, 0xC6, 0x1F, 0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0xFA, 0x60, 0xDA, 0x80, 0x7F, 0xE8, 0x5F, 0x04, 0x7E, 0x3F, 0xB0, 0x40, 0x2C, 0xBA, 0xEB, 0x2C,
|
||||
0xAF, 0x00, 0x1C, 0x80, 0xFF, 0x0B, 0x48, 0xAE, 0xA0, 0xD4, 0x73, 0xE5, 0xA9, 0x52, 0x41, 0xF4, 0xB9, 0xE6, 0x07, 0x52, 0x72, 0xBF, 0x47, 0xDD, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2,
|
||||
0x07, 0x46, 0xC7, 0x2F, 0xEB, 0x5C, 0x59, 0x5E, 0xDD, 0x41, 0xE5, 0x3C, 0xFD, 0x39, 0xA3, 0x9F, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0x07, 0xF6, 0xD8, 0x21, 0x44, 0x92, 0xAF, 0x68,
|
||||
0xA7, 0xF7, 0x5E, 0xDF, 0xEC, 0x3C, 0x73, 0x51, 0x87, 0xDF, 0x99, 0x04, 0x0B, 0x2B, 0xAD, 0x31, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x8F, 0xDC, 0x8E, 0x8D, 0x3A, 0x74, 0x59, 0xA6, 0x6E, 0xE4, 0x42, 0xC5, 0xB5, 0xEB, 0xBE, 0xAB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4,
|
||||
0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x9F, 0x75, 0xE6, 0x23, 0x89, 0xB7, 0xEA, 0x87, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB,
|
||||
0xE8, 0xDE, 0x9A, 0xD8, 0x7B, 0xBB, 0x10, 0x95, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96,
|
||||
0xC2, 0xD6, 0xB7, 0xF9, 0x09, 0xD2, 0x82, 0x21, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB, 0xE1, 0x32, 0x28, 0x68, 0xA7, 0xDF, 0x8C, 0x8A,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE5, 0x3E, 0x94, 0xE9, 0xA5, 0x5B, 0x6D, 0xE4, 0x6F, 0x49, 0xA9, 0x49, 0xDD, 0xD4, 0x01, 0x96, 0x94, 0x5E, 0x6D, 0x3A, 0x49, 0xE6, 0x2A, 0x73,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x84, 0x17, 0x90, 0x09, 0x19, 0x19, 0x28, 0xBB, 0xFB, 0x75, 0x2F, 0x4F, 0xD1, 0x53, 0x52, 0xB5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8, 0xD0, 0x75, 0xAA, 0xD8, 0x56, 0x0D, 0x22, 0xFA, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88, 0x5E, 0xDA, 0x4F, 0xB7, 0x9E, 0x38, 0xBE, 0x0A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8, 0x2C, 0x69, 0x6A, 0x77, 0x85, 0x49, 0x73, 0x64, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88,
|
||||
0xDE, 0x02, 0x53, 0x7F, 0x93, 0xAB, 0x73, 0x16, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA6, 0x7A, 0x4C, 0xFA, 0xB3, 0x00, 0xD3, 0xB8,
|
||||
0xFA, 0x68, 0x8C, 0xE0, 0x94, 0x8B, 0x9F, 0x12, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xB0, 0x3B, 0xFD, 0x59, 0x6D, 0x9D, 0x88, 0x80, 0x7C, 0x09, 0xF8, 0x03, 0x34, 0x44, 0x9D,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xD9, 0xC0, 0x6D, 0x75, 0x84, 0x74, 0xA4, 0x05, 0x2A, 0x36, 0x44, 0x77, 0x2E, 0xED, 0x85, 0xD0,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xFA, 0xC0, 0x93, 0x68, 0x08, 0xD4, 0x1F, 0x68, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xBE, 0xE9, 0xA2, 0xA7, 0x8E, 0x7A, 0x39, 0x96, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xAD, 0xC5, 0x36, 0x13, 0x06, 0x4D, 0x31, 0x9E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x19, 0x56, 0xB8, 0x09, 0xF1, 0xAA, 0x61, 0x8E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0,
|
||||
0x82, 0xD6, 0xF4, 0xF4, 0xB4, 0x8D, 0xED, 0x32, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x45, 0xD4, 0xC0, 0x2D, 0xA2, 0x9B, 0x7C, 0xF3,
|
||||
0x64, 0x87, 0x53, 0x8E, 0x7E, 0x21, 0x07, 0x77, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0x0B, 0xF2, 0xE6, 0x41, 0x7D, 0x23, 0x6E, 0xEC, 0x7E, 0x6A, 0xCA, 0xC8, 0x48, 0x34, 0x3B,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xF3, 0xEB, 0xAF, 0x9B, 0x54, 0xC5, 0x97, 0x9E,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x51, 0x50, 0x12, 0x35, 0xFE, 0xCD, 0xF3, 0xF0, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x7F, 0x31, 0xDC, 0xE9, 0xD7, 0x26, 0x13, 0x8B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x4E, 0x69, 0x50, 0x49, 0x63, 0x11, 0x06, 0x80, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xB4, 0x06, 0xDB, 0x24, 0x4B, 0x9A, 0x01, 0x17, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xB9, 0xDF, 0x71, 0xEF, 0x2C, 0xFB, 0xA1, 0x8B,
|
||||
0xEF, 0xD9, 0x3D, 0x17, 0xF3, 0xDB, 0xCC, 0x84, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x87, 0xC1, 0x74, 0x10, 0xAC, 0x54, 0x89, 0x58,
|
||||
0xD0, 0x88, 0xE0, 0x52, 0xC7, 0x3E, 0x5A, 0xBD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x15, 0x7D, 0x74, 0x92, 0xB9, 0xC3, 0x0A, 0x55, 0x1C, 0x65, 0x2C, 0x63, 0x37, 0xA7, 0xC1, 0xD1,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x36, 0xAE, 0xD7, 0x50, 0x87, 0xDC, 0x1B, 0x8D, 0x27, 0x40, 0xF2, 0x11, 0xEA, 0x95, 0xE5, 0xE3,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x5A, 0xE7, 0x7E, 0x10, 0x60, 0x1D, 0x76, 0xCB, 0xED, 0x8B, 0x85, 0x50, 0x4B, 0x49, 0xFB, 0x53, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xEA, 0x3E, 0x72, 0x4E, 0x9E, 0x2A, 0x37, 0x20, 0x6D, 0x6F, 0x8A, 0x3D, 0x47, 0xCA, 0xBB, 0xD3, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0xC6, 0x19, 0xEE, 0x93, 0xDD, 0x45, 0x3B, 0x05, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x8D, 0x31, 0xC2, 0x06, 0xBC, 0x8C, 0xEA, 0x3A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xB5, 0xC2, 0x88, 0xDD, 0xFF, 0xC7, 0x2B, 0x59,
|
||||
0x1F, 0x16, 0x96, 0x53, 0x7D, 0x27, 0x94, 0xD4, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xA0, 0x01, 0x3B, 0x01, 0x8C, 0x57, 0xF7, 0x67,
|
||||
0xAC, 0x55, 0xA1, 0x9F, 0x5A, 0x3C, 0xD8, 0xC8, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1D, 0xD8, 0xC5, 0xF1, 0x85, 0xDC, 0xCC, 0x9D, 0xEE, 0x08, 0x10, 0x08, 0x18, 0x55, 0x64, 0xEE,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x38, 0x1C, 0x8B, 0xCF, 0xED, 0x48, 0x0A, 0x99, 0xE5, 0x68, 0x0A, 0xA1, 0x02, 0xE2, 0xCF, 0x21,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE3, 0x6E, 0x95, 0x4D, 0xE2, 0x0C, 0xE8, 0x31, 0x9B, 0x08, 0x0A, 0x3F, 0xCE, 0xB2, 0xC8, 0x5C, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xD2, 0x9C, 0x90, 0x59, 0xCE, 0x63, 0xEF, 0xEB, 0x49, 0xF9, 0x04, 0x4F, 0xBC, 0x9B, 0x7A, 0x3B, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x36, 0x3B, 0x63, 0x97, 0xC5, 0x14, 0x3D, 0xA8, 0x4E, 0x8D, 0x6E, 0xFF, 0x1F, 0xE1, 0x49, 0xC5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0xFB, 0x86, 0x87, 0x5D, 0x96, 0xDA, 0x3A, 0x39, 0x3A, 0x0B, 0xF2, 0xEA, 0xEF, 0x13, 0x2E, 0xD9, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x39, 0x2B, 0x99, 0x13, 0x61, 0x39, 0xF9, 0xF8,
|
||||
0xFA, 0xBE, 0x2E, 0xA0, 0x97, 0x36, 0x75, 0x53, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x64, 0x9E, 0xFF, 0xE0, 0x9B, 0xC6, 0x0B, 0xD6,
|
||||
0xFA, 0x1D, 0x8E, 0x5D, 0xD6, 0x23, 0x11, 0xCD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x18, 0x56, 0x09, 0xDC, 0x7A, 0x6B, 0xD1, 0x0D,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x3E, 0xAB, 0x30, 0xC7, 0x00, 0xFE, 0xDD, 0xF0,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x53, 0x42, 0xF8, 0x3D, 0x9C, 0xF7, 0x36, 0x12, 0x97, 0xDF, 0x02, 0x89, 0xD9, 0xC4, 0xF1, 0x6F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x80, 0xAB, 0xCE, 0x51, 0x01, 0xEA, 0xBA, 0x14, 0x26, 0x14, 0xBD, 0x1D, 0xF1, 0xF2, 0x0C, 0x70, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xE1, 0x5F, 0xE4, 0xF7, 0x86, 0x78, 0x58, 0xAE, 0xD0, 0x5B, 0x13, 0x70, 0x78, 0x2F, 0xEB, 0x8A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0xDC, 0x34, 0x6F, 0xE4, 0x48, 0x89, 0x06, 0x29, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0,
|
||||
0x3A, 0x1A, 0x65, 0x5E, 0xDE, 0x64, 0xD9, 0xB2, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07,
|
||||
0x50, 0xB9, 0xBC, 0x30, 0xCC, 0xD5, 0xE2, 0xB7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x9B, 0x92, 0x05, 0x34, 0xD7, 0x44, 0x56, 0x2B,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x52, 0xCE, 0x21, 0x4B, 0xAB, 0x25, 0xD1, 0x96,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xC1, 0xB4, 0x11, 0x2E, 0x3B, 0x14, 0x9E, 0x8D, 0xA9, 0x56, 0x97, 0x94, 0xAC, 0x99, 0xCB, 0xCB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9D, 0x8F, 0x04, 0x03, 0x25, 0xA4, 0x4D, 0x1F, 0x85, 0x1D, 0x53, 0x14, 0xD3, 0xFD, 0x7A, 0x94, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xA7, 0xBE, 0xDE, 0x23, 0x9F, 0x58, 0xE2, 0xFD, 0x58, 0x39, 0x72, 0xD1, 0xE7, 0x32, 0x26, 0xCE, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0xD0, 0x15, 0x5C, 0x5F, 0x61, 0xFA, 0x2F, 0x94, 0xE8, 0x0F, 0x97, 0x09, 0xBB, 0x3D, 0x69, 0x05, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x5A, 0x18, 0x74, 0x09, 0x15, 0x4B, 0x11, 0x28,
|
||||
0xC1, 0x0A, 0x3E, 0xFF, 0x06, 0xC6, 0x85, 0x60, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x22, 0x52, 0xBD, 0x8F, 0xFD, 0x98, 0xCC, 0x77,
|
||||
0x1F, 0x37, 0x34, 0x3F, 0xFE, 0x6E, 0x84, 0x70, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x76, 0x51, 0x1B, 0x58, 0x20, 0x75, 0xD0, 0x8B,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x9A, 0x82, 0xFB, 0x65, 0x7D, 0x5A, 0x3D, 0x07, 0x93, 0x33, 0xE8, 0x3B, 0x76, 0x3A, 0xB7, 0x4F,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2E, 0xC0, 0x8E, 0xCD, 0x2D, 0xCB, 0x3F, 0xC0, 0x87, 0x04, 0x9B, 0x43, 0xB2, 0xEF, 0xB6, 0x63, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x57, 0x97, 0xA1, 0xE1, 0x4D, 0xF3, 0x6E, 0x53, 0x4C, 0x9F, 0xBE, 0x72, 0x7F, 0x96, 0x08, 0x1A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x84, 0x6F, 0x06, 0xB1, 0x2F, 0xA8, 0xE0, 0xED, 0xF7, 0x0B, 0x1D, 0xAD, 0x4A, 0xFB, 0xFD, 0x67, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61,
|
||||
0xE9, 0xE2, 0x29, 0x71, 0x68, 0x43, 0x13, 0xF7, 0xC1, 0xC5, 0xE2, 0x31, 0xC4, 0xFE, 0x05, 0xF4, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xCA, 0xF8, 0xFB, 0xFE, 0xB3, 0x98, 0xD5, 0x23,
|
||||
0x7E, 0xB8, 0x61, 0x62, 0xFB, 0xAD, 0x34, 0x0A, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xB5, 0x8C, 0x6B, 0x00, 0xF7, 0x73, 0xB7, 0x60,
|
||||
0x56, 0x00, 0xAA, 0x14, 0x05, 0xFA, 0x0A, 0x33, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE7, 0xB2, 0xA4, 0x91, 0x67, 0xA7, 0x4F, 0x56, 0xFD, 0xB8, 0x18, 0x09, 0xCC, 0x67, 0x94, 0x80,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0x2D, 0x15, 0x36, 0x0D, 0xB2, 0xCE, 0x0F, 0x52, 0x06, 0xED, 0x5A, 0xDB, 0x7F, 0xEA, 0x41, 0xD1,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xA9, 0x6E, 0xBF, 0x42, 0x81, 0x8F, 0xCA, 0x9F, 0xDF, 0x59, 0x70, 0x73, 0xD4, 0x3B, 0x16, 0xE7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x59, 0xA4, 0x24, 0xB3, 0x8B, 0xB5, 0x09, 0x61, 0xCE, 0x32, 0x26, 0x61, 0xF4, 0xEC, 0x05, 0xDE, 0xA7, 0x47, 0x8C, 0xD3, 0x8F, 0xEB, 0x16, 0xC9, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x09, 0x04, 0xC8, 0x38, 0xA9, 0xE1, 0x18, 0xF3, 0x2D, 0xA3, 0xC2, 0xAD, 0x52, 0x67, 0x2A, 0x26, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x46, 0x77, 0x47, 0xD3, 0x2F, 0x0B, 0x95, 0x86,
|
||||
0x04, 0x4D, 0xBC, 0x98, 0xDE, 0xBB, 0x39, 0x16, 0x0F, 0x3F, 0xA0, 0x12, 0xC4, 0x49, 0x14, 0x3A, 0xFE, 0x0B, 0xDD, 0x44, 0xE7, 0x9D, 0x2A, 0x4B, 0x46, 0x22, 0x6D, 0xDA, 0x9C, 0x73, 0x3D, 0x44,
|
||||
0x0D, 0x97, 0x9E, 0x08, 0xF1, 0x5B, 0xC2, 0x0C, 0x8A, 0x63, 0x77, 0x3B, 0x49, 0xCC, 0xE0, 0x8F, 0xEC, 0x4F, 0xD6, 0xED, 0x6D, 0xCF, 0x52, 0xCB, 0xF1, 0x0E, 0x32, 0xB5, 0x67, 0x5A, 0xFB, 0xA6,
|
||||
0xCB, 0xB4, 0x8C, 0xDB, 0x6B, 0x9A, 0x11, 0x8C, 0x60, 0xB6, 0x47, 0xAA, 0x1E, 0x56, 0x4A, 0x6B, 0xEF, 0x5D, 0xA6, 0x88, 0x39, 0x5A, 0xA9, 0x3E, 0x98, 0x54, 0x4A, 0x42, 0x84, 0x9C, 0x5D, 0xB4,
|
||||
0xAE, 0xF2, 0xA7, 0x5A, 0xB8, 0x3F, 0x0C, 0xA2, 0xF4, 0x89, 0x17, 0x7E, 0x97, 0x46, 0x53, 0x36, 0xF0, 0x5D, 0xA7, 0xFA, 0x2D, 0x0D, 0x3B, 0x59, 0xD1, 0x96, 0x10, 0xB0, 0x6F, 0xAF, 0xC6, 0xA7,
|
||||
0xD2, 0x4A, 0x1C, 0x6C, 0x8D, 0x47, 0x0C, 0x08, 0xA3, 0x42, 0xB2, 0x3B, 0xDA, 0x26, 0x83, 0x94, 0x03, 0x1E, 0xC1, 0x21, 0x9D, 0x2F, 0x81, 0xF8, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2F, 0x21, 0x2F, 0xEB, 0x73, 0x66, 0x1D, 0x04, 0xDA, 0xEE, 0x9E, 0x39, 0xBB, 0x84, 0x67, 0x4D, 0xB0, 0xEA, 0xAD, 0x9C, 0xD0, 0x0A, 0x77, 0x59,
|
||||
0xEC, 0xEA, 0xA6, 0xE7, 0x1C, 0x46, 0xF5, 0xA0, 0x71, 0x8F, 0xF5, 0xE2, 0xE9, 0x7E, 0xCB, 0xCC, 0xD4, 0x9D, 0x9D, 0x9F, 0xA3, 0xAC, 0x1B, 0xC1, 0x9D, 0xAB, 0x40, 0x84, 0x6B, 0x83, 0x4E, 0x59,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xE9, 0x53, 0x01, 0xB6, 0x7E, 0x50, 0x70, 0x88, 0xCA, 0x09, 0x92, 0xE3, 0x17, 0xE6, 0x88, 0x31,
|
||||
0xFE, 0x3A, 0x6F, 0x55, 0xFF, 0xD0, 0x2F, 0xD8, 0x8F, 0x88, 0x22, 0xB0, 0x38, 0x04, 0xD3, 0xC5, 0x39, 0xD7, 0x98, 0x4F, 0xCD, 0x03, 0x1F, 0xC8, 0x3F, 0x12, 0x18, 0xAF, 0x1D, 0x8A, 0x1F, 0xD6,
|
||||
0x3C, 0xEA, 0x84, 0xAF, 0x20, 0xA4, 0xDC, 0xE2, 0x2F, 0xEF, 0x22, 0xB0, 0x02, 0x7D, 0xFC, 0xC8, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0x36, 0xCF, 0x6F, 0xE9, 0x00, 0x0F, 0xB5, 0xF2,
|
||||
0x2F, 0xEF, 0x22, 0xB0, 0x02, 0x7D, 0xFC, 0xC8, 0x19, 0xCB, 0xFB, 0xDC, 0x54, 0xF1, 0xCE, 0x5F, 0xD5, 0xB5, 0x91, 0x55, 0x37, 0x27, 0x08, 0x72, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4,
|
||||
0xF2, 0x40, 0xA5, 0xC4, 0x42, 0x18, 0xCB, 0x57, 0xD5, 0xB5, 0x91, 0x55, 0x37, 0x27, 0x08, 0x72, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44,
|
||||
0x13, 0x72, 0xF8, 0xA3, 0xFA, 0x42, 0x86, 0xAC, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44, 0x0F, 0xAE, 0xF9, 0xB5, 0xEC, 0xD1, 0x2D, 0xB9,
|
||||
0x55, 0x51, 0x2A, 0x5E, 0x54, 0x69, 0x19, 0xBA, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53, 0x2A, 0x03, 0xD7, 0xFC, 0x3B, 0xE1, 0x0E, 0x72, 0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B,
|
||||
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x7A, 0x2F, 0xCB, 0x9D, 0x42, 0x5D, 0x5A, 0x46, 0x3E, 0xA8, 0x81, 0x61, 0xBB, 0xCB, 0x5E, 0x98, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53,
|
||||
0xF8, 0x06, 0x15, 0x38, 0xB4, 0x81, 0x30, 0xFD, 0x33, 0x0F, 0x21, 0x15, 0x76, 0xFC, 0x3D, 0xB8, 0xB1, 0xFE, 0x53, 0x6E, 0x60, 0x7D, 0xA8, 0xCC, 0x6A, 0x7D, 0xF9, 0xB1, 0x18, 0x19, 0x0A, 0xAF,
|
||||
0xDA, 0x2A, 0x1C, 0xEF, 0xA1, 0x70, 0x43, 0x95, 0x8B, 0x06, 0xB1, 0xF2, 0x2B, 0xF7, 0x4E, 0x54, 0xA4, 0xFA, 0x39, 0x45, 0xA7, 0xB7, 0x24, 0x00, 0x68, 0xE3, 0xBB, 0xE7, 0xDB, 0x7F, 0x0E, 0x3B,
|
||||
0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0xD6, 0x0A, 0x65, 0x93, 0xDB, 0xE9, 0xC3, 0xC7, 0x6C, 0xF7, 0x49, 0xC6, 0x74, 0xD1, 0x3C, 0x82, 0x2C, 0xA2, 0xDF, 0x73, 0x98, 0xDC, 0x6E, 0x53,
|
||||
0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22, 0x7C, 0x63, 0x41, 0x4A, 0x99, 0x1D, 0x8A, 0xEA,
|
||||
0x29, 0xBB, 0xBA, 0x1B, 0x58, 0xE4, 0x1D, 0x60, 0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x05, 0x79, 0x71, 0x2C, 0xC3, 0x28, 0x3A, 0x40, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4,
|
||||
0xF2, 0x40, 0xA5, 0xC4, 0x42, 0x18, 0xCB, 0x57, 0x05, 0x79, 0x71, 0x2C, 0xC3, 0x28, 0x3A, 0x40, 0xB5, 0xB0, 0x48, 0xAF, 0x58, 0xAF, 0x49, 0xB4, 0xC4, 0x03, 0x61, 0x54, 0x3F, 0xF4, 0xD4, 0x44,
|
||||
0xDF, 0x96, 0x37, 0xCF, 0x38, 0x6E, 0x1F, 0xD4, 0xC7, 0x1F, 0xEA, 0x68, 0x98, 0xE0, 0x35, 0x5D, 0xBC, 0x4C, 0x1D, 0x6E, 0x6B, 0x2F, 0x6F, 0xDB, 0x71, 0x3E, 0xB9, 0x7D, 0xF2, 0xC0, 0x2F, 0xD3,
|
||||
0x31, 0x7E, 0xDC, 0xE7, 0xF3, 0x6B, 0xA9, 0x8B, 0x81, 0x27, 0xD8, 0x4F, 0x69, 0xE1, 0x53, 0xBC, 0x8E, 0x92, 0x09, 0x3A, 0xFA, 0x94, 0x83, 0x46, 0xE1, 0x4D, 0x7B, 0x34, 0x5E, 0x59, 0x90, 0x4B,
|
||||
0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0xAA, 0x16, 0xD9, 0x79, 0x45, 0x0B, 0x9D, 0x78, 0xF5, 0x5C, 0x17, 0xB6, 0xEF, 0x7F, 0x9D, 0xA2, 0xF9, 0xDB, 0xD8, 0xE3, 0x6C, 0x16, 0x2D, 0x41,
|
||||
0x81, 0x0C, 0x0E, 0xE3, 0x2B, 0x3C, 0x74, 0xC6, 0x52, 0x8F, 0xBD, 0xEE, 0xAB, 0xB4, 0xA6, 0x3F, 0x86, 0x61, 0xB2, 0x23, 0x83, 0x52, 0x0E, 0xE3, 0x77, 0x5B, 0x2D, 0x77, 0x28, 0x3C, 0x2B, 0x55,
|
||||
0x3A, 0x02, 0x01, 0xC1, 0xB8, 0x0E, 0x57, 0xC6, 0x78, 0x23, 0x8E, 0x04, 0xD3, 0x54, 0xC3, 0xE7, 0xB0, 0xEA, 0x08, 0xC1, 0x4B, 0x4C, 0x6B, 0xAA, 0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13,
|
||||
0x79, 0x05, 0xA2, 0x23, 0x54, 0xE6, 0x2A, 0x70, 0xF9, 0xCC, 0x47, 0x30, 0xE3, 0xB6, 0x8D, 0x2C, 0xC3, 0x1C, 0x3C, 0x20, 0x02, 0xF7, 0xB5, 0x5B, 0x8D, 0xE4, 0xF8, 0x55, 0xDE, 0x60, 0x74, 0x56,
|
||||
0xE7, 0xA3, 0x5B, 0x02, 0x6E, 0xBF, 0x9F, 0x4E, 0x40, 0x49, 0x69, 0x7F, 0x14, 0x46, 0x39, 0x92, 0x51, 0x9C, 0x15, 0xCB, 0x12, 0xAF, 0xA2, 0x1C, 0x60, 0x51, 0x8A, 0x93, 0xE4, 0x99, 0x73, 0xE9,
|
||||
0x42, 0x95, 0xC1, 0x97, 0x04, 0xDB, 0x1A, 0x91, 0x65, 0x91, 0x1D, 0x92, 0xA8, 0x90, 0x03, 0x4E, 0xCA, 0x8C, 0x68, 0x3B, 0x4F, 0xF0, 0x99, 0x55, 0xAE, 0xC2, 0x3F, 0xE9, 0x6E, 0x03, 0xF3, 0x88,
|
||||
0xA4, 0xFC, 0x35, 0x30, 0xD5, 0xB1, 0xB6, 0xEA, 0x73, 0xA2, 0xB5, 0x47, 0x2E, 0xC1, 0x39, 0xD7, 0x9C, 0x87, 0xC0, 0x15, 0x30, 0x8A, 0xAE, 0xF2, 0xAC, 0x8D, 0x8B, 0x79, 0x5C, 0x63, 0xB7, 0x70,
|
||||
0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x62, 0x83, 0x79, 0x83, 0x2D, 0xCA, 0xEF, 0xCC, 0x4E, 0x95, 0xFD, 0x7A, 0xCB, 0x4C, 0xF1, 0x2E, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17,
|
||||
0x75, 0x02, 0x39, 0x7B, 0x27, 0x88, 0x4F, 0x51, 0xED, 0xF4, 0x82, 0x98, 0x6F, 0x55, 0xE0, 0xBC, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0xCA, 0x1E, 0x5F, 0x36, 0xFC, 0x44, 0x9E, 0xA1,
|
||||
0x30, 0x94, 0x9F, 0xC5, 0x06, 0x3B, 0x64, 0x99, 0x22, 0x45, 0xEB, 0xCF, 0x4B, 0x9A, 0xD8, 0x17, 0x60, 0x9B, 0x85, 0x2D, 0x01, 0x9D, 0xF0, 0xD1, 0xD6, 0xBE, 0x38, 0xE9, 0xDC, 0x51, 0x98, 0x98,
|
||||
0xA2, 0xB8, 0x90, 0x71, 0xFA, 0xA7, 0xB3, 0xDC, 0x5F, 0x6F, 0xEC, 0x96, 0xE9, 0xF8, 0xBB, 0xA1, 0x0D, 0x85, 0xFE, 0x23, 0x41, 0x37, 0x03, 0x16, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x95, 0x74, 0x76, 0x7A, 0x38, 0x4D, 0xEF, 0x8D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xCE, 0xC9, 0x38, 0xCE, 0x52, 0xC4, 0x7A, 0xC2,
|
||||
0xE7, 0x8F, 0x32, 0x8D, 0x9E, 0x17, 0xD4, 0x88, 0x99, 0xEA, 0x8E, 0x83, 0xAC, 0xEA, 0xEA, 0xA7, 0x1C, 0xBA, 0xE3, 0x08, 0x48, 0xFD, 0x2A, 0xCB, 0xD3, 0x40, 0x14, 0x11, 0x10, 0xF2, 0x03, 0x53,
|
||||
0x96, 0x02, 0x9B, 0xCF, 0xAD, 0xEB, 0x9E, 0x35, 0x65, 0xA9, 0xE2, 0xA9, 0xF0, 0xCB, 0x76, 0xA9, 0x2D, 0x35, 0xBF, 0x5C, 0x90, 0x83, 0x66, 0x38, 0x1C, 0xBA, 0xE3, 0x08, 0x48, 0xFD, 0x2A, 0xCB,
|
||||
0xB0, 0xE0, 0xC7, 0x87, 0x29, 0x1B, 0x34, 0x62, 0xC5, 0x0D, 0x49, 0xE8, 0x74, 0x80, 0x83, 0x98, 0x79, 0xBF, 0x66, 0x3F, 0xD6, 0x53, 0x1F, 0x62, 0x35, 0xA7, 0x60, 0x91, 0xE2, 0x11, 0x9F, 0x69,
|
||||
0x9A, 0xB9, 0x11, 0x95, 0xE4, 0x09, 0x3A, 0xC7, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x2C, 0xF3, 0xCF, 0xBA, 0x38, 0x0F, 0xE8, 0x1F, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x15, 0x73, 0xDC, 0x9A, 0xC6, 0x6E, 0xED, 0x8E, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x1A, 0xE5, 0xBA, 0xAB, 0x96, 0xA8, 0xC9, 0x56,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFB, 0xB0, 0x54, 0x01, 0xF8, 0xFA, 0xD2, 0xBD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x5E, 0x13, 0xB0, 0xF9, 0xF3, 0xF1, 0x59, 0x4B, 0xBA, 0x71, 0x18, 0xDD, 0xEB, 0x69, 0xD4, 0x01, 0x5A, 0xC6, 0xE9, 0xD2, 0x49, 0x1C, 0x60, 0xD6, 0x11, 0x15, 0x93, 0x43, 0x5A, 0x58, 0x38, 0x8D,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x77, 0x90, 0x8B, 0xBF, 0xA8, 0x2C, 0x04, 0x93, 0x3C, 0xEA, 0x84, 0xAF, 0x20, 0xA4, 0xDC, 0xE2, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
|
||||
0x03, 0xE7, 0xB9, 0xEF, 0xFD, 0x5C, 0xFB, 0x72, 0xFB, 0x33, 0x11, 0x96, 0x23, 0x2C, 0x9A, 0x01, 0xA1, 0x1E, 0xB8, 0xA0, 0x79, 0x1B, 0x96, 0x5D, 0x4E, 0x56, 0x9F, 0xE9, 0xB3, 0x1D, 0x24, 0x05,
|
||||
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0x7C, 0xD6, 0xA7, 0x13, 0xF0, 0xB2, 0xEF, 0x45, 0x82, 0xB0, 0xF4, 0x78, 0x6F, 0x90, 0x30, 0x6A, 0xB1, 0x2A, 0xD4, 0xBC, 0x5B, 0x5D, 0xEE, 0x26,
|
||||
0x41, 0x9D, 0xAC, 0xAB, 0x73, 0x33, 0xD5, 0xF9, 0xCE, 0xAA, 0xC3, 0xD8, 0xCF, 0x59, 0xBA, 0x47, 0x72, 0x8F, 0x85, 0x1E, 0x17, 0xD9, 0x67, 0x6F, 0x94, 0x87, 0x56, 0xFA, 0x6E, 0x58, 0x17, 0xD6,
|
||||
0x8B, 0x06, 0xB1, 0xF2, 0x2B, 0xF7, 0x4E, 0x54, 0xCB, 0x19, 0x4E, 0x28, 0x0C, 0x64, 0x82, 0x78, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9, 0x09, 0x33, 0x07, 0xE1, 0xC6, 0x64, 0x37, 0xF1,
|
||||
0xE6, 0xD3, 0x7F, 0xA7, 0xF0, 0xAF, 0x53, 0x6C, 0x66, 0x09, 0xD6, 0x97, 0x0D, 0xC9, 0x00, 0xCF, 0x99, 0x4F, 0xAF, 0x1F, 0x97, 0x18, 0x65, 0xAB, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9,
|
||||
0x27, 0xDB, 0x24, 0x6A, 0xE9, 0xBB, 0x0F, 0xDD, 0x4D, 0x16, 0xAB, 0x79, 0x24, 0x3D, 0xC7, 0xEB, 0x33, 0xF3, 0x2D, 0x62, 0x79, 0xD9, 0xB6, 0x53, 0x39, 0xFD, 0xD0, 0x3A, 0x3C, 0x88, 0xA9, 0x9C,
|
||||
0x48, 0x6B, 0x06, 0x08, 0xF1, 0xAD, 0x0D, 0xD1, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0xE9, 0xF8, 0x9C, 0xF7, 0x10, 0x7A, 0x0A, 0x7F, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22,
|
||||
0x16, 0x94, 0x00, 0xFA, 0x7F, 0x43, 0xA1, 0x37, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x45, 0x16, 0xBE, 0xD0, 0xCA, 0xCD, 0x45, 0x8F,
|
||||
0x05, 0xFB, 0x03, 0x92, 0xFA, 0x8B, 0xFE, 0x63, 0x29, 0x35, 0x1F, 0x8C, 0x23, 0xDC, 0xB4, 0x2C, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8, 0xEC, 0x5F, 0x1B, 0x7C, 0x9D, 0x7E, 0xFF, 0xEC,
|
||||
0x1F, 0x52, 0xF3, 0x4D, 0x9C, 0x5E, 0x99, 0x38, 0x1D, 0x5D, 0xF0, 0xFE, 0xEC, 0x0B, 0x04, 0xCC, 0xF3, 0xFE, 0x1B, 0x3E, 0x5C, 0x3C, 0x4E, 0x20, 0x3E, 0xCD, 0x74, 0xB1, 0x8C, 0xF5, 0x94, 0x50,
|
||||
0x09, 0x33, 0x07, 0xE1, 0xC6, 0x64, 0x37, 0xF1, 0x5C, 0xBA, 0x8E, 0x00, 0x8E, 0x03, 0xD9, 0x70, 0x29, 0xC9, 0x3E, 0x74, 0x18, 0x80, 0x78, 0xD6, 0x5C, 0x9D, 0x75, 0x13, 0xD9, 0x0F, 0x3C, 0x0F,
|
||||
0xD4, 0x0B, 0x46, 0xA7, 0x56, 0x6D, 0x6E, 0xA3, 0x78, 0xC7, 0xE9, 0x83, 0xB0, 0x70, 0xF7, 0xFA, 0x5C, 0xBA, 0x8E, 0x00, 0x8E, 0x03, 0xD9, 0x70, 0x29, 0xC9, 0x3E, 0x74, 0x18, 0x80, 0x78, 0xD6,
|
||||
0xB2, 0xEB, 0xEC, 0xC4, 0x33, 0x86, 0x8E, 0x5E, 0x13, 0x98, 0xC8, 0xD6, 0xFF, 0x98, 0xD3, 0x74, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB8, 0xAB, 0x20, 0xEC, 0xE2, 0xAE, 0xAC, 0xF8,
|
||||
0x4A, 0xB5, 0x00, 0xA5, 0xA7, 0x98, 0x5B, 0xB7, 0xC4, 0xDF, 0xD5, 0x09, 0xFB, 0x1A, 0xCE, 0xB0, 0xB3, 0x3B, 0x70, 0x57, 0x6F, 0xED, 0xC4, 0xCF, 0xF6, 0xA7, 0x90, 0x48, 0x61, 0x9F, 0xD8, 0x91,
|
||||
0xBB, 0x75, 0x39, 0x69, 0xFF, 0xD9, 0x05, 0xA2, 0x9A, 0x49, 0x74, 0xAC, 0xF9, 0xF6, 0x1A, 0xDB, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFB, 0x85, 0x34, 0x42, 0x99, 0x1C, 0xB4, 0xB5, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x56, 0xCA, 0xDE, 0xB9, 0xBA, 0x84, 0x87, 0x1B, 0x38, 0x99, 0x53, 0x71, 0xD7, 0x81, 0x14, 0xC2,
|
||||
0x37, 0x37, 0x5F, 0x88, 0xD1, 0x87, 0xD7, 0xAD, 0x2E, 0x3C, 0x12, 0x33, 0xF8, 0x56, 0x81, 0x2F, 0x36, 0x78, 0xE5, 0x04, 0x19, 0x53, 0x02, 0x09, 0xB1, 0xFE, 0x53, 0x6E, 0x60, 0x7D, 0xA8, 0xCC,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x6E, 0x8D, 0x1E, 0xEA, 0xF2, 0x93, 0x70, 0xAD, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xAF, 0x27, 0x59, 0x79, 0xD8, 0x8D, 0x2D, 0x6C, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0x0A, 0x94, 0xAD, 0x1D, 0x0F, 0x4D, 0x0B, 0x0C,
|
||||
0x9B, 0x03, 0x0D, 0xA3, 0xF4, 0xA2, 0xF2, 0xDB, 0xC2, 0x74, 0x19, 0xB2, 0x2B, 0x46, 0x2A, 0x67, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0x43, 0xE1, 0x9C, 0x47, 0xA9, 0x24, 0xAA, 0x0D, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xED, 0xA8, 0xA8, 0x3B, 0xD8, 0x95, 0x3E, 0x9B, 0xC2, 0x09, 0x73, 0xE5, 0xEA, 0xB1, 0xFF, 0xE2,
|
||||
0x2E, 0x50, 0x7C, 0x0C, 0x27, 0x58, 0x98, 0x57, 0x83, 0x0F, 0x65, 0xF5, 0x9C, 0x29, 0x95, 0x51, 0xE7, 0x6E, 0x3B, 0xA8, 0x6F, 0xCD, 0x7A, 0x26, 0x9D, 0x54, 0x00, 0xFE, 0x08, 0xB6, 0x1D, 0xAA,
|
||||
0xF7, 0xBF, 0x41, 0x22, 0x71, 0x27, 0x1D, 0x57, 0xBE, 0x1C, 0x9B, 0x1E, 0x11, 0x3E, 0x1B, 0xC4, 0x05, 0x5F, 0x51, 0x56, 0x29, 0x1E, 0x4B, 0x8E, 0xBE, 0x1C, 0x9B, 0x1E, 0x11, 0x3E, 0x1B, 0xC4,
|
||||
0xF0, 0x7E, 0x18, 0xA8, 0x25, 0x02, 0x07, 0xC1, 0xA3, 0x6E, 0xAE, 0x75, 0x4F, 0x51, 0xC9, 0x30, 0xF0, 0x55, 0x95, 0x72, 0x06, 0x8A, 0x0D, 0xBB, 0x73, 0x89, 0x9F, 0x03, 0xEB, 0xE7, 0x89, 0x90,
|
||||
0x73, 0x3D, 0x92, 0xD7, 0xE0, 0x96, 0xCC, 0xFE, 0x76, 0x7E, 0x46, 0x91, 0x21, 0xA9, 0x76, 0x7F, 0xD2, 0x35, 0xA8, 0x2C, 0x62, 0x5E, 0xB7, 0x89, 0xDD, 0xCC, 0xD4, 0xF2, 0xA0, 0xAC, 0x79, 0x6F,
|
||||
0xB9, 0xD3, 0x54, 0x9F, 0x04, 0xA5, 0x52, 0xA1, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0xA4, 0x14, 0x0A, 0xE9, 0x1E, 0x2F, 0xC5, 0x22, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F,
|
||||
0x59, 0x9C, 0x33, 0x0B, 0x1F, 0x4F, 0x97, 0x03, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0x14, 0x6F, 0x25, 0x68, 0xCC, 0x7E, 0x08, 0x06, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F,
|
||||
0x8B, 0x59, 0x9B, 0x06, 0x3C, 0xD1, 0xDB, 0x27, 0xF8, 0xEB, 0x4C, 0x73, 0x15, 0x96, 0x9C, 0xE5, 0xDA, 0x3A, 0x81, 0x7F, 0x41, 0xFB, 0x9B, 0xB3, 0x2D, 0x1D, 0x76, 0xF4, 0xAC, 0x77, 0x0B, 0xE1,
|
||||
0xCB, 0xE4, 0x26, 0x24, 0xF8, 0x70, 0x94, 0xA9, 0x45, 0xA6, 0x85, 0x5D, 0x29, 0xCA, 0x0F, 0xF5, 0xFE, 0x46, 0x01, 0x10, 0x99, 0xF9, 0x0C, 0x42, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
|
||||
0xD0, 0x66, 0x50, 0x87, 0xB9, 0x54, 0x0B, 0x98, 0x10, 0x3E, 0x3A, 0x4C, 0xC9, 0xAD, 0x8F, 0x4C, 0xEA, 0xD0, 0x97, 0x3B, 0x76, 0x14, 0x8D, 0x96, 0x5C, 0xC6, 0x6D, 0x5B, 0x12, 0xFB, 0xCF, 0x61,
|
||||
0xA0, 0x68, 0x21, 0xF9, 0xE2, 0x06, 0x23, 0x04, 0x2A, 0x13, 0x7F, 0x72, 0x46, 0xC3, 0x03, 0x80, 0x18, 0xEF, 0x9F, 0x0F, 0x32, 0x5B, 0x2A, 0x8C, 0xD7, 0x7F, 0xB3, 0x00, 0x37, 0x4C, 0x1B, 0x60,
|
||||
0xE4, 0xF8, 0x2C, 0x93, 0xB4, 0x6E, 0x65, 0x18, 0x77, 0x58, 0xB6, 0xF6, 0xE7, 0x7B, 0xAE, 0x03, 0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0x03, 0xE7, 0xB9, 0xEF, 0xFD, 0x5C, 0xFB, 0x72,
|
||||
0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0xB4, 0x76, 0xAF, 0x43, 0x02, 0x0B, 0x97, 0x88, 0x66, 0x45, 0x37, 0xCE, 0x07, 0xA8, 0xE6, 0x9A, 0xAC, 0x7B, 0x61, 0xC4, 0xBC, 0xBE, 0x69, 0x99,
|
||||
0x9F, 0xB9, 0x3B, 0x00, 0xB1, 0x75, 0x32, 0xF4, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B, 0x3E, 0x1B, 0x46, 0xB0, 0xE3, 0x97, 0x77, 0xEC, 0xED, 0x89, 0xBC, 0xCF, 0x9B, 0xFA, 0xD8, 0x7B,
|
||||
0xE7, 0x2F, 0x99, 0x81, 0x37, 0x6C, 0xD7, 0xD0, 0x5F, 0xB6, 0x10, 0x44, 0xA4, 0xA5, 0xEC, 0xA3, 0xCF, 0x89, 0x03, 0xBB, 0xC8, 0x65, 0xBD, 0xC9, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31,
|
||||
0xC2, 0xA6, 0x4F, 0xE1, 0x53, 0xB4, 0xBE, 0x89, 0x70, 0x85, 0xFE, 0xA6, 0xCD, 0x41, 0x8E, 0x4F, 0xA2, 0x02, 0x03, 0xF4, 0x6F, 0x47, 0xAB, 0xA9, 0x27, 0x8F, 0xBF, 0xF3, 0x69, 0xE9, 0xAC, 0x1D,
|
||||
0x68, 0x6F, 0xCF, 0x5B, 0x3A, 0x7D, 0x75, 0xE0, 0x4D, 0x48, 0x4E, 0x5A, 0x85, 0x3C, 0xDA, 0x54, 0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0xF7, 0x32, 0x3D, 0x2D, 0x41, 0xD7, 0xC9, 0x76,
|
||||
0x7F, 0xFF, 0x64, 0x23, 0xC8, 0x74, 0xB9, 0x83, 0x39, 0x70, 0x85, 0xB7, 0x81, 0x64, 0xE4, 0x84, 0x96, 0x6F, 0xA4, 0x1D, 0xFF, 0xE1, 0x53, 0x1A, 0x5F, 0xB6, 0x10, 0x44, 0xA4, 0xA5, 0xEC, 0xA3,
|
||||
0xD4, 0x0B, 0x46, 0xA7, 0x56, 0x6D, 0x6E, 0xA3, 0xDB, 0x49, 0xD2, 0x70, 0xBF, 0xE5, 0xA5, 0x35, 0xB3, 0x9D, 0x35, 0x9A, 0xCA, 0xFA, 0x24, 0x13, 0x81, 0x66, 0x9F, 0x0C, 0xDF, 0xBD, 0xEF, 0x6F,
|
||||
0x48, 0x61, 0x28, 0xE4, 0x5C, 0xD3, 0xBE, 0x27, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x0F, 0x87, 0x56, 0xE3, 0x92, 0xE2, 0xBB, 0xB9, 0x2E, 0x55, 0xD7, 0x4F, 0xD6, 0x38, 0x64, 0x39,
|
||||
0x76, 0xB4, 0x00, 0x69, 0x99, 0xEF, 0x2C, 0x56, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x58, 0xCE, 0x07, 0xF6, 0x3C, 0x78, 0x53, 0x4A, 0xEF, 0x33, 0xF5, 0x36, 0x9A, 0x38, 0xFA, 0xC6,
|
||||
0xF5, 0xED, 0x67, 0xAF, 0xAE, 0xAB, 0x7C, 0x95, 0xE8, 0x39, 0x08, 0x8F, 0x66, 0x86, 0xF5, 0xEC, 0x10, 0x90, 0x40, 0x19, 0x82, 0x77, 0xC8, 0x03, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
|
||||
0x74, 0x2C, 0xE1, 0x99, 0x9E, 0xE4, 0xA2, 0x06, 0x96, 0x88, 0x5E, 0xFB, 0xAE, 0x3D, 0x16, 0x1F, 0x43, 0xA1, 0xA7, 0x05, 0x4A, 0x25, 0x8C, 0xF1, 0x4B, 0x5C, 0xB8, 0xC2, 0xA0, 0x8A, 0xE8, 0x8E,
|
||||
0x95, 0x3B, 0x8A, 0xDC, 0x38, 0x29, 0x26, 0x57, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3, 0x1D, 0x20, 0xF2, 0xFC, 0x27, 0x46, 0x71, 0x1A, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3,
|
||||
0x81, 0x99, 0x01, 0xE2, 0x93, 0x96, 0x7E, 0x5D, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4, 0x4D, 0xD1, 0xF4, 0xC5, 0xA4, 0x7B, 0x3B, 0xB2, 0xDB, 0xCA, 0x36, 0xB1, 0x0C, 0xDF, 0x21, 0xF4,
|
||||
0x18, 0x43, 0x3F, 0x11, 0x08, 0x69, 0x4E, 0x48, 0x58, 0x56, 0x55, 0x85, 0x3F, 0x6C, 0x3B, 0xF3, 0x1E, 0xD5, 0x63, 0x6B, 0x18, 0x36, 0xA1, 0xEE, 0x59, 0xCC, 0x0D, 0x3B, 0xB5, 0xBA, 0x5E, 0x54,
|
||||
0x54, 0xAA, 0xBB, 0x23, 0xE0, 0x03, 0x15, 0xD3, 0x57, 0xEC, 0x92, 0x60, 0x3D, 0xC0, 0x8B, 0xFC, 0x4D, 0xD0, 0x8E, 0x7D, 0x11, 0xCC, 0xCA, 0xDE, 0x45, 0xA6, 0x85, 0x5D, 0x29, 0xCA, 0x0F, 0xF5,
|
||||
0x33, 0xEC, 0x22, 0x51, 0x67, 0x72, 0x0C, 0x08, 0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0xA1, 0x1E, 0xB8, 0xA0, 0x79, 0x1B, 0x96, 0x5D, 0x8A, 0xE1, 0xA1, 0x04, 0x9B, 0xD1, 0x07, 0x94,
|
||||
0x94, 0x4D, 0x57, 0x90, 0x9C, 0xBA, 0x50, 0x24, 0x68, 0x72, 0x01, 0x1C, 0xAE, 0x6A, 0x22, 0x60, 0x90, 0xCE, 0x34, 0x94, 0xE0, 0x42, 0x13, 0x00, 0x3A, 0x81, 0x26, 0x21, 0x9C, 0x3B, 0x6C, 0x31,
|
||||
0xB1, 0xFD, 0xED, 0x44, 0x4B, 0xB7, 0x17, 0xB6, 0xE7, 0xE4, 0x89, 0x39, 0x42, 0xEA, 0xF5, 0x52, 0x1D, 0x2D, 0x0C, 0xE4, 0xCA, 0x08, 0xBB, 0x4B, 0x78, 0x5F, 0x7A, 0x4C, 0xD5, 0xB3, 0x18, 0x22,
|
||||
0x0C, 0xBA, 0x0E, 0xA4, 0x7A, 0x04, 0xF4, 0xAC, 0x1B, 0x62, 0xF0, 0x19, 0x2F, 0x43, 0x99, 0xF2, 0xFB, 0x9A, 0x44, 0xAE, 0xB3, 0x7E, 0x0C, 0xD4, 0x8E, 0x47, 0x27, 0x3F, 0xF7, 0xCB, 0xF1, 0xBF,
|
||||
0xB0, 0x54, 0x6F, 0x6B, 0x9A, 0xC8, 0x19, 0xB6, 0xA3, 0x51, 0x69, 0x64, 0x99, 0xC2, 0x38, 0xD1, 0xC8, 0x59, 0xCF, 0xF2, 0xA5, 0xA1, 0x4F, 0x02, 0xA8, 0xE9, 0x94, 0xB6, 0x5F, 0x78, 0xF5, 0x91,
|
||||
0x82, 0x3B, 0x8F, 0x56, 0x7B, 0x46, 0xCD, 0x40, 0x3B, 0x78, 0x64, 0xFE, 0xF5, 0xF1, 0x3B, 0x27, 0xC7, 0xCF, 0x43, 0x90, 0xD1, 0x8F, 0x31, 0x44, 0x3E, 0x1A, 0xA0, 0xEF, 0x39, 0x01, 0x2D, 0x73,
|
||||
0x3B, 0x78, 0x64, 0xFE, 0xF5, 0xF1, 0x3B, 0x27, 0x08, 0xE1, 0xF1, 0x26, 0x67, 0x48, 0xD1, 0xEC, 0x05, 0x74, 0x4D, 0x20, 0x8D, 0xC0, 0xFE, 0x8B, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51,
|
||||
0xB0, 0x4B, 0x01, 0x03, 0x41, 0xF8, 0xDF, 0x7C, 0x4E, 0xD2, 0x57, 0x1C, 0xA7, 0x35, 0xF8, 0x6D, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x35, 0x3A, 0xFD, 0xD3, 0x05, 0x49, 0xDE, 0xD7,
|
||||
0x5B, 0x77, 0xBF, 0xFA, 0x0F, 0xB1, 0xAB, 0xA7, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x96, 0x82, 0xB9, 0xE8, 0x38, 0xE1, 0xE7, 0x64, 0x06, 0xA1, 0x1F, 0xB4, 0x64, 0xEB, 0xAF, 0xB5,
|
||||
0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x13, 0x39, 0xEF, 0x6A, 0x2C, 0x1F, 0xE4, 0x53, 0x5C, 0x7B, 0xBD, 0x0E, 0x0B, 0xCC, 0x64, 0x89, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51,
|
||||
0x0E, 0x83, 0x91, 0x52, 0x17, 0x1D, 0x65, 0x23, 0x2B, 0x94, 0x7E, 0x22, 0xFD, 0x68, 0xA3, 0x18, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0x4F, 0x1E, 0x43, 0x4D, 0x86, 0xE4, 0x09, 0xF0,
|
||||
0x32, 0x1D, 0x90, 0x40, 0xA7, 0x85, 0x46, 0x04, 0x7C, 0x4D, 0x37, 0x42, 0x4D, 0x3E, 0xD2, 0x51, 0xA5, 0x79, 0x96, 0x7E, 0x24, 0x1D, 0x9C, 0x67, 0xA4, 0x59, 0x3A, 0x2C, 0x26, 0xB5, 0x56, 0xF5,
|
||||
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xB1, 0x76, 0x76, 0xB1, 0x23, 0x25, 0x0C, 0xC0, 0x24, 0xA8, 0x16, 0x27, 0xE7, 0x25, 0x5D, 0x67, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28,
|
||||
0x91, 0x2E, 0xA8, 0x43, 0xD0, 0xD8, 0x1A, 0xAC, 0x48, 0x1E, 0x29, 0xAA, 0x2D, 0x76, 0xEC, 0x00, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x15, 0x71, 0xB1, 0xAE, 0x12, 0x42, 0x2B, 0x22,
|
||||
0x52, 0x64, 0x43, 0xFC, 0xE3, 0x49, 0xD8, 0x17, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xAA, 0x65, 0x3E, 0x76, 0xD2, 0x22, 0x45, 0xD4, 0x01, 0x46, 0xC1, 0xC4, 0xD5, 0x61, 0xB6, 0x06,
|
||||
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x2D, 0xA9, 0x20, 0x42, 0x64, 0x58, 0xEC, 0x45, 0x89, 0x37, 0x39, 0xF6, 0x0B, 0xA6, 0x5B, 0xF3, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28,
|
||||
0x89, 0x1A, 0xC9, 0x4E, 0x9F, 0x64, 0x75, 0x74, 0xAC, 0x2C, 0x10, 0xAC, 0x10, 0x23, 0x2B, 0x61, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x42, 0x5A, 0x40, 0x04, 0x48, 0xD7, 0x24, 0xCD,
|
||||
0xEE, 0x3D, 0xB1, 0xC6, 0xCC, 0x3A, 0x8E, 0x97, 0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0x21, 0x47, 0x58, 0xF1, 0xF9, 0xD8, 0x1B, 0x84, 0x6A, 0x6D, 0x6B, 0xB7, 0x0A, 0x2C, 0x5F, 0x9C,
|
||||
0xDF, 0x63, 0xB4, 0xA1, 0xF2, 0x54, 0x28, 0x28, 0xB1, 0xCC, 0x3E, 0x6B, 0x17, 0x86, 0xE6, 0x9C, 0x8C, 0x42, 0x00, 0xB2, 0x04, 0x81, 0x66, 0xA7, 0x26, 0x4A, 0xEB, 0x82, 0xB6, 0xAD, 0xD5, 0xA1,
|
||||
0x7C, 0xE0, 0xCF, 0xAB, 0xD9, 0xD1, 0x9F, 0x3D, 0x29, 0x8F, 0xA1, 0x5A, 0xAD, 0xA3, 0x76, 0xD3, 0x65, 0x13, 0xA1, 0x44, 0x00, 0x8F, 0xFE, 0x05, 0x7C, 0x5B, 0xB9, 0x33, 0x16, 0xBF, 0xF9, 0x01,
|
||||
0x14, 0xE9, 0xA3, 0xE9, 0x80, 0xB4, 0xAC, 0xFC, 0x40, 0x2C, 0x5A, 0x58, 0x08, 0x17, 0x79, 0x7C, 0x43, 0xEE, 0x2F, 0x7F, 0x5C, 0x1A, 0xB1, 0x0E, 0xFD, 0x00, 0x52, 0x67, 0x09, 0x59, 0x40, 0x22,
|
||||
0xBF, 0x86, 0x3E, 0xC9, 0xEB, 0xC1, 0xDF, 0x63, 0x82, 0x10, 0x30, 0x8A, 0x51, 0xEF, 0x44, 0xDF, 0x06, 0x91, 0x98, 0x95, 0x60, 0x1E, 0xFD, 0x1C, 0x54, 0x16, 0x53, 0x83, 0xA5, 0xF6, 0xA0, 0x87,
|
||||
0x7E, 0x80, 0x1D, 0xBB, 0xF2, 0xFB, 0x17, 0x2F, 0x72, 0x0F, 0xCD, 0x8C, 0x37, 0xBA, 0x38, 0xFD, 0x05, 0xFE, 0x52, 0x48, 0x0B, 0xC4, 0x68, 0xE2, 0x59, 0x89, 0x8B, 0x1C, 0xC9, 0x31, 0xF7, 0xC7,
|
||||
0x71, 0x93, 0xCF, 0x50, 0x84, 0x4E, 0xC1, 0x53, 0x08, 0x2F, 0xCC, 0xF8, 0x59, 0x97, 0xB1, 0x19, 0x83, 0x35, 0x17, 0xD2, 0xE1, 0xE5, 0xCF, 0x15, 0x9E, 0x90, 0x21, 0x13, 0xEA, 0xEE, 0x87, 0xF0,
|
||||
0xFF, 0x16, 0x4A, 0xA1, 0x1D, 0x3E, 0x11, 0x7F, 0xAD, 0x0F, 0x1F, 0x84, 0x27, 0x30, 0x7E, 0x43, 0x53, 0xFE, 0xBA, 0xB3, 0x02, 0x26, 0x63, 0x91, 0xBD, 0xD5, 0x55, 0x3C, 0x03, 0xBE, 0x89, 0x50,
|
||||
0xCC, 0xCD, 0x77, 0x9E, 0xB6, 0x0A, 0x37, 0xC2, 0xFA, 0x9C, 0x71, 0x6A, 0xBB, 0x57, 0xAE, 0xB0, 0x75, 0xF2, 0xF7, 0xC5, 0x6A, 0x82, 0xD5, 0xB6, 0xAC, 0x42, 0x6B, 0x9D, 0x7A, 0x48, 0x92, 0x7B,
|
||||
0xF4, 0x0A, 0xFA, 0x63, 0x3D, 0x19, 0xCD, 0x48, 0x30, 0x44, 0x92, 0x62, 0xA4, 0x7D, 0x4E, 0xF7, 0xD9, 0xAF, 0x39, 0x14, 0xEF, 0xCD, 0xD8, 0xD6, 0x99, 0x58, 0x8C, 0x79, 0x8A, 0xE5, 0xC2, 0x68,
|
||||
0x87, 0x11, 0xA8, 0xC5, 0x94, 0x92, 0x8E, 0x43, 0xA9, 0x24, 0xE3, 0xD1, 0x0F, 0x17, 0xEE, 0x38, 0xF7, 0x74, 0x99, 0x03, 0xB5, 0x6C, 0xE2, 0x70, 0x64, 0x16, 0x0F, 0x53, 0xDF, 0x8D, 0x58, 0xED,
|
||||
0xAB, 0x6D, 0x0F, 0xC0, 0x37, 0xAD, 0x24, 0x01, 0x95, 0x2A, 0x89, 0xFE, 0x18, 0x10, 0x67, 0x17, 0xFC, 0xCA, 0x50, 0x3D, 0x8B, 0x7E, 0xBD, 0x90, 0xCF, 0xB4, 0x4E, 0x82, 0x4B, 0x9D, 0x72, 0x55,
|
||||
0xA9, 0xA1, 0x58, 0x79, 0xBF, 0xC0, 0x52, 0xE0, 0x4F, 0xE3, 0x5E, 0xAF, 0xD3, 0x56, 0xE5, 0x27, 0x56, 0xFF, 0xC9, 0x43, 0x9E, 0x64, 0x8C, 0x93, 0x23, 0x68, 0x68, 0x7A, 0xB9, 0x1B, 0x09, 0x2B,
|
||||
0x33, 0x37, 0xC0, 0x24, 0x01, 0x6F, 0x48, 0xF5, 0x25, 0xE7, 0xAC, 0xA5, 0xE4, 0x91, 0xF3, 0x9F, 0xBB, 0x8E, 0x31, 0x37, 0xB8, 0xAC, 0x43, 0x69, 0x58, 0xA4, 0xD3, 0xAA, 0xBE, 0xBF, 0x61, 0x4E,
|
||||
0x24, 0xDD, 0xB1, 0x2A, 0xCD, 0xFC, 0x8A, 0x70, 0x56, 0x84, 0xA0, 0x7D, 0xAF, 0xCA, 0xA0, 0xFD, 0x51, 0x82, 0xE0, 0xC9, 0x4E, 0x26, 0x38, 0x1E, 0x4D, 0x18, 0x67, 0x0F, 0x57, 0x68, 0x46, 0xEF,
|
||||
0x3F, 0x82, 0xE7, 0xD4, 0x79, 0x70, 0x39, 0xCF, 0xEB, 0x3F, 0xAE, 0xED, 0x42, 0x7A, 0x27, 0xB0, 0x6F, 0xE8, 0x18, 0x21, 0xD0, 0x84, 0x9F, 0x66, 0x1F, 0xF8, 0x65, 0x43, 0x54, 0xD3, 0x90, 0x01,
|
||||
0x92, 0x8F, 0xB6, 0x50, 0x78, 0xC9, 0x3F, 0x19, 0x20, 0x1E, 0xF9, 0x42, 0x7F, 0xC1, 0x87, 0x0B, 0xF6, 0x7D, 0xE0, 0x8B, 0xE1, 0x17, 0x3A, 0xAE, 0x38, 0xE9, 0x08, 0x64, 0x20, 0xBD, 0x63, 0x2F,
|
||||
0x85, 0xBE, 0x97, 0x75, 0x1E, 0xDD, 0x47, 0x0B, 0x61, 0xF7, 0x01, 0xF8, 0xEB, 0x0C, 0x10, 0x51, 0xCE, 0xAC, 0x68, 0x59, 0x42, 0xBF, 0xB0, 0xBA, 0x94, 0x9C, 0xE2, 0xC1, 0xDF, 0x2A, 0x49, 0x0B,
|
||||
0x5A, 0x6B, 0x31, 0xDC, 0x11, 0xE5, 0xBD, 0x6A, 0xDB, 0xF9, 0x8B, 0x60, 0xAB, 0x06, 0xBA, 0x54, 0xC6, 0xCF, 0x7E, 0xEB, 0x51, 0xB4, 0x09, 0xC8, 0x9F, 0x28, 0x5B, 0xCE, 0xB8, 0x4F, 0x18, 0x36,
|
||||
0xD5, 0x25, 0x03, 0x80, 0x1A, 0xC1, 0xD5, 0xD9, 0x84, 0x48, 0xA5, 0x40, 0xFF, 0xE9, 0x86, 0xC4, 0x56, 0xE0, 0xFC, 0x8E, 0x18, 0xB8, 0x76, 0xA2, 0x60, 0x7B, 0x9D, 0x8E, 0xB6, 0x93, 0x4D, 0x59,
|
||||
0x89, 0x8C, 0x80, 0x95, 0xE0, 0x26, 0x98, 0xA9, 0x1A, 0xE0, 0x9F, 0xEE, 0x1F, 0x0F, 0xAE, 0xAF, 0x0A, 0xA7, 0x98, 0x35, 0x89, 0x56, 0x71, 0x92, 0x10, 0x25, 0x1F, 0x64, 0x4B, 0x69, 0x46, 0xDD,
|
||||
0xA6, 0x2E, 0xE2, 0x98, 0x01, 0x01, 0x9F, 0x8C, 0x99, 0x4D, 0x57, 0xCD, 0x5D, 0xFF, 0x4D, 0x53, 0x91, 0xDD, 0x10, 0x3C, 0xFF, 0xD2, 0xAA, 0x4E, 0x5D, 0x09, 0xF7, 0x38, 0x04, 0xF5, 0x57, 0x5E,
|
||||
0x46, 0x48, 0xAE, 0x98, 0x8C, 0xFC, 0x3A, 0x3C, 0x5A, 0x60, 0x98, 0x96, 0xCF, 0x16, 0xA4, 0xF3, 0xAC, 0xAE, 0x83, 0x87, 0x2F, 0x46, 0x07, 0xC4, 0x33, 0x7A, 0x45, 0xBB, 0x72, 0x21, 0x50, 0xE2,
|
||||
0xCC, 0xA6, 0xA2, 0x94, 0x5D, 0x88, 0x77, 0x37, 0x6B, 0xCF, 0x3C, 0x51, 0x83, 0xBC, 0x94, 0x89, 0xD0, 0xE2, 0xF6, 0xF3, 0xF8, 0xCE, 0x68, 0x1E, 0xAC, 0x4C, 0x2E, 0xD9, 0x11, 0xEB, 0x3B, 0xD1,
|
||||
0x6C, 0xA1, 0x73, 0x6F, 0xCC, 0x99, 0x10, 0x68, 0xCF, 0xBA, 0xC1, 0x04, 0x63, 0x47, 0xC9, 0x62, 0xC1, 0xD9, 0x8F, 0xC2, 0xF3, 0xED, 0x00, 0xD3, 0x3F, 0x7F, 0xAC, 0x5D, 0x10, 0x2A, 0xBC, 0x5D,
|
||||
0x8C, 0xBE, 0x65, 0x5A, 0xE0, 0x7D, 0xAC, 0x08, 0x3E, 0x30, 0x61, 0x5A, 0xEA, 0x09, 0x74, 0x52, 0xDA, 0xAC, 0x40, 0xDC, 0x0A, 0x31, 0x42, 0x46, 0x89, 0x89, 0xFC, 0xA7, 0x32, 0xCB, 0xDB, 0xDE,
|
||||
0x39, 0x63, 0xFB, 0x82, 0x27, 0x8D, 0x11, 0x12, 0x70, 0xC8, 0x4E, 0x3E, 0x21, 0xB8, 0x07, 0x1A, 0x2F, 0xCF, 0xB6, 0x52, 0x30, 0xA1, 0x05, 0x40, 0xEB, 0x49, 0xB4, 0xF5, 0x59, 0xB3, 0x21, 0x15,
|
||||
0xCE, 0x81, 0xD9, 0xE1, 0xCC, 0x21, 0x16, 0xAB, 0x43, 0x51, 0xF1, 0x68, 0x27, 0x52, 0xD1, 0xAF, 0x8A, 0x53, 0x51, 0x0E, 0x84, 0xAB, 0x10, 0xEF, 0x02, 0x4A, 0x7E, 0xEB, 0x2C, 0xC3, 0x6A, 0x24,
|
||||
0xE0, 0x5F, 0xE0, 0x09, 0x5A, 0x37, 0xD6, 0xE1, 0x39, 0xCE, 0x5F, 0xDB, 0x0D, 0xC6, 0x0E, 0xA5, 0x29, 0xC4, 0xA4, 0xC1, 0x11, 0x0E, 0x50, 0x53, 0xDC, 0x26, 0x12, 0xF1, 0xC0, 0x72, 0x0C, 0x63,
|
||||
0x4D, 0x71, 0x94, 0x5F, 0xE4, 0xB9, 0x50, 0xEA, 0xD0, 0xCB, 0x51, 0xCA, 0x73, 0x6B, 0xD6, 0x03, 0x3C, 0x7D, 0x44, 0x26, 0x1F, 0x4D, 0x75, 0xCB, 0x7C, 0x52, 0x97, 0xDF, 0xC9, 0xBB, 0x78, 0x2B,
|
||||
0x77, 0xB1, 0x81, 0x49, 0xC8, 0x2B, 0x35, 0x03, 0x0C, 0xA5, 0x6D, 0x30, 0x6A, 0xEB, 0x51, 0x07, 0xC9, 0xC8, 0x9B, 0xDC, 0xE2, 0x1B, 0x8D, 0x27, 0x4E, 0xF2, 0x0F, 0x9D, 0x4D, 0xE2, 0x13, 0x53,
|
||||
0x21, 0xC7, 0xFF, 0x1D, 0x75, 0x01, 0xEB, 0xFA, 0x83, 0x66, 0xA0, 0xC0, 0xDE, 0xE5, 0xD6, 0xD4, 0x6A, 0xA1, 0xD2, 0x1D, 0xB5, 0xB0, 0xBE, 0x9F, 0x2F, 0x92, 0x5B, 0xEF, 0xA0, 0x48, 0xDE, 0x99,
|
||||
0x69, 0x72, 0xC8, 0x8A, 0x20, 0x82, 0xF5, 0xB1, 0xE6, 0xAA, 0xD6, 0x03, 0x98, 0xD9, 0x75, 0xEB, 0x21, 0x45, 0xEB, 0xE9, 0xDF, 0xE5, 0xD5, 0x96, 0xB5, 0x2C, 0x40, 0x14, 0xE4, 0x89, 0x9F, 0x1F,
|
||||
0x74, 0x6A, 0x9C, 0x63, 0x9A, 0x6D, 0x17, 0x59, 0xF9, 0x29, 0x73, 0x62, 0xBA, 0x3B, 0x7F, 0x4C, 0xC9, 0x2C, 0xD2, 0xEA, 0xA7, 0x1D, 0xCC, 0xD4, 0x05, 0x33, 0xF8, 0x6C, 0xCA, 0xC8, 0x99, 0xD0,
|
||||
0xF1, 0x49, 0x82, 0xD4, 0xE2, 0xD1, 0xF6, 0xB1, 0x0E, 0x79, 0xFA, 0x43, 0xAE, 0x66, 0xE1, 0x3A, 0x86, 0xA2, 0x61, 0xE8, 0x1E, 0x4B, 0x22, 0x74, 0xEF, 0xDA, 0x9E, 0x10, 0x67, 0x44, 0x8C, 0x32,
|
||||
0xCA, 0x02, 0xB4, 0xE3, 0xB0, 0x91, 0x07, 0x74, 0xC3, 0x5F, 0x3E, 0x8D, 0x52, 0x2D, 0xE9, 0x9E, 0x9C, 0x75, 0x4E, 0x0A, 0xA7, 0xBE, 0x2C, 0xDB, 0x4A, 0xB7, 0x79, 0x2E, 0x7D, 0x30, 0xC3, 0x3F,
|
||||
0x3B, 0x85, 0xB2, 0x65, 0xC6, 0x26, 0xBC, 0x02, 0x26, 0xCF, 0x75, 0x4A, 0x1F, 0xDF, 0xBB, 0x83, 0x56, 0x82, 0xA7, 0x1E, 0x64, 0xAC, 0xC7, 0x84, 0x52, 0x8C, 0x80, 0x15, 0xA3, 0x08, 0x36, 0x66,
|
||||
0xD5, 0x66, 0x41, 0x5E, 0x13, 0x8B, 0xCF, 0xA3, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23, 0xFE, 0x5B, 0xCD, 0x94, 0xCD, 0x00, 0x12, 0x23,
|
||||
}
|
89
encryption/bruteforce.go
Normal file
89
encryption/bruteforce.go
Normal file
|
@ -0,0 +1,89 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"math"
|
||||
"runtime"
|
||||
"slices"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func BruteforceBorlandSeed(b EncryptedBlock, material KeyMaterial) ([]uint32, error) {
|
||||
data := slices.Clone(b)
|
||||
err := data.Decrypt(material, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
numCpu := runtime.NumCPU()
|
||||
|
||||
perCpu := math.MaxUint32 / numCpu
|
||||
|
||||
firstValue := binary.LittleEndian.Uint16(data[2:])
|
||||
|
||||
secondValue := binary.LittleEndian.Uint16(data[4:])
|
||||
|
||||
var foundSeeds []uint32
|
||||
var foundSeedsLock sync.Mutex
|
||||
|
||||
var wg sync.WaitGroup
|
||||
for cpu := 0; cpu < numCpu; cpu++ {
|
||||
wg.Add(1)
|
||||
go func(cpu int) {
|
||||
defer wg.Done()
|
||||
seed := uint32(cpu * perCpu)
|
||||
endSeed := seed + uint32(perCpu)
|
||||
if cpu == (numCpu - 1) {
|
||||
endSeed = math.MaxUint32
|
||||
}
|
||||
|
||||
for {
|
||||
currentSeed := BorlandRand(seed)
|
||||
seedA := uint16((currentSeed << 1) >> 0x11)
|
||||
currentSeed = BorlandRand(currentSeed)
|
||||
seedB := uint16((currentSeed << 1) >> 0x11)
|
||||
|
||||
if seedA == firstValue && seedB == secondValue {
|
||||
if func() bool {
|
||||
for i := 4; i < 16; i += 2 {
|
||||
currentSeed = BorlandRand(currentSeed)
|
||||
if binary.LittleEndian.Uint16(data[2+i:]) != uint16((currentSeed<<1)>>0x11) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
for i := 0; i < 0xf3; i++ {
|
||||
currentSeed = BorlandRand(currentSeed)
|
||||
|
||||
if binary.LittleEndian.Uint16(data[0x1a+i*2:]) != uint16((currentSeed<<1)>>0x11) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}() {
|
||||
func() {
|
||||
foundSeedsLock.Lock()
|
||||
defer foundSeedsLock.Unlock()
|
||||
foundSeeds = append(foundSeeds, seed)
|
||||
}()
|
||||
}
|
||||
}
|
||||
|
||||
if seed == endSeed {
|
||||
break
|
||||
}
|
||||
seed++
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
}(cpu)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
|
||||
slices.Sort(foundSeeds)
|
||||
|
||||
return foundSeeds, nil
|
||||
}
|
12
encryption/firmware.go
Normal file
12
encryption/firmware.go
Normal file
|
@ -0,0 +1,12 @@
|
|||
package encryption
|
||||
|
||||
func DecryptFirmwareData(buf []byte, readAddressSize bool) {
|
||||
//TODO
|
||||
seed := uint32(0x2009)
|
||||
|
||||
var blockBuf [8]byte
|
||||
for i := 0; i < len(buf); i += 8 {
|
||||
copy(blockBuf[:], buf[i:])
|
||||
seed = BorlandRandXORInPlace(blockBuf[:], seed)
|
||||
}
|
||||
}
|
46
encryption/generator.go
Normal file
46
encryption/generator.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/binary"
|
||||
"io"
|
||||
)
|
||||
|
||||
type KeyGenerator interface {
|
||||
Fill(data []byte)
|
||||
MangleIndex() uint32
|
||||
}
|
||||
|
||||
// SecureRandomKeyGenerator Generates random numbers using the system secure random number generator
|
||||
type SecureRandomKeyGenerator struct{}
|
||||
|
||||
func (g *SecureRandomKeyGenerator) Fill(data []byte) {
|
||||
io.ReadFull(rand.Reader, data)
|
||||
}
|
||||
|
||||
func (g *SecureRandomKeyGenerator) MangleIndex() uint32 {
|
||||
var buf [1]byte
|
||||
io.ReadFull(rand.Reader, buf[:])
|
||||
return uint32(buf[0] & 0x7)
|
||||
}
|
||||
|
||||
// BorlandRandKeyGenerator Generates random numbers with its value as current seed
|
||||
type BorlandRandKeyGenerator uint32
|
||||
|
||||
func (g *BorlandRandKeyGenerator) Fill(data []byte) {
|
||||
seed := uint32(*g)
|
||||
for i := 0; i < len(data); i += 2 {
|
||||
seed = BorlandRand(seed)
|
||||
binary.LittleEndian.PutUint16(data[i:], uint16((seed<<1)>>0x11))
|
||||
}
|
||||
*g = BorlandRandKeyGenerator(seed)
|
||||
}
|
||||
|
||||
func (g *BorlandRandKeyGenerator) MangleIndex() uint32 {
|
||||
seed := uint32(*g)
|
||||
seed = BorlandRand(seed)
|
||||
mangleIndex := (seed >> 0x10) & 0x7
|
||||
*g = BorlandRandKeyGenerator(seed)
|
||||
|
||||
return mangleIndex
|
||||
}
|
45
encryption/keys.go
Normal file
45
encryption/keys.go
Normal file
|
@ -0,0 +1,45 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
const MangleKeyBlockSize = 8
|
||||
|
||||
const MangleKeyDataSize = 4 * 4
|
||||
|
||||
const MangleKeyRounds = 48
|
||||
|
||||
// MangleKeyData Key entries of 128-bit length
|
||||
type MangleKeyData [MangleKeyDataSize]byte
|
||||
|
||||
func (d MangleKeyData) RoundKey(round int32) uint32 {
|
||||
return binary.LittleEndian.Uint32(d[(round%4)*4:])
|
||||
}
|
||||
|
||||
type MangleKeyTable [8]MangleKeyData
|
||||
|
||||
var HardcodedMangleTable = MangleKeyTable{
|
||||
/* Slot 0 is used by OuterMangleKeyOffsetFirmware for outer key mangle */
|
||||
/*0x00*/ {0x6f, 0xc0, 0x39, 0x05, 0x01, 0x58, 0x23, 0x3a, 0x80, 0xda, 0xb4, 0x1b, 0x65, 0x6a, 0x91, 0x44},
|
||||
/* Slot 1 is used by OuterMangleKeyOffsetDeviceId for outer key mangle */
|
||||
/*0x01*/ {0x35, 0xcb, 0x01, 0x5b, 0xfb, 0xa4, 0x98, 0xb4, 0x82, 0x6d, 0x48, 0xe9, 0x10, 0x50, 0x94, 0xf4},
|
||||
/*0x02*/ {0xec, 0xbc, 0xba, 0xe8, 0xf8, 0x3d, 0xa7, 0x2a, 0x9c, 0xf7, 0xf9, 0x4c, 0xe7, 0x73, 0x6d, 0x88},
|
||||
/*0x03*/ {0x03, 0x35, 0x48, 0x25, 0xaf, 0xa8, 0xa0, 0xb1, 0xb2, 0x45, 0xa7, 0x24, 0x39, 0x13, 0xe2, 0xf5},
|
||||
/*0x04*/ {0x88, 0x90, 0xd8, 0x42, 0xaf, 0x79, 0xa3, 0x37, 0xe0, 0x89, 0x26, 0x42, 0xe9, 0x39, 0x62, 0x63},
|
||||
/*0x05*/ {0xf0, 0x61, 0xd0, 0xab, 0x79, 0x05, 0x71, 0x7f, 0x51, 0x6b, 0x62, 0xbd, 0x15, 0x2c, 0xf2, 0x2a},
|
||||
/* Slot 6 is used by OuterMangleKeyOffsetMemory for outer key mangle */
|
||||
/*0x06*/ {0x06, 0xbc, 0x41, 0xb3, 0x74, 0x46, 0x6e, 0x6e, 0x01, 0x7b, 0xeb, 0xb3, 0x32, 0x5b, 0x96, 0xf1},
|
||||
/*0x07*/ {0x6f, 0x3e, 0xf3, 0x52, 0xf9, 0xa2, 0x69, 0x4d, 0xc4, 0x77, 0xab, 0x77, 0x08, 0x45, 0x8f, 0x46},
|
||||
}
|
||||
|
||||
var AlternateMangleTable = MangleKeyTable{
|
||||
/*0x00*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x01*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x02*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x03*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x04*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x05*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x06*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
/*0x07*/ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
|
||||
}
|
50
encryption/material.go
Normal file
50
encryption/material.go
Normal file
|
@ -0,0 +1,50 @@
|
|||
package encryption
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
)
|
||||
|
||||
type KeyMaterial struct {
|
||||
// Generator Random source to generate the inline material
|
||||
Generator KeyGenerator
|
||||
OuterKeyOffset OuterMangleKeyOffset
|
||||
DeviceKey *MangleKeyData
|
||||
AlternateMangleKey *MangleKeyTable
|
||||
}
|
||||
|
||||
func NewFirmwareKeyMaterial(generator KeyGenerator) KeyMaterial {
|
||||
return KeyMaterial{
|
||||
Generator: generator,
|
||||
OuterKeyOffset: OuterMangleKeyOffsetFirmware,
|
||||
DeviceKey: nil,
|
||||
AlternateMangleKey: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func NewMemoryKeyMaterial(generator KeyGenerator) KeyMaterial {
|
||||
return KeyMaterial{
|
||||
Generator: generator,
|
||||
OuterKeyOffset: OuterMangleKeyOffsetMemory,
|
||||
DeviceKey: nil,
|
||||
AlternateMangleKey: nil,
|
||||
}
|
||||
}
|
||||
|
||||
type OuterMangleKeyOffset int
|
||||
|
||||
const (
|
||||
OuterMangleKeyOffsetFirmware = 0x00
|
||||
OuterMangleKeyOffsetDeviceId = 0x01
|
||||
OuterMangleKeyOffsetMemory = 0x06
|
||||
)
|
||||
|
||||
func DeviceMangleKey(deviceId1, deviceId2, deviceId3 uint32) *MangleKeyData {
|
||||
var d MangleKeyData
|
||||
outerKey := HardcodedMangleTable[OuterMangleKeyOffsetDeviceId]
|
||||
binary.LittleEndian.PutUint32(d[:], deviceId1^outerKey.RoundKey(0))
|
||||
binary.LittleEndian.PutUint32(d[4:], deviceId2^outerKey.RoundKey(1))
|
||||
binary.LittleEndian.PutUint32(d[8:], deviceId3^outerKey.RoundKey(2))
|
||||
binary.LittleEndian.PutUint32(d[12:], outerKey.RoundKey(3))
|
||||
|
||||
return &d
|
||||
}
|
31
encryption/rand.go
Normal file
31
encryption/rand.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package encryption
|
||||
|
||||
import "encoding/binary"
|
||||
|
||||
// BorlandRandMultiplier 22695477
|
||||
const BorlandRandMultiplier = 0x015A4E35
|
||||
|
||||
// BorlandRand Borland C++ rand()
|
||||
func BorlandRand(seed uint32) uint32 {
|
||||
return seed*BorlandRandMultiplier + 1
|
||||
}
|
||||
|
||||
func BorlandRandXORBytes(src, dst []byte, seed uint32) (newSeed uint32) {
|
||||
_ = dst[len(src)-1]
|
||||
for i := range src {
|
||||
seed = BorlandRand(seed)
|
||||
dst[i] = src[i] ^ byte(seed>>16)
|
||||
}
|
||||
return seed
|
||||
}
|
||||
|
||||
func BorlandRandXORInPlace(data []byte, seed uint32) (newSeed uint32) {
|
||||
return BorlandRandXORBytes(data, data, seed)
|
||||
}
|
||||
|
||||
func BorlandRandXORUint32(value, seed uint32) (newValue, newSeed uint32) {
|
||||
var buf [4]byte
|
||||
binary.LittleEndian.PutUint32(buf[:], value)
|
||||
newSeed = BorlandRandXORInPlace(buf[:], seed)
|
||||
return binary.LittleEndian.Uint32(buf[:]), newSeed
|
||||
}
|
45
encryption/rounds.go
Normal file
45
encryption/rounds.go
Normal file
|
@ -0,0 +1,45 @@
|
|||
package encryption
|
||||
|
||||
import "encoding/binary"
|
||||
|
||||
func (d MangleKeyData) Encrypt(data []byte) {
|
||||
for i := 0; i < len(data); i += MangleKeyBlockSize {
|
||||
binary.LittleEndian.PutUint64(data[i:], d.EncryptBlock(binary.LittleEndian.Uint64(data[i:])))
|
||||
}
|
||||
}
|
||||
|
||||
func (d MangleKeyData) EncryptBlock(block uint64) uint64 {
|
||||
dataA, dataB := uint32(block), uint32(block>>32)
|
||||
|
||||
for round := int32(0); round < MangleKeyRounds; round++ {
|
||||
dataB, dataA = encryptRound(binary.LittleEndian.Uint32(d[(round&3)<<2:]), dataA, dataB, uint32(round))
|
||||
}
|
||||
|
||||
return uint64(dataA) | (uint64(dataB) << 32)
|
||||
}
|
||||
|
||||
func encryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
|
||||
dataA = round + roundKey + ((dataB >> 8) ^ (dataB << 6)) + dataB + dataA
|
||||
return dataA, dataB
|
||||
}
|
||||
|
||||
func (d MangleKeyData) Decrypt(data []byte) {
|
||||
for i := 0; i < len(data); i += MangleKeyBlockSize {
|
||||
binary.LittleEndian.PutUint64(data[i:], d.DecryptBlock(binary.LittleEndian.Uint64(data[i:])))
|
||||
}
|
||||
}
|
||||
|
||||
func (d MangleKeyData) DecryptBlock(block uint64) uint64 {
|
||||
dataA, dataB := uint32(block), uint32(block>>32)
|
||||
|
||||
for round := int32(MangleKeyRounds - 1); round != -1; round-- {
|
||||
dataA, dataB = decryptRound(binary.LittleEndian.Uint32(d[(round&3)<<2:]), dataB, dataA, uint32(round))
|
||||
}
|
||||
|
||||
return uint64(dataA) | (uint64(dataB) << 32)
|
||||
}
|
||||
|
||||
func decryptRound(roundKey uint32, dataA, dataB, round uint32) (uint32, uint32) {
|
||||
dataA = (dataA - dataB) - ((dataB >> 8) ^ (dataB << 6)) - roundKey - round
|
||||
return dataA, dataB
|
||||
}
|
302
firmware/firmware.go
Normal file
302
firmware/firmware.go
Normal file
|
@ -0,0 +1,302 @@
|
|||
package firmware
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/buffer"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/compression"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/crc"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/encryption"
|
||||
"golang.org/x/text/encoding/charmap"
|
||||
"io"
|
||||
"slices"
|
||||
)
|
||||
|
||||
const SerialNumberSize = 16
|
||||
const MarkerSize = 8
|
||||
const MarkerPhyton = "Phyton\x00\x00"
|
||||
const MarkerAlmaCode = "AlmaCode"
|
||||
|
||||
const BaseAddress = 0x8000000
|
||||
|
||||
type ASFirmwareHeader struct {
|
||||
Description [256]byte
|
||||
DateTime DateTime
|
||||
DataSize uint32
|
||||
}
|
||||
|
||||
func (h ASFirmwareHeader) DescriptionString() string {
|
||||
decoder := charmap.Windows1251.NewDecoder()
|
||||
buf, err := decoder.Bytes(zeroTerminatedSlice(h.Description[:]))
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
return string(buf)
|
||||
}
|
||||
|
||||
func zeroTerminatedSlice(data []byte) []byte {
|
||||
return data[:max(0, slices.Index(data, 0))]
|
||||
}
|
||||
|
||||
type ASFileHeader struct {
|
||||
Marker [MarkerSize]byte
|
||||
HeaderSize uint32
|
||||
DateTime DateTime
|
||||
BufferSize uint32
|
||||
SerialNumber [SerialNumberSize]byte
|
||||
VersionLow uint8
|
||||
VersionHigh uint8
|
||||
|
||||
// FileCount only available when IsAlmaCode() == true
|
||||
FileCount uint32
|
||||
FirmwareHeaderSize uint32
|
||||
Compressed uint8
|
||||
Reserved uint8
|
||||
CRC32 uint32
|
||||
UpdateCRC32 uint32
|
||||
}
|
||||
|
||||
func (h ASFileHeader) IsAlmaCode() bool {
|
||||
return bytes.Compare(h.Marker[:], []byte(MarkerAlmaCode)) == 0
|
||||
}
|
||||
|
||||
type ASBlockHeader struct {
|
||||
HeaderSize uint32
|
||||
Size uint32
|
||||
Addr uint32
|
||||
|
||||
SizeAligned uint32
|
||||
}
|
||||
|
||||
type Block struct {
|
||||
Header ASBlockHeader
|
||||
Block encryption.EncryptedBlock
|
||||
}
|
||||
|
||||
type Entry struct {
|
||||
Header ASFirmwareHeader
|
||||
Blocks Blocks
|
||||
compressed bool
|
||||
}
|
||||
|
||||
func (entry Entry) Code() []byte {
|
||||
// Runs https://www.st.com/en/microcontrollers-microprocessors/stm32l475vc.html
|
||||
// https://youtu.be/-IsAlSwFWIA?t=508
|
||||
var buf []byte
|
||||
for _, b := range entry.Blocks {
|
||||
decBlock := slices.Clone(b.Block)
|
||||
|
||||
err := decBlock.Decrypt(encryption.NewFirmwareKeyMaterial(nil), !entry.compressed)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if entry.compressed {
|
||||
data, err := compression.FirmwareBlockDecompress(decBlock.DataBlock()[:b.Header.Size])
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
calculatedCrc := crc.CalculateCRC(data)
|
||||
|
||||
crc1, _ := decBlock.CRC()
|
||||
|
||||
if calculatedCrc != crc1 {
|
||||
panic("wrong CRC")
|
||||
}
|
||||
|
||||
newLength := int(b.Header.Addr) - BaseAddress + len(data)
|
||||
if len(buf) < newLength {
|
||||
buf = append(buf, make([]byte, newLength-len(buf))...)
|
||||
}
|
||||
|
||||
copy(buf[int(b.Header.Addr)-BaseAddress:], data)
|
||||
} else {
|
||||
newLength := int(b.Header.Addr) - BaseAddress + len(decBlock.DataBlock())
|
||||
if len(buf) < newLength {
|
||||
buf = append(buf, make([]byte, newLength-len(buf))...)
|
||||
}
|
||||
|
||||
copy(buf[int(b.Header.Addr)-BaseAddress:], decBlock.DataBlock())
|
||||
}
|
||||
}
|
||||
|
||||
return buf
|
||||
}
|
||||
|
||||
type Firmware struct {
|
||||
FileHeader ASFileHeader
|
||||
|
||||
Entries []Entry
|
||||
|
||||
Data []byte
|
||||
}
|
||||
|
||||
type Blocks []Block
|
||||
|
||||
func BlocksFromData(data []byte) (result Blocks) {
|
||||
inputData := buffer.PanicBuffer(data)
|
||||
|
||||
for len(inputData) > 0 {
|
||||
var blockHeader ASBlockHeader
|
||||
blockHeader.HeaderSize = inputData.ReadUint32()
|
||||
|
||||
//i := int32(-836261582)
|
||||
blockHeader.Size = inputData.ReadUint32() ^ BlockHeaderSizeKey
|
||||
//i2 := int32(-1294620572)
|
||||
blockHeader.Addr = inputData.ReadUint32() ^ BlockHeaderAddrKey
|
||||
blockHeader.SizeAligned = blockHeader.Size
|
||||
//i3 := int32(-8)
|
||||
if (blockHeader.SizeAligned % 8) != 0 {
|
||||
blockHeader.SizeAligned = (blockHeader.SizeAligned & uint32(0xFFFFFFF8)) + 8
|
||||
}
|
||||
|
||||
encryptedBlock := encryption.NewEncryptedBlock(int(blockHeader.SizeAligned))
|
||||
if n := inputData.Read(encryptedBlock); n != len(encryptedBlock) {
|
||||
panic(io.ErrUnexpectedEOF)
|
||||
}
|
||||
|
||||
result = append(result, Block{
|
||||
Header: blockHeader,
|
||||
Block: encryptedBlock,
|
||||
})
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func (fw Firmware) Length() int {
|
||||
if fw.FileHeader.IsAlmaCode() {
|
||||
panic("not implemented")
|
||||
}
|
||||
return len(fw.Data) - int(fw.FileHeader.HeaderSize)
|
||||
}
|
||||
|
||||
func LoadFirmware(buf []byte) (f *Firmware, err error) {
|
||||
defer func() {
|
||||
if e := recover(); e != nil {
|
||||
var ok bool
|
||||
if err, ok = e.(error); !ok {
|
||||
err = fmt.Errorf("%s", e)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
fw := &Firmware{
|
||||
Data: buf,
|
||||
}
|
||||
dataBuf := buffer.Buffer(buf)
|
||||
_, err = dataBuf.Read(fw.FileHeader.Marker[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
isAlmaCode := bytes.Compare(fw.FileHeader.Marker[:], []byte(MarkerAlmaCode)) == 0
|
||||
|
||||
if !isAlmaCode && bytes.Compare(fw.FileHeader.Marker[:], []byte(MarkerPhyton)) != 0 {
|
||||
return nil, errors.New("unsupported header")
|
||||
}
|
||||
|
||||
fw.FileHeader.HeaderSize, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dataBuf = buf[len(fw.FileHeader.Marker)+4 : fw.FileHeader.HeaderSize]
|
||||
|
||||
var dateTime uint32
|
||||
dateTime, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fw.FileHeader.DateTime = DateTime(dateTime)
|
||||
fw.FileHeader.BufferSize, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = dataBuf.Read(fw.FileHeader.SerialNumber[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err = func() error {
|
||||
fw.FileHeader.VersionLow, err = dataBuf.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.VersionHigh, err = dataBuf.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.FileCount, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.FirmwareHeaderSize, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.Compressed, err = dataBuf.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.Reserved, err = dataBuf.ReadByte()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fw.FileHeader.CRC32, err = dataBuf.ReadUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}(); err != nil {
|
||||
if err != io.EOF {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if fw.FileHeader.IsAlmaCode() {
|
||||
for fileN := uint32(0); fileN < fw.FileHeader.FileCount; fileN++ {
|
||||
offset := fw.FileHeader.HeaderSize + fw.FileHeader.FirmwareHeaderSize*fileN
|
||||
fileBuffer := buffer.Buffer(buf[offset : offset+fw.FileHeader.FirmwareHeaderSize])
|
||||
var entry Entry
|
||||
_, err = fileBuffer.Read(entry.Header.Description[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dateTime, err = fileBuffer.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
entry.Header.DateTime = DateTime(dateTime)
|
||||
entry.Header.DataSize, err = fileBuffer.ReadUint32()
|
||||
entry.compressed = fw.FileHeader.Compressed > 0
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fw.Entries = append(fw.Entries, entry)
|
||||
}
|
||||
|
||||
offset := fw.FileHeader.HeaderSize + fw.FileHeader.FirmwareHeaderSize*fw.FileHeader.FileCount
|
||||
for i, entry := range fw.Entries {
|
||||
fw.Entries[i].Blocks = BlocksFromData(fw.Data[offset : offset+entry.Header.DataSize])
|
||||
offset += entry.Header.DataSize
|
||||
}
|
||||
|
||||
if offset != uint32(len(fw.Data)) {
|
||||
return nil, errors.New("data lingering after read")
|
||||
}
|
||||
} else {
|
||||
fw.Entries = append(fw.Entries, Entry{
|
||||
Header: ASFirmwareHeader{
|
||||
DateTime: fw.FileHeader.DateTime,
|
||||
DataSize: uint32(len(fw.Data[fw.FileHeader.HeaderSize:])),
|
||||
},
|
||||
Blocks: BlocksFromData(fw.Data[fw.FileHeader.HeaderSize:]),
|
||||
compressed: fw.FileHeader.Compressed > 0,
|
||||
})
|
||||
}
|
||||
|
||||
fw.FileHeader.UpdateCRC32 = crc.CalculateCRC(fw.Data)
|
||||
|
||||
return fw, nil
|
||||
}
|
15
firmware/firmware_test.go
Normal file
15
firmware/firmware_test.go
Normal file
|
@ -0,0 +1,15 @@
|
|||
package firmware
|
||||
|
||||
/*
|
||||
func TestLoadFirmware(t *testing.T) {
|
||||
buf, _ := os.ReadFile("rc-102z.bin")
|
||||
|
||||
fw, err := LoadFirmware(buf)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
code := fw.Entries[0].Code()
|
||||
t.Logf("code, %d", len(code))
|
||||
}
|
||||
*/
|
129
firmware/flash.go
Normal file
129
firmware/flash.go
Normal file
|
@ -0,0 +1,129 @@
|
|||
package firmware
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/buffer"
|
||||
"git.gammaspectra.live/WeebDataHoarder/PhytonUtils/encryption"
|
||||
"io"
|
||||
)
|
||||
|
||||
type FlashAreaData struct {
|
||||
PublicSignature uint32
|
||||
StructLen uint32
|
||||
Data []byte
|
||||
}
|
||||
|
||||
type FlashAreaData_PublicAPI struct {
|
||||
BootSignature uint32
|
||||
ProductSerialNumber [32]byte
|
||||
TargetFileName [32]byte
|
||||
ProductName [64]byte
|
||||
CalibrationBP0 uint32
|
||||
CalibrationBP290 uint32
|
||||
VendorID uint16
|
||||
ProductID uint16
|
||||
ManufacturerName [32]byte
|
||||
TargetID uint32
|
||||
TargetStartTimeout uint32
|
||||
}
|
||||
|
||||
func (f *FlashAreaData) PublicAPI() *FlashAreaData_PublicAPI {
|
||||
var result FlashAreaData_PublicAPI
|
||||
err := binary.Read(bytes.NewReader(f.Data), binary.LittleEndian, &result)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return &result
|
||||
}
|
||||
|
||||
type FlashArea uint32
|
||||
|
||||
const (
|
||||
FlashAreaUnknown = FlashArea(iota)
|
||||
FlashAreaPublicAPI
|
||||
)
|
||||
|
||||
type FlashStatus uint32
|
||||
|
||||
const (
|
||||
FlashOK = FlashStatus(iota)
|
||||
FlashInvAddr
|
||||
FlashWrProt
|
||||
FlashNotBlank
|
||||
FlashVerify
|
||||
FlashErase
|
||||
FlashProg
|
||||
FlashInitEr
|
||||
FlashSignEr
|
||||
FlashInvalidCRC
|
||||
FlashInvalidKeyNumb
|
||||
FlashInvalidSign
|
||||
FlashInvalidAreaName
|
||||
FlashInvalidTarget
|
||||
FlashRdpErr
|
||||
)
|
||||
|
||||
// DecodeReadFlashArea Decodes a result of RD_FLASH_AREA command
|
||||
func DecodeReadFlashArea(data []byte) (*FlashAreaData, error) {
|
||||
buf := buffer.Buffer(data)
|
||||
|
||||
flashStatusInt, err := buf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
flashStatus := FlashStatus(flashStatusInt)
|
||||
|
||||
if flashStatus != FlashOK {
|
||||
if flashStatus == FlashInvalidAreaName {
|
||||
return nil, errors.New("area out of bounds")
|
||||
} else if flashStatus == FlashInvalidSign {
|
||||
return nil, errors.New("invalid area public signature")
|
||||
}
|
||||
return nil, fmt.Errorf("invalid flash status %d", flashStatus)
|
||||
}
|
||||
|
||||
// random seed is set by device using register TIM6_CNT at 0x40001024
|
||||
randomSeed, err := buf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
size, err := buf.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
size, randomSeed = encryption.BorlandRandXORUint32(size, randomSeed)
|
||||
if int(size) > len(buf) {
|
||||
return nil, io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
flashData := make(buffer.Buffer, size)
|
||||
_, err = buf.Read(flashData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
randomSeed = encryption.BorlandRandXORInPlace(flashData, randomSeed)
|
||||
|
||||
areaData := &FlashAreaData{}
|
||||
|
||||
areaData.PublicSignature, err = flashData.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
areaData.StructLen, err = flashData.ReadUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if int(areaData.StructLen) != (len(flashData) + 8) {
|
||||
return nil, io.ErrUnexpectedEOF
|
||||
}
|
||||
|
||||
areaData.Data = flashData
|
||||
|
||||
return areaData, nil
|
||||
}
|
4
firmware/keys.go
Normal file
4
firmware/keys.go
Normal file
|
@ -0,0 +1,4 @@
|
|||
package firmware
|
||||
|
||||
const BlockHeaderSizeKey = 0xCE27A932
|
||||
const BlockHeaderAddrKey = 0xB2D5A864
|
23
firmware/time.go
Normal file
23
firmware/time.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
package firmware
|
||||
|
||||
import "time"
|
||||
|
||||
type DateTime uint32
|
||||
|
||||
func (dt DateTime) Time() time.Time {
|
||||
high := uint16(dt >> 16)
|
||||
low := uint16(dt)
|
||||
|
||||
year := ((high >> 9) & 127) + 1980
|
||||
month := (high >> 5) & 15
|
||||
day := high & 31
|
||||
hours := (low >> 11) & 31
|
||||
minutes := (low >> 5) & 63
|
||||
seconds := (low & 31) * 2
|
||||
|
||||
return time.Date(int(year), time.Month(month), int(day), int(hours), int(minutes), int(seconds), 0, time.UTC)
|
||||
}
|
||||
|
||||
func (dt DateTime) String() string {
|
||||
return dt.Time().String()
|
||||
}
|
7
go.mod
Normal file
7
go.mod
Normal file
|
@ -0,0 +1,7 @@
|
|||
module git.gammaspectra.live/WeebDataHoarder/PhytonUtils
|
||||
|
||||
go 1.21
|
||||
|
||||
require golang.org/x/text v0.13.0
|
||||
|
||||
require github.com/icza/bitio v1.1.0 // indirect
|
5
go.sum
Normal file
5
go.sum
Normal file
|
@ -0,0 +1,5 @@
|
|||
github.com/icza/bitio v1.1.0 h1:ysX4vtldjdi3Ygai5m1cWy4oLkhWTAi+SyO6HC8L9T0=
|
||||
github.com/icza/bitio v1.1.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A=
|
||||
github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA=
|
||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
Loading…
Reference in a new issue