Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle panics and infinite loops found via fuzzer #43

Merged
merged 8 commits into from
Nov 16, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions data_pes.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,12 @@ func parsePESData(i *astikit.BytesIterator) (d *PESData, err error) {
return
}

// Validation
if dataEnd < dataStart {
err = fmt.Errorf("astits: parsing PES header failed: data end %d is before data start %d", dataEnd, dataStart)
return
}

// Seek to data
i.Seek(dataStart)

Expand Down
36 changes: 30 additions & 6 deletions data_psi.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,18 +462,42 @@ func (d *PSIData) toData(firstPacket *Packet, pid uint16) (ds []*DemuxerData) {
// Switch on table type
switch s.Header.TableID {
case PSITableIDNITVariant1, PSITableIDNITVariant2:
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, NIT: s.Syntax.Data.NIT, PID: pid})
var nit *NITData
if s.Syntax != nil {
nit = s.Syntax.Data.NIT
}
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, NIT: nit, PID: pid})
case PSITableIDPAT:
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PAT: s.Syntax.Data.PAT, PID: pid})
var pat *PATData
if s.Syntax != nil {
pat = s.Syntax.Data.PAT
}
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PAT: pat, PID: pid})
case PSITableIDPMT:
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, PMT: s.Syntax.Data.PMT})
var pmt *PMTData
if s.Syntax != nil {
pmt = s.Syntax.Data.PMT
}
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, PMT: pmt})
case PSITableIDSDTVariant1, PSITableIDSDTVariant2:
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, SDT: s.Syntax.Data.SDT})
var sdt *SDTData
if s.Syntax != nil {
sdt = s.Syntax.Data.SDT
}
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, SDT: sdt})
case PSITableIDTOT:
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, TOT: s.Syntax.Data.TOT})
var tot *TOTData
if s.Syntax != nil {
tot = s.Syntax.Data.TOT
}
ds = append(ds, &DemuxerData{FirstPacket: firstPacket, PID: pid, TOT: tot})
}
if s.Header.TableID >= PSITableIDEITStart && s.Header.TableID <= PSITableIDEITEnd {
ds = append(ds, &DemuxerData{EIT: s.Syntax.Data.EIT, FirstPacket: firstPacket, PID: pid})
var eit *EITData
if s.Syntax != nil {
eit = s.Syntax.Data.EIT
}
ds = append(ds, &DemuxerData{EIT: eit, FirstPacket: firstPacket, PID: pid})
}
}
return
Expand Down
13 changes: 13 additions & 0 deletions demuxer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,16 @@ func BenchmarkDemuxer_NextData(b *testing.B) {
}
}
}

