tirolerstefan / kaifa

Read out Kaifa smart meter
MIT License
25 stars 14 forks source link

Interval seems to not acutally change anything #11

Closed boredomwontgetus closed 2 years ago

boredomwontgetus commented 2 years ago

Hi Stefan!

To me it looks like the interval does not change anything. Here is an example with an setting of 5 for interval.

2022-01-19 14:19:44,615 [INFO]:  1.8.0: 2494.595
2022-01-19 14:19:44,616 [INFO]:  2.8.0: 23.829
2022-01-19 14:19:54,420 [INFO]:  1.8.0: 2494.595
2022-01-19 14:19:54,420 [INFO]:  2.8.0: 23.829
2022-01-19 14:20:24,822 [INFO]:  1.8.0: 2494.595
2022-01-19 14:20:24,823 [INFO]:  2.8.0: 23.829
2022-01-19 14:20:34,756 [INFO]:  1.8.0: 2494.595
2022-01-19 14:20:34,757 [INFO]:  2.8.0: 23.829
2022-01-19 14:20:44,396 [INFO]:  1.8.0: 2494.595
2022-01-19 14:20:44,396 [INFO]:  2.8.0: 23.829
2022-01-19 14:20:59,377 [INFO]:  1.8.0: 2494.595
2022-01-19 14:20:59,377 [INFO]:  2.8.0: 23.829

BR Tom

tirolerstefan commented 2 years ago

Does it change when you restart the program?

boredomwontgetus commented 2 years ago

This log is from a run after a restart. Hence, it does not change after restarting the script.

tirolerstefan commented 2 years ago

Do you have the latest release - in former releases I had a problem mixing up the frames which lead to such a behaviour.

Is 2494,595 you current positive active energy (incoming, consuming energy) value or does the script parse the wrong value out of the stream? Could you post the script output with some decoded streams / telegrams?

It's very hard to say what causes this when I don't have the full data - on my Pi it's working like normal.

boredomwontgetus commented 2 years ago

I tried again with todays latest commit. No change it looks like.

Yes, 2494,595 is the energy drawn from the grid as long as the meter exists. This looks fine to me. Please find attached a logfile in DEBUG of one run. kaifa.log

I hope that helps. Let me know if you need any further data or if i understood you wrong.

Thank you.

boredomwontgetus commented 2 years ago

Just for the record, i went with another extreme and set the interval to 3600. This is the INFO output of this run:

2022-01-20 08:55:44,250 [INFO]:  1.8.0: 2516.063
2022-01-20 08:55:44,251 [INFO]:  2.8.0: 23.83
2022-01-20 08:55:54,968 [INFO]:  1.8.0: 2516.064
2022-01-20 08:55:54,969 [INFO]:  2.8.0: 23.83
2022-01-20 08:56:14,498 [INFO]:  1.8.0: 2516.066
2022-01-20 08:56:14,498 [INFO]:  2.8.0: 23.83
2022-01-20 08:56:25,077 [INFO]:  1.8.0: 2516.07
2022-01-20 08:56:25,078 [INFO]:  2.8.0: 23.83
2022-01-20 08:56:55,114 [INFO]:  1.8.0: 2516.071
2022-01-20 08:56:55,116 [INFO]:  2.8.0: 23.83
2022-01-20 08:57:09,425 [INFO]:  1.8.0: 2516.076
2022-01-20 08:57:09,427 [INFO]:  2.8.0: 23.83
2022-01-20 08:57:29,915 [INFO]:  1.8.0: 2516.079
2022-01-20 08:57:29,916 [INFO]:  2.8.0: 23.83
2022-01-20 08:57:39,197 [INFO]:  1.8.0: 2516.082
2022-01-20 08:57:39,198 [INFO]:  2.8.0: 23.83
2022-01-20 08:57:49,255 [INFO]:  1.8.0: 2516.084
2022-01-20 08:57:49,256 [INFO]:  2.8.0: 23.83
2022-01-20 08:58:04,771 [INFO]:  1.8.0: 2516.086
2022-01-20 08:58:04,772 [INFO]:  2.8.0: 23.83

What confuses me a bit is that interval is used in https://github.com/tirolerstefan/kaifa/blob/938aaed0f5529ab624ab7d7dcd3159efe2555c58/kaifareader.py#L362 only as the timeout. As far as i understand this only sets the read-timeout for the serial connection but has no impact on the interval we loop for data. Am i confusing things here?

tirolerstefan commented 2 years ago

As far as i understand this only sets the read-timeout for the serial connection but has no impact on the interval we loop for data. Am i confusing things here?

Yes, you are right, that's just the read timeout of the serial connection. Because readline() is the only blocking call in this loop, the timeout of (default) 15s defines the loop interval (if no data is received).

It looks like a higher value here helps you receiving the correct data.

In my case, the meter sends data every 5s (as described here), so the 15s timeout should be fine for me, because data are received before timeout is reached.

What interval does your power meter use to send data?

boredomwontgetus commented 2 years ago

OK!

According to this my Meter also sends data in 5s intervals. However, i only receive it about every 9s to 14s.

This (less polished) project for example does give me data every 5s. But i can't make out why this is. I noticed some comments in your code about waiting for the next 'frame 1'. Is this maybe the reason i see data less frequent with your code?

I was just confused by the config name '''interval'''. Do you think renaming it to '''timeout''' or '''serial_timeout''' would avoid such confusion in the future?

tirolerstefan commented 2 years ago

I noticed some comments in your code about waiting for the next 'frame 1'. Is this maybe the reason i see data less frequent with your code?

Yes, maybe. In my case, the smart meter sends data like "... FRAME1 - FRAME2 - FRAME1 - FRAME2 ...". I need both frames to decode the whole message. To be sure to get all data of frame 1 and succeeding frame 2, I have to wait for the next frame1 - then I stop and start decoding the pair FRAME1 / FRAME2.

Renaming is ok for me, but did we solve your problem with a higher timeout, now?

boredomwontgetus commented 2 years ago

Ok. I see. So, the initial problem with the interval is not a problem anymore because i learned that the interval settings does not actually set the interval. This is perfectly fine for me.

Now i am going to look a bit into why i get data at such random times. I have to look a bit more to the code for this.

boredomwontgetus commented 2 years ago

So, just FYI to keep you updated.

I always see data in very random times. Like i said...most of the time somewhere between every 9-14s (with a few exceptions of even longer periods).

I played a bit with readline and noticed if i ditch stream += g_ser.readline() for stream += g_ser.read(size=282) i get constant data exactly every 10s. All the time. This is not every 5s as we actually expect it but at least its constant.

boredomwontgetus commented 2 years ago

Now i managed to get data exactly every 5s:

  1. used read instead of readline as shown in the msg above
  2. i now can set hardcoded values for the the frame start positions:
    frame1_start_pos = 0          # pos of start bytes of telegram 1 (in stream)
    frame2_start_pos = 256          # pos of start bytes of telegram 2 (in stream)
    next_frame1_start_pos = 282     # pos of start bytes of NEXT telegram 1 (in stream)
  3. remove these lines:

        frame1_start_pos = stream.find(g_supplier.frame1_start_bytes)
        frame2_start_pos = stream.find(g_supplier.frame2_start_bytes)
    
        if frame2_start_pos != -1:
            next_frame1_start_pos = stream.find(g_supplier.frame1_start_bytes, frame2_start_pos)

this leads to reliable data every 5s on a test run of 1,5 hours. I am just unsure what negative implications this would have on your meter.

tirolerstefan commented 2 years ago

Honestly, there is no sense in using readline()for reading binary data from a stream.

The difficulty for read() is to find the best byte number that on the one hand doesn't produce much overhead, but is not so high to wait too long. But maybe it doesn't matter for reading a power meter. Our frames have a length of about 100-300 bytes, so maybe we could start with n=100. Could you try whether this size is ok for you and/or play around with other values if not?

If you have a commit or PR I could also do tests with my meter to see whether it works. Afterwards, let's finalize this in a new release.

boredomwontgetus commented 2 years ago

Yeah i thought so. Thanks for the clarification tho. I am on my way of implementing a way to read data in chunks.

For me the most problematic implementation is the way we get next_frame1_start_byte. This leads to missing every 2nd segment.

This is where i need your opinion. IIRC, you wait for the start of the next frame1 to make sure the last frame2 was fully received. But, i think (looking at the "datasheets" for EVN and TINETZ) the last byte of the sequence is always 16h. Hence, we can check for the sequence to start with frame1_start_bytes, consists of frame2_start_bytes and ends with frame2_end_bytes (16h).

This way we can be sure we received the whole segment and can start processing it. Which in turn brings us the benefit of dropping the "waiting for next frame1" logic. Do i miss something here? (If you think this is a viable way i can send you a PR to test pretty soon i think)

edit: ok, i just noticed that on some occasions frame1_start_bytes is not at the start of the sequence due to us starting the script right in the middle of a sequence. So i think the right way to check would be more like: ...sequence consits of frame1_start_bytes, consists of frame2_start_bytes and ends with frame2_end_bytes (16h).

tirolerstefan commented 2 years ago

The problem is, that you could also have the 16h in between the stream (?)

tirolerstefan commented 2 years ago

I cannot imagine that frames get lost because of waiting for next_frame1_start_byte. In this point I think the approach is ok as it is. It's not safe to search for 16h.

Example (two frames starting with 68010168 and 680d0d68, I have marked the 16h in the middle of the second frame):

68010168 53ff000167db085341475905e8b4cb81f820001f37e404ef8e2b3c504b862829b40c41466aafa42b6b941221dcc367c13c944f9460398acf5405790e61b6c19840bc8f30ae38d7ea8848d594e83ad811abdda2911d2c271b5898453b207b8cb34831a49cb1dd559f947693c65a7bb042b151090316cc55057995204411386af136045ec58bbca2732423533b46580f9b507febcb13c8117e3daf34c922039b0f56658b93a94a4250a713e11b8db1f4d97a08a6f4975d90aa15b4f1688067e17f7b0b36b3bda2d02d5ee1a86761ab4cb612aa4f2270d4487724a80ef76b763603bc40643a6c637dfe0a4091671ee421b3a02a23a2a7c294c08ad768e8e907cc22442e16 680d0d68 53ff110 16 7a5c6b371d2958ce835 16

I would like to test the read() function with a chunk of bytes. This has to work.

boredomwontgetus commented 2 years ago

yes. you are right. 16h could be in the middle of the segment. this is why we test only for 16h at the end of the segment. when we read in chunks we can tell the end of the segment is reached when the chunk_size_we_actually_got != size_of_chunks_we_tried_to_read.

however, i will try to send a quick PR today and you can check it.

tirolerstefan commented 2 years ago

Works perfectly. Thanks for your input!

boredomwontgetus commented 2 years ago

You are welcome. Thanks for testing and feedback.

I think we can close this issue?!

tirolerstefan commented 2 years ago

No, today the script stopped working. I have to investigate that.

boredomwontgetus commented 2 years ago

Oh OK, hope you'll find it. Did not happen to me yet.

boredomwontgetus commented 2 years ago

any news, stefan?

tirolerstefan commented 2 years ago

It's running since these 12 days without problems. I would like to observe it some more days.

tirolerstefan commented 2 years ago

Ok, I will merge it because of #15

tirolerstefan commented 2 years ago

Again I have this situation where the script gets stuck.

The log file is filled up with 7MB of serial data, like:

2022-02-21 20:07:20,284 [DEBUG]: received chunk: b'\x87.}\xc1\xf6\xf0K\xf2\x16i=\x8f\x05\xc0\xa8H\xd5^>\xa7]\xf4\xd1\xa9\xda\xb8 %\xc9Jh%G\xc7\xa9\xec\xcf\xdf\xbd\x0e\xd7\xee\xb7\x16\x1a\x10\x87\x1a\xa3\xdd[O\x1e8e\x1fi\xb1\x029\xfe\x97\x9es\xd4\x95,\x0eA\x93j\x96\xda\x17\xc8\xeb[:\xee\xc8CD\xec.\xa4y\xbb~?\x99\xcb\x8f?Q\xe3=\x80\x948s' 2022-02-21 20:07:20,345 [DEBUG]: pos: 120 | 0

2022-02-21 20:07:19,642 [DEBUG]: incomplete segment: b'hrrhS\xff\x11\x01g\xb9)\x1e\xd6\x0b\x9e\xffE@kTonX\xf5\xe9\xa3\xce\xad\xfc\xf4$\xc2\xec\xf0\x98(h\x11\x02?\x95\xac!i\xfd\xb4E\t\xaeA\x02NzLR\xb33\x8f\x82\xb0\x9b|\x0b\xb4\xcf\xf2\xde.bv\x92\xf0\xea\xbd\x84\x10"s\xef\x92TM\xa9r\xa2\xbd\xcfq3\x1b\xdf\x1d\t\xc9\xa9\xf8t\xfe91\xb2\xab\xbe\xfa\xb9U\xe5\xde\xd6\xc5\@\x1d\x1a%\x11nB.\x16h\xfa\xfahS\xff\x00\x01g\xdb\x08KFM\x10 \x011c\x82\x01U!\x002H|H\x16P}\xf9\xf1\x8a\xaf(\xda(!X\xf1\x8f\x04\xa4+\x05\xdc\xaa\x081\x84\x907bP\x1en\xfbW\xe7T\xa3\x82,\xbf\x0e\x98\xa8\xd4\xa5x\x91b\xf2\xf5\xf3y8\xe0L\x8f\x1f\x98\xe2\xbb^_\xd7\xb4\\\x0bD"\xf0{\xed\xf1\x94Z\xe0&Q\xaa\xeb\x95\x00m\xc8\n+\x00\x82\xf1Z]\xd8\xc6\xeax\x81\xd4\xfe\x87\xdc\x87dv%c\xc7\xf02\xa4\x06\x96Z\xb2\xce\x00\xd6\xa8\xda\xfd\xe8! \x05\xc3n\xf9\x7f\xf1d\xf8gZ\x00\xee/>\xc8%h9\xa3\x1d<YL\xe36\x19\xb7#\x10&/\x12\x91z5\xdc=l\x02\x8b\x99\x036\xa2\x9e#\xb9\xc5\xef\xe7T\xcaO\xc0\xeb\x02\xbe\x90V\x99\x8aB\x01\xd2\'\x99\x06o\xe1\xcf\xe0\xd8\xd7S\xfd\xd7tD2\x05\x1a\xbe\xf0\xe7_\xe7\xcb\\@\xedd\x99\xadI\x95\xc8\xbe\x015\xac\xa1\xa4l\x88\x98*\xe7I\x16hrrhS\xff\x11\x01gi\xd8\xf2\xcc\x1f\xed\x7f\x16\xe1\x02\xc2r\x06\xe0Q{\x0b\xd2\x9d\x1a\xdd\\\x9b\xadKO\xb7ZH\xc4?\xf5n\x12\x98\x04#\x9a\x88s\x97C\xd8\xf3\x1c\x9a\xb4\xe7\x7f\xb9]|\x07\xd1\xbdi\xa3~4C%\xe4 ;\xc6\xfeuu\x83\x87I\xc2j\x1d\xf4\xd3\xa9 (Y\\M\x193\x1c\xb2\xd8\xa1T)\xee\x10\xbbKg~\x89Jo.\x94\x16\'\rI\xf92\xfe\xc6\x8c\x16h\xfa\xfahS\xff\x00\x01g\xdb\x08KFM\x10 \x011c\x82\x01U!\x002H}\x90M\xe0\xa9\xab\xec\\]\xdb\xe2\x7f\xe28\xc2\xe20\xb4\xfe\xad5\x91\xa5\xec\xe2\x11b5\xde\xdb\x93\xff2\xc1zD2G#\x0bU\x13A\xac7O\xa9\xe0q\xe9\xa2\xf7b\xa2\x97A\xd7u\xacJ\x0e\xa8\xe1\x0f\xad\x1b\x958r\x02\xceL\x0fR\x1dS\x82\xef\x8eK\x92\xdc\x14u\xeb\xf3\xf6\xfe \xd1s\xdb\xa8\xa5\xfd\xd2.]}[\xed\xee\xad\xe7\x9f\x85\xce@\xf8\xd6d\xb07\x05a\xacdj\xd1\xa87!\xa0\xd2M\xc9\x8f\xdf\xbfJ{\xd0c\xfc\xaa4\x8f8\xe8\x87\xa1qe\x15t\xf0#\x8c]\xb4>0\xbc7\x07Z\xb0\x1fy\x89\xe5HM"\xf1\xcf[\x1btH\xc9\xdd6v(!\x8e\xf0a\x03\x0c\x13\xe2\x08Cp\xfa\xa9\xa4\xb7\x08I\xd4\xc0\xb6\x9dg\xafV\xda\xf4T\xf1\xc5\x82Mr\x9a\xfc6\x04\xfc\xed\xd4\x11\xf8N\xd0\x03Ym\xf7\x91\xeb\xa3uj\xb0\xe2\x16hrrhS\xff\x11\x01go\xc1D_\xd3\xbe\xea\x07,\x15\x05cnM~\x9edj\xf0\x8f3\xd3+o[Y\x9c\xb4q\xc1q\xddB\xb9\xfa\xd4\xd9\xed!\x07\xf5Dv\x1c\n\xf4f:L\xe1\t\x8d\x02\x97\x8b\xd9\xa7\xe6\xfe\xf7\xb7>\r\x13\xfc\x81\xfb+\xd2Ba\xcf\xa2<<\xa7\x86\xa4\x8dj1\xd1\\x8d\xfbgM.\xf0eh\xbb#\x130B\x8c\xe7\x89\xcf\r\x89\x84\xdb\xb1\x88]\x15\x04\x16h\xfa\xfahS\xff\x00\x01g\xdb\x08KFM\x10 \x011c\x82\x01U!\x002H~\xe8Q#r52\xf2\xf3\x11\xe2\xe9\xaf\xd2`A\xc5l|\x934\'\xcf\x10\xb8y\x10\x8b\xea\xcfG\xf0a\x80\x97y\x16\x99.>\xab\x0eq\x9eO\x10\xf5@\xd1\x04\xe3O\xb3\xea\xca\xb1[\xfc0\x9d\x99i\xac%\x83La\x93Cv\xc1\x9eanf\x08\xb0M\xdf\xad\xf9\x05\xdeT\xceU\x0eV\xb5\xf5\x16m`\x17\x08\x11\xb5\xcc\xdb)\x1eK5H\xde\x9cL\xecm\x9a\xbe?\x12\x82_\x8f\x9a@8\xb5\x9e\xaaM\xccE\xd5\x83\xc5\xee]\x8ce\x9a.\xd4\xc3!Q\x1d\xa8n/\xa2R\x8a1<\xacRJz=\xf4\xeeD\xfa\xe6yD\x9aw\x06\xa0Kut\xdf\xfa\xe2\xdd\xefK\xed\xa0_"\xb7i\'\xde\xa7.S\xe6^\xf7\xc2\x9e\xa5Dk\x19h\xd0\xa6]\xdd\xd4\x11\x05:\xfem\xf5\xe6ZY}\xe3J\xc6\x9a5\xb3j\xd4|\x00e\xfb&\xd8\xca0\xbe\x16\x16hrrhS\xff\x11\x01g\n=&\x16I\xb7d\xac\x1em\x0c\xd0\x8f\xa4\x0e\x88\xb3\xc5\x17\xdf\x88O\xef\xa9s\xda@\xf6\x80\x10\xc8\x99A\xf8\xb5\xf1{\x8d\xa4<?R#\xe5wk\n\x95\x97\xc9\xf3\xd1zp-\xcc`J\x02\x0bCl\xa6\xf0(\xd1\xb9\tp\x1a\x03\xd7\x19\x97\xf1\xf9H\x80\x1d\x0e\x1a\xb8]\xff\xe9\x8a#K\x94\xf7\'\x14\xb4K\xbf\xfe\x08\xc1\x11\xfb\x05O|\xa7\x1e\xc7\x11o\x89:\x16h\xfa\xfahS\xff\x00\x01g\xdb\x08KFM\x10 \x011c\x82\x01U!\x002H\x7f\x14q~\x04\xb4\xa7\xd1\xcb\x08<\x1f\xe6S\xc0\xf1\xe6[!\xde\x181\xdb\xb7\xeb1\xa6\xbe\xeb&\x0b\xf9\xd0\xb3\xae6L\xbf>\x18\x92\xf7\xa0x\x9e\x8a\xed\x82G\xd3w\xba\x99\xa7\xfbaCC\xab\xeet\xe4\xee\xd8o\xb7\xbfC\xb6\xa6\x9a\x95\x85\xde\x0fE\x9e\x7f#J\xdb\xe0\x99\xf2\'1\x1f\xfd\xe2ZMd\xe8"\xba\xc2&\xcc.\x17u\x06\xbcO\x11\xe5Jg\xf3C\xa3\x1e\xdfS@\x99\x8a\x96\'b\x8e\xd9\xc1O\xccg\x83\xc7"\x0c\x87\xf1\xd6\xc1\x86\xa1\x8a\xe7I\xed\x1b\x16\xed\xe0\x8b\x15\x15\xb0\xe2dq\xd9bs\xa0\xaeW\xc4Zd\xbe\xbd\xe7\x13\x0c\xa7L\xfcg\xdfVG\xb7\xe6\x1e\x9b\x84b\xba\x11\xd0\x12\x7f\xe1\xfa\xa5\xe5^\x03/\xa8}o\x02\xcajU|\xc3\xa92p\x1f\xe3\xca\x859r\x9e\xa1\xf8\xd4\xce\xdc#\x94\x1c\xae\x9f!\xae\x1a\xa7\xe1\xba\xe52\x16hrrhS\xff\x11\x01g\xe8\x81\x85\xd8\xe8\x02X\xab\x91\x9f\xc2\x07\xad\x81U\x98)\x81\x9ci\xaaS\xab\x99\xc7F:J\xdeI\xca\xb2\xfbDB\xf5\xe5\x92\xeb\xc9\xf7\xb7\xae\xbf\xe5@\x8a\x19\x19\x0ff\x9am\xf4;\x10K\xb7\xbc(\xf9\x8c\xb5\xc1\xf4=\xa6\x90x]\x07\x11\xef]0^\x9d\xb7\xd0\xf5\\xca\x8b,f i\xfdI!rw\x00\xbb\xe8\xbd=\x93>\x15\xc4;\xecJ\xf7*\xe1\x06q\x16h\xfa\xfahS\xff\x00\x01g\xdb\x08KFM\x10

