Skip to content

Core dumped in read_csv (C engine) when reading multiple corrupted gzip files #12098

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

Closed
alessiodore opened this issue Jan 20, 2016 · 18 comments
Closed
Labels
Bug IO CSV read_csv, to_csv
Milestone

Comments

@alessiodore
Copy link

I am using read_csv to read some gzip compressed log files. Some of these files are corrupted and they cannot be uncompressed.
At different iterations in the loop that reads these files my script crashes with a core dumped message:
*** Error in `/usr/bin/python': corrupted double-linked list: 0x0000000003836790 ***
or just:
Segmentation fault (core dumped)

This is a stripped-down version (just looping over one of the corrupted files) of the code where this error occurs:

import pandas as pd

for i in xrange(n):
    try:
         pd.read_csv(fPath,delim_whitespace=True,header=None, compression='gzip')
    except Exception,e:
         continue

The traceback of the catched exception is:

File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 498, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 285, in _read
return parser.read()
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 747, in read
ret = self._engine.read(nrows)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/parsers.py", line 1197, in read
data = self._reader.read(nrows)
File "pandas/parser.pyx", line 766, in pandas.parser.TextReader.read (pandas/parser.c:7988)
File "pandas/parser.pyx", line 788, in pandas.parser.TextReader._read_low_memory (pandas/parser.c:8244)
File "pandas/parser.pyx", line 842, in pandas.parser.TextReader._read_rows (pandas/parser.c:8970)
File "pandas/parser.pyx", line 829, in pandas.parser.TextReader._tokenize_rows (pandas/parser.c:8838)
File "pandas/parser.pyx", line 1833, in pandas.parser.raise_parser_error (pandas/parser.c:22649)
CParserError: Error tokenizing data. C error: Calling read(nbytes) on source failed. Try engine='python'.

If I remove the delim_whitespace argument the loop completes without segmentation fault. I tried adding low_memory=False but the program still crashes.
I am using pandas version 0.17.1 on Ubuntu 14.04 OS.

It looks like a similar issue to #5664 but the problems should have been resolved in v0.16.1

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

pls show an example with data as minimal as possible. why does looping matter here?
pls show pd.show_versions()

@jreback jreback added the IO CSV read_csv, to_csv label Jan 20, 2016
@alessiodore
Copy link
Author

Sorry I forgot to attach the file. Here it is:
[link removed]
I renamed it to zip to attach it but it is a gzipped file.

The loop is to reproduce the problem without having to attach multiple files.
This is the output of pd.show_version():
In [4]: pd.show_versions()

INSTALLED VERSIONS

commit: None
python: 2.7.6.final.0
python-bits: 64
OS: Linux
OS-release: 3.13.0-55-generic
machine: x86_64
processor: x86_64
byteorder: little
LC_ALL: None
LANG: en_GB.UTF-8

pandas: 0.17.1
nose: 1.3.7
pip: 1.5.4
setuptools: 18.6.1
Cython: 0.20.1post0
numpy: 1.10.4
scipy: 0.16.1
statsmodels: None
IPython: 1.2.1
sphinx: None
patsy: None
dateutil: 2.4.2
pytz: 2015.7
blosc: None
bottleneck: None
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: None
xlrd: None
xlwt: 0.7.5
xlsxwriter: None
lxml: 3.3.3
bs4: 4.3.2
html5lib: 0.999
httplib2: 0.8
apiclient: 1.2
sqlalchemy: 0.9.8
pymysql: None
psycopg2: None
Jinja2: None

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

@alessiodore can you see if you can narrow it down a bit more pls. e.g. keep chopping untill you don't get the error then back up

@alessiodore
Copy link
Author

I am not sure this is what you mean but I changed my script to:

import pandas as pd
import StringIO
with open(fPath) as f:
    log = f.read()
for i in xrange(200):
    try:
        pd.read_csv(StringIO.StringIO(log[:9657]),compression='gzip',delim_whitespace=True)
    except Exception,e:        
        print(e)

When I slice the file to 9656 I don't get the segmentation fault. At 9657 it gets the segm fault.

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

great. so extract the slice that is causing the error. we need a simple, copy-pastable example in order to pinpoint the problem, I don't want a file, rather a string of characters that repro. further try with and w/o the gzip to see if that is the problem. The more you can narrow it down the better.

@alessiodore
Copy link
Author

I tried to slice the left part of the file (log[n:9657]) but I got the segm fault only for n=0. Also I tried for log[1:len(log)] and I didn't get the segm fault.
Unfortunately I cannot try without gzip as I don't have access to the original data and this gzipped file is corrupted.
What I can do is to paste here the string log[:9657] if that makes sense. Thanks!

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

yes, ideally what you can do is something like:

data = """
.....
"""
pd.read_csv(StringIO(data),.....)

e.g. a complete copy-pastable example that repros. Then we can use this to debug and as a test.

I know narrowing down is not so fun :< but in order fix these issues much better to have a simple example.

thanks!

@alessiodore
Copy link
Author

I understand. I wasn't just entirely sure if it was okay to post a 10K characters string.

import pandas as pd
import StringIO

data = '\x1f\x8b\x08\x00ST\x97V\x00\x03-\xca1\x0e\x021\x0cD\xd1\x9eSX\xa2vA\xcb\x01\xb8\x06\n\xc9\x00\x16\x9b\xcd\xca\xe3H\xc0\xe9I\x80\xee\xcd\xe8\xefO\x86\xa5\xf0(a\x15\x8cT\xb7\xaf4\xd2\x03\xabd\xb5M\xae\xb6\x80\xf6\x86p.\xea\xd6<\x84YG\x1d\x9dS\x97W\x80\x92\xa9\x15qoe\xaa\xbb\x8d\x00UT\x9cZ\xba\xa7\xb0\xb6N\xffcu\\\xe1\x0e\x1f\xec\x84k\xbaa\r\xc9\x9d\xd1\xea\x98V\xe4\xa9\xc8\xe7\xdf\xa1\x87\xdd\x07;\xcf\x84\x0e\xaa\x00\x00\x00\x1f\x8b\x08\x00ST\x97V\x00\x03\xed]kS\x13M\x16\xfe\xbe\xbf\xa2\x8b\x0f\x96VIO\xdf//emqQd%J\x19Dw\xb7\xb6R\x81\x8c0\xaf!I%A|\xdf_\xbfg&\t\x82\xc4\x10zf\xc2\xa4{\xd4\x98\x04\xe6\x92~\x9e\xd3\xa7\xcf\xe9s\t\x15\x92i)5\xb3\x88 \xc6\x18\xa6\x92aF\t<S\xc4\x84\x96\xc2\x08D\xa9\xc6\xd4`\xc6%\xa6\x94"C\xd0\xf1\xeeQ\xeb\xed\xc1q\xc4\x88B\x82I\xb4\xff\xfa\x18]\x8c\xc7\x83?\xa2(\xee\x9c\xc7\x9b\xdf\x93\xce\x08_\'\xc3\xf8\xba\xfd\x03\x9f\xf5/#C^\x1b\xbd\x1dM\x7f\x94\xfe>\xee\x8f"x\xdak\x8f\xdb\xf0[F\x15S\xb3\xe7\x165\xe4}\xff(\xf9\x11w\xf1\xe5@\xa0M\xf8l\x8a\x12\xb41\xbb\xc5\xe5i\xdc\xf9\xe5\xf2\x8cZ\xa6#}\xda\xfe\xda6\xd1\x06\xdah\xf4\xffN\xba\xddv$1A\xcf\x93\xa3\x8b~/\xdeB\xbbG\x9f\xd0\xe45\xfa\xd0D\xa6\xc5Q7\xf9\x16\xa3F\xfb,}\xff\xe5\x05\xda\x1e\x0c\xba\xf1\xe7\xf8\xf4]2\x8e\x14\x01\x14\xb0@\xcf\xdf\xbd=n\x1c\xbe\x9c\x1c\xba\x1f\x9f}\xeb\xbf@\'\xf1p\x94\xf4{\x91\x81\xab7\xfa\xa7I7\x8e({\xa3\tj\xc2\xfd\x87\xc9\xec\xdc\r$\xad\xa4\x02mln\xa0\x7f\xd0\xfcP\xa7GYjW\x02\xb7\xaa\xe1f\x82\x0b\xab\xf8*\xe0f\xb5t#\xc6\xad \xa4\x86\xfb1ps\xe2\x0c\xb7\xa1\x9c\xadF\x95h_\xc0\xa6)\xd8\x84cJ,f\xf0\x80!#j\xb8\x80_\xfc\x1ekN\x04\xe2\x9a\x16\x81t\n\xd4\x04\x85(\x19\xa4O\xcd\xc10\x19\xc7\xa6\xc5\xf6\xf0\x9f\x83\xf3\x0cnm\x0b\x87\xdb\xb6\xd8b\xb8i\n\x99\x9a\x8b\xf7\x0cc\xbe\xab%\xfa\xef\x9b\x9d\xed\xf7\xd1\x9b\x9d\x83\x0f\xcd-xy\x12\t\x85\t\xfc\x95\x02\xe4V\xc1\x8fvN"j\xacf\x86Zx\xb7w2\x1d\xadz\xc9\xe0mco\xfa\x16^7\xdfG7\x9f/}{\x12\x01#\xe9\x8bf\xc4\xb6\xd0\x9b\x9d\xdd\x8fQs\xd0\x1e~{\xff\x1f\xf8\xe1\xc1^4\x98\x9ew\xb8\x1b\xc5\xbd\xd6\xa7\xf4\x9c\x0fG\x91\xfc\xdf\\\x9e%\x99\xc7\xb3\x92F\xe9\'\xe5\x99\x92\xbbD\x9b\x9a\xe8|D[\x8b@U\x02\xab\x19\xd9\x82\x83\x06\xe5\x98#\xa6\xad\xe0\x8c\xc8\x87\xd6+F45\xb4\x00\xeb\x17\xa00f\xf6\xdc\xd2\x8c\xdc(O\r\xb7]D\xf2\xe4\xcc7\xd9\x9f\x7f\x8e\xbe%\xbdWM\xf8o\xa7=\x8cO\x01\x87\xd1\xb3\xec\x9c\xc3\xfe\xd9\xab\xed\x9d\xddg\x9dd\xd4>\xed\xc6\xaf\x7f\x8c\xe3a\xaf\xdd=\x1e\xb6\xcf\xe0\xe0\xf3W\xe3\xe1U\xfcltu:N\xc6\xddx\xf4jz\xbb\x11\xdf\x8c\xaf6\xaf\xe3\xd1x\x93\xe2\xf6e\xfb\xef~\xaf}=\xca\xee;\xea\xf6O7oN\x88\xe2\xc1&\xe3\xf8\xfbx\xfcl\xd0\x1e\x8d\xae\xfb\xc3\xce\xab\xe6!\xd9y\xf6\xab\xd0}Nz\x9d\xfe\xf5\x08\xbd?F\n\xd3\xbb\xb2%\xb9\xc6|\xbed\xed^\x0c\xfb\x97q$4\x08\x10\x93\x0cN\x05\xf0\xa7\xeazr\xda<r\rX\xb0\x14\xa6\xb2p#\x97jb\x88,\xc2\xd6^@\xaef5\xb9n\xe4fK1e\x14[\x93\xfec\x82<\xbc\x103\x92\x1dd\xa4Z\xd5Z\xac\x84\xcc\xa3\xa2\xdb\x9d\x89\x82~j\xcd\xdc\xee\xc8\x97|\xa6\x97\xe1C-\xa5\x95\'\xeax\x9c\xca\xe4\xf8\x9e>\xa6s\xf5\xf1\\V\x1fZv3V\x95b\x96\xadl\xe5U"\x97s\x1c\x1c\xad&\xa5\x15f\xb8f\xa9%\x05\x16\x95\xa8\xe4dU\x8b\xb5q\xb5\xec)\x99\xd1\x0bO\xf6\x86]f,\x984\xb7\xcd)\xe9bN\x9d\xf4;m\x17k\xca\x18v\x9f\xe6*\xce^\xc5k\x9es\xf1<o\x8b\xa7\x92\x13:\xd7\xea[\xf0\xc6\xc3\x9d\xcd\x06G\x9e\xf5\x12<\x1b\xcc\x97\xe5y\x7fg!\xcfv\xde\xdeR5gt\x956\xab\xd7\x8eh\xcbDfvI\xa0\x13X\xe5`\x83W+\xf6\x93\xeer:\xf3{\x98\xf4\xae~l\xa1\xed^g\xd8O:\x08~\xb6\x85\x9a\x8d\xcd}K\xc8\x01\xda\xb9J\xba\x9d\xe8\xf0\xe3\x17F\x8f\xb7\xd0\xf5\xf7\xa5\xdd\x96\xd96\xa2\x80[\xcc\\\x98\xd4\xe2b\xc2\x12\xac\xd5T\x08\xee:2\xa90\xb4\x0e\xb6w@\x1c\xc4\xf6D\x1a\xa4\xcd\xa4\x81J\xcc)\xdf\xfa-;TZ\x17~Hv\x94Q\x85h\xdc\x078\x12\x82f\x1f{\xa3\xd9\xbe\x1c]\xf5\xce\x7fb<\x1a\xb7\xcf\xe3\xaf\xc3\xe4\xfcb\x1c\xed\xc4\x7f\xf5{g09`\xf6\xd8\x197\xb7\xa8yQ\xb0|R\x0e:\xab\x10E\xf4\xd0\xf0\x95(o\xf8\x06n \r\xa6\xa9a%9\xd8WU\\m\xa5(\xc1\xac\xa2\xcef\xd5l\x82\xda[\xfb\xfc|\x87\xc2\x87\xbc\xd9\xe8\x87\xb3\x97\xc6\xbb\x82\xab\x9e\x14\xc2\x13\xc0\xe5d~3\xac(\xd8\x19\x0c\x9c\xd6\xcaEUT\x19\xd2\xed\xee4\xcc\x05;u \x9c\xb0\xaeZdC\x95!\xd9O\x01\xb6f\xb7\x17.\xb8\x01\xaf5w\x99\x8aD\xf3\xfbx\xd7\x9a\xbbL\xc0k\xcd\xbd:ebj\xcd\xbd2\xb0\rE<u\xba\xd2\x03R\xbc\x01Z&\xe4r\xc1C`I0\xad-%\xe5F\x86\x17\xcb\xf5\x1a\x07\x0f\xb7\xd0\xe7\x0f\x9f\x95\xd8B\xc7C\xc0\xa37\x8et\xea\xb4\x0f\xbf\xff\x01*\x9d\xbc\xb8\xc5\xf0\xef\xa8\x93\xda\x8d9\x85$\x01\xe5UnH\xdf\x08oC\xfa\xb9\x89S\x8eSN!a)(\xc5\x9a\xb8\xd5\x13\xa7\x08\xd1\x88IC\x9d\'\x1d\xd3JI\x06\xe7\xd7\xe4\xad\x9e<\x93\x99pTa&\x81<\x0b\xd7\xe3\xba\x8a^\x8a\x02\xddP!\xd3\xa2\x90t7\xf1\x92>>n\xc7:\xf1\xf90\x8eG\x8f\x8e\xdc\x01\xd7j\x1e\xd7\x15\xf4\x90\x94.<A;4\xb2)S7\xe1x&\xe0\xc1y\xa5\x82:J\x14>\x9fMK<\xe4\x06?21\xfc-g\xf4\xe1\xcc\xf0\x1cX\xaf\xb0\xa2G\x96\x10\r_C\xbcWV\xd2#k\xf9^iM\x8fWxkG\xbc\r\xe5\xbc\x00;z\t\xb4KH\xb9x*\xb4\xb3"*\x17\xb4\xa9Q\x9c\xd0B\xb6\xd7\x1e\xc2[\x95P\xb1\xf6Tx\x83\xa3Oa\xf5\xa7\x94`\xce\x00\xd7\x14[\x85\xc0\x03\x94Y\xa1\xcd\xe2\r\x1a8JYQ\x80\xabh\x89\xe4\xb3\xe7\xbb;k|\xf1&\xe6\xe4\xcc\'v\x15G\xf1\xd90\x86\xa3\xe8&[\xc2a\x04\x82\x93\xde\xb8?\xba\xd8B\x07\xbdq\xdc\xbda\x1c\\\xf6\x16\xfc\x93\x8f\xce\xd7\x97Y\xb2\x0b\xd8\xbcF>\x98\xae\xaf\x18\xcdRC\xc1\xbae\x02\x1e\xe0w\xc8j\xe6\xeb\xdb\xc2\xb7\xafa\x96\xe5N${\x9b\xc6b\xee\xb9\x1d\xdc\xc2\x99\x04\x0b\x8a9\x9dz\x1d\x02\x90\xe7\x82=>\x93L\x14\x92\x1a\n<\xcb9<W\xd1\xbf\xb4e\x18\xc3!\x11mnGZA\x89sS\xc9\t]\xfc>\x82n\xd1\xc5;\t\xa9\x1a\x94\x14\xb3\x85T\xd3=&\xb5\xf3V\x02_b+\x01H((\xe3[1F\xe6\xb0]\xc5i\xad\x17o\xf2\xd6t/G\xf7,\xaa/-\xb6\n/\xb3\x1f\xbc\xea"\xf7|q\xe6\xeaT`\xb1\x97r\xd9\n,\xea\\\x81\x05\x8c\xca{\x8cV-u@\xfbR+\xb9"J\x81CpT)\xb8Qii37X\x81\x99\xa0\xd5\xb2)\n\xd9a\xca\x94[\xbc\xfe@\x01\xceZ\xc5\xdc\xe0\xd4A{\x9c\xc0G\xd8B\x8d\xe6\xc1k\xf0\x9c\xd20\xdb\x9dP\x1c\xbb\x17\x8aS\xe91\x8d\xed\xed\x8f\xffj\xceK\xeeVi\x94\xb4\xd6\xb5^MLIj]\xeb\x19\xa5?\xd3\x1c\x196\xa0f\xcd\x12\xbb\x17\xab\x9e\xa5\xc5\xd7\xc0\xe5\xc9)\xbd\x9bG\xeaj\xf8.\xe3\xd3\x02\x1dw\xcd^\xd7v0@\xb3\xbcOs\xe5\xa6\xae*\xa1\xbdS`<[ZO\xe7\x10h\xae\xa7s\x08<\xf3\xc9\xeaL\x05\xf0\x89\x99\xc8\x92\x9b*\xb9\x17\xa9*\x95\x1b_HN\xd3*\x1bO\x00\xd1z\x0e\xd1U\xdc\x86,\xbe\xf1DXL\x0bu\xe3Ci`\x9acxY\xcd)]\xc2*\x1dR\x0bF`\x9a\xcda\xbaz\xabt\xddj3/\xcf?K3\x15\xa6\x9ab[\xd1&`k\xd43\x88LZ\xc90\xcc,\x99\x12-\x99d\x82\xd1\xc7\x12}\xaf\x97\xcc\x02\xa2\x176\x93Qi#\x8c\xfbDWr\x91^\xa3\xa6A\x95d:+HM\x9b\xab\xda\xb4\xd8:\xe5U\x052\xa5\x9f\\y/\xe7a\x15e\x8d\xcd%\xbazk\xb4\x7f}\xcfWKs\xd6\xa63\xe5\x97\nx\x18x0Y\xa9\x92\x11\xcds\x94\xf2\xdf\xeb\x03F\xd3\xca\xb9\xacM\x13\x937\x9d\xc0\x1a\xff\x16\xfa\xcb\x93t\x023\x99D0\x835\x99\xdb\x08,\x17?\xab+3\xd1<G\x17U\x0f8\xe2\xb5;\x13\x82;cd\xbd$\x86\xb0$fi\xae@s\xcag\xda\r\xae\xa2Nk\t\xdf\xb0\x93\xa38\xe4nAH\x993\xda`\xf1k\x1c\xc1\x9dk{\x9f\xebJ\xfa\xad\x85+\xef\x00\xc9\xb6z\xaa\xbf\xc1:\xc2\xb0N\x8b\xa5\xbf\x18D\xb2\x02\xaa\x19\x7f\x9f3\'\x88\x9e4\x12\xcd\xf0\xdf\xed\x0f\xe3F\xdcI\xda\x11\x9d4\x8a\xa5\xfb\x8a\xdf)\xe7\xf94\xaf\xa2G\xb7\xe4\x16\x02\x10\xaeFs\x93\xce\x845\xae\xa3W\x94\x9b\x02\xf4\xda\x82\xf1\xd3\xf2\xc7/AP\x193\xc2\xbaa\xc0\xb4\x16\x0c\xaeT.\x0c\xb6|\x18\xb8u\x15\x03\x06\xd6\xbf)\xb5\xbd\xd5J\xe4\xc0\x1d\x00j5\x15ET!>-\x00\x82\xe4\x92\x80\x02L\xd9E\x00\x98*\x03@9U\xe5vx[\x89\x0ep\x07\x80[\xaee\xc9S`\x15\x00\xd0\xd0%\xc0\x19\x00\xa5\x88.\xd7\x18\xaa\xc7_\xe5\xf1gk\xc0\xfa\x9bA\xb5\x06p\x07 5\x83J\xf6\x07V\x01\x00\x0b\\\x058\x8f\xdf\x97\x19P\x03\x10\xba\x19\xc8C\x97\x00g\x00<\xd1\x81\xf5\xf8\xeb\xf1\xd7\xe3\xaf\x15\xa0\xc3\x12\xc8L\xda\x10g\xed\x01\x10\xa1K\x803\x00\xbex\xc2\xb5\x04\x04\xbe\x08\xe4\x1a\x7f\xa9\xcdD\x04\xa3+\x18\xbf\xac\xc7_\x8f\xdfY\x01\x96\xbb\x02T\x1b\x00#\x99$\xe5\x1aA\xd5\x06@\xc0\xf0K\x0e\tW\x1b\x00\xa9\x15+\xf5;\\*>~_\x04@\xe5\x8a\x06x\xa0\x02\x9c\x01\xf0d\x11\x0c^\x00\x9c\x93\x03\xb3\xcd\xf0r\xe3a\xd5\x06 s\x84=\xd0\x81\xee\t\x92~\xa8\x00\xe7\xf1\xfb\xa2\x02j\x01\x08\xdc\x11r\x06\xc0\x975\xc0=7\xd6\x13\t\xa8\x01\x08\\\x07\xe6\xcb\x0e\xf7`\x11t\x06@H[HM\xd4\x13\x03 \xdd\x93\xa3\x99I\xbf5!\\\x00<\xd1\x81i\x879G\x00$\xd1F\x15Pr\xff\xd4\x08\xe4\xca\x8bX\xffU\xc0}\xfc\x9e\xf8\xc29\x04@JK<P\x82\xf9\xa2\xe2\x1e(\xc1\xc0\xa3\xc2\xee\xe3\xf7\xc5\x0er\x8e\x89x\xe2\x0c\xbb\x03\xe0\xc9\x0c\xa8\xc7\x1f\xb6+\x18\xbc\x00\xb8\xc7\xc4<\xb1\x01\xdc\x01 \xc2\xc2\x11\xeb\x8f\x80sP\xcc\x17\x1d\xe0\x0c\x80\':\xc0=,\xec\xc9n\x90{L$t\x00<\x99\x01\xa1\x07\xc5d\xf0;\xe2\xce\x00x\xa2\x02\x94\xf3\x8e\xb8\'\xbba\xca\xb9Y\x80\':\xc0\x1d\x00O\\\x01w\x00\xfcX\x05s\x08\x80\x1f\x8e\x80rn\x16 \x8c\x80)\x100\x00\x9e4\xceS\xb9\x8a\x85K.\x13\xa98\x00~t\x0et\x07@2a\xd8\xfa\xf7\x0cR\xa1\xd7\xca\xd6\x00\x84^.\xee\x0e\x80\x1f\xd5\xd2\xf5\x0cp\x8e\n\xf92\x03\xf2\xc5\x05=X\x05\xf3e\x06\xac\x7f\xdf0\xe5\x1c\x17K\xb3\x03\xb5\x07:\xc09*\x92m\x89\x86\x0c@\xba\xa1n\xd7\xbfo\x90r\x8f\x8ax\x02@\xaeB\t\x0f\xec\xa0\\A\x01\x0f:g\xe9\\u\x02A\x03\xe0\x89%\\\x03\x10z\x0fiw\x00\xa4%\\\xad\xbf/\xa4\xf3m\x8a\x87\x0c\x80/: \xf06\xea\xee\xe3\xcf\xcc\x80\x92k\xc5\xc8\n\x00\xc8\xd5B\xd5\x83\xec\x10w\x00<\xc9\rp\x07\xc0\x93j9\x1dx\xad\x94\xfb\xf8\x83\x17\x00_\x00\x08\xbdV\xc6\x1d\x00OT@=\xfez\xfc\xf5\xf8\xc3\x1d\x7f\xe8\xb5r5\x00\x81wP\xad\x05\xc0\x19\x00_6\x02\xdc\x8bE=\x91\x80\x1a\x80\xd0\xdd g\x00\xb2\x0ca\x0f\x00p\xce\x8b\xf0e\' \xf4&\xb25\x00\xce\x99!\xbeL\x01g\x00\xb2\xa8\xf0\xfa\x03`\xdcSc\xfc(\x17u\x07\xc0\x0f_\xc8\x84^.\xeb\x0e\x80\'v\x90q\x0e\x8b\xfb\x02\x80sH\xc8\x13o\xd8\x1d\x00Ot\xa0\xbb\x00x\xb2\x08\x06\xbe%\xee>\xfe\xacJ\xc4\x83E0\x05\x802\t\xc3\x84\xd1r\x05\xd7ELh)`j,\x02\x80dG\x19U\xc0\x14`\x14\\\x8a\xd9s\x8b\x1a\xf2\xbe\x7f\x94\xfc\x88\xbb?\x81\xd0\xd3\xba\xe9f\xfbrt\xd5;G\xcd\xc6\xe6\xbe%\xe4\x00\x8d\xc6\xed\xf3\xf8\xeb09\xbf\x18G;\xf1_\xfd\xdeY\x0c\xf0Pl\xd1\xf3\xc3\xa4w\xf5ck\xbb\xd7\x19\xf6\x93\x0e\x92\x98\xfcf\xfc\xcam\xfc\x99\x15$\x8b\xb0\x82\x1e\x1c\xbe$\xa4\xdc\xe1\x07m\x04\x86\xfe\x9dj&\xf4\xfd\xe0\x0c\x80\x905`\xe8\xfb\xe1\xee\x00\xf8\xe2\x05\x84\xbe\x1bZ\x03\x10z\x03\xd1\x1c\x12\xe0\x89\x12\x0c\xfc;\xc5\xdc\xc7\xef\x8b\np\x8f\x08I\xe1\xc1\xf7\xcb\xe7\x10\x00?\x1a\x87\xb9\x03\x90\xed\x85\x95\\&\xb8\x02\x00l\xbeb\xf1r\x1b\xe9SSe\x00\xfc(\x13t\x1f\xbf\'\x85\xb26\xf4Z\xf1\x1c\x00\xf8Q)l\xf3\x85\x04=\x90\x80|\xfdCC\x06\xc0\x93v\t6\xf4\xe6\x81\xee\x00xb\x06\xb8\x8f\xdf\x8f\xb6Y\xd6\xbdP\xd4\x93\x19\x90+*\xee\xc1\x0c\xa8\x05\xa0\x06 \xec\x19\x90\xabP.\xe4\xf1\xfb2\x01\x9c\x01\xf0e/\xc0\x19\x00O\xda\xc7\xda|\x89\x11!\x03\xe0\xcb\x14\xa8\x01\x08}3\xc49,\xecI\x13q\x9b/*\xe6\x81\x04\xd4\x00\xe4\n\x0b\x96\x9c\x19P~\xefDE\xf2E\x85\xd6\xbeR0\x07\x00^\xa4\x86\xd4\x02\xe0\x0e\x80\x1f\xb91\xf5\x0cp\x0f\x8b\x12ai\xc9\xa9\x11\xe5# \x89\x12\x88\t\xa4a\xa8\x0c[\xb8\xaa\xe5\xb0\xfar\x01\x8b#\x0c\x9b\x08\xac\x04\xa6J\xceF\xff\xfa\xcb\xd1\xc1\xc7\xd7{7\x89\xe2p\xa8\xa5E\xe4\x89\x03\xe24J\x8e.\xfa\xbd8J\x06\xe9Ss0L\xc61e-\xb6\x87\xff\x1c\x9c\x03"\x8a"+\x0c\xda\x98\xdd\xe9\xf24\xee\xfcr\x97\xc9u\xf4\xce\xf6\x9bm\x13\x01r\x8d\xfe\xdfI\xb7\xdb\x8e$&\xe8\xf9\xe4\xf2[h\xf7\xe8\x13\x9a\xbcNQ\xd2-\xdab\xa8\x9b|\x8bop{\x812\xc4?\xc7\xa7\xef\x92q$\xb9\xc6\x92b\x86\x9e\xbf{{\xdc8|99v?>\xfb\xd6\x7f\x81\xf6\x9b\xdb\x11M\xe9P\x9c0\x86\x1a\xfd\xd3\xa4\x1bG\x94\xee1\xa9Q\xb3\xfd\xb5=L"\x9b]\x81\xcf\x83\x9f\t\x82(b i\x86b\x057\xd1\x8b\xd0\xbf\x8d:+@\xfb.\x85:AR\xd0\xa2A\xb7\x8b!\x87y\x89)\x06\x1bs\x1e\xe4\'\xf1p\x94\xf4{\x91\x85\xcb\xcf\xf0\xe6\xbb\xa0\x8c\xa6pg\'\xcf\x03[du\xd1\xc6`\xa5\xb1eX\xd3*b\xcd\xad\x17X\x1b\x05\x82m\x0c\xb2\x14\x1b\x9b*\x16\x9dJ6IK\x12~\xa2\r\xbf\x9f\xa2\xdd8h6\xa7p\x13[\xc4\x16\xdb\xef\xe1\x96?\xe1f\xd2\xc2\r\xa9dk\x8e\xf9\xff\x01\xf4\xde\x9b\xa2S;\x01\x00\x1f\x8b\x08\x00TT\x97V\x00\x03]NMO\xc2@\x14\xbc\xfb+^z\x82D\xf6\xedgwWO\x15\x10\r6\x92\x14?nd\x81\x15V\n\xdb\x94F\x8d\xbf\xde6\xd5\x8b\xa7yof\xde\xcccRq\xad\x94I50K\xc12b,\xb1\x94h\rR\x08!-(\xc2\xa8$\xa9$L\x1a0\x14\x96\xe3\xc5*\xbf/\n\xe4\x94v\x1e\xad8\xcc\xa6K\xd87Mu\x85\xe8\xb7;?\xfa\x08\xdb3\xf9\x0c\xb5\xfft_d\x13\x8fh\xe8\xd4\xe8\x0c\x7f\xa9N\xf7\xf1\x8c-L\\\xe3Z\x95\x0bN\x19\x86\xc5>\x9e<\x86\xaa\x83\xa2\xaaC\xe39[\xf1\ty\xafv0\x02\xd1> \x85\xe4\x96A\xf2\xd7v\\\xfb\xed\xbf\xa6>K\xdfd\xb7\x99\xc1\x04\x92<~\x87\xb2t\xa8\x08\x85A_q\r\xe3\xc5\x13\xf43<\x16`W\x1c\xcap\xf0\x90\xbbM\xb7\xbf\x0e!\xab\xaa\xd2\xbf\xf8\xf5<4\x98RF\x18\x91)\x0c\xe6w\xcb\xfc\xe1\xb2\xf7\xce\xfc\xe6\x10\x87\xf0\xec\xebs\x88\'\xb4m|\x1e\xd7\xa1\xf4\xc8\xc4X+(\xdc\x9b\xabC\x7f\x9c\x80\xb2\x8aIHF\t\\\xfc\x00\x8e\xb0\xb7Pt\x01\x00\x00\x1f\x8b\x08\x00UT\x97V\x00\x03\xed]ko[\xc7\x11\xfd\xde_q\xe1O\t\x10\x93\xfb~T(\n\xbf\xe2\x18\xb1\x1c#\xb2\xdd\x14E!\xc8\x16c\xb3\x91EA\x92\xf3\xfa\xf5\xdd{i\'\x8dk;\xf1Y\xed\rwf\x00\x01\x12%\x8a\xe49;3\xbb;;sV;o\xa2\x0fN\xe9\xc1\x0c!-t\x8e\x8b\xac\x16Z\xe5\xc1z\x9d\x94\x1dt6\x0b\x1d\xca\x1f\x16>\x0f\xce\xd9\xe1\xd1\xad\x87\x87w\xbeyx\xef\xeb;\xb7\x0f\xbf\xb8\xf7hi\x94*\xcf5\xc6\xa8\xe1\xee\x9dG\xc3\x8b\xcb\xcb\xb3\xbf.\x97\xab\xe3\xe7\xab\xeb\xdf\xaf\x8f/\x16?\xac\xcfW?\x1c\xfd\xb8x\xb6y\xb9L\xeaN\x8a7\x96\xaf\x7f5\xfe}\xb5\xb9X\x96o\xb7\x8f.\x8f\xca_\x8dvN/\xd7\x0f_lNW\xcb\xf5\xd9\xf8\xed\xe0\xec|}\xb9\x8a\x87\xe6\xf6\xe2?g\xcf\x87\xebC\xcaC\x0ez\xb86\xbe\xd1\xc5\xf8N/\x9f\xae\x8e\xdfz\x97\xed\xeb(ec\xd6\x7f?\xd9<;:Y\xfdmuqx\xe7\xe0\xdapm\x7f\xf3\xf3\xfa\xe4\xe4h\xe9\x17j\xf8d\xfbV{\xc3\xad\x87\x8f\x87\xed\xcf\xc3W\x07C>4\xc3\xc9\xfa\xbb\xd5\xb0\x7f\xf4l|\xfc\xcd\xa7\xc3\x8d\xb3\xb3\x93\xd5?VO\xbf\\_.\x83\xd2\x0b\xbdpa\xf8\xe4\xcb/\x1e\xed\xdf\xffl\xfb\xdc\xbb\xabg\xdfm>\x1d\xf67O\xd7\'\xab\xa5\xb6\xb7\xa2\x1f\x1e\x9e\x1c\xfdtpyt\xb9\xde\x9c\x8e\xaf\xb0\xb4\x85\xd9EZ\xae.\xae\xdf9X\xaeN\xaf?.\x1f\xc8g\xaf\xddp\xed\xfa\xb5\xe1/z;\x1a\xde\xc6!\xf8\xf0\xd6x8c\\L\xef\x1e\x8f\xfd{\x07\x07\xd3@\x94\'\xa5\xa4\x1b\x0e\x84\xcd\xff3\x12:\x967,v\x12H\x8fF2\x83\xfd\x88\xb1x\xe3\x13\xe59\xb9\xf8\xcf<C\xa1\x86`=\xe1Q\xb0\xd9\xda\x02R\x1b\xb3\xf0aaty37\xf8h\xbc\xb7a\xd0:.tZ\x14K,/\x15\x86\xa4~\x19\x07\xab\xdc`\x9d\xb9\x8aA\x08&\xbe\xf9~X\x02\xe3\x83\xcd\xc3\xf5\x8f\xab\x93\xc5\xcb37\xd1\x1f\x83\xdb\xd2\xff^\xf6sy\x81\xf8\xf4\xe8\xdb\xa3\xb4|\x9b\xf1\xfb\xeb\xd3W?\xee\r7N\x8f\xcf7\xeb\xe3\xa1\xc0X\xe8\xbd\xe1`\xff\xfa\xddl\xd4\xbd\xe1\xe6\xab\xf5\xc9\xf1\xf2\xfe\xfe?]|\x8b\xf5\x12)\x16\xf6\xdd\x9c\xdfzq\xbey\xb9Z\xba\xb8P\x0b\xe3MX$\xfbz\x1c\x86\x83\xf2!\xce\xd7\xaf\xff\xf9\x9dd\x87b\xdb.\x7f4\xdd\xa3\xd9\x8f\xcf\xca:\xcd@\xf9\xe8\x81\xe3\xa7\xbevp\xf4\xf2\xe2\xd5\xe9\xf3_\t\xbb\xb8<z\xbe\xfa\xf6|\xfd\xfc\xc5\xe5\xf2\xe6\xea\xa7\xcd\xe9\xb3b|\x85\xd4\xfc\x86\xea\xdf0\xfd\xe9;)\x88\x1a\xb07S\x1ej\xab\xbd\x9e\xc3\xe4|\x99\xb4\x9b\xe2/8 \x06|\xd4\xd1\x96p4\x83\t\xe4v&\xe0L\xd8\x9a@\xf9\xa74~\xe9\x9c\xff \x01\xce\xcc\x01>\x9a\x84\x87\x9cw\x07\xf9t\xe8>\x1c\xe4\xd5\x18\xe4?\x18\xe3\xcd\x17\xbaL\x84\xff\xfa\xfc\xe6\x8d\x07\xcb\xcfo\xde\xfb\xea`\xaf\xfc\xf8d\xe9B\x89Cj\xe1\xddB\xfbP~u\xf3\xc9R\xa7\\ \xe8\\\x1e\xdd~\xf2z\x82\x8b\x9f\xe9\xf2p\xff\xf6\xeb\x87\xe5\xe7\x83\x07\xcb_>\xdf\xf8\xf0\xc92-\xdc\xf8\xc3\xc1\xd2\xee\r\x9f\xdf\xbc\xf5\xf5\xd2\x1c\xaf\x9e\x9f\xafV\x17\xe5\xb7\xf7n/\xcf^\xff\xe3\xfd[e69|<\xfe\xd3W\x0f\x97\xfe\xdf\xef\x1b\xe2\xec\xd11.f>\xcb8\xdb\x8a\xa9E\xc6y;\xcef0\xd1@\x03\xedCH\xc1^\xc9\x9a\xfaw\x07Z\x1c\xbav\xa0\xcb \x831[\xeb+Y\xac\xff\xee\x18\x07\x19\xe3\xfa1\xde.M\x00g\xd6685\xcb\x86\xc0f\x19\xe8?\xcf\x99m\x9egj\x16o\xae\x1ed[\x063\xa0\xde\xecm\x12o\xeeb\xa0mP\xa07\x1b\x1f\xdc\xf8,\x19\xe6.\x86\x19\xdd5\x1bktA"\xc3L}\x98u\nQ\x86\xb9\x8fa\xce\xe9u\x1a4\x98\x85\x1ds\xc8\xbb\x94\x01\x0b\xbeb\xc3\xfc\xde\xa4\xfb\x83\xac\xd5\xe3\xdf$\xdd\xf7\x86\x1f\xbe\xff\xc3\x89\xf7\'\xab\xf3\x8b\xf5\xe6t\xe9\xca\x9b\xbcI\xc2\xfb1\t\xef\xca\xd8\x96U\xe9\x1fL\xc2O\xd4o\x17F\x1fG\xfe\x9c)x\x9b\xf2\xff\xe5_\xb7\xf4]A\xfe\x15\xb5\xbd\xd9\x12\xf0\xae\xbcK3\xf4\xce\xf9\xf2\x16F\xd9E\xc1\xb4p\xb6|\r\xce\xeb\x98t\xb2\xbf\xb7,6W\x90\xc9(\xc1\'\x997\xdf\x0f\xa3Q\xbf\xc2Vq\x0b{r\x88[\x9b\xf3\xd5\xfe\xeax}T\x00\x8e\x01L\xeb\xbb\xc1\x0e\x9f\x94\xf8\xb8>\xbd\xdc\\\xbc\xd8\x1b\x1e\xef\r\xf7N/W\'\xbf\xc4\xccA\xab\xc3x\xe8\xf7\x86\x12~^]\xbc\x07}D\xd1\x87\xa0\xe2\x15d\xeb>\x80_\xef<\xfe\xb6\xe3\xafs{\xfc!\x0f%`\x86\x80q0=-^E\x08\xfc\x10\r\xae=\r1\xd5\x98\xc1\x15\xcc\xc1\x1f\xc0o\xb4\xe0o\x8e?\x0b~\x0c\x7fY\x05\x84\xabX\x05tK\x00w\x03\xe0\x8e_\x1c@\x0c\x80\xb7\x01\xd8l\xe3U\xe4\x13\xffd\x02\x92bn\x018\x01\xd6\xa4+\xa9K\xef\x96\x00\x1a1\xb0\xc2\x03r\xd4\xae\xed6p\xc7\t\xe0\x1e\x02\xb8{\x80\t&$\xd7?\x01\x9a\xbb\x07\xc0\x04\x10\xf1\x00\x18?{\x0f\xe0n\x00\xdc\xf1SY\x04\x19\xee\x11\x00&\x80\x88\x07\x08~\xc1\xcfz\rh\x99\x1b\x00\x8c_\x0c\x80\xbb\x01\x10Y\x03\x89\x07\x88\x07\x08~\xc1\xcf\xb5.n\x84\t\xe2\xf7>\xe5\xb6\xa7\x81\xb3\x10\xe0jf\x00\x95\xdb\x12\x90v\x99\x00\x1a\x95\x91\x15\xf8G\x0fh\\\x139\x07\x01pa\xf4x\x1c\xdc\xba(t\xa7\t\x98\x16\x81m\xcf\xc3\x85\x80\x9d&\xc0\x1b\x97L\xe3Yp\xa7\tH\xdexE\x80\x80\xc0\xdd\x05`\x02\xa6\xb2\xb0\xb6\xa7\x01\xbbM\x00\x91u\x90\xe0g\x1e\x01\x98\xb7H\xe1\xf8\xa7\xf3\xd0\xb6\xb9\xc0\xdd& \xa6\x90#g\x0f\xa0\x12\x02\xd2P\xa0b-\x82\xc9+\xa3\x1a\x17\x05\xa8\xf6\x14\xe4\x8a\xb2\x10\xa5U\xea?%\x9a\r\x9a\x12t*\xd8\xd8x&\x98\x85\x018%D\xa4@>\xd7%\x04\xfa?\x16\xc3\t\xa0q,\x82\xe37\xd9\xe5\x10\xda\x1e\x8c\xcc\xc2\x00\xbc\x16\xc8\xc9\xfaD \x06\xc4!fT. %\xd5\xbf\rx\x05w\tD\xa3\xddU(\xac\xfd\xd9\x04\xc0\x8b\xa1)/\xda}}H\x05\x01:*\xe7b\xec\x9f\x01\xbcH\xd0G\xebT\xf7s\xa1W\xbcK$*\xf0k\x1bC\xcc\x04|\x00\xdf\x0f\x90h\x99\xf6\x8a\xf9~\xa0\x82\x00\x9f\x95\r\xdd\xf7JT\x10@cK<\x9eq\xa2.\xa0\xb5\x0b\xbe\xfb\xacH\x05\x03TV\xc3\xf8\x01\x81\x0e\xd6\x98\xb6\xb5b\xb30\x00\xcb\x87\xd1h\x19\xf3\xe3]u\xac\xf3"#\x03p~\\\x97\r\x11g\x06\x88\xec\x07`\xfcD\x82\x80f\xae\x1eRC\x00\x89\xb6!!@3o\x9e\xaf!\x80H\x0c\xe0-\x1fQ\x81\x9f\xc8\x86\xb8\xc2\x03\x94\xcb\xe5\x19\xfd3\xc0\\@\xa3\x82\x00\xe7\xb3\xc9\x04\x82 \xf3\xa3\x01\x1c?\x95e\x00\xf3\xfe\xf1\n\x02h\x94I\x8c\x8f\x99\xaf\x03j\xfa\'\xb3\xe2L\x80\xd6\xd3\x87\xee\x9f\x01\xde\xd5r\x15\xf8\xa9\x04A\xfcp,\x87\x10L\xffI\xe1\n\x06\x8c\xb5\xf9*\xaeP\xee\x96\x01"A\xa0\xaa}J\xf0\x0b~\xc1/\xf8\x05\xbf\xe0\x17\xfc\xbc\xf0SI\x05\xe1\x04\x10I\x06r\xf7\x00\xde\x97K\n~\xc1\xcf|\x06\x10\x03`n\x00xq(\x95,\x18\xcc\x00\x91\x8eI\x83\x97\xc6\x11)\x0b\xc1\x19\xa0\x11\x05\r\xf3\x9b\xa5*\x08\xe0n\x00D\x1a\x85*\x08\x18\x85\xb4\xfa\x9f\x05\r\xde4N#\x15\x80\x13@e\x19\xc0\xbd4\xd0\xe0\x85Q:)G`\x16\xc4k#i\xd4\x05\x19\xb8.\x88H\xcf8N\x00\x95~Y3\xaa\xa0\xb0\xae\x0c2pU\x08\x95\x89\x10>\x14\xa02\x11\xd6\xc9\xea\x12\x08\x83\xf8\xb9X\x89\x01\xde\x11\x08\x83p^\x94H\x8d4N\x00\x95(\x88\'\x86\xbd\x1a7\xc5\xdd3`\xe1\xac\xe0t\xc3F\xff&\x80\x13@d\x1e\xb0\xdc[\x86q\x02\xa8\xb8\x00\xf3\xc4p\x85\x07\xd0H\x0bZ\xbccx\xd4e\xf7\x04b\x00\xef\xfb6G\xfc\t\xdd\x0f:\x1frj|\xd5V\xfb\x0b\'\xbd\r8\x056\x97Wil\x05\xed\xef\xd9\xf0\x16\x97\x90"q\xe7\xa4w\n\xbdc\xc2x\x1f\\\xeb\xf4x\xfb{F\xbc\xc3\xe7B"z\x92\x8e\xfb!!N\x00\x8d\xe5 \x8e\x9f\x88\xac\xb2\xc3\xd5#\xa8\xc4\x00\xe6\x02*\xec\xf1W\xdd\xbeN \'RA\x00\x91I\xb0\xea\xfay\xce\x1e\xc0\x1d?\xfb\x08 \x06\xc0\xdc\x00\xd8\x13@\xc4\x03<\x9a\x0c\xa1\xb2\x0f\xc2\xaf\x97!\xb2\x08\xc2\x05\xb4h\xd4J\x8a\x05\xc0ur\xe5\x9f\x8c\xf6\xfd\xb7M9\xbcL*\xd8\x94]\xff\x1ab\x8ey\xfb,\x8e\xdf:\x95\x9c\xee?\x1d\xe6\x99\xb7\x0ez\xe6\x05\x12\x82_\xf0\xb3\xae\x91\xc3\t\xb0J{M\xe0\xaeQ\x0f\x9f\x08\x10\xa9\x95\xf6\x0e\xdd\r\x13\xd9\x0b\xe1\x048m\xb2U\xfd\xd7J{\xe6BZ8~"\x19A\x9c\x00"\r\xf4\x1eW\x122\xceGC\xc0\x07p!\x1d\x1a\xdd\xb38\x01T\x16\x02\x157\x8d\x92\xc8\tVX\x00\x8ds\x81\xc0\xfd\x9a\xc5\x1a\x02h\xdc\xab\x10\xe0\r!\x91\xceI\x9c\x00"\xd3@\xc0\xabD\xb9\x13@\xa3e\xa6\xc2\x00TR\xd1\xb6\xb5\x809:fBU\x81D\xdbc\x919\xbaEp\xfc\xd3:\xa0q\xcb\xd4N\x13\xc0\xdd\x00\xa6|@\xe3\x080\x07\x01x}\x84s\xc6\xda\xfe[\xe6\x02\\ 1*)\xc5\xfe[\xe6B]}\x84m\x9b\x16\x9e\x85\x018)6\xe9\x8a\xb6M\t\xed6\x01\x93\x96T\xe3\xdd\xe0\x0cM\x93\xa1B_\x9cFZ\xb4\x82\x01"\xf2\xda\x91{R\xa8\x82\x00*&\xc0]G\x04\'\x80HV\x0c\'\x80\xc6\t1\x8e\x9f\xc8\xd1@4ek\x07\xae\x85r\xd2&\x12\x88\x82\xcc\xe5\x03\x04\xff`Q\x17\x08)\x8d\xaf\xd7=\x05\xcc;\xc7\x04?\\/\x1b\x956\x81\xc0$\x80\x8b\xcc\x13Y\t\x8a\t\xc0\x99Q*\xbb!\x98\x00*\x8ba\xbcyP\xbb\xe6bjs\x10\x00\xe7\xc6\xa9X\x00~8@$\x06\xe0\x16@\xa3J\x04\'\x80\xc8R\x90\xbd\x07\xe0%\xe3\xdc\t \xe2\x01\xb8\x01\xc4d9\xe3g?\xfe.e\x02\xf2\xfa\xe2\x00\xcc\xdb\xc6$\x02\x08~\xc1\xcfy\t\x08W\xc7\x18\x1d\x14\x81\x00\x88W\x07\x11\x99\x01\xb8\xf7\x0cVx\x00\r\x05\x11\x9c\x00"\xa9\xc0\xc4\\C*\xe1W\x8b\x94\xe7\xf8\xd4\xbf|F\xc2o\x992&\xc5@\xc0\x06\x98\x9f\x8b\xe3\xf8\xa9\xc8(%\xf8H\x8c\x88\x05T\x1c\n+\xad\x12\x01\x06p\r\x99\xb1[\x84\xc0B\x00\xdf\r\x12\xa9\x13\xaf`\x80\xc8\xcd\xdb\xb9\xa2Y\x82F\x18\xc8x\xaf@T\xce\x11\xa8\x13\xce\xcc\xebdq\xfcS\xd7\\\xffI\x11\x9c\x80\xb1u6\xf5_\x1b\x91aMM"E\x928\x01z\x9c\x06\xfb\x97\x11\xcaU\x1b\xc2\xfe5Tp\xfcSV\xacm\x0c\xdcm\x02&\xf9\x80\xb6\xab\x8094d2\xac AD?\x01\'`{\xc3F\xdb\x85\xd0,\x0cT\xe5D\xfaW\x91\xc9u\xb2\xba\xfd\xab\xc8\xe0\x04\x18g\xbcm=\x0f\xce\xc1@E\x89\xd0\xb8\x1b$\x10\x04\xea\x0e\x08\x1b\xaf\x04v\x9a\x00\x12\xdb\xe1\xa0\xe0\x94\x10\r\x03\xa8 \x80\xc448\xe2G\xaf\x1bL!\xea\xd6\xd2\xda\xede\x84\xc6J\x1f\xd6e2\x15\x04\x10\x89\x81\x82\x1f\xd6\xd1*\x9f\xd9v\x7f\xd3ZPpF\x8cF\x9dT\x05\x014\xb2\xe2\x15\x04P\x99\x04p\x02\xb4v\xc1\x13\x08\x02\xbc\xcb\x84\x04?\x8c?\xc5\xfe\x85#*\xe0\x13)\x10\t\n\xce\t\xd3\xb8g*L\xcd\x7f\x19\xbdg)8K\xc1\x08p\xf9\x10\x12\xd2\x01%\x94\xe3Zz\xc9\x8f\xeb\xe1\xfe)\xc0\xb3\xa2F\xf7\x7f>.\xf8q\xfc\xca\x87\xa0\xfb_\x0bi\xbcN\xcejmB\xff6\x803@\xe3\xe2Y1\x81qW\xcf\xba}0h8\'@cG\x88\xe3\'\x92\x15\x13\x03\x80\xf1\xc7H`!\x84\xe3\'\x92\x17\xd7\xccsb\x82_\xf0\x0b~\xc6\xc7BB\x80\x10 !@\xf0s\xde\x05\xc3\xc7BD\x0c\x00\xc7O$\x13\x86\xf7\x8a\x10\xd9\x05\xe1\xf7\xcd\x129\x1a\xd6\xb8\x80\x06\x91U\x00\xf3k%*\x08\xa0\x12\x04\xd8\x13\xc0\xfcR\x81\n\x02\xb2N\xaa\xff\x8bE*\x080:Xc\xbaW\x90\t\x1a>\x19\xa7!\x1e\x11\x0c\xdc.DCPr$ \x82%b6D\xe5}\xff\x8bA\xc3\xbda\x08\'\x80\xc6\x8e\xd8\xd8\x01\xac\x90#\x83\x9f\xb9\x030?\x17\x17\xfc\x82\x9f\xf5N\xc00?\x14\xc0\xf1\xd3\xd0P\xab @\xeb\xe9C\xf7\xcf\x00\x9c\x14v:\x86\xfe/X\xaa \x80\x84\x8a\xdc\x88\xdfF\xd0\x02T\xb016\x96Pj/\xa3\x16L\xd5\x15C\x8d\xc5Sv\x1a?\r\r\xadJ\x03\xe8_=F\xf0\x8b\x03\x88\x01\xb06\x80\xbaK\xc6X\x13\xe0UL\x8d\x95\x03\xe6`\xc0\xe2\xd7\n\x8c\x9db\xbe\xed^h\x16\x06j\x9a\x05\xcbGfL\xc0\xf6d\xb4qB`\x06\x159[u&\xd2\xffD\x88\xe3\'R\x1eb\xf1C\x11\x1a\xd7\xcb\x04\x0b\xe7\xc4LJ\xaeL\x04\xfd3\xc0\xfb\x9e\xb1\n\xfcV\x97\x95T \xe0\x03x\x89PY\t\xf4\x7f\xbfP\xb0\xbco\xdd\x16\xfcu\x1b\xe2\xfek\x03\x84\x00\xe6\xf7\xceK\x08\x80\xf1S\xd9\n\xe0\x1e0\xa5\x84\x08,\x83\xea\xb2\x82\xfd\x07A\x87_+@\xa3i\x0e\'\x80H\xa5\xb8\xc3s\x82$f\x01\x1c\xbf\xb61\xc4\xfeo\x1d\x0f\x0eN\x89\x11\xd1\x93u\xcc\xcb$q\xfcD:\xc6p\x02\x88\x08\xa898%\xca\x9e\x00\x1b\x8c\'\xb0\x19\xc4\t \x12\x03\x05\xbf\xe0g\xbd\x13\x14\x02\xc4\x03X\xe3g\xae\x9f$\xf8\x05?\xef%0w\x011\xf6\x1e\xc0\xbc,\x06\xc7\xaf\x8d\xf3\x91@a\x14\xce\x00\x91~Q\x87\x8bGy\xa3r\xff\'\x828\x014\xba%+\xf0\x8f%\xe2m\x85\x83f!\x00>\x14\x1fOC\x1a\x9f\x89\xcf\xd1,\x89\x130\x95E4\xee\x16\x9d\xa1D\x1c\'`+#\xdav\x1a\x9c\x85\x01\xbc,bZ\x08\xf4\xdf&\xe0\xf1^\xa1I7\xa1\xffn)_U\x17@\xc0\x02*\xeb\x02\xfa\x8f\x02\x1e\xd7\x8f\x1b\xef\xe9&\xe0\x02\xcc\xf5\xe3\x04\xbf\xe0\x17\xfc\x82_\xf03-\x10\xf7\xcc\x0b\xe3\x04\xbf8\x00\xef\x1e\xa1\n\x02hT\x85H\x08\x10\xfc\xe2\x00\x9co\x12\xf0\xcc\xeb\xa2p\xfcT<@\x0c@\x0c\x80u\x7fL\x85\x05\x10Y\x06\xb3w\x01\xe6\xa5a\x82\x9f{\x04\xc0\t\x90\x08 \x1e\xc0\xdb\x03\xb8\x13@\xc4\x03p\xd5<"\x99\x00\xee\xb7+\xe3\x04\xd0(\x8e\xad3\x00\xd5X?Y\x08\xd8i\x02\xc6I\xb0qQ\xd8\x0c\xd5\xc1\x951\xb0\x7f\x1d}_\xd5 @\xa0.\x12\xc6\xcf\xde\x00\x88\xd4\xc7\x8b\x07\x88\x07\x88\x01\x08~\xc1/\x01\x80\xa9\x01\xd4IG7n\x92\xdci\x02\xb8\x1b\x80\xe0\x17\xfc\x82_\xf0s\xc5Oe\x05$\x04p\xcf\x82p\xbfP\x14\'\x80H\x0c\x14\xfc\x82_\xf0\x0b\xfe\x8f\xc6?i\x85\xf5\x9f\x04\x08\xb8F\n\x11\x9d\x1c\x9c\x01\x1a.P\xf0k\xde*9A\xa3\x0cX\x13\xa3u\x8d{\x03f\xb8P:\xe0\r\x824TS\x03\xf7\xde\x00\x9c\x00"\xed15\x16@\xe3\n\xa9\x80kG\xd3(\r\r#\x12\xf4"9\x1f\x12\x05#\x88\xb0\\\n\x918\x80\x13@\xa3@\x1c\xc7Od&\xac \x80F\x8bDd\xae\x16\x81\xe3\x17\x03`n\x00\x82\x9f7~"\x17\x08\x88\x010\xc7\xcf\\,E\xf0\x0b~\xc1\xcfy\x0f(\x06\xa0\x0bfl\r\x94\xac5\x8d\x9b$g\xe1\x80\xb9R\x00{\xfca\xb0\x11\xcd\x87k\x1fr\xff\xca\xb9\x85\x02\xf4`\xd4\xa6\x18\x15\x81t8\xf3\xdb\x04\x05?\xf7\\ L\x00\x11\xf5\xf0X\xd5&G\xc0\x03\xf0>I"\x1e \x06 \x06 \x04`\xb7i\x9a\xb2\x8d\xec\xbf0$\xd65\n\x11\xc8\x87T\xb5\xca\x11\x88\x81\x82\x9fwiXE\x04\xf0VG\n\x93@U\xa7H\xff\xb2\x818\xfe\xb10N\xf7\x7f\xa7v\x82\xfb$|V64\xb6\x80\x19T\xf3p\x02&\x0bh\xac\x9b8C\x9fD\x05\x01\xe3,\xd06\x170\x0b\x01\xf8u\xc24$cp\x02h\xf4J\xe1\xf8\xa9\x84\x00\xf1\x80\xaa^1\x9b\xfbg\x00\xaf\x8f\xf6\xcazK`\x1a\xe0~\x9d\x9c\x10\xc0\xbc@P\xf0\xc3\xa7b\xce5^\x06\xec6~\x1a\xc9\x80\xba\x00H@B_\x0c\xa0\xeaX\xbc\xb1p\xd4N\x130\x1a@c\xe5\xb09\x92AU\x15\xa2\x04v\xc2\x82_\xf0\x0b~\xc1\x8fm\x01\xfbWN\xac \x80H&L<@\xf0\xf3\xce\x03\xd6]\'K \x06V\xb5\x88\x10p\x01\xbc8\xda\xfa\x9cl\xff\xe2\x89\t\xaf\x8d\x9c\xe4#\x1bW\x06\xcd \x9d\x97\x98\xab\xc8\xe3\xf8\x894\x08\xe0\x04\x94Y@\x9b\xc6\x851\xb30\x00\x97F\x11\xa9\x0f\xc6\t \xe2\x03\x19W\x11\xa6q XA\xc0$\xa2\xdb\xb6,`\x16\x06\xf0\xca\x10a\x80\n\x03\xdc\xa5\xf3p\x02h\x9c\x8b\xe3\xf8\x89\xa8\x87f\xf8X\x8cH\xa3\x04N\x00\x11\x0f\xe0\xae\xa4\x9e\xeb\xf2\xe2\x04\xe6\x00\xee\xe2I8\x01\xc6\x98\x14\x03\x81 P\x91\x1aO)G\x02\x1bB\xe6\x02Z\x99\xb9x\x12\x8e\x9fJ\x10\x14\x03`] (\xf8\x05?\xeb\na\x9c\x80)\'\xde\x7f\xbb0N@L!\xc7\xfe\xab\x03r\x9dtX\xff\xb7\x0b\xe3\x04\x10\xa9\x0f\xc1\t\xa0q6.\x06\x00\x13@\xa4_:\xe3\xf51D,\x00&\x80\xca$\x00\x13@D4\x03\'`\xd2\x8d!`\x01x\x81\x10\x8dJ\xf1\n\x02\x88\x04A\xe65\x828~\xe7\xb3\xc9\x9c\r\x80J\x08\x80+\xe4\xa8X\x00L\x00\x95\x18\x08\x130]\xaa\xc6\xd9\x05h\xec\x85\xa2b.\x1fWA\xc0T\'\xcd\x99\x00\x1aA\xb0\xd6\x05\x1a\x1f\x0b\xb6\xef\x96\x89\xaaJ@\xb0\xfbcQ\xc1/\xf8k\xd6\xc1\xdd\xd7ET\x10@\xa3<\xb0\x86\x00\x12\x951Q\xf1\xae\x91\xaf\xc0O\xa3Y\xac\x82\x00*!\x00\'@B\x00\xef\x10\xc0\x1d\xff\x94\x0b"\x10\x01p\xfdH"!\x90w\x9b\x90\x18\x00N\x00\x8dNA\xf1\x00\xc1\xcf<\x020\xef\x93\x13\x02p\x02\xa8\xec\x84yw\xc9\x89\x07T\x10\xc0}\x12\xa0\x92\x0fg\xde(YA\x00\x91\x18(\x06 \x06\xc0{\x0e\x80\tH\xde\xf8\xc6\xad\x92\xb3\x10\x807\xca9\xe3m\xe3\x02\xe1Y\x18H\xa31\x83^\xe0\xb2+/\xd2oF\xe8\xbf\x13\xfcgz\xba\xaf\x02\x00\x1f\x8b\x08\x00VT\x97V\x00\x03\xed]\xefO\xdbL\x12\xfe~\x7f\xc5\x8a\x0f\xd5[\xa9\xacwf\x7f\xbf\xa8:\x11(m\xdf\xb7PtPz\xba\xd3)\n\xc4\xd7\xe6\x9a&Q\x92\x96\xea\xfd\xebo\xd6N(\x81\x10\x1b\xdb1\x86\xa6j0I\xec\x90<\xcf\xce\xcc3\xb3\xb3\x1bP\x1a\xad\xd6\x1e4\x13\x0cPq0\x8e\xa3\xd0t\xb3Lk\xe7\x9cR\x0c@p\x94\xc8\xc1z\x8e\n\x98\x13\xect\xef\xb8\xfd\xe6\xedi\x84\xc20\x8d\xc8^\xbf:e\x9f\xa7\xd3\xd1\xefQ\x14w?\xc5\xdb\xdf{\xdd\t\xbf\xec\x8d\xe3\xcb\xce\x0f~1\xfc\x1a9\xf1\xca\xd9\xddh\xf6Px>\x1eN":\xecw\xa6\x1dz\x16\xbc\x100?\xb6-\n\xfeu\xa4\xd86\xbd+K\x7fqk\xfe\xda_\xcf\xe3\xee\x8d\xd7M\xaf<H\xfe\xfd}\xf2\xa57xyB?Z\x9dq|>\x1c\xc4\x93g\xc95\xef\x86\x17/w[{\xcf\xba\xbdI\xe7\xbc\x1f\xbf\xfa1\x8d\xc7\x83N\xfft\xdc\xb9\xa0\x93?\xbd\x9c\x8e\xbf\xc5\xcf&\xdf\xce\xa7\xbdi?\x9e\xbc\x9c\xfd\xb9\x89\xdc\x8e\xbfm_\xc6\x93\xe96\xf0\xce\xd7\xce_\xc3A\xe7r\x92\xfc\xddI\x7fx\xbe}uA4\x89/\xc6\xf1t\xdb\xd0y\xdf\xa7\xd3g\xa3\xcedr9\x1cw_\x9e\xbc\x13\xadg[l\xebp\xf8W\xaf\xdf\xefD\x9a\x0b\xf6\xdba\xe7\xa27\x98\x0e\'\x9fw\xd8\xdb\xc14\xee3z\x80\xbd?a\xffd \xda\x00mx\xcevG\xa3~\xfc1>\xff\xb37\x8d\x8c\x00\x8e\xdc\xb2\xdf\xfe|sz\xf8\xee\x05\xeb\xf7\xbe\xc4\xecu|\xf1e\xf8\x9c\x9d\xc5\xe3Io8\x88<\x17\x1c\xd8I\xe7\xbf\x9dqo~\xc1\x16\xd3^\x83b[\xdb[\xeco\xf0\x93h\xa3\x8a2-=z+\xc4z\xd9\xb6\x1b\xb6\xabc\xdb0\xd0P\xd8\xb0\xb5\x03pv\xadtk\xb1\xa1\xbbJ\xba\x0b{q\xeb\xd6m\xd8f\xc3t\x95L[[\xd8\xae\x85VF\xb9\xf5\xda5n\xd8\xae\x8amk$A\x8aBr\x10D(\xdd\xc0 \x03c\xd1\x90\x7f\x07\xcb\x81\x86\x80\xd4\x1c\x08\xf4kTK\xa1\x98\xb4P\x9ef\x04\x8f6\xea\x1d\x7f&j\xa2\xde(\x1cNF\xe3\xde4\x06\xd5\xc6}\xfe\xbf\xd1\xa7\x94s\xefVr\x9e\xbe\x8c=\xa7\xcf\xeb\xa2\x9b\xf0\xa6\xaf\xbe\xc3\xf6\x8e?\xb0\xf4\xf7\x00\xaeoc\x8a\xdc\x1c\xec\xdb \x03\'\xc7\xb2\x0c\xe5\xc3\xe1y\xaf\x1fG \xf7\xacf\xff>h\xed\x1eE\x07\xad\xb7\xefOv\xe8\xd7\xb3H\x19\x02_pM\x06\xa4\r=\xd4:\x8b\xc0y\x8b\x0e<\xdd\xdb?\x9b}\\\xf3\x02\xe9\xee\xe1\xfe\xec.\xfd~r\x14]\xbd\xbfp\xf7\x8ch\x0c\xe7\x9c\x9cD\xb8\xc3\x0eZ{\xff\x88NF\x9d\xf1\x97\xa3\x7f\xd1\x83o\xf7\xa3\xd1\xec\xbaw{Q<h\x7f\x08\xd7\xbc?\x8e\xf4\x7f\x96\x11\xedd\xea\xc0\x81{\x17\xfe\xa3\x12\xd94\xa3HN2\xbe>\xa6M\x86/\xcf`\xba\xd3My~h\x82;]\xfdB\xce\xe9\xa57\x95\x8b\xdc\x94\xd5ipH\xd3[\xb4\xc2rZ\x9d"\xd0\x94\xe5\x16\x83\xe5\x92\x05\xabf\xd2J~\xe6\xf1\x18\xb0N\xf8\xa5\x83\xbf\xa2\x17\x9d\xd7v\xc1~u\x11\xfb=\x1bv;\x85\xcc\xd7c\xf0\xd3\x88\x81K\x8e\x14\x84\x13\xf1\xddH\xa6K\x19\xf02\xa6][\xaefZ\x04\xa6W\x12\x8d\x07V\x14%\xda\xe6 \xdaq\x99\x97\xe8\xd7\xadUD{\xe3\x12?\x8d\xdcP\xd0\x06$/\xd3\xbcplH\x086\xc8\x9a\xaf\x89\x9eE\xcb\xbe\xa6\x7f`\t\xd8\x86\x0eL:-f\x99\x8dut3\\Z\xa6\x9c\x04g\xa4ZiZ'

for i in xrange(200):
    try:
        pd.read_csv(StringIO.StringIO(data),compression='gzip',delim_whitespace=True)
    except Exception,e:        
        print(e)    

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

can you cut this down

@alessiodore
Copy link
Author

I am not sure how I can give you a simpler example. I can reproduce the segmentation fault only considering the file sliced from 0 to 9657. If I get the characters even from the first one to the end of the file [1:len(log)] I don't get the segm fault. Also no segmentation fault if I consider the file from 0 to 9656.
The file is corrupted so I cannot extract the content. I get this file from a third party service and I cannot recover the original content.

The parser seems to detect that the file is corrupted but when I try to read a certain number of corrupted files at some point I get a segmentation fault.

Unfortunately, these are all the information I have and this is the only way I could recreate the problem.

@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

ok, this is reproducible. thanks for the example.

@jreback jreback added this to the Next Major Release milestone Jan 20, 2016
@jreback
Copy link
Contributor

jreback commented Jan 20, 2016

if anyone is interested

cc @mcwitt
cc @guyrt
cc @behzadnouri
cc @mdmueller
cc @selasley
cc @evanpw
cc @kawochen

@alessiodore alessiodore changed the title Core dumped in read_csv (C engine) when reading corrupted gzip file multiple times Core dumped in read_csv (C engine) when reading multiple corrupted gzip files Jan 20, 2016
@selasley
Copy link
Contributor

The segfault with python2 is caused by the Py_XDECREF(RDS(rds)->buffer); line in the del_rd_source function in the io.c source file. The reference count for rds->obj is explicitly incremented in new_rd_source() but I haven't found where the reference count for rds->buffer is incremented. Removing the Py_XDECREF(RDS(rds)->buffer); line in io.c allows the example code to run without a segfault. Does anyone know of a good reason to keep the call to Py_XDECREF(RDS(rds)->buffer) in the del_rd_source function?

@wesm
Copy link
Member

wesm commented Jan 25, 2016

@selasley I just looked this over. In the line which creates buffer:

result = PyObject_CallObject(func, args);

This returns a new reference, so the reference count of this object should be 1. The problematic thing I'm seeing is actually this block:

    if (result == NULL) {
        PyGILState_Release(state);
        *bytes_read = 0;
        *status = CALLING_READ_FAILED;
        return NULL;
    }

From first principles: If rds->buffer was just garbage collected, then PyObject_CallObject fails, the rds->buffer is never set to NULL, and calling Py_XDECREF again would cause a segfault. Can you try setting buffer to NULL in this case and see if that fixes it?

@wesm
Copy link
Member

wesm commented Jan 25, 2016

To be on the safe side it would be better to always set src->buffer to NULL right after line 123 in io.c

@selasley
Copy link
Contributor

I put the call to Py_XDECREF(RDS(rds)->buffer); back in del_rd_source() and added the lines you suggested
/* delete old object /
Py_XDECREF(src->buffer);
src->buffer = NULL;
args = Py_BuildValue("(i)", nbytes);
...
/
PyObject_Print(PyObject_Type(result), stdout, 0); */
if (result == NULL) {
PyGILState_Release(state);
*bytes_read = 0;
*status = CALLING_READ_FAILED;
src->buffer = NULL;
return NULL;
}

The problem code runs without segfaulting and all tests pass in
nosetests-2.7 -v --tests pandas.io.tests.test_parsers

@wesm
Copy link
Member

wesm commented Jan 25, 2016

Cool, I think just that one line src->buffer = NULL; after garbage collecting src->buffer should be enough. Can you make a PR? Thanks

@selasley
Copy link
Contributor

Will do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug IO CSV read_csv, to_csv
Projects
None yet
Development

No branches or pull requests

4 participants