func FuzzDemuxer(f *testing.F) {
f.Fuzz(func(t *testing.T, b []byte) {
r := bytes.NewReader(b)
dmx := NewDemuxer(context.Background(), r, DemuxerOptPacketSize(188))
for {
_, err := dmx.NextData()
if err == ErrNoMorePackets {
break
}
}
})
}
11 changes: 6 additions & 5 deletions descriptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -1238,17 +1238,18 @@ func newDescriptorVBIData(i *astikit.BytesIterator, offsetEnd int) (d *Descripto
// Data service descriptor
offsetDataEnd := i.Offset() + dataServiceDescriptorLength
for i.Offset() < offsetDataEnd {
// Get next byte
if b, err = i.NextByte(); err != nil {
err = fmt.Errorf("astits: fetching next byte failed: %w", err)
return
}

if srv.DataServiceID == VBIDataServiceIDClosedCaptioning ||
srv.DataServiceID == VBIDataServiceIDEBUTeletext ||
srv.DataServiceID == VBIDataServiceIDInvertedTeletext ||
srv.DataServiceID == VBIDataServiceIDMonochrome442Samples ||
srv.DataServiceID == VBIDataServiceIDVPS ||
srv.DataServiceID == VBIDataServiceIDWSS {
// Get next byte
if b, err = i.NextByte(); err != nil {
err = fmt.Errorf("astits: fetching next byte failed: %w", err)
return
}

// Append data
srv.Descriptors = append(srv.Descriptors, &DescriptorVBIDataDescriptor{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("G@\x00\x10\x00\x00\xb0\r\f7\xc1\x00\x00\x00\x01\xe00\x8a|\\\xa4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffG@0\x1c\x00\x02\xb0u\x00\x01\xe7\x00\x00\xe01\xf0\x1b\x05\x04GA94\x87\x13\xc1\x01\x01\x00\xf4\r\x01eng\x01\x00\x00\x05TV-14\x02\xe01\xf0\x0e\x11\x01\xff\x10\x06\xc0\xbdb\xc0\b\x00\x06\x01\x02\x81\xe04\xf0\x18\x05\x04AC-3\x81\n\b8\x05\xff\x0f\x01\xbfeng\n\x04eng\x00\x81\xe05\xf0\x18\x05\x04AC-3\x81\n\b(E\xff\x00\x01\xbfspa\n\x04spa\x00\x8c\xc7f^\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffG\x001\x13љ\xa2\xb7Cs4j\xa0\xc1\xff\xecU\x8a\xb4V\x01\x8b\xff\xd8h$\x80\xc5\xff\xed\x01\x88\x00X\xa80\x7f\xfb@b\x00\x16\x01\x8b\xff\xd8h\xe01\x00\v\x1a4\x90\x05V\x00\xc4\x00,i\xc0\x03\xa6\x18h\xd8kEiZ0\xccg\x81\t\xa3e\fh\xad\x06\xb4\x18\xacF\x1a9aLQ\xa5\xda\x006b\xa1\xac\x8a`\x00~\x054a\x19\xab\x05\rcY\r`\x03f\x8cә\x87\xb2\xda1\x9a\xb0\xcc\x1f\x80\x05\xa35\x8d\xad-ck\f\xda\tC3Eb\xac\x99\x83\x17\xff\xb4b\xb3Pa\x00\x16\x15\x9a\x83\b\x00\xb2f\xd0M\x18\xabFfL4a\x9a\xb4f\xac\x98h%\x16\xb1\xb5\x8d\xa0\xc0\x00,m\x06\x00G\x001\x14\x01d͠\x9a+\x15b\xc5A\x83\xff\xd93h%6\x83\a\xff\xb1\xb5\xa5\xa0\xc1\xff\xecֲf\f_\xfe\xd0Lk\x1aұa\x9bA)f\xac\xacՓ6\x8c\xd6fZ\f \x02\xcdA\x84\x00Y3hڳU\x05\xf0\x02e\xac\xd4\x18@\x05\x88\xcc\x18\xbf\xfd\xa3j\f \x02Ŗ\xb3V@\xc5\xff\xec\xc1\x8b\xff\xda6\x06/\xffck\x00b\xff\xf64\x18\x7f\xfe2b\xb6V\xcb\xc0}DțGڭ\x1aZѳ@\x1a5\u058c\xd0a\x00\x16-(0\x80\vJ\xd3\x19\xb4f\xb1\xac\xa0\xc4\x00,Ն\x1a9X\xb4\xa0\xc2\x00,A\x88\x00Y@a\x00\x16`\xc4\x00-\x18b\f_\xfe\xc0\x18\x80\x05G\x001\x15\x8de#0b\x00\x16\x8c\xb4hц+A4hѣ&m\x04\x91\xa3F\x8c0\xd0M\x181`\f_\xfeɩ\xa3\x8c\x18\xb0a\x86\x8e0b\xc22a\xa0\x96F\fA\x88\x00X0\xc01\x7f\xfbG\x19A\x88\x00XƑ\x86\x1a5\x06 \x01h\f@\x02ŀ1\x00\v\f4G5%\xe6\xa6*\xd4i\xbdZh\x1cS҂!\x94G,.}\x0f{\x9d(:ibS\x00\x00\x00\x01DR\x8a9\x14\x839\x14\x83<\x8d\x82\x04\x9dր\xc5\xff\xed\x1a7Cr4\x12\xb5\x06\x10\x01\xa46 \xc4\x00,(0\x80\rcA\x84\x00k\f4`\x18\x80\x05\x84f\x06 \x01e\x8c0ц\x10\x18\x7f\xfd\x8bG\x001\x16\b\f?\xfe\xcc\x18\x80\x05\x86\x82d\x8dG\x00\xc3\xff\xed~6~\t\x003eA\x88\x00Y4G\x05\x8e\x8c\f\f\x00~\b\x7f\xe8\x1a#\x11\xbc\x18Q\xf1@\x0fA\x0f\xfc\x89\xa1\xc4Pa\x00\x180\xa3\xf4\x82\xa2\xc3m\x06M\x10c\xff\xf8\x18\xff\xfe\x88֣\xc0\xc7\xff\xf4>\xf5\x11\xf7f\\\x9b\xacu~\xe8%\xf9\x88\xc6js(\xc6js`\xdd-\x1b4hєgZ\t#M9\xa3\x1as(\f?\xfe͠\x94\xcaѤh\xc8\x18\xbf\xfd\x86\x88\xc0\xb2j\xfa#\xb1\xa6\x8b\xed\x14$6\xd7D\x8e81\x00\r\x83\x10\x00\xd0K\xf3\x90b\x00\x16 \xc4\x00,\x01\x88\x00X\x83\x10\x00\xb7%<\x00vݭG\x001\x17\x1c\xa7\x80\x0e\x9a@a\x00\x16\x94\xf0\x01\xd3H\f \x02\xcc\x18\xbf\xfd\x94=\xa3\x15\x849\x9a\xb2Ø\xac\x81\x88\x00ZAeo\xa3\xf9\xb49\x8da\x0ec[\x99\xba\xe8ƈ\xe0\xb1Vp\xaa\x82_\x9d\xd0a\x00\x16 \xc4\x00,(0\x80\v\x10b\x00\x16\xe4\x8d\xd9A\x84\x00Z\"\x02\xcbف\x15\xa9\xb5\x83\x10\x00ѳ\x83\b\x00\xd1\x15\x8aD\x94Q\x11\x1a\x88\x83\x1f\xff\xd01\x7f\xfc\f\x7f\xffTFc<\x18\xff\xfe\x9e\x06?\xff\x8a\x06/\xff\xb4.z\xea\xda9*\x8d\xb4\x11ʙ\xe3渧\xa2/@\xc6\x004Fa\x10\x9b]\x11h\x81\xaa\xba\xbe=\x83\x17\xff҂1\x82O\x98\x00\xc8\ni(0\x00G\x001\x18\v@b\x00\x1a\xd2\x1e\x00:lA\x8b\xff\xdbv\x8dF4\x06/\xffh1\xa3\x185\x9dh\xd8\x18\xbf\xfd\xa3\nŕ9\x98\xc0\xb0b\xff\xf6\x829A\x8b\xff\xd8\xd0a\x00\x16\x14\x18\xbf\xfd\x9a\x83\b\x00\xb3\x8ci\xd0\x03p-\xa4\x163\x82O\x99\xb1V\x83Z7;t\xb4\x82ǙG\xf3E\x06\x00\x01h\f@\x02Ѡ1\xff\xfbs\x14\x8d\xd2\f@\x02ъ0\x90\x84\xa8Kfӂǀ\v\xe0\v\x98Q\x84\x84%B[\x1d8\xf1\xa3\xd0\x00g\x19\x83\x17\xff\xb01\xa3z\x7f\x88\x0f\xc0\xb8Ɯ\x00:\xa46\x14\xf0\x01\xf8\x17\x18Ӏ\aT\x86\xc8`\x16\x05\xb3hJiPm\x1f\xcfM\b\xf4\x02\xda\x1aG@\x00\x11\x00\x00\xb0\r\f7\xc1\x00\x00\x00\x01\xe00\x8a|\\\xa4\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffG\x001\x19\f\x00\x04\xcdA\x87\xff\xd8\xc0a\x00\x1a\xdcHݠ\xc5\xff\xed\x1a\x1a\xa0h\x92\xd1Y\xa0\r@\x05\xec\x18\xac(0\x7f\xfbG-\xa0\x03f*\x03BC\n\f \x02ś\x00\xc7\xff\xed\x11\x81cW\x03\x18\x00\xc0\xc6\x0002\x00\r\x04\xbe\x05\xa3F\x8d\xc7\x1b\xb5\xa3m\x06\x1f\xfffe\xd0a\xff\xf6f#6\x8c\x03\x17\xff\xb1\xa0\xc5\xff\xec\x01\x8b\xff\xd8\xd0b\xff\xf6L\xa3D`X\xff\xf01\x80\r\xc0\xc6\x004\x12\xf89A\x84\x00Z(0\x7f\xfb\x10c\x00\x16\x80\xc7\xff\xed\xc4ݭ\x11\xc1c\x9fM\"`a\xff\xfa# P'\x06i>\xe4PI\xe0XF, <\x7f\xfbq\rn\xe8њ\xa0>$\xd2")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("G@\x00\x1e\x00\x00\xb0\r\x02\xfe\xc1\x00\x00\x06G\xf7\xbb\xbe\xbc\t\xc6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffGW\xbb\x1b\x00\xc1\x007\x00eng\x06G\x00\x00p\x00\x13\x00\x11SOP: SERVICE 1963\x13\x00\x11SOP: SERVICE 1963\x00\xb1Ѡ\xd9\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffGW\xbb\x1c\x00\xc0\x002\x00\x06G\x00p`\x00Ppy\x98\x01\x00\x00\x00\x00\x00Pq\xcb\x18\x00\x00\x00\x00\x00\x00\x00\x03\n\x00\x01\x01\x03\x00\x01 \x01\x01\x03\x00\x01 \xc0\x01\x00\x06\n/3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffGW\xbb\x1d\x00\x02\xb0o\x06G\xcd\x00\x00\xf7\xbc\xf0\x06\x05\x04GA94\x02\xf7\xbc\xf0\x1d\x11\x01\xff\x10\x06\xc0\xbdb\xc0\b\x00\x06\x01\x02\x86\r\xe2eng\xc1?\xffeng@?\xff\x81\xf7\xbd\xf0\x18\n\x04eng\x00\x05\x04AC-3\x81\n\b8\x05\xff\x1f\x01\xbfeng\x81\xf7\xbe\xf0\x18\n\x04spa\x00\x05\x04AC-3\x81\n\b(\x05\xff\x1f\x01\xbfspa`\xd2\v\xcb\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffG\x17\xbc\x15\xe7\xcc_\x15\xf6M\x0f\xcbmõr2\x11\xc4\xe7\xbc\xce\xec2\xb3\xe5\xa3\xce+\xb2\x0f\x1cw\x7fy5\xa6\xb1\x14\xef.\x9d\x8c\x18\xac\xa3F\f\x96mc\xcf(.H\xc2\x135\x9bߙ\x9e\xec\xeeX\xc6E\xda\xd1\xc1\"I\xcc\xd8\x00\xf5m5\xd6H\xd0_u\xfa\x92\x873{\x9b\x91\x87\xf3\x1ax\xe9\xc9\rh\xd7\xea\x00\xd4P\xa1\x13n\xe3]\xee\x00N&jp\xf5U\x01\xc3\x0f\x9f\x8d\xfa\xb96\xb1\xf6\x00U\xf0\xecq\xb9\x1fR)\xac\xe7{\xb4vF/\x1c:C2\xb4c\xd8\x01\x8f\xdf\\\x95\xfbu\x87\xc7`\x0f\xc5\xfbۯ\xef\x1c\x94\xa9\xb62\xc1B\x84d\xb3\x8ca\x9b&͌\x89\xec\xc9\xc3\x03\x9a6G\x17\xbd\x1d\xc1\x01kz(إg@\x19\x1d\xac\xa8\x02\xe3\x00\x18\x961\"\xbe\xd4\xfa\x9cA\xd8\a\x17\x92\xf0ub\xa0\x9b\x90\x9f\xf7\xedlI\xee\a$\x13i\fє\xe1\xc8|\x81\xb1\xb7M\xfb&\xd6\xe8!l\xb8\xf7\x01\xa9&\a\x90\x00\xb7\xe0,\x02\x1a\a&\a*\x9f\xd5\xe9\x1d\xd64\xa0\xd7l\x03Sp\xa3ݱ\xc0\xb5\x15i\xb2=\xba\x9e\x02B\\\xc6\x14\xb3\xd6\xe5w#J»\xba\x95\x8e@\x80\x88b*\x80\x18\x0f\xf9\xe4T3\x83\x9b\xdb\xf0|L\x19\xbb'Lӷ\x8e\x8d\xb9l\x99\xb3\xb5\xa93x\xff\xc0\x17\xfd\x10\xff\xfa(\xa1@2kAç\x1f\x8bKu\xce@\xd3Y\x13ӣCK\x92\xf0QL-G\x17\xbc\x16\xbeۺ\xbbk\x1f\xab\xb1\xdd\x15\x03\xe5d\xaf\x8c\xdf\xf8\x82\xab\fIu\xa3\xb1\xef\xadH\x03\x0eM\xfam\xc6\xd0\xf5\xba\xd4\x00 \x040\ac\re\xe4\x99Z>\x80\x03P@\x04\xee\x80\x19\x82\a\xe9v\x00\xa4\x01\xe8\xb1b];\xaf\x82\xb9\xdf7\x1b\x9c\xaeD{\xac\xb1\xb0\x00\x18\x11\x84|c\x85t\xec\xe1\xdcb&d\x92V\x02L\x9b\xcdH\x03\x9d\xac@\x17s/\xd5\xeect\xc6,\xb6[\xb5Qɍ\x1a\x7f\xf2c\x9f\xcb\xe9\x8e\xc7Sv\x94a\x92\xebw\xc1\x03\xe3A\x03\xe8y\xf6\xf9p\x03\x00\x06\xde\xfb\x1d\x04\xce\x17\x8a\x9a\x84\xff\xce\xdb\x1f\x9b\x16b\xcdn@ }\b\x01\x1b\x80\b\x80\b>\xfd\x93\xcc\x16G\x17\xbc\x17'\xaez\xe2ʖ[\xc5[\x81\xb8\xde\xc4\x00\x8c\x01\x99\x14\x01\x88\x02\xbe}\xf9\xdd|\xdfw\xc7M\xb6\xe4\x9bt\xc5\x01U&\x16\xb9\x1b0\x06\x84l\xb4\x02\xbd\x90\xa3\t\xc6\xc3b\xd5\xf5\xca\xdb\x00'\x00\x7f\xb9\x93\xd8S\xcc\xd4\xfc\xd9k\x00\x00\x00\x01!\x12?\x8d{\x93^3\xf2\xf2\x1dk\xf9?Z\xa1o\xbeoP\tu\xad\xef*\xd6ˢ`I+\x15\xb6\x17C\xebF\\\xce\xf9\x7f!\xb6\xb5n\xc6m\x87\xb4\xb3\xdc)Z;\x1e\x04F\x93&2\xee\x16s6\xc6MZ{\xda2\xf6g\xba\x9e˪\xa8Ŗ31\xa3n\x8a{!\x1c\xa71\x99\xf9`EdW\x9cc\xf4\xd1\xdc\xf9\xb1\x9f\x9c\U000cc3fa\xc7G\x17\xbc\x18\x8b\rdk3\x1a\b\xdb\x1c\x91\x9a\x9e\xd5\xf2\xcfc&v4v?\x19u8\x11\xbb\xb4\xc31\xa3n\x04\x0f\xc8\xf7\xec\x88\x00@\x00\xff\x91\x1b]ι\xdc\x1a59~;Y\xf6\xff'n\xb2vy\xecƈ\xe1\xce\x06\xe3\b@T\x048\x04\xe0\fɼ1\xb93\x14\x94>7\xeaJ\x15A\x80\x18\x14\x05\x06\x01]\xba\x12\x92\x9b\xa0\x8e\x9a+$4\xbc\x8d\x00fLv~o\x80\x1e\x10\xd8h\x8d\xa8$\xe5\xf5\xc7n\xe7\xf2\xedn0\x03/\xa1\x06\xf9\xee6\x00\a\xc0\t\xa7?\x12\tɱ\x00\x89u\xb0\x91\x80\x17g\xc6\x1b\xc6\xc7\xe49\xdaMnM~7v;u\xa3q}G\x11\t\x86S\x1b\xa1\xd7ȱ\x02G\x17\xbc\x19W\x87\xbe\x19\x7fV\xb6`\a\xffw\x9aN3f\x13\x1bH\xa4\xddj\x8d-\x11\x88@\xa50\x01\xe0\t\x80\x1d\xf1\x8cM\xc3q>!\x86r`\x0e\xca\x1a\x19\xd8Q\xb0\x01`b\x1f\xaa!\x01Bg+fT\x05R\xd0\b\x11\xf8\x9b|\a\xb3\nH\f\x13a\x80S\x14\xba(\x06-\xf2\v\v\x80v\x9e\xdb\xf1O\x16\xde&a\x87\xeb]\v\x8c\x00d\x92h\x18\x01\x8b\xa3\xb2\xce\x1f\xa2ёיp\x02@\xdc\x02\x94\x97Ǫ\x02\x80P4!\x02\xb5:\xe9\xa8$\xf99\x1cV8\xde\xf6\xe7S\v\xdaݰ\x02߯\xc7~\xce\x15м\xe5\xf3V\x99U\xb9\x00\b\xc5\xf1\x80\r\x85ݥ\xbf\x13\x1b\xd7n\x15\xad\xcf\xfc")
Loading