After stopping and starting the script, again, it works.

It looks like the stream increases without falling into the loop abort condition.

tirolerstefan commented 2 years ago

Added additional logging, increased rotating log files and size, watching again...

boredomwontgetus commented 2 years ago

i think i have seen this once during the very early stages of testing. the stream just kept adding up. i've seen this when i played with different timeout to chunk_size settings. IIRC this happend when i got to close to the 5s limit. this is why i went with 1s at the end.

can you tell me what your timeout is set to?

boredomwontgetus commented 2 years ago

maybe debug output of len(byte_chunk) would be interesting to see in this case. you could add that somewhere around the line: g_log.debug("incomplete segment: {} ".format(stream))

Also, when streamadds up like this, do you find the startbyte for frame1 or frame2 somewhere in the stream?

tirolerstefan commented 2 years ago

My timeout was 5s. I reduced this to 1s, yesterday. Today at around 8 o'clock it ran again into a problem. But I don't have any logs, logging stopped, before... Really bad situation, currently.

tirolerstefan commented 2 years ago

Hmmm, somehow the data are not decrypted. Maybe the frames are cropped? This always happens when I'm not at home, so I restarted the script and watch it again.

Here is a snippet of my log, maybe you have a clue.

2022-02-21 22:34:15,666 [DEBUG]:  Decrypt: FRAME1:
b'68fafa6853ff000167db084b464d10200131638201552100326716e5b0530ad257a34c347dd905ee2fc1a27476e0b8d42d806086122c70fd0e2f9dce19c12cad8821307f637c5f2a19b7f7ce8959340f8857380c91c37551f25b466ff4a341d477eb9f68e4104e05a4141fa836386642f2f783381e0259078f7de1bbbf41cd9c51fb276ff59fde446128dd0f03ac1f52b14ce067d5ffe71dcbe4a135cab5683973410cf0d91909fc58e2dea548f6f44a1bdb146f350f022e5d6fe32ebdb2b17445aad397ca971107eb4825936ce4526088101b0ca41e03dbc9b11dc6c5dd24a046b505cd2b75912cec399fbc939487065d0bcc8cb2670477d1cfc4d7e0a04916'
2022-02-21 22:34:15,669 [DEBUG]:  Decrypt: FRAME2:
b'6872726853ff1101673bbdc5fc24641868c883dfe8c591875725b23e97f42ba630b61e57517d91ede75af84d4e1df8204f309cffc718ac9b86f124f19e83b9957ee363040894f459c8123229b78abfc5ca4a55572f329f2fbdd3713a1eabaa3a2c4014e07d13de06a6a70d176ad5f6dd366555a75feeeb16'
2022-02-21 22:34:15,672 [DEBUG]:  SYSTITLE: b'4b464d1020013163'
2022-02-21 22:34:15,675 [DEBUG]:  IC: b'00326716' / 3303190
2022-02-21 22:34:15,678 [DEBUG]:  IV: b'4b464d102001316300326716'
2022-02-21 22:34:15,682 [DEBUG]:  DATA FRAME1
b'e5b0530ad257a34c347dd905ee2fc1a27476e0b8d42d806086122c70fd0e2f9dce19c12cad8821307f637c5f2a19b7f7ce8959340f8857380c91c37551f25b466ff4a341d477eb9f68e4104e05a4141fa836386642f2f783381e0259078f7de1bbbf41cd9c51fb276ff59fde446128dd0f03ac1f52b14ce067d5ffe71dcbe4a135cab5683973410cf0d91909fc58e2dea548f6f44a1bdb146f350f022e5d6fe32ebdb2b17445aad397ca971107eb4825936ce4526088101b0ca41e03dbc9b11dc6c5dd24a046b505cd2b75912cec399fbc939487065d0bcc8cb2670477d1cfc4d7e0a0'
2022-02-21 22:34:15,685 [DEBUG]:  DATA FRAME1
b'3bbdc5fc24641868c883dfe8c591875725b23e97f42ba630b61e57517d91ede75af84d4e1df8204f309cffc718ac9b86f124f19e83b9957ee363040894f459c8123229b78abfc5ca4a55572f329f2fbdd3713a1eabaa3a2c4014e07d13de06a6a70d176ad5f6dd366555a75fee'
2022-02-21 22:34:15,695 [DEBUG]:  b'0f0031f57e0c07e602150116210a00ffc400021009060000010000ff090c07e602150116210a00ffc400020209060000600100ff090e314b464d303230303037383137390202090600002a0000ff09104b464d31323030323030303738313739020309060100200700ff1208e402020fff1623020309060100340700ff1208d202020fff1623020309060100480700ff1208dc02020fff16230203090601001f0700ff12004002020ffe1621020309060100330700ff12004802020ffe1621020309060100470700ff12008f02020ffe1621020309060100010700ff060000014e02020f00161b020309060100020700ff060000000002020f00161b020309060100010800ff060093ac7b02020f00161e020309060100020800ff060028e88a02020f00161e020309060100030800ff0600008cf802020f001620020309060100040800ff06004167b702020f001620'
2022-02-21 23:10:02,033 [DEBUG]:  pos: -1 | -1
2022-02-21 23:10:02,037 [DEBUG]:  stream[-1:]: b''
2022-02-21 23:10:02,050 [DEBUG]:  len(byte_chunk): 0 | 100
2022-02-21 23:10:02,053 [DEBUG]:  pos: -1 | -1
2022-02-21 23:10:02,056 [DEBUG]:  incomplete segment: b'' 
2022-02-21 23:10:02,059 [DEBUG]:  received chunk: b'' 
2022-02-21 23:10:03,074 [DEBUG]:  pos: -1 | -1
2022-02-21 23:10:03,077 [DEBUG]:  stream[-1:]: b''
2022-02-21 23:10:03,080 [DEBUG]:  len(byte_chunk): 0 | 100
...
boredomwontgetus commented 2 years ago

OK! So this is really strange! Only one thing i can tell for sure: 5s is way too high of a timeout. The way this works the shorter the timeout the better almost. 1s is good enough since the data we receive is pretty slow. If it would be faster i'd recommend to go even below that timeout. This is why i think timeout should not be a configurable in the config anymore. (but this is another topic) However, this explains your previous problems i think. 5s timeout can go OK for a while but will eventually fail for sure.

The output above looks like it is coming from a different problem to be honest. Is there any chance you do have some sort of bad data connection (wire, connectors, etc etc)? i am really running out of ides here as you can see. :(

Why does logging stop all of the sudden. This is strange as well. Was the log maybe just rotated? do you apply logrotation outside the script as well maybe? The output above looks very legit to me. This means we already found our FRAMES and are at least processing things. The 0 lenght of byte_chunkis what we see while there is not data sent. This is good. The "gathering-the-wohle-segment"-loop looks way better now.

i wish somebody else could also test and give some feedback. This is running for weeks here now without a problem.

tirolerstefan commented 2 years ago

Ok, the good thing is - with interval 1 it occurs nearly once a day. The stream gets bigger and it looks like the script always falls into the "fail-if" (maybe because of the (len(byte_chunk) == serial_read_chunk_size))?

Here is my code with logging:

    while True:
        # Read in chunks. Each chunk will wait as long as specified by
        # serial timeout. As the meters we tested send data every 5s the
        # timeout must be <5. Lower timeouts make us fail quicker. 
        byte_chunk = g_ser.read(size=serial_read_chunk_size)
        stream += byte_chunk
        frame1_start_pos = stream.find(g_supplier.frame1_start_bytes)
        frame2_start_pos = stream.find(g_supplier.frame2_start_bytes)

        g_log.debug("pos: {} | {}".format(frame1_start_pos, frame2_start_pos))
        g_log.debug("stream[-1:]: {}".format(binascii.hexlify(stream[-1:])))
        g_log.debug("len(byte_chunk): {} | {}".format(len(byte_chunk), serial_read_chunk_size))

        # fail as early as possible if we find the segment is not complete yet. 
        if (
           (stream.find(g_supplier.frame1_start_bytes) < 0) or
           (stream.find(g_supplier.frame2_start_bytes) <= 0) or
           (stream[-1:] != g_supplier.frame2_end_bytes) or
           (len(byte_chunk) == serial_read_chunk_size)
           ):
            g_log.debug("pos: {} | {}".format(frame1_start_pos, frame2_start_pos))
            g_log.debug("incomplete segment: {} ".format(binascii.hexlify(stream)))
            g_log.debug("received chunk: {} ".format(binascii.hexlify(byte_chunk)))
            continue
[...]

... and here is the output:

2022-02-25 07:02:59,598 [DEBUG]:  pos: 120 | 0
2022-02-25 07:02:59,601 [DEBUG]:  stream[-1:]: b'16'
2022-02-25 07:02:59,604 [DEBUG]:  len(byte_chunk): 0 | 100
2022-02-25 07:02:59,607 [DEBUG]:  pos: 120 | 0
2022-02-25 07:02:59,841 [DEBUG]:  incomplete segment: b'6872726853ff1101678c3de348d6398d0f6898f36113e290d23c067a966c128866e4c26942cce219827d9d7fa0647b03c82ce3051c9a7292f541a49cdadb808c65f509f3b717755155014a581f44b18ee51ccbe53a0aff51476e5e20c171ac2ab42ce063ab8ede6ba98d8e206956e53944dd2252a8e3df1668fafa6853ff000167db084b464d1020013163820155210032cfc95efdeb19c48a3a2875aa827fb486d06f06e9430693972ab78c6f8691a8c28178575334f1e01758f9993040b0769cbfeab204d01e301621054786cba3fd1092ea2d7475b68cbcd0f90a526101d66aef6ac0ff1d0e469db8d0db574e5f2518d918551b5d5d859817e11f2aa25ab0196eb933b68501bf07a0f7b1bb55e923022177ba13a325566d9cdebcf25f1efbd87c2daa808bf6405bd95ec0849363314adc51d1a12eea4846d347dad265452930a5c1647de58fbf48ee290f34458167309278d9a0c65dabe4959cb005b6a4c936af136e670b9d42bbebe1d4b663f7eafe748d2ef807a7166872726853ff1101671445a775c15a8d2a16bfc676d69ea74c680774bc64db44ef937bf6f2b107d456f9327ed9644f8f969a165da9f41fd1671c1f8621aad3140260a8ed439a346b361cf4c2c83e3df67a25763ac6a1804f59a9fc3d9bac1b97a59769623dd441e674a8ac383e83e50bf31b28dbbe3daa1668fafa..........
4bec45f71614c4a2d008fa827699a30ed5a854e2aa51890e4a40316' 
2022-02-25 07:03:02,597 [DEBUG]:  received chunk: b'' 
boredomwontgetus commented 2 years ago

Do you maybe have a log of a situation where the Stream is getting bigger and bigger? The log you attached looks pretty good to me. This log does not not show the situation of the endless growing stream, or am i getting this wrong?

We expect to fall into the "fail-if" a lot as this is exactly what we want until we have a full segment. Maybe you can somehow upload the full log with the "growing-stream"-occurrence in it?

I think i do have some sort of workaround for this but i rly dont want to apply it unless we fully understand why this is happening.

also, can you maybe add a debug of len(stream)to the fail-if blog? that would make it way easier to see what what we are at here. like so e.g:

        # fail as early as possible if we find the segment is not complete yet. 
        if (
           (stream.find(g_supplier.frame1_start_bytes) < 0) or
           (stream.find(g_supplier.frame2_start_bytes) <= 0) or
           (stream[-1:] != g_supplier.frame2_end_bytes) or
           (len(byte_chunk) == serial_read_chunk_size)
           ):
            g_log.debug("pos: {} | {}".format(frame1_start_pos, frame2_start_pos))
            g_log.debug("incomplete segment: {} ".format(stream))
            g_log.debug("len of stream: {} ".format(len(stream)))
            g_log.debug("received chunk: {} ".format(byte_chunk))
            continue

I am really curious what the whole log looks like. It would be super interesting to see how the segment exactly builds up. Where it starts and with what data.

boredomwontgetus commented 2 years ago

One thing i did not want to do on purpose but might be worth a shot in your case would be changing: (stream.find(g_supplier.frame2_start_bytes) <= 0) or to (stream.find(g_supplier.frame2_start_bytes) < 0) or

boredomwontgetus commented 2 years ago

if that changes anything regarding your problem (maybe new/different problems occur) you can try this instead:

        frame1_start_pos = stream.find(g_supplier.frame1_start_bytes)
        frame2_start_pos = stream.find(g_supplier.frame2_start_bytes,1)

        # fail as early as possible if we find the segment is not complete yet. 
        if (
           (frame1_start_pos < 0) or
           (frame2_start_pos <= 0) or
           (stream[-1:] != g_supplier.frame2_end_bytes) or
           (len(byte_chunk) == serial_read_chunk_size)
           ):
            g_log.debug("pos: {} | {}".format(frame1_start_pos, frame2_start_pos))
            g_log.debug("incomplete segment: {} ".format(stream))
            g_log.debug("len of stream: {} ".format(len(stream)))
            g_log.debug("received chunk: {} ".format(byte_chunk))
            continue
tirolerstefan commented 2 years ago

Ok, thanks a lot for your answers. I'm really busy and have little time. I will do it one step after the other.

I added g_log.debug("len of stream: {} ".format(len(stream)))

and have copied 50MB of logs which I will try to analyse, now :-).

