Closed bavanesyan closed 11 months ago
Thanks for your interest in IFC
package.
Since files are read in binary mode there may be problems with endianness (M2 architecture) or out of range values (big file):
However, from the outputs you pasted, it looks like that IFDs are at correctly extracted (at least the values of the tiff tags numbers are the expected ones and not weird things). So I think we can exclude the problem with the architecture but I can not rule out out-of-range though.
Just to be sure, could you confirm that on your M2 you can correctly read example files from IFCdata
package ?
library(IFC)
file_rif <- system.file("extdata", "example.rif", package = "IFCdata")
rif <- ExtractFromXIF(fileName = file_rif)
file_cif <- system.file("extdata", "example.cif", package = "IFCdata")
cif <- ExtractFromXIF(fileName = file_cif)
In addition, are you able to see cells with
DisplayGallery(file_cif, objects = 0:4)
You mentioned that you got an error trying to read your rif file and a warning while reading your cif.
For the cif I suppose that you were able to read your file but did not get features values. Right ? It may be a normal behaviour that you got the warning while reading your cif file see https://github.com/gitdemont/IFC/blob/4fab637d9b61e93de681982bc6035a3cfc7aba91/R/ExtractFromXIF.R#L271 The warning happens because only a subset of the 705341 events features are found in the cif so features are not extracted rather than being extracted for only few of the total number of events.
For the rif According to your copy/paste it seems that the error occurs when trying to read the TAG "33027". To me, this is not normal behaviour and there seems to be an issue at this point with extracting information from this part of the file. Could you please try to look on your own rif at what gives:
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
getFullTag(IFD, which = 1, tag = "33027") # expecting something starting with "<?xml version=
I don't know what you expect from
toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb")
readBin(toread, what = "double",size = 4, n = 1, endian = "little")
[1] 3.883381e-39
You said that you tried to extract features from rif and cif. Please note that features extracted from rif or cif are limited in comparison with the one extracted from daf files. Notably, not all features may have been stored within the files for all events (as what seems to happen with your cif)
Hello,
Thank you for your quick response.
Yes, I can correctly read example files on my machine:
The display function also works:
I also tried to run the same code on the Windows machine and got the same errors.
For the .cif file I indeed don't get any features because of this warning. I can extract them from the .daf file. However, I would still like to access raw features from the .rif file.
Regarding the:
toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb")
readBin(toread, what = "double",size = 4, n = 1, endian = "little")
I was trying to understand why the mismatch warning pops up and in my understanding, this is how obj_number_r
from the line you mentioned is calculated. However, the results are different from the obj_number_r
so probably I did something wrong.
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
getFullTag(IFD, which = 1, tag = "33027") # expecting something starting with "<?xml version=
[1] "\xc7\n56WRc\fz\016{\nor1p\xe4`\xd7P\006\xc7Pp\xc0\nW!a\xc4pA\016{\"g&a\002R\027\002\027w\001'\027$\001\xd4\nf\003\026bw\016{a\002\ffw\002\025\xd0`\0206x\017 o\nR\022\006r\020y\n\xb2\xe7`B5\003'{\023\026\xa2\xc7`\002Qrr\n\006\x97\xf7\xa0\xe7p&\a\021Sa\xb2\a\nbq6`\020P\nt\002g0p\"w\xb1\027s\027\006\002\acp\006\f\027\022{\xc0@b\xd6`\027su\020\fzsB\xc0\n\037\x8f\xf7\xc1\xa4\xf7\xa5\xc3\xe2\xd1F\xb3f\f\017&j\017\017GB\030{\027\001p\004\"\026%\n{\006\f\031zg\frPQs\a\xc6P'`SCc\xc0\n\005a\001\001\xc5`\xd5@\021\006\n\xe6`Uas \026Ps7%\026\0017\006{\xc3P \025\xe4`q\022esC\002\x97\xc7p\xf6\xb0's\001\001&\020`\026'\xe7\xf0\xd6 t\021Ű'\xe5\n$z\016\026\f{\xe6``1t\003\020P\xc1pz\xc2@\002\0267{\020\n{\n\025\n4\021puc0T\f\003&w\f{\nv\003\xb07\021\025 6y\n`r\022\n{&\xb1\xc7`\xc1\xd0\xe6\n\xb2'\032mh\033\035-m\x9b\xa7\f=Xo\xd5@Ylxz9\xcc\xf0怅\f\xc55\016\016\n{\x83\xe7`\020y\xe3`\022y\fn\037o\xe4 f!\xf4\xa0Ǡ\xc7 f\020\nz\n\024\xf7\n\xc1\xa072{CC'\xc7@a!q\027\003zr\xb3\xd7Pp`c\xc1\xb0\xb7\xa7\xc4y\x9b\xe7\x85\032y\xbfǢ\035=\x8a\x87\xe6q,А\x85\xd6\xf2\xf0\xc3Ѥ\x97a\xd3 y\xa3\027f\017gU\f\021p z\fb\"{\001\"o\n\xf6\020_\f8zN\x96\xa3\x97\xf6ѐwx<(JM+'\017\xf5\xf0{\n)\036\xb0\xb7g\020\021\xb7's\xa2\as\x85\xa1\xc7@\"\026\xc4\020\026\006\aRv\xd1PR!AU\031\xd7\020\020w\027&\004\016`v'\027\xc7`\006a'`\"f\0035\aq!f\xd5P\xd7P\001\a\022f\001'\027\022\024 w\f\xb5\xd7\n\027eR2\001\026\020p\xe4p\a\n\034\016\xa07{'\xb3\027\a\030Eb\025\001\020r\001\nPW\n\nwRa\xc7`\xd7`$6A\f6\024\x93\027\xc1P`p\021\"&{5\fa\021\xb2\xd7@\021\006r&b\n{'װw\022WrSb\xc5P%7_M\xb9\x87\xf6\"[\017\xf8\x90\xa2\xa7\x97\001\032\x87\xf1\x86\x87R\016\x80W\031\f\003\006f\002%\xc5\nx\032n\002\032y\xd5ppR\f$s{\020B{\n\025\xa37\016P'Pb\017\u0080\xe7p4{\a\xc1@\027\020R\f{r\xc0`4B\0036z\016\026Us\xc1Pb\0277V2va\ng6q\005\f\027\021e\fz\fv!$@\nsp`\022\025C\001\xf0\xa0W\016F\ff\023u\nvs\a\xc7\n{\n%\xb27\xd4p&t\003\020qpP\002\017y#\n\x80g+\xa1\xd6\xe6\xb2\017^\x8b\x97\x94\x97\xb3\"^nh<\xfa\xe0\017m\x99\x87zn/\xf7f{\036\034BІ\xc1\x86\xa2\a\004\016\xb4\x97\021\x80\xe7pB!d\003Sb\xc4\nt\002q`br\022\005\xa6\027\f0^Y\xbf\xa7\xd2\xe6\xe5\022\xdc \030\"x\035\031\020oy\\\xf3\x90\xf1\xf0pyt\n\xc6\n5V\021\026\n\020\026Q\002F\017w&\xd5`\020qg\001\001'\005\0034&qא\xc7\020w7\xa7\xc7\020\xc7PCrpq\f{\022q\a\026\a\f\nɀ\x86z\xb3\xf7\x86QX\"\030\xe3p\xf2V\016{\fp\"y\030\a{\022A\003\026pQ\016$S\023x#\f\006E#\0251\xf6P{q\ffvrqр7g!bR'\nts\006''Psq\006q\fA\n{\f5Q0\005\ap\003{\017W\020\027\026Q\fdR\xa1\xa7\x85ǰ\xb7\xa7\xf1\x91\nj\nxy)\xcc@_O\004z\017\f\037\fmj\f wB1e\002`1F\037^\n\017\xa3f\fn(Ԁ'\xc1\fYה\x92\031\xab\xa7n\xc4\f-\x94\xb1yHܠ\xf1\034z\xfa\x865\036\xc9\xc0\xe4Vz\034\033l\035mR\nx\0342y\xb7\xa7ae\n{cp5R\na{\002 \021\x90\xc7\020\a`\n\xf3\026#5P\fu$\"\xa2\xd7\020Pg\022\026\016o\xe3P\005\027\ny\n\xa1\xc7 \024\020\021f\xd1Pְ7t\021Q\023rf\017\005Q\021`\001\027'A#\xe6\xe0&\001\nw\027b\xb0\xf7\xa0\xd7\nm\031`\ap\xc2@60$P\016\004t\x96\xc1PEg\016\002\xf0\020z\024\nyS\022 t'f\f\016z\002g\f&\025@2\a`\xe5\n'd\fwe\xc1\xb0'\xd1@\xc0@BC!AR\frA\022E\016\001r\024a\xe6`İ\xb6і\xc1\x95a\030=\xcc\xe0T^ģ\017{\xac\xa7y\030\x93b\n,zhi'\030u\024F\fQ7z\n\xe6`\f\xb1\xc7pg\022u`W\xcd`Lk\x95\016\xc0\xa5Th\030\036yx*;٠\x84\xf4\x90\xb1\xd7\xf2\xa5\xc5p\n\033v$4\027\003{\001R\002 &w\003\ne\0207p5&\xc5@\n\001v\x86\x91g\003a\021\xb2\a\021{\016A\xd6\n\024\n`a\001c \026z\016F\n\006s\xe6\x80\xe7`\nysp\0025\006\nyS\0211\027\024`\nx\017u\023֠\a5\003\xc6\n\026g\022pc\xc4 {\003C'4\020{\n`\001\003F\021\n\xf6\xc0\xd10\xf5F\016\037o^l\xe2\xc0\x80S\xe7\xf6\006\xe3Pv z\n{\xc2P'{\nx\xb4\xe7\x91W\x91\xc1\xa6\xc1\xc0\xa6\xa1\027n\xf1\x93\xf2x\xb3\xf4\xd2\017ڠx\xaf\xc7y)\034\xda\xd01\xcb\xc0\x85y\035ɀ\xe2\x84\xe2\xc6{\036\xf7\xf0Аw\002y\016n\016\f\004\xb3րQy\fs\027\fx#\xc5p%\xc7PA\nz\fd\017y\017\005\027u\016{\"\xc5pwc6ab\006\xa2\xc70a\nV\xc6`Aq\031T\fe\017{\f\0065w!\005p\020P\023\004\f\fu\f\xb4\xe7\n\xf0\n\xc80j\x91\x91\xb7z\xfe\xf6mX\x8a\xc1\f\xc5\f)9nj\xc5\xd0\xe0pc\xd6Pz\031l\"\xc5\020BҰ'F\f\002vA\n\xa0'\n%z\fg\031 WS\xa0wz{\017\xf00\xa3\a$\001\f\xa27\xb2\xc7p\006qa\f{\003\"\025v\f\024\xa3'bCb\xc5\020\a\030y\021p\024{\n\005\f\xc50u\005\xc3@\n@\0165\x96\x87\027,-O]]\0359\032\f\030Z\xe3\xb6³{O\xaa\xe7\xd5\n\xca@\x81\x82\xf2zn\033\034\032E\xb3װǐ\0270\027%S2v7\0067g\021{S\f\nA\xc0p\027'Aa1v\001b\nw&\003\020&f\xc7\nAQb\na$gװ\xd7\020{B\031vpwC\nWs\a\001rqR5\ap1\004\xd7p\006\f{\"PbC\a\"\xa0\xc70vRS\f'uSb'qq'\xd5@\001ap\021\0206{\xc1 $v\f \025\aB\x80\a\xf1P\xd0\020\024\xc5`\001\021\025\xa3\xd7\n\031\033\fWPа\0277ubw°\x87\x97q\x93\xa7\x81\027\017o\017zxq\xca\n3{\030B\x85\xa1\xb7\x87Q\nx\021\022p\027$\nz#{0y\f\002\xc4` \xc0\n\020`\f\xc4P\xf6\x80\027qp#w\xb2'\027aB\"`b!A\fpF#5\xc5@0\ar\xe6\xa0w\002CS\f\006`\023{\022a`q\022\xd5Pq\026%\f\xd5\020_֠\xe1\xf3\x90\xc4{i\033\xc0\xb0\u0083\xd3\xf6{յ\xd2𤇱\xa6\xb2\xd3\xf0\xe6v\033\x97\xc7аGR\xc1`\017\xa1װ\027V\016f!Ps\f{\a\xc0@1\xd36q\a\002\031nab\025\020p\035n\016u5 5\005C\n\005$\n\005bP1'\xc7pt\xc6`\x85\xb1'\n{\0362N9^=\U{072597}z#\016Z\x87š\xb1\x81\x821\n\x90\a{ybQr\017f\026\f\004Q\f\x94\x91\x86A\fazo\f*;h_iG\036\032*(n]\017[N]n9)\021\035\xcb\xf0\xd5\025#4e°א'\016\004S\xc4а7z\n\027W\003V\nR\fe75a\0261FR!\002\026\xe5`\xd0P\024p7\xd5`'\026\006r\xc7pW0\xb7\xd70\xb1'\xa1\xe7p7Gà\a\001\f6{\fv\xc4P\001\xe5P\001b\xc1p{\f\006b'\xc4`S\002q`'\002z!r6\0062\xb7\027B\022'u\"w'aa\ab#{\021\n\xc5P\nfw\002\020\021\024\026\f`\nx{\fb\016{\xc3\026\x86\xb1\x92R_hm\x95\xa7\xf1\xe1\xc0\x80\x97\xb7\xc7\xc1\x81\x96\x84ǐ\xe3\xd1\001\xb47o\xb0\xc7\nV`\n\xc4P\022#Fg\fv\n$\xd4P\002G\f4\fr4\005a\023a\027\xf5`z\0166z\0227\x90\xd7\n\f\033s\x96!\xa1\027`\005W\f\005a`\017z\x97A\x96W\030{\0334m\x94\xf7\x90\016\035JJ\035\031\xaf\x87\x84\xf3\n\032\xba\x87\xe6\xa2\n.JLy9Z\xc2\f\016^z\xf5\xc6`\016\x96\x87QB\x94Q\024g\n\xf3\xc6p\001\xd4 \024wC\016{\xc6 {c6C\027`\020\f\005\016\xb67\xe6\xb0w\n{s\xd6@7&\xd4pcz\xc2p\026\002{\n\n\ng\f{!G\n{\003\a\n\0043y\fQ\001\003\004\003\xb7\xe7p&\a` '\n%w\xc6Pcb`'\021\xc4p\002\025w\f6\005sp\025v\016z\016vS\003%\n{S\a\xd7 \020\xa7wb\"P\xb6\021\x84\027'\016z\f\x937F\f\n{\fV\f\001\xb2wC\0225Q\xd6p5q\027\a\026\xd6p{\f\x94\xe1\xc6p\0025P\xc2P\xc6P0${\030\004 \006\001\020p`!g\003`\017m\xc6\020\ne\xa3w\xa2\xb7\xc7Б\x93\002_Zi{x\017l\0319\005\031\034x\x9dץ\xe1\f\n)a\xa6Vw\nz\n3\005E\034o7\0224 {\020\fz\f{\nǐ\asa\016$%4qp\027\003\024y\n\f6{\017&\0246t`Ӱ\ar6\021\026w\003t\ny\016\020\xb0\a\017Fp\022G\020\023\021p\xb3'4\001Q\023v\026`\fG\n\n\036\033\f\xbe\xf7\x95\x87\xa7\xa3\xe3\020zon7\x87A\f{3dS`2z\023%\001$\002PCc\021fp\021{\0167\025v1Sq\ff'P\f%\006\021\nz3\xa3\xc7`bB\016{\003g&\001`\001\ar\xc40u\001\002\006\n{\f\027\xa7\x87qu\xd6@\022\n\026\xc0`\0240\xc5p\nzr\azd\n\035,\036\xa2Vyno_\016($\n\030okh(\030y:yuyzQ\x91Q\f\xb2ǰW\f\xf1\x96\021֠g\xf7P\xc6`pc u1'r{pq7prr$`\nRQ\001\xc6\n{z\004\030\001\021Q\021{\xc2@6s\016\x97W\017\nU\fm\020\030{lV9=)]]\xe4\xa5\xd1\xf5\x90\nxXա\x93{\xbd\x97\x94\xa1\017\f\xb3r^l\f\nqpC\n$rq\ab\xb7\xe7\n{\006b\021\026\xe4\xb07\xe6\xa0\a\f\fz 5\027\0276\025\021\a\n\xc6p\xb37W\n\025\026\021urB\fP\xc0`z\016\024\003\xe5\xb0W\016d\"\xe0Psu\xc1\x90\027\fz\nWҰw\020!\005&q\xe6\xb0\xc7\nW\003w\n\037o;\fox\xb4aiz\017\032\x93\xf7F\xf1p\xc1\xc00\xc7@\fo\016Pv\xc2`\020\022n\033\xb6W\030{\x87\xa7\xf7Ђr\xe2\xf0\xf6\xc6\xc5\xe0\xc2f\016\xf5\x90\x86\xc6\xe6\xc3\xe0{;\016\xa2\xc7V\017\np\024\xc2P\xc7\020y\030\xb5w\n\005c!g\nR\xb27 f\002\021u#\005\f\025\xd5P\ny\f\n{3\0064\a7g\nuQ\001sR\002\arP1\a 4{\xe2p{\001\nr\025aa\fy#\n\027%\024 \027qp\001g\xc1`s\004\016\a\006{\xc1 {R\022A\022\nU\001\021Qa\n\024\020cw&'\002\xc4 {6\x92\xe7\n\016j{io\x97\022x\035(\034YZ\xa7Q\x95\x87g\xd2p\016\xc4``\022\025%\021P\002w2\005\xc6P\020\xb0\xd7`Q\030a\nv\fuCpqpaS\001\xc6`\002\020\020\xc4`6`\020\027\xc6P\xc6`\020\025\021\f\006\020\006\004\f\027F\023\021\026Q'\020\026Sg\fp&r&\xc4p\002v\xb3\xc7\020\0261uC\006\021v\020\x84'\xd1\020{y\xe1\xa0Ǒ\xe76\030\n\003{z\n\030oz\xd0\xc0`\xd2\n\005\0016ՠ'\xc7\020ur\027\xe6\xa0\027`\xd6 \004\f%\027\nz\xc0`$b\027\nPaq\001!\026P1{\fvC\f\026\022\xb7\abs!\a\027gR\022\xc5\xc0\x90g\f\nrPb'b&v\nz\nqq\xb1\as#\xe6px{\xd3\n\a6y\n$0{\016{S\nz\n\xc5@\031y\xf0@A\020\x80G\xb77\017\032\036\031\037\xc3\xf0\xb6{\xb3⁗\xf2\xa2\xc2y\xbf\xa7\xd2\xd0V_{\016\xe3po\017y\033y2Us\006R0\0011\005P \nzs\fy\f\0206\aP\002\xe6\xb0'aa\xd7`\xa27r\027\006#fP\nt\030d1ŀ\xc7 y\f!\005\xc6@!e\nǰ\x97\027q\n\xb3gn'yk],\034\xe7\xa1\021\x95&\n\xb7g\xd3\xd0\020v\022\"S!{s!a\xc5\xd16\n\024\n{\001a\f\026Ar\027\022\xa1'cE\n\xc6p\027g\ft\016p\0274q!4$R\022\n4e\021\027\026\a\xc7\nW\001!4{\016\xa7'\022\aq\023Frq\xf7\xb0wc\002`\021A\xc1`\f{\xf4@a{`yx\016\f\036аQ\016l\031\037\036'\x83\xa1\xb4\xf6@\x94\xd7\xf6\x86\001\031\005\xf4\nx\xc3p4z\fRc\xe6\xb0'6y\nv\022\002y3\001'\006'rpR\001w5\026\006\f\aa!{\016vq\020\026\020A\f\n`\020\006a`\017{\n\xb6\xc7\020w\027\025R\f&fr{2\006Rwx@y\x941\xf7\xd0q\x85W\n\nW\016n\021Q\f#\x85\xc7\xf0\xf0\xe6pW\025k5\x84\xa1\xd3pl\xd7\0268\036z/.[\xfa\xd6\xf4\017ʐ\xd6\xd4D\036\030\005\xc2\xe0\xb0G\xc0\xe0\xb5\021qs1z\xc1P\002\027w\xc7p u\n\xb0w`\003\xb27e\xf4 w55\nf\n{\n\xb0'\xc6`\001\xc5p0{\021Rc'\f\004\026R\002\xc4\npR1\027\n{\f\np\xc1P'\0255p\016u\027Bq!{S\xc2\n5f\0034\xb1wA\030`\001\001\xe2P\027\006\xa6\xf7\020\aeQ\030\027z\n{\022V\030fR\003\xb1\xe7\xb0\xc7@\fA\xc4\xc0P\xe4PpbB\030x\0035!$q&wS#u\027\xd6\n\020r'\n\xc9 i_h\x93\xf1@\xe6\x80\xf7\n\004g\003p WC\"%\026wR\xf4\xb0'v\a\xe6pg\016\001\025p3{\n\0264b\020w\020` \027\026'\n`B2$w\023{r'6&`\001\xc5`\021\005s\026bc\025\"\006w\n\005\0252{#b\026Q\f\024\022@\xe7\xa0\027\022`ps\026q\023\xb07a`c\xd5\020\a{`\xb1\027{D\016x\033\031\016\016\035\031\xb0Wvzyy\x90g\016\nR\n{\005s\a\xc0p\001e\nR\xa1\xd7@\022\n\x91נ\a\xc5\xc0\n̐\x87\x95\xd7\005\032\031\fo\fA\f\xb2W\xd7p\xd36\xc1p p\xc6PQ\016v\xc6p45W\nŠ7\a\020qz\f{2 @s3{R\016z\022B\001S\n\006\020\026\f\024\xc7PQ\022!A\001\xb2'\xe6pGb\fpwcW\022qa\020\n%S\xc2P%\xc4\020\006v\n`7g\022\001p\xd4\n\xb07\001\xd4`Rg\nrfw0\fwRaQ\f\aw\xd7PsS%\026qw\xf0\xa0\xc7P6r\xa0\xd7@\f\a\n\xd4`\aV\023wb#g\n{\"`R\f\xa0\xe7\x90\xc7p\f$\027\xc4 V\002\xc2@{\031x\033\xf0\xe6@\a6\x90\xf76{e{\032o\nAǶ\x87\x86\xe1\xf6\x80a\"\xb7\x81gA\n\017y\x95\xb1\xb7נ'\xa3\xc7\xc0P7G\017\025P#{\003%\n4\xc4`2\027`aRbR!v\021B\f{\nf\xc7pqcV\n\024r\001\006' qu\nB{\fa\002\025r\016ea{\n!w\006S\0226$\027bA2\006C\022W\020b w!G2U\fv\f\xb07wr6v\nfp6\023`g\022g\f5\xb17\xd4PC\023B\020R\020\016y\027 Q\xa2װ\xb7'z\xf0\020\021\xe2Qy\xf3\xc0@lD׀aw\001{\031zrr\fQ&{\020a\016z\xc1\020\004\xf5p%{\f&CRA\023wP\003W\003\n%\a\026\0207\n\apc\022v\016Tr\"\004`b\002\xc4\ng\022&\xd6@\xc7`v\003bg \001\0207f\022\006b\025`\021p\xa2\xf7`!v\020 \026\xe5\nP\016Tr\021\020qru\002\021vsqqpq\026\xe5P\nE\xc1`\xb2\xe7@05\xc5@\nx\032x\x94'\xd3 \fg\n\xe6\026\x80\xb7\x87\xb1'z\0168\xb3Ǡ\x96V\031\x901\xc3\xc6q\xc5@&\x84Qz\017\034j\017yr{\f\nw\020C\0067q&`ar\022rp\0215@\"a\a`\021\xd6P\003V \001Sp\"\024%A\"@7\nd\023\026w1wwְ'\001\027\020\020\xe5\nz!%\nzS1C\f\xa47q\001q z\n\005\001ac7\xb7\x87Aq\020&Q\021`\xa2\xf7\n\xa7'\017\024'\020ư\a6\xb2\027\n{ 0\006{\f\nm2o\n\xa0G\022\n\f\xc7Ж\xc7\xe0\xd0 \022{\023w6\020R\xc6`\001\0241eqa'\022gA\n4Q1@2u\xc6`b6\027QbR\xd1`P\017u\xb3'\020\xc5PB\002\xd5P\020\020\xc5 {\n{\xc7@\fQ\002!\004rbq\aR\003'\005A\023a\xf5\xa0'\xd7p\005B\001\xb3\xe7`\x92\xc70\025a\003\005\n\n\f\x86Qd\016y\031\xc4Pb\x92\ass'Q'\020'\xb1\027\"Ts\020 p\026\xb3'5{\fq\xd5P\n`bgS\023p'\027\025\020v\xc0 z\xc7\020%\026bP\002\001`'\001&\001wQ\f`&c&A\"`c\xd4p!t\n@psrg\xc7psv\020q\0017t\fwBrp&s5\027\020\027v\nwcuC\002\a\003\f\026{°\xe1\xb6\xf7`{\016x\xf0p\x97\xf1&\a\xb4\x91\xb7\a\021\nn{\022oz\031\xa3\xa7!\xf0\nA0$`\001f\xc3@\fd\fR\xf5PQ\nz\016\xc4p\020Ơ\a\020`\001\027\027 u\n$\xc6`\nx7\f\xb2w\003z\017FC\n\016o#\fx\nzs {\xa2\xe7@\016fSS15Pư'\016G\xe6\xb0\xd7\nGa'b\002\xa17\003A\026\nQ\a\ny\f\xd5Pqzrz\030ax\031!\ft\030\xa4'%\xc0\0200\xa6\a\xb2'\030{q7\xb7\027\0166{'\002\xb2''@\002\xe5p$\nyc\f\xb2\ap\021`\022a\026\027C\f@q\n\006Q\021pB\001A\0160\xb4\xc7p6\027\f\xb6\xd7ppC\001r`\xc6`Bb\xd1@0\005\ne\xc0@c\x84Q\006\027pq\xc1\xb0'\xc0\xa0'&\006\"֠\a#$4\027v\020sf\002R2&Ű'\0016ua\xc0\n%a!\026\xd4@q\003\0255p\n{b\n&V\"z0q\002'\027$b z\fRQB\n\0215v\n{\nu\020\003\006W\002\xe6P\f\0055\006\027\001\xc5p2d\xb3\027\ny\nw '\xd4`q%@\f\a\xe5` \024\001a\022uy\fp\fzz\032A\016\fk\x82q\fd \017mG\030\xc5PB\030t2zѰw\031yx\nP\032{D\030z\031k\035\xa7\x81\027yz\036T\xa37\001r\ny\023aa6b\xc4p\020\001$P2\xc5`C\001Ps S\xa2\xe7\xb0\a\neb\f\a6u7\026Cqb\022wR\016ub`\xb37\003{\016\xb0\xc7`\025\xc0`q\xb37z\f\xc6pq\fE\017\005z#b'\022z\f\xc4`\nz' g\001a\xb2\xc7`\f\024\xc4p\023u\n\xa7\xd7\n7`\027\020%P\xc1@6w\ff\ff\f&\027v`\022aQc\022\xc7@\001'fS\"W!5wAc\022`b\xe6P746g\"p\n\025&\001uc\023`\021u\f\026{\016e1A#ec05ur\fz\023Ơ\xf7P\xc6\xf0\xf6\020\xc4@57\x82\x87qP\016z\xa2\xd1v\017\x817\f{\001\025\031o4\0227z\030n\f\xc7 y\xb6\xa1gV\033d\xe5\020$ V\023G\017v\020Q\f&\025rf\f\005u\nS \xb2'\aaаg\001\n\xb2\xd7`65\006\xc5\020\024s\004\x96Q\006\a\020wsq\001a\027p!\001z\017y\f&7w\f{\f\025P\016t\020!\x90\x87\x91\027\fV BsSr`\xc0`\xd5\n\002\026y\016\xd5@0\fU\f\a{14\xb2\a\nP\020\f{\f\x92w\f\0015&\a \025q\aqg\016w\nz\020g\022\027\0015\024\ne\xd6Pa\003 v'6{\002\fe\f5\025\006\n\004\f\005p\xb2\xc7\020\xc5P0\005\a\003bQ\xd6\020\005\fz\02147\024 \024\n\004\022pA\n\006\xc1\x90\027\020\0275@20T\f\ny\fv\n%{\016{\n\n\xb0'\005!'4q\aa\023\025\aSa\fe\002\023{B\f\xc5p''gRr\xd6\0204wa\fw'V\fw\a\fu\022\005\n\xd6P\020y\xe1\nz6\xe2 \xd4\xd0&\f\020\x967R\n\x82\xf7\xc0\xc0\xf6\xd1\xf6p$\fV\x92\xc1\xc6ѶG\035T\016\xe5\x80\xc7@3{pRc\022qbq\006\a\xe6`{\017\025\xc4P\f\0067\026@\022&\001Q\f\006R\002\xd5p5F\fq`\fv\nİ'5'\a7\006\021\002{\003%p\"\027y\f\n$'g'W\022Ҡw'\xb2'R\002w\f6B\006\n{\xd7p4r\025v\"C'\nv\xb3\027C\f'g7Cw3{w#\xa6\xc7 'p5\001gc\0267P\022bq%\xf5\nF\f\022\004'z\xf2`\020\026{\f\n{s\026\0224\020\001V\002w6r\xa6\xb1\x87\ac\016x\032y\023&\xb4\xe1f\031{\023\x82\027\016y!\xc6\xe6a$\031{@6\002pa\001!\xf7\xe0f!\xc1\xa0\xc7@#{\00356\025p\f{\xc7pr\xb3g!6z\031x\f\001f\016{\f\026\025'\n{#\005\022t\nF\xc0\n\022u\xc6p\xa0\027\f\fu\n\x82\xd7Pf\016g6\xf3\xd6\020\020\026\fU\xc7 wr`4\021\xc0\x80'\002w\xf6p\006A#\024`S\021b\021ְ\027\026q u\fP\fQc\fz\002\nԐ\x87a\006%\xe4\xa07\n{!quc`\003a \n\024q\xc0P\"\xb67A5\xb0\xc7\ny\n\xf4P\f\xf6\xf6\xb0W\xf1`\nk\034\xa1W\017@o\036\xc4\nz\021\003%\026#\006\005q\xd6@\xc7Ps\023$4w\002{\016\xb175\a\xc4`\fgr\n\002%{\xc1\xb0\xf7\xb07'Aq5\f&y\016P\001W\f\xa1\x87Q!@\001\n\0052`g\f5\xd5P\xc7`a\001p6%{\017\026{\xc2PQ!`\xc7p'$\"y\fW\fP#\xa7\xd7p\xa3\xe7`&p\020!zb\017y\023pR\001 \a\xc5\n\xc4 $\025!{\001\x86\xa1'P0\027v\016yS\fA\nu\xa3\xc7 \020\x91ǰw\016'Rp\ny\017%z\xc2@\a\ff\001\fy\016\024Q\n\005\f\025f\xc2@p\n$\003`\026\027r\027R\n\005\001b5vbb\nS\027'we\031{\027\020\a\xd5\nzb\021!\026\005\002\002d\023\0250$\as`\020p\002%\xc7pw0\026\00674\020$wr6\nf\"e\023%&'gRqsa\xc0p\020Q&a\fG\ff\0216v\001q'\a6\020w`\f{\f\026\020aA\023\006\xd5`\021\nR\xd7\nD\nR\ff\nz\017db\ne\xf5\xb0'QS\0027uc\0205w1WѰ'%'g&\023\005\020Sq\f%\xb7\a\fppcRQ!\026\001p\f%5\004\nvC\002\006\xb2\x97\x81\xc7p\xf1\xb0\xe6 G\xc1`\xa1\x87\xa1\xf70o\fcm\xa2QpB\nz\017\xe1\xb6!x\xa2\xf7\n\026W\xc6`\nzs\027`\xd1\nt5\003\xa2'\022a\fy0%6w\001\025\nzs\xe4\n\x92\x96\001WÐw3p7v5\016T@\017U\030\x87'\002C\f\xe5\xb0w\022f\017$zðǐ\xc70G\fz0\021W\ne!\027\020\025\027b5sR\f{\xc1\x80\xc7\020\025Rb\nd\xc1p\0266\0255\023\xb1G3\026\0215uS\n\006\xb1\027\fg\027\fz\f\006\f{\020\026\003\027\027Q!\001{\016`0Ur\fv\002\xa2琷\x87a\nG\f\x837\a\017zs\001P\nz\020qs\0053zw\xe7@\xe5pa\027B\f\n\024\006Q\xc1@ 7\005\022\00605\006'pwQ\0220v4S\nyC\f&\xc7\n\a\nV\f\xc5pz\xc1 4Ba\001 g\xc1`a\001 {\016{R\n%\xb3\027\003{sQ6sB\002\xf3V\031\xe5\xf0\xb6\xe1\xc6\020\006'\002P\xc6pr\xf6\x90\027W\"B\021wc\002\ab z\fp\0224w\nz\f&e\f\026pR v\fP\001a\001\003&\xc6P6\002\024&q@3T\017$\027R` p`\n{\016f\fv\020\a6A7a\021\ap\020$\023g0V\f'\006\026\n{\n6&z\016P\xb0\027\f\n@Rrt\017o\034o\f\017\xe46\xb0\xd7\nm\xd7Ps{\034n\030y\fz0ġ\xe6ࠧ70\030\xb5\xe7@\026'\xb77s\006\xc7@1\004\002 \026\a75w\n{!6Q\002Q\n{\023p% \f{&\026\xb0\027\f\025qb\xd7\n7u\027\xa1\x97\xb1w\022zӐ\xf7\xb0\027\001'\n7z\031xS\016f\026{\031{%\xc6\020R\xc6P#\004\xc4\np\020`\f\004a\002 Pb\021e\n& G\003\a\fV\a\"\xe5 \006\xf26!'\025W\n\xc0P\xb2g\fz\n67\xd5P\006 ֠\027p76ga\022Q6\as\020gQ\002ba\021&\024b\f\apac\001\xc5PQ\016W\fg\a\n\025\026\023{\f\004\xd6`\xe5`\024\003%qbq'\0017\005\002\004\021'v\003\026\ap\001\nG\n$&g\021&A\022q\020W\n\005``\n\006\016\005'Gr\f{\021\xf4`'fb\n\004C\001\002Qa\f\n\026w6\xc6\nf\016{\nF!Cbsc\nUgc\f\025\x96\xb7QcV\017y\016f\003'\x92\ar\xe6pA\fP!wP\022\a!us\xd5P\026\027q\002\021%\xc5p`\fGr`\f$ \020\024'R%sq!6y\016\005q\xc6P6\xe6@a&\001 \xc4p\026Q\n7zbc\xd7`A\016z\003p\0266Q\f%p\027'v\nz\0236v\n\024\025\002\006Sg\016eccRc1{\xb2\x87Q\fy\016zq\017zU\017\fz\x96\xf1\xa6\001k\xb1a y\016\x81\xe7\020{\fy\033x\n\xa57\fn\034zw\034z\nm\017\xd7\xe0\xc6 z\n@\xd6\n6\n\x82\xc7@q\"'{'\f\0276{\020p\n%u\022q0zs`\xc0p$&q\022\xc5@\001`\003t\nz\xe7\020Q'A#5g!$b\021\004\002\a@\ng\f6{\f\006\001'v3e1Vv\023cBs\020\025\"\005a\xe0`e\n@\f\024`\n\024Q\n\024Q\fp\nW\022\025\a 7\005\001'\024\a\xd4`\x87!{\004\xc6\xc0\xa0\xc7\xc0\xa0\xa6a\fE\016n\f\016\xb1\xa7Az\f \xc0&\017pv\xa0\xa1g{\016\026#y\f\xe5\x807pQ1\016n\xe6pr\001%\no\xe1P\027&w`\023\nz\xc7`F\f\021\xd7@\xc4p\001S\xb3\xd7@a\001\n\xc6@a\xd0@%\fW\001\n{\fx\017'$f\xe1P\xe4`G\f\021{\f\026\027Q\f\025bא\xc7 \n\005\fe\002z\xd1p\f\025v\a\022B\n{cbb!4\xd5P7w\020`qr\020%aa\022\020ww\003p\021y\n\xf4Pa\xd6p\xc4\n\026w\fd\002q\021\027\027\024\nvQ\n\025%\xc5@\nv\020\x83\xe7\020wr\026Sp\023z\021q\f\xb1\a\xc1PwR\f%a\xb1\x87A6f\f\xd4`c`q@#\xe7\xa07f\xc7`{\030f\fz\f\na u\xc0p4f\xc0`'r\xf4@\fE2\xd5\xf0\xd6\n\005\027!w7\abpC\002Q\003\006\xe4`\nyR\"'P\022\006p\f\0276gpbcA\021\027\np2zS\nG\n{\023wp1w\xf4`b&\025Q\021\xd6PB\nPRC\f@\n{S\nu\001\xc6Р\a\a\020v\021\021sE\xc1 T\fQ 7t\fpR\"D\nP\003\025cC\xc1pu0\005\xd1@q\u0590\xf7P\026\fGc'6B\021Ppr\xb3\xc7\020aQ\nz\fW7\020\xc1Pz\f\xd4\020V\faacw\fG\030ybq\022\026\a\020\001{r#\006wr\022\xc5P\027\xb0\xe7PQ\017{S\xd7\nl\030\xa2\xd61z!tg\016!'P\arx\016a\xd1@\n\xf5 \f{{\f{\xb2\xd7\xc0\xb0נ\027\023\0275u \021%\xc5`z\f\021\f\026@B\003B\027\016{!\xd6pz\n{\002\xd4\020a\nz\017uf\nf\f`Q!'\xc6@\xc1@w\f@'sQRrb '\025\xb37\xd7Pgr\006\xe5`p\f{\002q\002W\f`Ca\f&w\0016Sa\0251\024`\xb2\xc7p\xb3w\022'z\n\002\025u\fz\n5\xd7\n\ny !\0051\006pS\a\nVs\006\020b&%\xc6\n\xc5`\027Acb\021aaS 5b\002qRw\001\002\x917b\nz B\001r\aǀ\xe7\nP\fB\a\021P\xd6\n5d1b\025rQ7$r\x93\xc7p\f\027\005\001g!w#err7\004q\021\f\024AS\xc6\020\a\026&\n@\xe5\xfbWW\177g\002@>S\xd6f\xa3\xda\xfd?\n\001\003\n\n\n@\xe5\xfbWW\177g\002@>S\xd6f\xa3\xda\xfd?\n\001\003\n\x9bm64g7Ű'0GR!\a\xd0\001'\0276gps\xa1\x87\xb1'\xc7`\024_@\xd0P\a\001\xb2's4` \001\xc5B\fQ\002 g\001\xd6`q\xb7\xe7@ \xcd\xd0 \024R&b\021\0047\016{P!\xc7zp\n\xabw\022{\017\005\001\006!fc\0260ư\xb6\027B\023Ba3Wrp\xb1\xc7\nt\fppc\001\024\022\027w 4R\027p6\002\026\025C\f\026\a!{\xc0p\xd4``\022Q\027\fu\003G\xd7`s\xd5`\025a\021\0014'ǰ7wC\n{\f\n\024\020r\005\ng\xb5\xb1ֱ\xc6\xd00m\031\005\x96\x87q#{`\fנ'f\f\xd5`ՠ7q\fzb\fg2{\fPb\006sq\nĀ\xe7Pbb5'p\xc7@`r\xc1@'\xd6`\026\xa3'2\005\003'p\xb1'`\fy\022\023\020\025\001u\f\025\n%\026\aW\017\026\a\0251V\f4\xe5\xa0w\f\026\xc7`\020\0257\026w\027\001\xc6P!ts P\021a\xb2\xe7`'6\026q\020\026v\f$r\xa3'6\021\024\xc5`\020\nd'\021\xd4p{\f\005C\017%\xb6\xc70t\f{\016z\003\027\021z\xc2pR\005\022\020'frQ\nQ7w'b%\0015q0z2\025\fe\xd0\no\xa0\027\017z1\xc4\xe1\xf6`e\xc4\xc0Pr\xc6P\n{\xc2P\026cQ\025\002a!\024\n{\nz\f6`\n\004\024b\f@cRB\np\020u\"S\xe4@\021\006\001aS\fg\xb17\fQ%\xd5`\xe6P5%\027\xf6\xd0\xe6`\fy\030\xa77R!\xc4\nd\f\026'%\a\xc7PQ \003\026Ǡ\027Sq &4c`'g\016z$\023\xb5\027\017cGs{\n\001gs\0270\005\005sp\"%`q\001A\nW\"g0`\a\021\021%\005S\n\0066\a\001\xb3\027\001a\020rv\001a\020\f{\022vc%s\xb2\xe7pvc\aR\020r`Q\"\006\022g\xe7pz\xc2\ne\022\a v\021prw\001\020\027`S`\003\0207\026pw7\027v\023'W\ns`\032\nl\031\xb7\xd7\xd1\025\030k\031rQ\f\026\aq\027\fz\f\026\026\026\024\nAb\xc7 z\030z\027v\022'\xe4p\nv\020\005\017\xb677w{!&'Cr75w5R\021%'s\026b4\021\026`\xc1P\xd4\n\xe3\xa6\xe1\x96Q\001`\n\004\027\002y\0306\005&\fy\"a\xe6@Bc\027\ne\xa3'\022q\xd4ppp\xe6Pw\nd\xd1`5\n{\nzrP\xe0`aw\023%\xb37V\017v&%\x80\x87\021Q\021\006R\022\xb7\xf7`\xd6@\020W\f\xc5`r\nU\f7{q\x81\xe70{ ր\027\031z{\016\031m\nz0\nu\027\xc5@7\020\025qҰ\027\a\n'4Qq\xf7\x80'\022\027W2\xc7 za\027\xc6p0G\fV\nw\fz3\020u\016\024y\031\004P3x\034y\026q\a\xf1\xb0\aAs0{ p\003\006paS\020!g\xd7Pb w65\027 V\"u\016{\020\001\005\022%\021v!\020zb\002!\xb7'\xd6`#{\n\xb5\xe7`!\xa0\xc7\020`\n\030Q\020q \0067GA\016%Spq7&\a&w\021c\002g\xc1@p\ny\032yR\xc0Ц\x81\xe7\xa0\xe7`q\f{0\026S\a\xd5 f\fy\xf0\xb0\a\002&4a\f\005\002{#gw1a\027Q\xc2P&`cwB\031{\xe5`@\fa@\nw\fvP\017{B\0034\a\002\xd4`'Rqp\006\nǠ\xc7pg`\030F\"\006\xc1`\006ǰ'\xf4\x90\027Sc\f6\xf3\xc6ƀs^o\n\034\xe4Pz\017\xb7W\031x\f\xa3\027r\023Bg\n\026\001vqb\021\025w1\xf5\xf0\xe6@!\020v\001wb\xe1`\xe1pu\005\xb0\027\0227p@ \023{\030{QS\001`s\no\n\xc4\020\xe4\xb0\a\a\021\006\xe6\xa0\xc7P\023\006\0207fas \001\026w\xc4\nt\n$6\fd\n{c\xc5 \026q$\020\xe7`gf\016z\016\006\n\xc5P\n{0\026v\xc0\ng0\xb3g\017\006QwS\nyc\fg\xc6`{\017{\xe30-lh\x84\xd7!x\f\xc4\020`#y\016\024P2\xc4P'#\004qPà\027q%\fwQr\a\xc6p'5qs\n0Sxv\n4\f{5P\n%y\016\fz\031t_\031\xb3\xf2\xb0\xa5\xd5\xf1\xc0P\xa1w\003\xc1`\x86\x81'\xe5P1\xd4`u'\xa27\"\nt\003A1\f\xb4\xc7\n\037\nkk%\030\x84\xa1\027\xa7\xd7\nd\020P\021%\xc5\0204\006\003\a\026`\f\xb0\xd7 \0246{7#u\026C2\xc6p\024qA\021rQ \xc5p\aw\n`\xb0\xc7 \nk\xb7\x97\x81\xe7 &{\003&\0267q$\001 \006%'\020\004q\fvr\n$\0063Vqa\027\nT\f\026\xf1\x90Gz\016\016\xe31\flM\n\xe3\ntr\"P1\024A\nz\fB\022T\nC\f5 y\n\027`a\022\004\022&'p\xc4P\fB6W\017\xb6\027\"@\"d\fP\fQ %p\xf5\n\003\n7{\f\026b\020&\006\xb2\xc7P\0234W\0236\a0$\xc6@b\a \027\020\020{\n&%\027q`\021Bsp'\006!$\xc7P\xc0\xb0G#\020\xd5PC\020\020\n{\021\xc5@\nw\n\xa7\xd7а7\005\xa3'\021&g!&\021\004b\021\006Rp\f\xf6\xb0W\001r%\ac\xc0\xa0'\027\xc1Pf\n\xc4P\027\xc6``\016z\020r\xa3\xd7\n\005w\003\a5\xf4`\n{\023{p@\x82a`7aP\nP\xc7\020\027\xa6'\022\020wv3`Q\016n\003Vz\x90\xe1\x80\027\xd2P\nuC'\002\ny\f%\x87\xd1F*{\035X\016\fn\"!655z!\022V\f`qA\021z\0176\xc5\n\024 \023\005b\001a\xa2\xf7`6\026\025\005\f5 grqa\nx\fy\f\016\017\n\xbb\x97\xa6\x83\x92\xb1\x97\aG\016wpǠ\xc7P\022Qf\f\f&\025\aA3\025\n\xb7\xf7@\f\xb0\a\002\005\f\n\n\006\fU\"\xe5\xa0\a w1wp\020\006\021`t\031\001$\xc5P\xd5\020p\xa3\a\xb3\xc7\n\xc5`\027t\n\025\006\003u\016g\nm{#\fsB\001 \a\n\025aq֠\xc7\xc00y5e\xc0\x80Ao\017 {\xe0@ %`\006\021Q\xc1\xb0\a\f4\027\001f \021T\016Q\027q\002\xa1\x87A \027\xe4\x90\xc7p`b\001\006\xc1\ny\022\xc6p{s\027Q\021c\xd7`\026\n0\xb2g\f``C\003\021\006\020@c's`sR cW\xb2\xc7А\xd1e\030\x82\x81\xb7'\0226{\xc4\xd0P\aQ\n\027\025\022v\026\f{A\016\025\002g!f\f\006\xc4 \xd4\020\001{\021\avPCp\017R\020\xb0\xc7 p\021\006\021\024\xb0\xc7`)_X\nM\xdcP\x85Cm\020\xb1'\016u\002g\023\001F\f\xe6P&bQq\021Rbrpq7\020\005\017{6Wр\xe7\xa0\xd7`\nu\020f\"z\f\001\020\001%\xd4pb%\aQ#V\nf2z\003\n\026z\030vR\021q$\xc7`\001pRc\023{\f\x96\x91w$\x95\xb17\xc6`l\030&0{\xc4\xd1\xc6\n\025B\001g\0164`qsQb\021{\f\xc5p\016oR*\xa0Ħ\xf6\xb3\x91\001\x92&\fa\xd6`CpB!e1f#``\0237%\xa0\xc7\nU\027\0036\025ՠ\xc7p\a\020\001\xa2\xd7\nz2&\005S0\026\nA\xb1\xc7\np\020pB\xe6\n{\ny\xf0py\023\0257&Q#g\026\n4E\f\a\nzs\026\xc7P\002f \a \xc4\020G\017\0264\nxQC\fcRa\001\023o\n` \xd5pQ05'@\n{\003!T\nf\f&\025pb \n\027{\030q\027{\032\030km\x95\xa1ѐg\xa1w\x94Q\xd4 {\"\aP\020\n{\023w6 \025f\xb3\xe7\n{\002\xc4 f\022w0F0\xd7`\024a\f\027@sqB\fB\0275R\022{# u04\xc4\n\025\x90\xd7\n\006\nF3\025'gS \nc\xa1א\xf7@#u\025\002\xd7`\006pCs\0016\026&W\002w\nVs\021gB\f\022\024\nG6' \024\xc7pW\nzA\f\0067\031E\002\004\xc0\xb0\027P\023\a \026PC\002\f\005B\020\002QSq\021parpq\xa2\027\022S\n\xb77`rrq'%rv\a!a'\xa2\xc7\020\xc7@`!{\022\021\006\xc6\n\a`'\xb2\027\f{R#6w\020\x83\xc7p\001$\xc0@\027`\ff\n{\001\f\026E\xd3 \xa7ǰ\xc7\xf0\xb0W\f\ner\xb3w\f$\xb3\xc7 e\f \026\004\023x\017u1q\xc4P\nt\xf6\xe0\xd6\nS\022WR!\004\003P\021f\frp\"{\016VQs\001\020Š\xe7\xb07\027\a\"u&0y\017\027%\025\f\av \n&\xb0\xd7Pqc\xc0`\xd4@\xd7P\020q0\004\xe6\nzWx\033\021v\xb5\xb1&\n\"n\xc3`\fz\n{\022bw \006S &%V\xd0P'a\027s5\026R7\ar\022QB'6u\f\xc5pP#{\" t\n{{\fw\a\xc7`7\fz7\xb2\xc7\020\xb7\xc7\020p\002\026&r\005\002\020$\n%f\003\020\nf\003G\003p\n{!a'B\001$\n\au\003\024\027\0227Gb\n\xb7\027\n\x9b\x85@\n@?\xeb&=\xc1W\n@3'\xb4\xebK\x8e\xfe?\xbd\xdde\xf2\036S\xfd?\n\001\003\n\n\n\n\n\x9b\x85@\n@?\xeb&=\xc1W\n@3'\xb4\xebK\x8e\xfe?\xbd\xdde\xf2\036S\xfd?\n\001\003\n4P6q\016{u\"p6\nt\nx\016\xb7'\017y\020\f{\016f\021&\xa7\xc7 v\001\n\xb7\aC\f\ar\xc4pp\n\a'5ư\027pbr\005r\xe4\n\nV\f\001\xe5\xb0\a\fgsV\nq\002\006r\xe1\xa0\a\nU1A`\n6Gc\ab\xd1p%#\xaa\xd7\ng\003\001%A\fh\xc1`\026\xe7P{\002\xd1@\xe5 d{\xd0\n\nx\002r\xf4\n\a\004!\020\026\xb5\xf7 R\n%w\001bQ\nW\020\0216%6{7\027\020w\026\002Rrb&\n{\002\005\001!v\xa3\xd7pb\026\023U\016G\fS\006\arr {\f\a\02765\024\021\nww&\027AR\030V\f{s\001\026\027q\002\027$\002\004b\021R6\xc6P`\n\006&Sq&q\020S7{7p\021\026\a \a\027%r!t\n\025A\027!\020\aR\027\027q{\n e\n\024Rr1F\016\006@s!$\003\0245\x93'1\020{\f\006@3\005qr6\027%cPc1&Pp'a{\032\x93\a\xe6\020U\017n\n%\xd5\xf0\xa0\xb7\xe7@\022{\xc5Q{\x87\xf7\xf1\xe6\xf0\xe60G\002\xf7\xc6\xf1\xb0&\030y\n\xf3\u0590g\017\nz2\n\x90\xc7`s\xc5\020\021z'\001\025 S&v\n{\021a\0027u\021 u\002f\021\022\025g\xe6\ndc\n%{ \xd7`6\001u R\026\f$\026R!\006g\022\xc5`\n\xd6P\fz\002$\xc0@5\n$g1\xb2\027`ְ7p\xc0\xa0\027\xc7\nf\022rU\xc2`\n\x90\xa7Az\017o3GA\0160\027%\022\021xq\xf1\xa0\ag\n\026\001v!`\020\006Rb\f\006q\001P\f\026\001{À\xa7Aw\026\xe1\xa0\027\nz\nx\n@\x80\xa1w3T2g\f&t15t\016\x90'f\xc2 \006QP\021\f{\023`\002!wG\"BRq'&\006\n\026\022\005vR\n'\005`\f{3U\xc1p\003o\f\003f2e\xe0P\xb77\f%A {\017`\xc6P\005\017{`6\xd1@A\f\027qf\f{\002\021Q\017\005{\f\005\024\003\xd1\n`\001b\a!\xd4@q\a\022\xd5`!{'Q\n\0255g\002\xb1\xd7\n\xa1\xd7p`\xc6\020d\0227pu\n\001vr'\xc5pp`\nvA\022\xe4\xa0\xd70uab&S e\016\027A\021\006c\xd6`bg\020\nf`\003s\005Rrs\xb3\027\ner\xc6`C\f{s\xc7@\021\x93\xd7`\0270%\026&\xc4\nV#6v\a\001q\n\xd4@\xc7@\022$\"{\f\027w!t\xc1\ny z\016\027V\n\xa6\xf1\006\xc0 oC\xc0\xb0\xe7\020\nx{\xa2\xc1\xb0ְ\027\030\x96\x97\x81\xc7pvr\xe3\xe06\021\0205n\f\001\001&\xc4\n\025vs\xc7`7ga%r\f\005!g\a\xc5\020!z\xf7@w'\020 {\fg\0215wC\nw\ac\020\xa0\xc70\004\003\025\021{\017d\017`\a\026\n\a\006\fyS\xc2PB\xc1@!\aP\f%f\f4\a\001\"@C\xc2\nd0\006а\xf7\n\024\a\023&z\023rz\f\f\005\001ws`\021W\xd7`\xc7`\xf6PfR\003\xd4`\n\xc7@\006C\022\xc5@r\xb3\xd7P R\021P &W\0011Bq\n%\021\nsU\f\0062u\xc6p\0267\xa0\xf7@cp\n5{0\ap\020\a\0200{\xc2Pg\023\024\f\a\xd4`RR\n{w\nf0u0\025b\026 \a\020\001vsz\n q&\006\002QSC\006\f\xc6P\001gs'&g\0036R\016Uǰ\027\f\025'\fuf1P7\a\xd5PS\017x\016W1\xa1''g\017n\f\020\026Pb\f\af\f\ffb% \"{\001\006Q\n4\026bװ\xc7`g!w\027\026\0235\xc4p\xc7\n\024w3\025p74\027\025'\n\016zV\x91\xf7\xd1\006\033\xa4\xe7\xa1W\026\003\n{\nnS\016\x80w\0175x\033z\016x\xd3\xe0\xf6\xb0\a\fn\xc3\020rP\f\027Q\xc7P\f\004\n@\f\n$$\022\005\xf5\xa0w\002wa\016e\003W \020\021\xc40x\n'{\f'@\xc70z\020\f{\003a 5zr\xc1p4\020w 6e1\xc5P1z\021`#5\026aqư\a\f45\ntB\021!p\xc7@&R\xf6pƐ\xd7@\ft\017V\021\026\024sRa\nQ\xa2\xd7p%\n\021y\fq\021%\xb3g\022a\016y\001\u0530\xe7`\n\xf5\x907\002'z\xd7@\016fp2\aV\f\026`\025\032y\no\022R\030yQ\001\f\xf6Py'A\031y\x87\xb1G\033FQ6\xd6@\xe3\x90'\x93\a&\021\xb4\xc167ar&R\f\005\f{\xc7\xc0P\xa7'\nW\022u\n\x92'\xf6p{\001 B\xd5`\ne\xb3\a\001R\xe1Py\016\a\n \x90'\fdӀ\aS\021\xf6 WA&\xa0\xf1f2\004Q!r{\031ta%\003w\ng\nf2x\030u%c\001g\xb2\xc7\xc0pW\f\005\fE\022\xc6\n\002\xc4p\002\024bq\022{s\0267\026g\fb\027A\xc0p{\016\025\020Qrab q@\nw\025\003\nn\016\017\004\006\025@\n\020qvp\001\020f\f\020\021\026\no\022\f$w\0200V\ntS\xc0p\xb7'\xc0P\001\xa27\020'Rr\006`\001\nwwc\xd5p\xc4p{\xe3P`c\aA\016\026 gC\027R7\002\a\025\003z\ng 5\002\006qQ\xe0\xb0'\026\n{\023'v\001f\023r\xc7@ PS\xb2\xc7\n\024\a#z \x92'\xf0@w\016{S\f&\xb3'w0\az\017va\nz1\xb7'`\n\xa1W\f\fV\030t\f\006w7\006\xb3'\xb37A\xc1@\xc7 z\0210\xc7@\002G\fՠ\xc7P5\0015'\004\fz\f\027%\021\xe4P'\006\xf4P'@\nv ư\xf7\xb0\a\f\x81\xd7`\xd7p{\001\nv\xa3\xc7p\xc7P%\020\002gC'\xf4P\001\024c\fe\f\xb7\xe7\nzr%\f\005\x91\xf7\n\xa7\xc7`\n`\001wǰ' {\003\"\xa07\027aa\f%aq\xd6@!\0014\006\n\005\f4\006\a'\0206&\006 \a5Ơ'\ny\021\xc6P!\006\027\0205&5\xb2\027\023w\026qa\xc7@\021\001p\n{!pb\n\aerr\0026%P&\003v\003\xb1\xf7\xb07e\n'\027\a\026\fv\a6$6\xc4@ p\020\nx\016\xf2\xf6\n \025w\fp'W2e\fvq`\016&x\016\026\n\033oA\f\x91\xe1F\033n\xd00n\002\016z\xc5\020&'p\f'\025\027\xc4\n@ #z\n\xb0w\nf\002\xd6\n\025z\017y\n\021$v\n\xe6p@{\017\x917$\025@\x97\xc7\n\020\f\027w\033y\f\002l\fz\031\xc7@\fA\xa7g\034z\f\a\"V\xc1PP a\0224\002av\f\020\xe7\x80\027C\n\004\nz\xc0`\nd\fP\001swq\021va\003BcRcpq\xc1Pa\023{\023\n\005Q\016\xb1\a\ab1\x827 Qqa\001\xa2\xe7pQ\001`\nwBr\020\020qQS0'\005\nAb\006\ft\xc7\020%'gb\nw\aq'\n\021\xb2\xe7@\n\xc5pt\n{\xc0p$\003%5\xc5Pp\003\003y\016\a w4qcP\016y\n\001\027g\xb37F\016\xd4`\aQca\002a\022$f\f\020C7$Ǡ7\xd7@Rs\xc7`\n%'%\004A\xc0\n{\"A#V\021B\017zb\f\aGs\001\027\022'4\xa3'ǰg\f\020pa\xc0\n%gb\003\026Q\f\xb7g\016ww\022 \fo\022\027\xd7`$\026!4{\0304bf\xf6Pq@\nv\xf2\xb0W6\020\awbr\020\0207x\017{\021\a f\016\a&aP\nP\fVq\xc1`u\003 y\nu\f\nz\002\xd5P!g\026\002\xa3'\022u\f{\fP\n{\0200%\026{\030{\n{\fQ\xc7PsR76{&'qz\fqа'\001%rP\f\004\0277A\xf1`'{\xc1\xa0\xe7\xb0G\f\020\016e\xa07\023&\xc5p`rG\n{cC\f@\n\006g 7G\0165wAQ\nW7%\005z2\xb6\xd7\xc0@#\n4{\f{\fr\005\xc0P\xc6\020\006qBpR\016$\a 6$\027\026C\001!\005\xc60T3WB\xc2`pa\f{\003\n&w\001\"{\f\006\xc6\nz\xd7P&q''\027Aba\f\006\020\027b\xc3\xe0P\xb1\xa7\027`\f\003{\a`cac\fes\027\aqq v\n\032y\f\xa5AT\016\x92\027\no\035z{Ӏ\a\006!\021W\n$\002z# \026us\fŰ\xc7p\004\001\001Bp\027\f\006g0\026\xb2\xe7\nRQ1@b W\0237G\fgq1pr\005\xb2\xe7\020g\no\017G\001cQ0f\022Qc\nAS%b\023%p\"vR0p6 \001{\002g\n${1{\023\020V\xd0P\fu\022\025Rc`\0021{\017t\027C\023\020\a\020a\a!z\001Q\002\020\006`\xc0P\ffp\017\025U0eB\f\n\xf1&\032l\xf2ЦW\030\xc4p\016\032\035\030\x84az\x95\xb7\xc6V0\x90Q\035{\xe4\xb0\aԐ\xa7qF\n\016l\f!\xb1'a7\006\nvq\nd\016f\020x\f\xd0Pp\xb1\027\xd6P\n$ U\021\n{q6`\016&\xa3w0pw\n\002\017\016\016o{n\ny#ѠW`\021\006֠\a2pǰ'\xc5\020bT2g\016z\016u\025\f`\xc5\020zRs\ff\005z\a\xa3\azc03$\n21\003\025z\f\001\xc5 t\xf6\nz1\xc4\n\nr\023$\xb7\xc7p\002u\xa2נ\027a\021&p\002\026\0066\xb2'\xd6p`\021\006c\027\n{\nv\020'\a6\nu\027\aa\023$ $\ft\021\001&\ab\003\xc4p\026\nbz\017z'B\002\020\021\027`5R`c\n%`&&\xc0`\022\0056`\x87\xa1w\f\xb77w\n\033\035\n\xb1׀\xf1&\033\xa5\xb6\x97Fo\xf4\xc0 \fe\022\fvpC \026\na\xc0@w7\016E\002$\027z\016{\003{\n\0066Q!Wsg\002\n\aw\0270`w\f56%\xc5`\n\026w!\xd2\xd0\xc1\xd1q_hz\003\fxP5'5\xf5@a\006\001Q\ft\fV\xc0pqv\023\025Sy\f\x82ׁg\n{Ӑ7{\032ox\xe3\xc6@\x90\x91\x86ax\xf3p\xd4\001w\036\x85\xe16 yс\027\017l\xb7Ay\f\a\001{\nǰ\aa!v\023G\fq\fu 6\xe4p5u\023{r\xd4p\021w\"U\nz\n{rr\027S'\a\f{\nu'r\fv\f'!pS\u0590\a&\022vU!\n\002\xc4\nap{\nw#vwc\xc7 y\n&\a\xe5\xb0\a\001\xc2P{\f\xb2\xd7 \024\a!{\f\xb3\027bAS\f{c %\001\n{'\f6\004R\006&\020@\fP0\006\a \fz\xb1\x91gp\031\xb4\027\xa0\a\xd4\xc0\xd0\n\022\fm\f\xd1po\xb27rds\021\xc6Pw\016w\f\025Q\xd4\0207e\016y\fS\xb7G\f{\x85w\n\0345\017E\030o\xe7\xa6\027\x96\021\031\x861{{\np\nw\020\025\xb37\020\025BB\022&`\022\xc4\020\025c!y\0167\xd6@a'A`sC\nf\022\xc5@\nx\016\027`w\021\n\xb3\006\016\xc6P\xc5\020\024Ґ7v1\005\xa2\xe7`\u0080'\0305%q\025G\023ga\021\006\xc6\np\002\xa3\xd7p\xb1\027\"\004#4\x83\xe7\n\017x\031y\x83\x97\xd1`T`Ԡǀ\a`Sq%\022PbCR\"'eð\027\xe6Pv\f\xb17sC\022U\023\025\f%S\xf4p{c\001f\f\xc5P@2\024\xc6\nys\006\nz\faS\n{\020pv\003\022`g\001\xe0P\xf6\xa0\a \xa07\xd1@l\xf5\xf0\xb0\xa3\xf7\x94\xb6\f\xf8\x80\xf7yO+Fyj\017ᡒ\023\xba\xe7\x96\xd6\xd0@\n\030x\xf0\xa0\a2\024\fz\002\xd6`w\001\xb2'7%\xe40\x86\x81\aR\fW'u\az\n\xf0 \f\x96\027C\001\xb170eP\n`\002&G\017\004r\xe6\xb0w7\xd0\020\x96\xf7p{\n{\f&$B\005\n\002b\003\a\005&$\xe7Pg \021e\fQ c%\032\xa3׀\xf1`\031)yli\xa7b\xb0\x95\xb12]Z\x84\001\ny\032npwV\016G\022g\023Q\002\005\xe2\xa0\027B1\027@נWz\001C\xb7\x81Ѡ\xc10!\f\x95\xc7\xe0e]{\006\016\n\xd3pb\xb3\x97\xd1\006\fwb\002pS\021pS Q'\xc6p\020g\n\xd5P\021f1`\xd5@Rb\0276y\f\021g\xe7`R\0206{S\017z\nz\001\"Q\016\a\023a\0214y\017V \nb'\xb1W\002dA\022ư'''\xc4p\n45@\027\xc6\020bbbpqs0QWc\001grq @s\027RS\021sV\021\022fc!g\n\x96\xd7\xd0 \x90\027\f\x91\027 \xc5`\nP\a$\xd0P`p\017{pSg\"\006\fuq\na&w\0217P!\n\f\f!5F'5CP\022\026\n\ab1F\f\023\017\030\n\030@ik\xf1\xa0'\xc5`\f\016-ylk\026\fT\002\0275\a\xd5 \0246v\027!Ԡ\xd7p\016zz\xd6\xe0\xe0\xd60{zv\xe0 P\033)\017o\035\f{\017\032v\016:M{KZi3\030р\x81w\xb2\xc7@\016n\016\f\xc0P%\xb2\xc70x\f AC1r\020Q\xc0@\0226\x91'sCa\f\005r\026\ab\0250P7@\x80\x81'\xb1w\016b!f \xe0\020\021!D{\fl\016\f{\027\017\n\xd4 \xb7\a$PQ0B\002Ppb\0026'f\001`\"''5\nt\xb17\006\002v\xa3\xf7\xb0\xd7`\n$rv\026\x93\a\f\026נ'\020\006 \n%\020\0276$&zs\023p`p\021\xf5@\xc5@\002\xc0@b\006\002\027\002\xa1\xc7\020\0260P&4\017\fx{\017\xe4@a{\017\xc5`0z\a\xe0@rA\nzz\n\n@\fqw\xc0\xb07P\002 \004C\017\xa0\0271\025\xc4P\xe7P3z&6\003ub\001\n@\n\xf2v\022\032\034]_x\xea\x80\n\x8a\x87{\xe5\xf1\f/\034kJ\xb8W:\xa3\x82\xc1\x80\xe6\xd0\025\x87A\n\xb2\xe7\n\026\au\xa37\xb2\xb7\xd7\n\x91\a\f\021\024\025\027A\"\xf4\xb0W\f\021g\xd6p\xc6pp \027\xc5`\f\005\xf4pvQ!\xe5\no\fy\f-\031h\xe6\xe6\xf5\xa4w\xe3\nW\022\026\f\024&\nu4\027\xc4`\001\003\027\027w\027R\xc6\n\n\016\031nY\f\xdf`\xad\xd7\xe6\xe1\x90a\x85\xf1\xc6d*\034\034\fyx\034xi7\016\f\xb7\xc7`g\xd0\020y\xd7\020!e\xe7@S\001P#0\xb0\xc7P\xb3gr0p{'a\f\021r{\xc2P!$\027&%4ps'$\001Qa\016fr\nyChx^\x84ѱqxc\f\016V\031\016bၶw\nP\003{\n\a\006!'w{\n\xe5\020i\034n\x97\021t\n\x82\xf7\xb0w\xc4\xc1pU\031\035/\037\032\xaf\xf7\xc1\xb5\x87\xe6\xf1\003\005\017n\xb9\xa7\x96g\016\f\xa2\001y\017$n\033y\017y\xf0`0\xb1w\f\027g2{\n7{a!\003S5{\017\026\006\xc0\nk2v'y\031{\x95\xd7\xc0\xf0\020\n{b\025\x82\xc70t\f\026%cw`\f{2Qr'\nc\acB1 \020\024\027Ps\020'\027\024\001\n{\nz\n\025`\0227z\003a'Q\f\024\023$W\016@5\017y{\xd1 \n{\fx{\f0Q\020\002\xa3'\xc5` \fz!{0 5'{S \ac `\nxÐw\017{r\xc1\021[)\xce\xe0{\xab\xb7\xa2\f\017N]N/\031n\f\xc5ӡ\xc7\025,\xe0e q\no\xf70`1\004\005\023\024W\f\n\xc4py\fa\"G\030\x85\xd70{p0$57g1\xb1\027\fz\xe3\x80\a\xd0 \024rհgc#{\xe0`\xf4\xa0wR\n\xe4\nzni\xe2\x83\002\031\xc4\n\xbf\xf7F\024g\nG\xa3\xc7@\030d\fu\031m{\030\x827v\xc0`\xd6\020\025z\021\017\030yl\016\036>\xd5\xe0\xf5\xe6`\032XX-\xa2\n\016\xf5\xb5\xc5涇\x917\031\nz\f\x91\a#\002\f\x90\xa1g\025w\xc6p{\002S\001\xd6PQ\023\025p\fucqB \nz\xc1@B\002\xc4\0205%\xa3'\f\026`\x85a%uBr\f6\xe6\xa0gS\fg3\024\006w\fvS2\004P\021\xc7@brC\n6z\a00d\xd6P\001\xd6\020z\016'\024%r\njk\0348\xd9\xf0{o\xbc\xe7R+*X\x8cg(\x9dё\xe6\xa5\xf7\xb6F\f{y\034\003y\xc1\x80\xf1\026\f\xa0w`\016\xc0\xa0'\f{\021\004\021\0017z\f\fA\001'g\001p!S{\022\x90\xf7\nvs\022\xc4`&\006\023e5\nb\xf7p\xa0\xd7@\001gp\xc1`\005\002rv\020B\n{\f\021PQ\faP\xc1@\xa1\x87a`!\x92'\xc6\020\xa3\xd7`\a\021\026P\xb3\xd7\n{p\xd1`5\av\017\030ogq\az6\032\xa2g\nV°7'\006&{\016%\025P\xc0 e\xc0@q\f{\xe1`f\016{a\n z w&\xd6\020Q!\xb7\xc7`\020\n\xca`H\xbc\xb6o\\\x8c\xa1\xb2եa\026\016_(\xb2\xa3wm\xad\xf7\xf2 \xa7\x91W\0264\xa1\xf7\n,\x9f\xd7\0048\016\\>;\x8a\xd7y+\xe9\xa0\f\x83\x94ҶfT\f2\n6 \005\fo6Q\nR\xe4`\xb1'А'\026&Q\0037\005'&\xb2w\003\0016\006c\003\001tpf\ng\006!B\f \027s {Q\xd0pv\xe5@\xc1\xb0'\xc40\005p6\n%p\nA$\n{\xc4\nuv!\027\"D\f\nU\022\0024qf0\020\001P\021\024!6q\xc6`6y\003Q\f{\016\005\fy2\x977\xc2\xc0\xa6\x81\xd3\xe66{\xa4\xb7a{\031\noN{ː\xd2Vk\nQ\016E\n'\006u\n\n\027\006!\027\xb5\a\xe1\n\004\025!{0\002\n\017{x°\xa1\021o\xbb\xf7\xc1\x90A\016xc\026\005\001a7vr\033xt\031z\xe1\xa0w\xf4\xb0\xc7@w\xe4\xb0\xd7\xd1f\x8c\xb1\xa6x\xac\x87\f\xdc\nc\0207\nxà'\xb3\xb77'\002\020\027\xb2W\f\xd7p\nBs\fE\022\025\n\xc5P\020\002z\030{\a\xc2`\026\016{\027\a%P\0010'PQ\fg\021brqz\0175%\020w\xe5`6w0{\fw'0{Rb\016{ \027'\020\n&\025{\f\xc5P'vR\023\xb3w \x84Q\021\005\02753{\020v04$\xc2@\xc6@pcc\n\xb0\aB\003`\023ǰw\nu\001rp\020RB`#w°'\005\xb2\xd7p\x86\xc1\xb6\xe7\xb17\002n\030o\n\xc2\xd0ph\031\xb2\xf5\xc1\xf6\xd3\xd3{X\032=\034nY\\\037\030m\xaf\xc7\xd4\xf3\031\xe4{\x91\xd7\xf1v\032qU\x80\xa1\x86Q\017z\n\004\"A`\nz\016As\002\fzy\"\nvW\f\023\027\a{\xb3'Ґ\xc7\nz\002\n/\031N\xc1\xc1\xd1@\035pox(h=\x92\xf7U\x82ay\003\004\016\026G%B\016Q\xc3p\025q\x85\xb1\xf7\x90\027wR \024\034kz\xcf\xe0儦\xc22lz\xcb\xe0\x81nz<-+\xbb\x97\xe2\020\xa3F\xe0`q\xc5\nu\027#\a\005`\003\xc0\n{s\nvѠ7$\001g'{\nS3iv\016-\xf2氕\xb7\xc1\xf2\xb1\xf6{m;\031m\xab\x97ǣ\016\xa2{\x81\xc1P\xc4\ny\020\xd5`0\xb7'\027'P\xc6\n\xe4\x81\027A\027\fQq\f\aw\002{\fz\xb1g\031z\f\a\031esy\xc2\xe0&g*ń\xa3\x94\xa1\001\xa4\xa1\xc3zm\xac\xb1yI<\x94\x816\n-yo\xb6\xd7\xc0\xc0\xa0\xb7\xd7\nqs\fm\001\002$\021\021\006w&!\xb6\xf7p\001g\f\027\020{0\a`\020Av\f\xd6p\xd5\020\xd6@\aT6\016\n7x\fg\a\n\x91G\0305z\nQRS \xf7\xb0W\x91\xc1\xe6\xe0\xa0W\006\n\025z\n\ndo\032\030@U7!6\026\xc4p'ǰ\xc7\nV\f\xc4 vSqv\n\xc4p$\xe6\xd0P\005q\016x\fD\x93\x91\xf7\xb5ǰ\x82\f\032\xbc\x87\xe4\xa0\xe1Ђ\xf1\xf5z\nـ\xb1\x95z\033<-\xf1䆓\xb7Az\x84\x91\xf7\x80\xc7\n\026!F\xc0p\002\021v\021vP\030{v\xd1\n{\030n\030\017\x96\xd6\xf6\xe1\xd3VlҀ\xd5\xd5\016xԖ{\x97\f\037\034\xb0\xe7\xb6w\xd3\n\024\n\027Qs&Q\016u\027\006gc\021\001`\xc7pz\003\021rPr\f\006vr\xc5pW\xc1 \004\f\xc4p7{R%\xb2A{!\xb6\xc7\n\xa2'\xd5\n{\017\005{\n6&p\020&4\f{v\xd1\na\022\x87\a\016\003x1аG\xd1`p\f\004\003'\024b\020Qr'\001bA7\n&z#\a \xc4` `r\002t2V\016e\022\aa\ab\0011G c\xc6P\026\0250g\f\025V\xd2`qrQa!c\004\fQ\020\026{\xd5\xf6\xd6\xd6F(>\037{n\x86\xc1\020\xc5`z{\xf1\026k\xe1\xe1\xf0\x91\a\xb1\aC\f\026r\n{0\025\022{\0210\004cSp\003\xc6PR'#tp3{\020w\xc4\020\016{vz\017\xc1P`\f{' p\006\nz'\027\xe6\na\016@\xf1\xe6Űӣ\xf1z\xbeg\033\031{\033z\xb5砱\xe7\x91SHj\035\f\xd1\n\006a\020 F\nz\xc2\ng!vD\xb4\xd7\xf5\xd6\026<,\n\030ky\034\036x{\031\xf7\xc4\n׀w\fwǰ''\xd6P{\022@\xc6\n\xb5&\017\035-\xba\x97\xe7\f\034yzoo\xd7zh\xee\xc0\xb3y\xae'\xf8\xc0ҡ\xa5w\017Pb\027\fe\023p\xd6@\0035{\f\026c\a\fgq\021\020vg\017y\032y\a\027\024\f\002W\xc6\n7w\0015qvq\fv\020Q\fF\nqppBs&6e\f\020\027%\027w\xe0@'Ra\020 urS7'\0260vp\xc1\xb07g'\a\001v\f\026g\nf\fz#\n\017m\030\xb3\027\031\xe1!\xb0\xe4\xd6\xd0𐡧'\0263vg\f\025\a A!&\ag#\024t\017\031\xe3FR1y2&Rװ\027{\n\xd4Ps\020a\xa2\xc70w!u\nz\f\025\021\a\a\001b\xc6p\030{t\no\xe2\xa0'\no\n\016\x95\xc1\xb6֥\xe3\x81\016\\\u07b6\fݐ\x91\xa7\xa7ǰx\x8d\x97\031Ƞy^8\xcd\xf0\xa0\xf1\xf5\x96\xc7Bfr\xb3\xb7\xd1v\017\xc6P\n{S\0205CqS\xc0\n\027\004b\023u4\022ws5\nusrא\027ar\f\a\020{\0235\xc5@\022\x80\x91W\023\xc6Py\030z\xb2\xc7 \f\n\xa2\xf6\x96\xb1֕\f\037xn\032\035H\033(d\016\033\017L\033[m\xd1\xc0\022{\xe1&\xf1@{\017@\xb1\xd7p'P\016z\016U\f\025\xa37\027w\xe0\001osy\003a\0020\xc0@榡\a\023a\n\005\a\021f\020q\nxr\xd3`u74r\xc4P\xc6\xc0 \005&W\ff \xc7 \xa4\027a\n5aR\fu\f\xc5\n$T\xf70\x92ו\x86\xc1\xb2р1\xa1\xb2\xb1\x93\xa7{\xb4Wmk{\017h.yp\021\n%\apA\xd2`\006\020\025B\027s\022W\xe2p\x91\xe7\xe6\xf5\xb0\xc3\n\036\x88\x97\xd4\xe0\xc0\xe1\xd0p\xafW\xdc\xc0\x80\xb6\x97\xa2\x91gu\xc7\ne\n\x92\x97\a\f\025'\026\025\fu\003\xb6\xc7P#r\025r\n\xa0'ry\003\f\025A\x80\xb1\0275\n=\x82\xf6\xa6w\xa1ֶ'\x82\xf7P7\n\xd8\xc0zɶ\024;\037.jyذ\xf3{/\030\033mKl\034\xd1P!n\016rҦ\xf2Vw\n\006\026 6\026P\020&B\026\xc2\020y\f6{\022\xf6p\x93\xf7p{\f$\xd4`\027`\021A\023נW0\ncf'\020\005bR\"v\f\005vr& &\fd\021S&\001\xc6p6{\xb3\xc7P\f{\017x\017z\n`q\fp6Fc\n\026%\xa2'נ\xc7\020\xb2\a\xf4@\021'&P\002\016\024\026Wsb\027z\023\xf6p\xe5Pw\xe7\n&\022`\001s\020@\f\xb67\a\xd0@c`\"\xf4`v&apb1\027\027{r\002\026q\027c\006 w\021\0216da\n\xe0\x90\xf7\x80G\033{A\nz\032z%5\xc5Parp{\031y\f@\xc3&\xa6\x81\001\022zg\0221\002{x\f$!\001g4\003a\020 \xd4@\021` \001\026\021\006%tA\xd3 5R%\fe\xc3@6\x87\xe7p!{\nu\0015S\016{\017y\xc6@\nf05pyxm\x94\xe1\xc1\n`\a5\xb17\xb3\027\027rP\016{\n{\021\a\n\020\027u\n\005aa\xf70d\xb7w\002\023\020\xc4`P\xe0p&\026Wrs\021\xb6\xc7pS\ne\"u\xd1PR A\xe6\n\025%\xc6p\006\nW\002$ez\xa5\xd1 \f\xb0w\a#%GT\002\016\027\006\a\fbu\fq@\0020&w6Q\020Sp&\x95'\032q'\027$\xd2PeR\006\"4\001'e\n\a\027Rc0\004 5v\004D\xe2\xc0p\020tr\016^\\\030\037\xd2`\f\031\xb0G\x85q\xc1pv\002'%\027g\0020W{\033\xe0f\033z𰷇1\004\036nK\034\xc0\x94\016\xeb\xf0zL\036\032\xf5\xb0\f\xbc\xa7\x85\x92\x81\xf1\xf4\xd1\xf4\xe6\n\xb07a!w\016T\002C \0016{!q\006P1\006c!{\xb3'\xf6p{{6\f\023\aF\nr\017e\004b '\005r\f\006ր'\fG#\0254!$\acb\0066\xd5`wb\022q\003\026u\xb3\xc7 &6{\003 er&\"\005\030l\031\xf7v\033z \003y2y\034\031\xe2\x96\xf6\025k\f\034hy\032\n//\x85ŀ\xb1\xa6\xf4\xc1\xc3\020\f{x\xd4P\032{b\x80\xe7`s'\f{` pCr\026\020%\xd6\xc60\016\n\x93'4\xc3@\xd2\xd6`v\xd7pS\0227v\xf7`w\004\nvSp\001\n{\023\021\025\021\x84qv v\001B7\"E\xe0\xb0Wp\xe0\xc0`\xa77x\fLn\xbe\xe7\x85\xd1\xf3\xc1\xf0\x96Ò\xe1\xa6\xe7\xc0\xe6Q\031z\027\023RA\n&\026v\030S\003z\"n\034&t\xd3\020\020\n\x96ֶ\x85\xe4\xa3\n,Tln\xd3ᆡ\xf1\x85\xa26Zx-\x86\xd1`$$4A\f$V\017%U\n\005\f&\a\026\xb2\027Cw\xc4\020r\a\xd1@b\021gw\xd7\nzrrb\fgq{\n0g6wa\"{\016{\xd7P0A\022\xe5\xa0\027\xb3\027svcy\xe7\xc0Pa\001\001s\004\020f\n\021$\fy1\027g\xc0@\021S\f{ra\021pR\002`\021\xa3\027\a\027 $C\021\001\xd4Pq\f\n\035\016\036\034o\\y\016W\033\035\xc1\xa0g\025\0060P\n\006\xb17f\n\xc6`\xa1\xf7@ǰ\027\021PC{'\021br\n\xd50\xb7G\aQ\xc6\xe0P1%bq\027\027q\021\005rǠ7p1eC\nV@\020c\020\n\025f5r\002\026p#P\f\005\026 5&\xb7\xc7pq\021&\xc4\020\024W\021oloMz\033\037\034q\036\032uc`\n\022\021\027\020\026g\002\nbӀ\x91\xc7{\xb8\xd7z+Ȁ\0328\\\xaa\x87\xb7\a\033\xcc`\xbe\xd7\xf2V^\x813\n\xb3\xe7֑'o\017\026\027\016n\ng\027\003u\023\026v\xb3\xe7Ppy\003аwcðg\xc7@s\026!\xc0p\xc0p\u0530'\xe0\x90wR\fw\xc0\x907B\f\004S\fV\020\xa7W\027\034\xe3\020\xb0w&\xb6'\xd7QmU\xd7\xc0\nf &\a\xc7p\005\027 \004\016wc\021\006p\020Wb\f\004\xc3`ǰ'4\006\xc60z1y\n&aa2{\002 \xb0g\xd2`Gs!a\xb3\xc7P \xa5'f\021\f\016\002{\026\xa7\xd7\xc0p1{\f5S`\ny\017y\002\002\xb27\xc5@\n\xc4\n7rA2\006%\xc7p\021f\022t&\x83\xd16א'Q\xa4aq\037E^yn\xa2ׁ\x91\xd1!ZlkÐ\xc31z\xa5wBC\xd6\020\027b@\fR0z\016\026\027wr%\xd4\n\020\027\0206Ű'\n\x82'0\x92'w\025\0263\005w\xe5@\003\xe3\xb0\xd7@5q\x83\x87\x91\xc7`\fV\0215S\030z%W07Gf\017R{{mzl\030\034\fc\n\030\xa1\a\017\024x\033$\n\xb77 6\xc4P\021'\027%Srg\030x`\030\xe5`\xc3\xe0\020XLI\x84\xc2\f\037k\\\025\034,9xY\031{O\033\017\035\n7zŰ\xd7`\"Dr06{\016{!P2w\f\026x\n\xc5Pw6{\003\026\023t\016{b\xd7p\027\fPb!\xc5p\005!ar\n\002$q5A\021\xf4pq\a\n\a\003&\025w\nf\022`Cs''u!\xb0\xf7P\0250`\xc7@\ara\021&@\f\nW!Q$!%\xc3\xc0@\x97\xb7g\xa1w\0322{o\024\n\xc1\x81\xa1'F'g \025\xb3\xe7\020&4\006\xc5\0205\005\023y#u\0026\005gT2\f&v\xc4\n\xc6 \016i\n\xb17\xe1\x86\xc1 \033נ\xf7\xb5\xc5\xe5&\xb2W\xc0\x90\f\xcf\xc0\xa0\xf6\xb6G\xac\x87\n\034\x83A\xb1wz\f\021\n\xa6\0275\003\021\0274 A\a\n{C\f\004\027\020\025A\xa6Qy\031z\f%%'s g\003w\n\026f\xd5`\"pw\021%\xb3W\0225\x96w\xe6 Q\030z\035Ā\xf7\xe0F\x857\016\xd7\xe0\xa0\xc7\n\026g\n{\002&PB\030\004&\x92''f\xc1P\n\xa1\a\f\xb7'%0'\xc6\020\aq\xb3\xc7P%\001!Aqq&R\fdr\003\n\024w7'fb\xe5\n\az\fQ3g\022$'\xe1\xa0w\fvw\021\025P\034o\016\xf1\xd6\xe0@'x\xd00z\xc6\xf0@{\031\fz\016\x80\xf7氧\xf7֠\xe7\x92\xf7\xd0Pհ7$A\xe6\xb0'{\020s\030\x907W\ff7\027\xc5\nPSB\f\025\aqS\fG\nu\xc0\xb0\a`р\xc7Pq5s\xd7\n\xc4\n\xb4\xb6浆\027o\017\032\0179*o^\x87\a\xc7\xf20\017\xb5\xb7\xc7@\a\n\025\aw!\nQb6\n\024aw\f\027wRc\021p\026'p7{F\xe6pP \003q\021\x85'\xe7\xb0\xd7`\f\023\xe6\x80\xe7`\xa3'P\fb\021w 6g\003\0276{!p{\022\024!g\xb3\xf7@q%\021c \a\nz SQ\033y\0206fq\0011\xb0w\022\xa3'\xc6\020t\f\027p VB\001R\f\025qv0\xc1p`6\005s \nF\xc2`\xb3'7\a\xc7@y\017bR6B0p\xd7@\n\026A24\025'{\016%&1\fo\xc0\x807\006\001%\022\xc0p\x90\xf1\xc0\xb0G_Zkն\xf1\xa1\x81\"]O\035h\037ȐA\xf2\xa0\xf7\xc60l\016y\033o\003\n\xa1w\f6wrr{\016{\022%%\nV\f\005q\xc6\n\006\n\xb2\xe7\xb0w\n`v\f\xc4\020\025gQ!a\016VcAs\027\002\xc4@\f\026\026\005B\n\027\xe6`\024\xc7\020@\fu&\021\xa2\xd7\020\006cpp\xc7`\xc6p\020f!wC0{\n5\0257'\004s\0015&g\n{\003\a $`%\026\xd5\020{ \xf2\xa0w\026tÐ\xa1\027\032D\n\xc6\n\xb4'tw\xe5Pǁ\a\xd5pfP\f\f%\020'\004r`&rct\fv\023\005\001\020%\nT\xf7P\0267q5\027\005\f\x937Rr$c0G\022q\xc5\020`$\021qC\xd5\020z\n\027{\f\xb37z\017\005\020\xc5Pp\xc0\nB\016'\xc4\020{p\xd6\xf0\xf6 `Ss\005\016{p\006\022z\n6&%\xd0\xf0 \n\xb7\xd7\xf6\xa6\027j\n\032\016ƀ\xd6\xe51\017+\n\xc6`\x87\xc7`t\003f\n\027\024\xb27qs\002gB\n{7ar\xd6\020\xd2@1\020C\no2\xc40x\016\n&a\xc6\n6f\001\xb1\xf7\xb0'\001\xc5`b\a7%\a\020B\0236a%\a0B\001\005R\fP7`\x93\xd7\ny\fcg\xe7\020x\032a\fpV\fPq\020\026uz\f7!z\002\003U\n\a\a75v\xf6`%`\0016\xb17\020W\f\005C\xc7p@\"\n\026\n\027\027\005\f\004\xe7\xa0\xc7P!wS`\xb3\xd7@İ\xd7P`\a\001\nz0&\022&sb\001\x95Q\xc4P\"t\xc6`\020\xd1@f7r{\0220W\n\025W\022\xd5P\xa2\xe7 tb\001\xc6`q\001\nz\fwB0S&`& aѰ\aw\022f\017\006wz\nP\016\024\0025Q\xe5P\017T4\020q0\005\xe5pv\020 \xb27$\xb3\xc7pB!\027'\025p5\004\017VrA\xc1Pcs\003v\xc6\nvq\032k\xc5\020%\a\016x\022{\031e{\030\0051`\n\x84\xd7P\xc6\n\fo\xc7`\fP&pS\xc7P\xd5p7&wS\020\aA3@g\xc3 V\xd6\nD\fa0zҰ'&u\023\026Q\f\004\f\0057\xc5p0\xb57p\020&4#d\f\xb1\xc7pp\022\xb0\xc7\020z\n\006\002\f$\xc4P\n\024\f\a4\027\0276\f\016\n4\nz{g\x90'{\xf5\xd0\xd0P'\xb0\027e5\f{`\021\020\u0080g\027\002@\np\xb27C\xc7`gq\"v\027`\fy\n`\002\fz\003`\n{b\017tg\"\001\a`\016{sw\f{\0037v\n\025e\001\fz\016z\f\fp\a\n``\f\xc5\020f!z\016W!\n\005p\xc1@\n\a\a\021d\xc0`\002E\016\a\022$Q\022q\a\026!\006w2d\022\a\020\xc7P0P\026\021 \006\026\n\004\xe0P \006Q6z\x83\xa17\xb2\027\021\n\025f\"{\"\005\002&6&$Q!Rq\027p\nz2V\f6e\002rqb\xd7`\026A\016{\027\027!{\f5w\027\020\020@\nq\a\006\nm{\033i1T\xe0\xc0\xd0\xf6`\xb3\xf7\x90\xd7\020x\017{\fu\001a\xe5\xb0'7r\aWRC\"\004P\017\xe4`\026\xc7\n\xc6P%\002\021fS!$\xe0\x90'\0266$q&c\005qPc\xc0@\xb27!\n\xa4\xd7 \a\006\xd0P\026P!'BQbc\020R\fpP#@2f\fTr\xc00\004\027\a\022W\"\025e\023B\001\020c1xq\022\f$5\xd4@b\n{\no!\xb1\xc7 %d\f p'$g\n\020\x86\x97Q\017o\xd7p հ\xe6\xd0\nzC\f\f\020z&\016o\n\020\xa1\027R\016\0066e\017f g\fv\020 {\nu\006°w\fW\f\002wSW\nW\xd2`6{\f4\xb2'&\025\0024\020\n{&r\xb2\xc7P6а\a\xd4\n\xb1'a\fW\021\a\xb3\027\016{ \xc5P{\017{\n\020d!0wbap\016{\002\nur\xc5\n&\027Š\xe7p\020{r\f&\006\003gR\xa3\xf7P\001p\n\026{ra w\xd6Pr\020wr'\0205$1vba'r6'@\0027\xc4``rSb\f{\xc0P%\a\f%\025ǰ'ǰ7\022w`\0025\020\026g\021 \aQ\xf7Pf\f`'\n{\xc2P\xa0\xe7`2f\0016U\f\021p v\xb1\xe7\np\020b\020\006\027\n\005&\0256B3e\020 fq\016{\xc6p&\a\023\005 e\n5W\022Qbg\na\027'R\n4\nx\f\xf2\x80\xe7\xa0wS\xa7\x97a\x81\027\016\nl\031n\0345\xf0@\x82\xa1\027\x83\xf7\xe0v\xf7@o\xa2\xf7\xf0\xb0g\n_(\x85\x91\xc7\xd0\xf6@1\005C\f\025\025a#{sCr\f\005Pcr\xb17!y\xe2`'p\002\027\027Pqb\n%%Q7\xc4`\x87\x81'\0260w\026p7Qzr\020\020b\fu`\0306\0246C$0\027\xc4`\027a\xe7P\f{S\u0090\xc7`\027\ny\fw\xc7@\022R\020w\022W\022\025C\002\002e\xe7@\022{\fp\xc7\n{\n\006wb\xc7 uw\002c\0214%a\xb2\xc7\020@\f\026\xe7\xa07\006C\f\004\002\026\024\035lqr\021'x\n\020\017n\030x\xc1\xf0\x90\x97\xf7`y\035{\xe5p{\xf3\xa0\aB4\xa1\xe7\xa0\xf7P\xe6@C\x80\x81\027\xc1p\x92'\xc0\n{\002agSr\f\021U\022{\016x\n\002\a\026\003$\n$\n\xc5\n\xd5@!\0240y\017\024\030E\030u\nCaAW\xd7p\xb2\027{\016\x82\xd7\020{\fǰ'v16\xa0\xc7\nz\"6\0240\nǠ\aq\nBr\027ap\fwS'7$%\001\026\f\024R\xd4`w\0227\a\026\xc6@c\f{\001'r`\n`7\024\fV\002{\f\nz\"\006\026B\xc1\020{\022R@\003c\026&\xb2\027\001\aR\001\xc7P\001a\nfp\027\021A\n\x90'r\001b0z\002\fw\xe5`W\n\nz\021w7\xc0\xb0\027\ffrw\n\xb4\xd7\xe0@\xc4`\xc0\x90\xc7 y\031m\017A\031\xa2w\030n\u0080\xf7\nUpc&\n\025aC\0027W\n4'\006`\xb3\xc7\020\xf5`5gCw\017{\xc7`\xe7\xb0\a\026\n\x85\xf7`\ny\n\xd4` \024\021&4{\032zqq\002\0204\026\0267%'\xd4`qP\016z\fP {\f\nԀ77q\025\f\xa7\027\"\xc5P!\006QCb\n\xa0\xc7\nP\001\025A\031\025\x827Sc7vW\003\xc5@\022\026Ǡw\xf1p\aQ\016{'\xc5PS\001z\f\xc7\020Fss\006\0224\xb2\a\f{\xd2p\005\016{\021&r\005!\005\001Q\002'$Q\f&'$\0277$b`\f\004\001S\fG\002qg\003a\001\nE#\005\020p'7g\006\xe7`\027a\n\025W `\ff0&\0067\005\f\025As\f%z\fq&p\003G0\xd7Paar\apr\001'v\0207z\n\021{\xe6ppC\nŠ7V\f\f\024f'!wqq7A\002q5P7p\020\xd7 \025U\ng\a7c\005\001Q\xd0pf\fp5c\0041\xb7\027\n\xc5`R\001\025\fvr`\003{\n7z\0224\a\020bb\xc1@\006q\021\aq6B\f\004аg\016\004\016z\017z@\f\xb3\x87\xa1\xc7`f\f\xb2'!y\f\027\001\xc6P\006\xc3@1{\a\020\027Acq `'s&Q\0025\025qp\027\n\024'&\026bqbq\n\027\020C%!6$%\a!\026\n\xc4\020\ny\xe7\xa0\xd7P\027\fuc\xc0\xb07qg\ff q\a\xc0P\xd4P\xa37!'4\xc4\nz\020a\002rce\fW0a'\fz\f&pP\002\020% {3Fr\xd1`y\x90awQ\001C\020p\fa\027{\016$5\nD\"\024!%\n6&v2T\016Wb\xc6\xc0\xa0g\001\xc5 'U\f\001\xc6@\020p\020u\f\xc7P\ar0v\xb2\xc7`\027\0215R\n\026p&ǀ\xd7p\001\024\0166z\"6\004\"\xf1\026\xf6\020\005RQ\021\033y%E\030wa{\003\xf4`\006\nPp&\np!f \027ư\xd7P`\002qs@\017\00474f\fb\xe5\xb0\027'v\f$S\n\005\016x\f\026\xf6\xb0W\npva\f7f`\f\xb3wb\f{\xc0\n\xb1'z\016\005\021\020q\x83\xc7\n6\005\001\006B!\001\a\020\02674V\003p\021wsr\a`\fv\0202z\a\022g1\006r\xc6@Ǡ\xd7\n\xb6w\n5W\"G\f&%6\a!\026@\f\xb1'a\002v\f\025 v p\"z\002\027\xd6p\026q\xd5`&Pc!\aV\fPs \ng\xc5P\nvSr\005\016y\020#`\n\x93\xc7p\002\xc5P\027\020v\0165\024&Pb\fQ\f\006B!\006q\n\006\xb3'\020 \xb07\n\xa0\aѰ'z\f\027@\023\xf4\n{rs6\004\027\001gc\016\025\xc6@\022\021zb\030z 4w\001P\022\f\005\026&\xc6\020wW\nu`\n6$q\n${!\026\a A\023\005\022\025p\021\xb1\027\023p&\xb0\027\fr\024 \0040\005\nur\006r\0025e\022\xc7\n\006\xe6\xb0\027'%!\xc5\xd06\016y# %\xa1נ\027\fBb\fw\f{q0f6\xc6 $`\f@C1\025rA\022F\n\005\022\xc4pw\f\006\xd6@\027 b'u\f\x93\xc7\nu\030m3{\fc\fn\017d7\fo\017\016zz\0177z\f\025\nzrqcŐ7c\023\004\nWC\xd1PasP\xc0P`\f{\f&\026qA\022'$\021\xc6@s$\f\xb7\xd7`'@\n\xb6\xc7p\0216p\0057\002g \a\f{\020rQ\n{saQ \002\xb1\a\f{\fQB!\006&bwv\"\f\024!o\xd2 y\n4ư'a\n{7\xb1\xf7\xb0\xc7`6`Q\003q%\n$\xc5@\n\xf5\xb0ǰwR\nb`q\021u\002\n{ \026r\020W'q76\026@\f\a&Cr\027pbq\0234\xc4\n`P°wC\xc7p0'PB1v\0216%%RRsvS\001 bC\001!Gr\022$pr\a\xb3' p6\006\fd % \001\026\021z\xc2@\021\n\xb6\xc7`rR\016\005v\001S\xb3'\xc7\020u \001uv\np\n'u_\x9a\x85@\x87\x93\xba/\x8f\xedT@\xe6\xb1\025A\xc3yJ@\xf7\xe5\xb1\025AsD@\n\001\003\n\xc7\n\n\n\n\001\003\n\n\n\n\n\n\n\001\004\n\001\003\n\n\n\n'u_\x9a\x85@\x87\x93\xba/\x8f\xedT@\xe6\xb1\025A\xc3yJ@\xf7\xe5\xb1\025AsD@\n\001\003\ni\003\nz\030d^.\x9cm{\003C!\nz\021uba\001r\035\006b\xb2\xc7\020\x92\027\fvS\xe4P\021g^'\0266B\"\026{\016{\023\006\xc7`\xa7\002\aa\ff\020\021\xb1'R\f\026\025\x81\n\017zrz\"װ7\025r\xc4\n%{\016q\x8f\032w\f\017\xa7\a\024\n{w\032x7U\032g\xf3\xeb\006\xf6P\006\f{\fА7W\017\x927\016z\f\f\xab\aup#4w7\aq\a1\xd4\xd0\005!\025b\xc7 oӠ\027c!%\xd6P\n\001V\016fr\024\a#\0247\xd2\xf0\026\001\n{\a1\aW\f\aw\n${\xe0P\022\xc5P\n\005\n\"z\023P\001E\031z\016W!aq{\np\027&\020\016y\fuQS\f\020'\006\a\nz\016g0a\xd5Pq@!Ca\003\a'\"xp\031y\016{\f\025{\030\021d{\xc3p%\005\f55S'`\n{{\017d\017{а\xc7 $g\nU\fg\003\020\005\xc7P\no\fV7\002&\a\027'&r\026`r\021\024rP3\0266y\nCB\001\001a\n\nr{\na\020p&araQ\f\xa27\xc7\020t\02005\006\026s4\006\xc6`\xd7Pr\a\f\026p&`\0260p\001w\001\fy\fe\fwb1\020u\x85\xf16{\xe3p@r\006\f&w\002\xc5\nzA\030x\nw\xc0\xb0\a\nz\030x\xc5\020\017bzSs5$Q\fg\n\xb6\xf7`\002'{q\f\025v\n{\xb1\xc7Р7{\xf1@\xc0pg\001\020Q\022U2\nw\027\f\xc4P4a\002\026ws\xc7@\a\003\xb2\027rb\nd\023\026W\016g!5\005rb\020f\023\006\xc1\x90\a\f\a'\003W\022W!fr\xb2\xe7p\026p!W\f\027\0240waSr\x97\xf1\006u\0316\x87\xb1\xa6ǠѦ\021tԐ\xd7p {!a6\001\020&\005b&\001{\na6P\f\026w\f%6x\016\n\004R\"4466&W\"\026\021\a\xb2'pa \020`c%a`\003bqRC\027\022&q\xc5p'\xa1\xc7`\n$\004\n\nx#\026%y\030\026C\n{\n\xb7\xe7PB\f\004\xd6Pb\x93\xc7p\ff\"\xd4P\024\020's%\n@\021\001\a{\fqRR\n\024\xc40\nհ'\006b0{#%%'F\f\002\026\027Q!\0065\020w\xa1\xd7\nA\0261z\nR6as\025S\027\ny\016y\xe3`pQ\xc0P\xd7P'C\002\xb0\x87\xb1\a\nz\xc5\nD\f%\002wp\"\xa7\xe7`bRs664a\a\xd4 {\f\025\n\006\027\xa2\027\x80\xa1W\xd1@\xc0 {R\017zqr RQ\xc6pq\0015\027A\xc7``\fqŰ\xc7\020\026\026&\xc7`&'\0056\xd6P'\aC\n\x85'\n\fzy(xz\030n\016\fn\033v{\f\xb1\xa7\021j\030\021qc'5U\f\020{\003'p\xe4pw 6z\xd1@b\001\001\x85A\xc5P\022waנ\027\"!{Q'\xe7@\f{\nf\x93\xd7\n\nva\0217\027\ny\030{6հ\xd7\020\xd7\xd60\n\xa1G\f\"E0\xc0`\004\003\006\023\x8274q\027\0017{1v ƀ\xe7\ny\nr\xc0@Ac\027\016e\021qvR\023\026\xe0\xa0wR!p\nx\003\xc5`p\nva\0207b\xa0\xd7\n\035\n\017{h{\ny\nz\023 \026\xe5P'`0z\003a\016W\f${sq\003\xb0'\n\005\f\a\001\025\n@\fC\034X\x9f\xc7!\xa0\n\032U!%\n qu2\xc3Ђ\x82\xe2\xc0\xf6\xc5E6o\027s{C17E\xf0P\x94\xb1\xf7\xe6\xc0`\xd6p%$\x85\xa1\xc7`R\f\xb17`!\004\021\001a6P\016z\n{\003%P\fvr\026\n\0055\027R`\f%p\022%'%\aQ\021b!\004r\aqpa\003wr'%s\a\xd7P5\x93\a\016vwQ\fwr\026\021q\0017G\001\021'g°'\026V\030A\xbaǡ\035\xfc\x96n\xebВW\f\xc5\020z\017&e\n\xddz\xf8o\xb9אUn\xd5\020\xf5\xb0\xe6@\n {!\016d\xd0f\030\f{\033z\xc6pA0\026\027\006#{\f\x9171{\026c\nx2\xd5P\020c7g$\0226\024\021&&0faS\a2{q\021`\n\0055\xa2\xc7\020w\n\xf0&\x82\x91\x86z\xfc\xa0:\xda\xc5]\xfeг\x96Qz\n{\f{\f\fB\002%u\016\036x^\xa1ap\nwW\f&\025b\xe7\xb0'\xa2\027a\f\020@Q\f\xd5\xd0\xf0\xa0\xd3\030\x8c\xe2=\xdf\030\xfa\033\xedm\x8bh\xf8\xf6\xb0zzl#{c\xf7\xf0f\032E!r{O\xb4\xc1\xa4\xd2\023"
Thank you!
Best regards, Bogdan
Thanks for your tests
1/ and 2/. Great !
3/ since 1. and 2. are OK it seems 3. is the result of the current issue
4/ Good to know that you can extract things from daf
5/ you should be able to extract those obj_number_r
and feat_number_r
from
IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif") # or your cif file
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction
This won't help you but looking at the code I think that I should me even more stringent and throw a warning and don't export features when IFD[[1]]$tags[["33018"]]$maps != obj_number_r
whatever the status of onefile
/merged
(I will add this correction)
6/ This is bad :/, It looks like it has something to do with the offsets correction introduced to handle large file https://github.com/gitdemont/IFC/commit/80ac67f6eee9823603d30c28a1ca0f59cc63ef56 Could you tell what gives
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
str(IFD$first$tags[["33027"]])
and also
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
Sure. Here are the results:
Also, as you mentioned it might be the issue with the size of the file. I tested it for another file of a similar size and I got the same errors. However, when I ran files of ~100MB, everything worked smoothly.
Happy to know that smaller files are ok
I suspect more and more that it stems offsets correction.
Could you please paste the binary output and not the screen shot of
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
In addition, as It gets more clear could you try (and paste raw output)
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)
Thanks a lot for you help
Here you go
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
[1] 22 00 00 01 04 00 01 00 00 00 01 00 00 00 01 01 04 00 01 00 00 00 01 00 00 00 02 01
[29] 03 00 01 00 00 00 08 00 00 00 03 01 03 00 01 00 00 00 01 00 00 00 06 01 03 00 01 00
[57] 00 00 01 00 00 00 0a 01 03 00 01 00 00 00 01 00 00 00 11 01 04 00 01 00 00 00 08 00
[85] 00 00 15 01 03 00 01 00 00 00 01 00 00 00 16 01 04 00 01 00 00 00 01 00 00 00 17 01
[113] 04 00 01 00 00 00 01 00 00 00 1a 01 05 00 01 00 00 00 09 00 00 00 1b 01 05 00 01 00
[141] 00 00 11 00 00 00 1c 01 03 00 01 00 00 00 01 00 00 00 28 01 03 00 01 00 00 00 01 00
[169] 00 00 ea 80 03 00 01 00 00 00 01 00 00 00 ec 80 02 00 16 00 00 00 19 00 00 00 ed 80
[197] 02 00 05 00 00 00 2f 00 00 00 ee 80 02 00 0c 00 00 00 34 00 00 00 f4 80 0c 00 01 00
[225] 00 00 40 00 00 00 fa 80 04 00 01 00 00 00 3d c3 0a 00 03 81 02 00 ed d1 00 00 48 00
[253] 00 00 28 81 02 00 9a 40 1a 00 35 d2 00 00 29 81 02 00 00 00 00 00 00 00 00 00 2a 81
[281] 02 00 0b 00 00 00 cf 12 1b 00 2b 81 02 00 00 00 00 00 00 00 00 00 2c 81 0c 00 01 00
[309] 00 00 da 12 1b 00 2d 81 02 00 0b 00 00 00 e2 12 1b 00 31 81 0c 00 01 00 00 00 ed 12
[337] 1b 00 36 81 02 00 00 00 00 00 00 00 00 00 37 81 02 00 07 00 00 00 f5 12 1b 00 38 81
[365] 04 00 01 00 00 00 c4 fd 3a 74 3a 81 04 00 01 00 00 00 01 00 00 00 3d 81 0c 00 01 00
[393] 00 00 fc 12 1b 00 3e 81 04 00 01 00 00 00 00 00 00 00
IFD = getIFD("../Raw/Samples/20231213_blina_test_blina_6.rif")
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)
[1] 3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 2e 30 22 20
Thanks,
So all of this is the confirmation of what I was suspecting.
From
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at = 1774340, n = 410)
We can see that tag "33027"
has value of 1774340
which gets erroneously corrected to 4294967368
So when reading it afterwards an error occurs.
While reading at 72 (= 4294967368 - 4294967296)
readat("../Raw/Samples/20231213_blina_test_blina_6.rif", at =IFD$first$tags[["33027"]]$val - 4294967296 , n = 20)
You got good value
V = c(0x3c,0x3f,0x78,0x6d,0x6c,0x20,0x76,0x65,0x72,0x73,0x69,0x6f,0x6e,0x3d,0x22,0x31,0x2e,0x30,0x22,0x20)
rawToChar(as.raw(V)) # <?xml version=\"1.0\"
This seems to only happen with large rif files while cif files (small and large) are OK
I will need to figure out how I can integrate a fix for that for large rif files.
Did you get the expected event number from ?
IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif")
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction
Did you try to run ExtractFromXIF with recursive = TRUE
as in case of a merged it can try to read the corresponding files and reassemble features from accordingly ?
Finally, IFCip
package contains ExtractFeatures that could also allow you to compute features from the images stored in your cif file
Look at:
file_cif <- system.file("extdata", "example.cif", package = "IFCdata")
cif <- ExtractFromXIF(fileName = file_cif)
file_daf <- system.file("extdata", "example.daf", package = "IFCdata")
daf <- ExtractFromDAF(fileName = file_daf)
feat <- ExtractFeatures(fileName = file_cif,
objects = 0:50,
display_progress = TRUE,
parallel = FALSE)
print(IFCip::as_IFC_features(feat)$features$Area_M01)
print(daf$features$Area_M01)
print(cif$features$Area_M01) # Note that cif file contains 420 events while there are 20000 values stored
IFD = getIFD("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif")
readat <- function(file, at, n) {
toread <- file(description = file, open = "rb")
on.exit(close(toread))
seek(toread, at)
readBin(toread, what = "raw", n = n)
}
readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction
[1] 705341 172
Regarding the IFCip package. The test you provided seems to work. However, for the .rif file I am getting the same error.
blina_feat_rif = ExtractFeatures(fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif",
objects = 0:50,
display_progress = TRUE,
parallel = FALSE)
Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", :
Start tag expected, '<' not found [4]
For .cif file it works for the first 50 objects. I will run it for all of the objects.
blina_feat_rif = ExtractFeatures(fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif",
objects = 0:50,
display_progress = TRUE,
parallel = FALSE)
20231213_blina_test_blina_6.cif
| | 0%
20231213_blina_test_blina_6.cif
initialising [workers=1] sequential
, , channel = 1
feature
object Area circularity Minor Axis Major Axis Aspect Ratio Angle theta
0 16.555556 0.026385780 4.221279 5.032527 0.8387989 1.746384 -0.175587532
1 81.111111 0.061820202 9.748145 10.643006 0.9159203 2.946390 1.375593367
2 8.888889 0.019662792 3.747514 4.320400 0.8673999 3.033660 1.462863369
3 66.777778 0.043262285 9.022279 9.448406 0.9548996 2.067382 0.496585245
4 2.000000 0.016385828 1.349643 1.887109 0.7151905 1.872671 0.301874667
5 9.444444 0.065160903 3.832625 5.373984 0.7131814 1.635742 0.064945461
6 10.444444 0.019218743 3.347216 3.998668 0.8370827 1.738034 0.167237204
7 13.000000 0.020335004 4.536602 11.709782 0.3874198 2.087715 -0.516918784
8 0.000000 NaN NaN NaN NaN NaN NaN
9 9.333333 0.018893591 3.124987 3.803651 0.8215757 1.634463 0.063666201
10 9.222222 0.021186829 3.056410 6.502802 0.4700143 2.912203 -1.341407170
11 7.888889 0.023247662 2.580151 4.090413 0.6307802 1.577133 0.006336308
12 93.666667 0.070617666 10.572564 11.423825 0.9254837 2.935230 1.364433953
13 0.000000 NaN NaN NaN NaN NaN NaN
14 10.444444 0.039962861 2.947450 5.058863 0.5826309 2.898345 -1.327549042
15 75.777778 0.047901467 9.412010 10.285249 0.9150979 2.340264 0.769467786
16 15.777778 0.030632663 4.284701 4.750426 0.9019614 2.743412 1.172615334
17 7.222222 0.018312354 2.503464 3.800871 0.6586555 1.609624 0.038827851
feature
object eccentricity Minor Axis Intensity Major Axis Intensity Aspect Ratio Intensity
0 0.5444413 4.243652 5.029100 0.8438193
1 0.4013602 9.612176 10.472372 0.9178604
2 0.4976118 3.760181 4.330103 0.8683815
3 0.2969287 8.957716 9.369529 0.9560477
4 0.6989296 1.349926 1.888334 0.7148768
5 0.7009795 3.837537 5.380047 0.7132906
6 0.5470764 3.344491 4.005516 0.8349714
7 0.9219034 4.526977 11.715012 0.3864253
8 NaN NaN NaN NaN
9 0.5700994 3.121957 3.809975 0.8194168
10 0.8826588 3.086977 6.616524 0.4665556
11 0.7759616 2.562340 4.085985 0.6271046
12 0.3787874 10.615818 11.485421 0.9242863
13 NaN NaN NaN NaN
14 0.8127369 2.947334 5.061377 0.5823187
15 0.4032317 9.462733 10.315112 0.9173661
16 0.4318168 4.292353 4.776680 0.8986059
17 0.7524447 2.474947 3.790613 0.6529149
feature
object Angle Intensity theta intensity eccentricity intensity pix cx pix cy
0 1.747161 -0.176364797 0.5366274 21.825503 19.953020
1 2.943707 1.372910710 0.3969033 32.212329 26.917808
2 3.037296 1.466500066 0.4958968 16.287500 19.075000
3 2.044793 0.473996939 0.2932112 34.530782 30.374376
4 1.871696 0.300899978 0.6992504 9.833333 8.666667
5 1.630095 0.059299139 0.7008684 12.376471 5.470588
6 1.731862 0.161065760 0.5502934 18.680851 20.351064
7 2.086857 -0.516061040 0.9223207 26.307692 11.615385
8 NaN NaN NaN NaN NaN
9 1.633615 0.062818788 0.5731982 18.059524 19.178571
10 2.912558 -1.341761399 0.8844919 19.614458 14.481928
11 1.577292 0.006495277 0.7789351 14.352113 16.338028
12 2.939976 1.369179464 0.3816998 31.059312 28.265718
13 NaN NaN NaN NaN NaN
14 2.897256 -1.326459428 0.8129606 14.138298 12.457447
15 2.331740 0.760943603 0.3980446 35.645161 29.766862
16 2.752436 1.181640105 0.4387568 16.563380 20.985915
17 1.612727 0.041930177 0.7574313 16.861538 16.400000
feature
object pix min axis pix maj axis pix count inv1 inv2 inv3 inv4 inv5
0 12.663836 15.097582 149 4.761210 5.957254 18.51085 16.31302 -33.72495
1 29.244436 31.929019 730 4.785592 4.652721 15.99071 13.79335 -28.68538
2 11.242543 12.961200 80 5.105729 6.282013 19.61278 17.41570 -35.92949
3 27.066838 28.345218 601 4.800156 3.394444 17.13671 14.93909 -30.97699
4 4.048928 5.661327 18 4.811198 7.365802 19.94801 17.75247 -36.60270
5 11.497876 16.121951 85 5.353192 8.462037 14.33507 12.17110 -25.42356
6 10.041647 11.996004 94 4.758768 6.070387 19.64516 17.44775 -35.99421
7 13.609805 35.129347 117 6.324121 12.046443 17.83721 15.69546 -32.45820
8 NaN NaN 0 NaN NaN NaN NaN NaN
9 9.374962 11.410953 84 4.752567 6.251664 19.66848 17.47126 -36.04113
10 9.169230 19.508405 83 5.546311 10.207770 18.91076 16.71500 -34.52280
11 7.740454 12.271238 71 4.882074 8.101545 19.07615 16.87919 -34.85684
12 31.717692 34.271475 843 4.780675 4.473846 15.58094 13.38558 -27.86884
13 NaN NaN 0 NaN NaN NaN NaN NaN
14 8.842351 15.176590 94 5.016801 8.621324 17.31823 15.12036 -31.33960
15 28.236029 30.855746 682 4.802085 4.698178 16.71020 14.51397 -30.12606
16 12.854103 14.251279 142 4.768978 5.058834 18.33189 16.13327 -33.36585
17 7.510393 11.402612 65 4.840601 7.859748 19.67262 17.47550 -36.04955
feature
object inv6 inv7 Raw Mean Pixel Raw Min Pixel Raw Max Pixel Std Dev
0 19.22797 26.74981 715.0537 566 960 63.287008
1 -16.03924 -19.89312 769.2479 670 949 58.358201
2 -20.53935 -32.41962 713.3625 547 1009 79.467170
3 16.09777 24.14154 772.7687 660 934 51.738863
4 21.24215 28.48461 729.7778 721 741 5.553333
5 16.39224 -22.08504 731.0706 708 752 8.383160
6 20.43021 28.20492 715.5957 546 1102 76.227867
7 21.12233 -29.99200 735.6410 720 749 5.987825
8 NaN NaN NaN Inf -Inf NaN
9 20.58922 28.78764 713.2381 512 993 74.555607
10 -21.74387 32.22987 709.4096 559 773 46.841706
11 20.92989 29.32692 715.7606 535 1028 79.433818
12 -15.53885 21.32080 730.2147 535 900 43.018026
13 NaN NaN NaN Inf -Inf NaN
14 -19.31034 26.69410 735.2340 723 746 5.231707
15 13.84141 -22.77601 753.4370 634 830 31.661974
16 -18.32299 26.38480 721.0704 609 807 32.544584
17 21.40195 30.16991 713.5231 533 1091 92.988355
feature
object skewness kurtosis Centroid Y Centroid X Centroid Y Intensity
0 0.67373749 5.658634 6.941834 6.317673 6.948503
1 0.92167377 2.937089 10.404110 8.639269 10.435002
2 1.00422192 5.733076 5.095833 6.025000 5.096042
3 0.51458670 2.792659 11.176927 9.791459 11.191089
4 0.19472162 2.286597 2.944444 2.555556 2.943387
5 -0.10901160 2.967059 3.792157 1.490196 3.792606
6 1.83640269 11.120401 5.893617 6.450355 5.896292
7 -0.02488123 2.525231 8.435897 3.538462 8.435219
8 NaN NaN 0.000000 0.000000 0.000000
9 0.70550367 6.783690 5.686508 6.059524 5.688070
10 -1.49377269 4.800671 6.204819 4.493976 6.206886
11 1.07084305 6.687177 4.450704 5.112676 4.452154
12 -0.73271777 5.298200 10.019771 9.088573 10.032188
13 NaN NaN 0.000000 0.000000 0.000000
14 -0.25791762 2.389096 4.379433 3.819149 4.380715
15 -0.60721630 3.644518 11.548387 9.588954 11.558366
16 -0.65336955 4.525928 5.187793 6.661972 5.191604
17 1.51074063 7.405596 5.287179 5.133333 5.293739
feature
object Centroid X Intensity Perimeter Diameter Circularity convexity roundness
0 6.302188 18.3 4.591208 10.140877 0.6937515 1.2907542
1 8.642368 38.4 10.162375 19.552780 0.7525727 1.2204806
2 6.012821 18.0 3.364177 NA NA NA
3 9.790679 34.2 9.220852 26.421524 0.7549526 1.2587811
4 2.557095 6.6 1.595769 4.874538 0.6016395 1.5939672
5 1.495288 27.3 3.467714 3.860443 0.3171608 1.5830764
6 6.442338 14.7 3.646681 9.979951 0.6787660 1.3183188
7 3.538558 36.3 4.068429 5.229416 0.2097976 2.8166889
8 0.000000 NA NA NA NA NA
9 6.050068 13.2 3.447255 10.058457 0.7047447 1.3552991
10 4.491721 22.2 3.426674 19.850564 NA NA
11 5.103400 13.2 3.169297 4.408860 0.7069208 1.1385086
12 9.080366 41.4 10.920627 14.915113 0.7590231 1.1920220
13 0.000000 NA NA NA NA NA
14 3.818329 16.8 3.646681 3.626001 0.6679450 1.0423061
15 9.589294 36.6 9.822589 21.176211 0.7575911 1.2385678
16 6.652528 17.4 4.482063 11.846150 0.7114578 1.2937754
17 5.124870 12.0 3.032428 4.817601 0.7134158 1.2383198
feature
object Height Width Elongatedness convex perimeter convex cx convex cy Bkgd Mean
0 4.368066 3.6124784 1.209160 12.695653 20.833333 23.16667 734.3657
1 9.534149 8.6377080 1.103782 28.898790 28.000000 31.27778 733.8100
2 NA NA NA NA NA NA 732.5682
3 8.595929 7.8000000 1.102042 25.819380 29.529412 33.88235 732.4831
4 1.500000 0.9000000 1.666667 3.970820 8.400000 10.00000 732.1750
5 4.002499 0.9486833 4.219005 8.658491 2.571429 12.28571 734.1705
6 3.498571 2.7166155 1.287842 9.977860 20.769231 18.30769 732.8846
7 3.244996 1.6155494 2.008602 7.615653 6.428571 35.71429 733.8702
8 NA NA NA NA NA NA 731.0833
9 3.244996 2.4186773 1.341641 9.302630 18.700000 18.00000 732.3704
10 NA NA NA NA NA NA 734.5625
11 3.420526 2.4186773 1.414214 9.331355 16.333333 15.00000 732.0263
12 10.568349 9.3048375 1.135791 31.423556 27.526316 29.05263 732.8495
13 NA NA NA NA NA NA 732.8958
14 4.326662 2.4738634 1.748949 11.221476 11.571429 14.14286 733.9737
15 9.415413 8.2758685 1.137695 27.727835 30.450000 35.60000 733.7648
16 4.295346 3.6124784 1.189030 12.379366 21.454545 15.27273 732.6667
17 3.132092 2.0124612 1.556349 8.560989 15.750000 17.00000 732.5658
feature
object Bkgd StdDev Min Pixel Max Pixel Mean Pixel Intensity
0 3.399115 -168.365741 225.63426 -19.3120495 -2877.495370
1 3.888664 -63.810000 215.19000 35.4379452 25869.700000
2 3.648414 -185.568182 276.43182 -19.2056818 -1536.454545
3 3.694221 -72.483051 201.51695 40.2856680 24211.686441
4 3.522703 -11.175000 8.82500 -2.3972222 -43.150000
5 3.273796 -26.170455 17.82955 -3.0998663 -263.488636
6 3.213221 -186.884615 369.11538 -17.2888707 -1625.153846
7 3.187760 -13.870192 15.12981 1.7708333 207.187500
8 3.991633 Inf -Inf NaN NaN
9 3.400664 -220.370370 260.62963 -19.1322751 -1607.111111
10 3.195880 -175.562500 38.43750 -25.1528614 -2087.687500
11 3.265204 -197.026316 295.97368 -16.2657524 -1154.868421
12 3.712155 -197.849537 167.15046 -2.6348277 -2221.159722
13 3.439220 Inf -Inf NaN NaN
14 3.372949 -10.973684 12.02632 1.2603583 118.473684
15 3.326818 -99.764831 96.23517 19.6721196 13416.385593
16 3.795468 -123.666667 74.33333 -11.5962441 -1646.666667
17 2.910750 -199.565789 358.43421 -19.0427126 -1237.776316
[ reached getOption("max.print") -- omitted 33 row(s) and 10 matrix slice(s) ]
attr(,"offset_id")
[1] "img_000000" "img_000001" "img_000002" "img_000003" "img_000004" "img_000005"
[7] "img_000006" "img_000007" "img_000008" "img_000009" "img_000010" "img_000011"
[13] "img_000012" "img_000013" "img_000014" "img_000015" "img_000016" "img_000017"
[19] "img_000018" "img_000019" "img_000020" "img_000021" "img_000022" "img_000023"
[25] "img_000024" "img_000025" "img_000026" "img_000027" "img_000028" "img_000029"
[31] "img_000030" "img_000031" "img_000032" "img_000033" "img_000034" "img_000035"
[37] "img_000036" "img_000037" "img_000038" "img_000039" "img_000040" "img_000041"
[43] "img_000042" "img_000043" "img_000044" "img_000045" "img_000046" "img_000047"
[49] "img_000048" "img_000049" "img_000050"
attr(,"channel_id")
[1] "1" "2" "3" "5" "6" "7" "8" "9" "10" "11" "12"
attr(,"channel_names")
[1] "Ch01" "FOXO1" "CD45RA" "CD86" "CD19" "CD28" "eFluor506"
[8] "Ch9" "CD3" "Ki67" "SSC"
attr(,"removal")
[1] "masked" "masked" "masked" "masked" "masked" "masked" "masked" "masked" "masked"
[10] "masked" "masked"
attr(,"class")
[1] "IFCip_features"
blina_big_rif = ExtractFromXIF(
fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif",
extract_features = T,
extract_images = T,
extract_offsets = T,
extract_stats = T,
verbose = T,
verbosity = 2,
display_progress = T,
fast = T,
recursive = T
)
Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Raw/Samples/20231213_blina_test_blina_6.rif, filesize:15320200390 @offset:1774340
Entries: 34
Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0
Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0
Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0
Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:273 Typ:4 Count:1 Value:4294967304 Bytes:4 Off:0
Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0
Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0
Tag:282 Typ:5 Count:1 Value:4294967305 Bytes:8 Off:1
Tag:283 Typ:5 Count:1 Value:4294967313 Bytes:8 Off:1
Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0
Tag:33004 Typ:2 Count:22 Value:4294967321 Bytes:22 Off:1
Tag:33005 Typ:2 Count:5 Value:4294967343 Bytes:5 Off:1
Tag:33006 Typ:2 Count:12 Value:4294967348 Bytes:12 Off:1
Tag:33012 Typ:12 Count:1 Value:4294967360 Bytes:8 Off:1
Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0
Tag:33027 Typ:2 Count:53741 Value:4294967368 Bytes:53741 Off:1
Tag:33064 Typ:2 Count:1720474 Value:4295021109 Bytes:1720474 Off:1
Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0
Tag:33066 Typ:2 Count:11 Value:4296741583 Bytes:11 Off:1
Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0
Tag:33068 Typ:12 Count:1 Value:4296741594 Bytes:8 Off:1
Tag:33069 Typ:2 Count:11 Value:4296741602 Bytes:11 Off:1
Tag:33073 Typ:12 Count:1 Value:4296741613 Bytes:8 Off:1
Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0
Tag:33079 Typ:2 Count:7 Value:4296741621 Bytes:7 Off:1
Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0
Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0
Tag:33085 Typ:12 Count:1 Value:4296741628 Bytes:8 Off:1
Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0
Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", :
Start tag expected, '<' not found [4]
Sorry if I was not clear enough. Large rif files won't be correctly read and will produce same error accross many of IFC
package functions and consequently IFCip
that makes use of them
I have to figure out how to make a fix for this
However, it seems it is OK for cif files Although, it remains the problem since you get expected numbers with:
readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33083"]]$val, 8), "double", size = 4, n = 2) # first number should be 705341 to allow feature extraction
But that you can't get features extracted with a warning with
blina_big_cif = ExtractFromXIF( fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = F )
So it seems that it try to find the offset from IFD$first$tags[["33080"]] and not IFD$first$tags[["33083"]], because none of
merged
or onefile
is TRUE
readBin(readat("../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", IFD$first$tags[["33080"]]$val, 8), "double", size = 4, n = 2)
So there may be an error here and onefile
should be set to TRUE
I will add a commit to this
Thanks, now I understand more clearly. Let me know if need more tests t be run.
Hi @bavanesyan ,
I did some modifications to fix the errors you reported.
You should be able to install the latest IFC
package version 0.2.1.110
with:
remove.packages("IFC")
# if you have Rtools and remotes package installed
remotes::install_github(repo = "gitdemont/IFC", ref = "master", dependencies = FALSE)
Could you confirm that everything is fine now with your files (rif and cif) ? Notably,
# in a fresh R session
library(IFC)
f_name = # your big file
IFD = getIFD(f_name); IFD[[1]]$tags[["33027"]]$map # you should see "<?xml versio"
f_data = ExtractFromXIF(f_name); str(f_data$features) # features should be extracted
# edge case where offset is close to 4 bytes unsigned integer limit
f_offsets = getOffsets(f_name)
f_edge = c()
i = 1
while(max(f_offsets) > i * 2^32) { f_edge = c(f_edge, na.omit(as.numeric(gsub(".*_","",names(which(f_offsets > i * 2^32)[1]))))); i = i + 1 }
f_objects = c(0:2, sapply(f_edge, FUN = function(x) x + -1:1), length(f_offsets)/2 - 1:3)
# visual check
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "msk")
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "img")
Hi @gitdemont,
Happy New Year! Thank you a lot for fixing this issue. It really simplifies my workflow as now I don't have to use IDEAS anymore.
f_name = "../Raw/Samples/20231213_blina_test_blina_6.rif"
IFD = getIFD(f_name); IFD[[1]]$tags[["33027"]]$map # you should see "<?xml versio"
[1] "<?xml versio"
f_data = ExtractFromXIF(f_name); str(f_data$features) # features should be extracted
f_data$features
| Object Number<dbl> | Camera Timer<dbl> | Camera Line Number<dbl> | Raw Centroid X<dbl> |
-- | -- | -- | -- | -- | --
0 | 0 | 12545115136 | 1575443584 | 107.76950 |
1 | 1 | 12545117184 | 1575443840 | 94.24047 |
2 | 2 | 12545120256 | 1575444224 | 98.85526 |
3 | 3 | 12545127424 | 1575444864 | 47.77905 |
4 | 4 | 12545128448 | 1575444992 | 48.00000 |
5 | 5 | 12545128448 | 1575444992 | 67.00000 |
6 | 6 | 12545138688 | 1575446144 | 107.48555 |
7 | 7 | 12545141760 | 1575446400 | 32.67105 |
8 | 8 | 12545150976 | 1575447424 | 54.50000 |
9 | 9 | 12545152000 | 1575447424 | 106.32076 |
1-10 of 705,341 rows | 1-5 of 172 columns</div></div>
f_offsets = getOffsets(f_name)
20231213_blina_test_blina_6.rif
|===================================================================| 100%Offsets were extracted from XIF file with fast method.
Correct mapping between offsets and objects ids is not guaranteed.
f_edge = c()
i = 1
while(max(f_offsets) > i * 2^32) { f_edge = c(f_edge, na.omit(as.numeric(gsub(".*_","",names(which(f_offsets > i * 2^32)[1]))))); i = i + 1 }
f_objects = c(0:2, sapply(f_edge, FUN = function(x) x + -1:1), length(f_offsets)/2 - 1:3)
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "msk")
DisplayGallery(offsets = f_offsets, objects = f_objects, extract_max = 20, image_type = "img")
Everything seems to work now. However, I still got the warning Correct mapping between offsets and objects ids is not guaranteed.
in getOffsets(f_name)
. Is it something that is expected by default?
I also have several questions/suggestions unrelated to this issue. I am sorry for asking them here as it is the only way I can contact you. Will it be okay for you to share your email with me? (you can write it to my email Bogdan.Avanesyan@mdc-berlin.de if you don't want to share it here)
ExtractImages_toFile(
fileName = f_name,
display_progress = T,
write_to = "../Data/Images/20231213_blina_test_blina_6_rif/%o_%c.tiff"
)
This function extracts separate images for every channel. Also, the output differs from the IDEAS as it feels like this function extracts images for display but not the raw data. Am I doing it correctly?
My goal is to get raw images in stacked TIFF and then use them with a custom processing pipeline (ilastik/CellProfiler) as IDEAS is extremely slow with big files.
Best regards, Bogdan
HNY !
Thanks a lot for rising this issue and for all the tests you carried on your side !
It was really helpful to improve IFC
package. (Sorry I did not catch it before)
As it seems the issue has been fixed, I will close it. I will however try to answer some of your other questions before. Please feel free to open other issues.
concerning the message about offsets
Correct mapping between offsets and objects ids is not guaranteed
is normal behaviour.
You may take a look at fast = FALSE
in getOffsets or in functions calling it e.g. ExtractImages_, ExtractMasks_ functions when offsets
are not provided.
for the listed questions .1, yes
library(IFC)
f = system.file(package = "IFCdata", "extdata", "example.rif")
param = objectParam(fileName = f, mode = "raw", force_width = FALSE, size = c(0,0)) # play with objectParam arguments
vals = ExtractImages_toMatrix(objects = 0:4, param = param) # See also objectExtract
.2, no there is no function to do this ExtractImages_toFile internally uses objectWrite to pass values extracted by objectExtract to tiff::writeTIFF (ExtractImages_toMatrix does basically the same except that it does not write to files) So you may write custom variations around those to achieve what you need.
.3, this is definitely something that would be nice to have in IFC
package and I would be happy to review a PR
AFAIK, the process for compensating rif files is described here
I wrote some experimental functions in IFCshiny
but it was for global intensities and not at pixel level.
Hi @bavanesyan ,
Update: You should be able to easily export stacked TIFF file with new IFC
package version >= 0.2.1.600
Hi,
Thanks a lot for developing this package. I'm facing two problems with the ExtractFromXIF function.
My data was generated with AMNIS ImageStream MkII. I am using the IFC package on the MacBook M2 Pro machine.
Whenever I try to extract features from the .rif file using ExtractFromXIF, I get an error. Here is the code and output.
blina_small_rif = ExtractFromXIF( fileName = "../Raw/Samples/20231213_blina_test_blina_6.rif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = T )
Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Raw/Samples/20231213_blina_test_blina_6.rif, filesize:15320200390 @offset:1774340 Entries: 34 Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0 Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:273 Typ:4 Count:1 Value:4294967304 Bytes:4 Off:0 Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:282 Typ:5 Count:1 Value:4294967305 Bytes:8 Off:1 Tag:283 Typ:5 Count:1 Value:4294967313 Bytes:8 Off:1 Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33004 Typ:2 Count:22 Value:4294967321 Bytes:22 Off:1 Tag:33005 Typ:2 Count:5 Value:4294967343 Bytes:5 Off:1 Tag:33006 Typ:2 Count:12 Value:4294967348 Bytes:12 Off:1 Tag:33012 Typ:12 Count:1 Value:4294967360 Bytes:8 Off:1 Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33027 Typ:2 Count:53741 Value:4294967368 Bytes:53741 Off:1 Tag:33064 Typ:2 Count:1720474 Value:4295021109 Bytes:1720474 Off:1 Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33066 Typ:2 Count:11 Value:4296741583 Bytes:11 Off:1 Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33068 Typ:12 Count:1 Value:4296741594 Bytes:8 Off:1 Tag:33069 Typ:2 Count:11 Value:4296741602 Bytes:11 Off:1 Tag:33073 Typ:12 Count:1 Value:4296741613 Bytes:8 Off:1 Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33079 Typ:2 Count:7 Value:4296741621 Bytes:7 Off:1 Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0 Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:33085 Typ:12 Count:1 Value:4296741628 Bytes:8 Off:1 Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0 Error in read_xml.raw(getFullTag(IFD = IFD, which = 1, tag = "33027", : Start tag expected, '<' not found [4]
For the .cif file I get a warning and no feature values are extracted:
blina_big_cif = ExtractFromXIF( fileName = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", extract_features = T, extract_images = T, extract_offsets = T, extract_stats = T, verbose = T, verbosity = 2, display_progress = T, fast = F )
Extracting TAGs from /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif, filesize:11496323255 @offset:8 Entries: 43 Tag:256 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:257 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:258 Typ:3 Count:1 Value:8 Bytes:2 Off:0 Tag:259 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:262 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:266 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:273 Typ:4 Count:1 Value:8 Bytes:4 Off:0 Tag:277 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:278 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:279 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:282 Typ:5 Count:1 Value:530 Bytes:8 Off:1 Tag:283 Typ:5 Count:1 Value:538 Bytes:8 Off:1 Tag:284 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:296 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33000 Typ:4 Count:0 Value:11 Bytes:0 Off:0 Tag:33002 Typ:3 Count:1 Value:1 Bytes:2 Off:0 Tag:33004 Typ:2 Count:22 Value:546 Bytes:22 Off:1 Tag:33005 Typ:2 Count:5 Value:568 Bytes:5 Off:1 Tag:33006 Typ:2 Count:12 Value:573 Bytes:12 Off:1 Tag:33009 Typ:4 Count:0 Value:120 Bytes:0 Off:0 Tag:33012 Typ:12 Count:1 Value:585 Bytes:8 Off:1 Tag:33018 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33020 Typ:12 Count:144 Value:593 Bytes:1152 Off:1 Tag:33023 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33026 Typ:2 Count:130 Value:1745 Bytes:130 Off:1 Tag:33027 Typ:2 Count:53742 Value:1875 Bytes:53742 Off:1 Tag:33064 Typ:2 Count:1720474 Value:55617 Bytes:1720474 Off:1 Tag:33065 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33066 Typ:2 Count:9 Value:1776091 Bytes:9 Off:1 Tag:33067 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33068 Typ:12 Count:1 Value:1776100 Bytes:8 Off:1 Tag:33069 Typ:2 Count:11 Value:1776108 Bytes:11 Off:1 Tag:33070 Typ:4 Count:1 Value:705341 Bytes:4 Off:0 Tag:33073 Typ:12 Count:1 Value:1776119 Bytes:8 Off:1 Tag:33078 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33079 Typ:2 Count:7 Value:1776127 Bytes:7 Off:1 Tag:33080 Typ:4 Count:1 Value:1950023108 Bytes:4 Off:0 Tag:33081 Typ:2 Count:0 Value:0 Bytes:0 Off:0 Tag:33082 Typ:4 Count:1 Value:1 Bytes:4 Off:0 Tag:33083 Typ:1 Count:485274616 Value:1776134 Bytes:485274616 Off:1 Tag:33084 Typ:2 Count:779 Value:487050750 Bytes:779 Off:1 Tag:33085 Typ:12 Count:1 Value:487051529 Bytes:8 Off:1 Tag:33086 Typ:4 Count:1 Value:0 Bytes:4 Off:0 /Users/bavanes/LabJournal/Experiments/2023-12-13-BA-Image_Stream_blina_test_1/Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif Mismatch in object number. Features values were not exported
My object number is 705341 events. I also see it in the tag 33018. When I try to estimate it following the way you described it in your function, I get completely random values
toread = file(description = "../Data/IDEAS_processing/Samples/20231213_blina_test_blina_6.cif", open = "rb")
readBin(toread, what = "double",size = 4, n = 1, endian = "little")
[1] 3.883381e-39
If you need any further information, I am happy to provide it. I can also provide a file I am working with, however it is more than 12GB.
Thank you!
Best regards, Bogdan