>bRZ慰'r9B#̙Qu@~~W189@O#Ms=vlCF9 CTcE+֠{'w%*һPet =reV<28+1馑QgxOyO),7*.gv,:Vn\0o0E甩}D\'>4<  dQ>xk@RojZgQ _@XgB-΢5f8lՇA맬IrnDR|y.d>5rGW>gS\<9/52ȇhFT6/VbDgX4 V˘2͒x0Rl.!d7zF΂)EϢ0Nn&!Avbp!Y. >]ml nX$pS$MA(iݏG?;8ۦ"KJ{'ơ$a6PnڋoGw]y+B5{xG|>W0nNR} Eq=|xcзkDwgFN5K]OǀGp23n $kP"HU!tK7EdڐSxB(U v7yk Ѹ|B"ψ; HqR dg7pN^œMv7> y/N7$tivs$\<ˎǾsS >)Ȯ$+#`!~Y }Aq쀳|2ÊQZ#;Λuw[u^Zu|\;į:q^= p kL$ǭN<=L/C k踻(Osi#ӔwVs䭝F{N諧g?5bB{< vCecb+ ܳyjx46m0oܱRԼ lkdg/r2,"{ƿVZ0pu^r" 9tW tQcKGįN4u,DϨm5]b[K$U{~ۼT6w%'J> \ST8y >YR>XqCOj,#Sڈ0GSͬG>z/dp}yF-4ްk Nuhnbgz.i67tC:ZR73y rJT0rQNup. 슁K I{ %1q`w`A| r%@"w!{GB9xsւKfhH9<ʬĶ9fQH?dv,&ߣTa/lDo:{ufJpbX@ ]ȱMXڕCkBK #õYZڨD۵lUTX, |X1dz,+2}o ̹cgSxmI^tve^jCLc k2:*۴;OK7EdڐSx9&F[Ntm׋AXҥω߂t %s.7Xtitٝ:j)&g^|ݨ -P.f~f7P8쑌zr7q 8-yBavGEs ,VBO5E&\hn{"jCndO&N!_u^Şr"Ƃ+(wqHxNg)Q,;X s  {5C"BqB_=X%9vH66 ^FdKwd2‡<hf3zR 9^6<| ˳ 8jy,Ŀ KxmͭR[zL}l}O?+ژ8dH 3JQA=q{䔧4&I32)<nLBC|\nO:K)|$B7@bmavR|84h ՔflűV\ApӕVaߧQ/M7lϑu?U<]--vYHTG̠o"5 4*wYvt" 32 AgF:\rIcf!7U}Z30i}_jUwfaGԀ/ "_.JU%eɠ~?s=yAX~:rںxA&wᴀD)?4@"܈ߏI %n{w,+zt`xPt<<.tTEɜuz2&8ݗ_s\pj]-](J ^(3RRS3oCy{rF;?؄\Ff93(:|i`LL0ogDackK7EdڐSxd >T_04T%&N%#539xpg k0F$y͎rw Np0ew8cll]҃ICC4fs#E`סڸh$!'+.F_fTIO GF`W3AЧ  zm_ٷ(ž'I#kaPPt)Ķ9fQH? 043sb#5mzbtUZyhOX/͓h?zә3>IZ;-tn2lIb*h ${7$/zx"D:Gx!MTf8Z3QN Y^a.l:#I^y)Bm"ߌmH ]YD}ϰ #flV}^ 5mzbto4B"hb]P!R|>2GOBIU.W#kH<P i*Q_xB X{o?.͈%;"mhSMKQЭmfq2PGќl2ršS2tqgˠW1ț:&6.P*JaV)H~#""Aw2 \Gă IuW@;uC!w ޴? ^uy9Ut+c7& .Q3" :4ްk Nuhn#:4΋(lg1U9Y|R.|MSؽ 蒫m;?hŝH{qmF'>{/#==:4G*NԪPu#GD0Ʈ{bgndO&qTM2}I-}u__KCsAMcqꅡn|]~FNX@XE(97k _T!vJ-\ M)8AmW#ɀhAyMkr# KM4"r`ՒZ8^wtkϙuڈ SqYqjmF rc/vTݵr=K+Ӧtiception('Unable to seek stream ' .$i.' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. */ public function read($length): string { $buffer = ''; $total = count($this->streams) - 1; $remaining = $length; $progressToNext = false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = false; if ($this->current === $total) { break; } ++$this->current; } $result = $this->streams[$this->current]->read($remaining); if ($result === '') { $progressToNext = true; continue; } $buffer .= $result; $remaining = $length - strlen($buffer); } $this->pos += strlen($buffer); return $buffer; } public function isReadable(): bool { return true; } public function isWritable(): bool { return false; } public function isSeekable(): bool { return $this->seekable; } public function write($string): int { throw new \RuntimeException('Cannot write to an AppendStream'); } /** * @return mixed */ public function getMetadata($key = null) { return $key ? null : []; } }