tirolerstefan commented 2 years ago

Another example with new logging code. I have added a timeout to keep the logs smaller.

Code

    while True:
        # Read in chunks. Each chunk will wait as long as specified by
        # serial timeout. As the meters we tested send data every 5s the
        # timeout must be <5. Lower timeouts make us fail quicker. 
        byte_chunk = g_ser.read(size=serial_read_chunk_size)
        stream += byte_chunk
        frame1_start_pos = stream.find(g_supplier.frame1_start_bytes)
        frame2_start_pos = stream.find(g_supplier.frame2_start_bytes)

        g_log.debug("1: pos: {} | {}".format(frame1_start_pos, frame2_start_pos))
        g_log.debug("stream[-1:]: {}".format(binascii.hexlify(stream[-1:])))
        g_log.debug("len(byte_chunk): {} | {}".format(len(byte_chunk), serial_read_chunk_size))
        g_log.debug("len of stream: {} ".format(len(stream)))

        # fail as early as possible if we find the segment is not complete yet. 
        if (
           (stream.find(g_supplier.frame1_start_bytes) < 0) or
           (stream.find(g_supplier.frame2_start_bytes) <= 0) or
           (stream[-1:] != g_supplier.frame2_end_bytes) or
           (len(byte_chunk) == serial_read_chunk_size)
           ):

            if (len(stream) > 5120):
                g_log.debug("ATTENTION: stream length > 5K, sleeping for some seconds ")
                g_log.debug("received chunk: {} ".format(binascii.hexlify(byte_chunk)))
                g_log.debug("stream: {} ".format(binascii.hexlify(stream)))
                time.sleep(30)
                g_log.debug("sleep done, proceeding")

            continue

Logging example:

...
2022-02-28 01:50:43,793 [DEBUG]:  1: pos: 120 | 0
2022-02-28 01:50:43,796 [DEBUG]:  stream[-1:]: b'41'
2022-02-28 01:50:43,799 [DEBUG]:  len(byte_chunk): 100 | 100
2022-02-28 01:50:43,802 [DEBUG]:  len of stream: 16408 
2022-02-28 01:50:43,806 [DEBUG]:  ATTENTION: stream length > 5K, sleeping for some seconds 
2022-02-28 01:50:43,809 [DEBUG]:  received chunk: b'015521003334ee2f844d035167bef0d3aea3b447fc059bb05e30e55b91f9bf219d8303aa68633f099fe87a9aef16eed88fa07fff6e4073b1b3c35567d6b985f145aa349aa037b6b0c8c7d545feb6d3e57e4e47fd1d1299f0678ec0c9700d60eefda7eb41' 
2022-02-28 01:50:43,816 [DEBUG]:  stream: b'6872726853ff110167f75111731b92b0cbd584ca53b365e3dbb3e76cc1e6231a1211fcf01ce88720234f3ae07eaf6b76b414534aca3d4b6378537c3f704a0159108646212f6ef2ae6d3f826de7a0ffd3ed18a2b3d59fda9e6a3240d4117a163702f176cd4241cc82f39b470c9982878ccfe55fed0a8ca51668fafa6853ff000167db084b464d102001316382015521003334c23378e30198ad56a466c5854104b7039a09f8b621ef37a89e56910ded97db06169b958c29e0defb73cda45f7018e2c5d1e167cbfe54159e64daca91d2c3e1868b136318c95f1ae56d4688994260bad5c1bb096d9ed6b4c1a1a515702d996c8f4b8ea652fa618dc5e0e546d66fb03d9a271925989856724069b28131abfe380ef5ffc81517466d27e1294e13868a19d041c35b373af52dcdaa3ea880772a06a7221a0edee1dfe740b5d0278c8529f4cd79b76e7129518f2b91096ccc45ae7c001a9ab864b2c24cc171c49f1df3e250d676298e086e3a9fb3d56ebaaf5873095b461a0ba4e7166872726853ff110167bed1d67a5ad71f9b43e1f7ba1a2fa4ac6cca823db9101ec2eee743dd7a50d12f0962716f45b8e9d39badfcda7c9db0ca7cf67b21125417568f910ad5754616f00e71764f8a53e13077bd642358ec2f782245a395c91448d73e15bab76b19590c24b9f93aeae2d714c3fd344ed7b61668fafa6853ff000167db084b464d102001316382015521003334c330be9a0d3762c9f2fe96fbc8247aa7f447b21c274f7f4cd45ac4d75463d7d387197979d8148d9dfc44ef9afeeb2fc0f66559eed36f8562820eed6d88c0f1bb6db5d163a08f1f271f46e64ae96ffdf3fc666566989f245ce46b5569d050bb6fd1ab8567e8caaf292f0690f4163173a0264296892b1642279ab6ee9b13ae18d34293c4ea2f7be479ca95b2a111d924f1a276f3154edf8cb393db17ea24c05050396d80a7a0a3b716244610483d526432b211ad21ca961cc1065b6bbd7f5815604a470d75e224c6fb0c1ecdfce8283f8a691ebe6563daff00bc3dbd344a56be4ec51a5aa30b166872726853ff110167b8751760baac077b2c1a689c167a0e49d88bf715093949714e4543bded3c33840717b2b311da4ce54ae4f71a3d79664c2754fa22237ab4fa69c9a0ffddc11e069c4961d981055090c299f7e17680b643b630116272167fa76aeab23c98b323a9b5f02a33b5184c706d96359660e11668fafa6853ff000167db084b464d102001316382015521003334c47507d41a7d3d11f81df70cb5f89d4a3bca05ffe1a281c98773e6e615340fc58cd41fac670c87780aa7a2c655a5f54528e81704cceb9cafe6ff13046e2d63f9022ff4bfe5f95b0a7862a298e1551fea257219943ca2c9c3d47429efb392fefbb737cccfe8003f4d86d976692794696ab9663b2a81c2b66d8ef3bdfb3a72eeb29df3276a0bfb78a3bb1ed1fda6d95229bf0bba230f547d170fddc12ee9e2cc57421b54ada13c1dea9a51c9f2f1590ab511db42b9abdf341ec4d4ae4905826de0273dcc6972181754ca7459d2052559195465bc40d154ebc7a84b65709bd4aa42108f726c26166872726853ff1101676e6646dfcb5da89c371f6ac2cbfefad3075104ae2c4488ae42208c27eca72c54787617ee7f8c88063a13fca99af5ef6b36fe2c0f443b8b1059affece22bfd724d05910ccefa97a50cc11013fabac72f1dcbfda585d2d179dc9ea912550f778674f7b7d7e8e6e2fe78fc546db90741668fafa6853ff000167db084b464d102001316382015521003334c58a6c359b51169a2cc59b09e1d6b850153391ebea7713542418b76c2cd6e8f130dc9ca52eae1c8c40231e689898921c53cb4a9e04e9b2c898b8cea61ceb4f9f6337911c51de6b481bc9b2461e7313f43d9fba10d93d33e3b60b2787f1c0ecda14da0c74a29a40b0323c9245092e371746906fdd19186390502a7b2f3698278993338f7a83ef59b62f59f0f14556eaedf97aca151bb49639bc2fba05f84706061fe6876f835d032442e96d1b100dd0da3b4ae9aa15d17f8ca00919dd26ba123d21e5e4d8364189926d86c16ea10a56a5637051ecf60b4a11533adbaaa35663e350ea607bf6166872726853ff110167fbf686d84ed9491f363a80beba4052208ab606d9ba4796b10020b837d8b34fbd9c706407b3d838fa856caceb19f0579ed22fe60db4efb98b1c74275d4b2fccd185a8eb584e78ac89615bfe3618939a76a69e7edc5c2ada022ea801084765b28bf452f70a3f53b6afcd41a3bd0d271668fafa6853ff000167db084b464d102001316382015521003334c65aacd921ad29a9d1dce2864257712723ed90e080b6327c95945d946b354883f5a0a9145a50bd1599358e33945cb23961ef4fe0f2b6e2f6c5920e9d9341c46b901bcdc1737bf99ca707196ebb20024e5ca78bb1130b0361b22f6aeddd1f02bb32e0d88748dd54f529056793b72e59a15dc42b57d310d3156eab0fc38087c8d577749e18406fc93f918568c9984193367384091f61a7597ef2cf642bf938acb5722057e46386ffd5531b1068329ae357ed1f08775df98d499332221d57f309b5a46270a8be809762c4cbfe04a46959a63cd926841a2db088db5338cdf0a8f1c3d69324ca61166872726853ff1101678a6832f5dc7ec91398ddc5bcb928f265402c865a9ab9434ca00415431115b3b27dfeab01c1ae72d8fc5fa390980b44e784347362d0a7d592480ef7e5902f546a481b06c1af263cafb16cfa82523bb093189e87b363ec4379fb7fb3acca94ae4227571d8487e22299da45a76f13531668fafa6853ff000167db084b464d102001316382015521003334c70b9457d0250cbbcf4142d2ff64fc59f970aeca4c7312dd6a61b703f32979dbcdc65d140eba6d2dded3c1543422b58d34661df4a012fcf2fc1a2f5898f502459847ea06fb5afb8ce1c79b3fe83ee99e82954921a3e0c061b7f1bb8ef784f7705f492ed55dea74b23dd8d3dad1a4e0be70f79ef9e1eed176d82b4ec84cd11b9d9f7e2b4876123d57a1b326166a9dd2e9f55df4d4afa4c04397776e04d5db7d57ded13d13e2c63b90fa0ffca4c3866bd6d0cae0cd912601757b7804a2f76de20003cc20d9b05825649ef6c9a16b2ec75e464916da2e75a51b3555676cda3a5192b360631f04166872726853ff110167a2e395fe19bc6a568edda4785a0467a8adfc723457ab764317c5a3b29332b592017a272d63d14cc6980256c4c33daf3b584d58933f4f2f0f29e219d318d80819408d3cf90c8d747ec8173b533723827b5b41ede70ab8ba26dfbbbd9afff8da0b65561fa267cfee5e9902487e10691668fafa6853ff000167db084b464d102001316382015521003334c9e70da0079170e5ba39ecdffc1e72483ee1476af6fa8fcb139fa75e69ea1cc0640d5587b8a2ff7caebd2c3076f900ebd6d4afb0397653e0222fa5c22feab29359fa866d0755c2a5a9d9ae91a12fb09ce8fb4910e2d65104ddb647f1f90283a2e55842030f22c189b6308c3213310f4ec9a7c3f4649ba735c853149729f89f4e87cfd085e16ca56aa2ba679678e93b845e31d479ad222ed4c5d249493ab16b74410dc74df450403044fd4452e89eb4e39f2c97698bed80d71fea62b73f1ac00a048981f5cbff76ddef80b20e1390d8df6cf8b7d9f4c6a0116b7fa8f1a84a002b69b72b2816166872726853ff110167b2a28b21a66fd69f325d99fe10ef01cb80f60c55cc1376ae2fbc51f76bceefe8caf9bd8fb610bceb6555773491596c684aa8090e6739251fa5d5204073e537df7b94244b0623b7ef7e78702b0ef3fd2498671371e9a1309707daf58c8c52f9fdc4600b283d028f24f5541b77eb501668fafa6853ff000167db084b464d102001316382015521003334cae8b560ce38f249c3cbaa766b39209a2083603140cf247ec2282d78575083860fd90b36105de9b841fb01c4771636154e0e3a13fcc3cca8f8fccd1a4a599d47a5801e7241c596360a76105f201dae28e8e50dfae3f4becf850d612292dc0f95d911bea36198c8929df94977c6706f8bd435758c7f2df58b4a033871a922b7fb0d62ad1081e4c2dfd185cb1453917bf2256011995c399d18f3e1b22b44b9011656c4b1a9b339269c99828e20c75780bed7cd406d499293dc8d887248088aae169ab7608b23b94ce99dd84857e41440d86310737252a0655f393054e594003a127294815ebe166872726853ff110167d2cae6750c847b757a1725a0da496940f63be579145534c338a55b931f5a98877ca788fc6a1e79438d9f64da256b3a5a3e3bcadbf5e83b77333995500c3c3b0dca55d41fac2dea036ff12560b95e0a4b53ebeaa6b1fafcd5e8286513fc752c7d3f8e709f3ffc0ea4aeb5f159d1191668fafa6853ff000167db084b464d102001316382015521003334cbe4947c12aa35ee0e22a652c4071bef331b95ee28cc85a2a3db09d962fe7f7186752e16af4cc619a0aaa6c53ea86e0cafbc17e25fea4709a788b1434df6660da20ef424fac46cfd48ede6909802e14254d372ceafdca3096cf9ec06b94e56476bfba016eeb9b8031cd501d03d1e52d94dc23ab2c43c91dace48d24865c153aebc5c81624a84233aa956a9df4f1b165b14c1319887628eb35f45822d60bd03ca26bb90bfe385ff67cd68ad73c0c65f12cf5185e58e6a91aa4152f4e8792a202041139f89a5b6f644ec0162c2fda989771fdf1fe8d7ac81ff877493b3006accbca4efd3da77166872726853ff1101674b9835d5a05872b04d1f0abc820a13917bff9f39d34dc0d25813a6540a7bd7a109e535512c0fff8968662cdc3a197cb07371717e8e57092bc3fc22fdd5f5757edbd63a3211ec453fff03c137960f38fc471c06d4d1a454efb88a5e4c8bd3c28e2395bdb85a4a05a6a84238b11a161668fafa6853ff000167db084b464d102001316382015521003334ccd19cfef7949ff130cd272b49ea8e3efde5f30d00455a518d0a086f1596982c02cd83d89c14f3464d8ca0f89d3004f5e5ffcec37de254bbd2158412352800071d5899dde1b1817f418c161905ef3540b17ffc3c588717f4f8a9fff90b0fe492e5511247adfec63cd254ef5846b0c2a38f7a395a398589ef7f38140c8fc1813c4d78ae1500d463a5f69b1001ef12f5d3d8b1849896e0be7b837a188bd7618eb59a23c2d2dd9be3f9f8711776a2b837422cd560c4f2ed9128aa06481c313b3ff6d6b2c67eb8036d0fb64692db013ea63569df851917c55354603d86b78b70fef6c280e92ee3166872726853ff110167a5c20412fe904d914a2e394e23db4204f5cf15e1e251325a1fafd3b49906c8c914be365f45c7addafbd0de8161bc88f80cc2d7797bcab5caf6a3ca722778eac2340edce12daa52c562e792217d9f00abe39b9ee71cc156a42e4d1f96c11642f18ed8cb605cd4342f18a9d1976e371668fafa6853ff000167db084b464d102001316382015521003334cd3c5bac70ad873d1e95f1dba0a53a5f23a44c2b1fcbb0b749828269a92f5f560aa55bd8faa0ab350bea3082c8c13f326c59ec51dfe29eea30b292fed40a459c418bd4412d521dcdf03d966d98595cfbe45b406a768e4a89fa5f318c74b88f4b8f977eecc8aa8d8df65ebdbd11f44ae019706a561ec13828ceff9302a153de21c39ca1bf3b2faf43975e605ec25d54c4d0ae33e8c7f2dde7ccbcfe66abf01a67585f2b88b388671365783d555c364b385971a3c3f2166c88967e2ad58664bc5c59ff4ea65784b34c1e88ef83eaefd8ecc847701ceb2b0e9e604a0576c9ca07b73d5ddf9a95166872726853ff110167bbc460ecda074867dba7bccd625646de0a6cd87914371ae8a9a6e79c4e47562ffe6ee74a24393151accc04bc25f02cf1afa8517dc204bd9ddd557f28b44653cc29dc78c30d7144f6ce2a93134edd23919519e093d526c881d7c685a6ded0f43593aab562647336bbbd660d2570841668fafa6853ff000167db084b464d102001316382015521003334ce5c872209eed67f472ae8bd83c9216ccc8b1734e9d43ee4aacb0bbc76c58fb6cbd27beee3f5ce4e6e37ac1562c4d385eb8c2f5da8c8f12b668ed8011c67c9223244a4c41d289f3974d773ac0f0e30cf553397b6db373c1b5629a946ccae63fe722d34ba464a2cefd7ac34579c9565b766e33ea12437f31e60eeea7bb7605633a14532e7785e3ed5904fae7ed88c183ccbfc10a24ca9ec51c2ae3ac584eb9841bfcfda638afcaa9551b472cf26f729f7f342753eb0120c37608ce32e40e6b9b426087a4d59e338158c7fe1049e604c2b65cc4ca56c51f339f2de9695d486d0bda82910fe61166872726853ff11016758ad5cfc6ea0d49ada6152de2e473023da93fa7d0b8d123d7865c9d449a8621ea8990159685ea00978d59f930f5dc6a9052bdb93adeb13f8c938b07633d60d96d53139cd2decc32998257262b7d94af694304542f091e5382ba5383347a87f6259ef4b2791c5828684b4413c38701668fafa6853ff000167db084b464d102001316382015521003334cff85189dec97aecc6ad503da71cce7069343c45add03509c15b612e42b06d64f23714d9783f4ee1d1dc0d27e71dfcd912a0b2187aefeabe1bd5871cc61050148f1f2aefda4911b312c34adacfad0ce92731ca6dacef5c0d0da01866d4333182bf51cd827c92cf0c53d3ece0811d7c6dbfac50e3619911e8f5e27a74effc147c78edd40bb6dfae0835fd4c012c93fa543accb4ffef6730169c1e8ac4d405966d0f4dfce8b86fc9b05b29c847e8cab2257b4301a3492a028070dbf2e9ac4fd391a64ae9b4c3ee36d9eecb065470b76829a22cea9b60a0f47a7f49bce6d4ab062756fef1de06166872726853ff110167ad0bae1216d2e5384d6c6584f707938bcf2cafbad8c2863763b4a5d4334be71e9de488b886e53c8d467e665721f3ce8282947f3fcb88411cf1b4a4faee904184161c27cb45b18ef2a238235cdad3e753cf65a36303774c8dbb6c51943255f29931d8049dd8ebc30d869b36bb06921668fafa6853ff000167db084b464d102001316382015521003334d0533c0fb8d2c481fd29b7e598fff4dc6f3b20d8870954bbb793b8ead3ec7a9054c1c1d3399364bc7828103215abcbcfbffe30a373d4c223e3ad09661c62f3cbbeed3ea93f17245f7bc0b8be31b8c0525fa48b2474992ea7ce2721f85b34c8cbe97690013b43a2a6b4d9e1b60aa3af601c2b4be65908b0635b1a44d2d0e7e4637ced038d083b3d1a7e370c2360b3359d740e9283ef7a1495f82f503059b340d985f2f5a3141ac1f2a0517684657092575c0f97baed4ab3ff5c35bb9706340ea321f60c8e391281652b14b03e7d69652d4ce8b4bb8a1ed5fb4838c7870f6588179a730b3355166872726853ff110167822f2ee62f911fa884c6015f111206eba21b782b032fdef22333d7c9c4085ccac1eec4276b685fda9cefad41a1e87e3a8a37fcf483b097c20daec547db2660ed9631febdeac7a86d67db686d3f15c19c8ef2a42af495c11471fcefd95183e6e88b0ace4dfa702d957d4c457685491668fafa6853ff000167db084b464d102001316382015521003334d10f02265ace8457bc29efeb5f9cf2202e86c199bd61b5e1decee0afe90d45bad80a6106537ece7bcd309637a85594d114a1a62ba7aea60a8951ef7ffc8b23b3b57f38936adc42f6d06b0bbffe223d232e92de4b89678f61c037cdd20ea3860abdb6b0cec2bf28459e2a519149e4533565a1856c54ec8da793211f6e2a67f473633264810170ba676e0027f2f3e2bb7c139d8fbd9536bab2a890773c7235be27ffdd3260ef179345bcf08589b3ae25535127f52c55c5e033fe05b29d04b3df882db2beaecb0de20b12d908cf5ef9d3d45a415830aad547c326ccbc3013401cf81640d79f97166872726853ff110167a525816e1d3a42972026410c34defbe965929f1c746db02a0a5b3fc051fc48b8b5dad2388f380ed2a963fb4fb8eab166299c95efd46318a75f650bb001c3826f697fa96213a53920258bbd32ffce9327ae51046b43e91bb5e14d0fab1ddbfff2a967f3569914704d7c3bad0197411668fafa6853ff000167db084b464d102001316382015521003334d219f533429f01061e8d4d83b436ad259f155b64126064b254848a080b2db56fe7abb63987731a03dde74581abc7a8a68a47c80ada63528280248ebef5ffc4d6a86d1a79876a4b8dce64bec03e9e5b838e97f2634b31fae85f4e67743e34dcd2a362eac670e4ed7ccf9c568eec46201500e2c417416eb623d47dafbfc11bb46e440854f146cc574c2de30b5cec68e49f75cbb6547cfc798da3ba6363d854f9af19fbd7ced5ae6f1f953a4f8990315e73907d1c5da44796d7f3f0e68bab44a96a1f218a4f3a21ccd028c9e694299074d011a8f112d0325173a678408d865b049f9b0103c280166872726853ff1101672f31f0ad27138523467efe6a7d9d7758b403ced7f4b5ac9bb439e90f33cfba3b38a3610a3d705b23f52e7f741b66a86aba15da6583b6fb44befb4990c28d07511459c1255065b9d3651925b6e5054005ebbdbb7ed5a747f6d5d2a2eedef7896a53467526ec845480733f6861dc441668fafa6853ff000167db084b464d102001316382015521003334d35a48722340a5f8a70b8b148e9e236091b610cec6387d119d07fb66f1d8759e612388c28321876d494aa2079ba92e05eb66fd80cfa1fbedb24b612f080a05a1974ffba5f0ce9a2db01bfc1a38ec19d6989d0e89dc57e045eca5a82d4bed2d6aeed768d22c028121525fdab59e15077056c4695de0927d3d1a6346b75bf1e398e86daeca9864da6b42b866a889a1e0b0624f65dc16e33d789f5ddcf80e293c353906f15b3ef82adf3482f62a57d609d5238b44a9464df1cbc0a1e3398c5e08e9431d5a22a7f651fac19014ea9bb181749504fa5151028ca61e6faf7aa729dfdb4b840e3a64166872726853ff11016756991d34a21284f714e4f9a05e4ce4ce1a99bcfd42e43ca8d3fb598651188d027f6c465b7b8bc080e74f3b0d85ed91310ae59cbc0b4c8b5397af1dacff926e7cc27f17de325e54c8e8f64855966aa7cbaa3db89c05c30cefbdfd7ef238db6c1b97174a626bf989de52ddd85e31181668fafa6853ff000167db084b464d102001316382015521003334d431f09c7e451dc770a3861cea35bde17e9d586e03752ab9e0a67b98495ac3123425db27106619a35497a10fe8c8a9d43d3317c5a4c8c6b28cec713d09c25e539bd775de9dd91d6ea71f8c6334169d1c4da4e4998e0a110d85ef9a2b2770fa46ffa75589b95e3a86b583fc49864ed791a637dc31557c13085f4aef19eea2113688a3852aa07a7be6b972c4d250f483bde4e09cee543d7c070e73f0cc7d766d26fa446fb721c31403cb316fda1738d1b20bf2ffc858cabf03086b1ce5a67817edfff836f373975b08effeb033c01e554e39d8039a4b63b98e55f319f255c56ebabdb28494f2166872726853ff110167c36018f645c5e8356080e82707299bd1b0a51d8437ce76ead7b02d7f999c4cc07518938839e14edb1ca3c4150a88c84eaecf2b3dcbfd3e8e352c1c4fab54fd0b936b645b4077636753da07562feb103994a23318bc9c715e4485d6b0291b31022862457076cf2c39cbed908264a41668fafa6853ff000167db084b464d102001316382015521003334d523255b860d03d3ca54d1f02112985256fb4a307f8a270cbe2c47c12c5ba6d694c142f3af5448bd82ee30bc5f939f8a8217a4b535ba772b1f4d30fac30d137c9a25804f9ccc05bade713cca25c6d4539a6b7cd0daf7ea8370949cca8f98ae6ebe676514b551a51fed9b1d65b3a646ddf28b747f8fd8530450f5fc705c86f3ce5a308618971df616a852d2159a1940fafa6e2b361fdb7c0d303f935f8a1b9df181f9dcf94ab75132d4421edaf1ed7dd3bf3d233be6e387c780c497ff75214022caa09a2c1e9b2fb7b51cda6ec27abdc55fab0d16c0a6c743f53634c8522e4f9b477746bb3d166872726853ff110167df10001e77ecf17df32e65cf8fc9cf17bec5986d118e3f6280c78948e39b9957088f6531916c96011344a88b7ee9513e84fd6bdc19c02e9c3b6332a13bab39b3b1edde0e6764923cacf32e0f7b0c12a1092d93e24bdd6d52e4117059b5adffac056071502bd4978512e0cde6a59a1668fafa6853ff000167db084b464d102001316382015521003334d6e774c6a8ade7df0297a8c70b91c0cf0703ed5943d20c68a943854b4be5673046986e0ab6c0f5705723eb83520d0be294ef8925d153f9e1caa57f8daad4d0dcb26e825060bfd00537f01ca0c7f0b44359b133910b279c137bf987e67d2d6288cbf834812f8dc97f1154428307b2127a0eff08ac94786244926ffd8010536d53c2b8df2807e0e107a893be11b1eaf2b3c52a3c798a617272ec96350fd6e0eff88d60b8e811f64788ba21067eeb3f5680cb99993ec8d34121f359d0b76a5aec8155c8c0f0a6a0fab6c6c869354d4cff7c06ae30f8a4d97d6101e23edde6420fe4c68c1cc306166872726853ff11016768dea9f90b62c69a675747adc04b4c0faebcb92f624064c78bcbdc3654eedcfe5ee6c28a4db668e75c822d963160c420ea26dc3aa607ef9bbe60727bb2d94a76d19afd01409ce888d8b6dcbee26e3fcfcc3612eba3ca1ec44fbe8463d41d53ee52286fad3aaaf52b961b2b7e24ad1668fafa6853ff000167db084b464d102001316382015521003334d7227973fdfecdca0db12950ae9d384eebd36a9260eea0efe83f4e87a2ec620a7a4384cf742b2dc1d890234dbee8a2f3eb4ff556ce79c5980aea1d25d72d83ec0d2aa3da103e48f852cf32cb013a3418306be89c56c5159d89981a79f2556a7b4e350396779b8b77ea9d0a746c6b89bbd9c91aff26f7eee6f1ea3d67fbfb9154b3acf73bf55edafa790f0e271d8f88e153353be3ac932d3dbc237a86f935ee39292da9d476945d7d717c9a13c4ea45aebef221837393b6d72e1bd66e3e0c7a22c39796fc622885b062e1d02d5a6a80d83b518c350991b1dbc29875f70561eaf8dc2e2fb809166872726853ff1101672092f8a5c7a7cbf1fd9241d136fcc33875e66a7147b13b5ee93757f73b64e18435c655eee8e68fd986474110bee64440a17fd5256456c555b0e33a28165ec032656395c672515693f2780856590467a756b354e45bc6f2d246ba2ef540dad110f6f7bb8dbfa866a18ce0f33216de1668fafa6853ff000167db084b464d102001316382015521003334d87d3282b90f892b9ecaa9381af1273f079112323f43b069e8d4ee584f85dc135271a3f2a82832d0c9bade9f72a4522398be83dfde4f24d4157fda6590de894303c9d34cd0f23b9c3543e41a3631b4fb78f8daae8b399c6094a746b7ed32a343ca4ce6d62d028c5ee7a673ca2360b52e20a068fcc13b1fe5a5c69549385eaa82bc885110f40603843ecfc1a015255142dcc27726ed1dd90588f21378c8b6dbd2d453ad44a2197370464ab24c733adaf73ffe6c642b373acbbba7696be5f0ec09e0c2646b988b9b3882268f995ba3ba01e87b9ee5a2e9f78c0fe2ec5c6130b8cfc8e333555b166872726853ff1101675f9d2f514b5a0d27f71d3b2374897689e4166a62044030f7eafb73cba934b70101c942d721661f2120f45c3e8b6657fff98b356c7c17cf48abc1cd4c57f7d51e77e4a4266f6b69ac4326c837df1234c8e11cc22dff594d60c7056fa82332deeca0b1b63cbcc1fbf76f02ca86b02a1668fafa6853ff000167db084b464d102001316382015521003334d9d42b9f7397646948be0439076693f08c987c599d671b570a7ffd515dbbd4291452b6f8c68e80fc2ab87e2266672843701b5fec2080cfb1be6bba076d633a51cedd66dc4b4068673aa35c41089aabe54be4ec9eb7d37665c9cf9b16d067aa3fdc03424f32480f50174c14a272b9a0af8f860fd3668bca5f1e2e423ed65c7ae624a2d10a1a2d06be0654dcab07f4a32cc38335e27442d5806fd9f1cec28489092afcd18d7cc4e229a793eeca5543ef2181afb446c09f6ff9469169c999acca7096a63865b07163af71768ec0a98927983437b9de29586c0590eaf31593a17b457c86ce1e24166872726853ff1101676c035f7eb60cb612550d64f5ba89ae1ef3b7aa7d52e4a34956b233c722b8c1563d74f32322b3012b59a546f2fd0ecef907b6c6124b32bbe477e1b61085e624fdbb01a54f30ff70a7caa5dca3a36244a1902b64adbcd011fa563910ffc59a101dd5846ba156ba36d1f8547c2184c01668fafa6853ff000167db084b464d102001316382015521003334dab0fba4ed4d056adca3cad8087430c063bbbda739d2984652fa099d1321e4023f3a95a082906c33744599c722dd3d02bf4fc2e285a56416cc35e2147ac0ba16fa74eaa85e527d5e6e1982ad716eb9de1f75a193857665ac4fcf5d82da130e89977d03033a0a8a7f45b1c2a5ff0723a790f2bfec923ecb991f724f100b135a0b3e2c3aa4044f89dac3cb41ff790b419e24f21e687c7b1fe3d77c209ad26822553833a1cb7209c5e3acd72f741a180164c7c628f451b0a7bc0b4ac0359a2abb1fe9f9522fffd36bc92f0a8f039b96dc2c46a90a3ad2bfd62ac0786230ed6b2b514606a7f4db166872726853ff11016745935d285459de929f049ed4fb74482ffbc34af8ba81657cf58eb9adea4d252485abf8fd7b3415837f2eb1e099a4854af8d890eed585ebea2f20d696e539735b46f35128fb9db09bc504dd0fb4b7c510fa650c93371b7b1303e0a79240e62589ce00254ce75bf2b7b9c4bdd696c71668fafa6853ff000167db084b464d102001316382015521003334db8ed6879c10a87bdb90c7de97244d4aefceec83e5aec3665aa48e3eb3917dd4223550dd37ca676a9d7532604092de83d9e1c797e74db1ba4be61e4ed303f9cc2251f55782483155e9a7a9d3aa96b03f70bc26bfbb0a0f491bfda7e89c46bec22fd9dade4bb03d36504333a858e9adb91cf103a45ff337da8f56f17effcd4876588b4a7f08edd9fa784964028cc1326b932cdfd218bb3494877e0afc0da76e8c2da15f5fe87106388029287b03710b13ca1a0cc007ad8282730bcabd6d64c8dee047240f1d5ad2ea99ef003dc00a88a46295147ebf27fc6199729f8b4239762dba8f43461a166872726853ff1101671a25ca7d6fb611b5d86ac586bb106759f325b288d38481a8c4c543c70d31d8ee46f768b32125043f0fdc367d17dd91a194a4536ce979e99cf65a1c54c0c923c6cf2aeacfbe519f9fc64d36082b6eeacba3dccd1d9ae120e2f1bdcbaac958accecdd3311f557f288d578403f1c1bd1668fafa6853ff000167db084b464d102001316382015521003334dc97a1fa3d1bbf4f15503d4f650cd3f5ecfd1160b0d57afc59c018e1b9b3d0e709878ff87f255a4e097602321e479714ea61874fd00cdcb4f9863271ee3cf629b05c99cb0b43ebb3526cf9e80f82c0f11ea8ed8ae69826f90c6033bf61c6ccd503f822ee23b1127dea5938cc5c66c2d2111a979a64d85da97bd760e3b8628596aff07579331e8a188ee30bb1a77f39510a3f6887b3564d90e9f9e50b55f9624db20129b2e91a65a2c65ae5a279c573bb208086a9ebd3481a2b54566b4063f6cf01f7a7fd4beee6aeff5759eb56311579060128332b9f96d15a8a4d2570393c8f4383bb6179166872726853ff110167b7c5cd0517e45621b99bff760ab757fbda3e9b9f3c09e14fcb46b2e3360d92dd89311687d6016f48c73e20234763a65b142d7b997e998bd1798b67a65a800fa92031282eb52863f59a8065bf6d729ab6666409005ed72acacfe1bb8e5572bc148a006371a2eaa0ce8f67d6e717c01668fafa6853ff000167db084b464d102001316382015521003334dd90e4b00d3c1d8b8e4453c7b0715adc5154d9833321d9d79786c4c8154f997d797a6b626848952bc49f12d26ffd7f574a25d7fe8315840dc31a1b3fa5111b023521c90383697b665b4f4210347eabf8b542dc7c0f0a28112487f9caf12c82f563f651e2694ec20c32fe4aab18147b53d57870b36a2fe38c2112fd9d0c6d59fd365c3e29419d05d51657b431debaa90bfbeccb92ddee745af5e76f4e28f8e2f8c418d27767cf6123ac265f6b534f6499db00a0f16bff6f80a0df3858cf6c63c5a22357eda439d50e5df5b4e29e1d4115c2ac386ffc6d40c47f299ce7a198b7be4cf68b3583166872726853ff110167d9e9163fd9d56872cf75cad3f7647f63ca10f7db1598e056255431d75a9ac74f09051bbd26594d70cfd31293499dc344610397e2f0a3562f797044511bf3c7eed110f3722516633deb167ae6f9be5ac922b08d5585c2db17871056286c5a969d9275c9a03ff6f7aef64abe4e78931668fafa6853ff000167db084b464d102001316382015521003334de6e2b21952701d896ce8b50f42a087c2ef77335e2dc96c9a362511c83dae63f893812dd697de286ac61066bbc00a122fbee626bb4fd12114c89624ffc96828d3a3733af0847b42297c5bd660c11a827e0db793176e7d83a0295561663c8bbc1ee35a2ad508a50a143862dfaae4eb440fd6ba313f4d05d8c3c7a41c19dd2eaf54bbdf66bd4157a609d1406ad5d1a932c156dd10d9dfd06548ad500cdf56d20c040aa4a304a5a14dae2411ffb45c6fbb78af35f6c2aa8cb90213c838aebfdcba3d3b739e4c0fa691ff0cabe6dec3b8165534b04cf54561d7f9234f2a6ff06d413422bffbb37166872726853ff11016762de6038fad844c1e73e7902a6b998456b60dfb8992957f0ec48440d8eeff405a02087e0be79841a6bbd991ea189c0577403af63bb820b9b350d96354ee187c977e7376bea7b83b6fd7599be30668e443641cf21619a8b65daae769dcc0cfebe49abb6318d4180d2bffcd3eb790d1668fafa6853ff000167db084b464d102001316382015521003334df919f9f3dab6f72358bfa37ff03caed38a99a4753cd84a94b97d87a5bf1b43aec391d8170c525eeaad989a6beecbebf5555e367e88abfd5322b807510149e410a73a79ebf214d4749b0f32a5a13cf45372b6ed7c87c9e9c27a2bac39f9362baf3671bf8aac4c601ef506ca4b780f2e7c3ef033c7499663f7158a244dcb1f5661572a4c758e029e15ac86237ed676641acb9fde0d7c618a32fd4211c93198b2270e9ec7f14c02bc3cbbc3754a31678f7e558c69feecd6034444dcafb8e2c1e2e3632b4600936f35a929bf9eef7e7150b5b4bb65fe2fdf8ae728c58ead6be3a80d149f74fa4166872726853ff1101670636f01e287a1d77294127a609552e4cb184f76d2669a21cb53e077ded0e12d5b05fd1ce9bb297e93b8a856a148713674a5d897746b6716d31b5f4b0bdebbfd87743760b8ac61ad2fa4d91234b253f8bf6e47629260dd0a23dadba4f770a017e19a80986a161eebe97590c2cb1bb1668fafa6853ff000167db084b464d102001316382015521003334e09886e43634a9dbd1baaea6495c1edd3e1ec4a67657525aaffa064eb8817112956b531bdfc830aa7eac566f13c395c90e7c8568162c8c039433f06a52ad9965b9d330125653d8c5d2a0e790cb3876c3da516d9d6c039955307d0fed2f7bfc89a982c63567d9aab9b8429eeae3b13ce8f25b3d4b6f56e962aa6140078775050c933c716009b87f9b474d9f755c34fdc6ca2c598065d24781272fb78a919ed0ffd0fc0c828b9cfefc9db49cbfe4e32923d28bfa6f54d3e02c8c772031f7e7ec8ab1ea9d481893fcb538f1ea11d7f91f91e3aabcf82ea1fde35068209be93d6b6f6cbe6c85fb166872726853ff110167c04d03d4e9d9d058937f5aab6764c79ac13e8e55a75edb2cb848f41ce77b3d253bf04ed624d7b84c066f6c88b868f016eb70e7ded1d33ebca8ffaa34aa40e006b7b650086d35d9ed16f7a9e82bc2da0b24596dca470240fcb2be537eebd37459a0f219b719a826e40a138c0daabd1668fafa6853ff000167db084b464d102001316382015521003334e1146eb37711b4da1c81c80054b2d4aba4c696c9976c99d9ccb4a72138f93ea2aa3489b8acb703dcdb1b32422043d16ca13f67663122f750960adec6d4cd755be9b9b3837972c691923edd8be717e25b44118e576af230070d8bff7ef85b15c8e0bf838b8c87cd4a4cb3e739719acfe78b9b55e27f41a6aed64dd8219eae6577cc15dea719666cddbeb7ce66f6295a400c1016032ed7a1dfa80c7ee83c9d3f6d545863bbb380b3d8edced0d3f71c0048ba95a93f0cb9d7a90faa305e85ed50f2ba3111d4c37b244abc07d49789ec507f1f2d4ea8861dd0e08be95484f5ea3bce0f2ca5ddd4166872726853ff11016798eea804a247e6a2d5ff830f5d5a9ad1956050bc3c49ca66fca691bd6d1296b51f98973e27ed5cdc1b3ffdb8ac65da1e47bf034f582895802fc33a36774c55bdd069ca7806ca52e49f93b39e2db097b03c88fe03b8924a9ce920aa4ffe49ca140854abeb2c629d5b0cf289914d9b1668fafa6853ff000167db084b464d102001316382015521003334e20243df34b007d276cabf8ee119becad420656c5445992e6fa8086f079916e8ab35ab227ac8f2012af4882364d94fcfea9d356088a6a8bd2d8849219121991974f7936b34a48bca0c811cbd4669f35bc8f19e9433d63b90d4cc4d178f14b396afbd5ab428a6f858870616b867ce64dff6c2bda3c7bbb07aa6cc1a85530a532cd5d4b872ceefe694c00edeed5e4490490699f396e0715af396e3fd629945ecb3a8e26afae50bbf35ec383984d897f4d05c37b4ddd228094f19151783a37b58773aa6eab705372a641562ce1eb18482709cfe4d725c26e2c9a9d87ed9bce894a863f8f1ea52166872726853ff110167863b4d4a28610092a386f6ac96c28c159ead763be1b0a7a76846095be7d0b71350baa3ada4460e78c400cba80d92ebf531e9c2032b1f1e2aaf4961a001b7afc3163ddcec8c6e162fe310cb204d3ca89b104d325a3685f40ef018af2fc1c0ffdca64e2191ec59f1d367240ff395411668fafa6853ff000167db084b464d102001316382015521003334e393549f560fa0259a36ef9d93ec6e183ee129ce307e2c4ceedd91a6ad1e9df186fc323bb615b2130671ce595010162e0b3551c0a3256366a6b6c0348e3a9371513f77e1a0c2ffe8b26b9f2e7e2298dc57c4ec8bab1e2e4c23e69ad3f11affa662be97434408a437b4b32a4ad0e9729d11c5dfb2d32f07dfc90ab0d4d7a690410bf8ee928af00673202157090e0b8ec43d4889092d4c5df8176fa45d879c361731c5d3ab9604b67f9509d8883b566b6741dfd3b4800a51c6dc650285a68401d7650ca32edcfb6c365bddead4281452939542e60251a3f5bf86a88f5963b084d05eacbce541166872726853ff110167f53c1df7cc90f460261d4c73df1c0cdb5db0b04317b88b421601b7b5857d81410230403414ff6e5057a356cdae7fc226b109d6e356b8bcc163567259a951d6e19e2a863b323ae9c6698a2184e8032fe853fb0698cee3a730ed3c9ce3a24f874cc649e93fc9fa5b3965becfdd3e1c1668fafa6853ff000167db084b464d102001316382015521003334e42da3b7b3555efb8b057bbd08f0982fc7087bd128959b6a0ba45fa7e604f52c947127c5d1add95a383d4ee8f2733a6e098829f838ff495410048faf5f29bf6f4a87bb89beb2e30482f4fd6c5903c96a2b01c6f85175028acaf572a27ae393cdae898ca10d53709f06ce07c881f8ee5e0782581e0e4fc8bf5b0ef4d5521f9563cfa8b684475211b2220c081e850ad95c17a4100df11ce97bcf191cf9a88237557ad718c8518c911e6453238b559a2a340985d86a14381f353150d8465996b1e642456f7e9cdea1baae411af74a12de1b18f13c1c77d24ef0dda699ca3aad91187221fe149d166872726853ff110167446764472074d5b60c9c7737937974476cff43297b4fe7d41a9fa80d8764d499c034a696ccd5ee625406d8373026401ca38dd05d18ee8abd48ae4de6a3a75eada0234b23ac251f6f4faa5f50853295d659ffc816c220f870becacd7419a3007865ff61ffde31b144e2f2b989f9911668fafa6853ff000167db084b464d102001316382015521003334e5127c08855b6a358cd3ef16b7861108d6ba6d93b8fb2b045b098ed237d5e792c72d59b3256f752c8e06761292d9e784ddc9fa102cc8a50e2cd7745a863a99b1b3bf41cc34867c75bbdf1e05ecba21919c8b88611ad60356e2020f58b8fc172d848d1381d0cebf1afbeb827ac7310a89d111fee9326dde2366b3d00f8488d303ee4ae81d47ffdf63b11baa68565edac243aba1dd928c1df272aa29b14a60d8c549b0e99369cb92187c26b5aa2f8839b463e956fcc6ecf7b1100cfc91537cfa3af3f5599f6fd56b4928e073d44f2d96828bdfbd77e2592275788cc50d4160e8056bd434e55b166872726853ff1101672f1418b3091f95a30751b8c36eb78b7cbbf836ad36b5d7ebe4a49a12a7d59bcb0a5461eefab695f076dd61b635db69734d8a50f93b228a1474771aff7275b2851803e0b99d8f1c5b8b9f51f6e68ef34eabd4ac256c3b907c460de431c3bf51ac78a72b5e8278b973a7e4602858a61668fafa6853ff000167db084b464d102001316382015521003334e601ac7dd8ad637c73dd02b5dcafed2649c896258f7cbc38902f7cb78035fb59c1c1eaa5c2332fed3f0aff5a666df140cc3eadeb31d3bada93d3de7c8326e814fb4075af6b1fd7bf5b72e43b055b2e735b004c3d3bafbdc46891d09b11b176079e92cad642b36eb9b5df2952db6eec85af0e2ff7d390364a40471078719ddf91569463187ab5f5481711f30923214fe2b14e52358f5b2c6050deae72f764b80544983f3fb08e36dc4959afa0d8c1059a5e59a06c17f82258fce5002265398eb0e3fe28ed7fac6e36fcca2915ea83dcc677bdbb66a754616dc2bf518880f8db736a398f8deb166872726853ff110167e2e80756f7399c52550177b15afff36c44615733637545e1ef9d8dfb906068935e864eee8f5342d76cafc6ad84266009c766dc4de18a6186078dfdde3c0f970c54299d1eca57ef656d4a133707005002f47d934fed9360b9a07b6be13fab5c8e5aef844f477a52488dc0f283f9931668fafa6853ff000167db084b464d102001316382015521003334e797615cc1704cd12774099b3364dd7b63e06df87ef9783ce9fc7a3575f9713d44f4664f0b3946e499cf10b02ac7246d85295e2dbbb47153f119129963bc4501f5d90cda8394cef278113bed6c5e5311007b7f587a30d173eb2b58e788b8ee9a3b5f5c7cceac7c0501ec54afce3933945d9acd0f9f09b3a9c206aa54f8f3acc42f8e0076c0fd6d11aef19beafda5c330a20621e510f75b54bff9ec1898e581bbb13991d63d2e4d26f91899a19ff198263d2c608c9bc5e1517e370a122b54a124c8554b61da1d144756550c84adc841e3897bd70f194a53ec1e074db60cc1974d90caf606bd166872726853ff110167124cc7332c415cf2e7d66106ab3f3a15087cd5c2b04eca46ea5f2e73f8409a135f7fc5480f64b78f9b9133b5d8275ddcf016afc166d661c14604e2dc75a2a981ed7f307ac25213160a83ee0969833c49b509bb9dae3b84999522221ec388c40812b7bdf1a7381bb48f88bbaf8de51668fafa6853ff000167db084b464d102001316382015521003334e88cdb1880f60d317e8ab94d7c879fbce170b49c4afd6077d61ac176fb8623bcb402cac59b35f95005492a350036e1acc3dd92a961150c7355fbd8884cac79e6368f902920f4c09ed44674ba7d0b768162397cbf1ddfba35d0b4c9bc72513c810481ee8dd94dc0c9dacb913d33164688656983e8cdf779582fedb19c209a8808e8643a28867a04dc0d4adc2f4f06f8c54c4cc7838cd6e58a9bbaf1efb8d23301be4e431d1af9392f28b063de66f1e9dfe44ba3cf3d0b337658a145efd0aabbfd35cbdc4084ce06f12ed84c1f395dd23bf9e25ff2f467467ca460ace7bae03ebe06daa8302c166872726853ff11016730307fa1fb8b1232d6ac8d40665ddb083c492115dd02776edf6a73aa8533063eae87d2bb2575b3f85c56cfdc4ef479af98d795457a7a8cf4a25320bd383799a7f9e258344abc5c161efddf5a41f82ee3f0e7d95379f5f847c9c300ba3bd47ae8d7a2ca9124a51cf008fc5da5a12b1668fafa6853ff000167db084b464d102001316382015521003334e95fa0d638f14b9128793d58eddc8aa3cc099214323c4e4037eccb6e254ab489324070c7852555310e572f571997b94aa5ae3fa3be798d700d8d0569af6afbe88e09ce18db22de4b242285fc1010c1bae08433e3f199e318779b4b80f84293f7769dc232ef10038199311915f47ecf34243a9bfc281e6286fac92bd6f51f86c6b2a201b614c1a8d0ce18cdb6a8d5f77af336822382eb9b177b9c1bb299ae70bb5975cd52013090a552ca2d43677d7f876a19a082014748c3356bd2fd31f5b74a7a9812a20c559fd07c248855c176b63478c1c54bfbdf59dbe19fa0b39c8156f04f82217243166872726853ff11016799fd984f3c19017631f4879951596a61e887afeb2590294582eed940feececb9be6670a9c3da23cec2228b2a9a3eca936a51c4b67c18018c9d352c15f641722b35096ab4772135fd92c722acc43485f7838dd176c8966836d277f4c54b74964c30602895db34f21c41557f3cff591668fafa6853ff000167db084b464d102001316382015521003334ea70b6914e8cb38893efc2de863342027cd6ce3cfef946ab424b091814d1cd1a3d5a1aae513115b5c2440f965ca7ac865415a8e404a833064f1f1162b8ba083c5c437edd67190d18ea54750a38b5468fa17375c0f5b2ba13d9f44084d500b5b4e332ea305da3cc12fc7a69b3ba37c70265dd5301c48d065caf7f418651ad1891752c751da36275b7b7227415b199f2270a831dbc90c2b37119ddc7167048be35a5ee81e75a339ddf51a96192b0b1b20f1d3d9915ea7391401a40e8b2d66b580324f4ddcedc13f83edca849aab0b71c16a1554b1bb1a2dcb0f865157f43fb5236b0560fd749166872726853ff110167ef3c399014396d164fd1519f9b90479e5e64675fffe6a84afe4c05360d92c394905c2a9cbfca61bc7e94d5f8fb147e00fafb860af8d857e6b6c4fa3bfccf1eb367cae4b2788b63de4ced0aa8b6ae29e87faba4c69c4d5c24305cd9b5c276f7a7ecd40b98cce069525ac47e7dac111668fafa6853ff000167db084b464d102001316382015521003334eb589d6733bcfd5069b64dc8520affd692244f58df593aa8f602aea61407b74834e9353271483d89da8ed9ec05a48983e932bc55ca908a1d7172f7479b48db5a6aec2c5ebd160b3a6c591c2bcb2e258f25527227149d617daa6601e8e90b16d9b95ada46d93763d13824b24e03eb66351bbdb37a6d569d0082b5b477d6eb588e4286d8a4e8e30b11e528cc874cc404bfe1f863fbe06876bd82f8ce3c20e48282ce12a9289052406d16e7e3da53a91f3859825cbc0d49de661ee025e325ef08054b00878437217743b8d8b5777f66e567d135005b18839860456c360424daba2bfeb928d912166872726853ff1101672104d2d57ca17c6a4f53f8cb144891ddb21b3843cce8e51fce6ca33eb7fcd99ba45f7a3d754a3c5503cad863590371b194770f6f1b395d9edac870f08a00e8b835d7275497a494b6a5ca0da7b1a60c3689bdd6ce308e0a11e1d60161a6cb1e15595f68a07b5f636d6a24e5544e661668fafa6853ff000167db084b464d102001316382015521003334ecc1216394670e12194eb0fcc0d7755343823cf5181e9c1305395491d677d231b6c545e027c2cd3c1dd37517740f8c30f465440cae8402b6b5b09edc64282b225b20d56c5322b91947f116d8b14dac4753042bc7f515a5debdbc9f8bd6746af3e9098b85423d5c06a3ab6f0e4251cf4d24cde24aa08ed09810ea57f05c770b1ac055adfec47549657eaf42f35cc8f7d4c66bd8abbb00ac31247dc381006af0f2813c9737107d3c885d2a03385011698c9828b72452a40124a09631c426007bd66f37abf70e79dbdc87e444de59f63bce47c91a8b15b595ea30d62a7f7689152f251531f947166872726853ff11016747ee725000fead28e672a12c613e12184bb14a80395de8fd0d64b717fe36e856c06d6c7d682ba1b6c5a622f8d5e173d743dd3dff4c9a79fadf8447455c5c7657cd63c3a0eee5d6a80242472f7fe8cb22c91e284c61f16450f5fd0a42c073cc032e0a076e66207edb584122aaa84f1668fafa6853ff000167db084b464d102001316382015521003334edb18a9bd5c05266fe15a7b124b0aa468a51bf4a404951a4638596c2703d9b0d3f4ee3e52b79c393ba08b7a9ad327de179b96a29b034f1e87d421dfb34af401ed4396563d6797c1913d981437f042a72cef21c77d4b21cd9e9b4c6d0d10aa542246720137fdde5c7f774134664f802f028385a8987d61c05fcfc9918b6bb2c9a5c2bdffd532ee2b2f66a50dfd74d26b3d39f5d8050a2a2b5b9b0067276004eb6c1fabed623776a6e91a2ad7b6a5254d7023a84454226b720d1f79d68de49a43305c637365744795f005030a84c4915599fd16ed2165462de5469c6cf69569d585a6f411641166872726853ff110167459e47984311e0120d1c7cb3c7d444a7947d12d5e7bc80d814d41574ded11ef3b2b6358642ccc0e5d6fce8fc1bd22e09bdf69b3514ca8b49d2fba0f6ec49fdf37ebd4ee99186f3ec20ad170e53eb0a1b2a680aef948d2749613ed39ea88670dc9d0153ed0456073d229f7024a51b1668fafa6853ff000167db084b464d102001316382015521003334ee2f844d035167bef0d3aea3b447fc059bb05e30e55b91f9bf219d8303aa68633f099fe87a9aef16eed88fa07fff6e4073b1b3c35567d6b985f145aa349aa037b6b0c8c7d545feb6d3e57e4e47fd1d1299f0678ec0c9700d60eefda7eb41' 
2022-02-28 01:51:13,852 [DEBUG]:  sleep done, proceeding
2022-02-28 01:51:13,856 [DEBUG]:  1: pos: 120 | 0
2022-02-28 01:51:13,860 [DEBUG]:  stream[-1:]: b'42'
2022-02-28 01:51:13,863 [DEBUG]:  len(byte_chunk): 100 | 100
2022-02-28 01:51:13,866 [DEBUG]:  len of stream: 16508 
2022-02-28 01:51:13,869 [DEBUG]:  ATTENTION: stream length > 5K, sleeping for some seconds 
2022-02-28 01:51:13,873 [DEBUG]:  received chunk: b'1212b7371cf604f7a42f0c699c212513c9fa6bcaf65558b9e3cf083ae48e2d19faa76b79bcb16afbcfb55652a3f079fd4fecae390dd1d2189d24d07a92ee1b45ac551c65876f2f9f421b9390dffd9217cbb68d6efec78490151e7181ed0fa5e9515b4c42' 
2022-02-28 01:51:13,880 [DEBUG]:  stream: b'6872726853ff110167f75111731b92b0cbd584ca53b365e3dbb3e76cc1e6231a1211fcf01ce88720234f3ae07eaf6b76b414534aca3d4b6378537c3f704a0159108646212f6ef2ae6d3f826de7a0ffd3ed18a2b3d59fda9e6a3240d4117a163702f176cd4241cc82f39b470c9982878ccfe55fed0a8ca51668fafa6853ff000167db084b464d102001316382015521003334c23378e30198ad56a466c5854104b7039a09f8b621ef37a89e56910ded97db06169b958c29e0defb73cda45f7018e2c5d1e167cbfe54159e64daca91d2c3e1868b136318c95f1ae56d4688994260bad5c1bb096d9ed6b4c1a1a515702d996c8f4b8ea652fa618dc5e0e546d66fb03d9a271925989856724069b28131abfe380ef5ffc81517466d27e1294e13868a19d041c35b373af52dcdaa3ea880772a06a7221a0edee1dfe740b5d0278c8529f4cd79b76e7129518f2b91096ccc45ae7c001a9ab864b2c24cc171c49f1df3e250d676298e086e3a9fb3d56ebaaf5873095b461a0ba4e7166872726853ff110167bed1d67a5ad71f9b43e1f7ba1a2fa4ac6cca823db9101ec2eee743dd7a50d12f0962716f45b8e9d39badfcda7c9db0ca7cf67b21125417568f910ad5754616f00e71764f8a53e13077bd642358ec2f782245a395c91448d73e15bab76b19590c24b9f93aeae2d714c3fd344ed7b61668fafa6853ff000167db084b464d102001316382015521003334c330be9a0d3762c9f2fe96fbc8247aa7f447b21c274f7f4cd45ac4d75463d7d387197979d8148d9dfc44ef9afeeb2fc0f66559eed36f8562820eed6d88c0f1bb6db5d163a08f1f271f46e64ae96ffdf3fc666566989f245ce46b5569d050bb6fd1ab8567e8caaf292f0690f4163173a0264296892b1642279ab6ee9b13ae18d34293c4ea2f7be479ca95b2a111d924f1a276f3154edf8cb393db17ea24c05050396d80a7a0a3b716244610483d526432b211ad21ca961cc1065b6bbd7f5815604a470d75e224c6fb0c1ecdfce8283f8a691ebe6563daff00bc3dbd344a56be4ec51a5aa30b166872726853ff110167b8751760baac077b2c1a689c167a0e49d88bf715093949714e4543bded3c33840717b2b311da4ce54ae4f71a3d79664c2754fa22237ab4fa69c9a0ffddc11e069c4961d981055090c299f7e17680b643b630116272167fa76aeab23c98b323a9b5f02a33b5184c706d96359660e11668fafa6853ff000167db084b464d102001316382015521003334c47507d41a7d3d11f81df70cb5f89d4a3bca05ffe1a281c98773e6e615340fc58cd41fac670c87780aa7a2c655a5f54528e81704cceb9cafe6ff13046e2d63f9022ff4bfe5f95b0a7862a298e1551fea257219943ca2c9c3d47429efb392fefbb737cccfe8003f4d86d976692794696ab9663b2a81c2b66d8ef3bdfb3a72eeb29df3276a0bfb78a3bb1ed1fda6d95229bf0bba230f547d170fddc12ee9e2cc57421b54ada13c1dea9a51c9f2f1590ab511db42b9abdf341ec4d4ae4905826de0273dcc6972181754ca7459d2052559195465bc40d154ebc7a84b65709bd4aa42108f726c26166872726853ff1101676e6646dfcb5da89c371f6ac2cbfefad3075104ae2c4488ae42208c27eca72c54787617ee7f8c88063a13fca99af5ef6b36fe2c0f443b8b1059affece22bfd724d05910ccefa97a50cc11013fabac72f1dcbfda585d2d179dc9ea912550f778674f7b7d7e8e6e2fe78fc546db90741668fafa6853ff000167db084b464d102001316382015521003334c58a6c359b51169a2cc59b09e1d6b850153391ebea7713542418b76c2cd6e8f130dc9ca52eae1c8c40231e689898921c53cb4a9e04e9b2c898b8cea61ceb4f9f6337911c51de6b481bc9b2461e7313f43d9fba10d93d33e3b60b2787f1c0ecda14da0c74a29a40b0323c9245092e371746906fdd19186390502a7b2f3698278993338f7a83ef59b62f59f0f14556eaedf97aca151bb49639bc2fba05f84706061fe6876f835d032442e96d1b100dd0da3b4ae9aa15d17f8ca00919dd26ba123d21e5e4d8364189926d86c16ea10a56a5637051ecf60b4a11533adbaaa35663e350ea607bf6166872726853ff110167fbf686d84ed9491f363a80beba4052208ab606d9ba4796b10020b837d8b34fbd9c706407b3d838fa856caceb19f0579ed22fe60db4efb98b1c74275d4b2fccd185a8eb584e78ac89615bfe3618939a76a69e7edc5c2ada022ea801084765b28bf452f70a3f53b6afcd41a3bd0d271668fafa6853ff000167db084b464d102001316382015521003334c65aacd921ad29a9d1dce2864257712723ed90e080b6327c95945d946b354883f5a0a9145a50bd1599358e33945cb23961ef4fe0f2b6e2f6c5920e9d9341c46b901bcdc1737bf99ca707196ebb20024e5ca78bb1130b0361b22f6aeddd1f02bb32e0d88748dd54f529056793b72e59a15dc42b57d310d3156eab0fc38087c8d577749e18406fc93f918568c9984193367384091f61a7597ef2cf642bf938acb5722057e46386ffd5531b1068329ae357ed1f08775df98d499332221d57f309b5a46270a8be809762c4cbfe04a46959a63cd926841a2db088db5338cdf0a8f1c3d69324ca61166872726853ff1101678a6832f5dc7ec91398ddc5bcb928f265402c865a9ab9434ca00415431115b3b27dfeab01c1ae72d8fc5fa390980b44e784347362d0a7d592480ef7e5902f546a481b06c1af263cafb16cfa82523bb093189e87b363ec4379fb7fb3acca94ae4227571d8487e22299da45a76f13531668fafa6853ff000167db084b464d102001316382015521003334c70b9457d0250cbbcf4142d2ff64fc59f970aeca4c7312dd6a61b703f32979dbcdc65d140eba6d2dded3c1543422b58d34661df4a012fcf2fc1a2f5898f502459847ea06fb5afb8ce1c79b3fe83ee99e82954921a3e0c061b7f1bb8ef784f7705f492ed55dea74b23dd8d3dad1a4e0be70f79ef9e1eed176d82b4ec84cd11b9d9f7e2b4876123d57a1b326166a9dd2e9f55df4d4afa4c04397776e04d5db7d57ded13d13e2c63b90fa0ffca4c3866bd6d0cae0cd912601757b7804a2f76de20003cc20d9b05825649ef6c9a16b2ec75e464916da2e75a51b3555676cda3a5192b360631f04166872726853ff110167a2e395fe19bc6a568edda4785a0467a8adfc723457ab764317c5a3b29332b592017a272d63d14cc6980256c4c33daf3b584d58933f4f2f0f29e219d318d80819408d3cf90c8d747ec8173b533723827b5b41ede70ab8ba26dfbbbd9afff8da0b65561fa267cfee5e9902487e10691668fafa6853ff000167db084b464d102001316382015521003334c9e70da0079170e5ba39ecdffc1e72483ee1476af6fa8fcb139fa75e69ea1cc0640d5587b8a2ff7caebd2c3076f900ebd6d4afb0397653e0222fa5c22feab29359fa866d0755c2a5a9d9ae91a12fb09ce8fb4910e2d65104ddb647f1f90283a2e55842030f22c189b6308c3213310f4ec9a7c3f4649ba735c853149729f89f4e87cfd085e16ca56aa2ba679678e93b845e31d479ad222ed4c5d249493ab16b74410dc74df450403044fd4452e89eb4e39f2c97698bed80d71fea62b73f1ac00a048981f5cbff76ddef80b20e1390d8df6cf8b7d9f4c6a0116b7fa8f1a84a002b69b72b2816166872726853ff110167b2a28b21a66fd69f325d99fe10ef01cb80f60c55cc1376ae2fbc51f76bceefe8caf9bd8fb610bceb6555773491596c684aa8090e6739251fa5d5204073e537df7b94244b0623b7ef7e78702b0ef3fd2498671371e9a1309707daf58c8c52f9fdc4600b283d028f24f5541b77eb501668fafa6853ff000167db084b464d102001316382015521003334cae8b560ce38f249c3cbaa766b39209a2083603140cf247ec2282d78575083860fd90b36105de9b841fb01c4771636154e0e3a13fcc3cca8f8fccd1a4a599d47a5801e7241c596360a76105f201dae28e8e50dfae3f4becf850d612292dc0f95d911bea36198c8929df94977c6706f8bd435758c7f2df58b4a033871a922b7fb0d62ad1081e4c2dfd185cb1453917bf2256011995c399d18f3e1b22b44b9011656c4b1a9b339269c99828e20c75780bed7cd406d499293dc8d887248088aae169ab7608b23b94ce99dd84857e41440d86310737252a0655f393054e594003a127294815ebe166872726853ff110167d2cae6750c847b757a1725a0da496940f63be579145534c338a55b931f5a98877ca788fc6a1e79438d9f64da256b3a5a3e3bcadbf5e83b77333995500c3c3b0dca55d41fac2dea036ff12560b95e0a4b53ebeaa6b1fafcd5e8286513fc752c7d3f8e709f3ffc0ea4aeb5f159d1191668fafa6853ff000167db084b464d102001316382015521003334cbe4947c12aa35ee0e22a652c4071bef331b95ee28cc85a2a3db09d962fe7f7186752e16af4cc619a0aaa6c53ea86e0cafbc17e25fea4709a788b1434df6660da20ef424fac46cfd48ede6909802e14254d372ceafdca3096cf9ec06b94e56476bfba016eeb9b8031cd501d03d1e52d94dc23ab2c43c91dace48d24865c153aebc5c81624a84233aa956a9df4f1b165b14c1319887628eb35f45822d60bd03ca26bb90bfe385ff67cd68ad73c0c65f12cf5185e58e6a91aa4152f4e8792a202041139f89a5b6f644ec0162c2fda989771fdf1fe8d7ac81ff877493b3006accbca4efd3da77166872726853ff1101674b9835d5a05872b04d1f0abc820a13917bff9f39d34dc0d25813a6540a7bd7a109e535512c0fff8968662cdc3a197cb07371717e8e57092bc3fc22fdd5f5757edbd63a3211ec453fff03c137960f38fc471c06d4d1a454efb88a5e4c8bd3c28e2395bdb85a4a05a6a84238b11a161668fafa6853ff000167db084b464d102001316382015521003334ccd19cfef7949ff130cd272b49ea8e3efde5f30d00455a518d0a086f1596982c02cd83d89c14f3464d8ca0f89d3004f5e5ffcec37de254bbd2158412352800071d5899dde1b1817f418c161905ef3540b17ffc3c588717f4f8a9fff90b0fe492e5511247adfec63cd254ef5846b0c2a38f7a395a398589ef7f38140c8fc1813c4d78ae1500d463a5f69b1001ef12f5d3d8b1849896e0be7b837a188bd7618eb59a23c2d2dd9be3f9f8711776a2b837422cd560c4f2ed9128aa06481c313b3ff6d6b2c67eb8036d0fb64692db013ea63569df851917c55354603d86b78b70fef6c280e92ee3166872726853ff110167a5c20412fe904d914a2e394e23db4204f5cf15e1e251325a1fafd3b49906c8c914be365f45c7addafbd0de8161bc88f80cc2d7797bcab5caf6a3ca722778eac2340edce12daa52c562e792217d9f00abe39b9ee71cc156a42e4d1f96c11642f18ed8cb605cd4342f18a9d1976e371668fafa6853ff000167db084b464d102001316382015521003334cd3c5bac70ad873d1e95f1dba0a53a5f23a44c2b1fcbb0b749828269a92f5f560aa55bd8faa0ab350bea3082c8c13f326c59ec51dfe29eea30b292fed40a459c418bd4412d521dcdf03d966d98595cfbe45b406a768e4a89fa5f318c74b88f4b8f977eecc8aa8d8df65ebdbd11f44ae019706a561ec13828ceff9302a153de21c39ca1bf3b2faf43975e605ec25d54c4d0ae33e8c7f2dde7ccbcfe66abf01a67585f2b88b388671365783d555c364b385971a3c3f2166c88967e2ad58664bc5c59ff4ea65784b34c1e88ef83eaefd8ecc847701ceb2b0e9e604a0576c9ca07b73d5ddf9a95166872726853ff110167bbc460ecda074867dba7bccd625646de0a6cd87914371ae8a9a6e79c4e47562ffe6ee74a24393151accc04bc25f02cf1afa8517dc204bd9ddd557f28b44653cc29dc78c30d7144f6ce2a93134edd23919519e093d526c881d7c685a6ded0f43593aab562647336bbbd660d2570841668fafa6853ff000167db084b464d102001316382015521003334ce5c872209eed67f472ae8bd83c9216ccc8b1734e9d43ee4aacb0bbc76c58fb6cbd27beee3f5ce4e6e37ac1562c4d385eb8c2f5da8c8f12b668ed8011c67c9223244a4c41d289f3974d773ac0f0e30cf553397b6db373c1b5629a946ccae63fe722d34ba464a2cefd7ac34579c9565b766e33ea12437f31e60eeea7bb7605633a14532e7785e3ed5904fae7ed88c183ccbfc10a24ca9ec51c2ae3ac584eb9841bfcfda638afcaa9551b472cf26f729f7f342753eb0120c37608ce32e40e6b9b426087a4d59e338158c7fe1049e604c2b65cc4ca56c51f339f2de9695d486d0bda82910fe61166872726853ff11016758ad5cfc6ea0d49ada6152de2e473023da93fa7d0b8d123d7865c9d449a8621ea8990159685ea00978d59f930f5dc6a9052bdb93adeb13f8c938b07633d60d96d53139cd2decc32998257262b7d94af694304542f091e5382ba5383347a87f6259ef4b2791c5828684b4413c38701668fafa6853ff000167db084b464d102001316382015521003334cff85189dec97aecc6ad503da71cce7069343c45add03509c15b612e42b06d64f23714d9783f4ee1d1dc0d27e71dfcd912a0b2187aefeabe1bd5871cc61050148f1f2aefda4911b312c34adacfad0ce92731ca6dacef5c0d0da01866d4333182bf51cd827c92cf0c53d3ece0811d7c6dbfac50e3619911e8f5e27a74effc147c78edd40bb6dfae0835fd4c012c93fa543accb4ffef6730169c1e8ac4d405966d0f4dfce8b86fc9b05b29c847e8cab2257b4301a3492a028070dbf2e9ac4fd391a64ae9b4c3ee36d9eecb065470b76829a22cea9b60a0f47a7f49bce6d4ab062756fef1de06166872726853ff110167ad0bae1216d2e5384d6c6584f707938bcf2cafbad8c2863763b4a5d4334be71e9de488b886e53c8d467e665721f3ce8282947f3fcb88411cf1b4a4faee904184161c27cb45b18ef2a238235cdad3e753cf65a36303774c8dbb6c51943255f29931d8049dd8ebc30d869b36bb06921668fafa6853ff000167db084b464d102001316382015521003334d0533c0fb8d2c481fd29b7e598fff4dc6f3b20d8870954bbb793b8ead3ec7a9054c1c1d3399364bc7828103215abcbcfbffe30a373d4c223e3ad09661c62f3cbbeed3ea93f17245f7bc0b8be31b8c0525fa48b2474992ea7ce2721f85b34c8cbe97690013b43a2a6b4d9e1b60aa3af601c2b4be65908b0635b1a44d2d0e7e4637ced038d083b3d1a7e370c2360b3359d740e9283ef7a1495f82f503059b340d985f2f5a3141ac1f2a0517684657092575c0f97baed4ab3ff5c35bb9706340ea321f60c8e391281652b14b03e7d69652d4ce8b4bb8a1ed5fb4838c7870f6588179a730b3355166872726853ff110167822f2ee62f911fa884c6015f111206eba21b782b032fdef22333d7c9c4085ccac1eec4276b685fda9cefad41a1e87e3a8a37fcf483b097c20daec547db2660ed9631febdeac7a86d67db686d3f15c19c8ef2a42af495c11471fcefd95183e6e88b0ace4dfa702d957d4c457685491668fafa6853ff000167db084b464d102001316382015521003334d10f02265ace8457bc29efeb5f9cf2202e86c199bd61b5e1decee0afe90d45bad80a6106537ece7bcd309637a85594d114a1a62ba7aea60a8951ef7ffc8b23b3b57f38936adc42f6d06b0bbffe223d232e92de4b89678f61c037cdd20ea3860abdb6b0cec2bf28459e2a519149e4533565a1856c54ec8da793211f6e2a67f473633264810170ba676e0027f2f3e2bb7c139d8fbd9536bab2a890773c7235be27ffdd3260ef179345bcf08589b3ae25535127f52c55c5e033fe05b29d04b3df882db2beaecb0de20b12d908cf5ef9d3d45a415830aad547c326ccbc3013401cf81640d79f97166872726853ff110167a525816e1d3a42972026410c34defbe965929f1c746db02a0a5b3fc051fc48b8b5dad2388f380ed2a963fb4fb8eab166299c95efd46318a75f650bb001c3826f697fa96213a53920258bbd32ffce9327ae51046b43e91bb5e14d0fab1ddbfff2a967f3569914704d7c3bad0197411668fafa6853ff000167db084b464d102001316382015521003334d219f533429f01061e8d4d83b436ad259f155b64126064b254848a080b2db56fe7abb63987731a03dde74581abc7a8a68a47c80ada63528280248ebef5ffc4d6a86d1a79876a4b8dce64bec03e9e5b838e97f2634b31fae85f4e67743e34dcd2a362eac670e4ed7ccf9c568eec46201500e2c417416eb623d47dafbfc11bb46e440854f146cc574c2de30b5cec68e49f75cbb6547cfc798da3ba6363d854f9af19fbd7ced5ae6f1f953a4f8990315e73907d1c5da44796d7f3f0e68bab44a96a1f218a4f3a21ccd028c9e694299074d011a8f112d0325173a678408d865b049f9b0103c280166872726853ff1101672f31f0ad27138523467efe6a7d9d7758b403ced7f4b5ac9bb439e90f33cfba3b38a3610a3d705b23f52e7f741b66a86aba15da6583b6fb44befb4990c28d07511459c1255065b9d3651925b6e5054005ebbdbb7ed5a747f6d5d2a2eedef7896a53467526ec845480733f6861dc441668fafa6853ff000167db084b464d102001316382015521003334d35a48722340a5f8a70b8b148e9e236091b610cec6387d119d07fb66f1d8759e612388c28321876d494aa2079ba92e05eb66fd80cfa1fbedb24b612f080a05a1974ffba5f0ce9a2db01bfc1a38ec19d6989d0e89dc57e045eca5a82d4bed2d6aeed768d22c028121525fdab59e15077056c4695de0927d3d1a6346b75bf1e398e86daeca9864da6b42b866a889a1e0b0624f65dc16e33d789f5ddcf80e293c353906f15b3ef82adf3482f62a57d609d5238b44a9464df1cbc0a1e3398c5e08e9431d5a22a7f651fac19014ea9bb181749504fa5151028ca61e6faf7aa729dfdb4b840e3a64166872726853ff11016756991d34a21284f714e4f9a05e4ce4ce1a99bcfd42e43ca8d3fb598651188d027f6c465b7b8bc080e74f3b0d85ed91310ae59cbc0b4c8b5397af1dacff926e7cc27f17de325e54c8e8f64855966aa7cbaa3db89c05c30cefbdfd7ef238db6c1b97174a626bf989de52ddd85e31181668fafa6853ff000167db084b464d102001316382015521003334d431f09c7e451dc770a3861cea35bde17e9d586e03752ab9e0a67b98495ac3123425db27106619a35497a10fe8c8a9d43d3317c5a4c8c6b28cec713d09c25e539bd775de9dd91d6ea71f8c6334169d1c4da4e4998e0a110d85ef9a2b2770fa46ffa75589b95e3a86b583fc49864ed791a637dc31557c13085f4aef19eea2113688a3852aa07a7be6b972c4d250f483bde4e09cee543d7c070e73f0cc7d766d26fa446fb721c31403cb316fda1738d1b20bf2ffc858cabf03086b1ce5a67817edfff836f373975b08effeb033c01e554e39d8039a4b63b98e55f319f255c56ebabdb28494f2166872726853ff110167c36018f645c5e8356080e82707299bd1b0a51d8437ce76ead7b02d7f999c4cc07518938839e14edb1ca3c4150a88c84eaecf2b3dcbfd3e8e352c1c4fab54fd0b936b645b4077636753da07562feb103994a23318bc9c715e4485d6b0291b31022862457076cf2c39cbed908264a41668fafa6853ff000167db084b464d102001316382015521003334d523255b860d03d3ca54d1f02112985256fb4a307f8a270cbe2c47c12c5ba6d694c142f3af5448bd82ee30bc5f939f8a8217a4b535ba772b1f4d30fac30d137c9a25804f9ccc05bade713cca25c6d4539a6b7cd0daf7ea8370949cca8f98ae6ebe676514b551a51fed9b1d65b3a646ddf28b747f8fd8530450f5fc705c86f3ce5a308618971df616a852d2159a1940fafa6e2b361fdb7c0d303f935f8a1b9df181f9dcf94ab75132d4421edaf1ed7dd3bf3d233be6e387c780c497ff75214022caa09a2c1e9b2fb7b51cda6ec27abdc55fab0d16c0a6c743f53634c8522e4f9b477746bb3d166872726853ff110167df10001e77ecf17df32e65cf8fc9cf17bec5986d118e3f6280c78948e39b9957088f6531916c96011344a88b7ee9513e84fd6bdc19c02e9c3b6332a13bab39b3b1edde0e6764923cacf32e0f7b0c12a1092d93e24bdd6d52e4117059b5adffac056071502bd4978512e0cde6a59a1668fafa6853ff000167db084b464d102001316382015521003334d6e774c6a8ade7df0297a8c70b91c0cf0703ed5943d20c68a943854b4be5673046986e0ab6c0f5705723eb83520d0be294ef8925d153f9e1caa57f8daad4d0dcb26e825060bfd00537f01ca0c7f0b44359b133910b279c137bf987e67d2d6288cbf834812f8dc97f1154428307b2127a0eff08ac94786244926ffd8010536d53c2b8df2807e0e107a893be11b1eaf2b3c52a3c798a617272ec96350fd6e0eff88d60b8e811f64788ba21067eeb3f5680cb99993ec8d34121f359d0b76a5aec8155c8c0f0a6a0fab6c6c869354d4cff7c06ae30f8a4d97d6101e23edde6420fe4c68c1cc306166872726853ff11016768dea9f90b62c69a675747adc04b4c0faebcb92f624064c78bcbdc3654eedcfe5ee6c28a4db668e75c822d963160c420ea26dc3aa607ef9bbe60727bb2d94a76d19afd01409ce888d8b6dcbee26e3fcfcc3612eba3ca1ec44fbe8463d41d53ee52286fad3aaaf52b961b2b7e24ad1668fafa6853ff000167db084b464d102001316382015521003334d7227973fdfecdca0db12950ae9d384eebd36a9260eea0efe83f4e87a2ec620a7a4384cf742b2dc1d890234dbee8a2f3eb4ff556ce79c5980aea1d25d72d83ec0d2aa3da103e48f852cf32cb013a3418306be89c56c5159d89981a79f2556a7b4e350396779b8b77ea9d0a746c6b89bbd9c91aff26f7eee6f1ea3d67fbfb9154b3acf73bf55edafa790f0e271d8f88e153353be3ac932d3dbc237a86f935ee39292da9d476945d7d717c9a13c4ea45aebef221837393b6d72e1bd66e3e0c7a22c39796fc622885b062e1d02d5a6a80d83b518c350991b1dbc29875f70561eaf8dc2e2fb809166872726853ff1101672092f8a5c7a7cbf1fd9241d136fcc33875e66a7147b13b5ee93757f73b64e18435c655eee8e68fd986474110bee64440a17fd5256456c555b0e33a28165ec032656395c672515693f2780856590467a756b354e45bc6f2d246ba2ef540dad110f6f7bb8dbfa866a18ce0f33216de1668fafa6853ff000167db084b464d102001316382015521003334d87d3282b90f892b9ecaa9381af1273f079112323f43b069e8d4ee584f85dc135271a3f2a82832d0c9bade9f72a4522398be83dfde4f24d4157fda6590de894303c9d34cd0f23b9c3543e41a3631b4fb78f8daae8b399c6094a746b7ed32a343ca4ce6d62d028c5ee7a673ca2360b52e20a068fcc13b1fe5a5c69549385eaa82bc885110f40603843ecfc1a015255142dcc27726ed1dd90588f21378c8b6dbd2d453ad44a2197370464ab24c733adaf73ffe6c642b373acbbba7696be5f0ec09e0c2646b988b9b3882268f995ba3ba01e87b9ee5a2e9f78c0fe2ec5c6130b8cfc8e333555b166872726853ff1101675f9d2f514b5a0d27f71d3b2374897689e4166a62044030f7eafb73cba934b70101c942d721661f2120f45c3e8b6657fff98b356c7c17cf48abc1cd4c57f7d51e77e4a4266f6b69ac4326c837df1234c8e11cc22dff594d60c7056fa82332deeca0b1b63cbcc1fbf76f02ca86b02a1668fafa6853ff000167db084b464d102001316382015521003334d9d42b9f7397646948be0439076693f08c987c599d671b570a7ffd515dbbd4291452b6f8c68e80fc2ab87e2266672843701b5fec2080cfb1be6bba076d633a51cedd66dc4b4068673aa35c41089aabe54be4ec9eb7d37665c9cf9b16d067aa3fdc03424f32480f50174c14a272b9a0af8f860fd3668bca5f1e2e423ed65c7ae624a2d10a1a2d06be0654dcab07f4a32cc38335e27442d5806fd9f1cec28489092afcd18d7cc4e229a793eeca5543ef2181afb446c09f6ff9469169c999acca7096a63865b07163af71768ec0a98927983437b9de29586c0590eaf31593a17b457c86ce1e24166872726853ff1101676c035f7eb60cb612550d64f5ba89ae1ef3b7aa7d52e4a34956b233c722b8c1563d74f32322b3012b59a546f2fd0ecef907b6c6124b32bbe477e1b61085e624fdbb01a54f30ff70a7caa5dca3a36244a1902b64adbcd011fa563910ffc59a101dd5846ba156ba36d1f8547c2184c01668fafa6853ff000167db084b464d102001316382015521003334dab0fba4ed4d056adca3cad8087430c063bbbda739d2984652fa099d1321e4023f3a95a082906c33744599c722dd3d02bf4fc2e285a56416cc35e2147ac0ba16fa74eaa85e527d5e6e1982ad716eb9de1f75a193857665ac4fcf5d82da130e89977d03033a0a8a7f45b1c2a5ff0723a790f2bfec923ecb991f724f100b135a0b3e2c3aa4044f89dac3cb41ff790b419e24f21e687c7b1fe3d77c209ad26822553833a1cb7209c5e3acd72f741a180164c7c628f451b0a7bc0b4ac0359a2abb1fe9f9522fffd36bc92f0a8f039b96dc2c46a90a3ad2bfd62ac0786230ed6b2b514606a7f4db166872726853ff11016745935d285459de929f049ed4fb74482ffbc34af8ba81657cf58eb9adea4d252485abf8fd7b3415837f2eb1e099a4854af8d890eed585ebea2f20d696e539735b46f35128fb9db09bc504dd0fb4b7c510fa650c93371b7b1303e0a79240e62589ce00254ce75bf2b7b9c4bdd696c71668fafa6853ff000167db084b464d102001316382015521003334db8ed6879c10a87bdb90c7de97244d4aefceec83e5aec3665aa48e3eb3917dd4223550dd37ca676a9d7532604092de83d9e1c797e74db1ba4be61e4ed303f9cc2251f55782483155e9a7a9d3aa96b03f70bc26bfbb0a0f491bfda7e89c46bec22fd9dade4bb03d36504333a858e9adb91cf103a45ff337da8f56f17effcd4876588b4a7f08edd9fa784964028cc1326b932cdfd218bb3494877e0afc0da76e8c2da15f5fe87106388029287b03710b13ca1a0cc007ad8282730bcabd6d64c8dee047240f1d5ad2ea99ef003dc00a88a46295147ebf27fc6199729f8b4239762dba8f43461a166872726853ff1101671a25ca7d6fb611b5d86ac586bb106759f325b288d38481a8c4c543c70d31d8ee46f768b32125043f0fdc367d17dd91a194a4536ce979e99cf65a1c54c0c923c6cf2aeacfbe519f9fc64d36082b6eeacba3dccd1d9ae120e2f1bdcbaac958accecdd3311f557f288d578403f1c1bd1668fafa6853ff000167db084b464d102001316382015521003334dc97a1fa3d1bbf4f15503d4f650cd3f5ecfd1160b0d57afc59c018e1b9b3d0e709878ff87f255a4e097602321e479714ea61874fd00cdcb4f9863271ee3cf629b05c99cb0b43ebb3526cf9e80f82c0f11ea8ed8ae69826f90c6033bf61c6ccd503f822ee23b1127dea5938cc5c66c2d2111a979a64d85da97bd760e3b8628596aff07579331e8a188ee30bb1a77f39510a3f6887b3564d90e9f9e50b55f9624db20129b2e91a65a2c65ae5a279c573bb208086a9ebd3481a2b54566b4063f6cf01f7a7fd4beee6aeff5759eb56311579060128332b9f96d15a8a4d2570393c8f4383bb6179166872726853ff110167b7c5cd0517e45621b99bff760ab757fbda3e9b9f3c09e14fcb46b2e3360d92dd89311687d6016f48c73e20234763a65b142d7b997e998bd1798b67a65a800fa92031282eb52863f59a8065bf6d729ab6666409005ed72acacfe1bb8e5572bc148a006371a2eaa0ce8f67d6e717c01668fafa6853ff000167db084b464d102001316382015521003334dd90e4b00d3c1d8b8e4453c7b0715adc5154d9833321d9d79786c4c8154f997d797a6b626848952bc49f12d26ffd7f574a25d7fe8315840dc31a1b3fa5111b023521c90383697b665b4f4210347eabf8b542dc7c0f0a28112487f9caf12c82f563f651e2694ec20c32fe4aab18147b53d57870b36a2fe38c2112fd9d0c6d59fd365c3e29419d05d51657b431debaa90bfbeccb92ddee745af5e76f4e28f8e2f8c418d27767cf6123ac265f6b534f6499db00a0f16bff6f80a0df3858cf6c63c5a22357eda439d50e5df5b4e29e1d4115c2ac386ffc6d40c47f299ce7a198b7be4cf68b3583166872726853ff110167d9e9163fd9d56872cf75cad3f7647f63ca10f7db1598e056255431d75a9ac74f09051bbd26594d70cfd31293499dc344610397e2f0a3562f797044511bf3c7eed110f3722516633deb167ae6f9be5ac922b08d5585c2db17871056286c5a969d9275c9a03ff6f7aef64abe4e78931668fafa6853ff000167db084b464d102001316382015521003334de6e2b21952701d896ce8b50f42a087c2ef77335e2dc96c9a362511c83dae63f893812dd697de286ac61066bbc00a122fbee626bb4fd12114c89624ffc96828d3a3733af0847b42297c5bd660c11a827e0db793176e7d83a0295561663c8bbc1ee35a2ad508a50a143862dfaae4eb440fd6ba313f4d05d8c3c7a41c19dd2eaf54bbdf66bd4157a609d1406ad5d1a932c156dd10d9dfd06548ad500cdf56d20c040aa4a304a5a14dae2411ffb45c6fbb78af35f6c2aa8cb90213c838aebfdcba3d3b739e4c0fa691ff0cabe6dec3b8165534b04cf54561d7f9234f2a6ff06d413422bffbb37166872726853ff11016762de6038fad844c1e73e7902a6b998456b60dfb8992957f0ec48440d8eeff405a02087e0be79841a6bbd991ea189c0577403af63bb820b9b350d96354ee187c977e7376bea7b83b6fd7599be30668e443641cf21619a8b65daae769dcc0cfebe49abb6318d4180d2bffcd3eb790d1668fafa6853ff000167db084b464d102001316382015521003334df919f9f3dab6f72358bfa37ff03caed38a99a4753cd84a94b97d87a5bf1b43aec391d8170c525eeaad989a6beecbebf5555e367e88abfd5322b807510149e410a73a79ebf214d4749b0f32a5a13cf45372b6ed7c87c9e9c27a2bac39f9362baf3671bf8aac4c601ef506ca4b780f2e7c3ef033c7499663f7158a244dcb1f5661572a4c758e029e15ac86237ed676641acb9fde0d7c618a32fd4211c93198b2270e9ec7f14c02bc3cbbc3754a31678f7e558c69feecd6034444dcafb8e2c1e2e3632b4600936f35a929bf9eef7e7150b5b4bb65fe2fdf8ae728c58ead6be3a80d149f74fa4166872726853ff1101670636f01e287a1d77294127a609552e4cb184f76d2669a21cb53e077ded0e12d5b05fd1ce9bb297e93b8a856a148713674a5d897746b6716d31b5f4b0bdebbfd87743760b8ac61ad2fa4d91234b253f8bf6e47629260dd0a23dadba4f770a017e19a80986a161eebe97590c2cb1bb1668fafa6853ff000167db084b464d102001316382015521003334e09886e43634a9dbd1baaea6495c1edd3e1ec4a67657525aaffa064eb8817112956b531bdfc830aa7eac566f13c395c90e7c8568162c8c039433f06a52ad9965b9d330125653d8c5d2a0e790cb3876c3da516d9d6c039955307d0fed2f7bfc89a982c63567d9aab9b8429eeae3b13ce8f25b3d4b6f56e962aa6140078775050c933c716009b87f9b474d9f755c34fdc6ca2c598065d24781272fb78a919ed0ffd0fc0c828b9cfefc9db49cbfe4e32923d28bfa6f54d3e02c8c772031f7e7ec8ab1ea9d481893fcb538f1ea11d7f91f91e3aabcf82ea1fde35068209be93d6b6f6cbe6c85fb166872726853ff110167c04d03d4e9d9d058937f5aab6764c79ac13e8e55a75edb2cb848f41ce77b3d253bf04ed624d7b84c066f6c88b868f016eb70e7ded1d33ebca8ffaa34aa40e006b7b650086d35d9ed16f7a9e82bc2da0b24596dca470240fcb2be537eebd37459a0f219b719a826e40a138c0daabd1668fafa6853ff000167db084b464d102001316382015521003334e1146eb37711b4da1c81c80054b2d4aba4c696c9976c99d9ccb4a72138f93ea2aa3489b8acb703dcdb1b32422043d16ca13f67663122f750960adec6d4cd755be9b9b3837972c691923edd8be717e25b44118e576af230070d8bff7ef85b15c8e0bf838b8c87cd4a4cb3e739719acfe78b9b55e27f41a6aed64dd8219eae6577cc15dea719666cddbeb7ce66f6295a400c1016032ed7a1dfa80c7ee83c9d3f6d545863bbb380b3d8edced0d3f71c0048ba95a93f0cb9d7a90faa305e85ed50f2ba3111d4c37b244abc07d49789ec507f1f2d4ea8861dd0e08be95484f5ea3bce0f2ca5ddd4166872726853ff11016798eea804a247e6a2d5ff830f5d5a9ad1956050bc3c49ca66fca691bd6d1296b51f98973e27ed5cdc1b3ffdb8ac65da1e47bf034f582895802fc33a36774c55bdd069ca7806ca52e49f93b39e2db097b03c88fe03b8924a9ce920aa4ffe49ca140854abeb2c629d5b0cf289914d9b1668fafa6853ff000167db084b464d102001316382015521003334e20243df34b007d276cabf8ee119becad420656c5445992e6fa8086f079916e8ab35ab227ac8f2012af4882364d94fcfea9d356088a6a8bd2d8849219121991974f7936b34a48bca0c811cbd4669f35bc8f19e9433d63b90d4cc4d178f14b396afbd5ab428a6f858870616b867ce64dff6c2bda3c7bbb07aa6cc1a85530a532cd5d4b872ceefe694c00edeed5e4490490699f396e0715af396e3fd629945ecb3a8e26afae50bbf35ec383984d897f4d05c37b4ddd228094f19151783a37b58773aa6eab705372a641562ce1eb18482709cfe4d725c26e2c9a9d87ed9bce894a863f8f1ea52166872726853ff110167863b4d4a28610092a386f6ac96c28c159ead763be1b0a7a76846095be7d0b71350baa3ada4460e78c400cba80d92ebf531e9c2032b1f1e2aaf4961a001b7afc3163ddcec8c6e162fe310cb204d3ca89b104d325a3685f40ef018af2fc1c0ffdca64e2191ec59f1d367240ff395411668fafa6853ff000167db084b464d102001316382015521003334e393549f560fa0259a36ef9d93ec6e183ee129ce307e2c4ceedd91a6ad1e9df186fc323bb615b2130671ce595010162e0b3551c0a3256366a6b6c0348e3a9371513f77e1a0c2ffe8b26b9f2e7e2298dc57c4ec8bab1e2e4c23e69ad3f11affa662be97434408a437b4b32a4ad0e9729d11c5dfb2d32f07dfc90ab0d4d7a690410bf8ee928af00673202157090e0b8ec43d4889092d4c5df8176fa45d879c361731c5d3ab9604b67f9509d8883b566b6741dfd3b4800a51c6dc650285a68401d7650ca32edcfb6c365bddead4281452939542e60251a3f5bf86a88f5963b084d05eacbce541166872726853ff110167f53c1df7cc90f460261d4c73df1c0cdb5db0b04317b88b421601b7b5857d81410230403414ff6e5057a356cdae7fc226b109d6e356b8bcc163567259a951d6e19e2a863b323ae9c6698a2184e8032fe853fb0698cee3a730ed3c9ce3a24f874cc649e93fc9fa5b3965becfdd3e1c1668fafa6853ff000167db084b464d102001316382015521003334e42da3b7b3555efb8b057bbd08f0982fc7087bd128959b6a0ba45fa7e604f52c947127c5d1add95a383d4ee8f2733a6e098829f838ff495410048faf5f29bf6f4a87bb89beb2e30482f4fd6c5903c96a2b01c6f85175028acaf572a27ae393cdae898ca10d53709f06ce07c881f8ee5e0782581e0e4fc8bf5b0ef4d5521f9563cfa8b684475211b2220c081e850ad95c17a4100df11ce97bcf191cf9a88237557ad718c8518c911e6453238b559a2a340985d86a14381f353150d8465996b1e642456f7e9cdea1baae411af74a12de1b18f13c1c77d24ef0dda699ca3aad91187221fe149d166872726853ff110167446764472074d5b60c9c7737937974476cff43297b4fe7d41a9fa80d8764d499c034a696ccd5ee625406d8373026401ca38dd05d18ee8abd48ae4de6a3a75eada0234b23ac251f6f4faa5f50853295d659ffc816c220f870becacd7419a3007865ff61ffde31b144e2f2b989f9911668fafa6853ff000167db084b464d102001316382015521003334e5127c08855b6a358cd3ef16b7861108d6ba6d93b8fb2b045b098ed237d5e792c72d59b3256f752c8e06761292d9e784ddc9fa102cc8a50e2cd7745a863a99b1b3bf41cc34867c75bbdf1e05ecba21919c8b88611ad60356e2020f58b8fc172d848d1381d0cebf1afbeb827ac7310a89d111fee9326dde2366b3d00f8488d303ee4ae81d47ffdf63b11baa68565edac243aba1dd928c1df272aa29b14a60d8c549b0e99369cb92187c26b5aa2f8839b463e956fcc6ecf7b1100cfc91537cfa3af3f5599f6fd56b4928e073d44f2d96828bdfbd77e2592275788cc50d4160e8056bd434e55b166872726853ff1101672f1418b3091f95a30751b8c36eb78b7cbbf836ad36b5d7ebe4a49a12a7d59bcb0a5461eefab695f076dd61b635db69734d8a50f93b228a1474771aff7275b2851803e0b99d8f1c5b8b9f51f6e68ef34eabd4ac256c3b907c460de431c3bf51ac78a72b5e8278b973a7e4602858a61668fafa6853ff000167db084b464d102001316382015521003334e601ac7dd8ad637c73dd02b5dcafed2649c896258f7cbc38902f7cb78035fb59c1c1eaa5c2332fed3f0aff5a666df140cc3eadeb31d3bada93d3de7c8326e814fb4075af6b1fd7bf5b72e43b055b2e735b004c3d3bafbdc46891d09b11b176079e92cad642b36eb9b5df2952db6eec85af0e2ff7d390364a40471078719ddf91569463187ab5f5481711f30923214fe2b14e52358f5b2c6050deae72f764b80544983f3fb08e36dc4959afa0d8c1059a5e59a06c17f82258fce5002265398eb0e3fe28ed7fac6e36fcca2915ea83dcc677bdbb66a754616dc2bf518880f8db736a398f8deb166872726853ff110167e2e80756f7399c52550177b15afff36c44615733637545e1ef9d8dfb906068935e864eee8f5342d76cafc6ad84266009c766dc4de18a6186078dfdde3c0f970c54299d1eca57ef656d4a133707005002f47d934fed9360b9a07b6be13fab5c8e5aef844f477a52488dc0f283f9931668fafa6853ff000167db084b464d102001316382015521003334e797615cc1704cd12774099b3364dd7b63e06df87ef9783ce9fc7a3575f9713d44f4664f0b3946e499cf10b02ac7246d85295e2dbbb47153f119129963bc4501f5d90cda8394cef278113bed6c5e5311007b7f587a30d173eb2b58e788b8ee9a3b5f5c7cceac7c0501ec54afce3933945d9acd0f9f09b3a9c206aa54f8f3acc42f8e0076c0fd6d11aef19beafda5c330a20621e510f75b54bff9ec1898e581bbb13991d63d2e4d26f91899a19ff198263d2c608c9bc5e1517e370a122b54a124c8554b61da1d144756550c84adc841e3897bd70f194a53ec1e074db60cc1974d90caf606bd166872726853ff110167124cc7332c415cf2e7d66106ab3f3a15087cd5c2b04eca46ea5f2e73f8409a135f7fc5480f64b78f9b9133b5d8275ddcf016afc166d661c14604e2dc75a2a981ed7f307ac25213160a83ee0969833c49b509bb9dae3b84999522221ec388c40812b7bdf1a7381bb48f88bbaf8de51668fafa6853ff000167db084b464d102001316382015521003334e88cdb1880f60d317e8ab94d7c879fbce170b49c4afd6077d61ac176fb8623bcb402cac59b35f95005492a350036e1acc3dd92a961150c7355fbd8884cac79e6368f902920f4c09ed44674ba7d0b768162397cbf1ddfba35d0b4c9bc72513c810481ee8dd94dc0c9dacb913d33164688656983e8cdf779582fedb19c209a8808e8643a28867a04dc0d4adc2f4f06f8c54c4cc7838cd6e58a9bbaf1efb8d23301be4e431d1af9392f28b063de66f1e9dfe44ba3cf3d0b337658a145efd0aabbfd35cbdc4084ce06f12ed84c1f395dd23bf9e25ff2f467467ca460ace7bae03ebe06daa8302c166872726853ff11016730307fa1fb8b1232d6ac8d40665ddb083c492115dd02776edf6a73aa8533063eae87d2bb2575b3f85c56cfdc4ef479af98d795457a7a8cf4a25320bd383799a7f9e258344abc5c161efddf5a41f82ee3f0e7d95379f5f847c9c300ba3bd47ae8d7a2ca9124a51cf008fc5da5a12b1668fafa6853ff000167db084b464d102001316382015521003334e95fa0d638f14b9128793d58eddc8aa3cc099214323c4e4037eccb6e254ab489324070c7852555310e572f571997b94aa5ae3fa3be798d700d8d0569af6afbe88e09ce18db22de4b242285fc1010c1bae08433e3f199e318779b4b80f84293f7769dc232ef10038199311915f47ecf34243a9bfc281e6286fac92bd6f51f86c6b2a201b614c1a8d0ce18cdb6a8d5f77af336822382eb9b177b9c1bb299ae70bb5975cd52013090a552ca2d43677d7f876a19a082014748c3356bd2fd31f5b74a7a9812a20c559fd07c248855c176b63478c1c54bfbdf59dbe19fa0b39c8156f04f82217243166872726853ff11016799fd984f3c19017631f4879951596a61e887afeb2590294582eed940feececb9be6670a9c3da23cec2228b2a9a3eca936a51c4b67c18018c9d352c15f641722b35096ab4772135fd92c722acc43485f7838dd176c8966836d277f4c54b74964c30602895db34f21c41557f3cff591668fafa6853ff000167db084b464d102001316382015521003334ea70b6914e8cb38893efc2de863342027cd6ce3cfef946ab424b091814d1cd1a3d5a1aae513115b5c2440f965ca7ac865415a8e404a833064f1f1162b8ba083c5c437edd67190d18ea54750a38b5468fa17375c0f5b2ba13d9f44084d500b5b4e332ea305da3cc12fc7a69b3ba37c70265dd5301c48d065caf7f418651ad1891752c751da36275b7b7227415b199f2270a831dbc90c2b37119ddc7167048be35a5ee81e75a339ddf51a96192b0b1b20f1d3d9915ea7391401a40e8b2d66b580324f4ddcedc13f83edca849aab0b71c16a1554b1bb1a2dcb0f865157f43fb5236b0560fd749166872726853ff110167ef3c399014396d164fd1519f9b90479e5e64675fffe6a84afe4c05360d92c394905c2a9cbfca61bc7e94d5f8fb147e00fafb860af8d857e6b6c4fa3bfccf1eb367cae4b2788b63de4ced0aa8b6ae29e87faba4c69c4d5c24305cd9b5c276f7a7ecd40b98cce069525ac47e7dac111668fafa6853ff000167db084b464d102001316382015521003334eb589d6733bcfd5069b64dc8520affd692244f58df593aa8f602aea61407b74834e9353271483d89da8ed9ec05a48983e932bc55ca908a1d7172f7479b48db5a6aec2c5ebd160b3a6c591c2bcb2e258f25527227149d617daa6601e8e90b16d9b95ada46d93763d13824b24e03eb66351bbdb37a6d569d0082b5b477d6eb588e4286d8a4e8e30b11e528cc874cc404bfe1f863fbe06876bd82f8ce3c20e48282ce12a9289052406d16e7e3da53a91f3859825cbc0d49de661ee025e325ef08054b00878437217743b8d8b5777f66e567d135005b18839860456c360424daba2bfeb928d912166872726853ff1101672104d2d57ca17c6a4f53f8cb144891ddb21b3843cce8e51fce6ca33eb7fcd99ba45f7a3d754a3c5503cad863590371b194770f6f1b395d9edac870f08a00e8b835d7275497a494b6a5ca0da7b1a60c3689bdd6ce308e0a11e1d60161a6cb1e15595f68a07b5f636d6a24e5544e661668fafa6853ff000167db084b464d102001316382015521003334ecc1216394670e12194eb0fcc0d7755343823cf5181e9c1305395491d677d231b6c545e027c2cd3c1dd37517740f8c30f465440cae8402b6b5b09edc64282b225b20d56c5322b91947f116d8b14dac4753042bc7f515a5debdbc9f8bd6746af3e9098b85423d5c06a3ab6f0e4251cf4d24cde24aa08ed09810ea57f05c770b1ac055adfec47549657eaf42f35cc8f7d4c66bd8abbb00ac31247dc381006af0f2813c9737107d3c885d2a03385011698c9828b72452a40124a09631c426007bd66f37abf70e79dbdc87e444de59f63bce47c91a8b15b595ea30d62a7f7689152f251531f947166872726853ff11016747ee725000fead28e672a12c613e12184bb14a80395de8fd0d64b717fe36e856c06d6c7d682ba1b6c5a622f8d5e173d743dd3dff4c9a79fadf8447455c5c7657cd63c3a0eee5d6a80242472f7fe8cb22c91e284c61f16450f5fd0a42c073cc032e0a076e66207edb584122aaa84f1668fafa6853ff000167db084b464d102001316382015521003334edb18a9bd5c05266fe15a7b124b0aa468a51bf4a404951a4638596c2703d9b0d3f4ee3e52b79c393ba08b7a9ad327de179b96a29b034f1e87d421dfb34af401ed4396563d6797c1913d981437f042a72cef21c77d4b21cd9e9b4c6d0d10aa542246720137fdde5c7f774134664f802f028385a8987d61c05fcfc9918b6bb2c9a5c2bdffd532ee2b2f66a50dfd74d26b3d39f5d8050a2a2b5b9b0067276004eb6c1fabed623776a6e91a2ad7b6a5254d7023a84454226b720d1f79d68de49a43305c637365744795f005030a84c4915599fd16ed2165462de5469c6cf69569d585a6f411641166872726853ff110167459e47984311e0120d1c7cb3c7d444a7947d12d5e7bc80d814d41574ded11ef3b2b6358642ccc0e5d6fce8fc1bd22e09bdf69b3514ca8b49d2fba0f6ec49fdf37ebd4ee99186f3ec20ad170e53eb0a1b2a680aef948d2749613ed39ea88670dc9d0153ed0456073d229f7024a51b1668fafa6853ff000167db084b464d102001316382015521003334ee2f844d035167bef0d3aea3b447fc059bb05e30e55b91f9bf219d8303aa68633f099fe87a9aef16eed88fa07fff6e4073b1b3c35567d6b985f145aa349aa037b6b0c8c7d545feb6d3e57e4e47fd1d1299f0678ec0c9700d60eefda7eb411212b7371cf604f7a42f0c699c212513c9fa6bcaf65558b9e3cf083ae48e2d19faa76b79bcb16afbcfb55652a3f079fd4fecae390dd1d2189d24d07a92ee1b45ac551c65876f2f9f421b9390dffd9217cbb68d6efec78490151e7181ed0fa5e9515b4c42' 
2022-02-28 01:51:43,907 [DEBUG]:  sleep done, proceeding

I'm thinking of reinserting the former approach of splitting the stream at the starting bytes.

boredomwontgetus commented 2 years ago

yeah this show exactly the same strange thing as before. your stream starts with the 2nd frame. this is something that never happens on my side.

however....in https://github.com/tirolerstefan/kaifa/issues/11#issuecomment-1050623003 i tried (untested) to compensate this in some way. i am not sure this the best way to do it but please give it a try and take a good look if this leads to the same problem and also if this skips some data every now and then.

tirolerstefan commented 2 years ago

hi, thanks, i'm currently testing the former approach for some days in connection with your change of reading chunks. works so far - let's see whether the problem occurs, again.